From cb6d31123f93c7e20db74d54c8e15e2d55241908 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 17 Sep 2016 05:14:50 +0200 Subject: [PATCH 001/126] docs: various fixes to v2016.2 release notes --- docs/releases/v2016.2.rst | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/releases/v2016.2.rst b/docs/releases/v2016.2.rst index ca43e61b..64e4e96a 100644 --- a/docs/releases/v2016.2.rst +++ b/docs/releases/v2016.2.rst @@ -85,24 +85,30 @@ New features site texts. They should always be used when including user-provided information like hostnames and contact information in HTML code or URLs. -* Dropbear is updated to a newer version, enabling new SSH crytpo methods and removing +* Dropbear has been updated to a newer version, enabling new SSH crypto methods and removing some old ones like DSA. This reduces the time needed for the first boot and makes SSH logins faster (`#223 `_) * WLAN basic and supported rate sets have been made configurable, to allow disabling 802.11b rates (`#810 `_) -* ath10k-based devices are now officially supported, it's possible to choose between +* ath10k-based devices are now supported officially; it's possible to choose between IBSS- and 11s-capable firmwares in site.mk (`#864 `_) -* The ``prefix4`` and ``next_node.ip4`` site.conf options are now optional. +* The ``prefix4`` and ``next_node.ip4`` site.conf options are optional now. Bugfixes ~~~~~~~~ +* The stability of the ath9k WLAN driver has been improved significantly + (`#605 `_) + + mac80211, hostapd and other related drivers and services have been backported from LEDE ``42f559e``. + * Extremely slow downloads could lead to multiple instances of the autoupdater - running concurrently. Use lockfile to prevent this and add timeouts to download - processes. (`#582 `_) + running concurrently (`#582 `_) + + A lockfile is used to prevent this and timeouts have been added to download processes. Other changes ~~~~~~~~~~~~~ @@ -141,8 +147,6 @@ Inside of URLs, ``urlescape`` must be used instead of ``escape``. Internals ~~~~~~~~~ -* mac80211, hostapd and other related drivers and services have been backported from LEDE ``42f559e`` - * Mesh interfaces are now configured in a protocol-independent way in UCI (`#870 `_) The MAC address assignment of all mesh and WLAN interfaces has been modified to prepare for support of From 4e2888f7a27149afde8158cbf293b06ee63bdc75 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 18 Sep 2016 22:37:05 +0200 Subject: [PATCH 002/126] gluon-wan-dnsmasq: fix handling of static DNS servers Fixes #886 --- .../luasrc/lib/gluon/wan-dnsmasq/update.lua | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/package/gluon-wan-dnsmasq/luasrc/lib/gluon/wan-dnsmasq/update.lua b/package/gluon-wan-dnsmasq/luasrc/lib/gluon/wan-dnsmasq/update.lua index cceb7225..2997f1c4 100755 --- a/package/gluon-wan-dnsmasq/luasrc/lib/gluon/wan-dnsmasq/update.lua +++ b/package/gluon-wan-dnsmasq/luasrc/lib/gluon/wan-dnsmasq/update.lua @@ -11,6 +11,10 @@ local fs = require 'nixio.fs' local new_servers = '' +local function append_server(server) + new_servers = new_servers .. 'nameserver ' .. server .. '\n' +end + local function handle_interface(status) local ifname = status.device @@ -18,9 +22,10 @@ local function handle_interface(status) for _, server in ipairs(servers) do if server:match('^fe80:') then - server = server .. '%' .. ifname + append_server(server .. '%' .. ifname) + else + append_server(server) end - new_servers = new_servers .. 'nameserver ' .. server .. '\n' end end @@ -32,7 +37,9 @@ end local static = uci:get_first('gluon-wan-dnsmasq', 'static', 'server') if type(static) == 'table' and #static > 0 then - append_servers(static) + for _, server in ipairs(static) do + append_server(server) + end else pcall(append_interface_servers, 'wan6') pcall(append_interface_servers, 'wan') From 77101fc7032ec0f91f9e2100b65cf2034478ee13 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 18 Sep 2016 22:58:12 +0200 Subject: [PATCH 003/126] docs: update v2016.2 release notes --- docs/releases/v2016.2.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/releases/v2016.2.rst b/docs/releases/v2016.2.rst index 64e4e96a..723598e5 100644 --- a/docs/releases/v2016.2.rst +++ b/docs/releases/v2016.2.rst @@ -110,6 +110,11 @@ Bugfixes A lockfile is used to prevent this and timeouts have been added to download processes. +* Usage of static DNS servers on the WAN port has been fixed + (`#886 `_) + + This is a regression introduced in Gluon v2016.1.6. + Other changes ~~~~~~~~~~~~~ From 6964d30ff24eef9fc436e97bc909dc4c5e048ad4 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 21 Sep 2016 20:04:57 +0200 Subject: [PATCH 004/126] docs, README: change current release to v2016.2 --- README.md | 2 +- docs/conf.py | 4 ++-- docs/features/wired-mesh.rst | 4 ++-- docs/releases/v2016.2.rst | 4 ++-- docs/site-example/site.conf | 2 +- docs/user/getting_started.rst | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0fb2f2bf..9fe74651 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ the future development of Gluon. Please refrain from using the `master` branch for anything else but development purposes! Use the most recent release instead. You can list all relaseses by running `git branch -a` -and switch to one by running `git checkout v2016.1.6 && make update`. +and switch to one by running `git checkout v2016.2 && make update`. If you're using the autoupdater, do not autoupdate nodes with anything but releases. If you upgrade using random master commits the nodes *will break* eventually. diff --git a/docs/conf.py b/docs/conf.py index fd329bda..18892553 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -54,9 +54,9 @@ copyright = '2015-2016, Project Gluon' # built documents. # # The short X.Y version. -version = '2016.1+' +version = '2016.2' # The full version, including alpha/beta/rc tags. -release = '2016.1+' +release = '2016.2' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/features/wired-mesh.rst b/docs/features/wired-mesh.rst index b9996335..f1e50181 100644 --- a/docs/features/wired-mesh.rst +++ b/docs/features/wired-mesh.rst @@ -61,5 +61,5 @@ It may be disabled by running:: uci commit Please note that this configuration has changed in Gluon v2016.1. Using -the old commands on v2016.1 will break the corresponding options in the -*Advanced settings*. +the old commands on v2016.1 and later will break the corresponding options +in the *Advanced settings*. diff --git a/docs/releases/v2016.2.rst b/docs/releases/v2016.2.rst index 723598e5..e0043e9f 100644 --- a/docs/releases/v2016.2.rst +++ b/docs/releases/v2016.2.rst @@ -1,5 +1,5 @@ -Gluon 2016.2 (in development) -============================= +Gluon 2016.2 +============ Added hardware support ~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/site-example/site.conf b/docs/site-example/site.conf index 66320956..6405f6d6 100644 --- a/docs/site-example/site.conf +++ b/docs/site-example/site.conf @@ -1,4 +1,4 @@ --- This is an example site configuration for Gluon v2016.1+ +-- This is an example site configuration for Gluon v2016.2 -- -- Take a look at the documentation located at -- http://gluon.readthedocs.org/ for details. diff --git a/docs/user/getting_started.rst b/docs/user/getting_started.rst index 66a94f81..813eb3e4 100644 --- a/docs/user/getting_started.rst +++ b/docs/user/getting_started.rst @@ -8,7 +8,7 @@ Gluon's releases are managed using `Git tags`_. If you are just getting started with Gluon we recommend to use the latest stable release of Gluon. Take a look at the `list of gluon releases`_ and notice the latest release, -e.g. *v2016.1.6*. Always get Gluon using git and don't try to download it +e.g. *v2016.2*. Always get Gluon using git and don't try to download it as a Zip archive as the archive will be missing version information. Please keep in mind that there is no "default Gluon" build; a site configuration @@ -42,7 +42,7 @@ Building the images ------------------- To build Gluon, first check out the repository. Replace *RELEASE* with the -version you'd like to checkout, e.g. *v2016.1.6*. +version you'd like to checkout, e.g. *v2016.2*. :: From d017739ac0f66777cc12246acee04e2d70c6b2dc Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 21 Sep 2016 20:19:10 +0200 Subject: [PATCH 005/126] docs: change version to v2016.2+ --- docs/conf.py | 4 ++-- docs/site-example/site.conf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 18892553..c66cbf62 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -54,9 +54,9 @@ copyright = '2015-2016, Project Gluon' # built documents. # # The short X.Y version. -version = '2016.2' +version = '2016.2+' # The full version, including alpha/beta/rc tags. -release = '2016.2' +release = '2016.2+' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/site-example/site.conf b/docs/site-example/site.conf index 6405f6d6..7c5bbe25 100644 --- a/docs/site-example/site.conf +++ b/docs/site-example/site.conf @@ -1,4 +1,4 @@ --- This is an example site configuration for Gluon v2016.2 +-- This is an example site configuration for Gluon v2016.2+ -- -- Take a look at the documentation located at -- http://gluon.readthedocs.org/ for details. From be4df11f57e8427eedecbdb0d9578ad167ea2aea Mon Sep 17 00:00:00 2001 From: Tobias Hachmer Date: Thu, 22 Sep 2016 21:46:19 +0200 Subject: [PATCH 006/126] docs: update link to site repository of Freifunk MWU --- docs/user/site.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/site.rst b/docs/user/site.rst index b1f00c69..07602ef4 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -469,7 +469,7 @@ This is a non-exhaustive list of site-repos from various communities: * `site-ffhl `_ (Lübeck) * `site-fflg `_ (Lüneburg) * `site-ffmd `_ (Magdeburg) -* `site-ffmwu `_ (Mainz, Wiesbaden & Umgebung) +* `site-ffmwu `_ (Mainz, Wiesbaden & Umgebung) * `site-ffmyk `_ (Mayen-Koblenz) * `site-ffmo `_ (Moers) * `site-ffmg `_ (Mönchengladbach) From 5c7be1e01ade1551c217e6ed56f886b26c23d870 Mon Sep 17 00:00:00 2001 From: Ben Oswald Date: Tue, 27 Sep 2016 09:40:45 +0200 Subject: [PATCH 007/126] add link to Freifunk Rhein-Neckar site repository (#890) --- docs/user/site.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/user/site.rst b/docs/user/site.rst index 07602ef4..0987a444 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -480,6 +480,7 @@ This is a non-exhaustive list of site-repos from various communities: * `site-ffniers `_ (Niersufer) * `site-ffnw `_ (Nordwest) * `site-ffrgb `_ (Regensburg) +* `site-ffrn `_ (Rhein-Neckar) * `site-ffruhr `_ (Ruhrgebiet, Multi-Communities) * `site-ffs `_ (Stuttgart) * `site-fftr `_ (Trier) From e98da9b766d0dbb7daafbd698a466c96c4e791f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Joda=20St=C3=B6=C3=9Fer?= Date: Thu, 29 Sep 2016 18:26:33 +0200 Subject: [PATCH 008/126] docs: fixed link to issue #414 in v2016.2 release notes (#895) --- docs/releases/v2016.2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases/v2016.2.rst b/docs/releases/v2016.2.rst index e0043e9f..7693e447 100644 --- a/docs/releases/v2016.2.rst +++ b/docs/releases/v2016.2.rst @@ -76,7 +76,7 @@ New features the ``config_mode.owner.obligatory`` site.conf option * The *node name* setting in the config mode is no longer restricted to valid DNS - hostnames, but allows any UTF-8 string (`#414 `_) + hostnames, but allows any UTF-8 string (`#414 `_) * Besides the hostname, public key, site config and primary MAC address, the contact information can now be accessed from config mode site texts From 82ef6599f8ba817346e86b3124fc61e6b2f3c4d7 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 30 Sep 2016 17:23:20 +0200 Subject: [PATCH 009/126] mac80211: backport ath9k stability fix --- ...211-fix-packet-loss-on-fq-reordering.patch | 636 +++++++ ...e-with-CCMP-PN-generated-in-hardware.patch | 21 + ...issues-with-powersave-devices-FS-176.patch | 1513 +++++++++++++++++ 3 files changed, 2170 insertions(+) create mode 100644 patches/openwrt/0124-mac80211-fix-packet-loss-on-fq-reordering.patch create mode 100644 patches/openwrt/0125-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch create mode 100644 patches/openwrt/0126-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch diff --git a/patches/openwrt/0124-mac80211-fix-packet-loss-on-fq-reordering.patch b/patches/openwrt/0124-mac80211-fix-packet-loss-on-fq-reordering.patch new file mode 100644 index 00000000..6328ba4c --- /dev/null +++ b/patches/openwrt/0124-mac80211-fix-packet-loss-on-fq-reordering.patch @@ -0,0 +1,636 @@ +From: Matthias Schiffer +Date: Fri, 30 Sep 2016 16:57:44 +0200 +Subject: mac80211: fix packet loss on fq reordering + +Signed-off-by: Felix Fietkau + +Backport of LEDE a194ffd4a89588bc75aeb9a27f59c36afd3d24bd + +diff --git a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch +new file mode 100644 +index 0000000..8ceed51 +--- /dev/null ++++ b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch +@@ -0,0 +1,478 @@ ++From: Felix Fietkau ++Date: Sun, 4 Sep 2016 17:46:24 +0200 ++Subject: [PATCH] mac80211: fix sequence number assignment for PS response ++ frames ++ ++When using intermediate queues, sequence number allocation is deferred ++until dequeue. This doesn't work for PS response frames, which bypass ++those queues. ++ ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/net/mac80211/tx.c +++++ b/net/mac80211/tx.c ++@@ -38,6 +38,12 @@ ++ #include "wme.h" ++ #include "rate.h" ++ +++static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx); +++static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, u8 pn_offs, +++ struct ieee80211_key_conf *key_conf, +++ struct sk_buff *skb); +++ ++ /* misc utils */ ++ ++ static inline void ieee80211_tx_stats(struct net_device *dev, u32 len) ++@@ -849,8 +855,7 @@ ieee80211_tx_h_sequence(struct ieee80211 ++ tid = *qc & IEEE80211_QOS_CTL_TID_MASK; ++ tx->sta->tx_stats.msdu[tid]++; ++ ++- if (!tx->sta->sta.txq[0]) ++- hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); +++ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); ++ ++ return TX_CONTINUE; ++ } ++@@ -1398,6 +1403,7 @@ void ieee80211_txq_init(struct ieee80211 ++ fq_tin_init(&txqi->tin); ++ fq_flow_init(&txqi->def_flow); ++ codel_vars_init(&txqi->def_cvars); +++ __skb_queue_head_init(&txqi->frags); ++ ++ txqi->txq.vif = &sdata->vif; ++ ++@@ -1420,6 +1426,7 @@ void ieee80211_txq_purge(struct ieee8021 ++ struct fq_tin *tin = &txqi->tin; ++ ++ fq_tin_reset(fq, tin, fq_skb_free_func); +++ ieee80211_purge_tx_queue(&local->hw, &txqi->frags); ++ } ++ ++ int ieee80211_txq_setup_flows(struct ieee80211_local *local) ++@@ -1476,12 +1483,19 @@ struct sk_buff *ieee80211_tx_dequeue(str ++ struct sk_buff *skb = NULL; ++ struct fq *fq = &local->fq; ++ struct fq_tin *tin = &txqi->tin; +++ struct ieee80211_tx_info *info; ++ ++ spin_lock_bh(&fq->lock); ++ ++ if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags)) ++ goto out; ++ +++ /* Make sure fragments stay together. */ +++ skb = __skb_dequeue(&txqi->frags); +++ if (skb) +++ goto out; +++ +++begin: ++ skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func); ++ if (!skb) ++ goto out; ++@@ -1489,16 +1503,38 @@ struct sk_buff *ieee80211_tx_dequeue(str ++ ieee80211_set_skb_vif(skb, txqi); ++ ++ hdr = (struct ieee80211_hdr *)skb->data; ++- if (txq->sta && ieee80211_is_data_qos(hdr->frame_control)) { +++ info = IEEE80211_SKB_CB(skb); +++ if (txq->sta && info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { ++ struct sta_info *sta = container_of(txq->sta, struct sta_info, ++ sta); ++- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ u8 pn_offs = 0; ++ ++- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, txq->tid); ++- if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags)) ++- info->flags |= IEEE80211_TX_CTL_AMPDU; ++- else ++- info->flags &= ~IEEE80211_TX_CTL_AMPDU; +++ if (info->control.hw_key) +++ pn_offs = ieee80211_padded_hdrlen(hw, hdr->frame_control); +++ +++ ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, +++ info->control.hw_key, skb); +++ } else { +++ struct ieee80211_tx_data tx = { }; +++ +++ __skb_queue_head_init(&tx.skbs); +++ tx.local = local; +++ tx.skb = skb; +++ tx.hdrlen = ieee80211_padded_hdrlen(hw, hdr->frame_control); +++ if (txq->sta) { +++ tx.sta = container_of(txq->sta, struct sta_info, sta); +++ tx.sdata = tx.sta->sdata; +++ } else { +++ tx.sdata = vif_to_sdata(info->control.vif); +++ } +++ +++ if (invoke_tx_handlers_late(&tx)) +++ goto begin; +++ +++ skb = __skb_dequeue(&tx.skbs); +++ +++ if (!skb_queue_empty(&tx.skbs)) +++ skb_queue_splice_tail(&tx.skbs, &txqi->frags); ++ } ++ ++ out: ++@@ -1512,6 +1548,47 @@ out: ++ } ++ EXPORT_SYMBOL(ieee80211_tx_dequeue); ++ +++static bool ieee80211_queue_skb(struct ieee80211_local *local, +++ struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, +++ struct sk_buff *skb) +++{ +++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ struct fq *fq = &local->fq; +++ struct ieee80211_vif *vif; +++ struct txq_info *txqi; +++ struct ieee80211_sta *pubsta; +++ +++ if (!local->ops->wake_tx_queue || +++ sdata->vif.type == NL80211_IFTYPE_MONITOR) +++ return false; +++ +++ if (sta && sta->uploaded) +++ pubsta = &sta->sta; +++ else +++ pubsta = NULL; +++ +++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +++ sdata = container_of(sdata->bss, +++ struct ieee80211_sub_if_data, u.ap); +++ +++ vif = &sdata->vif; +++ txqi = ieee80211_get_txq(local, vif, pubsta, skb); +++ +++ if (!txqi) +++ return false; +++ +++ info->control.vif = vif; +++ +++ spin_lock_bh(&fq->lock); +++ ieee80211_txq_enqueue(local, txqi, skb); +++ spin_unlock_bh(&fq->lock); +++ +++ drv_wake_tx_queue(local, txqi); +++ +++ return true; +++} +++ ++ static bool ieee80211_tx_frags(struct ieee80211_local *local, ++ struct ieee80211_vif *vif, ++ struct ieee80211_sta *sta, ++@@ -1519,9 +1596,7 @@ static bool ieee80211_tx_frags(struct ie ++ bool txpending) ++ { ++ struct ieee80211_tx_control control = {}; ++- struct fq *fq = &local->fq; ++ struct sk_buff *skb, *tmp; ++- struct txq_info *txqi; ++ unsigned long flags; ++ ++ skb_queue_walk_safe(skbs, skb, tmp) { ++@@ -1536,21 +1611,6 @@ static bool ieee80211_tx_frags(struct ie ++ } ++ #endif ++ ++- txqi = ieee80211_get_txq(local, vif, sta, skb); ++- if (txqi) { ++- info->control.vif = vif; ++- ++- __skb_unlink(skb, skbs); ++- ++- spin_lock_bh(&fq->lock); ++- ieee80211_txq_enqueue(local, txqi, skb); ++- spin_unlock_bh(&fq->lock); ++- ++- drv_wake_tx_queue(local, txqi); ++- ++- continue; ++- } ++- ++ spin_lock_irqsave(&local->queue_stop_reason_lock, flags); ++ if (local->queue_stop_reasons[q] || ++ (!txpending && !skb_queue_empty(&local->pending[q]))) { ++@@ -1671,10 +1731,13 @@ static bool __ieee80211_tx(struct ieee80 ++ /* ++ * Invoke TX handlers, return 0 on success and non-zero if the ++ * frame was dropped or queued. +++ * +++ * The handlers are split into an early and late part. The latter is everything +++ * that can be sensitive to reordering, and will be deferred to after packets +++ * are dequeued from the intermediate queues (when they are enabled). ++ */ ++-static int invoke_tx_handlers(struct ieee80211_tx_data *tx) +++static int invoke_tx_handlers_early(struct ieee80211_tx_data *tx) ++ { ++- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); ++ ieee80211_tx_result res = TX_DROP; ++ ++ #define CALL_TXH(txh) \ ++@@ -1688,16 +1751,42 @@ static int invoke_tx_handlers(struct iee ++ CALL_TXH(ieee80211_tx_h_check_assoc); ++ CALL_TXH(ieee80211_tx_h_ps_buf); ++ CALL_TXH(ieee80211_tx_h_check_control_port_protocol); ++- CALL_TXH(ieee80211_tx_h_select_key); +++ ++ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) ++ CALL_TXH(ieee80211_tx_h_rate_ctrl); ++ +++ txh_done: +++ if (unlikely(res == TX_DROP)) { +++ I802_DEBUG_INC(tx->local->tx_handlers_drop); +++ if (tx->skb) +++ ieee80211_free_txskb(&tx->local->hw, tx->skb); +++ else +++ ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); +++ return -1; +++ } else if (unlikely(res == TX_QUEUED)) { +++ I802_DEBUG_INC(tx->local->tx_handlers_queued); +++ return -1; +++ } +++ +++ return 0; +++} +++ +++/* +++ * Late handlers can be called while the sta lock is held. Handlers that can +++ * cause packets to be generated will cause deadlock! +++ */ +++static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx) +++{ +++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); +++ ieee80211_tx_result res = TX_CONTINUE; +++ ++ if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { ++ __skb_queue_tail(&tx->skbs, tx->skb); ++ tx->skb = NULL; ++ goto txh_done; ++ } ++ +++ CALL_TXH(ieee80211_tx_h_select_key); ++ CALL_TXH(ieee80211_tx_h_michael_mic_add); ++ CALL_TXH(ieee80211_tx_h_sequence); ++ CALL_TXH(ieee80211_tx_h_fragment); ++@@ -1724,6 +1813,15 @@ static int invoke_tx_handlers(struct iee ++ return 0; ++ } ++ +++static int invoke_tx_handlers(struct ieee80211_tx_data *tx) +++{ +++ int r = invoke_tx_handlers_early(tx); +++ if (r) +++ return r; +++ +++ return invoke_tx_handlers_late(tx); +++} +++ ++ bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, struct sk_buff *skb, ++ int band, struct ieee80211_sta **sta) ++@@ -1798,7 +1896,13 @@ static bool ieee80211_tx(struct ieee8021 ++ info->hw_queue = ++ sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; ++ ++- if (!invoke_tx_handlers(&tx)) +++ if (invoke_tx_handlers_early(&tx)) +++ return false; +++ +++ if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb)) +++ return true; +++ +++ if (!invoke_tx_handlers_late(&tx)) ++ result = __ieee80211_tx(local, &tx.skbs, led_len, ++ tx.sta, txpending); ++ ++@@ -3181,7 +3285,7 @@ out: ++ } ++ ++ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, ++- struct net_device *dev, struct sta_info *sta, +++ struct sta_info *sta, ++ struct ieee80211_fast_tx *fast_tx, ++ struct sk_buff *skb) ++ { ++@@ -3192,9 +3296,9 @@ static bool ieee80211_xmit_fast(struct i ++ struct ethhdr eth; ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; ++- struct ieee80211_tx_data tx; ++- ieee80211_tx_result r; ++ struct tid_ampdu_tx *tid_tx = NULL; +++ ieee80211_tx_result r; +++ struct ieee80211_tx_data tx; ++ u8 tid = IEEE80211_NUM_TIDS; ++ ++ /* control port protocol needs a lot of special handling */ ++@@ -3232,8 +3336,6 @@ static bool ieee80211_xmit_fast(struct i ++ return true; ++ } ++ ++- ieee80211_tx_stats(dev, skb->len + extra_head); ++- ++ if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) && ++ ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb)) ++ return true; ++@@ -3262,24 +3364,7 @@ static bool ieee80211_xmit_fast(struct i ++ info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | ++ IEEE80211_TX_CTL_DONTFRAG | ++ (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0); ++- ++- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { ++- *ieee80211_get_qos_ctl(hdr) = tid; ++- if (!sta->sta.txq[0]) ++- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); ++- } else { ++- info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; ++- hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); ++- sdata->sequence_number += 0x10; ++- } ++- ++- if (skb_shinfo(skb)->gso_size) ++- sta->tx_stats.msdu[tid] += ++- DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); ++- else ++- sta->tx_stats.msdu[tid]++; ++- ++- info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; +++ info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT; ++ ++ __skb_queue_head_init(&tx.skbs); ++ ++@@ -3305,22 +3390,71 @@ static bool ieee80211_xmit_fast(struct i ++ } ++ } ++ +++ if (ieee80211_queue_skb(local, sdata, sta, skb)) +++ return true; +++ +++ ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, +++ &fast_tx->key->conf, skb); +++ +++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +++ sdata = container_of(sdata->bss, +++ struct ieee80211_sub_if_data, u.ap); +++ +++ __skb_queue_tail(&tx.skbs, skb); +++ ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); +++ +++ return true; +++} +++ +++/* +++ * Can be called while the sta lock is held. Anything that can cause packets to +++ * be generated will cause deadlock! +++ */ +++static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, u8 pn_offs, +++ struct ieee80211_key_conf *key_conf, +++ struct sk_buff *skb) +++{ +++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ struct ieee80211_hdr *hdr = (void *)skb->data; +++ u8 tid = IEEE80211_NUM_TIDS; +++ +++ ieee80211_tx_stats(skb->dev, skb->len); +++ +++ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { +++ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; +++ *ieee80211_get_qos_ctl(hdr) = tid; +++ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); +++ } else { +++ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; +++ hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); +++ sdata->sequence_number += 0x10; +++ } +++ +++ if (skb_shinfo(skb)->gso_size) +++ sta->tx_stats.msdu[tid] += +++ DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); +++ else +++ sta->tx_stats.msdu[tid]++; +++ +++ info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; +++ ++ /* statistics normally done by ieee80211_tx_h_stats (but that ++ * has to consider fragmentation, so is more complex) ++ */ ++ sta->tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len; ++ sta->tx_stats.packets[skb_get_queue_mapping(skb)]++; ++ ++- if (fast_tx->pn_offs) { +++ if (pn_offs) { ++ u64 pn; ++- u8 *crypto_hdr = skb->data + fast_tx->pn_offs; +++ u8 *crypto_hdr = skb->data + pn_offs; ++ ++- switch (fast_tx->key->conf.cipher) { +++ switch (key_conf->cipher) { ++ case WLAN_CIPHER_SUITE_CCMP: ++ case WLAN_CIPHER_SUITE_CCMP_256: ++ case WLAN_CIPHER_SUITE_GCMP: ++ case WLAN_CIPHER_SUITE_GCMP_256: ++- pn = atomic64_inc_return(&fast_tx->key->conf.tx_pn); +++ pn = atomic64_inc_return(&key_conf->tx_pn); ++ crypto_hdr[0] = pn; ++ crypto_hdr[1] = pn >> 8; ++ crypto_hdr[4] = pn >> 16; ++@@ -3331,12 +3465,6 @@ static bool ieee80211_xmit_fast(struct i ++ } ++ } ++ ++- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) ++- sdata = container_of(sdata->bss, ++- struct ieee80211_sub_if_data, u.ap); ++- ++- __skb_queue_tail(&tx.skbs, skb); ++- ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); ++ return true; ++ } ++ ++@@ -3364,7 +3492,7 @@ void __ieee80211_subif_start_xmit(struct ++ fast_tx = rcu_dereference(sta->fast_tx); ++ ++ if (fast_tx && ++- ieee80211_xmit_fast(sdata, dev, sta, fast_tx, skb)) +++ ieee80211_xmit_fast(sdata, sta, fast_tx, skb)) ++ goto out; ++ } ++ ++--- a/include/net/mac80211.h +++++ b/include/net/mac80211.h ++@@ -715,6 +715,7 @@ enum mac80211_tx_info_flags { ++ * frame (PS-Poll or uAPSD). ++ * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information ++ * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame +++ * @IEEE80211_TX_CTRL_FAST_XMIT: This frame is going through the fast_xmit path ++ * ++ * These flags are used in tx_info->control.flags. ++ */ ++@@ -723,6 +724,7 @@ enum mac80211_tx_control_flags { ++ IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), ++ IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), ++ IEEE80211_TX_CTRL_AMSDU = BIT(3), +++ IEEE80211_TX_CTRL_FAST_XMIT = BIT(4), ++ }; ++ ++ /* ++--- a/net/mac80211/ieee80211_i.h +++++ b/net/mac80211/ieee80211_i.h ++@@ -814,11 +814,13 @@ enum txq_info_flags { ++ * @def_flow: used as a fallback flow when a packet destined to @tin hashes to ++ * a fq_flow which is already owned by a different tin ++ * @def_cvars: codel vars for @def_flow +++ * @frags: used to keep fragments created after dequeue ++ */ ++ struct txq_info { ++ struct fq_tin tin; ++ struct fq_flow def_flow; ++ struct codel_vars def_cvars; +++ struct sk_buff_head frags; ++ unsigned long flags; ++ ++ /* keep last! */ +diff --git a/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch b/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch +deleted file mode 100644 +index a82d12f..0000000 +--- a/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch ++++ /dev/null +@@ -1,107 +0,0 @@ +-From: Felix Fietkau +-Date: Sun, 4 Sep 2016 17:46:24 +0200 +-Subject: [PATCH] mac80211: fix sequence number assignment for PS response +- frames +- +-When using intermediate queues, sequence number allocation is deferred +-until dequeue. This doesn't work for PS response frames, which bypass +-those queues. +- +-Signed-off-by: Felix Fietkau +---- +- +---- a/net/mac80211/tx.c +-+++ b/net/mac80211/tx.c +-@@ -792,6 +792,36 @@ static __le16 ieee80211_tx_next_seq(stru +- return ret; +- } +- +-+static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, +-+ struct ieee80211_vif *vif, +-+ struct ieee80211_sta *pubsta, +-+ struct sk_buff *skb) +-+{ +-+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; +-+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +-+ struct ieee80211_txq *txq = NULL; +-+ +-+ if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || +-+ (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) +-+ return NULL; +-+ +-+ if (!ieee80211_is_data(hdr->frame_control)) +-+ return NULL; +-+ +-+ if (pubsta) { +-+ u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; +-+ +-+ txq = pubsta->txq[tid]; +-+ } else if (vif) { +-+ txq = vif->txq; +-+ } +-+ +-+ if (!txq) +-+ return NULL; +-+ +-+ return to_txq_info(txq); +-+} +-+ +- static ieee80211_tx_result debug_noinline +- ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) +- { +-@@ -849,7 +879,8 @@ ieee80211_tx_h_sequence(struct ieee80211 +- tid = *qc & IEEE80211_QOS_CTL_TID_MASK; +- tx->sta->tx_stats.msdu[tid]++; +- +-- if (!tx->sta->sta.txq[0]) +-+ if (!ieee80211_get_txq(tx->local, info->control.vif, &tx->sta->sta, +-+ tx->skb)) +- hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); +- +- return TX_CONTINUE; +-@@ -1238,36 +1269,6 @@ ieee80211_tx_prepare(struct ieee80211_su +- return TX_CONTINUE; +- } +- +--static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, +-- struct ieee80211_vif *vif, +-- struct ieee80211_sta *pubsta, +-- struct sk_buff *skb) +--{ +-- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; +-- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +-- struct ieee80211_txq *txq = NULL; +-- +-- if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || +-- (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) +-- return NULL; +-- +-- if (!ieee80211_is_data(hdr->frame_control)) +-- return NULL; +-- +-- if (pubsta) { +-- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; +-- +-- txq = pubsta->txq[tid]; +-- } else if (vif) { +-- txq = vif->txq; +-- } +-- +-- if (!txq) +-- return NULL; +-- +-- return to_txq_info(txq); +--} +-- +- static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb) +- { +- IEEE80211_SKB_CB(skb)->control.enqueue_time = codel_get_time(); +-@@ -3265,7 +3266,7 @@ static bool ieee80211_xmit_fast(struct i +- +- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { +- *ieee80211_get_qos_ctl(hdr) = tid; +-- if (!sta->sta.txq[0]) +-+ if (!ieee80211_get_txq(local, &sdata->vif, &sta->sta, skb)) +- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); +- } else { +- info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; +diff --git a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch +index c40598d..aba065e 100644 +--- a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch ++++ b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch +@@ -18,7 +18,7 @@ + const u8 *addr); + --- a/include/net/mac80211.h + +++ b/include/net/mac80211.h +-@@ -1317,6 +1317,7 @@ enum ieee80211_smps_mode { ++@@ -1319,6 +1319,7 @@ enum ieee80211_smps_mode { + * + * @power_level: requested transmit power (in dBm), backward compatibility + * value only that is set to the minimum of all interfaces +@@ -26,7 +26,7 @@ + * + * @chandef: the channel definition to tune to + * @radar_enabled: whether radar detection is enabled +-@@ -1337,6 +1338,7 @@ enum ieee80211_smps_mode { ++@@ -1339,6 +1340,7 @@ enum ieee80211_smps_mode { + struct ieee80211_conf { + u32 flags; + int power_level, dynamic_ps_timeout; +@@ -87,7 +87,7 @@ + CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) + --- a/net/mac80211/ieee80211_i.h + +++ b/net/mac80211/ieee80211_i.h +-@@ -1338,6 +1338,7 @@ struct ieee80211_local { ++@@ -1340,6 +1340,7 @@ struct ieee80211_local { + int dynamic_ps_forced_timeout; + + int user_power_level; /* in dBm, for all interfaces */ diff --git a/patches/openwrt/0125-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch b/patches/openwrt/0125-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch new file mode 100644 index 00000000..f464421c --- /dev/null +++ b/patches/openwrt/0125-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch @@ -0,0 +1,21 @@ +From: Matthias Schiffer +Date: Fri, 30 Sep 2016 16:57:57 +0200 +Subject: mac80211: fix tx issue with CCMP PN generated in hardware + +Signed-off-by: Felix Fietkau + +Backport of LEDE f3747020e202883a43729fc245986f9e36289d6c + +diff --git a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch +index 8ceed51..aba1ff4 100644 +--- a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch ++++ b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch +@@ -404,7 +404,7 @@ Signed-off-by: Felix Fietkau + sta->tx_stats.packets[skb_get_queue_mapping(skb)]++; + + - if (fast_tx->pn_offs) { +-+ if (pn_offs) { +++ if (pn_offs && (key_conf->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { + u64 pn; + - u8 *crypto_hdr = skb->data + fast_tx->pn_offs; + + u8 *crypto_hdr = skb->data + pn_offs; diff --git a/patches/openwrt/0126-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch b/patches/openwrt/0126-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch new file mode 100644 index 00000000..ddfb6445 --- /dev/null +++ b/patches/openwrt/0126-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch @@ -0,0 +1,1513 @@ +From: Matthias Schiffer +Date: Fri, 30 Sep 2016 16:58:01 +0200 +Subject: ath9k: remove patch causing stability issues with powersave devices (FS#176) + +Signed-off-by: Felix Fietkau + +Backport of LEDE fc88eb3fdfce6d39b4c62158cf6f42605a360a1e + +diff --git a/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch b/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch +deleted file mode 100644 +index 1cc1667..0000000 +--- a/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch ++++ /dev/null +@@ -1,40 +0,0 @@ +-From: Felix Fietkau +-Date: Sun, 28 Aug 2016 13:15:10 +0200 +-Subject: [PATCH] ath9k: release PS buffered frames as A-MPDU if enabled +- +-Signed-off-by: Felix Fietkau +---- +- +---- a/drivers/net/wireless/ath/ath9k/xmit.c +-+++ b/drivers/net/wireless/ath/ath9k/xmit.c +-@@ -1660,10 +1660,11 @@ void ath9k_release_buffered_frames(struc +- struct ath_node *an = (struct ath_node *)sta->drv_priv; +- struct ath_txq *txq = sc->tx.uapsdq; +- struct ieee80211_tx_info *info; +-+ struct ath_frame_info *fi; +- struct list_head bf_q; +- struct ath_buf *bf_tail = NULL, *bf; +- int sent = 0; +-- int i; +-+ int n, i; +- +- INIT_LIST_HEAD(&bf_q); +- for (i = 0; tids && nframes; i++, tids >>= 1) { +-@@ -1683,10 +1684,15 @@ void ath9k_release_buffered_frames(struc +- ath9k_set_moredata(sc, bf, true); +- list_add_tail(&bf->list, &bf_q); +- ath_set_rates(tid->an->vif, tid->an->sta, bf, true); +-- if (bf_isampdu(bf)) { +-+ if (bf_isampdu(bf)) +- ath_tx_addto_baw(sc, tid, bf); +-- bf->bf_state.bf_type &= ~BUF_AGGR; +-+ if (bf_isaggr(bf)) { +-+ fi = get_frame_info(bf->bf_mpdu); +-+ n = ath_compute_num_delims(sc, tid, bf, +-+ fi->framelen, true); +-+ bf->bf_state.ndelim = n; +- } +-+ +- if (bf_tail) +- bf_tail->bf_next = bf; +- +diff --git a/package/kernel/mac80211/patches/341-ath9k-report-tx-status-on-EOSP.patch b/package/kernel/mac80211/patches/341-ath9k-report-tx-status-on-EOSP.patch +new file mode 100644 +index 0000000..80a3074 +--- /dev/null ++++ b/package/kernel/mac80211/patches/341-ath9k-report-tx-status-on-EOSP.patch +@@ -0,0 +1,19 @@ ++From: Felix Fietkau ++Date: Sun, 28 Aug 2016 13:23:27 +0200 ++Subject: [PATCH] ath9k: report tx status on EOSP ++ ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/drivers/net/wireless/ath/ath9k/xmit.c +++++ b/drivers/net/wireless/ath/ath9k/xmit.c ++@@ -86,7 +86,8 @@ static void ath_tx_status(struct ieee802 ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_sta *sta = info->status.status_driver_data[0]; ++ ++- if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { +++ if (info->flags & (IEEE80211_TX_CTL_REQ_TX_STATUS | +++ IEEE80211_TX_STATUS_EOSP)) { ++ ieee80211_tx_status(hw, skb); ++ return; ++ } +diff --git a/package/kernel/mac80211/patches/342-ath9k-fix-block-ack-window-tracking-issues.patch b/package/kernel/mac80211/patches/342-ath9k-fix-block-ack-window-tracking-issues.patch +new file mode 100644 +index 0000000..fea147b +--- /dev/null ++++ b/package/kernel/mac80211/patches/342-ath9k-fix-block-ack-window-tracking-issues.patch +@@ -0,0 +1,114 @@ ++From: Felix Fietkau ++Date: Tue, 30 Aug 2016 12:44:08 +0200 ++Subject: [PATCH] ath9k: fix block-ack window tracking issues ++ ++Ensure that a buffer gets tracked as part of the block-ack window as ++soon as it's dequeued from the tid for the first time. Ensure that ++double calls to ath_tx_addto_baw (e.g. on retransmission) don't cause ++any issues. ++ ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/drivers/net/wireless/ath/ath9k/xmit.c +++++ b/drivers/net/wireless/ath/ath9k/xmit.c ++@@ -62,7 +62,7 @@ static void ath_tx_rc_status(struct ath_ ++ struct ath_tx_status *ts, int nframes, int nbad, ++ int txok); ++ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, ++- int seqno); +++ struct ath_buf *bf); ++ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, ++ struct ath_txq *txq, ++ struct ath_atx_tid *tid, ++@@ -300,7 +300,7 @@ static void ath_tx_flush_tid(struct ath_ ++ } ++ ++ if (fi->baw_tracked) { ++- ath_tx_update_baw(sc, tid, bf->bf_state.seqno); +++ ath_tx_update_baw(sc, tid, bf); ++ sendbar = true; ++ } ++ ++@@ -316,10 +316,15 @@ static void ath_tx_flush_tid(struct ath_ ++ } ++ ++ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, ++- int seqno) +++ struct ath_buf *bf) ++ { +++ struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu); +++ u16 seqno = bf->bf_state.seqno; ++ int index, cindex; ++ +++ if (!fi->baw_tracked) +++ return; +++ ++ index = ATH_BA_INDEX(tid->seq_start, seqno); ++ cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); ++ ++@@ -340,6 +345,9 @@ static void ath_tx_addto_baw(struct ath_ ++ u16 seqno = bf->bf_state.seqno; ++ int index, cindex; ++ +++ if (fi->baw_tracked) +++ return; +++ ++ index = ATH_BA_INDEX(tid->seq_start, seqno); ++ cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); ++ __set_bit(cindex, tid->tx_buf); ++@@ -616,7 +624,7 @@ static void ath_tx_complete_aggr(struct ++ * complete the acked-ones/xretried ones; update ++ * block-ack window ++ */ ++- ath_tx_update_baw(sc, tid, seqno); +++ ath_tx_update_baw(sc, tid, bf); ++ ++ if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) { ++ memcpy(tx_info->control.rates, rates, sizeof(rates)); ++@@ -646,7 +654,7 @@ static void ath_tx_complete_aggr(struct ++ * run out of tx buf. ++ */ ++ if (!tbf) { ++- ath_tx_update_baw(sc, tid, seqno); +++ ath_tx_update_baw(sc, tid, bf); ++ ++ ath_tx_complete_buf(sc, bf, txq, ++ &bf_head, NULL, ts, ++@@ -986,11 +994,14 @@ ath_tx_get_tid_subframe(struct ath_softc ++ ++ INIT_LIST_HEAD(&bf_head); ++ list_add(&bf->list, &bf_head); ++- ath_tx_update_baw(sc, tid, seqno); +++ ath_tx_update_baw(sc, tid, bf); ++ ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); ++ continue; ++ } ++ +++ if (bf_isampdu(bf)) +++ ath_tx_addto_baw(sc, tid, bf); +++ ++ return bf; ++ } ++ ++@@ -1048,8 +1059,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s ++ bf->bf_next = NULL; ++ ++ /* link buffers of this frame to the aggregate */ ++- if (!fi->baw_tracked) ++- ath_tx_addto_baw(sc, tid, bf); ++ bf->bf_state.ndelim = ndelim; ++ ++ list_add_tail(&bf->list, bf_q); ++@@ -1684,10 +1693,8 @@ void ath9k_release_buffered_frames(struc ++ ath9k_set_moredata(sc, bf, true); ++ list_add_tail(&bf->list, &bf_q); ++ ath_set_rates(tid->an->vif, tid->an->sta, bf, true); ++- if (bf_isampdu(bf)) { ++- ath_tx_addto_baw(sc, tid, bf); +++ if (bf_isampdu(bf)) ++ bf->bf_state.bf_type &= ~BUF_AGGR; ++- } ++ if (bf_tail) ++ bf_tail->bf_next = bf; ++ +diff --git a/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch b/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch +deleted file mode 100644 +index 80a3074..0000000 +--- a/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch ++++ /dev/null +@@ -1,19 +0,0 @@ +-From: Felix Fietkau +-Date: Sun, 28 Aug 2016 13:23:27 +0200 +-Subject: [PATCH] ath9k: report tx status on EOSP +- +-Signed-off-by: Felix Fietkau +---- +- +---- a/drivers/net/wireless/ath/ath9k/xmit.c +-+++ b/drivers/net/wireless/ath/ath9k/xmit.c +-@@ -86,7 +86,8 @@ static void ath_tx_status(struct ieee802 +- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +- struct ieee80211_sta *sta = info->status.status_driver_data[0]; +- +-- if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { +-+ if (info->flags & (IEEE80211_TX_CTL_REQ_TX_STATUS | +-+ IEEE80211_TX_STATUS_EOSP)) { +- ieee80211_tx_status(hw, skb); +- return; +- } +diff --git a/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch b/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch +deleted file mode 100644 +index 007a8d7d..0000000 +--- a/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch ++++ /dev/null +@@ -1,111 +0,0 @@ +-From: Felix Fietkau +-Date: Tue, 30 Aug 2016 12:44:08 +0200 +-Subject: [PATCH] ath9k: fix block-ack window tracking issues +- +-Ensure that a buffer gets tracked as part of the block-ack window as +-soon as it's dequeued from the tid for the first time. Ensure that +-double calls to ath_tx_addto_baw (e.g. on retransmission) don't cause +-any issues. +- +-Signed-off-by: Felix Fietkau +---- +- +---- a/drivers/net/wireless/ath/ath9k/xmit.c +-+++ b/drivers/net/wireless/ath/ath9k/xmit.c +-@@ -62,7 +62,7 @@ static void ath_tx_rc_status(struct ath_ +- struct ath_tx_status *ts, int nframes, int nbad, +- int txok); +- static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, +-- int seqno); +-+ struct ath_buf *bf); +- static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, +- struct ath_txq *txq, +- struct ath_atx_tid *tid, +-@@ -300,7 +300,7 @@ static void ath_tx_flush_tid(struct ath_ +- } +- +- if (fi->baw_tracked) { +-- ath_tx_update_baw(sc, tid, bf->bf_state.seqno); +-+ ath_tx_update_baw(sc, tid, bf); +- sendbar = true; +- } +- +-@@ -316,10 +316,15 @@ static void ath_tx_flush_tid(struct ath_ +- } +- +- static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, +-- int seqno) +-+ struct ath_buf *bf) +- { +-+ struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu); +-+ u16 seqno = bf->bf_state.seqno; +- int index, cindex; +- +-+ if (!fi->baw_tracked) +-+ return; +-+ +- index = ATH_BA_INDEX(tid->seq_start, seqno); +- cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); +- +-@@ -340,6 +345,9 @@ static void ath_tx_addto_baw(struct ath_ +- u16 seqno = bf->bf_state.seqno; +- int index, cindex; +- +-+ if (fi->baw_tracked) +-+ return; +-+ +- index = ATH_BA_INDEX(tid->seq_start, seqno); +- cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); +- __set_bit(cindex, tid->tx_buf); +-@@ -616,7 +624,7 @@ static void ath_tx_complete_aggr(struct +- * complete the acked-ones/xretried ones; update +- * block-ack window +- */ +-- ath_tx_update_baw(sc, tid, seqno); +-+ ath_tx_update_baw(sc, tid, bf); +- +- if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) { +- memcpy(tx_info->control.rates, rates, sizeof(rates)); +-@@ -646,7 +654,7 @@ static void ath_tx_complete_aggr(struct +- * run out of tx buf. +- */ +- if (!tbf) { +-- ath_tx_update_baw(sc, tid, seqno); +-+ ath_tx_update_baw(sc, tid, bf); +- +- ath_tx_complete_buf(sc, bf, txq, +- &bf_head, NULL, ts, +-@@ -986,11 +994,14 @@ ath_tx_get_tid_subframe(struct ath_softc +- +- INIT_LIST_HEAD(&bf_head); +- list_add(&bf->list, &bf_head); +-- ath_tx_update_baw(sc, tid, seqno); +-+ ath_tx_update_baw(sc, tid, bf); +- ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); +- continue; +- } +- +-+ if (bf_isampdu(bf)) +-+ ath_tx_addto_baw(sc, tid, bf); +-+ +- return bf; +- } +- +-@@ -1048,8 +1059,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s +- bf->bf_next = NULL; +- +- /* link buffers of this frame to the aggregate */ +-- if (!fi->baw_tracked) +-- ath_tx_addto_baw(sc, tid, bf); +- bf->bf_state.ndelim = ndelim; +- +- list_add_tail(&bf->list, bf_q); +-@@ -1685,8 +1694,6 @@ void ath9k_release_buffered_frames(struc +- ath9k_set_moredata(sc, bf, true); +- list_add_tail(&bf->list, &bf_q); +- ath_set_rates(tid->an->vif, tid->an->sta, bf, true); +-- if (bf_isampdu(bf)) +-- ath_tx_addto_baw(sc, tid, bf); +- if (bf_isaggr(bf)) { +- fi = get_frame_info(bf->bf_mpdu); +- n = ath_compute_num_delims(sc, tid, bf, +diff --git a/package/kernel/mac80211/patches/343-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch b/package/kernel/mac80211/patches/343-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch +new file mode 100644 +index 0000000..3bbca22 +--- /dev/null ++++ b/package/kernel/mac80211/patches/343-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch +@@ -0,0 +1,64 @@ ++From: Johannes Berg ++Date: Mon, 29 Aug 2016 23:25:18 +0300 ++Subject: [PATCH] mac80211: send delBA on unexpected BlockAck data frames ++ ++When we receive data frames with ACK policy BlockAck, send ++delBA as requested by the 802.11 spec. Since this would be ++happening for every frame inside an A-MPDU if it's really ++received outside a session, limit it to a single attempt. ++ ++Signed-off-by: Johannes Berg ++--- ++ ++--- a/net/mac80211/agg-rx.c +++++ b/net/mac80211/agg-rx.c ++@@ -388,8 +388,10 @@ void __ieee80211_start_rx_ba_session(str ++ } ++ ++ end: ++- if (status == WLAN_STATUS_SUCCESS) +++ if (status == WLAN_STATUS_SUCCESS) { ++ __set_bit(tid, sta->ampdu_mlme.agg_session_valid); +++ __clear_bit(tid, sta->ampdu_mlme.unexpected_agg); +++ } ++ mutex_unlock(&sta->ampdu_mlme.mtx); ++ ++ end_no_lock: ++--- a/net/mac80211/rx.c +++++ b/net/mac80211/rx.c ++@@ -1072,8 +1072,15 @@ static void ieee80211_rx_reorder_ampdu(s ++ tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK; ++ ++ tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); ++- if (!tid_agg_rx) +++ if (!tid_agg_rx) { +++ if (ack_policy == IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && +++ !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && +++ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) +++ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, +++ WLAN_BACK_RECIPIENT, +++ WLAN_REASON_QSTA_REQUIRE_SETUP); ++ goto dont_reorder; +++ } ++ ++ /* qos null data frames are excluded */ ++ if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) ++--- a/net/mac80211/sta_info.h +++++ b/net/mac80211/sta_info.h ++@@ -230,6 +230,8 @@ struct tid_ampdu_rx { ++ * @tid_rx_stop_requested: bitmap indicating which BA sessions per TID the ++ * driver requested to close until the work for it runs ++ * @agg_session_valid: bitmap indicating which TID has a rx BA session open on +++ * @unexpected_agg: bitmap indicating which TID already sent a delBA due to +++ * unexpected aggregation related frames outside a session ++ * @work: work struct for starting/stopping aggregation ++ * @tid_tx: aggregation info for Tx per TID ++ * @tid_start_tx: sessions where start was requested ++@@ -244,6 +246,7 @@ struct sta_ampdu_mlme { ++ unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; ++ unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; ++ unsigned long agg_session_valid[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; +++ unsigned long unexpected_agg[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; ++ /* tx */ ++ struct work_struct work; ++ struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; +diff --git a/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch +new file mode 100644 +index 0000000..c3d3118 +--- /dev/null ++++ b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch +@@ -0,0 +1,26 @@ ++From: Johannes Berg ++Date: Mon, 29 Aug 2016 23:25:19 +0300 ++Subject: [PATCH] mac80211: send delBA on unexpected BlockAck Request ++ ++If we don't have a BA session, send delBA, as requested by the ++IEEE 802.11 spec. Apply the same limit of sending such a delBA ++only once as in the previous patch. ++ ++Signed-off-by: Johannes Berg ++--- ++ ++--- a/net/mac80211/rx.c +++++ b/net/mac80211/rx.c ++@@ -2537,6 +2537,12 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_ ++ ++ tid = le16_to_cpu(bar_data.control) >> 12; ++ +++ if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && +++ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) +++ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, +++ WLAN_BACK_RECIPIENT, +++ WLAN_REASON_QSTA_REQUIRE_SETUP); +++ ++ tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); ++ if (!tid_agg_rx) ++ return RX_DROP_MONITOR; +diff --git a/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch +deleted file mode 100644 +index 3bbca22..0000000 +--- a/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch ++++ /dev/null +@@ -1,64 +0,0 @@ +-From: Johannes Berg +-Date: Mon, 29 Aug 2016 23:25:18 +0300 +-Subject: [PATCH] mac80211: send delBA on unexpected BlockAck data frames +- +-When we receive data frames with ACK policy BlockAck, send +-delBA as requested by the 802.11 spec. Since this would be +-happening for every frame inside an A-MPDU if it's really +-received outside a session, limit it to a single attempt. +- +-Signed-off-by: Johannes Berg +---- +- +---- a/net/mac80211/agg-rx.c +-+++ b/net/mac80211/agg-rx.c +-@@ -388,8 +388,10 @@ void __ieee80211_start_rx_ba_session(str +- } +- +- end: +-- if (status == WLAN_STATUS_SUCCESS) +-+ if (status == WLAN_STATUS_SUCCESS) { +- __set_bit(tid, sta->ampdu_mlme.agg_session_valid); +-+ __clear_bit(tid, sta->ampdu_mlme.unexpected_agg); +-+ } +- mutex_unlock(&sta->ampdu_mlme.mtx); +- +- end_no_lock: +---- a/net/mac80211/rx.c +-+++ b/net/mac80211/rx.c +-@@ -1072,8 +1072,15 @@ static void ieee80211_rx_reorder_ampdu(s +- tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK; +- +- tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); +-- if (!tid_agg_rx) +-+ if (!tid_agg_rx) { +-+ if (ack_policy == IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && +-+ !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && +-+ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) +-+ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, +-+ WLAN_BACK_RECIPIENT, +-+ WLAN_REASON_QSTA_REQUIRE_SETUP); +- goto dont_reorder; +-+ } +- +- /* qos null data frames are excluded */ +- if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) +---- a/net/mac80211/sta_info.h +-+++ b/net/mac80211/sta_info.h +-@@ -230,6 +230,8 @@ struct tid_ampdu_rx { +- * @tid_rx_stop_requested: bitmap indicating which BA sessions per TID the +- * driver requested to close until the work for it runs +- * @agg_session_valid: bitmap indicating which TID has a rx BA session open on +-+ * @unexpected_agg: bitmap indicating which TID already sent a delBA due to +-+ * unexpected aggregation related frames outside a session +- * @work: work struct for starting/stopping aggregation +- * @tid_tx: aggregation info for Tx per TID +- * @tid_start_tx: sessions where start was requested +-@@ -244,6 +246,7 @@ struct sta_ampdu_mlme { +- unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; +- unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; +- unsigned long agg_session_valid[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; +-+ unsigned long unexpected_agg[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; +- /* tx */ +- struct work_struct work; +- struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; +diff --git a/package/kernel/mac80211/patches/345-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch b/package/kernel/mac80211/patches/345-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch +new file mode 100644 +index 0000000..aba1ff4 +--- /dev/null ++++ b/package/kernel/mac80211/patches/345-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch +@@ -0,0 +1,478 @@ ++From: Felix Fietkau ++Date: Sun, 4 Sep 2016 17:46:24 +0200 ++Subject: [PATCH] mac80211: fix sequence number assignment for PS response ++ frames ++ ++When using intermediate queues, sequence number allocation is deferred ++until dequeue. This doesn't work for PS response frames, which bypass ++those queues. ++ ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/net/mac80211/tx.c +++++ b/net/mac80211/tx.c ++@@ -38,6 +38,12 @@ ++ #include "wme.h" ++ #include "rate.h" ++ +++static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx); +++static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, u8 pn_offs, +++ struct ieee80211_key_conf *key_conf, +++ struct sk_buff *skb); +++ ++ /* misc utils */ ++ ++ static inline void ieee80211_tx_stats(struct net_device *dev, u32 len) ++@@ -849,8 +855,7 @@ ieee80211_tx_h_sequence(struct ieee80211 ++ tid = *qc & IEEE80211_QOS_CTL_TID_MASK; ++ tx->sta->tx_stats.msdu[tid]++; ++ ++- if (!tx->sta->sta.txq[0]) ++- hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); +++ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); ++ ++ return TX_CONTINUE; ++ } ++@@ -1398,6 +1403,7 @@ void ieee80211_txq_init(struct ieee80211 ++ fq_tin_init(&txqi->tin); ++ fq_flow_init(&txqi->def_flow); ++ codel_vars_init(&txqi->def_cvars); +++ __skb_queue_head_init(&txqi->frags); ++ ++ txqi->txq.vif = &sdata->vif; ++ ++@@ -1420,6 +1426,7 @@ void ieee80211_txq_purge(struct ieee8021 ++ struct fq_tin *tin = &txqi->tin; ++ ++ fq_tin_reset(fq, tin, fq_skb_free_func); +++ ieee80211_purge_tx_queue(&local->hw, &txqi->frags); ++ } ++ ++ int ieee80211_txq_setup_flows(struct ieee80211_local *local) ++@@ -1476,12 +1483,19 @@ struct sk_buff *ieee80211_tx_dequeue(str ++ struct sk_buff *skb = NULL; ++ struct fq *fq = &local->fq; ++ struct fq_tin *tin = &txqi->tin; +++ struct ieee80211_tx_info *info; ++ ++ spin_lock_bh(&fq->lock); ++ ++ if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags)) ++ goto out; ++ +++ /* Make sure fragments stay together. */ +++ skb = __skb_dequeue(&txqi->frags); +++ if (skb) +++ goto out; +++ +++begin: ++ skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func); ++ if (!skb) ++ goto out; ++@@ -1489,16 +1503,38 @@ struct sk_buff *ieee80211_tx_dequeue(str ++ ieee80211_set_skb_vif(skb, txqi); ++ ++ hdr = (struct ieee80211_hdr *)skb->data; ++- if (txq->sta && ieee80211_is_data_qos(hdr->frame_control)) { +++ info = IEEE80211_SKB_CB(skb); +++ if (txq->sta && info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { ++ struct sta_info *sta = container_of(txq->sta, struct sta_info, ++ sta); ++- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ u8 pn_offs = 0; ++ ++- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, txq->tid); ++- if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags)) ++- info->flags |= IEEE80211_TX_CTL_AMPDU; ++- else ++- info->flags &= ~IEEE80211_TX_CTL_AMPDU; +++ if (info->control.hw_key) +++ pn_offs = ieee80211_padded_hdrlen(hw, hdr->frame_control); +++ +++ ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, +++ info->control.hw_key, skb); +++ } else { +++ struct ieee80211_tx_data tx = { }; +++ +++ __skb_queue_head_init(&tx.skbs); +++ tx.local = local; +++ tx.skb = skb; +++ tx.hdrlen = ieee80211_padded_hdrlen(hw, hdr->frame_control); +++ if (txq->sta) { +++ tx.sta = container_of(txq->sta, struct sta_info, sta); +++ tx.sdata = tx.sta->sdata; +++ } else { +++ tx.sdata = vif_to_sdata(info->control.vif); +++ } +++ +++ if (invoke_tx_handlers_late(&tx)) +++ goto begin; +++ +++ skb = __skb_dequeue(&tx.skbs); +++ +++ if (!skb_queue_empty(&tx.skbs)) +++ skb_queue_splice_tail(&tx.skbs, &txqi->frags); ++ } ++ ++ out: ++@@ -1512,6 +1548,47 @@ out: ++ } ++ EXPORT_SYMBOL(ieee80211_tx_dequeue); ++ +++static bool ieee80211_queue_skb(struct ieee80211_local *local, +++ struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, +++ struct sk_buff *skb) +++{ +++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ struct fq *fq = &local->fq; +++ struct ieee80211_vif *vif; +++ struct txq_info *txqi; +++ struct ieee80211_sta *pubsta; +++ +++ if (!local->ops->wake_tx_queue || +++ sdata->vif.type == NL80211_IFTYPE_MONITOR) +++ return false; +++ +++ if (sta && sta->uploaded) +++ pubsta = &sta->sta; +++ else +++ pubsta = NULL; +++ +++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +++ sdata = container_of(sdata->bss, +++ struct ieee80211_sub_if_data, u.ap); +++ +++ vif = &sdata->vif; +++ txqi = ieee80211_get_txq(local, vif, pubsta, skb); +++ +++ if (!txqi) +++ return false; +++ +++ info->control.vif = vif; +++ +++ spin_lock_bh(&fq->lock); +++ ieee80211_txq_enqueue(local, txqi, skb); +++ spin_unlock_bh(&fq->lock); +++ +++ drv_wake_tx_queue(local, txqi); +++ +++ return true; +++} +++ ++ static bool ieee80211_tx_frags(struct ieee80211_local *local, ++ struct ieee80211_vif *vif, ++ struct ieee80211_sta *sta, ++@@ -1519,9 +1596,7 @@ static bool ieee80211_tx_frags(struct ie ++ bool txpending) ++ { ++ struct ieee80211_tx_control control = {}; ++- struct fq *fq = &local->fq; ++ struct sk_buff *skb, *tmp; ++- struct txq_info *txqi; ++ unsigned long flags; ++ ++ skb_queue_walk_safe(skbs, skb, tmp) { ++@@ -1536,21 +1611,6 @@ static bool ieee80211_tx_frags(struct ie ++ } ++ #endif ++ ++- txqi = ieee80211_get_txq(local, vif, sta, skb); ++- if (txqi) { ++- info->control.vif = vif; ++- ++- __skb_unlink(skb, skbs); ++- ++- spin_lock_bh(&fq->lock); ++- ieee80211_txq_enqueue(local, txqi, skb); ++- spin_unlock_bh(&fq->lock); ++- ++- drv_wake_tx_queue(local, txqi); ++- ++- continue; ++- } ++- ++ spin_lock_irqsave(&local->queue_stop_reason_lock, flags); ++ if (local->queue_stop_reasons[q] || ++ (!txpending && !skb_queue_empty(&local->pending[q]))) { ++@@ -1671,10 +1731,13 @@ static bool __ieee80211_tx(struct ieee80 ++ /* ++ * Invoke TX handlers, return 0 on success and non-zero if the ++ * frame was dropped or queued. +++ * +++ * The handlers are split into an early and late part. The latter is everything +++ * that can be sensitive to reordering, and will be deferred to after packets +++ * are dequeued from the intermediate queues (when they are enabled). ++ */ ++-static int invoke_tx_handlers(struct ieee80211_tx_data *tx) +++static int invoke_tx_handlers_early(struct ieee80211_tx_data *tx) ++ { ++- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); ++ ieee80211_tx_result res = TX_DROP; ++ ++ #define CALL_TXH(txh) \ ++@@ -1688,16 +1751,42 @@ static int invoke_tx_handlers(struct iee ++ CALL_TXH(ieee80211_tx_h_check_assoc); ++ CALL_TXH(ieee80211_tx_h_ps_buf); ++ CALL_TXH(ieee80211_tx_h_check_control_port_protocol); ++- CALL_TXH(ieee80211_tx_h_select_key); +++ ++ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) ++ CALL_TXH(ieee80211_tx_h_rate_ctrl); ++ +++ txh_done: +++ if (unlikely(res == TX_DROP)) { +++ I802_DEBUG_INC(tx->local->tx_handlers_drop); +++ if (tx->skb) +++ ieee80211_free_txskb(&tx->local->hw, tx->skb); +++ else +++ ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); +++ return -1; +++ } else if (unlikely(res == TX_QUEUED)) { +++ I802_DEBUG_INC(tx->local->tx_handlers_queued); +++ return -1; +++ } +++ +++ return 0; +++} +++ +++/* +++ * Late handlers can be called while the sta lock is held. Handlers that can +++ * cause packets to be generated will cause deadlock! +++ */ +++static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx) +++{ +++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); +++ ieee80211_tx_result res = TX_CONTINUE; +++ ++ if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { ++ __skb_queue_tail(&tx->skbs, tx->skb); ++ tx->skb = NULL; ++ goto txh_done; ++ } ++ +++ CALL_TXH(ieee80211_tx_h_select_key); ++ CALL_TXH(ieee80211_tx_h_michael_mic_add); ++ CALL_TXH(ieee80211_tx_h_sequence); ++ CALL_TXH(ieee80211_tx_h_fragment); ++@@ -1724,6 +1813,15 @@ static int invoke_tx_handlers(struct iee ++ return 0; ++ } ++ +++static int invoke_tx_handlers(struct ieee80211_tx_data *tx) +++{ +++ int r = invoke_tx_handlers_early(tx); +++ if (r) +++ return r; +++ +++ return invoke_tx_handlers_late(tx); +++} +++ ++ bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, ++ struct ieee80211_vif *vif, struct sk_buff *skb, ++ int band, struct ieee80211_sta **sta) ++@@ -1798,7 +1896,13 @@ static bool ieee80211_tx(struct ieee8021 ++ info->hw_queue = ++ sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; ++ ++- if (!invoke_tx_handlers(&tx)) +++ if (invoke_tx_handlers_early(&tx)) +++ return false; +++ +++ if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb)) +++ return true; +++ +++ if (!invoke_tx_handlers_late(&tx)) ++ result = __ieee80211_tx(local, &tx.skbs, led_len, ++ tx.sta, txpending); ++ ++@@ -3181,7 +3285,7 @@ out: ++ } ++ ++ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, ++- struct net_device *dev, struct sta_info *sta, +++ struct sta_info *sta, ++ struct ieee80211_fast_tx *fast_tx, ++ struct sk_buff *skb) ++ { ++@@ -3192,9 +3296,9 @@ static bool ieee80211_xmit_fast(struct i ++ struct ethhdr eth; ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; ++- struct ieee80211_tx_data tx; ++- ieee80211_tx_result r; ++ struct tid_ampdu_tx *tid_tx = NULL; +++ ieee80211_tx_result r; +++ struct ieee80211_tx_data tx; ++ u8 tid = IEEE80211_NUM_TIDS; ++ ++ /* control port protocol needs a lot of special handling */ ++@@ -3232,8 +3336,6 @@ static bool ieee80211_xmit_fast(struct i ++ return true; ++ } ++ ++- ieee80211_tx_stats(dev, skb->len + extra_head); ++- ++ if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) && ++ ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb)) ++ return true; ++@@ -3262,24 +3364,7 @@ static bool ieee80211_xmit_fast(struct i ++ info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | ++ IEEE80211_TX_CTL_DONTFRAG | ++ (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0); ++- ++- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { ++- *ieee80211_get_qos_ctl(hdr) = tid; ++- if (!sta->sta.txq[0]) ++- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); ++- } else { ++- info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; ++- hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); ++- sdata->sequence_number += 0x10; ++- } ++- ++- if (skb_shinfo(skb)->gso_size) ++- sta->tx_stats.msdu[tid] += ++- DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); ++- else ++- sta->tx_stats.msdu[tid]++; ++- ++- info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; +++ info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT; ++ ++ __skb_queue_head_init(&tx.skbs); ++ ++@@ -3305,22 +3390,71 @@ static bool ieee80211_xmit_fast(struct i ++ } ++ } ++ +++ if (ieee80211_queue_skb(local, sdata, sta, skb)) +++ return true; +++ +++ ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, +++ &fast_tx->key->conf, skb); +++ +++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +++ sdata = container_of(sdata->bss, +++ struct ieee80211_sub_if_data, u.ap); +++ +++ __skb_queue_tail(&tx.skbs, skb); +++ ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); +++ +++ return true; +++} +++ +++/* +++ * Can be called while the sta lock is held. Anything that can cause packets to +++ * be generated will cause deadlock! +++ */ +++static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, +++ struct sta_info *sta, u8 pn_offs, +++ struct ieee80211_key_conf *key_conf, +++ struct sk_buff *skb) +++{ +++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ struct ieee80211_hdr *hdr = (void *)skb->data; +++ u8 tid = IEEE80211_NUM_TIDS; +++ +++ ieee80211_tx_stats(skb->dev, skb->len); +++ +++ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { +++ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; +++ *ieee80211_get_qos_ctl(hdr) = tid; +++ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); +++ } else { +++ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; +++ hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); +++ sdata->sequence_number += 0x10; +++ } +++ +++ if (skb_shinfo(skb)->gso_size) +++ sta->tx_stats.msdu[tid] += +++ DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); +++ else +++ sta->tx_stats.msdu[tid]++; +++ +++ info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; +++ ++ /* statistics normally done by ieee80211_tx_h_stats (but that ++ * has to consider fragmentation, so is more complex) ++ */ ++ sta->tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len; ++ sta->tx_stats.packets[skb_get_queue_mapping(skb)]++; ++ ++- if (fast_tx->pn_offs) { +++ if (pn_offs && (key_conf->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { ++ u64 pn; ++- u8 *crypto_hdr = skb->data + fast_tx->pn_offs; +++ u8 *crypto_hdr = skb->data + pn_offs; ++ ++- switch (fast_tx->key->conf.cipher) { +++ switch (key_conf->cipher) { ++ case WLAN_CIPHER_SUITE_CCMP: ++ case WLAN_CIPHER_SUITE_CCMP_256: ++ case WLAN_CIPHER_SUITE_GCMP: ++ case WLAN_CIPHER_SUITE_GCMP_256: ++- pn = atomic64_inc_return(&fast_tx->key->conf.tx_pn); +++ pn = atomic64_inc_return(&key_conf->tx_pn); ++ crypto_hdr[0] = pn; ++ crypto_hdr[1] = pn >> 8; ++ crypto_hdr[4] = pn >> 16; ++@@ -3331,12 +3465,6 @@ static bool ieee80211_xmit_fast(struct i ++ } ++ } ++ ++- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) ++- sdata = container_of(sdata->bss, ++- struct ieee80211_sub_if_data, u.ap); ++- ++- __skb_queue_tail(&tx.skbs, skb); ++- ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); ++ return true; ++ } ++ ++@@ -3364,7 +3492,7 @@ void __ieee80211_subif_start_xmit(struct ++ fast_tx = rcu_dereference(sta->fast_tx); ++ ++ if (fast_tx && ++- ieee80211_xmit_fast(sdata, dev, sta, fast_tx, skb)) +++ ieee80211_xmit_fast(sdata, sta, fast_tx, skb)) ++ goto out; ++ } ++ ++--- a/include/net/mac80211.h +++++ b/include/net/mac80211.h ++@@ -715,6 +715,7 @@ enum mac80211_tx_info_flags { ++ * frame (PS-Poll or uAPSD). ++ * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information ++ * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame +++ * @IEEE80211_TX_CTRL_FAST_XMIT: This frame is going through the fast_xmit path ++ * ++ * These flags are used in tx_info->control.flags. ++ */ ++@@ -723,6 +724,7 @@ enum mac80211_tx_control_flags { ++ IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), ++ IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), ++ IEEE80211_TX_CTRL_AMSDU = BIT(3), +++ IEEE80211_TX_CTRL_FAST_XMIT = BIT(4), ++ }; ++ ++ /* ++--- a/net/mac80211/ieee80211_i.h +++++ b/net/mac80211/ieee80211_i.h ++@@ -814,11 +814,13 @@ enum txq_info_flags { ++ * @def_flow: used as a fallback flow when a packet destined to @tin hashes to ++ * a fq_flow which is already owned by a different tin ++ * @def_cvars: codel vars for @def_flow +++ * @frags: used to keep fragments created after dequeue ++ */ ++ struct txq_info { ++ struct fq_tin tin; ++ struct fq_flow def_flow; ++ struct codel_vars def_cvars; +++ struct sk_buff_head frags; ++ unsigned long flags; ++ ++ /* keep last! */ +diff --git a/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch b/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch +deleted file mode 100644 +index c3d3118..0000000 +--- a/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch ++++ /dev/null +@@ -1,26 +0,0 @@ +-From: Johannes Berg +-Date: Mon, 29 Aug 2016 23:25:19 +0300 +-Subject: [PATCH] mac80211: send delBA on unexpected BlockAck Request +- +-If we don't have a BA session, send delBA, as requested by the +-IEEE 802.11 spec. Apply the same limit of sending such a delBA +-only once as in the previous patch. +- +-Signed-off-by: Johannes Berg +---- +- +---- a/net/mac80211/rx.c +-+++ b/net/mac80211/rx.c +-@@ -2537,6 +2537,12 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_ +- +- tid = le16_to_cpu(bar_data.control) >> 12; +- +-+ if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && +-+ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) +-+ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, +-+ WLAN_BACK_RECIPIENT, +-+ WLAN_REASON_QSTA_REQUIRE_SETUP); +-+ +- tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); +- if (!tid_agg_rx) +- return RX_DROP_MONITOR; +diff --git a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch +deleted file mode 100644 +index aba1ff4..0000000 +--- a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch ++++ /dev/null +@@ -1,478 +0,0 @@ +-From: Felix Fietkau +-Date: Sun, 4 Sep 2016 17:46:24 +0200 +-Subject: [PATCH] mac80211: fix sequence number assignment for PS response +- frames +- +-When using intermediate queues, sequence number allocation is deferred +-until dequeue. This doesn't work for PS response frames, which bypass +-those queues. +- +-Signed-off-by: Felix Fietkau +---- +- +---- a/net/mac80211/tx.c +-+++ b/net/mac80211/tx.c +-@@ -38,6 +38,12 @@ +- #include "wme.h" +- #include "rate.h" +- +-+static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx); +-+static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, +-+ struct sta_info *sta, u8 pn_offs, +-+ struct ieee80211_key_conf *key_conf, +-+ struct sk_buff *skb); +-+ +- /* misc utils */ +- +- static inline void ieee80211_tx_stats(struct net_device *dev, u32 len) +-@@ -849,8 +855,7 @@ ieee80211_tx_h_sequence(struct ieee80211 +- tid = *qc & IEEE80211_QOS_CTL_TID_MASK; +- tx->sta->tx_stats.msdu[tid]++; +- +-- if (!tx->sta->sta.txq[0]) +-- hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); +-+ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); +- +- return TX_CONTINUE; +- } +-@@ -1398,6 +1403,7 @@ void ieee80211_txq_init(struct ieee80211 +- fq_tin_init(&txqi->tin); +- fq_flow_init(&txqi->def_flow); +- codel_vars_init(&txqi->def_cvars); +-+ __skb_queue_head_init(&txqi->frags); +- +- txqi->txq.vif = &sdata->vif; +- +-@@ -1420,6 +1426,7 @@ void ieee80211_txq_purge(struct ieee8021 +- struct fq_tin *tin = &txqi->tin; +- +- fq_tin_reset(fq, tin, fq_skb_free_func); +-+ ieee80211_purge_tx_queue(&local->hw, &txqi->frags); +- } +- +- int ieee80211_txq_setup_flows(struct ieee80211_local *local) +-@@ -1476,12 +1483,19 @@ struct sk_buff *ieee80211_tx_dequeue(str +- struct sk_buff *skb = NULL; +- struct fq *fq = &local->fq; +- struct fq_tin *tin = &txqi->tin; +-+ struct ieee80211_tx_info *info; +- +- spin_lock_bh(&fq->lock); +- +- if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags)) +- goto out; +- +-+ /* Make sure fragments stay together. */ +-+ skb = __skb_dequeue(&txqi->frags); +-+ if (skb) +-+ goto out; +-+ +-+begin: +- skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func); +- if (!skb) +- goto out; +-@@ -1489,16 +1503,38 @@ struct sk_buff *ieee80211_tx_dequeue(str +- ieee80211_set_skb_vif(skb, txqi); +- +- hdr = (struct ieee80211_hdr *)skb->data; +-- if (txq->sta && ieee80211_is_data_qos(hdr->frame_control)) { +-+ info = IEEE80211_SKB_CB(skb); +-+ if (txq->sta && info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { +- struct sta_info *sta = container_of(txq->sta, struct sta_info, +- sta); +-- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +-+ u8 pn_offs = 0; +- +-- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, txq->tid); +-- if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags)) +-- info->flags |= IEEE80211_TX_CTL_AMPDU; +-- else +-- info->flags &= ~IEEE80211_TX_CTL_AMPDU; +-+ if (info->control.hw_key) +-+ pn_offs = ieee80211_padded_hdrlen(hw, hdr->frame_control); +-+ +-+ ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, +-+ info->control.hw_key, skb); +-+ } else { +-+ struct ieee80211_tx_data tx = { }; +-+ +-+ __skb_queue_head_init(&tx.skbs); +-+ tx.local = local; +-+ tx.skb = skb; +-+ tx.hdrlen = ieee80211_padded_hdrlen(hw, hdr->frame_control); +-+ if (txq->sta) { +-+ tx.sta = container_of(txq->sta, struct sta_info, sta); +-+ tx.sdata = tx.sta->sdata; +-+ } else { +-+ tx.sdata = vif_to_sdata(info->control.vif); +-+ } +-+ +-+ if (invoke_tx_handlers_late(&tx)) +-+ goto begin; +-+ +-+ skb = __skb_dequeue(&tx.skbs); +-+ +-+ if (!skb_queue_empty(&tx.skbs)) +-+ skb_queue_splice_tail(&tx.skbs, &txqi->frags); +- } +- +- out: +-@@ -1512,6 +1548,47 @@ out: +- } +- EXPORT_SYMBOL(ieee80211_tx_dequeue); +- +-+static bool ieee80211_queue_skb(struct ieee80211_local *local, +-+ struct ieee80211_sub_if_data *sdata, +-+ struct sta_info *sta, +-+ struct sk_buff *skb) +-+{ +-+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +-+ struct fq *fq = &local->fq; +-+ struct ieee80211_vif *vif; +-+ struct txq_info *txqi; +-+ struct ieee80211_sta *pubsta; +-+ +-+ if (!local->ops->wake_tx_queue || +-+ sdata->vif.type == NL80211_IFTYPE_MONITOR) +-+ return false; +-+ +-+ if (sta && sta->uploaded) +-+ pubsta = &sta->sta; +-+ else +-+ pubsta = NULL; +-+ +-+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +-+ sdata = container_of(sdata->bss, +-+ struct ieee80211_sub_if_data, u.ap); +-+ +-+ vif = &sdata->vif; +-+ txqi = ieee80211_get_txq(local, vif, pubsta, skb); +-+ +-+ if (!txqi) +-+ return false; +-+ +-+ info->control.vif = vif; +-+ +-+ spin_lock_bh(&fq->lock); +-+ ieee80211_txq_enqueue(local, txqi, skb); +-+ spin_unlock_bh(&fq->lock); +-+ +-+ drv_wake_tx_queue(local, txqi); +-+ +-+ return true; +-+} +-+ +- static bool ieee80211_tx_frags(struct ieee80211_local *local, +- struct ieee80211_vif *vif, +- struct ieee80211_sta *sta, +-@@ -1519,9 +1596,7 @@ static bool ieee80211_tx_frags(struct ie +- bool txpending) +- { +- struct ieee80211_tx_control control = {}; +-- struct fq *fq = &local->fq; +- struct sk_buff *skb, *tmp; +-- struct txq_info *txqi; +- unsigned long flags; +- +- skb_queue_walk_safe(skbs, skb, tmp) { +-@@ -1536,21 +1611,6 @@ static bool ieee80211_tx_frags(struct ie +- } +- #endif +- +-- txqi = ieee80211_get_txq(local, vif, sta, skb); +-- if (txqi) { +-- info->control.vif = vif; +-- +-- __skb_unlink(skb, skbs); +-- +-- spin_lock_bh(&fq->lock); +-- ieee80211_txq_enqueue(local, txqi, skb); +-- spin_unlock_bh(&fq->lock); +-- +-- drv_wake_tx_queue(local, txqi); +-- +-- continue; +-- } +-- +- spin_lock_irqsave(&local->queue_stop_reason_lock, flags); +- if (local->queue_stop_reasons[q] || +- (!txpending && !skb_queue_empty(&local->pending[q]))) { +-@@ -1671,10 +1731,13 @@ static bool __ieee80211_tx(struct ieee80 +- /* +- * Invoke TX handlers, return 0 on success and non-zero if the +- * frame was dropped or queued. +-+ * +-+ * The handlers are split into an early and late part. The latter is everything +-+ * that can be sensitive to reordering, and will be deferred to after packets +-+ * are dequeued from the intermediate queues (when they are enabled). +- */ +--static int invoke_tx_handlers(struct ieee80211_tx_data *tx) +-+static int invoke_tx_handlers_early(struct ieee80211_tx_data *tx) +- { +-- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); +- ieee80211_tx_result res = TX_DROP; +- +- #define CALL_TXH(txh) \ +-@@ -1688,16 +1751,42 @@ static int invoke_tx_handlers(struct iee +- CALL_TXH(ieee80211_tx_h_check_assoc); +- CALL_TXH(ieee80211_tx_h_ps_buf); +- CALL_TXH(ieee80211_tx_h_check_control_port_protocol); +-- CALL_TXH(ieee80211_tx_h_select_key); +-+ +- if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) +- CALL_TXH(ieee80211_tx_h_rate_ctrl); +- +-+ txh_done: +-+ if (unlikely(res == TX_DROP)) { +-+ I802_DEBUG_INC(tx->local->tx_handlers_drop); +-+ if (tx->skb) +-+ ieee80211_free_txskb(&tx->local->hw, tx->skb); +-+ else +-+ ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); +-+ return -1; +-+ } else if (unlikely(res == TX_QUEUED)) { +-+ I802_DEBUG_INC(tx->local->tx_handlers_queued); +-+ return -1; +-+ } +-+ +-+ return 0; +-+} +-+ +-+/* +-+ * Late handlers can be called while the sta lock is held. Handlers that can +-+ * cause packets to be generated will cause deadlock! +-+ */ +-+static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx) +-+{ +-+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); +-+ ieee80211_tx_result res = TX_CONTINUE; +-+ +- if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { +- __skb_queue_tail(&tx->skbs, tx->skb); +- tx->skb = NULL; +- goto txh_done; +- } +- +-+ CALL_TXH(ieee80211_tx_h_select_key); +- CALL_TXH(ieee80211_tx_h_michael_mic_add); +- CALL_TXH(ieee80211_tx_h_sequence); +- CALL_TXH(ieee80211_tx_h_fragment); +-@@ -1724,6 +1813,15 @@ static int invoke_tx_handlers(struct iee +- return 0; +- } +- +-+static int invoke_tx_handlers(struct ieee80211_tx_data *tx) +-+{ +-+ int r = invoke_tx_handlers_early(tx); +-+ if (r) +-+ return r; +-+ +-+ return invoke_tx_handlers_late(tx); +-+} +-+ +- bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, +- struct ieee80211_vif *vif, struct sk_buff *skb, +- int band, struct ieee80211_sta **sta) +-@@ -1798,7 +1896,13 @@ static bool ieee80211_tx(struct ieee8021 +- info->hw_queue = +- sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; +- +-- if (!invoke_tx_handlers(&tx)) +-+ if (invoke_tx_handlers_early(&tx)) +-+ return false; +-+ +-+ if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb)) +-+ return true; +-+ +-+ if (!invoke_tx_handlers_late(&tx)) +- result = __ieee80211_tx(local, &tx.skbs, led_len, +- tx.sta, txpending); +- +-@@ -3181,7 +3285,7 @@ out: +- } +- +- static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, +-- struct net_device *dev, struct sta_info *sta, +-+ struct sta_info *sta, +- struct ieee80211_fast_tx *fast_tx, +- struct sk_buff *skb) +- { +-@@ -3192,9 +3296,9 @@ static bool ieee80211_xmit_fast(struct i +- struct ethhdr eth; +- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +- struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; +-- struct ieee80211_tx_data tx; +-- ieee80211_tx_result r; +- struct tid_ampdu_tx *tid_tx = NULL; +-+ ieee80211_tx_result r; +-+ struct ieee80211_tx_data tx; +- u8 tid = IEEE80211_NUM_TIDS; +- +- /* control port protocol needs a lot of special handling */ +-@@ -3232,8 +3336,6 @@ static bool ieee80211_xmit_fast(struct i +- return true; +- } +- +-- ieee80211_tx_stats(dev, skb->len + extra_head); +-- +- if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) && +- ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb)) +- return true; +-@@ -3262,24 +3364,7 @@ static bool ieee80211_xmit_fast(struct i +- info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | +- IEEE80211_TX_CTL_DONTFRAG | +- (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0); +-- +-- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { +-- *ieee80211_get_qos_ctl(hdr) = tid; +-- if (!sta->sta.txq[0]) +-- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); +-- } else { +-- info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; +-- hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); +-- sdata->sequence_number += 0x10; +-- } +-- +-- if (skb_shinfo(skb)->gso_size) +-- sta->tx_stats.msdu[tid] += +-- DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); +-- else +-- sta->tx_stats.msdu[tid]++; +-- +-- info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; +-+ info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT; +- +- __skb_queue_head_init(&tx.skbs); +- +-@@ -3305,22 +3390,71 @@ static bool ieee80211_xmit_fast(struct i +- } +- } +- +-+ if (ieee80211_queue_skb(local, sdata, sta, skb)) +-+ return true; +-+ +-+ ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, +-+ &fast_tx->key->conf, skb); +-+ +-+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +-+ sdata = container_of(sdata->bss, +-+ struct ieee80211_sub_if_data, u.ap); +-+ +-+ __skb_queue_tail(&tx.skbs, skb); +-+ ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); +-+ +-+ return true; +-+} +-+ +-+/* +-+ * Can be called while the sta lock is held. Anything that can cause packets to +-+ * be generated will cause deadlock! +-+ */ +-+static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, +-+ struct sta_info *sta, u8 pn_offs, +-+ struct ieee80211_key_conf *key_conf, +-+ struct sk_buff *skb) +-+{ +-+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +-+ struct ieee80211_hdr *hdr = (void *)skb->data; +-+ u8 tid = IEEE80211_NUM_TIDS; +-+ +-+ ieee80211_tx_stats(skb->dev, skb->len); +-+ +-+ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { +-+ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; +-+ *ieee80211_get_qos_ctl(hdr) = tid; +-+ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); +-+ } else { +-+ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; +-+ hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); +-+ sdata->sequence_number += 0x10; +-+ } +-+ +-+ if (skb_shinfo(skb)->gso_size) +-+ sta->tx_stats.msdu[tid] += +-+ DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); +-+ else +-+ sta->tx_stats.msdu[tid]++; +-+ +-+ info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; +-+ +- /* statistics normally done by ieee80211_tx_h_stats (but that +- * has to consider fragmentation, so is more complex) +- */ +- sta->tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len; +- sta->tx_stats.packets[skb_get_queue_mapping(skb)]++; +- +-- if (fast_tx->pn_offs) { +-+ if (pn_offs && (key_conf->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { +- u64 pn; +-- u8 *crypto_hdr = skb->data + fast_tx->pn_offs; +-+ u8 *crypto_hdr = skb->data + pn_offs; +- +-- switch (fast_tx->key->conf.cipher) { +-+ switch (key_conf->cipher) { +- case WLAN_CIPHER_SUITE_CCMP: +- case WLAN_CIPHER_SUITE_CCMP_256: +- case WLAN_CIPHER_SUITE_GCMP: +- case WLAN_CIPHER_SUITE_GCMP_256: +-- pn = atomic64_inc_return(&fast_tx->key->conf.tx_pn); +-+ pn = atomic64_inc_return(&key_conf->tx_pn); +- crypto_hdr[0] = pn; +- crypto_hdr[1] = pn >> 8; +- crypto_hdr[4] = pn >> 16; +-@@ -3331,12 +3465,6 @@ static bool ieee80211_xmit_fast(struct i +- } +- } +- +-- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +-- sdata = container_of(sdata->bss, +-- struct ieee80211_sub_if_data, u.ap); +-- +-- __skb_queue_tail(&tx.skbs, skb); +-- ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); +- return true; +- } +- +-@@ -3364,7 +3492,7 @@ void __ieee80211_subif_start_xmit(struct +- fast_tx = rcu_dereference(sta->fast_tx); +- +- if (fast_tx && +-- ieee80211_xmit_fast(sdata, dev, sta, fast_tx, skb)) +-+ ieee80211_xmit_fast(sdata, sta, fast_tx, skb)) +- goto out; +- } +- +---- a/include/net/mac80211.h +-+++ b/include/net/mac80211.h +-@@ -715,6 +715,7 @@ enum mac80211_tx_info_flags { +- * frame (PS-Poll or uAPSD). +- * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information +- * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame +-+ * @IEEE80211_TX_CTRL_FAST_XMIT: This frame is going through the fast_xmit path +- * +- * These flags are used in tx_info->control.flags. +- */ +-@@ -723,6 +724,7 @@ enum mac80211_tx_control_flags { +- IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), +- IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), +- IEEE80211_TX_CTRL_AMSDU = BIT(3), +-+ IEEE80211_TX_CTRL_FAST_XMIT = BIT(4), +- }; +- +- /* +---- a/net/mac80211/ieee80211_i.h +-+++ b/net/mac80211/ieee80211_i.h +-@@ -814,11 +814,13 @@ enum txq_info_flags { +- * @def_flow: used as a fallback flow when a packet destined to @tin hashes to +- * a fq_flow which is already owned by a different tin +- * @def_cvars: codel vars for @def_flow +-+ * @frags: used to keep fragments created after dequeue +- */ +- struct txq_info { +- struct fq_tin tin; +- struct fq_flow def_flow; +- struct codel_vars def_cvars; +-+ struct sk_buff_head frags; +- unsigned long flags; +- +- /* keep last! */ From 85c66b3bf82ebface465655b7747e5e587cc2484 Mon Sep 17 00:00:00 2001 From: Jan-Tarek Butt Date: Sat, 24 Sep 2016 16:33:01 +0200 Subject: [PATCH 010/126] gluon-autoupdater: double quote $1 to prevent globbing and word splitting --- .../gluon-autoupdater/files/lib/gluon/autoupdater/lib.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package/gluon-autoupdater/files/lib/gluon/autoupdater/lib.sh b/package/gluon-autoupdater/files/lib/gluon/autoupdater/lib.sh index 36ddd971..24ef2f90 100644 --- a/package/gluon-autoupdater/files/lib/gluon/autoupdater/lib.sh +++ b/package/gluon-autoupdater/files/lib/gluon/autoupdater/lib.sh @@ -2,15 +2,15 @@ stop() { - if [ -x /etc/init.d/$1 ]; then + if [ -x /etc/init.d/"$1" ]; then echo "Stopping $1..." - /etc/init.d/$1 stop + /etc/init.d/"$1" stop fi } start_enabled() { - if [ -x /etc/init.d/$1 ] && /etc/init.d/$1 enabled; then + if [ -x /etc/init.d/"$1" ] && /etc/init.d/"$1" enabled; then echo "Starting $1..." - /etc/init.d/$1 start + /etc/init.d/"$1" start fi } From 0f3e66084251a13e759d9c48116d568bdade68b9 Mon Sep 17 00:00:00 2001 From: Jan-Tarek Butt Date: Sat, 24 Sep 2016 17:34:14 +0200 Subject: [PATCH 011/126] scripts: improve variable escaping --- scripts/patch.sh | 6 +++--- scripts/sha512sum.sh | 2 +- scripts/update-patches.sh | 8 ++++---- scripts/update.sh | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/scripts/patch.sh b/scripts/patch.sh index 2b0aa29e..7dfb3061 100755 --- a/scripts/patch.sh +++ b/scripts/patch.sh @@ -15,14 +15,14 @@ trap 'rm -rf "$PATCHDIR"' EXIT for module in $GLUON_MODULES; do echo "--- Patching module '$module' ---" - git clone -s -b base --single-branch "$GLUONDIR"/$module "$PATCHDIR" 2>/dev/null + git clone -s -b base --single-branch "$GLUONDIR/$module" "$PATCHDIR" 2>/dev/null cd "$PATCHDIR" - for patch in "$GLUONDIR"/patches/$module/*.patch; do + for patch in "$GLUONDIR/patches/$module"/*.patch; do git -c user.name='Gluon Patch Manager' -c user.email='gluon@void.example.com' -c commit.gpgsign=false am --whitespace=nowarn --committer-date-is-author-date "$patch" done - cd "$GLUONDIR"/$module + cd "$GLUONDIR/$module" git fetch "$PATCHDIR" 2>/dev/null git checkout -B patched FETCH_HEAD git submodule update --init --recursive diff --git a/scripts/sha512sum.sh b/scripts/sha512sum.sh index 921e5c6c..de08b0b8 100755 --- a/scripts/sha512sum.sh +++ b/scripts/sha512sum.sh @@ -1,7 +1,7 @@ #!/bin/sh check_command() { - which $1 >/dev/null 2>&1 + which "$1" >/dev/null 2>&1 } if check_command sha512sum; then diff --git a/scripts/update-patches.sh b/scripts/update-patches.sh index f8b92025..62d5bf78 100755 --- a/scripts/update-patches.sh +++ b/scripts/update-patches.sh @@ -8,14 +8,14 @@ shopt -s nullglob for module in $GLUON_MODULES; do echo "--- Updating patches for module '$module' ---" - rm -f "$GLUONDIR"/patches/$module/*.patch - mkdir -p "$GLUONDIR"/patches/$module + rm -f "$GLUONDIR"/patches/"$module"/*.patch + mkdir -p "$GLUONDIR"/patches/"$module" - cd "$GLUONDIR"/$module + cd "$GLUONDIR"/"$module" n=0 for commit in $(git rev-list --reverse --no-merges base..patched); do let n=n+1 - git show --pretty=format:'From: %an <%ae>%nDate: %aD%nSubject: %B' --no-renames $commit > "$GLUONDIR"/patches/$module/"$(printf '%04u' $n)-$(git show -s --pretty=format:%f $commit).patch" + git show --pretty=format:'From: %an <%ae>%nDate: %aD%nSubject: %B' --no-renames "$commit" > "$GLUONDIR/patches/$module/$(printf '%04u' $n)-$(git show -s --pretty=format:%f "$commit").patch" done done diff --git a/scripts/update.sh b/scripts/update.sh index 1c750f69..ae3368cb 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -6,17 +6,17 @@ set -e for module in $GLUON_MODULES; do echo "--- Updating module '$module' ---" - var=$(echo $module | tr '[:lower:]/' '[:upper:]_') + var=$(echo "$module" | tr '[:lower:]/' '[:upper:]_') eval repo=\${${var}_REPO} eval branch=\${${var}_BRANCH} eval commit=\${${var}_COMMIT} - mkdir -p "$GLUONDIR"/$module - cd "$GLUONDIR"/$module + mkdir -p "$GLUONDIR/$module" + cd "$GLUONDIR/$module" git init - if ! git branch -f base $commit 2>/dev/null; then - git fetch $repo $branch - git branch -f base $commit 2>/dev/null + if ! git branch -f base "$commit" 2>/dev/null; then + git fetch "$repo" "$branch" + git branch -f base "$commit" 2>/dev/null fi done From f1c23b3b3c1ac363035dd2a269e27822ed00649d Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 10 Oct 2016 06:17:54 +0200 Subject: [PATCH 012/126] scripts/sha512sum.sh: output error message to stderr --- scripts/sha512sum.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sha512sum.sh b/scripts/sha512sum.sh index de08b0b8..d9fd544d 100755 --- a/scripts/sha512sum.sh +++ b/scripts/sha512sum.sh @@ -11,7 +11,7 @@ elif check_command shasum; then elif check_command cksum; then ret="$(cksum -q -a sha512 "$@")" else - echo "$0: no suitable sha512sum implementation was found" >&1 + echo "$0: no suitable sha512sum implementation was found" >&2 exit 1 fi From e1808451aac04bf266ba442397f3322a91c436b9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 11 Oct 2016 00:41:16 +0200 Subject: [PATCH 013/126] Update OpenWrt base --- modules | 2 +- ...59ed70897a7b74dd3e6293b42e6d2e511eaa.patch | 9280 ++++++++++++++++- .../0013-fix-UBNT-XM-model-detection.patch | 4 +- ...HWREV-on-upgrades-of-TP-LINK-devices.patch | 4 +- ...a-space-on-some-TP-LINK-like-devices.patch | 2 +- ...XX_MODEL-to-match-labels-image-names.patch | 2 +- ...r71xx-build-image-for-TL-WR710N-v2.1.patch | 2 +- ...561-set-phy-interface-mode-and-mask.patch} | 0 ...ools-pkg-config-fix-build-with-GCC-6.patch | 37 - ...on-register-bitmask-for-QCA956x-SoC.patch} | 0 ...linux-compiler-.h-with-u-boot-master.patch | 815 -- ... 0034-ar71xx-update-QCA956x-support.patch} | 34 + ...4-toolchain-gcc-fix-build-with-GCC-6.patch | 144 - ...r-QCA956x-ethernet.patch-into-files.patch} | 0 ...r71xx-fix-MDIO-bus-probe-on-QCA956x.patch} | 0 ...fix-qca956x-ethernet-initialization.patch} | 0 ...pport-for-Ubiquiti-UniFi-AP-AC-LITE.patch} | 22 +- ...h0-support-for-Ubiquiti-UniFi-AP-AC.patch} | 0 ...71xx-Rename-unifiac-to-unifiac-lite.patch} | 20 +- ...upport-for-Ubiquiti-UniFi-AP-AC-PRO.patch} | 20 +- ...r-custom-format-strings-for-doubles.patch} | 0 ...uner-support-for-UniFi-Outdoor-Plus.patch} | 0 ...x-Send-power-to-USB-port-on-WNR2200.patch} | 0 ...supgrade-images-for-OpenMesh-devices.patch | 30 - ...1xx-WNR2200-fix-for-random-WLAN-MAC.patch} | 0 ...ble-control-of-all-LEDs-and-buttons.patch} | 4 +- ...upport-for-the-OpenMesh-MR1750-board.patch | 202 - ...=> 0047-ar71xx-add-GL-AR150-support.patch} | 10 +- ...upport-for-the-OpenMesh-MR1750-board.patch | 67 - ...j-for-parallel-builds-with-Make-4.2.patch} | 0 ...fg-gen.sh-add-support-for-the-MR1750.patch | 32 - ...e-sysupgrade-for-the-OpenMesh-MR1750.patch | 55 - ...ke-fix-parallel-build-with-Make-4.2.patch} | 0 ...IPv6-builtin-if-selected-saves-30KB.patch} | 0 ...watchdog-add-OpenMesh-MR1750-support.patch | 23 - ...ages-with-multiple-PROVIDES-entries.patch} | 0 ...envtools-add-OpenMesh-MR1750-support.patch | 22 - ...-image-for-the-OpenMesh-MR1750-board.patch | 57 - ...od-crypto-core-and-kmod-crypto-arc4.patch} | 0 ...-of-bits-in-QCA955X_GMAC_REG_ETH_CFG.patch | 47 - ...n-hexdump-for-image-build-signature.patch} | 0 ...fg-helper-for-Open-Mesh-MR900-boards.patch | 49 - ...054-mt76-fix-build-with-kernel-3.18.patch} | 0 ...-ath79_gpio_output_select-on-QCA955x.patch | 79 - ...-Support-LEDs-on-D-Link-DIR-860L-B1.patch} | 0 ...-for-ath79_gpio_function_-on-QCA955X.patch | 32 - ...-known-to-userspace-for-DIR-860L-B1.patch} | 0 ...5X-GPIO-mux-and-function-definitions.patch | 159 - ...AN-WAN-MAC-addresses-on-DIR-860L-B1.patch} | 0 ...x-Use-PHY-fixups-for-Open-Mesh-MR900.patch | 78 - ...support-for-TP-LINK-TL-WR842N-ND-v3.patch} | 0 ...R841N-v11-LEDs-use-separate-machine.patch} | 0 ...-Use-PHY-fixups-for-Open-Mesh-MR1750.patch | 77 - ...th79_setup_qca955x_eth_cfg-for-MR900.patch | 58 - ...-x86-generic-enable-CONFIG_SATA_VIA.patch} | 0 ...h79_setup_qca955x_eth_cfg-for-MR1750.patch | 58 - ...cy-of-install-shared-so-make-target.patch} | 0 ...-detection-for-D-Link-DIR-505-A1-A2.patch} | 0 ...gen.sh-Fix-u-boot-image-md5sum-check.patch | 43 - ...05-status-LED-as-ethernet-indicator.patch} | 0 ...ate-sha256sum-for-uboot-verification.patch | 50 - ...pport-for-the-OpenMesh-OM5P-AC-board.patch | 265 - ...0-enable-LNA-for-CPE210-220-510-520.patch} | 0 ...ace-support-for-the-OpenMesh-OM5P-AC.patch | 54 - ...e-into-2-profiles-cpe210-and-cpe510.patch} | 0 ...ader.c-Add-support-for-Archer-C2600.patch} | 0 ...g-gen.sh-add-support-for-the-OM5P-AC.patch | 32 - ...-sysupgrade-for-the-OpenMesh-OM5P-AC.patch | 59 - ...er-split-CPE210-from-CPE510-profile.patch} | 0 ...5c21ae0ede4e15e66cbd801b9fb502531df.patch} | 0 ...atchdog-add-OpenMesh-OM5P-AC-support.patch | 24 - ...71xx-Added-support-for-TL-WA801NDv3.patch} | 0 ...nvtools-add-OpenMesh-OM5P-AC-support.patch | 22 - ...d.bin-for-the-OpenMesh-OM5P-AC-board.patch | 25 - ...2bc0ea4010ddbfbd738453c9db70988a57c.patch} | 0 ...upport-for-new-TP-Link-region-codes.patch} | 0 ...image-for-the-OpenMesh-OM5P-AC-board.patch | 53 - ...ort-for-the-OpenMesh-OM5P-ACv2-board.patch | 289 - ...are-add-ath10k-firmware-qca988x-11s.patch} | 0 ...e-support-for-the-OpenMesh-OM5P-ACv2.patch | 38 - ...11-fix-packet-loss-on-fq-reordering.patch} | 0 ...ysupgrade-for-the-OpenMesh-OM5P-ACv2.patch | 46 - ...-with-CCMP-PN-generated-in-hardware.patch} | 0 ...ssues-with-powersave-devices-FS-176.patch} | 0 ...chdog-add-OpenMesh-OM5P-ACv2-support.patch | 23 - ...tools-add-OpenMesh-OM5P-ACv2-support.patch | 22 - ...bin-for-the-OpenMesh-OM5P-ACv2-board.patch | 24 - ...add-OM5P-ACv2-to-the-OM5P-AC-profile.patch | 29 - ...fix-version-detection-for-Make-4.2.1.patch | 24 - ...l-support-for-the-OpenMesh-OM2P-HSv3.patch | 33 - ...e-support-for-the-OpenMesh-OM2P-HSv3.patch | 46 - ...ysupgrade-for-the-OpenMesh-OM2P-HSv3.patch | 40 - ...chdog-add-OpenMesh-OM2P-HSv3-support.patch | 21 - ...tools-add-OpenMesh-OM2P-HSv3-support.patch | 20 - ...xx-add-OM2P-HSv3-to-the-OM2P-profile.patch | 27 - ...el-support-for-the-OpenMesh-MR1750v2.patch | 33 - ...ce-support-for-the-OpenMesh-MR1750v2.patch | 62 - ...sysupgrade-for-the-OpenMesh-MR1750v2.patch | 40 - ...tchdog-add-OpenMesh-MR1750v2-support.patch | 21 - ...vtools-add-OpenMesh-MR1750v2-support.patch | 20 - ....bin-for-the-OpenMesh-MR1750v2-board.patch | 20 - ...x-add-MR1750v2-to-the-MR1750-profile.patch | 27 - 102 files changed, 9079 insertions(+), 3980 deletions(-) rename patches/openwrt/{0035-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch => 0032-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch} (100%) delete mode 100644 patches/openwrt/0032-tools-pkg-config-fix-build-with-GCC-6.patch rename patches/openwrt/{0036-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch => 0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch} (100%) delete mode 100644 patches/openwrt/0033-tools-mkimage-sync-include-linux-compiler-.h-with-u-boot-master.patch rename patches/openwrt/{0037-ar71xx-update-QCA956x-support.patch => 0034-ar71xx-update-QCA956x-support.patch} (89%) delete mode 100644 patches/openwrt/0034-toolchain-gcc-fix-build-with-GCC-6.patch rename patches/openwrt/{0038-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch => 0035-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch} (100%) rename patches/openwrt/{0039-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch => 0036-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch} (100%) rename patches/openwrt/{0040-ar71xx-fix-qca956x-ethernet-initialization.patch => 0037-ar71xx-fix-qca956x-ethernet-initialization.patch} (100%) rename patches/openwrt/{0041-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch => 0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch} (97%) rename patches/openwrt/{0042-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch => 0039-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch} (100%) rename patches/openwrt/{0043-ar71xx-Rename-unifiac-to-unifiac-lite.patch => 0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch} (95%) rename patches/openwrt/{0044-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch => 0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch} (96%) rename patches/openwrt/{0079-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch => 0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch} (100%) rename patches/openwrt/{0080-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch => 0043-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch} (100%) rename patches/openwrt/{0081-ar71xx-Send-power-to-USB-port-on-WNR2200.patch => 0044-ar71xx-Send-power-to-USB-port-on-WNR2200.patch} (100%) delete mode 100644 patches/openwrt/0045-ar71xx-Generate-sysupgrade-images-for-OpenMesh-devices.patch rename patches/openwrt/{0082-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch => 0045-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch} (100%) rename patches/openwrt/{0083-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch => 0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch} (99%) delete mode 100644 patches/openwrt/0046-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750-board.patch rename patches/openwrt/{0084-ar71xx-add-GL-AR150-support.patch => 0047-ar71xx-add-GL-AR150-support.patch} (98%) delete mode 100644 patches/openwrt/0047-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750-board.patch rename patches/openwrt/{0086-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch => 0048-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch} (100%) delete mode 100644 patches/openwrt/0048-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-MR1750.patch delete mode 100644 patches/openwrt/0049-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750.patch rename patches/openwrt/{0087-tools-cmake-fix-parallel-build-with-Make-4.2.patch => 0049-tools-cmake-fix-parallel-build-with-Make-4.2.patch} (100%) rename patches/openwrt/{0088-linux-make-IPv6-builtin-if-selected-saves-30KB.patch => 0050-linux-make-IPv6-builtin-if-selected-saves-30KB.patch} (100%) delete mode 100644 patches/openwrt/0050-package-om-watchdog-add-OpenMesh-MR1750-support.patch rename patches/openwrt/{0089-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch => 0051-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch} (100%) delete mode 100644 patches/openwrt/0051-package-uboot-envtools-add-OpenMesh-MR1750-support.patch delete mode 100644 patches/openwrt/0052-ar71xx-create-profile-and-build-image-for-the-OpenMesh-MR1750-board.patch rename patches/openwrt/{0090-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch => 0052-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch} (100%) delete mode 100644 patches/openwrt/0053-ar71xx-Extend-the-list-of-bits-in-QCA955X_GMAC_REG_ETH_CFG.patch rename patches/openwrt/{0104-x86-stop-relying-on-hexdump-for-image-build-signature.patch => 0053-x86-stop-relying-on-hexdump-for-image-build-signature.patch} (100%) delete mode 100644 patches/openwrt/0054-ar71xx-Use-_eth_cfg-helper-for-Open-Mesh-MR900-boards.patch rename patches/openwrt/{0105-mt76-fix-build-with-kernel-3.18.patch => 0054-mt76-fix-build-with-kernel-3.18.patch} (100%) delete mode 100644 patches/openwrt/0055-ar71xx-Allow-to-use-ath79_gpio_output_select-on-QCA955x.patch rename patches/openwrt/{0106-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch => 0055-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch} (100%) delete mode 100644 patches/openwrt/0056-ar71xx-Add-support-for-ath79_gpio_function_-on-QCA955X.patch rename patches/openwrt/{0107-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch => 0056-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch} (100%) delete mode 100644 patches/openwrt/0057-ar71xx-Add-QCA955X-GPIO-mux-and-function-definitions.patch rename patches/openwrt/{0108-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch => 0057-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch} (100%) delete mode 100644 patches/openwrt/0058-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR900.patch rename patches/openwrt/{0109-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch => 0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch} (100%) rename patches/openwrt/{0110-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch => 0059-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch} (100%) delete mode 100644 patches/openwrt/0059-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR1750.patch delete mode 100644 patches/openwrt/0060-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR900.patch rename patches/openwrt/{0111-x86-generic-enable-CONFIG_SATA_VIA.patch => 0060-x86-generic-enable-CONFIG_SATA_VIA.patch} (100%) delete mode 100644 patches/openwrt/0061-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR1750.patch rename patches/openwrt/{0112-libpcap-fix-dependency-of-install-shared-so-make-target.patch => 0061-libpcap-fix-dependency-of-install-shared-so-make-target.patch} (100%) rename patches/openwrt/{0113-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch => 0062-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch} (100%) delete mode 100644 patches/openwrt/0062-scripts-om-fwupgradecfg-gen.sh-Fix-u-boot-image-md5sum-check.patch rename patches/openwrt/{0114-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch => 0063-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch} (100%) delete mode 100644 patches/openwrt/0063-scripts-om-fwupgradecfg-gen.sh-Generate-sha256sum-for-uboot-verification.patch delete mode 100644 patches/openwrt/0064-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-AC-board.patch rename patches/openwrt/{0115-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch => 0064-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch} (100%) delete mode 100644 patches/openwrt/0065-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-AC.patch rename patches/openwrt/{0116-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch => 0065-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch} (100%) rename patches/openwrt/{0117-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch => 0066-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch} (100%) delete mode 100644 patches/openwrt/0066-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-OM5P-AC.patch delete mode 100644 patches/openwrt/0067-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-AC.patch rename patches/openwrt/{0118-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch => 0067-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch} (100%) rename patches/openwrt/{0119-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch => 0068-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch} (100%) delete mode 100644 patches/openwrt/0068-om-watchdog-add-OpenMesh-OM5P-AC-support.patch rename patches/openwrt/{0120-ar71xx-Added-support-for-TL-WA801NDv3.patch => 0069-ar71xx-Added-support-for-TL-WA801NDv3.patch} (100%) delete mode 100644 patches/openwrt/0069-uboot-envtools-add-OpenMesh-OM5P-AC-support.patch delete mode 100644 patches/openwrt/0070-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-AC-board.patch rename patches/openwrt/{0121-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch => 0070-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch} (100%) rename patches/openwrt/{0122-ar71xx-backport-support-for-new-TP-Link-region-codes.patch => 0071-ar71xx-backport-support-for-new-TP-Link-region-codes.patch} (100%) delete mode 100644 patches/openwrt/0071-ar71xx-create-profile-and-build-image-for-the-OpenMesh-OM5P-AC-board.patch delete mode 100644 patches/openwrt/0072-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-ACv2-board.patch rename patches/openwrt/{0123-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch => 0072-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch} (100%) delete mode 100644 patches/openwrt/0073-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-ACv2.patch rename patches/openwrt/{0124-mac80211-fix-packet-loss-on-fq-reordering.patch => 0073-mac80211-fix-packet-loss-on-fq-reordering.patch} (100%) delete mode 100644 patches/openwrt/0074-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-ACv2.patch rename patches/openwrt/{0125-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch => 0074-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch} (100%) rename patches/openwrt/{0126-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch => 0075-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch} (100%) delete mode 100644 patches/openwrt/0075-om-watchdog-add-OpenMesh-OM5P-ACv2-support.patch delete mode 100644 patches/openwrt/0076-uboot-envtools-add-OpenMesh-OM5P-ACv2-support.patch delete mode 100644 patches/openwrt/0077-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-ACv2-board.patch delete mode 100644 patches/openwrt/0078-ar71xx-add-OM5P-ACv2-to-the-OM5P-AC-profile.patch delete mode 100644 patches/openwrt/0085-scripts-feeds-fix-version-detection-for-Make-4.2.1.patch delete mode 100644 patches/openwrt/0091-ar71xx-add-kernel-support-for-the-OpenMesh-OM2P-HSv3.patch delete mode 100644 patches/openwrt/0092-ar71xx-add-user-space-support-for-the-OpenMesh-OM2P-HSv3.patch delete mode 100644 patches/openwrt/0093-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM2P-HSv3.patch delete mode 100644 patches/openwrt/0094-package-om-watchdog-add-OpenMesh-OM2P-HSv3-support.patch delete mode 100644 patches/openwrt/0095-package-uboot-envtools-add-OpenMesh-OM2P-HSv3-support.patch delete mode 100644 patches/openwrt/0096-ar71xx-add-OM2P-HSv3-to-the-OM2P-profile.patch delete mode 100644 patches/openwrt/0097-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750v2.patch delete mode 100644 patches/openwrt/0098-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750v2.patch delete mode 100644 patches/openwrt/0099-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750v2.patch delete mode 100644 patches/openwrt/0100-package-om-watchdog-add-OpenMesh-MR1750v2-support.patch delete mode 100644 patches/openwrt/0101-package-uboot-envtools-add-OpenMesh-MR1750v2-support.patch delete mode 100644 patches/openwrt/0102-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-MR1750v2-board.patch delete mode 100644 patches/openwrt/0103-ar71xx-add-MR1750v2-to-the-MR1750-profile.patch diff --git a/modules b/modules index c185e366..555d6995 100644 --- a/modules +++ b/modules @@ -1,7 +1,7 @@ GLUON_FEEDS='openwrt gluon routing luci' OPENWRT_REPO=git://github.com/openwrt/openwrt.git -OPENWRT_COMMIT=e663db7bb1797740c4a29ac0fc96eda1b88f9e6e +OPENWRT_COMMIT=b21852c60f82bbd53c19098fc0eb1f4cfccfaf35 OPENWRT_BRANCH=chaos_calmer PACKAGES_OPENWRT_REPO=git://github.com/openwrt/packages.git diff --git a/patches/openwrt/0007-mac80211-hostapd-iw-.-update-to-LEDE-42f559ed70897a7b74dd3e6293b42e6d2e511eaa.patch b/patches/openwrt/0007-mac80211-hostapd-iw-.-update-to-LEDE-42f559ed70897a7b74dd3e6293b42e6d2e511eaa.patch index 4858efde..04bf2b2d 100644 --- a/patches/openwrt/0007-mac80211-hostapd-iw-.-update-to-LEDE-42f559ed70897a7b74dd3e6293b42e6d2e511eaa.patch +++ b/patches/openwrt/0007-mac80211-hostapd-iw-.-update-to-LEDE-42f559ed70897a7b74dd3e6293b42e6d2e511eaa.patch @@ -11266,6 +11266,1171 @@ index 55ff817..0000000 - (cur_max_tp_streams - 1 < - minstrel_mcs_groups[sample_group].streams || - sample_dur >= minstrel_get_duration(mi->max_prob_rate))) { +diff --git a/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch b/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch +deleted file mode 100644 +index e3427de..0000000 +--- a/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch ++++ /dev/null +@@ -1,99 +0,0 @@ +-From: Arend van Spriel +-Date: Wed, 17 Feb 2016 11:26:50 +0100 +-Subject: [PATCH] brcmfmac: change function name for +- brcmf_cfg80211_wait_vif_event_timeout() +- +-Dropping the '_timeout' from the function name as the fact that a timeout +-value is passed makes it obvious a timeout is used. Also helps to keep code +-lines a bit shorter and easier to stick to 80 char boundary. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -564,8 +564,8 @@ struct wireless_dev *brcmf_ap_add_vif(st +- } +- +- /* wait for firmware event */ +-- err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_ADD, +-- BRCMF_VIF_EVENT_TIMEOUT); +-+ err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_ADD, +-+ BRCMF_VIF_EVENT_TIMEOUT); +- brcmf_cfg80211_arm_vif_event(cfg, NULL); +- if (!err) { +- brcmf_err("timeout occurred\n"); +-@@ -6395,8 +6395,9 @@ bool brcmf_cfg80211_vif_event_armed(stru +- +- return armed; +- } +--int brcmf_cfg80211_wait_vif_event_timeout(struct brcmf_cfg80211_info *cfg, +-- u8 action, ulong timeout) +-+ +-+int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg, +-+ u8 action, ulong timeout) +- { +- struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-@@ -402,8 +402,8 @@ bool brcmf_get_vif_state_any(struct brcm +- void brcmf_cfg80211_arm_vif_event(struct brcmf_cfg80211_info *cfg, +- struct brcmf_cfg80211_vif *vif); +- bool brcmf_cfg80211_vif_event_armed(struct brcmf_cfg80211_info *cfg); +--int brcmf_cfg80211_wait_vif_event_timeout(struct brcmf_cfg80211_info *cfg, +-- u8 action, ulong timeout); +-+int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg, +-+ u8 action, ulong timeout); +- s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg, +- struct brcmf_if *ifp, bool aborted, +- bool fw_abort); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -1988,8 +1988,8 @@ int brcmf_p2p_ifchange(struct brcmf_cfg8 +- brcmf_cfg80211_arm_vif_event(cfg, NULL); +- return err; +- } +-- err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_CHANGE, +-- BRCMF_VIF_EVENT_TIMEOUT); +-+ err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_CHANGE, +-+ BRCMF_VIF_EVENT_TIMEOUT); +- brcmf_cfg80211_arm_vif_event(cfg, NULL); +- if (!err) { +- brcmf_err("No BRCMF_E_IF_CHANGE event received\n"); +-@@ -2090,8 +2090,8 @@ static struct wireless_dev *brcmf_p2p_cr +- } +- +- /* wait for firmware event */ +-- err = brcmf_cfg80211_wait_vif_event_timeout(p2p->cfg, BRCMF_E_IF_ADD, +-- BRCMF_VIF_EVENT_TIMEOUT); +-+ err = brcmf_cfg80211_wait_vif_event(p2p->cfg, BRCMF_E_IF_ADD, +-+ BRCMF_VIF_EVENT_TIMEOUT); +- brcmf_cfg80211_arm_vif_event(p2p->cfg, NULL); +- brcmf_fweh_p2pdev_setup(pri_ifp, false); +- if (!err) { +-@@ -2180,8 +2180,8 @@ struct wireless_dev *brcmf_p2p_add_vif(s +- } +- +- /* wait for firmware event */ +-- err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_ADD, +-- BRCMF_VIF_EVENT_TIMEOUT); +-+ err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_ADD, +-+ BRCMF_VIF_EVENT_TIMEOUT); +- brcmf_cfg80211_arm_vif_event(cfg, NULL); +- if (!err) { +- brcmf_err("timeout occurred\n"); +-@@ -2274,8 +2274,8 @@ int brcmf_p2p_del_vif(struct wiphy *wiph +- } +- if (!err) { +- /* wait for firmware event */ +-- err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL, +-- BRCMF_VIF_EVENT_TIMEOUT); +-+ err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_DEL, +-+ BRCMF_VIF_EVENT_TIMEOUT); +- if (!err) +- err = -EIO; +- else +diff --git a/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch b/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch +deleted file mode 100644 +index 9c336f7..0000000 +--- a/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch ++++ /dev/null +@@ -1,127 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:26:51 +0100 +-Subject: [PATCH] brcmfmac: Limit memory allocs to <64K +- +-Some systems have problems with allocating memory allocation larger +-then 64K. Often on unload/load or suspend/resume a failure is +-reported: Could not allocate wiphy device. This patch makes the +-escan intermediate storage buf dynamically allocated, and smaller +-than 64K. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -1125,7 +1125,7 @@ brcmf_cfg80211_escan(struct wiphy *wiphy +- +- /* Arm scan timeout timer */ +- mod_timer(&cfg->escan_timeout, jiffies + +-- WL_ESCAN_TIMER_INTERVAL_MS * HZ / 1000); +-+ BRCMF_ESCAN_TIMER_INTERVAL_MS * HZ / 1000); +- +- return 0; +- +-@@ -3020,7 +3020,7 @@ brcmf_cfg80211_escan_handler(struct brcm +- +- list = (struct brcmf_scan_results *) +- cfg->escan_info.escan_buf; +-- if (bi_length > WL_ESCAN_BUF_SIZE - list->buflen) { +-+ if (bi_length > BRCMF_ESCAN_BUF_SIZE - list->buflen) { +- brcmf_err("Buffer is too small: ignoring\n"); +- goto exit; +- } +-@@ -3033,8 +3033,8 @@ brcmf_cfg80211_escan_handler(struct brcm +- bss_info_le)) +- goto exit; +- } +-- memcpy(&(cfg->escan_info.escan_buf[list->buflen]), +-- bss_info_le, bi_length); +-+ memcpy(&cfg->escan_info.escan_buf[list->buflen], bss_info_le, +-+ bi_length); +- list->version = le32_to_cpu(bss_info_le->version); +- list->buflen += bi_length; +- list->count++; +-@@ -5402,14 +5402,14 @@ static void brcmf_deinit_priv_mem(struct +- { +- kfree(cfg->conf); +- cfg->conf = NULL; +-- kfree(cfg->escan_ioctl_buf); +-- cfg->escan_ioctl_buf = NULL; +- kfree(cfg->extra_buf); +- cfg->extra_buf = NULL; +- kfree(cfg->wowl.nd); +- cfg->wowl.nd = NULL; +- kfree(cfg->wowl.nd_info); +- cfg->wowl.nd_info = NULL; +-+ kfree(cfg->escan_info.escan_buf); +-+ cfg->escan_info.escan_buf = NULL; +- } +- +- static s32 brcmf_init_priv_mem(struct brcmf_cfg80211_info *cfg) +-@@ -5417,9 +5417,6 @@ static s32 brcmf_init_priv_mem(struct br +- cfg->conf = kzalloc(sizeof(*cfg->conf), GFP_KERNEL); +- if (!cfg->conf) +- goto init_priv_mem_out; +-- cfg->escan_ioctl_buf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL); +-- if (!cfg->escan_ioctl_buf) +-- goto init_priv_mem_out; +- cfg->extra_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); +- if (!cfg->extra_buf) +- goto init_priv_mem_out; +-@@ -5431,6 +5428,9 @@ static s32 brcmf_init_priv_mem(struct br +- GFP_KERNEL); +- if (!cfg->wowl.nd_info) +- goto init_priv_mem_out; +-+ cfg->escan_info.escan_buf = kzalloc(BRCMF_ESCAN_BUF_SIZE, GFP_KERNEL); +-+ if (!cfg->escan_info.escan_buf) +-+ goto init_priv_mem_out; +- +- return 0; +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-@@ -28,8 +28,11 @@ +- #define WL_ROAM_TRIGGER_LEVEL -75 +- #define WL_ROAM_DELTA 20 +- +--#define WL_ESCAN_BUF_SIZE (1024 * 64) +--#define WL_ESCAN_TIMER_INTERVAL_MS 10000 /* E-Scan timeout */ +-+/* Keep BRCMF_ESCAN_BUF_SIZE below 64K (65536). Allocing over 64K can be +-+ * problematic on some systems and should be avoided. +-+ */ +-+#define BRCMF_ESCAN_BUF_SIZE 65000 +-+#define BRCMF_ESCAN_TIMER_INTERVAL_MS 10000 /* E-Scan timeout */ +- +- #define WL_ESCAN_ACTION_START 1 +- #define WL_ESCAN_ACTION_CONTINUE 2 +-@@ -205,7 +208,7 @@ enum wl_escan_state { +- +- struct escan_info { +- u32 escan_state; +-- u8 escan_buf[WL_ESCAN_BUF_SIZE]; +-+ u8 *escan_buf; +- struct wiphy *wiphy; +- struct brcmf_if *ifp; +- s32 (*run)(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp, +-@@ -278,7 +281,6 @@ struct brcmf_cfg80211_wowl { +- * @escan_info: escan information. +- * @escan_timeout: Timer for catch scan timeout. +- * @escan_timeout_work: scan timeout worker. +-- * @escan_ioctl_buf: dongle command buffer for escan commands. +- * @vif_list: linked list of vif instances. +- * @vif_cnt: number of vif instances. +- * @vif_event: vif event signalling. +-@@ -309,7 +311,6 @@ struct brcmf_cfg80211_info { +- struct escan_info escan_info; +- struct timer_list escan_timeout; +- struct work_struct escan_timeout_work; +-- u8 *escan_ioctl_buf; +- struct list_head vif_list; +- struct brcmf_cfg80211_vif_event vif_event; +- struct completion vif_disabled; +diff --git a/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch b/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch +deleted file mode 100644 +index ee3d9f3..0000000 +--- a/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch ++++ /dev/null +@@ -1,29 +0,0 @@ +-From: Franky Lin +-Date: Wed, 17 Feb 2016 11:26:52 +0100 +-Subject: [PATCH] brcmfmac: check for wowl support before enumerating feature +- flag +- +-In some cases wiphy->wowlan could be NULL if firmware doesn't have the +-support. Driver should check for support before walking down the feature +-flags. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Hante Meuleman +-Signed-off-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -6594,7 +6594,8 @@ struct brcmf_cfg80211_info *brcmf_cfg802 +- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SCAN_RANDOM_MAC)) { +- wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR; +- #ifdef CONFIG_PM +-- if (wiphy->wowlan->flags & WIPHY_WOWLAN_NET_DETECT) +-+ if (wiphy->wowlan && +-+ wiphy->wowlan->flags & WIPHY_WOWLAN_NET_DETECT) +- wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; +- #endif +- } +diff --git a/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch b/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch +deleted file mode 100644 +index c52cac8..0000000 +--- a/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch ++++ /dev/null +@@ -1,214 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:26:53 +0100 +-Subject: [PATCH] brcmfmac: Configure country code using device specific +- settings +- +-Country code configuration in a device is a device specific +-operation. For this the country code as specified by reg notifier +-(iso3166 alpha2) needs to be translated to a device specific +-country locale and revision number. This patch adds this +-translation and puts a placeholder in the device specific settings +-where the translation table can be stored. Additional patches will +-be needed to read these tables from for example device platform +-data. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -6405,28 +6405,85 @@ int brcmf_cfg80211_wait_vif_event(struct +- vif_event_equals(event, action), timeout); +- } +- +-+static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], +-+ struct brcmf_fil_country_le *ccreq) +-+{ +-+ struct cc_translate *country_codes; +-+ struct cc_entry *cc; +-+ s32 found_index; +-+ int i; +-+ +-+ country_codes = drvr->settings->country_codes; +-+ if (!country_codes) { +-+ brcmf_dbg(TRACE, "No country codes configured for device\n"); +-+ return -EINVAL; +-+ } +-+ +-+ if ((alpha2[0] == ccreq->country_abbrev[0]) && +-+ (alpha2[1] == ccreq->country_abbrev[1])) { +-+ brcmf_dbg(TRACE, "Country code already set\n"); +-+ return -EAGAIN; +-+ } +-+ +-+ found_index = -1; +-+ for (i = 0; i < country_codes->table_size; i++) { +-+ cc = &country_codes->table[i]; +-+ if ((cc->iso3166[0] == '\0') && (found_index == -1)) +-+ found_index = i; +-+ if ((cc->iso3166[0] == alpha2[0]) && +-+ (cc->iso3166[1] == alpha2[1])) { +-+ found_index = i; +-+ break; +-+ } +-+ } +-+ if (found_index == -1) { +-+ brcmf_dbg(TRACE, "No country code match found\n"); +-+ return -EINVAL; +-+ } +-+ memset(ccreq, 0, sizeof(*ccreq)); +-+ ccreq->rev = cpu_to_le32(country_codes->table[found_index].rev); +-+ memcpy(ccreq->ccode, country_codes->table[found_index].cc, +-+ BRCMF_COUNTRY_BUF_SZ); +-+ ccreq->country_abbrev[0] = alpha2[0]; +-+ ccreq->country_abbrev[1] = alpha2[1]; +-+ ccreq->country_abbrev[2] = 0; +-+ +-+ return 0; +-+} +-+ +- static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy, +- struct regulatory_request *req) +- { +- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); +- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); +- struct brcmf_fil_country_le ccreq; +-+ s32 err; +- int i; +- +-- brcmf_dbg(TRACE, "enter: initiator=%d, alpha=%c%c\n", req->initiator, +-- req->alpha2[0], req->alpha2[1]); +-- +- /* ignore non-ISO3166 country codes */ +- for (i = 0; i < sizeof(req->alpha2); i++) +- if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') { +-- brcmf_err("not a ISO3166 code\n"); +-+ brcmf_err("not a ISO3166 code (0x%02x 0x%02x)\n", +-+ req->alpha2[0], req->alpha2[1]); +- return; +- } +-- memset(&ccreq, 0, sizeof(ccreq)); +-- ccreq.rev = cpu_to_le32(-1); +-- memcpy(ccreq.ccode, req->alpha2, sizeof(req->alpha2)); +-- if (brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq))) { +-- brcmf_err("firmware rejected country setting\n"); +-+ +-+ brcmf_dbg(TRACE, "Enter: initiator=%d, alpha=%c%c\n", req->initiator, +-+ req->alpha2[0], req->alpha2[1]); +-+ +-+ err = brcmf_fil_iovar_data_get(ifp, "country", &ccreq, sizeof(ccreq)); +-+ if (err) { +-+ brcmf_err("Country code iovar returned err = %d\n", err); +-+ return; +-+ } +-+ +-+ err = brcmf_translate_country_code(ifp->drvr, req->alpha2, &ccreq); +-+ if (err) +-+ return; +-+ +-+ err = brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq)); +-+ if (err) { +-+ brcmf_err("Firmware rejected country setting\n"); +- return; +- } +- brcmf_setup_wiphybands(wiphy); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-@@ -230,10 +230,8 @@ void brcmf_mp_attach(void) +- int brcmf_mp_device_attach(struct brcmf_pub *drvr) +- { +- drvr->settings = kzalloc(sizeof(*drvr->settings), GFP_ATOMIC); +-- if (!drvr->settings) { +-- brcmf_err("Failed to alloca storage space for settings\n"); +-+ if (!drvr->settings) +- return -ENOMEM; +-- } +- +- drvr->settings->sdiod_txglomsz = brcmf_sdiod_txglomsz; +- drvr->settings->p2p_enable = !!brcmf_p2p_enable; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-@@ -15,6 +15,8 @@ +- #ifndef BRCMFMAC_COMMON_H +- #define BRCMFMAC_COMMON_H +- +-+#include "fwil_types.h" +-+ +- extern const u8 ALLFFMAC[ETH_ALEN]; +- +- #define BRCMF_FW_ALTPATH_LEN 256 +-@@ -39,6 +41,33 @@ struct brcmf_mp_global_t { +- extern struct brcmf_mp_global_t brcmf_mp_global; +- +- /** +-+ * struct cc_entry - Struct for translating user space country code (iso3166) to +-+ * firmware country code and revision. +-+ * +-+ * @iso3166: iso3166 alpha 2 country code string. +-+ * @cc: firmware country code string. +-+ * @rev: firmware country code revision. +-+ */ +-+struct cc_entry { +-+ char iso3166[BRCMF_COUNTRY_BUF_SZ]; +-+ char cc[BRCMF_COUNTRY_BUF_SZ]; +-+ s32 rev; +-+}; +-+ +-+/** +-+ * struct cc_translate - Struct for translating country codes as set by user +-+ * space to a country code and rev which can be used by +-+ * firmware. +-+ * +-+ * @table_size: number of entries in table (> 0) +-+ * @table: dynamic array of 1 or more elements with translation information. +-+ */ +-+struct cc_translate { +-+ int table_size; +-+ struct cc_entry table[0]; +-+}; +-+ +-+/** +- * struct brcmf_mp_device - Device module paramaters. +- * +- * @sdiod_txglomsz: SDIO txglom size. +-@@ -47,6 +76,7 @@ extern struct brcmf_mp_global_t brcmf_mp +- * @feature_disable: Feature_disable bitmask. +- * @fcmode: FWS flow control. +- * @roamoff: Firmware roaming off? +-+ * @country_codes: If available, pointer to struct for translating country codes +- */ +- struct brcmf_mp_device { +- int sdiod_txglomsz; +-@@ -56,6 +86,7 @@ struct brcmf_mp_device { +- int fcmode; +- bool roamoff; +- bool ignore_probe_fail; +-+ struct cc_translate *country_codes; +- }; +- +- void brcmf_mp_attach(void); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +-@@ -134,6 +134,8 @@ +- #define BRCMF_PFN_MAC_OUI_ONLY BIT(0) +- #define BRCMF_PFN_SET_MAC_UNASSOC BIT(1) +- +-+#define BRCMF_MCSSET_LEN 16 +-+ +- /* join preference types for join_pref iovar */ +- enum brcmf_join_pref_types { +- BRCMF_JOIN_PREF_RSSI = 1, +-@@ -279,7 +281,7 @@ struct brcmf_bss_info_le { +- __le32 reserved32[1]; /* Reserved for expansion of BSS properties */ +- u8 flags; /* flags */ +- u8 reserved[3]; /* Reserved for expansion of BSS properties */ +-- u8 basic_mcs[MCSSET_LEN]; /* 802.11N BSS required MCS set */ +-+ u8 basic_mcs[BRCMF_MCSSET_LEN]; /* 802.11N BSS required MCS set */ +- +- __le16 ie_offset; /* offset at which IEs start, from beginning */ +- __le32 ie_length; /* byte length of Information Elements */ +diff --git a/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch b/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch +deleted file mode 100644 +index 3e2e350..0000000 +--- a/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch ++++ /dev/null +@@ -1,283 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:26:54 +0100 +-Subject: [PATCH] brcmfmac: Add length checks on firmware events +- +-Add additional length checks on firmware events to create more +-robust code. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Lei Zhang +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -3092,6 +3092,11 @@ brcmf_notify_sched_scan_results(struct b +- +- brcmf_dbg(SCAN, "Enter\n"); +- +-+ if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) { +-+ brcmf_dbg(SCAN, "Event data to small. Ignore\n"); +-+ return 0; +-+ } +-+ +- if (e->event_code == BRCMF_E_PFN_NET_LOST) { +- brcmf_dbg(SCAN, "PFN NET LOST event. Do Nothing\n"); +- return 0; +-@@ -3415,6 +3420,11 @@ brcmf_wowl_nd_results(struct brcmf_if *i +- +- brcmf_dbg(SCAN, "Enter\n"); +- +-+ if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) { +-+ brcmf_dbg(SCAN, "Event data to small. Ignore\n"); +-+ return 0; +-+ } +-+ +- pfn_result = (struct brcmf_pno_scanresults_le *)data; +- +- if (e->event_code == BRCMF_E_PFN_NET_LOST) { +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +-@@ -26,50 +26,6 @@ +- #include "fwil.h" +- +- /** +-- * struct brcm_ethhdr - broadcom specific ether header. +-- * +-- * @subtype: subtype for this packet. +-- * @length: TODO: length of appended data. +-- * @version: version indication. +-- * @oui: OUI of this packet. +-- * @usr_subtype: subtype for this OUI. +-- */ +--struct brcm_ethhdr { +-- __be16 subtype; +-- __be16 length; +-- u8 version; +-- u8 oui[3]; +-- __be16 usr_subtype; +--} __packed; +-- +--struct brcmf_event_msg_be { +-- __be16 version; +-- __be16 flags; +-- __be32 event_type; +-- __be32 status; +-- __be32 reason; +-- __be32 auth_type; +-- __be32 datalen; +-- u8 addr[ETH_ALEN]; +-- char ifname[IFNAMSIZ]; +-- u8 ifidx; +-- u8 bsscfgidx; +--} __packed; +-- +--/** +-- * struct brcmf_event - contents of broadcom event packet. +-- * +-- * @eth: standard ether header. +-- * @hdr: broadcom specific ether header. +-- * @msg: common part of the actual event message. +-- */ +--struct brcmf_event { +-- struct ethhdr eth; +-- struct brcm_ethhdr hdr; +-- struct brcmf_event_msg_be msg; +--} __packed; +-- +--/** +- * struct brcmf_fweh_queue_item - event item on event queue. +- * +- * @q: list element for queuing. +-@@ -85,6 +41,7 @@ struct brcmf_fweh_queue_item { +- u8 ifidx; +- u8 ifaddr[ETH_ALEN]; +- struct brcmf_event_msg_be emsg; +-+ u32 datalen; +- u8 data[0]; +- }; +- +-@@ -294,6 +251,11 @@ static void brcmf_fweh_event_worker(stru +- brcmf_dbg_hex_dump(BRCMF_EVENT_ON(), event->data, +- min_t(u32, emsg.datalen, 64), +- "event payload, len=%d\n", emsg.datalen); +-+ if (emsg.datalen > event->datalen) { +-+ brcmf_err("event invalid length header=%d, msg=%d\n", +-+ event->datalen, emsg.datalen); +-+ goto event_free; +-+ } +- +- /* special handling of interface event */ +- if (event->code == BRCMF_E_IF) { +-@@ -439,7 +401,8 @@ int brcmf_fweh_activate_events(struct br +- * dispatch the event to a registered handler (using worker). +- */ +- void brcmf_fweh_process_event(struct brcmf_pub *drvr, +-- struct brcmf_event *event_packet) +-+ struct brcmf_event *event_packet, +-+ u32 packet_len) +- { +- enum brcmf_fweh_event_code code; +- struct brcmf_fweh_info *fweh = &drvr->fweh; +-@@ -459,6 +422,9 @@ void brcmf_fweh_process_event(struct brc +- if (code != BRCMF_E_IF && !fweh->evt_handler[code]) +- return; +- +-+ if (datalen > BRCMF_DCMD_MAXLEN) +-+ return; +-+ +- if (in_interrupt()) +- alloc_flag = GFP_ATOMIC; +- +-@@ -472,6 +438,7 @@ void brcmf_fweh_process_event(struct brc +- /* use memcpy to get aligned event message */ +- memcpy(&event->emsg, &event_packet->msg, sizeof(event->emsg)); +- memcpy(event->data, data, datalen); +-+ event->datalen = datalen; +- memcpy(event->ifaddr, event_packet->eth.h_dest, ETH_ALEN); +- +- brcmf_fweh_queue_event(fweh, event); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h +-@@ -27,7 +27,6 @@ +- struct brcmf_pub; +- struct brcmf_if; +- struct brcmf_cfg80211_info; +--struct brcmf_event; +- +- /* list of firmware events */ +- #define BRCMF_FWEH_EVENT_ENUM_DEFLIST \ +-@@ -180,13 +179,55 @@ enum brcmf_fweh_event_code { +- /** +- * definitions for event packet validation. +- */ +--#define BRCMF_EVENT_OUI_OFFSET 19 +--#define BRCM_OUI "\x00\x10\x18" +--#define DOT11_OUI_LEN 3 +--#define BCMILCP_BCM_SUBTYPE_EVENT 1 +-+#define BRCM_OUI "\x00\x10\x18" +-+#define BCMILCP_BCM_SUBTYPE_EVENT 1 +- +- +- /** +-+ * struct brcm_ethhdr - broadcom specific ether header. +-+ * +-+ * @subtype: subtype for this packet. +-+ * @length: TODO: length of appended data. +-+ * @version: version indication. +-+ * @oui: OUI of this packet. +-+ * @usr_subtype: subtype for this OUI. +-+ */ +-+struct brcm_ethhdr { +-+ __be16 subtype; +-+ __be16 length; +-+ u8 version; +-+ u8 oui[3]; +-+ __be16 usr_subtype; +-+} __packed; +-+ +-+struct brcmf_event_msg_be { +-+ __be16 version; +-+ __be16 flags; +-+ __be32 event_type; +-+ __be32 status; +-+ __be32 reason; +-+ __be32 auth_type; +-+ __be32 datalen; +-+ u8 addr[ETH_ALEN]; +-+ char ifname[IFNAMSIZ]; +-+ u8 ifidx; +-+ u8 bsscfgidx; +-+} __packed; +-+ +-+/** +-+ * struct brcmf_event - contents of broadcom event packet. +-+ * +-+ * @eth: standard ether header. +-+ * @hdr: broadcom specific ether header. +-+ * @msg: common part of the actual event message. +-+ */ +-+struct brcmf_event { +-+ struct ethhdr eth; +-+ struct brcm_ethhdr hdr; +-+ struct brcmf_event_msg_be msg; +-+} __packed; +-+ +-+/** +- * struct brcmf_event_msg - firmware event message. +- * +- * @version: version information. +-@@ -256,34 +297,35 @@ void brcmf_fweh_unregister(struct brcmf_ +- enum brcmf_fweh_event_code code); +- int brcmf_fweh_activate_events(struct brcmf_if *ifp); +- void brcmf_fweh_process_event(struct brcmf_pub *drvr, +-- struct brcmf_event *event_packet); +-+ struct brcmf_event *event_packet, +-+ u32 packet_len); +- void brcmf_fweh_p2pdev_setup(struct brcmf_if *ifp, bool ongoing); +- +- static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr, +- struct sk_buff *skb) +- { +- struct brcmf_event *event_packet; +-- u8 *data; +- u16 usr_stype; +- +- /* only process events when protocol matches */ +- if (skb->protocol != cpu_to_be16(ETH_P_LINK_CTL)) +- return; +- +-+ if ((skb->len + ETH_HLEN) < sizeof(*event_packet)) +-+ return; +-+ +- /* check for BRCM oui match */ +- event_packet = (struct brcmf_event *)skb_mac_header(skb); +-- data = (u8 *)event_packet; +-- data += BRCMF_EVENT_OUI_OFFSET; +-- if (memcmp(BRCM_OUI, data, DOT11_OUI_LEN)) +-+ if (memcmp(BRCM_OUI, &event_packet->hdr.oui[0], +-+ sizeof(event_packet->hdr.oui))) +- return; +- +- /* final match on usr_subtype */ +-- data += DOT11_OUI_LEN; +-- usr_stype = get_unaligned_be16(data); +-+ usr_stype = get_unaligned_be16(&event_packet->hdr.usr_subtype); +- if (usr_stype != BCMILCP_BCM_SUBTYPE_EVENT) +- return; +- +-- brcmf_fweh_process_event(drvr, event_packet); +-+ brcmf_fweh_process_event(drvr, event_packet, skb->len + ETH_HLEN); +- } +- +- #endif /* FWEH_H_ */ +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -1361,6 +1361,11 @@ int brcmf_p2p_notify_action_frame_rx(str +- u16 mgmt_type; +- u8 action; +- +-+ if (e->datalen < sizeof(*rxframe)) { +-+ brcmf_dbg(SCAN, "Event data to small. Ignore\n"); +-+ return 0; +-+ } +-+ +- ch.chspec = be16_to_cpu(rxframe->chanspec); +- cfg->d11inf.decchspec(&ch); +- /* Check if wpa_supplicant has registered for this frame */ +-@@ -1858,6 +1863,11 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere +- brcmf_dbg(INFO, "Enter: event %d reason %d\n", e->event_code, +- e->reason); +- +-+ if (e->datalen < sizeof(*rxframe)) { +-+ brcmf_dbg(SCAN, "Event data to small. Ignore\n"); +-+ return 0; +-+ } +-+ +- ch.chspec = be16_to_cpu(rxframe->chanspec); +- cfg->d11inf.decchspec(&ch); +- +diff --git a/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch b/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch +deleted file mode 100644 +index 888ad5b..0000000 +--- a/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch ++++ /dev/null +@@ -1,333 +0,0 @@ +-From: Franky Lin +-Date: Wed, 17 Feb 2016 11:26:55 +0100 +-Subject: [PATCH] brcmfmac: add neighbor discovery offload ip address table +- configuration +- +-Configure ipv6 address for neighbor discovery offload ip table in +-firmware obtained through ipv6 address notification callback. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -456,7 +456,7 @@ send_key_to_dongle(struct brcmf_if *ifp, +- } +- +- static s32 +--brcmf_configure_arp_offload(struct brcmf_if *ifp, bool enable) +-+brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable) +- { +- s32 err; +- u32 mode; +-@@ -484,6 +484,15 @@ brcmf_configure_arp_offload(struct brcmf +- enable, mode); +- } +- +-+ err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable); +-+ if (err) { +-+ brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n", +-+ enable, err); +-+ err = 0; +-+ } else +-+ brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n", +-+ enable, mode); +-+ +- return err; +- } +- +-@@ -3543,7 +3552,7 @@ static s32 brcmf_cfg80211_resume(struct +- brcmf_report_wowl_wakeind(wiphy, ifp); +- brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0); +- brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0); +-- brcmf_configure_arp_offload(ifp, true); +-+ brcmf_configure_arp_nd_offload(ifp, true); +- brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, +- cfg->wowl.pre_pmmode); +- cfg->wowl.active = false; +-@@ -3567,7 +3576,7 @@ static void brcmf_configure_wowl(struct +- +- brcmf_dbg(TRACE, "Suspend, wowl config.\n"); +- +-- brcmf_configure_arp_offload(ifp, false); +-+ brcmf_configure_arp_nd_offload(ifp, false); +- brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode); +- brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, PM_MAX); +- +-@@ -4336,7 +4345,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- +- if (!mbss) { +- brcmf_set_mpc(ifp, 0); +-- brcmf_configure_arp_offload(ifp, false); +-+ brcmf_configure_arp_nd_offload(ifp, false); +- } +- +- /* find the RSN_IE */ +-@@ -4482,7 +4491,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- exit: +- if ((err) && (!mbss)) { +- brcmf_set_mpc(ifp, 1); +-- brcmf_configure_arp_offload(ifp, true); +-+ brcmf_configure_arp_nd_offload(ifp, true); +- } +- return err; +- } +-@@ -4540,7 +4549,7 @@ static int brcmf_cfg80211_stop_ap(struct +- brcmf_err("bss_enable config failed %d\n", err); +- } +- brcmf_set_mpc(ifp, 1); +-- brcmf_configure_arp_offload(ifp, true); +-+ brcmf_configure_arp_nd_offload(ifp, true); +- clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); +- brcmf_net_setcarrier(ifp, false); +- +-@@ -6287,7 +6296,7 @@ static s32 brcmf_config_dongle(struct br +- if (err) +- goto default_conf_out; +- +-- brcmf_configure_arp_offload(ifp, true); +-+ brcmf_configure_arp_nd_offload(ifp, true); +- +- cfg->dongle_up = true; +- default_conf_out: +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -20,6 +20,8 @@ +- #include +- #include +- #include +-+#include +-+#include +- #include +- #include +- +-@@ -172,6 +174,35 @@ _brcmf_set_mac_address(struct work_struc +- } +- } +- +-+#if IS_ENABLED(CONFIG_IPV6) +-+static void _brcmf_update_ndtable(struct work_struct *work) +-+{ +-+ struct brcmf_if *ifp; +-+ int i, ret; +-+ +-+ ifp = container_of(work, struct brcmf_if, ndoffload_work); +-+ +-+ /* clear the table in firmware */ +-+ ret = brcmf_fil_iovar_data_set(ifp, "nd_hostip_clear", NULL, 0); +-+ if (ret) { +-+ brcmf_dbg(TRACE, "fail to clear nd ip table err:%d\n", ret); +-+ return; +-+ } +-+ +-+ for (i = 0; i < ifp->ipv6addr_idx; i++) { +-+ ret = brcmf_fil_iovar_data_set(ifp, "nd_hostip", +-+ &ifp->ipv6_addr_tbl[i], +-+ sizeof(struct in6_addr)); +-+ if (ret) +-+ brcmf_err("add nd ip err %d\n", ret); +-+ } +-+} +-+#else +-+static void _brcmf_update_ndtable(struct work_struct *work) +-+{ +-+} +-+#endif +-+ +- static int brcmf_netdev_set_mac_address(struct net_device *ndev, void *addr) +- { +- struct brcmf_if *ifp = netdev_priv(ndev); +-@@ -685,6 +716,7 @@ int brcmf_net_attach(struct brcmf_if *if +- +- INIT_WORK(&ifp->setmacaddr_work, _brcmf_set_mac_address); +- INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list); +-+ INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable); +- +- if (rtnl_locked) +- err = register_netdevice(ndev); +-@@ -884,6 +916,7 @@ static void brcmf_del_if(struct brcmf_pu +- if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) { +- cancel_work_sync(&ifp->setmacaddr_work); +- cancel_work_sync(&ifp->multicast_work); +-+ cancel_work_sync(&ifp->ndoffload_work); +- } +- brcmf_net_detach(ifp->ndev); +- } else { +-@@ -1025,6 +1058,56 @@ static int brcmf_inetaddr_changed(struct +- } +- #endif +- +-+#if IS_ENABLED(CONFIG_IPV6) +-+static int brcmf_inet6addr_changed(struct notifier_block *nb, +-+ unsigned long action, void *data) +-+{ +-+ struct brcmf_pub *drvr = container_of(nb, struct brcmf_pub, +-+ inet6addr_notifier); +-+ struct inet6_ifaddr *ifa = data; +-+ struct brcmf_if *ifp; +-+ int i; +-+ struct in6_addr *table; +-+ +-+ /* Only handle primary interface */ +-+ ifp = drvr->iflist[0]; +-+ if (!ifp) +-+ return NOTIFY_DONE; +-+ if (ifp->ndev != ifa->idev->dev) +-+ return NOTIFY_DONE; +-+ +-+ table = ifp->ipv6_addr_tbl; +-+ for (i = 0; i < NDOL_MAX_ENTRIES; i++) +-+ if (ipv6_addr_equal(&ifa->addr, &table[i])) +-+ break; +-+ +-+ switch (action) { +-+ case NETDEV_UP: +-+ if (i == NDOL_MAX_ENTRIES) { +-+ if (ifp->ipv6addr_idx < NDOL_MAX_ENTRIES) { +-+ table[ifp->ipv6addr_idx++] = ifa->addr; +-+ } else { +-+ for (i = 0; i < NDOL_MAX_ENTRIES - 1; i++) +-+ table[i] = table[i + 1]; +-+ table[NDOL_MAX_ENTRIES - 1] = ifa->addr; +-+ } +-+ } +-+ break; +-+ case NETDEV_DOWN: +-+ if (i < NDOL_MAX_ENTRIES) +-+ for (; i < ifp->ipv6addr_idx; i++) +-+ table[i] = table[i + 1]; +-+ break; +-+ default: +-+ break; +-+ } +-+ +-+ schedule_work(&ifp->ndoffload_work); +-+ +-+ return NOTIFY_OK; +-+} +-+#endif +-+ +- int brcmf_attach(struct device *dev) +- { +- struct brcmf_pub *drvr = NULL; +-@@ -1164,30 +1247,41 @@ int brcmf_bus_start(struct device *dev) +- #ifdef CONFIG_INET +- drvr->inetaddr_notifier.notifier_call = brcmf_inetaddr_changed; +- ret = register_inetaddr_notifier(&drvr->inetaddr_notifier); +-+ if (ret) +-+ goto fail; +-+ +-+#if IS_ENABLED(CONFIG_IPV6) +-+ drvr->inet6addr_notifier.notifier_call = brcmf_inet6addr_changed; +-+ ret = register_inet6addr_notifier(&drvr->inet6addr_notifier); +-+ if (ret) { +-+ unregister_inetaddr_notifier(&drvr->inetaddr_notifier); +-+ goto fail; +-+ } +- #endif +-+#endif /* CONFIG_INET */ +-+ +-+ return 0; +- +- fail: +-- if (ret < 0) { +-- brcmf_err("failed: %d\n", ret); +-- if (drvr->config) { +-- brcmf_cfg80211_detach(drvr->config); +-- drvr->config = NULL; +-- } +-- if (drvr->fws) { +-- brcmf_fws_del_interface(ifp); +-- brcmf_fws_deinit(drvr); +-- } +-- if (ifp) +-- brcmf_net_detach(ifp->ndev); +-- if (p2p_ifp) +-- brcmf_net_detach(p2p_ifp->ndev); +-- drvr->iflist[0] = NULL; +-- drvr->iflist[1] = NULL; +-- if (brcmf_ignoring_probe_fail(drvr)) +-- ret = 0; +-- return ret; +-+ brcmf_err("failed: %d\n", ret); +-+ if (drvr->config) { +-+ brcmf_cfg80211_detach(drvr->config); +-+ drvr->config = NULL; +-+ } +-+ if (drvr->fws) { +-+ brcmf_fws_del_interface(ifp); +-+ brcmf_fws_deinit(drvr); +- } +-- return 0; +-+ if (ifp) +-+ brcmf_net_detach(ifp->ndev); +-+ if (p2p_ifp) +-+ brcmf_net_detach(p2p_ifp->ndev); +-+ drvr->iflist[0] = NULL; +-+ drvr->iflist[1] = NULL; +-+ if (brcmf_ignoring_probe_fail(drvr)) +-+ ret = 0; +-+ +-+ return ret; +- } +- +- void brcmf_bus_add_txhdrlen(struct device *dev, uint len) +-@@ -1237,6 +1331,10 @@ void brcmf_detach(struct device *dev) +- unregister_inetaddr_notifier(&drvr->inetaddr_notifier); +- #endif +- +-+#if IS_ENABLED(CONFIG_IPV6) +-+ unregister_inet6addr_notifier(&drvr->inet6addr_notifier); +-+#endif +-+ +- /* stop firmware event handling */ +- brcmf_fweh_detach(drvr); +- if (drvr->config) +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -48,6 +48,8 @@ +- */ +- #define BRCMF_DRIVER_FIRMWARE_VERSION_LEN 32 +- +-+#define NDOL_MAX_ENTRIES 8 +-+ +- /** +- * struct brcmf_ampdu_rx_reorder - AMPDU receive reorder info +- * +-@@ -143,6 +145,7 @@ struct brcmf_pub { +- #endif +- +- struct notifier_block inetaddr_notifier; +-+ struct notifier_block inet6addr_notifier; +- struct brcmf_mp_device *settings; +- }; +- +-@@ -175,6 +178,7 @@ enum brcmf_netif_stop_reason { +- * @stats: interface specific network statistics. +- * @setmacaddr_work: worker object for setting mac address. +- * @multicast_work: worker object for multicast provisioning. +-+ * @ndoffload_work: worker object for neighbor discovery offload configuration. +- * @fws_desc: interface specific firmware-signalling descriptor. +- * @ifidx: interface index in device firmware. +- * @bsscfgidx: index of bss associated with this interface. +-@@ -191,6 +195,7 @@ struct brcmf_if { +- struct net_device_stats stats; +- struct work_struct setmacaddr_work; +- struct work_struct multicast_work; +-+ struct work_struct ndoffload_work; +- struct brcmf_fws_mac_descriptor *fws_desc; +- int ifidx; +- s32 bsscfgidx; +-@@ -199,6 +204,8 @@ struct brcmf_if { +- spinlock_t netif_stop_lock; +- atomic_t pend_8021x_cnt; +- wait_queue_head_t pend_8021x_wait; +-+ struct in6_addr ipv6_addr_tbl[NDOL_MAX_ENTRIES]; +-+ u8 ipv6addr_idx; +- }; +- +- struct brcmf_skb_reorder_data { +diff --git a/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch b/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch +deleted file mode 100644 +index 68de8ed..0000000 +--- a/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch ++++ /dev/null +@@ -1,38 +0,0 @@ +-From: Franky Lin +-Date: Wed, 17 Feb 2016 11:26:56 +0100 +-Subject: [PATCH] brcmfmac: check return for ARP ip setting iovar +- +-The return value of iovar set function should be saved and checked. +- +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Hante Meuleman +-Signed-off-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -1039,14 +1039,14 @@ static int brcmf_inetaddr_changed(struct +- return NOTIFY_OK; +- } +- for (i = 0; i < ARPOL_MAX_ENTRIES; i++) { +-- if (addr_table[i] != 0) { +-- brcmf_fil_iovar_data_set(ifp, +-- "arp_hostip", &addr_table[i], +-- sizeof(addr_table[i])); +-- if (ret) +-- brcmf_err("add arp ip err %d\n", +-- ret); +-- } +-+ if (addr_table[i] == 0) +-+ continue; +-+ ret = brcmf_fil_iovar_data_set(ifp, "arp_hostip", +-+ &addr_table[i], +-+ sizeof(addr_table[i])); +-+ if (ret) +-+ brcmf_err("add arp ip err %d\n", +-+ ret); +- } +- } +- break; diff --git a/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch b/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch deleted file mode 100644 index 3de0f64..0000000 @@ -11449,9 +12614,236 @@ index e4a8f30..0000000 - BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371), - }; - +diff --git a/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch b/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch +deleted file mode 100644 +index f99f6db..0000000 +--- a/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch ++++ /dev/null +@@ -1,221 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:00 +0100 +-Subject: [PATCH] brcmfmac: remove pcie gen1 support +- +-The PCIE bus driver supports older gen1 (v1) chips, but there is no +-actual device which is using this older pcie core which is supported +-by brcmfmac. Remove all gen1 related code. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +-@@ -100,9 +100,6 @@ static struct brcmf_firmware_mapping brc +- #define BRCMF_PCIE_PCIE2REG_CONFIGDATA 0x124 +- #define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX 0x140 +- +--#define BRCMF_PCIE_GENREV1 1 +--#define BRCMF_PCIE_GENREV2 2 +-- +- #define BRCMF_PCIE2_INTA 0x01 +- #define BRCMF_PCIE2_INTB 0x02 +- +-@@ -257,9 +254,7 @@ struct brcmf_pciedev_info { +- u32 ram_size; +- struct brcmf_chip *ci; +- u32 coreid; +-- u32 generic_corerev; +- struct brcmf_pcie_shared_info shared; +-- void (*ringbell)(struct brcmf_pciedev_info *devinfo); +- wait_queue_head_t mbdata_resp_wait; +- bool mbdata_completed; +- bool irq_allocated; +-@@ -746,68 +741,22 @@ static void brcmf_pcie_bus_console_read( +- } +- +- +--static __used void brcmf_pcie_ringbell_v1(struct brcmf_pciedev_info *devinfo) +--{ +-- u32 reg_value; +-- +-- brcmf_dbg(PCIE, "RING !\n"); +-- reg_value = brcmf_pcie_read_reg32(devinfo, +-- BRCMF_PCIE_PCIE2REG_MAILBOXINT); +-- reg_value |= BRCMF_PCIE2_INTB; +-- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, +-- reg_value); +--} +-- +-- +--static void brcmf_pcie_ringbell_v2(struct brcmf_pciedev_info *devinfo) +--{ +-- brcmf_dbg(PCIE, "RING !\n"); +-- /* Any arbitrary value will do, lets use 1 */ +-- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX, 1); +--} +-- +-- +- static void brcmf_pcie_intr_disable(struct brcmf_pciedev_info *devinfo) +- { +-- if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) +-- pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTMASK, +-- 0); +-- else +-- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, +-- 0); +-+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, 0); +- } +- +- +- static void brcmf_pcie_intr_enable(struct brcmf_pciedev_info *devinfo) +- { +-- if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) +-- pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTMASK, +-- BRCMF_PCIE_INT_DEF); +-- else +-- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, +-- BRCMF_PCIE_MB_INT_D2H_DB | +-- BRCMF_PCIE_MB_INT_FN0_0 | +-- BRCMF_PCIE_MB_INT_FN0_1); +-+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, +-+ BRCMF_PCIE_MB_INT_D2H_DB | +-+ BRCMF_PCIE_MB_INT_FN0_0 | +-+ BRCMF_PCIE_MB_INT_FN0_1); +- } +- +- +--static irqreturn_t brcmf_pcie_quick_check_isr_v1(int irq, void *arg) +--{ +-- struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; +-- u32 status; +-- +-- status = 0; +-- pci_read_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTSTATUS, &status); +-- if (status) { +-- brcmf_pcie_intr_disable(devinfo); +-- brcmf_dbg(PCIE, "Enter\n"); +-- return IRQ_WAKE_THREAD; +-- } +-- return IRQ_NONE; +--} +-- +-- +--static irqreturn_t brcmf_pcie_quick_check_isr_v2(int irq, void *arg) +-+static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg) +- { +- struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; +- +-@@ -820,29 +769,7 @@ static irqreturn_t brcmf_pcie_quick_chec +- } +- +- +--static irqreturn_t brcmf_pcie_isr_thread_v1(int irq, void *arg) +--{ +-- struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; +-- const struct pci_dev *pdev = devinfo->pdev; +-- u32 status; +-- +-- devinfo->in_irq = true; +-- status = 0; +-- pci_read_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, &status); +-- brcmf_dbg(PCIE, "Enter %x\n", status); +-- if (status) { +-- pci_write_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, status); +-- if (devinfo->state == BRCMFMAC_PCIE_STATE_UP) +-- brcmf_proto_msgbuf_rx_trigger(&devinfo->pdev->dev); +-- } +-- if (devinfo->state == BRCMFMAC_PCIE_STATE_UP) +-- brcmf_pcie_intr_enable(devinfo); +-- devinfo->in_irq = false; +-- return IRQ_HANDLED; +--} +-- +-- +--static irqreturn_t brcmf_pcie_isr_thread_v2(int irq, void *arg) +-+static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg) +- { +- struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; +- u32 status; +-@@ -879,28 +806,14 @@ static int brcmf_pcie_request_irq(struct +- brcmf_pcie_intr_disable(devinfo); +- +- brcmf_dbg(PCIE, "Enter\n"); +-- /* is it a v1 or v2 implementation */ +-+ +- pci_enable_msi(pdev); +-- if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) { +-- if (request_threaded_irq(pdev->irq, +-- brcmf_pcie_quick_check_isr_v1, +-- brcmf_pcie_isr_thread_v1, +-- IRQF_SHARED, "brcmf_pcie_intr", +-- devinfo)) { +-- pci_disable_msi(pdev); +-- brcmf_err("Failed to request IRQ %d\n", pdev->irq); +-- return -EIO; +-- } +-- } else { +-- if (request_threaded_irq(pdev->irq, +-- brcmf_pcie_quick_check_isr_v2, +-- brcmf_pcie_isr_thread_v2, +-- IRQF_SHARED, "brcmf_pcie_intr", +-- devinfo)) { +-- pci_disable_msi(pdev); +-- brcmf_err("Failed to request IRQ %d\n", pdev->irq); +-- return -EIO; +-- } +-+ if (request_threaded_irq(pdev->irq, brcmf_pcie_quick_check_isr, +-+ brcmf_pcie_isr_thread, IRQF_SHARED, +-+ "brcmf_pcie_intr", devinfo)) { +-+ pci_disable_msi(pdev); +-+ brcmf_err("Failed to request IRQ %d\n", pdev->irq); +-+ return -EIO; +- } +- devinfo->irq_allocated = true; +- return 0; +-@@ -931,16 +844,9 @@ static void brcmf_pcie_release_irq(struc +- if (devinfo->in_irq) +- brcmf_err("Still in IRQ (processing) !!!\n"); +- +-- if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) { +-- status = 0; +-- pci_read_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, &status); +-- pci_write_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, status); +-- } else { +-- status = brcmf_pcie_read_reg32(devinfo, +-- BRCMF_PCIE_PCIE2REG_MAILBOXINT); +-- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, +-- status); +-- } +-+ status = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT); +-+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, status); +-+ +- devinfo->irq_allocated = false; +- } +- +-@@ -989,7 +895,9 @@ static int brcmf_pcie_ring_mb_ring_bell( +- if (devinfo->state != BRCMFMAC_PCIE_STATE_UP) +- return -EIO; +- +-- devinfo->ringbell(devinfo); +-+ brcmf_dbg(PCIE, "RING !\n"); +-+ /* Any arbitrary value will do, lets use 1 */ +-+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX, 1); +- +- return 0; +- } +-@@ -1503,9 +1411,6 @@ static int brcmf_pcie_download_fw_nvram( +- u32 address; +- u32 resetintr; +- +-- devinfo->ringbell = brcmf_pcie_ringbell_v2; +-- devinfo->generic_corerev = BRCMF_PCIE_GENREV2; +-- +- brcmf_dbg(PCIE, "Halt ARM.\n"); +- err = brcmf_pcie_enter_download_state(devinfo); +- if (err) diff --git a/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch b/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch deleted file mode 100644 -index c529ff2..0000000 +index 4adfc2d..0000000 --- a/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch +++ /dev/null @@ -1,30 +0,0 @@ @@ -11476,7 +12868,7 @@ index c529ff2..0000000 - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -40,7 +40,7 @@ MODULE_AUTHOR("Broadcom Corporation"); +-@@ -42,7 +42,7 @@ MODULE_AUTHOR("Broadcom Corporation"); - MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); - MODULE_LICENSE("Dual BSD/GPL"); - @@ -11485,6 +12877,2980 @@ index c529ff2..0000000 - - /* AMPDU rx reordering definitions */ - #define BRCMF_RXREORDER_FLOWID_OFFSET 0 +diff --git a/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch b/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch +deleted file mode 100644 +index bd62781..0000000 +--- a/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch ++++ /dev/null +@@ -1,135 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:02 +0100 +-Subject: [PATCH] brcmfmac: move module init and exit to common +- +-In preparation of module parameters for all devices the module init +-and exit routines are moved to the common file. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-@@ -28,6 +28,10 @@ +- #include "tracepoint.h" +- #include "common.h" +- +-+MODULE_AUTHOR("Broadcom Corporation"); +-+MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); +-+MODULE_LICENSE("Dual BSD/GPL"); +-+ +- const u8 ALLFFMAC[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +- +- #define BRCMF_DEFAULT_SCAN_CHANNEL_TIME 40 +-@@ -221,7 +225,7 @@ void __brcmf_dbg(u32 level, const char * +- } +- #endif +- +--void brcmf_mp_attach(void) +-+static void brcmf_mp_attach(void) +- { +- strlcpy(brcmf_mp_global.firmware_path, brcmf_firmware_path, +- BRCMF_FW_ALTPATH_LEN); +-@@ -249,3 +253,33 @@ void brcmf_mp_device_detach(struct brcmf +- kfree(drvr->settings); +- } +- +-+static int __init brcmfmac_module_init(void) +-+{ +-+ int err; +-+ +-+ /* Initialize debug system first */ +-+ brcmf_debugfs_init(); +-+ +-+#ifdef CPTCFG_BRCMFMAC_SDIO +-+ brcmf_sdio_init(); +-+#endif +-+ /* Initialize global module paramaters */ +-+ brcmf_mp_attach(); +-+ +-+ /* Continue the initialization by registering the different busses */ +-+ err = brcmf_core_init(); +-+ if (err) +-+ brcmf_debugfs_exit(); +-+ +-+ return err; +-+} +-+ +-+static void __exit brcmfmac_module_exit(void) +-+{ +-+ brcmf_core_exit(); +-+ brcmf_debugfs_exit(); +-+} +-+ +-+module_init(brcmfmac_module_init); +-+module_exit(brcmfmac_module_exit); +-+ +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-@@ -89,7 +89,6 @@ struct brcmf_mp_device { +- struct cc_translate *country_codes; +- }; +- +--void brcmf_mp_attach(void); +- int brcmf_mp_device_attach(struct brcmf_pub *drvr); +- void brcmf_mp_device_detach(struct brcmf_pub *drvr); +- #ifdef DEBUG +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -38,10 +38,6 @@ +- #include "pcie.h" +- #include "common.h" +- +--MODULE_AUTHOR("Broadcom Corporation"); +--MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); +--MODULE_LICENSE("Dual BSD/GPL"); +-- +- #define MAX_WAIT_FOR_8021X_TX msecs_to_jiffies(950) +- +- /* AMPDU rx reordering definitions */ +-@@ -1422,19 +1418,15 @@ static void brcmf_driver_register(struct +- } +- static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register); +- +--static int __init brcmfmac_module_init(void) +-+int __init brcmf_core_init(void) +- { +-- brcmf_debugfs_init(); +--#ifdef CPTCFG_BRCMFMAC_SDIO +-- brcmf_sdio_init(); +--#endif +- if (!schedule_work(&brcmf_driver_work)) +- return -EBUSY; +- +- return 0; +- } +- +--static void __exit brcmfmac_module_exit(void) +-+void __exit brcmf_core_exit(void) +- { +- cancel_work_sync(&brcmf_driver_work); +- +-@@ -1447,8 +1439,5 @@ static void __exit brcmfmac_module_exit( +- #ifdef CPTCFG_BRCMFMAC_PCIE +- brcmf_pcie_exit(); +- #endif +-- brcmf_debugfs_exit(); +- } +- +--module_init(brcmfmac_module_init); +--module_exit(brcmfmac_module_exit); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -227,5 +227,7 @@ void brcmf_txflowblock_if(struct brcmf_i +- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); +- void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); +- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); +-+int __init brcmf_core_init(void); +-+void __exit brcmf_core_exit(void); +- +- #endif /* BRCMFMAC_CORE_H */ +diff --git a/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch b/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch +deleted file mode 100644 +index 577ca8e..0000000 +--- a/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch ++++ /dev/null +@@ -1,260 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:03 +0100 +-Subject: [PATCH] brcmfmac: add wowl gtk rekeying offload support +- +-This patch adds support for gtk rekeying offload and for gtk +-rekeying failure during wowl mode. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -3526,6 +3526,10 @@ static void brcmf_report_wowl_wakeind(st +- else +- wakeup_data.net_detect = cfg->wowl.nd_info; +- } +-+ if (wakeind & BRCMF_WOWL_GTK_FAILURE) { +-+ brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_GTK_FAILURE\n"); +-+ wakeup_data.gtk_rekey_failure = true; +-+ } +- } else { +- wakeup = NULL; +- } +-@@ -3607,6 +3611,8 @@ static void brcmf_configure_wowl(struct +- brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND, +- brcmf_wowl_nd_results); +- } +-+ if (wowl->gtk_rekey_failure) +-+ wowl_config |= BRCMF_WOWL_GTK_FAILURE; +- if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) +- wowl_config |= BRCMF_WOWL_UNASSOC; +- +-@@ -4874,7 +4880,32 @@ static int brcmf_cfg80211_tdls_oper(stru +- return ret; +- } +- +--static struct cfg80211_ops wl_cfg80211_ops = { +-+#ifdef CONFIG_PM +-+static int +-+brcmf_cfg80211_set_rekey_data(struct wiphy *wiphy, struct net_device *ndev, +-+ struct cfg80211_gtk_rekey_data *gtk) +-+{ +-+ struct brcmf_if *ifp = netdev_priv(ndev); +-+ struct brcmf_gtk_keyinfo_le gtk_le; +-+ int ret; +-+ +-+ brcmf_dbg(TRACE, "Enter, bssidx=%d\n", ifp->bsscfgidx); +-+ +-+ memcpy(gtk_le.kck, gtk->kck, sizeof(gtk_le.kck)); +-+ memcpy(gtk_le.kek, gtk->kek, sizeof(gtk_le.kek)); +-+ memcpy(gtk_le.replay_counter, gtk->replay_ctr, +-+ sizeof(gtk_le.replay_counter)); +-+ +-+ ret = brcmf_fil_iovar_data_set(ifp, "gtk_key_info", >k_le, +-+ sizeof(gtk_le)); +-+ if (ret < 0) +-+ brcmf_err("gtk_key_info iovar failed: ret=%d\n", ret); +-+ +-+ return ret; +-+} +-+#endif +-+ +-+static struct cfg80211_ops brcmf_cfg80211_ops = { +- .add_virtual_intf = brcmf_cfg80211_add_iface, +- .del_virtual_intf = brcmf_cfg80211_del_iface, +- .change_virtual_intf = brcmf_cfg80211_change_iface, +-@@ -6139,19 +6170,18 @@ static void brcmf_wiphy_wowl_params(stru +- { +- #ifdef CONFIG_PM +- struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); +-- s32 err; +-- u32 wowl_cap; +- +- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) { +-- err = brcmf_fil_iovar_int_get(ifp, "wowl_cap", &wowl_cap); +-- if (!err) { +-- if (wowl_cap & BRCMF_WOWL_PFN_FOUND) { +-- brcmf_wowlan_support.flags |= +-- WIPHY_WOWLAN_NET_DETECT; +-- init_waitqueue_head(&cfg->wowl.nd_data_wait); +-- } +-+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) { +-+ brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT; +-+ init_waitqueue_head(&cfg->wowl.nd_data_wait); +- } +- } +-+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) { +-+ brcmf_wowlan_support.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY; +-+ brcmf_wowlan_support.flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE; +-+ } +-+ +- wiphy->wowlan = &brcmf_wowlan_support; +- #endif +- } +-@@ -6538,6 +6568,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802 +- struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev; +- struct brcmf_cfg80211_info *cfg; +- struct wiphy *wiphy; +-+ struct cfg80211_ops *ops; +- struct brcmf_cfg80211_vif *vif; +- struct brcmf_if *ifp; +- s32 err = 0; +-@@ -6549,8 +6580,17 @@ struct brcmf_cfg80211_info *brcmf_cfg802 +- return NULL; +- } +- +-+ ops = kzalloc(sizeof(*ops), GFP_KERNEL); +-+ if (!ops) +-+ return NULL; +-+ +-+ memcpy(ops, &brcmf_cfg80211_ops, sizeof(*ops)); +- ifp = netdev_priv(ndev); +-- wiphy = wiphy_new(&wl_cfg80211_ops, sizeof(struct brcmf_cfg80211_info)); +-+#ifdef CONFIG_PM +-+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) +-+ ops->set_rekey_data = brcmf_cfg80211_set_rekey_data; +-+#endif +-+ wiphy = wiphy_new(ops, sizeof(struct brcmf_cfg80211_info)); +- if (!wiphy) { +- brcmf_err("Could not allocate wiphy device\n"); +- return NULL; +-@@ -6560,6 +6600,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802 +- +- cfg = wiphy_priv(wiphy); +- cfg->wiphy = wiphy; +-+ cfg->ops = ops; +- cfg->pub = drvr; +- init_vif_event(&cfg->vif_event); +- INIT_LIST_HEAD(&cfg->vif_list); +-@@ -6686,6 +6727,7 @@ priv_out: +- ifp->vif = NULL; +- wiphy_out: +- brcmf_free_wiphy(wiphy); +-+ kfree(ops); +- return NULL; +- } +- +-@@ -6696,6 +6738,7 @@ void brcmf_cfg80211_detach(struct brcmf_ +- +- brcmf_btcoex_detach(cfg); +- wiphy_unregister(cfg->wiphy); +-+ kfree(cfg->ops); +- wl_deinit_priv(cfg); +- brcmf_free_wiphy(cfg->wiphy); +- } +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-@@ -256,6 +256,7 @@ struct brcmf_cfg80211_wowl { +- * struct brcmf_cfg80211_info - dongle private data of cfg80211 interface +- * +- * @wiphy: wiphy object for cfg80211 interface. +-+ * @ops: pointer to copy of ops as registered with wiphy object. +- * @conf: dongle configuration. +- * @p2p: peer-to-peer specific information. +- * @btcoex: Bluetooth coexistence information. +-@@ -288,6 +289,7 @@ struct brcmf_cfg80211_wowl { +- */ +- struct brcmf_cfg80211_info { +- struct wiphy *wiphy; +-+ struct cfg80211_ops *ops; +- struct brcmf_cfg80211_conf *conf; +- struct brcmf_p2p_info p2p; +- struct brcmf_btcoex_info *btcoex; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +-@@ -136,6 +136,7 @@ void brcmf_feat_attach(struct brcmf_pub +- { +- struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0); +- struct brcmf_pno_macaddr_le pfn_mac; +-+ u32 wowl_cap; +- s32 err; +- +- brcmf_feat_firmware_capabilities(ifp); +-@@ -143,6 +144,17 @@ void brcmf_feat_attach(struct brcmf_pub +- brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn"); +- if (drvr->bus_if->wowl_supported) +- brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl"); +-+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL)) { +-+ err = brcmf_fil_iovar_int_get(ifp, "wowl_cap", &wowl_cap); +-+ if (!err) { +-+ if (wowl_cap & BRCMF_WOWL_PFN_FOUND) +-+ ifp->drvr->feat_flags |= +-+ BIT(BRCMF_FEAT_WOWL_ND); +-+ if (wowl_cap & BRCMF_WOWL_GTK_FAILURE) +-+ ifp->drvr->feat_flags |= +-+ BIT(BRCMF_FEAT_WOWL_GTK); +-+ } +-+ } +- /* MBSS does not work for 43362 */ +- if (drvr->bus_if->chip == BRCM_CC_43362_CHIP_ID) +- ifp->drvr->feat_flags &= ~BIT(BRCMF_FEAT_MBSS); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h +-@@ -27,6 +27,8 @@ +- * RSDB: Real Simultaneous Dual Band +- * TDLS: Tunneled Direct Link Setup +- * SCAN_RANDOM_MAC: Random MAC during (net detect) scheduled scan. +-+ * WOWL_ND: WOWL net detect (PNO) +-+ * WOWL_GTK: (WOWL) GTK rekeying offload +- */ +- #define BRCMF_FEAT_LIST \ +- BRCMF_FEAT_DEF(MBSS) \ +-@@ -36,7 +38,9 @@ +- BRCMF_FEAT_DEF(P2P) \ +- BRCMF_FEAT_DEF(RSDB) \ +- BRCMF_FEAT_DEF(TDLS) \ +-- BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) +-+ BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) \ +-+ BRCMF_FEAT_DEF(WOWL_ND) \ +-+ BRCMF_FEAT_DEF(WOWL_GTK) +- +- /* +- * Quirks: +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +-@@ -111,7 +111,9 @@ +- /* Wakeup if received matched secured pattern: */ +- #define BRCMF_WOWL_SECURE (1 << 25) +- /* Wakeup on finding preferred network */ +--#define BRCMF_WOWL_PFN_FOUND (1 << 26) +-+#define BRCMF_WOWL_PFN_FOUND (1 << 27) +-+/* Wakeup on receiving pairwise key EAP packets: */ +-+#define WIPHY_WOWL_EAP_PK (1 << 28) +- /* Link Down indication in WoWL mode: */ +- #define BRCMF_WOWL_LINKDOWN (1 << 31) +- +-@@ -136,6 +138,10 @@ +- +- #define BRCMF_MCSSET_LEN 16 +- +-+#define BRCMF_RSN_KCK_LENGTH 16 +-+#define BRCMF_RSN_KEK_LENGTH 16 +-+#define BRCMF_RSN_REPLAY_LEN 8 +-+ +- /* join preference types for join_pref iovar */ +- enum brcmf_join_pref_types { +- BRCMF_JOIN_PREF_RSSI = 1, +-@@ -789,4 +795,17 @@ struct brcmf_pktcnt_le { +- __le32 rx_ocast_good_pkt; +- }; +- +-+/** +-+ * struct brcmf_gtk_keyinfo_le - GTP rekey data +-+ * +-+ * @kck: key confirmation key. +-+ * @kek: key encryption key. +-+ * @replay_counter: replay counter. +-+ */ +-+struct brcmf_gtk_keyinfo_le { +-+ u8 kck[BRCMF_RSN_KCK_LENGTH]; +-+ u8 kek[BRCMF_RSN_KEK_LENGTH]; +-+ u8 replay_counter[BRCMF_RSN_REPLAY_LEN]; +-+}; +-+ +- #endif /* FWIL_TYPES_H_ */ +diff --git a/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch b/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch +deleted file mode 100644 +index 2685238..0000000 +--- a/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch ++++ /dev/null +@@ -1,385 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:04 +0100 +-Subject: [PATCH] brcmfmac: move platform data retrieval code to common +- +-In preparation of module parameters for all devices the module +-platform data retrieval is moved from sdio to common. It is still +-only used for sdio devices. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-@@ -27,8 +27,6 @@ +- #include +- #include +- #include +--#include +--#include +- #include +- #include +- #include +-@@ -46,7 +44,6 @@ +- #include "bus.h" +- #include "debug.h" +- #include "sdio.h" +--#include "of.h" +- #include "core.h" +- #include "common.h" +- +-@@ -106,18 +103,18 @@ static void brcmf_sdiod_dummy_irqhandler +- +- int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev) +- { +-+ struct brcmfmac_sdio_platform_data *pdata; +- int ret = 0; +- u8 data; +- u32 addr, gpiocontrol; +- unsigned long flags; +- +-- if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) { +-+ pdata = sdiodev->pdata; +-+ if ((pdata) && (pdata->oob_irq_supported)) { +- brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n", +-- sdiodev->pdata->oob_irq_nr); +-- ret = request_irq(sdiodev->pdata->oob_irq_nr, +-- brcmf_sdiod_oob_irqhandler, +-- sdiodev->pdata->oob_irq_flags, +-- "brcmf_oob_intr", +-+ pdata->oob_irq_nr); +-+ ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler, +-+ pdata->oob_irq_flags, "brcmf_oob_intr", +- &sdiodev->func[1]->dev); +- if (ret != 0) { +- brcmf_err("request_irq failed %d\n", ret); +-@@ -129,7 +126,7 @@ int brcmf_sdiod_intr_register(struct brc +- sdiodev->irq_en = true; +- spin_unlock_irqrestore(&sdiodev->irq_en_lock, flags); +- +-- ret = enable_irq_wake(sdiodev->pdata->oob_irq_nr); +-+ ret = enable_irq_wake(pdata->oob_irq_nr); +- if (ret != 0) { +- brcmf_err("enable_irq_wake failed %d\n", ret); +- return ret; +-@@ -158,7 +155,7 @@ int brcmf_sdiod_intr_register(struct brc +- +- /* redirect, configure and enable io for interrupt signal */ +- data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE; +-- if (sdiodev->pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) +-+ if (pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) +- data |= SDIO_SEPINT_ACT_HI; +- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret); +- +-@@ -176,9 +173,12 @@ int brcmf_sdiod_intr_register(struct brc +- +- int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev) +- { +-+ struct brcmfmac_sdio_platform_data *pdata; +-+ +- brcmf_dbg(SDIO, "Entering\n"); +- +-- if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) { +-+ pdata = sdiodev->pdata; +-+ if ((pdata) && (pdata->oob_irq_supported)) { +- sdio_claim_host(sdiodev->func[1]); +- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL); +- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL); +-@@ -187,11 +187,10 @@ int brcmf_sdiod_intr_unregister(struct b +- if (sdiodev->oob_irq_requested) { +- sdiodev->oob_irq_requested = false; +- if (sdiodev->irq_wake) { +-- disable_irq_wake(sdiodev->pdata->oob_irq_nr); +-+ disable_irq_wake(pdata->oob_irq_nr); +- sdiodev->irq_wake = false; +- } +-- free_irq(sdiodev->pdata->oob_irq_nr, +-- &sdiodev->func[1]->dev); +-+ free_irq(pdata->oob_irq_nr, &sdiodev->func[1]->dev); +- sdiodev->irq_en = false; +- } +- } else { +-@@ -1103,8 +1102,6 @@ static const struct sdio_device_id brcmf +- }; +- MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids); +- +--static struct brcmfmac_sdio_platform_data *brcmfmac_sdio_pdata; +-- +- +- static void brcmf_sdiod_acpi_set_power_manageable(struct device *dev, +- int val) +-@@ -1167,10 +1164,7 @@ static int brcmf_ops_sdio_probe(struct s +- dev_set_drvdata(&func->dev, bus_if); +- dev_set_drvdata(&sdiodev->func[1]->dev, bus_if); +- sdiodev->dev = &sdiodev->func[1]->dev; +-- sdiodev->pdata = brcmfmac_sdio_pdata; +-- +-- if (!sdiodev->pdata) +-- brcmf_of_probe(sdiodev); +-+ sdiodev->pdata = brcmf_get_module_param(sdiodev->dev); +- +- #ifdef CONFIG_PM_SLEEP +- /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ +-@@ -1296,7 +1290,7 @@ static const struct dev_pm_ops brcmf_sdi +- static struct sdio_driver brcmf_sdmmc_driver = { +- .probe = brcmf_ops_sdio_probe, +- .remove = brcmf_ops_sdio_remove, +-- .name = BRCMFMAC_SDIO_PDATA_NAME, +-+ .name = KBUILD_MODNAME, +- .id_table = brcmf_sdmmc_ids, +- .drv = { +- .owner = THIS_MODULE, +-@@ -1306,37 +1300,6 @@ static struct sdio_driver brcmf_sdmmc_dr +- }, +- }; +- +--static int __init brcmf_sdio_pd_probe(struct platform_device *pdev) +--{ +-- brcmf_dbg(SDIO, "Enter\n"); +-- +-- brcmfmac_sdio_pdata = dev_get_platdata(&pdev->dev); +-- +-- if (brcmfmac_sdio_pdata->power_on) +-- brcmfmac_sdio_pdata->power_on(); +-- +-- return 0; +--} +-- +--static int brcmf_sdio_pd_remove(struct platform_device *pdev) +--{ +-- brcmf_dbg(SDIO, "Enter\n"); +-- +-- if (brcmfmac_sdio_pdata->power_off) +-- brcmfmac_sdio_pdata->power_off(); +-- +-- sdio_unregister_driver(&brcmf_sdmmc_driver); +-- +-- return 0; +--} +-- +--static struct platform_driver brcmf_sdio_pd = { +-- .remove = brcmf_sdio_pd_remove, +-- .driver = { +-- .name = BRCMFMAC_SDIO_PDATA_NAME, +-- } +--}; +-- +- void brcmf_sdio_register(void) +- { +- int ret; +-@@ -1350,19 +1313,6 @@ void brcmf_sdio_exit(void) +- { +- brcmf_dbg(SDIO, "Enter\n"); +- +-- if (brcmfmac_sdio_pdata) +-- platform_driver_unregister(&brcmf_sdio_pd); +-- else +-- sdio_unregister_driver(&brcmf_sdmmc_driver); +-+ sdio_unregister_driver(&brcmf_sdmmc_driver); +- } +- +--void __init brcmf_sdio_init(void) +--{ +-- int ret; +-- +-- brcmf_dbg(SDIO, "Enter\n"); +-- +-- ret = platform_driver_probe(&brcmf_sdio_pd, brcmf_sdio_pd_probe); +-- if (ret == -ENODEV) +-- brcmf_dbg(SDIO, "No platform data available.\n"); +--} +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-@@ -27,6 +27,7 @@ +- #include "fwil_types.h" +- #include "tracepoint.h" +- #include "common.h" +-+#include "of.h" +- +- MODULE_AUTHOR("Broadcom Corporation"); +- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); +-@@ -79,6 +80,7 @@ module_param_named(ignore_probe_fail, br +- MODULE_PARM_DESC(ignore_probe_fail, "always succeed probe for debugging"); +- #endif +- +-+static struct brcmfmac_sdio_platform_data *brcmfmac_pdata; +- struct brcmf_mp_global_t brcmf_mp_global; +- +- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) +-@@ -231,6 +233,13 @@ static void brcmf_mp_attach(void) +- BRCMF_FW_ALTPATH_LEN); +- } +- +-+struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev) +-+{ +-+ if (!brcmfmac_pdata) +-+ brcmf_of_probe(dev, &brcmfmac_pdata); +-+ return brcmfmac_pdata; +-+} +-+ +- int brcmf_mp_device_attach(struct brcmf_pub *drvr) +- { +- drvr->settings = kzalloc(sizeof(*drvr->settings), GFP_ATOMIC); +-@@ -253,6 +262,35 @@ void brcmf_mp_device_detach(struct brcmf +- kfree(drvr->settings); +- } +- +-+static int __init brcmf_common_pd_probe(struct platform_device *pdev) +-+{ +-+ brcmf_dbg(INFO, "Enter\n"); +-+ +-+ brcmfmac_pdata = dev_get_platdata(&pdev->dev); +-+ +-+ if (brcmfmac_pdata->power_on) +-+ brcmfmac_pdata->power_on(); +-+ +-+ return 0; +-+} +-+ +-+static int brcmf_common_pd_remove(struct platform_device *pdev) +-+{ +-+ brcmf_dbg(INFO, "Enter\n"); +-+ +-+ if (brcmfmac_pdata->power_off) +-+ brcmfmac_pdata->power_off(); +-+ +-+ return 0; +-+} +-+ +-+static struct platform_driver brcmf_pd = { +-+ .remove = brcmf_common_pd_remove, +-+ .driver = { +-+ .name = BRCMFMAC_SDIO_PDATA_NAME, +-+ } +-+}; +-+ +- static int __init brcmfmac_module_init(void) +- { +- int err; +-@@ -260,16 +298,21 @@ static int __init brcmfmac_module_init(v +- /* Initialize debug system first */ +- brcmf_debugfs_init(); +- +--#ifdef CPTCFG_BRCMFMAC_SDIO +-- brcmf_sdio_init(); +--#endif +-+ /* Get the platform data (if available) for our devices */ +-+ err = platform_driver_probe(&brcmf_pd, brcmf_common_pd_probe); +-+ if (err == -ENODEV) +-+ brcmf_dbg(INFO, "No platform data available.\n"); +-+ +- /* Initialize global module paramaters */ +- brcmf_mp_attach(); +- +- /* Continue the initialization by registering the different busses */ +- err = brcmf_core_init(); +-- if (err) +-+ if (err) { +- brcmf_debugfs_exit(); +-+ if (brcmfmac_pdata) +-+ platform_driver_unregister(&brcmf_pd); +-+ } +- +- return err; +- } +-@@ -277,6 +320,8 @@ static int __init brcmfmac_module_init(v +- static void __exit brcmfmac_module_exit(void) +- { +- brcmf_core_exit(); +-+ if (brcmfmac_pdata) +-+ platform_driver_unregister(&brcmf_pd); +- brcmf_debugfs_exit(); +- } +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-@@ -15,6 +15,8 @@ +- #ifndef BRCMFMAC_COMMON_H +- #define BRCMFMAC_COMMON_H +- +-+#include +-+#include +- #include "fwil_types.h" +- +- extern const u8 ALLFFMAC[ETH_ALEN]; +-@@ -89,6 +91,7 @@ struct brcmf_mp_device { +- struct cc_translate *country_codes; +- }; +- +-+struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev); +- int brcmf_mp_device_attach(struct brcmf_pub *drvr); +- void brcmf_mp_device_detach(struct brcmf_pub *drvr); +- #ifdef DEBUG +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +-@@ -16,17 +16,16 @@ +- #include +- #include +- #include +--#include +--#include +--#include +- +- #include +- #include "debug.h" +--#include "sdio.h" +-+#include "core.h" +-+#include "common.h" +-+#include "of.h" +- +--void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev) +-+void +-+brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio) +- { +-- struct device *dev = sdiodev->dev; +- struct device_node *np = dev->of_node; +- int irq; +- u32 irqf; +-@@ -35,12 +34,12 @@ void brcmf_of_probe(struct brcmf_sdio_de +- if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac")) +- return; +- +-- sdiodev->pdata = devm_kzalloc(dev, sizeof(*sdiodev->pdata), GFP_KERNEL); +-- if (!sdiodev->pdata) +-+ *sdio = devm_kzalloc(dev, sizeof(*sdio), GFP_KERNEL); +-+ if (!(*sdio)) +- return; +- +- if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0) +-- sdiodev->pdata->drive_strength = val; +-+ (*sdio)->drive_strength = val; +- +- /* make sure there are interrupts defined in the node */ +- if (!of_find_property(np, "interrupts", NULL)) +-@@ -53,7 +52,7 @@ void brcmf_of_probe(struct brcmf_sdio_de +- } +- irqf = irqd_get_trigger_type(irq_get_irq_data(irq)); +- +-- sdiodev->pdata->oob_irq_supported = true; +-- sdiodev->pdata->oob_irq_nr = irq; +-- sdiodev->pdata->oob_irq_flags = irqf; +-+ (*sdio)->oob_irq_supported = true; +-+ (*sdio)->oob_irq_nr = irq; +-+ (*sdio)->oob_irq_flags = irqf; +- } +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h +-@@ -14,9 +14,11 @@ +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +- */ +- #ifdef CONFIG_OF +--void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev); +-+void +-+brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio); +- #else +--static void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev) +-+static void brcmf_of_probe(struct device *dev, +-+ struct brcmfmac_sdio_platform_data **sdio) +- { +- } +- #endif /* CONFIG_OF */ +diff --git a/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch b/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch +deleted file mode 100644 +index 4e789cf..0000000 +--- a/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch ++++ /dev/null +@@ -1,69 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:05 +0100 +-Subject: [PATCH] brcmfmac: keep ARP and ND offload enabled during WOWL +- +-Currently ARP and ND (IPv6 Neigbor Discovery) offload get disabled +-on entering suspend. However when firmwares support the wowl_cap +-iovar then these offload routines can be kept enabled as they +-will work during WOWL as well. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -3556,7 +3556,8 @@ static s32 brcmf_cfg80211_resume(struct +- brcmf_report_wowl_wakeind(wiphy, ifp); +- brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0); +- brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0); +-- brcmf_configure_arp_nd_offload(ifp, true); +-+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND)) +-+ brcmf_configure_arp_nd_offload(ifp, true); +- brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, +- cfg->wowl.pre_pmmode); +- cfg->wowl.active = false; +-@@ -3580,7 +3581,8 @@ static void brcmf_configure_wowl(struct +- +- brcmf_dbg(TRACE, "Suspend, wowl config.\n"); +- +-- brcmf_configure_arp_nd_offload(ifp, false); +-+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND)) +-+ brcmf_configure_arp_nd_offload(ifp, false); +- brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode); +- brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, PM_MAX); +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +-@@ -147,6 +147,7 @@ void brcmf_feat_attach(struct brcmf_pub +- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL)) { +- err = brcmf_fil_iovar_int_get(ifp, "wowl_cap", &wowl_cap); +- if (!err) { +-+ ifp->drvr->feat_flags |= BIT(BRCMF_FEAT_WOWL_ARP_ND); +- if (wowl_cap & BRCMF_WOWL_PFN_FOUND) +- ifp->drvr->feat_flags |= +- BIT(BRCMF_FEAT_WOWL_ND); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h +-@@ -29,6 +29,7 @@ +- * SCAN_RANDOM_MAC: Random MAC during (net detect) scheduled scan. +- * WOWL_ND: WOWL net detect (PNO) +- * WOWL_GTK: (WOWL) GTK rekeying offload +-+ * WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL. +- */ +- #define BRCMF_FEAT_LIST \ +- BRCMF_FEAT_DEF(MBSS) \ +-@@ -40,7 +41,8 @@ +- BRCMF_FEAT_DEF(TDLS) \ +- BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) \ +- BRCMF_FEAT_DEF(WOWL_ND) \ +-- BRCMF_FEAT_DEF(WOWL_GTK) +-+ BRCMF_FEAT_DEF(WOWL_GTK) \ +-+ BRCMF_FEAT_DEF(WOWL_ARP_ND) +- +- /* +- * Quirks: +diff --git a/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch b/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch +deleted file mode 100644 +index 37b6855..0000000 +--- a/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch ++++ /dev/null +@@ -1,734 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:07 +0100 +-Subject: [PATCH] brcmfmac: switch to new platform data +- +-Platform data is only available for sdio. With this patch a new +-platform data structure is being used which allows for platform +-data for any device and configurable per device. This patch only +-switches to the new structure and adds support for SDIO devices. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-@@ -103,7 +103,7 @@ static void brcmf_sdiod_dummy_irqhandler +- +- int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev) +- { +-- struct brcmfmac_sdio_platform_data *pdata; +-+ struct brcmfmac_sdio_pd *pdata; +- int ret = 0; +- u8 data; +- u32 addr, gpiocontrol; +-@@ -173,7 +173,7 @@ int brcmf_sdiod_intr_register(struct brc +- +- int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev) +- { +-- struct brcmfmac_sdio_platform_data *pdata; +-+ struct brcmfmac_sdio_pd *pdata; +- +- brcmf_dbg(SDIO, "Entering\n"); +- +-@@ -1164,17 +1164,6 @@ static int brcmf_ops_sdio_probe(struct s +- dev_set_drvdata(&func->dev, bus_if); +- dev_set_drvdata(&sdiodev->func[1]->dev, bus_if); +- sdiodev->dev = &sdiodev->func[1]->dev; +-- sdiodev->pdata = brcmf_get_module_param(sdiodev->dev); +-- +--#ifdef CONFIG_PM_SLEEP +-- /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ +-- * is true or when platform data OOB irq is true). +-- */ +-- if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) && +-- ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) || +-- (sdiodev->pdata && sdiodev->pdata->oob_irq_supported))) +-- bus_if->wowl_supported = true; +--#endif +- +- brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN); +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -6459,8 +6459,8 @@ int brcmf_cfg80211_wait_vif_event(struct +- static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], +- struct brcmf_fil_country_le *ccreq) +- { +-- struct cc_translate *country_codes; +-- struct cc_entry *cc; +-+ struct brcmfmac_pd_cc *country_codes; +-+ struct brcmfmac_pd_cc_entry *cc; +- s32 found_index; +- int i; +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-@@ -80,7 +80,7 @@ module_param_named(ignore_probe_fail, br +- MODULE_PARM_DESC(ignore_probe_fail, "always succeed probe for debugging"); +- #endif +- +--static struct brcmfmac_sdio_platform_data *brcmfmac_pdata; +-+static struct brcmfmac_platform_data *brcmfmac_pdata; +- struct brcmf_mp_global_t brcmf_mp_global; +- +- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) +-@@ -229,15 +229,46 @@ void __brcmf_dbg(u32 level, const char * +- +- static void brcmf_mp_attach(void) +- { +-+ /* If module param firmware path is set then this will always be used, +-+ * if not set then if available use the platform data version. To make +-+ * sure it gets initialized at all, always copy the module param version +-+ */ +- strlcpy(brcmf_mp_global.firmware_path, brcmf_firmware_path, +- BRCMF_FW_ALTPATH_LEN); +-+ if ((brcmfmac_pdata) && (brcmfmac_pdata->fw_alternative_path) && +-+ (brcmf_mp_global.firmware_path[0] == '\0')) { +-+ strlcpy(brcmf_mp_global.firmware_path, +-+ brcmfmac_pdata->fw_alternative_path, +-+ BRCMF_FW_ALTPATH_LEN); +-+ } +- } +- +--struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev) +--{ +-- if (!brcmfmac_pdata) +-- brcmf_of_probe(dev, &brcmfmac_pdata); +-- return brcmfmac_pdata; +-+struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev, +-+ enum brcmf_bus_type bus_type, +-+ u32 chip, u32 chiprev) +-+{ +-+ struct brcmfmac_sdio_pd *pdata; +-+ struct brcmfmac_pd_device *device_pd; +-+ int i; +-+ +-+ if (brcmfmac_pdata) { +-+ for (i = 0; i < brcmfmac_pdata->device_count; i++) { +-+ device_pd = &brcmfmac_pdata->devices[i]; +-+ if ((device_pd->bus_type == bus_type) && +-+ (device_pd->id == chip) && +-+ ((device_pd->rev == chiprev) || +-+ (device_pd->rev == -1))) { +-+ brcmf_dbg(INFO, "Platform data for device found\n"); +-+ if (device_pd->bus_type == BRCMF_BUSTYPE_SDIO) +-+ return &device_pd->bus.sdio; +-+ break; +-+ } +-+ } +-+ } +-+ pdata = NULL; +-+ brcmf_of_probe(dev, &pdata); +-+ +-+ return pdata; +- } +- +- int brcmf_mp_device_attach(struct brcmf_pub *drvr) +-@@ -287,7 +318,7 @@ static int brcmf_common_pd_remove(struct +- static struct platform_driver brcmf_pd = { +- .remove = brcmf_common_pd_remove, +- .driver = { +-- .name = BRCMFMAC_SDIO_PDATA_NAME, +-+ .name = BRCMFMAC_PDATA_NAME, +- } +- }; +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-@@ -16,7 +16,7 @@ +- #define BRCMFMAC_COMMON_H +- +- #include +--#include +-+#include +- #include "fwil_types.h" +- +- extern const u8 ALLFFMAC[ETH_ALEN]; +-@@ -43,33 +43,6 @@ struct brcmf_mp_global_t { +- extern struct brcmf_mp_global_t brcmf_mp_global; +- +- /** +-- * struct cc_entry - Struct for translating user space country code (iso3166) to +-- * firmware country code and revision. +-- * +-- * @iso3166: iso3166 alpha 2 country code string. +-- * @cc: firmware country code string. +-- * @rev: firmware country code revision. +-- */ +--struct cc_entry { +-- char iso3166[BRCMF_COUNTRY_BUF_SZ]; +-- char cc[BRCMF_COUNTRY_BUF_SZ]; +-- s32 rev; +--}; +-- +--/** +-- * struct cc_translate - Struct for translating country codes as set by user +-- * space to a country code and rev which can be used by +-- * firmware. +-- * +-- * @table_size: number of entries in table (> 0) +-- * @table: dynamic array of 1 or more elements with translation information. +-- */ +--struct cc_translate { +-- int table_size; +-- struct cc_entry table[0]; +--}; +-- +--/** +- * struct brcmf_mp_device - Device module paramaters. +- * +- * @sdiod_txglomsz: SDIO txglom size. +-@@ -88,10 +61,12 @@ struct brcmf_mp_device { +- int fcmode; +- bool roamoff; +- bool ignore_probe_fail; +-- struct cc_translate *country_codes; +-+ struct brcmfmac_pd_cc *country_codes; +- }; +- +--struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev); +-+struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev, +-+ enum brcmf_bus_type bus_type, +-+ u32 chip, u32 chiprev); +- int brcmf_mp_device_attach(struct brcmf_pub *drvr); +- void brcmf_mp_device_detach(struct brcmf_pub *drvr); +- #ifdef DEBUG +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +-@@ -23,8 +23,7 @@ +- #include "common.h" +- #include "of.h" +- +--void +--brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio) +-+void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio) +- { +- struct device_node *np = dev->of_node; +- int irq; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h +-@@ -15,10 +15,9 @@ +- */ +- #ifdef CONFIG_OF +- void +--brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio); +-+brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio); +- #else +--static void brcmf_of_probe(struct device *dev, +-- struct brcmfmac_sdio_platform_data **sdio) +-+static void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio) +- { +- } +- #endif /* CONFIG_OF */ +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-@@ -33,8 +33,6 @@ +- #include +- #include +- #include +--#include +--#include +- #include +- #include +- #include +-@@ -44,6 +42,8 @@ +- #include "sdio.h" +- #include "chip.h" +- #include "firmware.h" +-+#include "core.h" +-+#include "common.h" +- +- #define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500) +- #define CTL_DONE_TIMEOUT msecs_to_jiffies(2500) +-@@ -3775,26 +3775,28 @@ static const struct brcmf_buscore_ops br +- static bool +- brcmf_sdio_probe_attach(struct brcmf_sdio *bus) +- { +-+ struct brcmf_sdio_dev *sdiodev; +- u8 clkctl = 0; +- int err = 0; +- int reg_addr; +- u32 reg_val; +- u32 drivestrength; +- +-- sdio_claim_host(bus->sdiodev->func[1]); +-+ sdiodev = bus->sdiodev; +-+ sdio_claim_host(sdiodev->func[1]); +- +- pr_debug("F1 signature read @0x18000000=0x%4x\n", +-- brcmf_sdiod_regrl(bus->sdiodev, SI_ENUM_BASE, NULL)); +-+ brcmf_sdiod_regrl(sdiodev, SI_ENUM_BASE, NULL)); +- +- /* +- * Force PLL off until brcmf_chip_attach() +- * programs PLL control regs +- */ +- +-- brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, +-+ brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, +- BRCMF_INIT_CLKCTL1, &err); +- if (!err) +-- clkctl = brcmf_sdiod_regrb(bus->sdiodev, +-+ clkctl = brcmf_sdiod_regrb(sdiodev, +- SBSDIO_FUNC1_CHIPCLKCSR, &err); +- +- if (err || ((clkctl & ~SBSDIO_AVBITS) != BRCMF_INIT_CLKCTL1)) { +-@@ -3803,50 +3805,77 @@ brcmf_sdio_probe_attach(struct brcmf_sdi +- goto fail; +- } +- +-- bus->ci = brcmf_chip_attach(bus->sdiodev, &brcmf_sdio_buscore_ops); +-+ bus->ci = brcmf_chip_attach(sdiodev, &brcmf_sdio_buscore_ops); +- if (IS_ERR(bus->ci)) { +- brcmf_err("brcmf_chip_attach failed!\n"); +- bus->ci = NULL; +- goto fail; +- } +-+ sdiodev->pdata = brcmf_get_module_param(sdiodev->dev, +-+ BRCMF_BUSTYPE_SDIO, +-+ bus->ci->chip, +-+ bus->ci->chiprev); +-+ /* platform specific configuration: +-+ * alignments must be at least 4 bytes for ADMA +-+ */ +-+ bus->head_align = ALIGNMENT; +-+ bus->sgentry_align = ALIGNMENT; +-+ if (sdiodev->pdata) { +-+ if (sdiodev->pdata->sd_head_align > ALIGNMENT) +-+ bus->head_align = sdiodev->pdata->sd_head_align; +-+ if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT) +-+ bus->sgentry_align = sdiodev->pdata->sd_sgentry_align; +-+ } +-+ /* allocate scatter-gather table. sg support +-+ * will be disabled upon allocation failure. +-+ */ +-+ brcmf_sdiod_sgtable_alloc(sdiodev); +-+ +-+#ifdef CONFIG_PM_SLEEP +-+ /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ +-+ * is true or when platform data OOB irq is true). +-+ */ +-+ if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) && +-+ ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) || +-+ (sdiodev->pdata && sdiodev->pdata->oob_irq_supported))) +-+ sdiodev->bus_if->wowl_supported = true; +-+#endif +- +- if (brcmf_sdio_kso_init(bus)) { +- brcmf_err("error enabling KSO\n"); +- goto fail; +- } +- +-- if ((bus->sdiodev->pdata) && (bus->sdiodev->pdata->drive_strength)) +-- drivestrength = bus->sdiodev->pdata->drive_strength; +-+ if ((sdiodev->pdata) && (sdiodev->pdata->drive_strength)) +-+ drivestrength = sdiodev->pdata->drive_strength; +- else +- drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH; +-- brcmf_sdio_drivestrengthinit(bus->sdiodev, bus->ci, drivestrength); +-+ brcmf_sdio_drivestrengthinit(sdiodev, bus->ci, drivestrength); +- +- /* Set card control so an SDIO card reset does a WLAN backplane reset */ +-- reg_val = brcmf_sdiod_regrb(bus->sdiodev, +-- SDIO_CCCR_BRCM_CARDCTRL, &err); +-+ reg_val = brcmf_sdiod_regrb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, &err); +- if (err) +- goto fail; +- +- reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET; +- +-- brcmf_sdiod_regwb(bus->sdiodev, +-- SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err); +-+ brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err); +- if (err) +- goto fail; +- +- /* set PMUControl so a backplane reset does PMU state reload */ +- reg_addr = CORE_CC_REG(brcmf_chip_get_pmu(bus->ci)->base, pmucontrol); +-- reg_val = brcmf_sdiod_regrl(bus->sdiodev, reg_addr, &err); +-+ reg_val = brcmf_sdiod_regrl(sdiodev, reg_addr, &err); +- if (err) +- goto fail; +- +- reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT); +- +-- brcmf_sdiod_regwl(bus->sdiodev, reg_addr, reg_val, &err); +-+ brcmf_sdiod_regwl(sdiodev, reg_addr, reg_val, &err); +- if (err) +- goto fail; +- +-- sdio_release_host(bus->sdiodev->func[1]); +-+ sdio_release_host(sdiodev->func[1]); +- +- brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN); +- +-@@ -3867,7 +3896,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi +- return true; +- +- fail: +-- sdio_release_host(bus->sdiodev->func[1]); +-+ sdio_release_host(sdiodev->func[1]); +- return false; +- } +- +-@@ -4045,18 +4074,6 @@ struct brcmf_sdio *brcmf_sdio_probe(stru +- bus->txminmax = BRCMF_TXMINMAX; +- bus->tx_seq = SDPCM_SEQ_WRAP - 1; +- +-- /* platform specific configuration: +-- * alignments must be at least 4 bytes for ADMA +-- */ +-- bus->head_align = ALIGNMENT; +-- bus->sgentry_align = ALIGNMENT; +-- if (sdiodev->pdata) { +-- if (sdiodev->pdata->sd_head_align > ALIGNMENT) +-- bus->head_align = sdiodev->pdata->sd_head_align; +-- if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT) +-- bus->sgentry_align = sdiodev->pdata->sd_sgentry_align; +-- } +-- +- /* single-threaded workqueue */ +- wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM, +- dev_name(&sdiodev->func[1]->dev)); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +-@@ -184,7 +184,7 @@ struct brcmf_sdio_dev { +- struct brcmf_sdio *bus; +- struct device *dev; +- struct brcmf_bus *bus_if; +-- struct brcmfmac_sdio_platform_data *pdata; +-+ struct brcmfmac_sdio_pd *pdata; +- bool oob_irq_requested; +- bool irq_en; /* irq enable flags */ +- spinlock_t irq_en_lock; +---- a/include/linux/platform_data/brcmfmac-sdio.h +-+++ /dev/null +-@@ -1,135 +0,0 @@ +--/* +-- * Copyright (c) 2013 Broadcom Corporation +-- * +-- * Permission to use, copy, modify, and/or distribute this software for any +-- * purpose with or without fee is hereby granted, provided that the above +-- * copyright notice and this permission notice appear in all copies. +-- * +-- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +-- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +-- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +-- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +-- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +-- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +-- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-- */ +-- +--#ifndef _LINUX_BRCMFMAC_PLATFORM_H +--#define _LINUX_BRCMFMAC_PLATFORM_H +-- +--/* +-- * Platform specific driver functions and data. Through the platform specific +-- * device data functions can be provided to help the brcmfmac driver to +-- * operate with the device in combination with the used platform. +-- * +-- * Use the platform data in the following (similar) way: +-- * +-- * +--#include +-- +-- +--static void brcmfmac_power_on(void) +--{ +--} +-- +--static void brcmfmac_power_off(void) +--{ +--} +-- +--static void brcmfmac_reset(void) +--{ +--} +-- +--static struct brcmfmac_sdio_platform_data brcmfmac_sdio_pdata = { +-- .power_on = brcmfmac_power_on, +-- .power_off = brcmfmac_power_off, +-- .reset = brcmfmac_reset +--}; +-- +--static struct platform_device brcmfmac_device = { +-- .name = BRCMFMAC_SDIO_PDATA_NAME, +-- .id = PLATFORM_DEVID_NONE, +-- .dev.platform_data = &brcmfmac_sdio_pdata +--}; +-- +--void __init brcmfmac_init_pdata(void) +--{ +-- brcmfmac_sdio_pdata.oob_irq_supported = true; +-- brcmfmac_sdio_pdata.oob_irq_nr = gpio_to_irq(GPIO_BRCMF_SDIO_OOB); +-- brcmfmac_sdio_pdata.oob_irq_flags = IORESOURCE_IRQ | +-- IORESOURCE_IRQ_HIGHLEVEL; +-- platform_device_register(&brcmfmac_device); +--} +-- * +-- * +-- * Note: the brcmfmac can be loaded as module or be statically built-in into +-- * the kernel. If built-in then do note that it uses module_init (and +-- * module_exit) routines which equal device_initcall. So if you intend to +-- * create a module with the platform specific data for the brcmfmac and have +-- * it built-in to the kernel then use a higher initcall then device_initcall +-- * (see init.h). If this is not done then brcmfmac will load without problems +-- * but will not pickup the platform data. +-- * +-- * When the driver does not "detect" platform driver data then it will continue +-- * without reporting anything and just assume there is no data needed. Which is +-- * probably true for most platforms. +-- * +-- * Explanation of the platform_data fields: +-- * +-- * drive_strength: is the preferred drive_strength to be used for the SDIO +-- * pins. If 0 then a default value will be used. This is the target drive +-- * strength, the exact drive strength which will be used depends on the +-- * capabilities of the device. +-- * +-- * oob_irq_supported: does the board have support for OOB interrupts. SDIO +-- * in-band interrupts are relatively slow and for having less overhead on +-- * interrupt processing an out of band interrupt can be used. If the HW +-- * supports this then enable this by setting this field to true and configure +-- * the oob related fields. +-- * +-- * oob_irq_nr, oob_irq_flags: the OOB interrupt information. The values are +-- * used for registering the irq using request_irq function. +-- * +-- * broken_sg_support: flag for broken sg list support of SDIO host controller. +-- * Set this to true if the SDIO host controller has higher align requirement +-- * than 32 bytes for each scatterlist item. +-- * +-- * sd_head_align: alignment requirement for start of data buffer +-- * +-- * sd_sgentry_align: length alignment requirement for each sg entry +-- * +-- * power_on: This function is called by the brcmfmac when the module gets +-- * loaded. This can be particularly useful for low power devices. The platform +-- * spcific routine may for example decide to power up the complete device. +-- * If there is no use-case for this function then provide NULL. +-- * +-- * power_off: This function is called by the brcmfmac when the module gets +-- * unloaded. At this point the device can be powered down or otherwise be reset. +-- * So if an actual power_off is not supported but reset is then reset the device +-- * when this function gets called. This can be particularly useful for low power +-- * devices. If there is no use-case for this function (either power-down or +-- * reset) then provide NULL. +-- * +-- * reset: This function can get called if the device communication broke down. +-- * This functionality is particularly useful in case of SDIO type devices. It is +-- * possible to reset a dongle via sdio data interface, but it requires that +-- * this is fully functional. This function is chip/module specific and this +-- * function should return only after the complete reset has completed. +-- */ +-- +--#define BRCMFMAC_SDIO_PDATA_NAME "brcmfmac_sdio" +-- +--struct brcmfmac_sdio_platform_data { +-- unsigned int drive_strength; +-- bool oob_irq_supported; +-- unsigned int oob_irq_nr; +-- unsigned long oob_irq_flags; +-- bool broken_sg_support; +-- unsigned short sd_head_align; +-- unsigned short sd_sgentry_align; +-- void (*power_on)(void); +-- void (*power_off)(void); +-- void (*reset)(void); +--}; +-- +--#endif /* _LINUX_BRCMFMAC_PLATFORM_H */ +---- /dev/null +-+++ b/include/linux/platform_data/brcmfmac.h +-@@ -0,0 +1,185 @@ +-+/* +-+ * Copyright (c) 201 Broadcom Corporation +-+ * +-+ * Permission to use, copy, modify, and/or distribute this software for any +-+ * purpose with or without fee is hereby granted, provided that the above +-+ * copyright notice and this permission notice appear in all copies. +-+ * +-+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +-+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +-+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +-+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +-+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +-+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +-+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +-+ */ +-+ +-+#ifndef _LINUX_BRCMFMAC_PLATFORM_H +-+#define _LINUX_BRCMFMAC_PLATFORM_H +-+ +-+ +-+#define BRCMFMAC_PDATA_NAME "brcmfmac" +-+ +-+#define BRCMFMAC_COUNTRY_BUF_SZ 4 +-+ +-+ +-+/* +-+ * Platform specific driver functions and data. Through the platform specific +-+ * device data functions and data can be provided to help the brcmfmac driver to +-+ * operate with the device in combination with the used platform. +-+ */ +-+ +-+ +-+/** +-+ * Note: the brcmfmac can be loaded as module or be statically built-in into +-+ * the kernel. If built-in then do note that it uses module_init (and +-+ * module_exit) routines which equal device_initcall. So if you intend to +-+ * create a module with the platform specific data for the brcmfmac and have +-+ * it built-in to the kernel then use a higher initcall then device_initcall +-+ * (see init.h). If this is not done then brcmfmac will load without problems +-+ * but will not pickup the platform data. +-+ * +-+ * When the driver does not "detect" platform driver data then it will continue +-+ * without reporting anything and just assume there is no data needed. Which is +-+ * probably true for most platforms. +-+ */ +-+ +-+/** +-+ * enum brcmf_bus_type - Bus type identifier. Currently SDIO, USB and PCIE are +-+ * supported. +-+ */ +-+enum brcmf_bus_type { +-+ BRCMF_BUSTYPE_SDIO, +-+ BRCMF_BUSTYPE_USB, +-+ BRCMF_BUSTYPE_PCIE +-+}; +-+ +-+ +-+/** +-+ * struct brcmfmac_sdio_pd - SDIO Device specific platform data. +-+ * +-+ * @txglomsz: SDIO txglom size. Use 0 if default of driver is to be +-+ * used. +-+ * @drive_strength: is the preferred drive_strength to be used for the SDIO +-+ * pins. If 0 then a default value will be used. This is +-+ * the target drive strength, the exact drive strength +-+ * which will be used depends on the capabilities of the +-+ * device. +-+ * @oob_irq_supported: does the board have support for OOB interrupts. SDIO +-+ * in-band interrupts are relatively slow and for having +-+ * less overhead on interrupt processing an out of band +-+ * interrupt can be used. If the HW supports this then +-+ * enable this by setting this field to true and configure +-+ * the oob related fields. +-+ * @oob_irq_nr, +-+ * @oob_irq_flags: the OOB interrupt information. The values are used for +-+ * registering the irq using request_irq function. +-+ * @broken_sg_support: flag for broken sg list support of SDIO host controller. +-+ * Set this to true if the SDIO host controller has higher +-+ * align requirement than 32 bytes for each scatterlist +-+ * item. +-+ * @sd_head_align: alignment requirement for start of data buffer. +-+ * @sd_sgentry_align: length alignment requirement for each sg entry. +-+ * @reset: This function can get called if the device communication +-+ * broke down. This functionality is particularly useful in +-+ * case of SDIO type devices. It is possible to reset a +-+ * dongle via sdio data interface, but it requires that +-+ * this is fully functional. This function is chip/module +-+ * specific and this function should return only after the +-+ * complete reset has completed. +-+ */ +-+struct brcmfmac_sdio_pd { +-+ int txglomsz; +-+ unsigned int drive_strength; +-+ bool oob_irq_supported; +-+ unsigned int oob_irq_nr; +-+ unsigned long oob_irq_flags; +-+ bool broken_sg_support; +-+ unsigned short sd_head_align; +-+ unsigned short sd_sgentry_align; +-+ void (*reset)(void); +-+}; +-+ +-+/** +-+ * struct brcmfmac_pd_cc_entry - Struct for translating user space country code +-+ * (iso3166) to firmware country code and +-+ * revision. +-+ * +-+ * @iso3166: iso3166 alpha 2 country code string. +-+ * @cc: firmware country code string. +-+ * @rev: firmware country code revision. +-+ */ +-+struct brcmfmac_pd_cc_entry { +-+ char iso3166[BRCMFMAC_COUNTRY_BUF_SZ]; +-+ char cc[BRCMFMAC_COUNTRY_BUF_SZ]; +-+ s32 rev; +-+}; +-+ +-+/** +-+ * struct brcmfmac_pd_cc - Struct for translating country codes as set by user +-+ * space to a country code and rev which can be used by +-+ * firmware. +-+ * +-+ * @table_size: number of entries in table (> 0) +-+ * @table: array of 1 or more elements with translation information. +-+ */ +-+struct brcmfmac_pd_cc { +-+ int table_size; +-+ struct brcmfmac_pd_cc_entry table[0]; +-+}; +-+ +-+/** +-+ * struct brcmfmac_pd_device - Device specific platform data. (id/rev/bus_type) +-+ * is the unique identifier of the device. +-+ * +-+ * @id: ID of the device for which this data is. In case of SDIO +-+ * or PCIE this is the chipid as identified by chip.c In +-+ * case of USB this is the chipid as identified by the +-+ * device query. +-+ * @rev: chip revision, see id. +-+ * @bus_type: The type of bus. Some chipid/rev exist for different bus +-+ * types. Each bus type has its own set of settings. +-+ * @feature_disable: Bitmask of features to disable (override), See feature.c +-+ * in brcmfmac for details. +-+ * @country_codes: If available, pointer to struct for translating country +-+ * codes. +-+ * @bus: Bus specific (union) device settings. Currently only +-+ * SDIO. +-+ */ +-+struct brcmfmac_pd_device { +-+ unsigned int id; +-+ unsigned int rev; +-+ enum brcmf_bus_type bus_type; +-+ unsigned int feature_disable; +-+ struct brcmfmac_pd_cc *country_codes; +-+ union { +-+ struct brcmfmac_sdio_pd sdio; +-+ } bus; +-+}; +-+ +-+/** +-+ * struct brcmfmac_platform_data - BRCMFMAC specific platform data. +-+ * +-+ * @power_on: This function is called by the brcmfmac driver when the module +-+ * gets loaded. This can be particularly useful for low power +-+ * devices. The platform spcific routine may for example decide to +-+ * power up the complete device. If there is no use-case for this +-+ * function then provide NULL. +-+ * @power_off: This function is called by the brcmfmac when the module gets +-+ * unloaded. At this point the devices can be powered down or +-+ * otherwise be reset. So if an actual power_off is not supported +-+ * but reset is supported by the devices then reset the devices +-+ * when this function gets called. This can be particularly useful +-+ * for low power devices. If there is no use-case for this +-+ * function then provide NULL. +-+ */ +-+struct brcmfmac_platform_data { +-+ void (*power_on)(void); +-+ void (*power_off)(void); +-+ char *fw_alternative_path; +-+ int device_count; +-+ struct brcmfmac_pd_device devices[0]; +-+}; +-+ +-+ +-+#endif /* _LINUX_BRCMFMAC_PLATFORM_H */ +diff --git a/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch b/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch +deleted file mode 100644 +index 34341d7..0000000 +--- a/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch ++++ /dev/null +@@ -1,607 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:08 +0100 +-Subject: [PATCH] brcmfmac: merge platform data and module paramaters +- +-Merge module parameters and platform data in one struct. This is the +-last step to move to the new platform data per device. Now parameters +-of platform data will be merged with module parameters per device. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-@@ -109,8 +109,8 @@ int brcmf_sdiod_intr_register(struct brc +- u32 addr, gpiocontrol; +- unsigned long flags; +- +-- pdata = sdiodev->pdata; +-- if ((pdata) && (pdata->oob_irq_supported)) { +-+ pdata = &sdiodev->settings->bus.sdio; +-+ if (pdata->oob_irq_supported) { +- brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n", +- pdata->oob_irq_nr); +- ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler, +-@@ -177,8 +177,8 @@ int brcmf_sdiod_intr_unregister(struct b +- +- brcmf_dbg(SDIO, "Entering\n"); +- +-- pdata = sdiodev->pdata; +-- if ((pdata) && (pdata->oob_irq_supported)) { +-+ pdata = &sdiodev->settings->bus.sdio; +-+ if (pdata->oob_irq_supported) { +- sdio_claim_host(sdiodev->func[1]); +- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL); +- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL); +-@@ -522,7 +522,7 @@ static int brcmf_sdiod_sglist_rw(struct +- target_list = pktlist; +- /* for host with broken sg support, prepare a page aligned list */ +- __skb_queue_head_init(&local_list); +-- if (sdiodev->pdata && sdiodev->pdata->broken_sg_support && !write) { +-+ if (!write && sdiodev->settings->bus.sdio.broken_sg_support) { +- req_sz = 0; +- skb_queue_walk(pktlist, pkt_next) +- req_sz += pkt_next->len; +-@@ -629,7 +629,7 @@ static int brcmf_sdiod_sglist_rw(struct +- } +- } +- +-- if (sdiodev->pdata && sdiodev->pdata->broken_sg_support && !write) { +-+ if (!write && sdiodev->settings->bus.sdio.broken_sg_support) { +- local_pkt_next = local_list.next; +- orig_offset = 0; +- skb_queue_walk(pktlist, pkt_next) { +-@@ -900,7 +900,7 @@ void brcmf_sdiod_sgtable_alloc(struct br +- return; +- +- nents = max_t(uint, BRCMF_DEFAULT_RXGLOM_SIZE, +-- sdiodev->bus_if->drvr->settings->sdiod_txglomsz); +-+ sdiodev->settings->bus.sdio.txglomsz); +- nents += (nents >> 4) + 1; +- +- WARN_ON(nents > sdiodev->max_segment_count); +-@@ -912,7 +912,7 @@ void brcmf_sdiod_sgtable_alloc(struct br +- sdiodev->sg_support = false; +- } +- +-- sdiodev->txglomsz = sdiodev->bus_if->drvr->settings->sdiod_txglomsz; +-+ sdiodev->txglomsz = sdiodev->settings->bus.sdio.txglomsz; +- } +- +- #ifdef CONFIG_PM_SLEEP +-@@ -1246,8 +1246,8 @@ static int brcmf_ops_sdio_suspend(struct +- +- sdio_flags = MMC_PM_KEEP_POWER; +- if (sdiodev->wowl_enabled) { +-- if (sdiodev->pdata->oob_irq_supported) +-- enable_irq_wake(sdiodev->pdata->oob_irq_nr); +-+ if (sdiodev->settings->bus.sdio.oob_irq_supported) +-+ enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr); +- else +- sdio_flags |= MMC_PM_WAKE_SDIO_IRQ; +- } +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +-@@ -43,6 +43,8 @@ enum brcmf_bus_protocol_type { +- BRCMF_PROTO_MSGBUF +- }; +- +-+struct brcmf_mp_device; +-+ +- struct brcmf_bus_dcmd { +- char *name; +- char *param; +-@@ -217,7 +219,7 @@ bool brcmf_c_prec_enq(struct device *dev +- void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp); +- +- /* Indication from bus module regarding presence/insertion of dongle. */ +--int brcmf_attach(struct device *dev); +-+int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings); +- /* Indication from bus module regarding removal/absence of dongle */ +- void brcmf_detach(struct device *dev); +- /* Indication from bus module that dongle should be reset */ +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +-@@ -243,14 +243,35 @@ static void brcmf_mp_attach(void) +- } +- } +- +--struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev, +-- enum brcmf_bus_type bus_type, +-- u32 chip, u32 chiprev) +-+struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, +-+ enum brcmf_bus_type bus_type, +-+ u32 chip, u32 chiprev) +- { +-- struct brcmfmac_sdio_pd *pdata; +-+ struct brcmf_mp_device *settings; +- struct brcmfmac_pd_device *device_pd; +-+ bool found; +- int i; +- +-+ brcmf_dbg(INFO, "Enter, bus=%d, chip=%d, rev=%d\n", bus_type, chip, +-+ chiprev); +-+ settings = kzalloc(sizeof(*settings), GFP_ATOMIC); +-+ if (!settings) +-+ return NULL; +-+ +-+ /* start by using the module paramaters */ +-+ settings->p2p_enable = !!brcmf_p2p_enable; +-+ settings->feature_disable = brcmf_feature_disable; +-+ settings->fcmode = brcmf_fcmode; +-+ settings->roamoff = !!brcmf_roamoff; +-+#ifdef DEBUG +-+ settings->ignore_probe_fail = !!brcmf_ignore_probe_fail; +-+#endif +-+ +-+ if (bus_type == BRCMF_BUSTYPE_SDIO) +-+ settings->bus.sdio.txglomsz = brcmf_sdiod_txglomsz; +-+ +-+ /* See if there is any device specific platform data configured */ +-+ found = false; +- if (brcmfmac_pdata) { +- for (i = 0; i < brcmfmac_pdata->device_count; i++) { +- device_pd = &brcmfmac_pdata->devices[i]; +-@@ -259,38 +280,29 @@ struct brcmfmac_sdio_pd *brcmf_get_modul +- ((device_pd->rev == chiprev) || +- (device_pd->rev == -1))) { +- brcmf_dbg(INFO, "Platform data for device found\n"); +-+ settings->country_codes = +-+ device_pd->country_codes; +- if (device_pd->bus_type == BRCMF_BUSTYPE_SDIO) +-- return &device_pd->bus.sdio; +-+ memcpy(&settings->bus.sdio, +-+ &device_pd->bus.sdio, +-+ sizeof(settings->bus.sdio)); +-+ found = true; +- break; +- } +- } +- } +-- pdata = NULL; +-- brcmf_of_probe(dev, &pdata); +-- +-- return pdata; +--} +-- +--int brcmf_mp_device_attach(struct brcmf_pub *drvr) +--{ +-- drvr->settings = kzalloc(sizeof(*drvr->settings), GFP_ATOMIC); +-- if (!drvr->settings) +-- return -ENOMEM; +-- +-- drvr->settings->sdiod_txglomsz = brcmf_sdiod_txglomsz; +-- drvr->settings->p2p_enable = !!brcmf_p2p_enable; +-- drvr->settings->feature_disable = brcmf_feature_disable; +-- drvr->settings->fcmode = brcmf_fcmode; +-- drvr->settings->roamoff = !!brcmf_roamoff; +--#ifdef DEBUG +-- drvr->settings->ignore_probe_fail = !!brcmf_ignore_probe_fail; +--#endif +-- return 0; +-+ if ((bus_type == BRCMF_BUSTYPE_SDIO) && (!found)) { +-+ /* No platform data for this device. In case of SDIO try OF +-+ * (Open Firwmare) Device Tree. +-+ */ +-+ brcmf_of_probe(dev, &settings->bus.sdio); +-+ } +-+ return settings; +- } +- +--void brcmf_mp_device_detach(struct brcmf_pub *drvr) +-+void brcmf_release_module_param(struct brcmf_mp_device *module_param) +- { +-- kfree(drvr->settings); +-+ kfree(module_param); +- } +- +- static int __init brcmf_common_pd_probe(struct platform_device *pdev) +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h +-@@ -45,41 +45,30 @@ extern struct brcmf_mp_global_t brcmf_mp +- /** +- * struct brcmf_mp_device - Device module paramaters. +- * +-- * @sdiod_txglomsz: SDIO txglom size. +-- * @joinboost_5g_rssi: 5g rssi booost for preferred join selection. +- * @p2p_enable: Legacy P2P0 enable (old wpa_supplicant). +- * @feature_disable: Feature_disable bitmask. +- * @fcmode: FWS flow control. +- * @roamoff: Firmware roaming off? +-+ * @ignore_probe_fail: Ignore probe failure. +- * @country_codes: If available, pointer to struct for translating country codes +-+ * @bus: Bus specific platform data. Only SDIO at the mmoment. +- */ +- struct brcmf_mp_device { +-- int sdiod_txglomsz; +-- int joinboost_5g_rssi; +-- bool p2p_enable; +-- int feature_disable; +-- int fcmode; +-- bool roamoff; +-- bool ignore_probe_fail; +-+ bool p2p_enable; +-+ unsigned int feature_disable; +-+ int fcmode; +-+ bool roamoff; +-+ bool ignore_probe_fail; +- struct brcmfmac_pd_cc *country_codes; +-+ union { +-+ struct brcmfmac_sdio_pd sdio; +-+ } bus; +- }; +- +--struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev, +-- enum brcmf_bus_type bus_type, +-- u32 chip, u32 chiprev); +--int brcmf_mp_device_attach(struct brcmf_pub *drvr); +--void brcmf_mp_device_detach(struct brcmf_pub *drvr); +--#ifdef DEBUG +--static inline bool brcmf_ignoring_probe_fail(struct brcmf_pub *drvr) +--{ +-- return drvr->settings->ignore_probe_fail; +--} +--#else +--static inline bool brcmf_ignoring_probe_fail(struct brcmf_pub *drvr) +--{ +-- return false; +--} +--#endif +-+struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, +-+ enum brcmf_bus_type bus_type, +-+ u32 chip, u32 chiprev); +-+void brcmf_release_module_param(struct brcmf_mp_device *module_param); +- +- /* Sets dongle media info (drv_version, mac address). */ +- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -1104,7 +1104,7 @@ static int brcmf_inet6addr_changed(struc +- } +- #endif +- +--int brcmf_attach(struct device *dev) +-+int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings) +- { +- struct brcmf_pub *drvr = NULL; +- int ret = 0; +-@@ -1126,10 +1126,7 @@ int brcmf_attach(struct device *dev) +- drvr->hdrlen = 0; +- drvr->bus_if = dev_get_drvdata(dev); +- drvr->bus_if->drvr = drvr; +-- +-- /* Initialize device specific settings */ +-- if (brcmf_mp_device_attach(drvr)) +-- goto fail; +-+ drvr->settings = settings; +- +- /* attach debug facilities */ +- brcmf_debug_attach(drvr); +-@@ -1274,7 +1271,7 @@ fail: +- brcmf_net_detach(p2p_ifp->ndev); +- drvr->iflist[0] = NULL; +- drvr->iflist[1] = NULL; +-- if (brcmf_ignoring_probe_fail(drvr)) +-+ if (drvr->settings->ignore_probe_fail) +- ret = 0; +- +- return ret; +-@@ -1350,8 +1347,6 @@ void brcmf_detach(struct device *dev) +- +- brcmf_proto_detach(drvr); +- +-- brcmf_mp_device_detach(drvr); +-- +- brcmf_debug_detach(drvr); +- bus_if->drvr = NULL; +- kfree(drvr); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c +-@@ -23,7 +23,7 @@ +- #include "common.h" +- #include "of.h" +- +--void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio) +-+void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio) +- { +- struct device_node *np = dev->of_node; +- int irq; +-@@ -33,12 +33,8 @@ void brcmf_of_probe(struct device *dev, +- if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac")) +- return; +- +-- *sdio = devm_kzalloc(dev, sizeof(*sdio), GFP_KERNEL); +-- if (!(*sdio)) +-- return; +-- +- if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0) +-- (*sdio)->drive_strength = val; +-+ sdio->drive_strength = val; +- +- /* make sure there are interrupts defined in the node */ +- if (!of_find_property(np, "interrupts", NULL)) +-@@ -51,7 +47,7 @@ void brcmf_of_probe(struct device *dev, +- } +- irqf = irqd_get_trigger_type(irq_get_irq_data(irq)); +- +-- (*sdio)->oob_irq_supported = true; +-- (*sdio)->oob_irq_nr = irq; +-- (*sdio)->oob_irq_flags = irqf; +-+ sdio->oob_irq_supported = true; +-+ sdio->oob_irq_nr = irq; +-+ sdio->oob_irq_flags = irqf; +- } +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h +-@@ -14,10 +14,9 @@ +- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +- */ +- #ifdef CONFIG_OF +--void +--brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio); +-+void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio); +- #else +--static void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio) +-+static void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio) +- { +- } +- #endif /* CONFIG_OF */ +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +-@@ -37,6 +37,8 @@ +- #include "pcie.h" +- #include "firmware.h" +- #include "chip.h" +-+#include "core.h" +-+#include "common.h" +- +- +- enum brcmf_pcie_state { +-@@ -266,6 +268,7 @@ struct brcmf_pciedev_info { +- u16 (*read_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset); +- void (*write_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset, +- u16 value); +-+ struct brcmf_mp_device *settings; +- }; +- +- struct brcmf_pcie_ringbuf { +-@@ -1525,16 +1528,16 @@ static void brcmf_pcie_release_resource( +- } +- +- +--static int brcmf_pcie_attach_bus(struct device *dev) +-+static int brcmf_pcie_attach_bus(struct brcmf_pciedev_info *devinfo) +- { +- int ret; +- +- /* Attach to the common driver interface */ +-- ret = brcmf_attach(dev); +-+ ret = brcmf_attach(&devinfo->pdev->dev, devinfo->settings); +- if (ret) { +- brcmf_err("brcmf_attach failed\n"); +- } else { +-- ret = brcmf_bus_start(dev); +-+ ret = brcmf_bus_start(&devinfo->pdev->dev); +- if (ret) +- brcmf_err("dongle is not responding\n"); +- } +-@@ -1672,7 +1675,7 @@ static void brcmf_pcie_setup(struct devi +- init_waitqueue_head(&devinfo->mbdata_resp_wait); +- +- brcmf_pcie_intr_enable(devinfo); +-- if (brcmf_pcie_attach_bus(bus->dev) == 0) +-+ if (brcmf_pcie_attach_bus(devinfo) == 0) +- return; +- +- brcmf_pcie_bus_console_read(devinfo); +-@@ -1716,6 +1719,15 @@ brcmf_pcie_probe(struct pci_dev *pdev, c +- goto fail; +- } +- +-+ devinfo->settings = brcmf_get_module_param(&devinfo->pdev->dev, +-+ BRCMF_BUSTYPE_PCIE, +-+ devinfo->ci->chip, +-+ devinfo->ci->chiprev); +-+ if (!devinfo->settings) { +-+ ret = -ENOMEM; +-+ goto fail; +-+ } +-+ +- bus = kzalloc(sizeof(*bus), GFP_KERNEL); +- if (!bus) { +- ret = -ENOMEM; +-@@ -1760,6 +1772,8 @@ fail: +- brcmf_pcie_release_resource(devinfo); +- if (devinfo->ci) +- brcmf_chip_detach(devinfo->ci); +-+ if (devinfo->settings) +-+ brcmf_release_module_param(devinfo->settings); +- kfree(pcie_bus_dev); +- kfree(devinfo); +- return ret; +-@@ -1799,6 +1813,8 @@ brcmf_pcie_remove(struct pci_dev *pdev) +- +- if (devinfo->ci) +- brcmf_chip_detach(devinfo->ci); +-+ if (devinfo->settings) +-+ brcmf_release_module_param(devinfo->settings); +- +- kfree(devinfo); +- dev_set_drvdata(&pdev->dev, NULL); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-@@ -2442,15 +2442,17 @@ static void brcmf_sdio_bus_stop(struct d +- +- static inline void brcmf_sdio_clrintr(struct brcmf_sdio *bus) +- { +-+ struct brcmf_sdio_dev *sdiodev; +- unsigned long flags; +- +-- if (bus->sdiodev->oob_irq_requested) { +-- spin_lock_irqsave(&bus->sdiodev->irq_en_lock, flags); +-- if (!bus->sdiodev->irq_en && !atomic_read(&bus->ipend)) { +-- enable_irq(bus->sdiodev->pdata->oob_irq_nr); +-- bus->sdiodev->irq_en = true; +-+ sdiodev = bus->sdiodev; +-+ if (sdiodev->oob_irq_requested) { +-+ spin_lock_irqsave(&sdiodev->irq_en_lock, flags); +-+ if (!sdiodev->irq_en && !atomic_read(&bus->ipend)) { +-+ enable_irq(sdiodev->settings->bus.sdio.oob_irq_nr); +-+ sdiodev->irq_en = true; +- } +-- spin_unlock_irqrestore(&bus->sdiodev->irq_en_lock, flags); +-+ spin_unlock_irqrestore(&sdiodev->irq_en_lock, flags); +- } +- } +- +-@@ -3394,9 +3396,7 @@ static int brcmf_sdio_bus_preinit(struct +- sizeof(u32)); +- } else { +- /* otherwise, set txglomalign */ +-- value = 4; +-- if (sdiodev->pdata) +-- value = sdiodev->pdata->sd_sgentry_align; +-+ value = sdiodev->settings->bus.sdio.sd_sgentry_align; +- /* SDIO ADMA requires at least 32 bit alignment */ +- value = max_t(u32, value, 4); +- err = brcmf_iovar_data_set(dev, "bus:txglomalign", &value, +-@@ -3811,21 +3811,25 @@ brcmf_sdio_probe_attach(struct brcmf_sdi +- bus->ci = NULL; +- goto fail; +- } +-- sdiodev->pdata = brcmf_get_module_param(sdiodev->dev, +-+ sdiodev->settings = brcmf_get_module_param(sdiodev->dev, +- BRCMF_BUSTYPE_SDIO, +- bus->ci->chip, +- bus->ci->chiprev); +-+ if (!sdiodev->settings) { +-+ brcmf_err("Failed to get device parameters\n"); +-+ goto fail; +-+ } +- /* platform specific configuration: +- * alignments must be at least 4 bytes for ADMA +- */ +- bus->head_align = ALIGNMENT; +- bus->sgentry_align = ALIGNMENT; +-- if (sdiodev->pdata) { +-- if (sdiodev->pdata->sd_head_align > ALIGNMENT) +-- bus->head_align = sdiodev->pdata->sd_head_align; +-- if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT) +-- bus->sgentry_align = sdiodev->pdata->sd_sgentry_align; +-- } +-+ if (sdiodev->settings->bus.sdio.sd_head_align > ALIGNMENT) +-+ bus->head_align = sdiodev->settings->bus.sdio.sd_head_align; +-+ if (sdiodev->settings->bus.sdio.sd_sgentry_align > ALIGNMENT) +-+ bus->sgentry_align = +-+ sdiodev->settings->bus.sdio.sd_sgentry_align; +-+ +- /* allocate scatter-gather table. sg support +- * will be disabled upon allocation failure. +- */ +-@@ -3837,7 +3841,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi +- */ +- if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) && +- ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) || +-- (sdiodev->pdata && sdiodev->pdata->oob_irq_supported))) +-+ (sdiodev->settings->bus.sdio.oob_irq_supported))) +- sdiodev->bus_if->wowl_supported = true; +- #endif +- +-@@ -3846,8 +3850,8 @@ brcmf_sdio_probe_attach(struct brcmf_sdi +- goto fail; +- } +- +-- if ((sdiodev->pdata) && (sdiodev->pdata->drive_strength)) +-- drivestrength = sdiodev->pdata->drive_strength; +-+ if (sdiodev->settings->bus.sdio.drive_strength) +-+ drivestrength = sdiodev->settings->bus.sdio.drive_strength; +- else +- drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH; +- brcmf_sdio_drivestrengthinit(sdiodev, bus->ci, drivestrength); +-@@ -4124,7 +4128,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru +- bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN; +- +- /* Attach to the common layer, reserve hdr space */ +-- ret = brcmf_attach(bus->sdiodev->dev); +-+ ret = brcmf_attach(bus->sdiodev->dev, bus->sdiodev->settings); +- if (ret != 0) { +- brcmf_err("brcmf_attach failed\n"); +- goto fail; +-@@ -4228,6 +4232,8 @@ void brcmf_sdio_remove(struct brcmf_sdio +- } +- brcmf_chip_detach(bus->ci); +- } +-+ if (bus->sdiodev->settings) +-+ brcmf_release_module_param(bus->sdiodev->settings); +- +- kfree(bus->rxbuf); +- kfree(bus->hdrbuf); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +-@@ -184,7 +184,7 @@ struct brcmf_sdio_dev { +- struct brcmf_sdio *bus; +- struct device *dev; +- struct brcmf_bus *bus_if; +-- struct brcmfmac_sdio_pd *pdata; +-+ struct brcmf_mp_device *settings; +- bool oob_irq_requested; +- bool irq_en; /* irq enable flags */ +- spinlock_t irq_en_lock; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +-@@ -27,6 +27,8 @@ +- #include "debug.h" +- #include "firmware.h" +- #include "usb.h" +-+#include "core.h" +-+#include "common.h" +- +- +- #define IOCTL_RESP_TIMEOUT msecs_to_jiffies(2000) +-@@ -171,6 +173,7 @@ struct brcmf_usbdev_info { +- struct urb *bulk_urb; /* used for FW download */ +- +- bool wowl_enabled; +-+ struct brcmf_mp_device *settings; +- }; +- +- static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo, +-@@ -1027,6 +1030,9 @@ static void brcmf_usb_detach(struct brcm +- +- kfree(devinfo->tx_reqs); +- kfree(devinfo->rx_reqs); +-+ +-+ if (devinfo->settings) +-+ brcmf_release_module_param(devinfo->settings); +- } +- +- +-@@ -1136,7 +1142,7 @@ static int brcmf_usb_bus_setup(struct br +- int ret; +- +- /* Attach to the common driver interface */ +-- ret = brcmf_attach(devinfo->dev); +-+ ret = brcmf_attach(devinfo->dev, devinfo->settings); +- if (ret) { +- brcmf_err("brcmf_attach failed\n"); +- return ret; +-@@ -1223,6 +1229,14 @@ static int brcmf_usb_probe_cb(struct brc +- bus->wowl_supported = true; +- #endif +- +-+ devinfo->settings = brcmf_get_module_param(bus->dev, BRCMF_BUSTYPE_USB, +-+ bus_pub->devid, +-+ bus_pub->chiprev); +-+ if (!devinfo->settings) { +-+ ret = -ENOMEM; +-+ goto fail; +-+ } +-+ +- if (!brcmf_usb_dlneeded(devinfo)) { +- ret = brcmf_usb_bus_setup(devinfo); +- if (ret) +diff --git a/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch b/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch +deleted file mode 100644 +index eb680fc..0000000 +--- a/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch ++++ /dev/null +@@ -1,227 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:09 +0100 +-Subject: [PATCH] brcmfmac: integrate add_keyext in add_key +- +-brcmf_add_keyext is called when a key is configured for a specific +-mac address. This function is very similar to the calling function +-brcmf_add_key. Integrate this function and also use existing del_key +-function in case key is to be cleared. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -2073,84 +2073,34 @@ done: +- } +- +- static s32 +--brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev, +-- u8 key_idx, const u8 *mac_addr, struct key_params *params) +-+brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev, +-+ u8 key_idx, bool pairwise, const u8 *mac_addr) +- { +- struct brcmf_if *ifp = netdev_priv(ndev); +- struct brcmf_wsec_key key; +- s32 err = 0; +-- u8 keybuf[8]; +-+ +-+ brcmf_dbg(TRACE, "Enter\n"); +-+ if (!check_vif_up(ifp->vif)) +-+ return -EIO; +-+ +-+ if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) { +-+ /* we ignore this key index in this case */ +-+ return -EINVAL; +-+ } +- +- memset(&key, 0, sizeof(key)); +-- key.index = (u32) key_idx; +-- /* Instead of bcast for ea address for default wep keys, +-- driver needs it to be Null */ +-- if (!is_multicast_ether_addr(mac_addr)) +-- memcpy((char *)&key.ea, (void *)mac_addr, ETH_ALEN); +-- key.len = (u32) params->key_len; +-- /* check for key index change */ +-- if (key.len == 0) { +-- /* key delete */ +-- err = send_key_to_dongle(ifp, &key); +-- if (err) +-- brcmf_err("key delete error (%d)\n", err); +-- } else { +-- if (key.len > sizeof(key.data)) { +-- brcmf_err("Invalid key length (%d)\n", key.len); +-- return -EINVAL; +-- } +- +-- brcmf_dbg(CONN, "Setting the key index %d\n", key.index); +-- memcpy(key.data, params->key, key.len); +-+ key.index = (u32)key_idx; +-+ key.flags = BRCMF_PRIMARY_KEY; +-+ key.algo = CRYPTO_ALGO_OFF; +- +-- if (!brcmf_is_apmode(ifp->vif) && +-- (params->cipher == WLAN_CIPHER_SUITE_TKIP)) { +-- brcmf_dbg(CONN, "Swapping RX/TX MIC key\n"); +-- memcpy(keybuf, &key.data[24], sizeof(keybuf)); +-- memcpy(&key.data[24], &key.data[16], sizeof(keybuf)); +-- memcpy(&key.data[16], keybuf, sizeof(keybuf)); +-- } +-+ brcmf_dbg(CONN, "key index (%d)\n", key_idx); +- +-- /* if IW_ENCODE_EXT_RX_SEQ_VALID set */ +-- if (params->seq && params->seq_len == 6) { +-- /* rx iv */ +-- u8 *ivptr; +-- ivptr = (u8 *) params->seq; +-- key.rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) | +-- (ivptr[3] << 8) | ivptr[2]; +-- key.rxiv.lo = (ivptr[1] << 8) | ivptr[0]; +-- key.iv_initialized = true; +-- } +-+ /* Set the new key/index */ +-+ err = send_key_to_dongle(ifp, &key); +- +-- switch (params->cipher) { +-- case WLAN_CIPHER_SUITE_WEP40: +-- key.algo = CRYPTO_ALGO_WEP1; +-- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP40\n"); +-- break; +-- case WLAN_CIPHER_SUITE_WEP104: +-- key.algo = CRYPTO_ALGO_WEP128; +-- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP104\n"); +-- break; +-- case WLAN_CIPHER_SUITE_TKIP: +-- key.algo = CRYPTO_ALGO_TKIP; +-- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_TKIP\n"); +-- break; +-- case WLAN_CIPHER_SUITE_AES_CMAC: +-- key.algo = CRYPTO_ALGO_AES_CCM; +-- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_AES_CMAC\n"); +-- break; +-- case WLAN_CIPHER_SUITE_CCMP: +-- key.algo = CRYPTO_ALGO_AES_CCM; +-- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_CCMP\n"); +-- break; +-- default: +-- brcmf_err("Invalid cipher (0x%x)\n", params->cipher); +-- return -EINVAL; +-- } +-- err = send_key_to_dongle(ifp, &key); +-- if (err) +-- brcmf_err("wsec_key error (%d)\n", err); +-- } +-+ brcmf_dbg(TRACE, "Exit\n"); +- return err; +- } +- +-@@ -2163,8 +2113,9 @@ brcmf_cfg80211_add_key(struct wiphy *wip +- struct brcmf_wsec_key *key; +- s32 val; +- s32 wsec; +-- s32 err = 0; +-+ s32 err; +- u8 keybuf[8]; +-+ bool ext_key; +- +- brcmf_dbg(TRACE, "Enter\n"); +- brcmf_dbg(CONN, "key index (%d)\n", key_idx); +-@@ -2177,27 +2128,32 @@ brcmf_cfg80211_add_key(struct wiphy *wip +- return -EINVAL; +- } +- +-- if (mac_addr && +-- (params->cipher != WLAN_CIPHER_SUITE_WEP40) && +-- (params->cipher != WLAN_CIPHER_SUITE_WEP104)) { +-- brcmf_dbg(TRACE, "Exit"); +-- return brcmf_add_keyext(wiphy, ndev, key_idx, mac_addr, params); +-- } +-- +-- key = &ifp->vif->profile.key[key_idx]; +-- memset(key, 0, sizeof(*key)); +-+ if (params->key_len == 0) +-+ return brcmf_cfg80211_del_key(wiphy, ndev, key_idx, pairwise, +-+ mac_addr); +- +- if (params->key_len > sizeof(key->data)) { +- brcmf_err("Too long key length (%u)\n", params->key_len); +-- err = -EINVAL; +-- goto done; +-+ return -EINVAL; +-+ } +-+ +-+ ext_key = false; +-+ if (mac_addr && (params->cipher != WLAN_CIPHER_SUITE_WEP40) && +-+ (params->cipher != WLAN_CIPHER_SUITE_WEP104)) { +-+ brcmf_dbg(TRACE, "Ext key, mac %pM", mac_addr); +-+ ext_key = true; +- } +-+ +-+ key = &ifp->vif->profile.key[key_idx]; +-+ memset(key, 0, sizeof(*key)); +-+ if ((ext_key) && (!is_multicast_ether_addr(mac_addr))) +-+ memcpy((char *)&key->ea, (void *)mac_addr, ETH_ALEN); +- key->len = params->key_len; +- key->index = key_idx; +-- +- memcpy(key->data, params->key, key->len); +-+ if (!ext_key) +-+ key->flags = BRCMF_PRIMARY_KEY; +- +-- key->flags = BRCMF_PRIMARY_KEY; +- switch (params->cipher) { +- case WLAN_CIPHER_SUITE_WEP40: +- key->algo = CRYPTO_ALGO_WEP1; +-@@ -2237,7 +2193,7 @@ brcmf_cfg80211_add_key(struct wiphy *wip +- } +- +- err = send_key_to_dongle(ifp, key); +-- if (err) +-+ if (ext_key || err) +- goto done; +- +- err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec); +-@@ -2256,38 +2212,6 @@ done: +- brcmf_dbg(TRACE, "Exit\n"); +- return err; +- } +-- +--static s32 +--brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev, +-- u8 key_idx, bool pairwise, const u8 *mac_addr) +--{ +-- struct brcmf_if *ifp = netdev_priv(ndev); +-- struct brcmf_wsec_key key; +-- s32 err = 0; +-- +-- brcmf_dbg(TRACE, "Enter\n"); +-- if (!check_vif_up(ifp->vif)) +-- return -EIO; +-- +-- if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) { +-- /* we ignore this key index in this case */ +-- return -EINVAL; +-- } +-- +-- memset(&key, 0, sizeof(key)); +-- +-- key.index = (u32) key_idx; +-- key.flags = BRCMF_PRIMARY_KEY; +-- key.algo = CRYPTO_ALGO_OFF; +-- +-- brcmf_dbg(CONN, "key index (%d)\n", key_idx); +-- +-- /* Set the new key/index */ +-- err = send_key_to_dongle(ifp, &key); +-- +-- brcmf_dbg(TRACE, "Exit\n"); +-- return err; +--} +- +- static s32 +- brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, +diff --git a/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch b/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch +deleted file mode 100644 +index c20d40c..0000000 +--- a/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch ++++ /dev/null +@@ -1,509 +0,0 @@ +-From: Hante Meuleman +-Date: Wed, 17 Feb 2016 11:27:10 +0100 +-Subject: [PATCH] brcmfmac: add 802.11w management frame protection support +- +-Add full support for both AP and STA for management frame protection. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky (Zhenhui) Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -72,8 +72,13 @@ +- #define RSN_AKM_NONE 0 /* None (IBSS) */ +- #define RSN_AKM_UNSPECIFIED 1 /* Over 802.1x */ +- #define RSN_AKM_PSK 2 /* Pre-shared Key */ +-+#define RSN_AKM_SHA256_1X 5 /* SHA256, 802.1X */ +-+#define RSN_AKM_SHA256_PSK 6 /* SHA256, Pre-shared Key */ +- #define RSN_CAP_LEN 2 /* Length of RSN capabilities */ +--#define RSN_CAP_PTK_REPLAY_CNTR_MASK 0x000C +-+#define RSN_CAP_PTK_REPLAY_CNTR_MASK (BIT(2) | BIT(3)) +-+#define RSN_CAP_MFPR_MASK BIT(6) +-+#define RSN_CAP_MFPC_MASK BIT(7) +-+#define RSN_PMKID_COUNT_LEN 2 +- +- #define VNDR_IE_CMD_LEN 4 /* length of the set command +- * string :"add", "del" (+ NUL) +-@@ -211,12 +216,19 @@ static const struct ieee80211_regdomain +- REG_RULE(5470-10, 5850+10, 80, 6, 20, 0), } +- }; +- +--static const u32 __wl_cipher_suites[] = { +-+/* Note: brcmf_cipher_suites is an array of int defining which cipher suites +-+ * are supported. A pointer to this array and the number of entries is passed +-+ * on to upper layers. AES_CMAC defines whether or not the driver supports MFP. +-+ * So the cipher suite AES_CMAC has to be the last one in the array, and when +-+ * device does not support MFP then the number of suites will be decreased by 1 +-+ */ +-+static const u32 brcmf_cipher_suites[] = { +- WLAN_CIPHER_SUITE_WEP40, +- WLAN_CIPHER_SUITE_WEP104, +- WLAN_CIPHER_SUITE_TKIP, +- WLAN_CIPHER_SUITE_CCMP, +-- WLAN_CIPHER_SUITE_AES_CMAC, +-+ /* Keep as last entry: */ +-+ WLAN_CIPHER_SUITE_AES_CMAC +- }; +- +- /* Vendor specific ie. id = 221, oui and type defines exact ie */ +-@@ -1533,7 +1545,7 @@ static s32 brcmf_set_auth_type(struct ne +- +- static s32 +- brcmf_set_wsec_mode(struct net_device *ndev, +-- struct cfg80211_connect_params *sme, bool mfp) +-+ struct cfg80211_connect_params *sme) +- { +- struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev); +- struct brcmf_cfg80211_security *sec; +-@@ -1592,10 +1604,7 @@ brcmf_set_wsec_mode(struct net_device *n +- sme->privacy) +- pval = AES_ENABLED; +- +-- if (mfp) +-- wsec = pval | gval | MFP_CAPABLE; +-- else +-- wsec = pval | gval; +-+ wsec = pval | gval; +- err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wsec", wsec); +- if (err) { +- brcmf_err("error (%d)\n", err); +-@@ -1612,56 +1621,100 @@ brcmf_set_wsec_mode(struct net_device *n +- static s32 +- brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme) +- { +-- struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev); +-- struct brcmf_cfg80211_security *sec; +-- s32 val = 0; +-- s32 err = 0; +-+ struct brcmf_if *ifp = netdev_priv(ndev); +-+ s32 val; +-+ s32 err; +-+ const struct brcmf_tlv *rsn_ie; +-+ const u8 *ie; +-+ u32 ie_len; +-+ u32 offset; +-+ u16 rsn_cap; +-+ u32 mfp; +-+ u16 count; +- +-- if (sme->crypto.n_akm_suites) { +-- err = brcmf_fil_bsscfg_int_get(netdev_priv(ndev), +-- "wpa_auth", &val); +-- if (err) { +-- brcmf_err("could not get wpa_auth (%d)\n", err); +-- return err; +-+ if (!sme->crypto.n_akm_suites) +-+ return 0; +-+ +-+ err = brcmf_fil_bsscfg_int_get(netdev_priv(ndev), "wpa_auth", &val); +-+ if (err) { +-+ brcmf_err("could not get wpa_auth (%d)\n", err); +-+ return err; +-+ } +-+ if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) { +-+ switch (sme->crypto.akm_suites[0]) { +-+ case WLAN_AKM_SUITE_8021X: +-+ val = WPA_AUTH_UNSPECIFIED; +-+ break; +-+ case WLAN_AKM_SUITE_PSK: +-+ val = WPA_AUTH_PSK; +-+ break; +-+ default: +-+ brcmf_err("invalid cipher group (%d)\n", +-+ sme->crypto.cipher_group); +-+ return -EINVAL; +- } +-- if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) { +-- switch (sme->crypto.akm_suites[0]) { +-- case WLAN_AKM_SUITE_8021X: +-- val = WPA_AUTH_UNSPECIFIED; +-- break; +-- case WLAN_AKM_SUITE_PSK: +-- val = WPA_AUTH_PSK; +-- break; +-- default: +-- brcmf_err("invalid cipher group (%d)\n", +-- sme->crypto.cipher_group); +-- return -EINVAL; +-- } +-- } else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) { +-- switch (sme->crypto.akm_suites[0]) { +-- case WLAN_AKM_SUITE_8021X: +-- val = WPA2_AUTH_UNSPECIFIED; +-- break; +-- case WLAN_AKM_SUITE_PSK: +-- val = WPA2_AUTH_PSK; +-- break; +-- default: +-- brcmf_err("invalid cipher group (%d)\n", +-- sme->crypto.cipher_group); +-- return -EINVAL; +-- } +-+ } else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) { +-+ switch (sme->crypto.akm_suites[0]) { +-+ case WLAN_AKM_SUITE_8021X: +-+ val = WPA2_AUTH_UNSPECIFIED; +-+ break; +-+ case WLAN_AKM_SUITE_8021X_SHA256: +-+ val = WPA2_AUTH_1X_SHA256; +-+ break; +-+ case WLAN_AKM_SUITE_PSK_SHA256: +-+ val = WPA2_AUTH_PSK_SHA256; +-+ break; +-+ case WLAN_AKM_SUITE_PSK: +-+ val = WPA2_AUTH_PSK; +-+ break; +-+ default: +-+ brcmf_err("invalid cipher group (%d)\n", +-+ sme->crypto.cipher_group); +-+ return -EINVAL; +- } +-+ } +- +-- brcmf_dbg(CONN, "setting wpa_auth to %d\n", val); +-- err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), +-- "wpa_auth", val); +-- if (err) { +-- brcmf_err("could not set wpa_auth (%d)\n", err); +-- return err; +-- } +-+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) +-+ goto skip_mfp_config; +-+ /* The MFP mode (1 or 2) needs to be determined, parse IEs. The +-+ * IE will not be verified, just a quick search for MFP config +-+ */ +-+ rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie, sme->ie_len, +-+ WLAN_EID_RSN); +-+ if (!rsn_ie) +-+ goto skip_mfp_config; +-+ ie = (const u8 *)rsn_ie; +-+ ie_len = rsn_ie->len + TLV_HDR_LEN; +-+ /* Skip unicast suite */ +-+ offset = TLV_HDR_LEN + WPA_IE_VERSION_LEN + WPA_IE_MIN_OUI_LEN; +-+ if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len) +-+ goto skip_mfp_config; +-+ /* Skip multicast suite */ +-+ count = ie[offset] + (ie[offset + 1] << 8); +-+ offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN); +-+ if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len) +-+ goto skip_mfp_config; +-+ /* Skip auth key management suite(s) */ +-+ count = ie[offset] + (ie[offset + 1] << 8); +-+ offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN); +-+ if (offset + WPA_IE_SUITE_COUNT_LEN > ie_len) +-+ goto skip_mfp_config; +-+ /* Ready to read capabilities */ +-+ mfp = BRCMF_MFP_NONE; +-+ rsn_cap = ie[offset] + (ie[offset + 1] << 8); +-+ if (rsn_cap & RSN_CAP_MFPR_MASK) +-+ mfp = BRCMF_MFP_REQUIRED; +-+ else if (rsn_cap & RSN_CAP_MFPC_MASK) +-+ mfp = BRCMF_MFP_CAPABLE; +-+ brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "mfp", mfp); +-+ +-+skip_mfp_config: +-+ brcmf_dbg(CONN, "setting wpa_auth to %d\n", val); +-+ err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wpa_auth", val); +-+ if (err) { +-+ brcmf_err("could not set wpa_auth (%d)\n", err); +-+ return err; +- } +-- sec = &profile->sec; +-- sec->wpa_auth = sme->crypto.akm_suites[0]; +- +- return err; +- } +-@@ -1827,7 +1880,7 @@ brcmf_cfg80211_connect(struct wiphy *wip +- goto done; +- } +- +-- err = brcmf_set_wsec_mode(ndev, sme, sme->mfp == NL80211_MFP_REQUIRED); +-+ err = brcmf_set_wsec_mode(ndev, sme); +- if (err) { +- brcmf_err("wl_set_set_cipher failed (%d)\n", err); +- goto done; +-@@ -2077,10 +2130,12 @@ brcmf_cfg80211_del_key(struct wiphy *wip +- u8 key_idx, bool pairwise, const u8 *mac_addr) +- { +- struct brcmf_if *ifp = netdev_priv(ndev); +-- struct brcmf_wsec_key key; +-- s32 err = 0; +-+ struct brcmf_wsec_key *key; +-+ s32 err; +- +- brcmf_dbg(TRACE, "Enter\n"); +-+ brcmf_dbg(CONN, "key index (%d)\n", key_idx); +-+ +- if (!check_vif_up(ifp->vif)) +- return -EIO; +- +-@@ -2089,16 +2144,19 @@ brcmf_cfg80211_del_key(struct wiphy *wip +- return -EINVAL; +- } +- +-- memset(&key, 0, sizeof(key)); +-+ key = &ifp->vif->profile.key[key_idx]; +- +-- key.index = (u32)key_idx; +-- key.flags = BRCMF_PRIMARY_KEY; +-- key.algo = CRYPTO_ALGO_OFF; +-+ if (key->algo == CRYPTO_ALGO_OFF) { +-+ brcmf_dbg(CONN, "Ignore clearing of (never configured) key\n"); +-+ return -EINVAL; +-+ } +- +-- brcmf_dbg(CONN, "key index (%d)\n", key_idx); +-+ memset(key, 0, sizeof(*key)); +-+ key->index = (u32)key_idx; +-+ key->flags = BRCMF_PRIMARY_KEY; +- +-- /* Set the new key/index */ +-- err = send_key_to_dongle(ifp, &key); +-+ /* Clear the key/index */ +-+ err = send_key_to_dongle(ifp, key); +- +- brcmf_dbg(TRACE, "Exit\n"); +- return err; +-@@ -2106,8 +2164,8 @@ brcmf_cfg80211_del_key(struct wiphy *wip +- +- static s32 +- brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, +-- u8 key_idx, bool pairwise, const u8 *mac_addr, +-- struct key_params *params) +-+ u8 key_idx, bool pairwise, const u8 *mac_addr, +-+ struct key_params *params) +- { +- struct brcmf_if *ifp = netdev_priv(ndev); +- struct brcmf_wsec_key *key; +-@@ -2214,9 +2272,10 @@ done: +- } +- +- static s32 +--brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, +-- u8 key_idx, bool pairwise, const u8 *mac_addr, void *cookie, +-- void (*callback) (void *cookie, struct key_params * params)) +-+brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, u8 key_idx, +-+ bool pairwise, const u8 *mac_addr, void *cookie, +-+ void (*callback)(void *cookie, +-+ struct key_params *params)) +- { +- struct key_params params; +- struct brcmf_if *ifp = netdev_priv(ndev); +-@@ -2268,8 +2327,15 @@ done: +- +- static s32 +- brcmf_cfg80211_config_default_mgmt_key(struct wiphy *wiphy, +-- struct net_device *ndev, u8 key_idx) +-+ struct net_device *ndev, u8 key_idx) +- { +-+ struct brcmf_if *ifp = netdev_priv(ndev); +-+ +-+ brcmf_dbg(TRACE, "Enter key_idx %d\n", key_idx); +-+ +-+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) +-+ return 0; +-+ +- brcmf_dbg(INFO, "Not supported\n"); +- +- return -EOPNOTSUPP; +-@@ -3769,7 +3835,7 @@ brcmf_configure_wpaie(struct brcmf_if *i +- u32 auth = 0; /* d11 open authentication */ +- u16 count; +- s32 err = 0; +-- s32 len = 0; +-+ s32 len; +- u32 i; +- u32 wsec; +- u32 pval = 0; +-@@ -3779,6 +3845,7 @@ brcmf_configure_wpaie(struct brcmf_if *i +- u8 *data; +- u16 rsn_cap; +- u32 wme_bss_disable; +-+ u32 mfp; +- +- brcmf_dbg(TRACE, "Enter\n"); +- if (wpa_ie == NULL) +-@@ -3893,19 +3960,53 @@ brcmf_configure_wpaie(struct brcmf_if *i +- is_rsn_ie ? (wpa_auth |= WPA2_AUTH_PSK) : +- (wpa_auth |= WPA_AUTH_PSK); +- break; +-+ case RSN_AKM_SHA256_PSK: +-+ brcmf_dbg(TRACE, "RSN_AKM_MFP_PSK\n"); +-+ wpa_auth |= WPA2_AUTH_PSK_SHA256; +-+ break; +-+ case RSN_AKM_SHA256_1X: +-+ brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n"); +-+ wpa_auth |= WPA2_AUTH_1X_SHA256; +-+ break; +- default: +- brcmf_err("Ivalid key mgmt info\n"); +- } +- offset++; +- } +- +-+ mfp = BRCMF_MFP_NONE; +- if (is_rsn_ie) { +- wme_bss_disable = 1; +- if ((offset + RSN_CAP_LEN) <= len) { +- rsn_cap = data[offset] + (data[offset + 1] << 8); +- if (rsn_cap & RSN_CAP_PTK_REPLAY_CNTR_MASK) +- wme_bss_disable = 0; +-+ if (rsn_cap & RSN_CAP_MFPR_MASK) { +-+ brcmf_dbg(TRACE, "MFP Required\n"); +-+ mfp = BRCMF_MFP_REQUIRED; +-+ /* Firmware only supports mfp required in +-+ * combination with WPA2_AUTH_PSK_SHA256 or +-+ * WPA2_AUTH_1X_SHA256. +-+ */ +-+ if (!(wpa_auth & (WPA2_AUTH_PSK_SHA256 | +-+ WPA2_AUTH_1X_SHA256))) { +-+ err = -EINVAL; +-+ goto exit; +-+ } +-+ /* Firmware has requirement that WPA2_AUTH_PSK/ +-+ * WPA2_AUTH_UNSPECIFIED be set, if SHA256 OUI +-+ * is to be included in the rsn ie. +-+ */ +-+ if (wpa_auth & WPA2_AUTH_PSK_SHA256) +-+ wpa_auth |= WPA2_AUTH_PSK; +-+ else if (wpa_auth & WPA2_AUTH_1X_SHA256) +-+ wpa_auth |= WPA2_AUTH_UNSPECIFIED; +-+ } else if (rsn_cap & RSN_CAP_MFPC_MASK) { +-+ brcmf_dbg(TRACE, "MFP Capable\n"); +-+ mfp = BRCMF_MFP_CAPABLE; +-+ } +- } +-+ offset += RSN_CAP_LEN; +- /* set wme_bss_disable to sync RSN Capabilities */ +- err = brcmf_fil_bsscfg_int_set(ifp, "wme_bss_disable", +- wme_bss_disable); +-@@ -3913,6 +4014,21 @@ brcmf_configure_wpaie(struct brcmf_if *i +- brcmf_err("wme_bss_disable error %d\n", err); +- goto exit; +- } +-+ +-+ /* Skip PMKID cnt as it is know to be 0 for AP. */ +-+ offset += RSN_PMKID_COUNT_LEN; +-+ +-+ /* See if there is BIP wpa suite left for MFP */ +-+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP) && +-+ ((offset + WPA_IE_MIN_OUI_LEN) <= len)) { +-+ err = brcmf_fil_bsscfg_data_set(ifp, "bip", +-+ &data[offset], +-+ WPA_IE_MIN_OUI_LEN); +-+ if (err < 0) { +-+ brcmf_err("bip error %d\n", err); +-+ goto exit; +-+ } +-+ } +- } +- /* FOR WPS , set SES_OW_ENABLED */ +- wsec = (pval | gval | SES_OW_ENABLED); +-@@ -3929,6 +4045,16 @@ brcmf_configure_wpaie(struct brcmf_if *i +- brcmf_err("wsec error %d\n", err); +- goto exit; +- } +-+ /* Configure MFP, this needs to go after wsec otherwise the wsec command +-+ * will overwrite the values set by MFP +-+ */ +-+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) { +-+ err = brcmf_fil_bsscfg_int_set(ifp, "mfp", mfp); +-+ if (err < 0) { +-+ brcmf_err("mfp error %d\n", err); +-+ goto exit; +-+ } +-+ } +- /* set upper-layer auth */ +- err = brcmf_fil_bsscfg_int_set(ifp, "wpa_auth", wpa_auth); +- if (err < 0) { +-@@ -6149,8 +6275,10 @@ static int brcmf_setup_wiphy(struct wiph +- wiphy->n_addresses = i; +- +- wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; +-- wiphy->cipher_suites = __wl_cipher_suites; +-- wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites); +-+ wiphy->cipher_suites = brcmf_cipher_suites; +-+ wiphy->n_cipher_suites = ARRAY_SIZE(brcmf_cipher_suites); +-+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) +-+ wiphy->n_cipher_suites--; +- wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT | +- WIPHY_FLAG_OFFCHAN_TX | +- WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-@@ -72,7 +72,7 @@ +- +- #define BRCMF_VNDR_IE_P2PAF_SHIFT 12 +- +--#define BRCMF_MAX_DEFAULT_KEYS 4 +-+#define BRCMF_MAX_DEFAULT_KEYS 6 +- +- /* beacon loss timeout defaults */ +- #define BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_ON 2 +-@@ -107,7 +107,6 @@ struct brcmf_cfg80211_security { +- u32 auth_type; +- u32 cipher_pairwise; +- u32 cipher_group; +-- u32 wpa_auth; +- }; +- +- /** +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c +-@@ -161,6 +161,7 @@ void brcmf_feat_attach(struct brcmf_pub +- ifp->drvr->feat_flags &= ~BIT(BRCMF_FEAT_MBSS); +- brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode"); +- brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable"); +-+ brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MFP, "mfp"); +- +- pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER; +- err = brcmf_fil_iovar_data_get(ifp, "pfn_macaddr", &pfn_mac, +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h +-@@ -30,6 +30,7 @@ +- * WOWL_ND: WOWL net detect (PNO) +- * WOWL_GTK: (WOWL) GTK rekeying offload +- * WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL. +-+ * MFP: 802.11w Management Frame Protection. +- */ +- #define BRCMF_FEAT_LIST \ +- BRCMF_FEAT_DEF(MBSS) \ +-@@ -42,7 +43,8 @@ +- BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) \ +- BRCMF_FEAT_DEF(WOWL_ND) \ +- BRCMF_FEAT_DEF(WOWL_GTK) \ +-- BRCMF_FEAT_DEF(WOWL_ARP_ND) +-+ BRCMF_FEAT_DEF(WOWL_ARP_ND) \ +-+ BRCMF_FEAT_DEF(MFP) +- +- /* +- * Quirks: +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h +-@@ -142,6 +142,10 @@ +- #define BRCMF_RSN_KEK_LENGTH 16 +- #define BRCMF_RSN_REPLAY_LEN 8 +- +-+#define BRCMF_MFP_NONE 0 +-+#define BRCMF_MFP_CAPABLE 1 +-+#define BRCMF_MFP_REQUIRED 2 +-+ +- /* join preference types for join_pref iovar */ +- enum brcmf_join_pref_types { +- BRCMF_JOIN_PREF_RSSI = 1, +---- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h +-@@ -236,6 +236,8 @@ static inline bool ac_bitmap_tst(u8 bitm +- #define WPA2_AUTH_RESERVED3 0x0200 +- #define WPA2_AUTH_RESERVED4 0x0400 +- #define WPA2_AUTH_RESERVED5 0x0800 +-+#define WPA2_AUTH_1X_SHA256 0x1000 /* 1X with SHA256 key derivation */ +-+#define WPA2_AUTH_PSK_SHA256 0x8000 /* PSK with SHA256 key derivation */ +- +- #define DOT11_DEFAULT_RTS_LEN 2347 +- #define DOT11_DEFAULT_FRAG_LEN 2346 diff --git a/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch new file mode 100644 index 0000000..3bbca22 @@ -11555,10 +15921,370 @@ index 0000000..3bbca22 + /* tx */ + struct work_struct work; + struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; -diff --git a/package/kernel/mac80211/patches/345-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch b/package/kernel/mac80211/patches/345-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch +diff --git a/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch b/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch +deleted file mode 100644 +index 39f4383..0000000 +--- a/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch ++++ /dev/null +@@ -1,54 +0,0 @@ +-From: Hui Wang +-Date: Wed, 9 Mar 2016 15:25:26 +0800 +-Subject: [PATCH] brcmfmac: Remove waitqueue_active check +- +-We met a problem of pm_suspend when repeated closing/opening the lid +-on a Lenovo laptop (1/20 reproduce rate), below is the log: +- +-[ 199.735876] PM: Entering mem sleep +-[ 199.750516] e1000e: EEE TX LPI TIMER: 00000011 +-[ 199.856638] Trying to free nonexistent resource <000000000000d000-000000000000d0ff> +-[ 201.753566] brcmfmac: brcmf_pcie_suspend: Timeout on response for entering D3 substate +-[ 201.753581] pci_legacy_suspend(): brcmf_pcie_suspend+0x0/0x1f0 [brcmfmac] returns -5 +-[ 201.753585] dpm_run_callback(): pci_pm_suspend+0x0/0x160 returns -5 +-[ 201.753589] PM: Device 0000:04:00.0 failed to suspend async: error -5 +- +-Through debugging, we found when problem happens, it is not the device +-fails to enter D3, but the signal D3_ACK comes too early to pass the +-waitqueue_active() check. +- +-Just like this: +-brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D3_INFORM); +-// signal is triggered here +-wait_event_timeout(devinfo->mbdata_resp_wait, devinfo->mbdata_completed, +- BRCMF_PCIE_MBDATA_TIMEOUT); +- +-So far I think it is safe to remove waitqueue_active check since there +-is only one place to trigger this signal (sending +-BRCMF_H2D_HOST_D3_INFORM). And it is not a problem calling wake_up +-event earlier than calling wait_event. +- +-Cc: Brett Rudley +-Cc: Hante Meuleman +-Cc: Franky (Zhenhui) Lin +-Cc: Pieter-Paul Giesberts +-Cc: Arend van Spriel +-Signed-off-by: Hui Wang +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +-@@ -677,10 +677,8 @@ static void brcmf_pcie_handle_mb_data(st +- brcmf_dbg(PCIE, "D2H_MB_DATA: DEEP SLEEP EXIT\n"); +- if (dtoh_mb_data & BRCMF_D2H_DEV_D3_ACK) { +- brcmf_dbg(PCIE, "D2H_MB_DATA: D3 ACK\n"); +-- if (waitqueue_active(&devinfo->mbdata_resp_wait)) { +-- devinfo->mbdata_completed = true; +-- wake_up(&devinfo->mbdata_resp_wait); +-- } +-+ devinfo->mbdata_completed = true; +-+ wake_up(&devinfo->mbdata_resp_wait); +- } +- } +- +diff --git a/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch b/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch +new file mode 100644 +index 0000000..c3d3118 +--- /dev/null ++++ b/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch +@@ -0,0 +1,26 @@ ++From: Johannes Berg ++Date: Mon, 29 Aug 2016 23:25:19 +0300 ++Subject: [PATCH] mac80211: send delBA on unexpected BlockAck Request ++ ++If we don't have a BA session, send delBA, as requested by the ++IEEE 802.11 spec. Apply the same limit of sending such a delBA ++only once as in the previous patch. ++ ++Signed-off-by: Johannes Berg ++--- ++ ++--- a/net/mac80211/rx.c +++++ b/net/mac80211/rx.c ++@@ -2537,6 +2537,12 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_ ++ ++ tid = le16_to_cpu(bar_data.control) >> 12; ++ +++ if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && +++ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) +++ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, +++ WLAN_BACK_RECIPIENT, +++ WLAN_REASON_QSTA_REQUIRE_SETUP); +++ ++ tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); ++ if (!tid_agg_rx) ++ return RX_DROP_MONITOR; +diff --git a/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch b/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch +deleted file mode 100644 +index 3c9ed42..0000000 +--- a/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch ++++ /dev/null +@@ -1,21 +0,0 @@ +-From: Dan Carpenter +-Date: Tue, 15 Mar 2016 10:06:10 +0300 +-Subject: [PATCH] brcmfmac: uninitialized "ret" variable +- +-There is an error path where "ret" isn't initialized. +- +-Signed-off-by: Dan Carpenter +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-@@ -250,7 +250,7 @@ static int brcmf_sdiod_request_data(stru +- u32 addr, u8 regsz, void *data, bool write) +- { +- struct sdio_func *func; +-- int ret; +-+ int ret = -EINVAL; +- +- brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n", +- write, fn, addr, regsz); +diff --git a/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch b/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch +new file mode 100644 +index 0000000..a82d12f +--- /dev/null ++++ b/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch +@@ -0,0 +1,107 @@ ++From: Felix Fietkau ++Date: Sun, 4 Sep 2016 17:46:24 +0200 ++Subject: [PATCH] mac80211: fix sequence number assignment for PS response ++ frames ++ ++When using intermediate queues, sequence number allocation is deferred ++until dequeue. This doesn't work for PS response frames, which bypass ++those queues. ++ ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/net/mac80211/tx.c +++++ b/net/mac80211/tx.c ++@@ -792,6 +792,36 @@ static __le16 ieee80211_tx_next_seq(stru ++ return ret; ++ } ++ +++static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, +++ struct ieee80211_vif *vif, +++ struct ieee80211_sta *pubsta, +++ struct sk_buff *skb) +++{ +++ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; +++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +++ struct ieee80211_txq *txq = NULL; +++ +++ if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || +++ (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) +++ return NULL; +++ +++ if (!ieee80211_is_data(hdr->frame_control)) +++ return NULL; +++ +++ if (pubsta) { +++ u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; +++ +++ txq = pubsta->txq[tid]; +++ } else if (vif) { +++ txq = vif->txq; +++ } +++ +++ if (!txq) +++ return NULL; +++ +++ return to_txq_info(txq); +++} +++ ++ static ieee80211_tx_result debug_noinline ++ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) ++ { ++@@ -849,7 +879,8 @@ ieee80211_tx_h_sequence(struct ieee80211 ++ tid = *qc & IEEE80211_QOS_CTL_TID_MASK; ++ tx->sta->tx_stats.msdu[tid]++; ++ ++- if (!tx->sta->sta.txq[0]) +++ if (!ieee80211_get_txq(tx->local, info->control.vif, &tx->sta->sta, +++ tx->skb)) ++ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); ++ ++ return TX_CONTINUE; ++@@ -1238,36 +1269,6 @@ ieee80211_tx_prepare(struct ieee80211_su ++ return TX_CONTINUE; ++ } ++ ++-static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, ++- struct ieee80211_vif *vif, ++- struct ieee80211_sta *pubsta, ++- struct sk_buff *skb) ++-{ ++- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; ++- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++- struct ieee80211_txq *txq = NULL; ++- ++- if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || ++- (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) ++- return NULL; ++- ++- if (!ieee80211_is_data(hdr->frame_control)) ++- return NULL; ++- ++- if (pubsta) { ++- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; ++- ++- txq = pubsta->txq[tid]; ++- } else if (vif) { ++- txq = vif->txq; ++- } ++- ++- if (!txq) ++- return NULL; ++- ++- return to_txq_info(txq); ++-} ++- ++ static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb) ++ { ++ IEEE80211_SKB_CB(skb)->control.enqueue_time = codel_get_time(); ++@@ -3265,7 +3266,7 @@ static bool ieee80211_xmit_fast(struct i ++ ++ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { ++ *ieee80211_get_qos_ctl(hdr) = tid; ++- if (!sta->sta.txq[0]) +++ if (!ieee80211_get_txq(local, &sdata->vif, &sta->sta, skb)) ++ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); ++ } else { ++ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; +diff --git a/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch b/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch +deleted file mode 100644 +index d1deb6e..0000000 +--- a/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch ++++ /dev/null +@@ -1,24 +0,0 @@ +-From: Colin Ian King +-Date: Sun, 20 Mar 2016 17:34:52 +0000 +-Subject: [PATCH] brcmfmac: sdio: remove unused variable retry_limit +- +-retry_limit has never been used during the life of this driver, so +-we may as well remove it as it is redundant. +- +-Signed-off-by: Colin Ian King +-Reviewed-by: Julian Calaby +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-@@ -535,9 +535,6 @@ static int qcount[NUMPRIO]; +- +- #define RETRYCHAN(chan) ((chan) == SDPCM_EVENT_CHANNEL) +- +--/* Retry count for register access failures */ +--static const uint retry_limit = 2; +-- +- /* Limit on rounding up frames */ +- static const uint max_roundup = 512; +- +diff --git a/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch b/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch +deleted file mode 100644 +index d399b26..0000000 +--- a/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch ++++ /dev/null +@@ -1,26 +0,0 @@ +-From: Markus Elfring +-Date: Fri, 18 Mar 2016 13:23:24 +1100 +-Subject: [PATCH] brcmfmac: Delete unnecessary variable initialisation +- +-In brcmf_sdio_download_firmware(), bcmerror is set by the call to +-brcmf_sdio_download_code_file(), before it's checked in the following +-line. +- +-Signed-off-by: Markus Elfring +-Acked-by: Arend van Spriel +-[Rewrote commit message] +-Signed-off-by: Julian Calaby +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-@@ -3258,7 +3258,7 @@ static int brcmf_sdio_download_firmware( +- const struct firmware *fw, +- void *nvram, u32 nvlen) +- { +-- int bcmerror = -EFAULT; +-+ int bcmerror; +- u32 rstvec; +- +- sdio_claim_host(bus->sdiodev->func[1]); +diff --git a/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch b/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch +deleted file mode 100644 +index 0acb4fa..0000000 +--- a/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch ++++ /dev/null +@@ -1,27 +0,0 @@ +-From: Hante Meuleman +-Date: Mon, 11 Apr 2016 11:35:21 +0200 +-Subject: [PATCH] brcmfmac: clear eventmask array before using it +- +-When the event_msgs iovar is set an array is used to configure the +-enabled events. This arrays needs to nulled before configuring +-otherwise unhandled events will be enabled. This solves a problem +-where in case of wowl the host got woken by an incorrectly enabled +-event. +- +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Arend Van Spriel +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +-@@ -371,6 +371,7 @@ int brcmf_fweh_activate_events(struct br +- int i, err; +- s8 eventmask[BRCMF_EVENTING_MASK_LEN]; +- +-+ memset(eventmask, 0, sizeof(eventmask)); +- for (i = 0; i < BRCMF_E_LAST; i++) { +- if (ifp->drvr->fweh.evt_handler[i]) { +- brcmf_dbg(EVENT, "enable event %s\n", +diff --git a/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch b/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch +deleted file mode 100644 +index 8d30678..0000000 +--- a/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch ++++ /dev/null +@@ -1,27 +0,0 @@ +-From: Hante Meuleman +-Date: Mon, 11 Apr 2016 11:35:22 +0200 +-Subject: [PATCH] brcmfmac: fix clearing wowl wake indicators +- +-Newer firmwares require the usage of the wowl wakeind struct as size +-for the iovar to clear the wake indicators. Older firmwares do not +-care, so change the used size. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -3608,7 +3608,8 @@ static void brcmf_configure_wowl(struct +- if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) +- wowl_config |= BRCMF_WOWL_UNASSOC; +- +-- brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", "clear", strlen("clear")); +-+ brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", "clear", +-+ sizeof(struct brcmf_wowl_wakeind_le)); +- brcmf_fil_iovar_int_set(ifp, "wowl", wowl_config); +- brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1); +- brcmf_bus_wowl_config(cfg->pub->bus_if, true); +diff --git a/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch b/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch deleted file mode 100644 index f293401..0000000 ---- a/package/kernel/mac80211/patches/345-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch +--- a/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch +++ /dev/null @@ -1,114 +0,0 @@ -From: Hante Meuleman @@ -11675,151 +16401,4180 @@ index f293401..0000000 - pad = nvp.nvram_len; - *new_length = roundup(nvp.nvram_len + 1, 4); - while (pad != *new_length) { -diff --git a/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch b/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch -new file mode 100644 -index 0000000..c3d3118 ---- /dev/null -+++ b/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch -@@ -0,0 +1,26 @@ -+From: Johannes Berg -+Date: Mon, 29 Aug 2016 23:25:19 +0300 -+Subject: [PATCH] mac80211: send delBA on unexpected BlockAck Request -+ -+If we don't have a BA session, send delBA, as requested by the -+IEEE 802.11 spec. Apply the same limit of sending such a delBA -+only once as in the previous patch. -+ -+Signed-off-by: Johannes Berg -+--- -+ -+--- a/net/mac80211/rx.c -++++ b/net/mac80211/rx.c -+@@ -2537,6 +2537,12 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_ -+ -+ tid = le16_to_cpu(bar_data.control) >> 12; -+ -++ if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && -++ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) -++ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, -++ WLAN_BACK_RECIPIENT, -++ WLAN_REASON_QSTA_REQUIRE_SETUP); -++ -+ tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); -+ if (!tid_agg_rx) -+ return RX_DROP_MONITOR; -diff --git a/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch b/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch -new file mode 100644 -index 0000000..a82d12f ---- /dev/null -+++ b/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch -@@ -0,0 +1,107 @@ -+From: Felix Fietkau -+Date: Sun, 4 Sep 2016 17:46:24 +0200 -+Subject: [PATCH] mac80211: fix sequence number assignment for PS response -+ frames -+ -+When using intermediate queues, sequence number allocation is deferred -+until dequeue. This doesn't work for PS response frames, which bypass -+those queues. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/net/mac80211/tx.c -++++ b/net/mac80211/tx.c -+@@ -792,6 +792,36 @@ static __le16 ieee80211_tx_next_seq(stru -+ return ret; -+ } -+ -++static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, -++ struct ieee80211_vif *vif, -++ struct ieee80211_sta *pubsta, -++ struct sk_buff *skb) -++{ -++ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ struct ieee80211_txq *txq = NULL; -++ -++ if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || -++ (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) -++ return NULL; -++ -++ if (!ieee80211_is_data(hdr->frame_control)) -++ return NULL; -++ -++ if (pubsta) { -++ u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; -++ -++ txq = pubsta->txq[tid]; -++ } else if (vif) { -++ txq = vif->txq; -++ } -++ -++ if (!txq) -++ return NULL; -++ -++ return to_txq_info(txq); -++} -++ -+ static ieee80211_tx_result debug_noinline -+ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) -+ { -+@@ -849,7 +879,8 @@ ieee80211_tx_h_sequence(struct ieee80211 -+ tid = *qc & IEEE80211_QOS_CTL_TID_MASK; -+ tx->sta->tx_stats.msdu[tid]++; -+ -+- if (!tx->sta->sta.txq[0]) -++ if (!ieee80211_get_txq(tx->local, info->control.vif, &tx->sta->sta, -++ tx->skb)) -+ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); -+ -+ return TX_CONTINUE; -+@@ -1238,36 +1269,6 @@ ieee80211_tx_prepare(struct ieee80211_su -+ return TX_CONTINUE; -+ } -+ -+-static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, -+- struct ieee80211_vif *vif, -+- struct ieee80211_sta *pubsta, -+- struct sk_buff *skb) -+-{ -+- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; -+- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+- struct ieee80211_txq *txq = NULL; -+- -+- if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || -+- (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) -+- return NULL; -+- -+- if (!ieee80211_is_data(hdr->frame_control)) -+- return NULL; -+- -+- if (pubsta) { -+- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; -+- -+- txq = pubsta->txq[tid]; -+- } else if (vif) { -+- txq = vif->txq; -+- } -+- -+- if (!txq) -+- return NULL; -+- -+- return to_txq_info(txq); -+-} -+- -+ static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb) -+ { -+ IEEE80211_SKB_CB(skb)->control.enqueue_time = codel_get_time(); -+@@ -3265,7 +3266,7 @@ static bool ieee80211_xmit_fast(struct i -+ -+ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { -+ *ieee80211_get_qos_ctl(hdr) = tid; -+- if (!sta->sta.txq[0]) -++ if (!ieee80211_get_txq(local, &sdata->vif, &sta->sta, skb)) -+ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); -+ } else { -+ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; +diff --git a/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch b/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch +deleted file mode 100644 +index ed0c83f..0000000 +--- a/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch ++++ /dev/null +@@ -1,29 +0,0 @@ +-From: Hante Meuleman +-Date: Mon, 11 Apr 2016 11:35:24 +0200 +-Subject: [PATCH] brcmfmac: fix p2p scan abort null pointer exception +- +-When p2p connection setup is performed without having ever done an +-escan a null pointer exception can occur. This is because the ifp +-to abort scanning is taken from escan struct while it was never +-initialized. Fix this by using the primary ifp for scan abort. The +-abort should still be performed and all scan related commands are +-performed on primary ifp. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -1266,7 +1266,7 @@ static void +- brcmf_p2p_stop_wait_next_action_frame(struct brcmf_cfg80211_info *cfg) +- { +- struct brcmf_p2p_info *p2p = &cfg->p2p; +-- struct brcmf_if *ifp = cfg->escan_info.ifp; +-+ struct brcmf_if *ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; +- +- if (test_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status) && +- (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status) || +diff --git a/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch b/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch +deleted file mode 100644 +index 4d26404..0000000 +--- a/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch ++++ /dev/null +@@ -1,297 +0,0 @@ +-From: Franky Lin +-Date: Mon, 11 Apr 2016 11:35:25 +0200 +-Subject: [PATCH] brcmfmac: screening firmware event packet +- +-Firmware uses asynchronized events as a communication method to the +-host. The event packets are marked as ETH_P_LINK_CTL protocol type. For +-SDIO and PCIe bus, this kind of packets are delivered through virtual +-event channel not data channel. This patch adds a screening logic to +-make sure the event handler only processes the events coming from the +-correct channel. +- +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +-@@ -216,7 +216,9 @@ bool brcmf_c_prec_enq(struct device *dev +- int prec); +- +- /* Receive frame for delivery to OS. Callee disposes of rxp. */ +--void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp); +-+void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_evnt); +-+/* Receive async event packet from firmware. Callee disposes of rxp. */ +-+void brcmf_rx_event(struct device *dev, struct sk_buff *rxp); +- +- /* Indication from bus module regarding presence/insertion of dongle. */ +- int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -311,16 +311,17 @@ void brcmf_txflowblock(struct device *de +- brcmf_fws_bus_blocked(drvr, state); +- } +- +--void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb) +-+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, +-+ bool handle_event) +- { +-- skb->dev = ifp->ndev; +-- skb->protocol = eth_type_trans(skb, skb->dev); +-+ skb->protocol = eth_type_trans(skb, ifp->ndev); +- +- if (skb->pkt_type == PACKET_MULTICAST) +- ifp->stats.multicast++; +- +- /* Process special event packets */ +-- brcmf_fweh_process_skb(ifp->drvr, skb); +-+ if (handle_event) +-+ brcmf_fweh_process_skb(ifp->drvr, skb); +- +- if (!(ifp->ndev->flags & IFF_UP)) { +- brcmu_pkt_buf_free_skb(skb); +-@@ -381,7 +382,7 @@ static void brcmf_rxreorder_process_info +- /* validate flags and flow id */ +- if (flags == 0xFF) { +- brcmf_err("invalid flags...so ignore this packet\n"); +-- brcmf_netif_rx(ifp, pkt); +-+ brcmf_netif_rx(ifp, pkt, false); +- return; +- } +- +-@@ -393,7 +394,7 @@ static void brcmf_rxreorder_process_info +- if (rfi == NULL) { +- brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n", +- flow_id); +-- brcmf_netif_rx(ifp, pkt); +-+ brcmf_netif_rx(ifp, pkt, false); +- return; +- } +- +-@@ -418,7 +419,7 @@ static void brcmf_rxreorder_process_info +- rfi = kzalloc(buf_size, GFP_ATOMIC); +- if (rfi == NULL) { +- brcmf_err("failed to alloc buffer\n"); +-- brcmf_netif_rx(ifp, pkt); +-+ brcmf_netif_rx(ifp, pkt, false); +- return; +- } +- +-@@ -532,11 +533,11 @@ static void brcmf_rxreorder_process_info +- netif_rx: +- skb_queue_walk_safe(&reorder_list, pkt, pnext) { +- __skb_unlink(pkt, &reorder_list); +-- brcmf_netif_rx(ifp, pkt); +-+ brcmf_netif_rx(ifp, pkt, false); +- } +- } +- +--void brcmf_rx_frame(struct device *dev, struct sk_buff *skb) +-+void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt) +- { +- struct brcmf_if *ifp; +- struct brcmf_bus *bus_if = dev_get_drvdata(dev); +-@@ -560,7 +561,32 @@ void brcmf_rx_frame(struct device *dev, +- if (rd->reorder) +- brcmf_rxreorder_process_info(ifp, rd->reorder, skb); +- else +-- brcmf_netif_rx(ifp, skb); +-+ brcmf_netif_rx(ifp, skb, handle_evnt); +-+} +-+ +-+void brcmf_rx_event(struct device *dev, struct sk_buff *skb) +-+{ +-+ struct brcmf_if *ifp; +-+ struct brcmf_bus *bus_if = dev_get_drvdata(dev); +-+ struct brcmf_pub *drvr = bus_if->drvr; +-+ int ret; +-+ +-+ brcmf_dbg(EVENT, "Enter: %s: rxp=%p\n", dev_name(dev), skb); +-+ +-+ /* process and remove protocol-specific header */ +-+ ret = brcmf_proto_hdrpull(drvr, true, skb, &ifp); +-+ +-+ if (ret || !ifp || !ifp->ndev) { +-+ if (ret != -ENODATA && ifp) +-+ ifp->stats.rx_errors++; +-+ brcmu_pkt_buf_free_skb(skb); +-+ return; +-+ } +-+ +-+ skb->protocol = eth_type_trans(skb, ifp->ndev); +-+ +-+ brcmf_fweh_process_skb(ifp->drvr, skb); +-+ brcmu_pkt_buf_free_skb(skb); +- } +- +- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success) +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -225,7 +225,8 @@ int brcmf_get_next_free_bsscfgidx(struct +- void brcmf_txflowblock_if(struct brcmf_if *ifp, +- enum brcmf_netif_stop_reason reason, bool state); +- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); +--void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); +-+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, +-+ bool handle_event); +- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); +- int __init brcmf_core_init(void); +- void __exit brcmf_core_exit(void); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +-@@ -20,6 +20,7 @@ +- +- #include +- #include +-+#include +- +- #include +- #include +-@@ -1075,28 +1076,13 @@ static void brcmf_msgbuf_rxbuf_event_pos +- } +- +- +--static void +--brcmf_msgbuf_rx_skb(struct brcmf_msgbuf *msgbuf, struct sk_buff *skb, +-- u8 ifidx) +--{ +-- struct brcmf_if *ifp; +-- +-- ifp = brcmf_get_ifp(msgbuf->drvr, ifidx); +-- if (!ifp || !ifp->ndev) { +-- brcmf_err("Received pkt for invalid ifidx %d\n", ifidx); +-- brcmu_pkt_buf_free_skb(skb); +-- return; +-- } +-- brcmf_netif_rx(ifp, skb); +--} +-- +-- +- static void brcmf_msgbuf_process_event(struct brcmf_msgbuf *msgbuf, void *buf) +- { +- struct msgbuf_rx_event *event; +- u32 idx; +- u16 buflen; +- struct sk_buff *skb; +-+ struct brcmf_if *ifp; +- +- event = (struct msgbuf_rx_event *)buf; +- idx = le32_to_cpu(event->msg.request_id); +-@@ -1116,7 +1102,19 @@ static void brcmf_msgbuf_process_event(s +- +- skb_trim(skb, buflen); +- +-- brcmf_msgbuf_rx_skb(msgbuf, skb, event->msg.ifidx); +-+ ifp = brcmf_get_ifp(msgbuf->drvr, event->msg.ifidx); +-+ if (!ifp || !ifp->ndev) { +-+ brcmf_err("Received pkt for invalid ifidx %d\n", +-+ event->msg.ifidx); +-+ goto exit; +-+ } +-+ +-+ skb->protocol = eth_type_trans(skb, ifp->ndev); +-+ +-+ brcmf_fweh_process_skb(ifp->drvr, skb); +-+ +-+exit: +-+ brcmu_pkt_buf_free_skb(skb); +- } +- +- +-@@ -1128,6 +1126,7 @@ brcmf_msgbuf_process_rx_complete(struct +- u16 data_offset; +- u16 buflen; +- u32 idx; +-+ struct brcmf_if *ifp; +- +- brcmf_msgbuf_update_rxbufpost_count(msgbuf, 1); +- +-@@ -1148,7 +1147,14 @@ brcmf_msgbuf_process_rx_complete(struct +- +- skb_trim(skb, buflen); +- +-- brcmf_msgbuf_rx_skb(msgbuf, skb, rx_complete->msg.ifidx); +-+ ifp = brcmf_get_ifp(msgbuf->drvr, rx_complete->msg.ifidx); +-+ if (!ifp || !ifp->ndev) { +-+ brcmf_err("Received pkt for invalid ifidx %d\n", +-+ rx_complete->msg.ifidx); +-+ brcmu_pkt_buf_free_skb(skb); +-+ return; +-+ } +-+ brcmf_netif_rx(ifp, skb, false); +- } +- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-@@ -1294,6 +1294,17 @@ static inline u8 brcmf_sdio_getdatoffset +- return (u8)((hdrvalue & SDPCM_DOFFSET_MASK) >> SDPCM_DOFFSET_SHIFT); +- } +- +-+static inline bool brcmf_sdio_fromevntchan(u8 *swheader) +-+{ +-+ u32 hdrvalue; +-+ u8 ret; +-+ +-+ hdrvalue = *(u32 *)swheader; +-+ ret = (u8)((hdrvalue & SDPCM_CHANNEL_MASK) >> SDPCM_CHANNEL_SHIFT); +-+ +-+ return (ret == SDPCM_EVENT_CHANNEL); +-+} +-+ +- static int brcmf_sdio_hdparse(struct brcmf_sdio *bus, u8 *header, +- struct brcmf_sdio_hdrinfo *rd, +- enum brcmf_sdio_frmtype type) +-@@ -1641,7 +1652,11 @@ static u8 brcmf_sdio_rxglom(struct brcmf +- pfirst->len, pfirst->next, +- pfirst->prev); +- skb_unlink(pfirst, &bus->glom); +-- brcmf_rx_frame(bus->sdiodev->dev, pfirst); +-+ if (brcmf_sdio_fromevntchan(pfirst->data)) +-+ brcmf_rx_event(bus->sdiodev->dev, pfirst); +-+ else +-+ brcmf_rx_frame(bus->sdiodev->dev, pfirst, +-+ false); +- bus->sdcnt.rxglompkts++; +- } +- +-@@ -1967,18 +1982,19 @@ static uint brcmf_sdio_readframes(struct +- __skb_trim(pkt, rd->len); +- skb_pull(pkt, rd->dat_offset); +- +-+ if (pkt->len == 0) +-+ brcmu_pkt_buf_free_skb(pkt); +-+ else if (rd->channel == SDPCM_EVENT_CHANNEL) +-+ brcmf_rx_event(bus->sdiodev->dev, pkt); +-+ else +-+ brcmf_rx_frame(bus->sdiodev->dev, pkt, +-+ false); +-+ +- /* prepare the descriptor for the next read */ +- rd->len = rd->len_nxtfrm << 4; +- rd->len_nxtfrm = 0; +- /* treat all packet as event if we don't know */ +- rd->channel = SDPCM_EVENT_CHANNEL; +-- +-- if (pkt->len == 0) { +-- brcmu_pkt_buf_free_skb(pkt); +-- continue; +-- } +-- +-- brcmf_rx_frame(bus->sdiodev->dev, pkt); +- } +- +- rxcount = maxframes - rxleft; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +-@@ -514,7 +514,7 @@ static void brcmf_usb_rx_complete(struct +- +- if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) { +- skb_put(skb, urb->actual_length); +-- brcmf_rx_frame(devinfo->dev, skb); +-+ brcmf_rx_frame(devinfo->dev, skb, true); +- brcmf_usb_rx_refill(devinfo, req); +- } else { +- brcmu_pkt_buf_free_skb(skb); +diff --git a/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch b/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch +deleted file mode 100644 +index 33b263d..0000000 +--- a/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch ++++ /dev/null +@@ -1,585 +0,0 @@ +-From: Arend van Spriel +-Date: Mon, 11 Apr 2016 11:35:26 +0200 +-Subject: [PATCH] brcmfmac: cleanup ampdu-rx host reorder code +- +-The code for ampdu-rx host reorder is related to the firmware signalling +-supported in BCDC protocol. This change moves the code to fwsignal module. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c +-@@ -351,6 +351,12 @@ brcmf_proto_bcdc_add_tdls_peer(struct br +- { +- } +- +-+static void brcmf_proto_bcdc_rxreorder(struct brcmf_if *ifp, +-+ struct sk_buff *skb) +-+{ +-+ brcmf_fws_rxreorder(ifp, skb); +-+} +-+ +- int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) +- { +- struct brcmf_bcdc *bcdc; +-@@ -372,6 +378,7 @@ int brcmf_proto_bcdc_attach(struct brcmf +- drvr->proto->configure_addr_mode = brcmf_proto_bcdc_configure_addr_mode; +- drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer; +- drvr->proto->add_tdls_peer = brcmf_proto_bcdc_add_tdls_peer; +-+ drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder; +- drvr->proto->pd = bcdc; +- +- drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -40,19 +40,6 @@ +- +- #define MAX_WAIT_FOR_8021X_TX msecs_to_jiffies(950) +- +--/* AMPDU rx reordering definitions */ +--#define BRCMF_RXREORDER_FLOWID_OFFSET 0 +--#define BRCMF_RXREORDER_MAXIDX_OFFSET 2 +--#define BRCMF_RXREORDER_FLAGS_OFFSET 4 +--#define BRCMF_RXREORDER_CURIDX_OFFSET 6 +--#define BRCMF_RXREORDER_EXPIDX_OFFSET 8 +-- +--#define BRCMF_RXREORDER_DEL_FLOW 0x01 +--#define BRCMF_RXREORDER_FLUSH_ALL 0x02 +--#define BRCMF_RXREORDER_CURIDX_VALID 0x04 +--#define BRCMF_RXREORDER_EXPIDX_VALID 0x08 +--#define BRCMF_RXREORDER_NEW_HOLE 0x10 +-- +- #define BRCMF_BSSIDX_INVALID -1 +- +- char *brcmf_ifname(struct brcmf_if *ifp) +-@@ -342,207 +329,11 @@ void brcmf_netif_rx(struct brcmf_if *ifp +- netif_rx_ni(skb); +- } +- +--static void brcmf_rxreorder_get_skb_list(struct brcmf_ampdu_rx_reorder *rfi, +-- u8 start, u8 end, +-- struct sk_buff_head *skb_list) +--{ +-- /* initialize return list */ +-- __skb_queue_head_init(skb_list); +-- +-- if (rfi->pend_pkts == 0) { +-- brcmf_dbg(INFO, "no packets in reorder queue\n"); +-- return; +-- } +-- +-- do { +-- if (rfi->pktslots[start]) { +-- __skb_queue_tail(skb_list, rfi->pktslots[start]); +-- rfi->pktslots[start] = NULL; +-- } +-- start++; +-- if (start > rfi->max_idx) +-- start = 0; +-- } while (start != end); +-- rfi->pend_pkts -= skb_queue_len(skb_list); +--} +-- +--static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data, +-- struct sk_buff *pkt) +--{ +-- u8 flow_id, max_idx, cur_idx, exp_idx, end_idx; +-- struct brcmf_ampdu_rx_reorder *rfi; +-- struct sk_buff_head reorder_list; +-- struct sk_buff *pnext; +-- u8 flags; +-- u32 buf_size; +-- +-- flow_id = reorder_data[BRCMF_RXREORDER_FLOWID_OFFSET]; +-- flags = reorder_data[BRCMF_RXREORDER_FLAGS_OFFSET]; +-- +-- /* validate flags and flow id */ +-- if (flags == 0xFF) { +-- brcmf_err("invalid flags...so ignore this packet\n"); +-- brcmf_netif_rx(ifp, pkt, false); +-- return; +-- } +-- +-- rfi = ifp->drvr->reorder_flows[flow_id]; +-- if (flags & BRCMF_RXREORDER_DEL_FLOW) { +-- brcmf_dbg(INFO, "flow-%d: delete\n", +-- flow_id); +-- +-- if (rfi == NULL) { +-- brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n", +-- flow_id); +-- brcmf_netif_rx(ifp, pkt, false); +-- return; +-- } +-- +-- brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, rfi->exp_idx, +-- &reorder_list); +-- /* add the last packet */ +-- __skb_queue_tail(&reorder_list, pkt); +-- kfree(rfi); +-- ifp->drvr->reorder_flows[flow_id] = NULL; +-- goto netif_rx; +-- } +-- /* from here on we need a flow reorder instance */ +-- if (rfi == NULL) { +-- buf_size = sizeof(*rfi); +-- max_idx = reorder_data[BRCMF_RXREORDER_MAXIDX_OFFSET]; +-- +-- buf_size += (max_idx + 1) * sizeof(pkt); +-- +-- /* allocate space for flow reorder info */ +-- brcmf_dbg(INFO, "flow-%d: start, maxidx %d\n", +-- flow_id, max_idx); +-- rfi = kzalloc(buf_size, GFP_ATOMIC); +-- if (rfi == NULL) { +-- brcmf_err("failed to alloc buffer\n"); +-- brcmf_netif_rx(ifp, pkt, false); +-- return; +-- } +-- +-- ifp->drvr->reorder_flows[flow_id] = rfi; +-- rfi->pktslots = (struct sk_buff **)(rfi+1); +-- rfi->max_idx = max_idx; +-- } +-- if (flags & BRCMF_RXREORDER_NEW_HOLE) { +-- if (rfi->pend_pkts) { +-- brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, +-- rfi->exp_idx, +-- &reorder_list); +-- WARN_ON(rfi->pend_pkts); +-- } else { +-- __skb_queue_head_init(&reorder_list); +-- } +-- rfi->cur_idx = reorder_data[BRCMF_RXREORDER_CURIDX_OFFSET]; +-- rfi->exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; +-- rfi->max_idx = reorder_data[BRCMF_RXREORDER_MAXIDX_OFFSET]; +-- rfi->pktslots[rfi->cur_idx] = pkt; +-- rfi->pend_pkts++; +-- brcmf_dbg(DATA, "flow-%d: new hole %d (%d), pending %d\n", +-- flow_id, rfi->cur_idx, rfi->exp_idx, rfi->pend_pkts); +-- } else if (flags & BRCMF_RXREORDER_CURIDX_VALID) { +-- cur_idx = reorder_data[BRCMF_RXREORDER_CURIDX_OFFSET]; +-- exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; +-- +-- if ((exp_idx == rfi->exp_idx) && (cur_idx != rfi->exp_idx)) { +-- /* still in the current hole */ +-- /* enqueue the current on the buffer chain */ +-- if (rfi->pktslots[cur_idx] != NULL) { +-- brcmf_dbg(INFO, "HOLE: ERROR buffer pending..free it\n"); +-- brcmu_pkt_buf_free_skb(rfi->pktslots[cur_idx]); +-- rfi->pktslots[cur_idx] = NULL; +-- } +-- rfi->pktslots[cur_idx] = pkt; +-- rfi->pend_pkts++; +-- rfi->cur_idx = cur_idx; +-- brcmf_dbg(DATA, "flow-%d: store pkt %d (%d), pending %d\n", +-- flow_id, cur_idx, exp_idx, rfi->pend_pkts); +-- +-- /* can return now as there is no reorder +-- * list to process. +-- */ +-- return; +-- } +-- if (rfi->exp_idx == cur_idx) { +-- if (rfi->pktslots[cur_idx] != NULL) { +-- brcmf_dbg(INFO, "error buffer pending..free it\n"); +-- brcmu_pkt_buf_free_skb(rfi->pktslots[cur_idx]); +-- rfi->pktslots[cur_idx] = NULL; +-- } +-- rfi->pktslots[cur_idx] = pkt; +-- rfi->pend_pkts++; +-- +-- /* got the expected one. flush from current to expected +-- * and update expected +-- */ +-- brcmf_dbg(DATA, "flow-%d: expected %d (%d), pending %d\n", +-- flow_id, cur_idx, exp_idx, rfi->pend_pkts); +-- +-- rfi->cur_idx = cur_idx; +-- rfi->exp_idx = exp_idx; +-- +-- brcmf_rxreorder_get_skb_list(rfi, cur_idx, exp_idx, +-- &reorder_list); +-- brcmf_dbg(DATA, "flow-%d: freeing buffers %d, pending %d\n", +-- flow_id, skb_queue_len(&reorder_list), +-- rfi->pend_pkts); +-- } else { +-- u8 end_idx; +-- +-- brcmf_dbg(DATA, "flow-%d (0x%x): both moved, old %d/%d, new %d/%d\n", +-- flow_id, flags, rfi->cur_idx, rfi->exp_idx, +-- cur_idx, exp_idx); +-- if (flags & BRCMF_RXREORDER_FLUSH_ALL) +-- end_idx = rfi->exp_idx; +-- else +-- end_idx = exp_idx; +-- +-- /* flush pkts first */ +-- brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, end_idx, +-- &reorder_list); +-- +-- if (exp_idx == ((cur_idx + 1) % (rfi->max_idx + 1))) { +-- __skb_queue_tail(&reorder_list, pkt); +-- } else { +-- rfi->pktslots[cur_idx] = pkt; +-- rfi->pend_pkts++; +-- } +-- rfi->exp_idx = exp_idx; +-- rfi->cur_idx = cur_idx; +-- } +-- } else { +-- /* explicity window move updating the expected index */ +-- exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; +-- +-- brcmf_dbg(DATA, "flow-%d (0x%x): change expected: %d -> %d\n", +-- flow_id, flags, rfi->exp_idx, exp_idx); +-- if (flags & BRCMF_RXREORDER_FLUSH_ALL) +-- end_idx = rfi->exp_idx; +-- else +-- end_idx = exp_idx; +-- +-- brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, end_idx, +-- &reorder_list); +-- __skb_queue_tail(&reorder_list, pkt); +-- /* set the new expected idx */ +-- rfi->exp_idx = exp_idx; +-- } +--netif_rx: +-- skb_queue_walk_safe(&reorder_list, pkt, pnext) { +-- __skb_unlink(pkt, &reorder_list); +-- brcmf_netif_rx(ifp, pkt, false); +-- } +--} +-- +- void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt) +- { +- struct brcmf_if *ifp; +- struct brcmf_bus *bus_if = dev_get_drvdata(dev); +- struct brcmf_pub *drvr = bus_if->drvr; +-- struct brcmf_skb_reorder_data *rd; +- int ret; +- +- brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb); +-@@ -557,9 +348,8 @@ void brcmf_rx_frame(struct device *dev, +- return; +- } +- +-- rd = (struct brcmf_skb_reorder_data *)skb->cb; +-- if (rd->reorder) +-- brcmf_rxreorder_process_info(ifp, rd->reorder, skb); +-+ if (brcmf_proto_is_reorder_skb(skb)) +-+ brcmf_proto_rxreorder(ifp, skb); +- else +- brcmf_netif_rx(ifp, skb, handle_evnt); +- } +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -208,10 +208,6 @@ struct brcmf_if { +- u8 ipv6addr_idx; +- }; +- +--struct brcmf_skb_reorder_data { +-- u8 *reorder; +--}; +-- +- int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp); +- +- /* Return pointer to interface name */ +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +-@@ -92,6 +92,19 @@ enum brcmf_fws_tlv_len { +- }; +- #undef BRCMF_FWS_TLV_DEF +- +-+/* AMPDU rx reordering definitions */ +-+#define BRCMF_RXREORDER_FLOWID_OFFSET 0 +-+#define BRCMF_RXREORDER_MAXIDX_OFFSET 2 +-+#define BRCMF_RXREORDER_FLAGS_OFFSET 4 +-+#define BRCMF_RXREORDER_CURIDX_OFFSET 6 +-+#define BRCMF_RXREORDER_EXPIDX_OFFSET 8 +-+ +-+#define BRCMF_RXREORDER_DEL_FLOW 0x01 +-+#define BRCMF_RXREORDER_FLUSH_ALL 0x02 +-+#define BRCMF_RXREORDER_CURIDX_VALID 0x04 +-+#define BRCMF_RXREORDER_EXPIDX_VALID 0x08 +-+#define BRCMF_RXREORDER_NEW_HOLE 0x10 +-+ +- #ifdef DEBUG +- /* +- * brcmf_fws_tlv_names - array of tlv names. +-@@ -1614,6 +1627,202 @@ static int brcmf_fws_notify_bcmc_credit_ +- return 0; +- } +- +-+static void brcmf_rxreorder_get_skb_list(struct brcmf_ampdu_rx_reorder *rfi, +-+ u8 start, u8 end, +-+ struct sk_buff_head *skb_list) +-+{ +-+ /* initialize return list */ +-+ __skb_queue_head_init(skb_list); +-+ +-+ if (rfi->pend_pkts == 0) { +-+ brcmf_dbg(INFO, "no packets in reorder queue\n"); +-+ return; +-+ } +-+ +-+ do { +-+ if (rfi->pktslots[start]) { +-+ __skb_queue_tail(skb_list, rfi->pktslots[start]); +-+ rfi->pktslots[start] = NULL; +-+ } +-+ start++; +-+ if (start > rfi->max_idx) +-+ start = 0; +-+ } while (start != end); +-+ rfi->pend_pkts -= skb_queue_len(skb_list); +-+} +-+ +-+void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt) +-+{ +-+ u8 *reorder_data; +-+ u8 flow_id, max_idx, cur_idx, exp_idx, end_idx; +-+ struct brcmf_ampdu_rx_reorder *rfi; +-+ struct sk_buff_head reorder_list; +-+ struct sk_buff *pnext; +-+ u8 flags; +-+ u32 buf_size; +-+ +-+ reorder_data = ((struct brcmf_skb_reorder_data *)pkt->cb)->reorder; +-+ flow_id = reorder_data[BRCMF_RXREORDER_FLOWID_OFFSET]; +-+ flags = reorder_data[BRCMF_RXREORDER_FLAGS_OFFSET]; +-+ +-+ /* validate flags and flow id */ +-+ if (flags == 0xFF) { +-+ brcmf_err("invalid flags...so ignore this packet\n"); +-+ brcmf_netif_rx(ifp, pkt, false); +-+ return; +-+ } +-+ +-+ rfi = ifp->drvr->reorder_flows[flow_id]; +-+ if (flags & BRCMF_RXREORDER_DEL_FLOW) { +-+ brcmf_dbg(INFO, "flow-%d: delete\n", +-+ flow_id); +-+ +-+ if (rfi == NULL) { +-+ brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n", +-+ flow_id); +-+ brcmf_netif_rx(ifp, pkt, false); +-+ return; +-+ } +-+ +-+ brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, rfi->exp_idx, +-+ &reorder_list); +-+ /* add the last packet */ +-+ __skb_queue_tail(&reorder_list, pkt); +-+ kfree(rfi); +-+ ifp->drvr->reorder_flows[flow_id] = NULL; +-+ goto netif_rx; +-+ } +-+ /* from here on we need a flow reorder instance */ +-+ if (rfi == NULL) { +-+ buf_size = sizeof(*rfi); +-+ max_idx = reorder_data[BRCMF_RXREORDER_MAXIDX_OFFSET]; +-+ +-+ buf_size += (max_idx + 1) * sizeof(pkt); +-+ +-+ /* allocate space for flow reorder info */ +-+ brcmf_dbg(INFO, "flow-%d: start, maxidx %d\n", +-+ flow_id, max_idx); +-+ rfi = kzalloc(buf_size, GFP_ATOMIC); +-+ if (rfi == NULL) { +-+ brcmf_err("failed to alloc buffer\n"); +-+ brcmf_netif_rx(ifp, pkt, false); +-+ return; +-+ } +-+ +-+ ifp->drvr->reorder_flows[flow_id] = rfi; +-+ rfi->pktslots = (struct sk_buff **)(rfi + 1); +-+ rfi->max_idx = max_idx; +-+ } +-+ if (flags & BRCMF_RXREORDER_NEW_HOLE) { +-+ if (rfi->pend_pkts) { +-+ brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, +-+ rfi->exp_idx, +-+ &reorder_list); +-+ WARN_ON(rfi->pend_pkts); +-+ } else { +-+ __skb_queue_head_init(&reorder_list); +-+ } +-+ rfi->cur_idx = reorder_data[BRCMF_RXREORDER_CURIDX_OFFSET]; +-+ rfi->exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; +-+ rfi->max_idx = reorder_data[BRCMF_RXREORDER_MAXIDX_OFFSET]; +-+ rfi->pktslots[rfi->cur_idx] = pkt; +-+ rfi->pend_pkts++; +-+ brcmf_dbg(DATA, "flow-%d: new hole %d (%d), pending %d\n", +-+ flow_id, rfi->cur_idx, rfi->exp_idx, rfi->pend_pkts); +-+ } else if (flags & BRCMF_RXREORDER_CURIDX_VALID) { +-+ cur_idx = reorder_data[BRCMF_RXREORDER_CURIDX_OFFSET]; +-+ exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; +-+ +-+ if ((exp_idx == rfi->exp_idx) && (cur_idx != rfi->exp_idx)) { +-+ /* still in the current hole */ +-+ /* enqueue the current on the buffer chain */ +-+ if (rfi->pktslots[cur_idx] != NULL) { +-+ brcmf_dbg(INFO, "HOLE: ERROR buffer pending..free it\n"); +-+ brcmu_pkt_buf_free_skb(rfi->pktslots[cur_idx]); +-+ rfi->pktslots[cur_idx] = NULL; +-+ } +-+ rfi->pktslots[cur_idx] = pkt; +-+ rfi->pend_pkts++; +-+ rfi->cur_idx = cur_idx; +-+ brcmf_dbg(DATA, "flow-%d: store pkt %d (%d), pending %d\n", +-+ flow_id, cur_idx, exp_idx, rfi->pend_pkts); +-+ +-+ /* can return now as there is no reorder +-+ * list to process. +-+ */ +-+ return; +-+ } +-+ if (rfi->exp_idx == cur_idx) { +-+ if (rfi->pktslots[cur_idx] != NULL) { +-+ brcmf_dbg(INFO, "error buffer pending..free it\n"); +-+ brcmu_pkt_buf_free_skb(rfi->pktslots[cur_idx]); +-+ rfi->pktslots[cur_idx] = NULL; +-+ } +-+ rfi->pktslots[cur_idx] = pkt; +-+ rfi->pend_pkts++; +-+ +-+ /* got the expected one. flush from current to expected +-+ * and update expected +-+ */ +-+ brcmf_dbg(DATA, "flow-%d: expected %d (%d), pending %d\n", +-+ flow_id, cur_idx, exp_idx, rfi->pend_pkts); +-+ +-+ rfi->cur_idx = cur_idx; +-+ rfi->exp_idx = exp_idx; +-+ +-+ brcmf_rxreorder_get_skb_list(rfi, cur_idx, exp_idx, +-+ &reorder_list); +-+ brcmf_dbg(DATA, "flow-%d: freeing buffers %d, pending %d\n", +-+ flow_id, skb_queue_len(&reorder_list), +-+ rfi->pend_pkts); +-+ } else { +-+ u8 end_idx; +-+ +-+ brcmf_dbg(DATA, "flow-%d (0x%x): both moved, old %d/%d, new %d/%d\n", +-+ flow_id, flags, rfi->cur_idx, rfi->exp_idx, +-+ cur_idx, exp_idx); +-+ if (flags & BRCMF_RXREORDER_FLUSH_ALL) +-+ end_idx = rfi->exp_idx; +-+ else +-+ end_idx = exp_idx; +-+ +-+ /* flush pkts first */ +-+ brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, end_idx, +-+ &reorder_list); +-+ +-+ if (exp_idx == ((cur_idx + 1) % (rfi->max_idx + 1))) { +-+ __skb_queue_tail(&reorder_list, pkt); +-+ } else { +-+ rfi->pktslots[cur_idx] = pkt; +-+ rfi->pend_pkts++; +-+ } +-+ rfi->exp_idx = exp_idx; +-+ rfi->cur_idx = cur_idx; +-+ } +-+ } else { +-+ /* explicity window move updating the expected index */ +-+ exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; +-+ +-+ brcmf_dbg(DATA, "flow-%d (0x%x): change expected: %d -> %d\n", +-+ flow_id, flags, rfi->exp_idx, exp_idx); +-+ if (flags & BRCMF_RXREORDER_FLUSH_ALL) +-+ end_idx = rfi->exp_idx; +-+ else +-+ end_idx = exp_idx; +-+ +-+ brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, end_idx, +-+ &reorder_list); +-+ __skb_queue_tail(&reorder_list, pkt); +-+ /* set the new expected idx */ +-+ rfi->exp_idx = exp_idx; +-+ } +-+netif_rx: +-+ skb_queue_walk_safe(&reorder_list, pkt, pnext) { +-+ __skb_unlink(pkt, &reorder_list); +-+ brcmf_netif_rx(ifp, pkt, false); +-+ } +-+} +-+ +- void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb) +- { +- struct brcmf_skb_reorder_data *rd; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h +-@@ -29,5 +29,6 @@ void brcmf_fws_add_interface(struct brcm +- void brcmf_fws_del_interface(struct brcmf_if *ifp); +- void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb); +- void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked); +-+void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb); +- +- #endif /* FWSIGNAL_H_ */ +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +-@@ -527,6 +527,9 @@ static int brcmf_msgbuf_hdrpull(struct b +- return -ENODEV; +- } +- +-+static void brcmf_msgbuf_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb) +-+{ +-+} +- +- static void +- brcmf_msgbuf_remove_flowring(struct brcmf_msgbuf *msgbuf, u16 flowid) +-@@ -1466,6 +1469,7 @@ int brcmf_proto_msgbuf_attach(struct brc +- drvr->proto->configure_addr_mode = brcmf_msgbuf_configure_addr_mode; +- drvr->proto->delete_peer = brcmf_msgbuf_delete_peer; +- drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer; +-+ drvr->proto->rxreorder = brcmf_msgbuf_rxreorder; +- drvr->proto->pd = msgbuf; +- +- init_waitqueue_head(&msgbuf->ioctl_resp_wait); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h +-@@ -22,6 +22,9 @@ enum proto_addr_mode { +- ADDR_DIRECT +- }; +- +-+struct brcmf_skb_reorder_data { +-+ u8 *reorder; +-+}; +- +- struct brcmf_proto { +- int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, +-@@ -38,6 +41,7 @@ struct brcmf_proto { +- u8 peer[ETH_ALEN]); +- void (*add_tdls_peer)(struct brcmf_pub *drvr, int ifidx, +- u8 peer[ETH_ALEN]); +-+ void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb); +- void *pd; +- }; +- +-@@ -91,6 +95,18 @@ brcmf_proto_add_tdls_peer(struct brcmf_p +- { +- drvr->proto->add_tdls_peer(drvr, ifidx, peer); +- } +-+static inline bool brcmf_proto_is_reorder_skb(struct sk_buff *skb) +-+{ +-+ struct brcmf_skb_reorder_data *rd; +-+ +-+ rd = (struct brcmf_skb_reorder_data *)skb->cb; +-+ return !!rd->reorder; +-+} +- +-+static inline void +-+brcmf_proto_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb) +-+{ +-+ ifp->drvr->proto->rxreorder(ifp, skb); +-+} +- +- #endif /* BRCMFMAC_PROTO_H */ +diff --git a/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch b/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch +deleted file mode 100644 +index a43feff..0000000 +--- a/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch ++++ /dev/null +@@ -1,139 +0,0 @@ +-From: Arend van Spriel +-Date: Mon, 11 Apr 2016 11:35:27 +0200 +-Subject: [PATCH] brcmfmac: revise handling events in receive path +- +-Move event handling out of brcmf_netif_rx() avoiding the need +-to pass a flag. This flag is only ever true for USB hosts as +-other interface use separate brcmf_rx_event() function. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +-@@ -216,7 +216,7 @@ bool brcmf_c_prec_enq(struct device *dev +- int prec); +- +- /* Receive frame for delivery to OS. Callee disposes of rxp. */ +--void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_evnt); +-+void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_event); +- /* Receive async event packet from firmware. Callee disposes of rxp. */ +- void brcmf_rx_event(struct device *dev, struct sk_buff *rxp); +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -298,18 +298,11 @@ void brcmf_txflowblock(struct device *de +- brcmf_fws_bus_blocked(drvr, state); +- } +- +--void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, +-- bool handle_event) +-+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb) +- { +-- skb->protocol = eth_type_trans(skb, ifp->ndev); +-- +- if (skb->pkt_type == PACKET_MULTICAST) +- ifp->stats.multicast++; +- +-- /* Process special event packets */ +-- if (handle_event) +-- brcmf_fweh_process_skb(ifp->drvr, skb); +-- +- if (!(ifp->ndev->flags & IFF_UP)) { +- brcmu_pkt_buf_free_skb(skb); +- return; +-@@ -329,7 +322,7 @@ void brcmf_netif_rx(struct brcmf_if *ifp +- netif_rx_ni(skb); +- } +- +--void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt) +-+void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_event) +- { +- struct brcmf_if *ifp; +- struct brcmf_bus *bus_if = dev_get_drvdata(dev); +-@@ -348,10 +341,17 @@ void brcmf_rx_frame(struct device *dev, +- return; +- } +- +-- if (brcmf_proto_is_reorder_skb(skb)) +-+ skb->protocol = eth_type_trans(skb, ifp->ndev); +-+ +-+ if (brcmf_proto_is_reorder_skb(skb)) { +- brcmf_proto_rxreorder(ifp, skb); +-- else +-- brcmf_netif_rx(ifp, skb, handle_evnt); +-+ } else { +-+ /* Process special event packets */ +-+ if (handle_event) +-+ brcmf_fweh_process_skb(ifp->drvr, skb); +-+ +-+ brcmf_netif_rx(ifp, skb); +-+ } +- } +- +- void brcmf_rx_event(struct device *dev, struct sk_buff *skb) +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -221,8 +221,7 @@ int brcmf_get_next_free_bsscfgidx(struct +- void brcmf_txflowblock_if(struct brcmf_if *ifp, +- enum brcmf_netif_stop_reason reason, bool state); +- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); +--void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, +-- bool handle_event); +-+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); +- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); +- int __init brcmf_core_init(void); +- void __exit brcmf_core_exit(void); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +-@@ -1668,7 +1668,7 @@ void brcmf_fws_rxreorder(struct brcmf_if +- /* validate flags and flow id */ +- if (flags == 0xFF) { +- brcmf_err("invalid flags...so ignore this packet\n"); +-- brcmf_netif_rx(ifp, pkt, false); +-+ brcmf_netif_rx(ifp, pkt); +- return; +- } +- +-@@ -1680,7 +1680,7 @@ void brcmf_fws_rxreorder(struct brcmf_if +- if (rfi == NULL) { +- brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n", +- flow_id); +-- brcmf_netif_rx(ifp, pkt, false); +-+ brcmf_netif_rx(ifp, pkt); +- return; +- } +- +-@@ -1705,7 +1705,7 @@ void brcmf_fws_rxreorder(struct brcmf_if +- rfi = kzalloc(buf_size, GFP_ATOMIC); +- if (rfi == NULL) { +- brcmf_err("failed to alloc buffer\n"); +-- brcmf_netif_rx(ifp, pkt, false); +-+ brcmf_netif_rx(ifp, pkt); +- return; +- } +- +-@@ -1819,7 +1819,7 @@ void brcmf_fws_rxreorder(struct brcmf_if +- netif_rx: +- skb_queue_walk_safe(&reorder_list, pkt, pnext) { +- __skb_unlink(pkt, &reorder_list); +-- brcmf_netif_rx(ifp, pkt, false); +-+ brcmf_netif_rx(ifp, pkt); +- } +- } +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +-@@ -1157,7 +1157,7 @@ brcmf_msgbuf_process_rx_complete(struct +- brcmu_pkt_buf_free_skb(skb); +- return; +- } +-- brcmf_netif_rx(ifp, skb, false); +-+ brcmf_netif_rx(ifp, skb); +- } +- +- +diff --git a/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch b/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch +deleted file mode 100644 +index 08ea235..0000000 +--- a/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch ++++ /dev/null +@@ -1,88 +0,0 @@ +-From: Arend van Spriel +-Date: Mon, 11 Apr 2016 11:35:28 +0200 +-Subject: [PATCH] brcmfmac: create common function for handling +- brcmf_proto_hdrpull() +- +-In receive path brcmf_proto_hdrpull() needs to be called and handled +-similar in brcmf_rx_frame() and brcmf_rx_event(). Move that duplicated +-code in separate function. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -322,26 +322,35 @@ void brcmf_netif_rx(struct brcmf_if *ifp +- netif_rx_ni(skb); +- } +- +--void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_event) +-+static int brcmf_rx_hdrpull(struct brcmf_pub *drvr, struct sk_buff *skb, +-+ struct brcmf_if **ifp) +- { +-- struct brcmf_if *ifp; +-- struct brcmf_bus *bus_if = dev_get_drvdata(dev); +-- struct brcmf_pub *drvr = bus_if->drvr; +- int ret; +- +-- brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb); +-- +- /* process and remove protocol-specific header */ +-- ret = brcmf_proto_hdrpull(drvr, true, skb, &ifp); +-+ ret = brcmf_proto_hdrpull(drvr, true, skb, ifp); +- +-- if (ret || !ifp || !ifp->ndev) { +-+ if (ret || !(*ifp) || !(*ifp)->ndev) { +- if (ret != -ENODATA && ifp) +-- ifp->stats.rx_errors++; +-+ (*ifp)->stats.rx_errors++; +- brcmu_pkt_buf_free_skb(skb); +-- return; +-+ return -ENODATA; +- } +- +-- skb->protocol = eth_type_trans(skb, ifp->ndev); +-+ skb->protocol = eth_type_trans(skb, (*ifp)->ndev); +-+ return 0; +-+} +-+ +-+void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_event) +-+{ +-+ struct brcmf_if *ifp; +-+ struct brcmf_bus *bus_if = dev_get_drvdata(dev); +-+ struct brcmf_pub *drvr = bus_if->drvr; +-+ +-+ brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb); +-+ +-+ if (brcmf_rx_hdrpull(drvr, skb, &ifp)) +-+ return; +- +- if (brcmf_proto_is_reorder_skb(skb)) { +- brcmf_proto_rxreorder(ifp, skb); +-@@ -359,21 +368,11 @@ void brcmf_rx_event(struct device *dev, +- struct brcmf_if *ifp; +- struct brcmf_bus *bus_if = dev_get_drvdata(dev); +- struct brcmf_pub *drvr = bus_if->drvr; +-- int ret; +- +- brcmf_dbg(EVENT, "Enter: %s: rxp=%p\n", dev_name(dev), skb); +- +-- /* process and remove protocol-specific header */ +-- ret = brcmf_proto_hdrpull(drvr, true, skb, &ifp); +-- +-- if (ret || !ifp || !ifp->ndev) { +-- if (ret != -ENODATA && ifp) +-- ifp->stats.rx_errors++; +-- brcmu_pkt_buf_free_skb(skb); +-+ if (brcmf_rx_hdrpull(drvr, skb, &ifp)) +- return; +-- } +-- +-- skb->protocol = eth_type_trans(skb, ifp->ndev); +- +- brcmf_fweh_process_skb(ifp->drvr, skb); +- brcmu_pkt_buf_free_skb(skb); +diff --git a/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch b/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch +deleted file mode 100644 +index c602f22..0000000 +--- a/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch ++++ /dev/null +@@ -1,119 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Thu, 26 May 2016 01:44:27 +0200 +-Subject: [PATCH] brcmfmac: rework function picking free BSS index +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-The old implementation was overcomplicated and slightly bugged in some +-corner cases. +- +-Consider following state of BSS-es (limited to 6 for simplification): +-drvr->iflist[0]: { bsscfgidx:0, ndev->name:wlan1, } +-drvr->iflist[1]: (null) +-drvr->iflist[2]: { bsscfgidx:2, ndev->name:wlan1-1, } +-drvr->iflist[3]: { bsscfgidx:3, ndev->name:wlan1-2, } +-drvr->iflist[4]: (null) +-drvr->iflist[5]: (null) +-In such case the next AP interface should bsscfgidx 4 (we don't use 1 as +-it's reserved for P2P). +- +-With old code the loop iterations were following: +-[ifidx = 0] [bsscfgidx = 2] [highest = 2] +-[ifidx = 1] [bsscfgidx = 2] [highest = 2] available = true +-[ifidx = 2] [bsscfgidx = 2] [highest = 2] bsscfgidx = highest + 1 +-[ifidx = 3] [bsscfgidx = 3] [highest = 2] bsscfgidx = highest + 1 +-[ifidx = 4] [bsscfgidx = 3] [highest = 2] available = true +-[ifidx = 5] [bsscfgidx = 3] [highest = 2] available = true +-There were 2 obvious problems: +-1) Having empty BSS at index 1 was resulting in available being always +- set to true, even if we would run out of BSS-es. +-2) Calculated bsscfgidx was invalid (3 instead of 4) resulting in driver +- not being able to create the 4th AP interface. +- +-New code is simpler, placed in file where it's really used, handles +-running out of free BSS-es and allows using 4 interfaces at the same +-time. It also looks for the first free BSS instead of one after the last +-in use. It works well with current driver (which doesn't allow deleting +-interfaces) and should be future proof (if we ever allow deleting). +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -527,6 +527,21 @@ brcmf_cfg80211_update_proto_addr_mode(st +- ADDR_INDIRECT); +- } +- +-+static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr) +-+{ +-+ int bsscfgidx; +-+ +-+ for (bsscfgidx = 0; bsscfgidx < BRCMF_MAX_IFS; bsscfgidx++) { +-+ /* bsscfgidx 1 is reserved for legacy P2P */ +-+ if (bsscfgidx == 1) +-+ continue; +-+ if (!drvr->iflist[bsscfgidx]) +-+ return bsscfgidx; +-+ } +-+ +-+ return -ENOMEM; +-+} +-+ +- static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp) +- { +- struct brcmf_mbss_ssid_le mbss_ssid_le; +-@@ -534,7 +549,7 @@ static int brcmf_cfg80211_request_ap_if( +- int err; +- +- memset(&mbss_ssid_le, 0, sizeof(mbss_ssid_le)); +-- bsscfgidx = brcmf_get_next_free_bsscfgidx(ifp->drvr); +-+ bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr); +- if (bsscfgidx < 0) +- return bsscfgidx; +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -753,30 +753,6 @@ void brcmf_remove_interface(struct brcmf +- brcmf_del_if(ifp->drvr, ifp->bsscfgidx); +- } +- +--int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr) +--{ +-- int ifidx; +-- int bsscfgidx; +-- bool available; +-- int highest; +-- +-- available = false; +-- bsscfgidx = 2; +-- highest = 2; +-- for (ifidx = 0; ifidx < BRCMF_MAX_IFS; ifidx++) { +-- if (drvr->iflist[ifidx]) { +-- if (drvr->iflist[ifidx]->bsscfgidx == bsscfgidx) +-- bsscfgidx = highest + 1; +-- else if (drvr->iflist[ifidx]->bsscfgidx > highest) +-- highest = drvr->iflist[ifidx]->bsscfgidx; +-- } else { +-- available = true; +-- } +-- } +-- +-- return available ? bsscfgidx : -ENOMEM; +--} +-- +- #ifdef CONFIG_INET +- #define ARPOL_MAX_ENTRIES 8 +- static int brcmf_inetaddr_changed(struct notifier_block *nb, +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -217,7 +217,6 @@ int brcmf_net_attach(struct brcmf_if *if +- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, +- bool is_p2pdev, char *name, u8 *mac_addr); +- void brcmf_remove_interface(struct brcmf_if *ifp); +--int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr); +- void brcmf_txflowblock_if(struct brcmf_if *ifp, +- enum brcmf_netif_stop_reason reason, bool state); +- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); +diff --git a/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch b/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch +deleted file mode 100644 +index a79c9a2..0000000 +--- a/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch ++++ /dev/null +@@ -1,244 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Fri, 20 May 2016 13:38:57 +0200 +-Subject: [PATCH] brcmutil: add field storing control channel to the struct +- brcmu_chan +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-Our d11 code supports encoding/decoding channel info into/from chanspec +-format used by firmware. Current implementation is quite misleading +-because of the way "chnum" field is used. +-When encoding channel info, "chnum" has to be filled by a caller with +-*center* channel number. However when decoding chanspec the same field +-is filled with a *control* channel number. +- +-1) This can be confusing. It's expected for information to be the same +- after encoding and decoding. +-2) It doesn't allow accessing all info when decoding. Some functions may +- need to know both channel numbers, e.g. cfg80211 callback getting +- current channel. +-Solve this by adding a separated field for control channel. +- +-Signed-off-by: Rafał Miłecki +-Reviewed-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -2689,7 +2689,7 @@ static s32 brcmf_inform_single_bss(struc +- if (!bi->ctl_ch) { +- ch.chspec = le16_to_cpu(bi->chanspec); +- cfg->d11inf.decchspec(&ch); +-- bi->ctl_ch = ch.chnum; +-+ bi->ctl_ch = ch.control_ch_num; +- } +- channel = bi->ctl_ch; +- +-@@ -2807,7 +2807,7 @@ static s32 brcmf_inform_ibss(struct brcm +- else +- band = wiphy->bands[IEEE80211_BAND_5GHZ]; +- +-- freq = ieee80211_channel_to_frequency(ch.chnum, band->band); +-+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band); +- cfg->channel = freq; +- notify_channel = ieee80211_get_channel(wiphy, freq); +- +-@@ -2817,7 +2817,7 @@ static s32 brcmf_inform_ibss(struct brcm +- notify_ielen = le32_to_cpu(bi->ie_length); +- notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100; +- +-- brcmf_dbg(CONN, "channel: %d(%d)\n", ch.chnum, freq); +-+ brcmf_dbg(CONN, "channel: %d(%d)\n", ch.control_ch_num, freq); +- brcmf_dbg(CONN, "capability: %X\n", notify_capability); +- brcmf_dbg(CONN, "beacon interval: %d\n", notify_interval); +- brcmf_dbg(CONN, "signal: %d\n", notify_signal); +-@@ -5235,7 +5235,7 @@ brcmf_bss_roaming_done(struct brcmf_cfg8 +- else +- band = wiphy->bands[IEEE80211_BAND_5GHZ]; +- +-- freq = ieee80211_channel_to_frequency(ch.chnum, band->band); +-+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band); +- notify_channel = ieee80211_get_channel(wiphy, freq); +- +- done: +-@@ -5757,14 +5757,15 @@ static int brcmf_construct_chaninfo(stru +- channel = band->channels; +- index = band->n_channels; +- for (j = 0; j < band->n_channels; j++) { +-- if (channel[j].hw_value == ch.chnum) { +-+ if (channel[j].hw_value == ch.control_ch_num) { +- index = j; +- break; +- } +- } +- channel[index].center_freq = +-- ieee80211_channel_to_frequency(ch.chnum, band->band); +-- channel[index].hw_value = ch.chnum; +-+ ieee80211_channel_to_frequency(ch.control_ch_num, +-+ band->band); +-+ channel[index].hw_value = ch.control_ch_num; +- +- /* assuming the chanspecs order is HT20, +- * HT40 upper, HT40 lower, and VHT80. +-@@ -5866,7 +5867,7 @@ static int brcmf_enable_bw40_2g(struct b +- if (WARN_ON(ch.bw != BRCMU_CHAN_BW_40)) +- continue; +- for (j = 0; j < band->n_channels; j++) { +-- if (band->channels[j].hw_value == ch.chnum) +-+ if (band->channels[j].hw_value == ch.control_ch_num) +- break; +- } +- if (WARN_ON(j == band->n_channels)) +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -1246,7 +1246,7 @@ bool brcmf_p2p_scan_finding_common_chann +- if (!bi->ctl_ch) { +- ch.chspec = le16_to_cpu(bi->chanspec); +- cfg->d11inf.decchspec(&ch); +-- bi->ctl_ch = ch.chnum; +-+ bi->ctl_ch = ch.control_ch_num; +- } +- afx_hdl->peer_chan = bi->ctl_ch; +- brcmf_dbg(TRACE, "ACTION FRAME SCAN : Peer %pM found, channel : %d\n", +-@@ -1385,7 +1385,7 @@ int brcmf_p2p_notify_action_frame_rx(str +- if (test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, +- &p2p->status) && +- (ether_addr_equal(afx_hdl->tx_dst_addr, e->addr))) { +-- afx_hdl->peer_chan = ch.chnum; +-+ afx_hdl->peer_chan = ch.control_ch_num; +- brcmf_dbg(INFO, "GON request: Peer found, channel=%d\n", +- afx_hdl->peer_chan); +- complete(&afx_hdl->act_frm_scan); +-@@ -1428,7 +1428,7 @@ int brcmf_p2p_notify_action_frame_rx(str +- memcpy(&mgmt_frame->u, frame, mgmt_frame_len); +- mgmt_frame_len += offsetof(struct ieee80211_mgmt, u); +- +-- freq = ieee80211_channel_to_frequency(ch.chnum, +-+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, +- ch.band == BRCMU_CHAN_BAND_2G ? +- IEEE80211_BAND_2GHZ : +- IEEE80211_BAND_5GHZ); +-@@ -1873,7 +1873,7 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere +- +- if (test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, &p2p->status) && +- (ether_addr_equal(afx_hdl->tx_dst_addr, e->addr))) { +-- afx_hdl->peer_chan = ch.chnum; +-+ afx_hdl->peer_chan = ch.control_ch_num; +- brcmf_dbg(INFO, "PROBE REQUEST: Peer found, channel=%d\n", +- afx_hdl->peer_chan); +- complete(&afx_hdl->act_frm_scan); +-@@ -1898,7 +1898,7 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere +- +- mgmt_frame = (u8 *)(rxframe + 1); +- mgmt_frame_len = e->datalen - sizeof(*rxframe); +-- freq = ieee80211_channel_to_frequency(ch.chnum, +-+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, +- ch.band == BRCMU_CHAN_BAND_2G ? +- IEEE80211_BAND_2GHZ : +- IEEE80211_BAND_5GHZ); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c +-@@ -107,6 +107,7 @@ static void brcmu_d11n_decchspec(struct +- u16 val; +- +- ch->chnum = (u8)(ch->chspec & BRCMU_CHSPEC_CH_MASK); +-+ ch->control_ch_num = ch->chnum; +- +- switch (ch->chspec & BRCMU_CHSPEC_D11N_BW_MASK) { +- case BRCMU_CHSPEC_D11N_BW_20: +-@@ -118,10 +119,10 @@ static void brcmu_d11n_decchspec(struct +- val = ch->chspec & BRCMU_CHSPEC_D11N_SB_MASK; +- if (val == BRCMU_CHSPEC_D11N_SB_L) { +- ch->sb = BRCMU_CHAN_SB_L; +-- ch->chnum -= CH_10MHZ_APART; +-+ ch->control_ch_num -= CH_10MHZ_APART; +- } else { +- ch->sb = BRCMU_CHAN_SB_U; +-- ch->chnum += CH_10MHZ_APART; +-+ ch->control_ch_num += CH_10MHZ_APART; +- } +- break; +- default: +-@@ -147,6 +148,7 @@ static void brcmu_d11ac_decchspec(struct +- u16 val; +- +- ch->chnum = (u8)(ch->chspec & BRCMU_CHSPEC_CH_MASK); +-+ ch->control_ch_num = ch->chnum; +- +- switch (ch->chspec & BRCMU_CHSPEC_D11AC_BW_MASK) { +- case BRCMU_CHSPEC_D11AC_BW_20: +-@@ -158,10 +160,10 @@ static void brcmu_d11ac_decchspec(struct +- val = ch->chspec & BRCMU_CHSPEC_D11AC_SB_MASK; +- if (val == BRCMU_CHSPEC_D11AC_SB_L) { +- ch->sb = BRCMU_CHAN_SB_L; +-- ch->chnum -= CH_10MHZ_APART; +-+ ch->control_ch_num -= CH_10MHZ_APART; +- } else if (val == BRCMU_CHSPEC_D11AC_SB_U) { +- ch->sb = BRCMU_CHAN_SB_U; +-- ch->chnum += CH_10MHZ_APART; +-+ ch->control_ch_num += CH_10MHZ_APART; +- } else { +- WARN_ON_ONCE(1); +- } +-@@ -172,16 +174,16 @@ static void brcmu_d11ac_decchspec(struct +- BRCMU_CHSPEC_D11AC_SB_SHIFT); +- switch (ch->sb) { +- case BRCMU_CHAN_SB_LL: +-- ch->chnum -= CH_30MHZ_APART; +-+ ch->control_ch_num -= CH_30MHZ_APART; +- break; +- case BRCMU_CHAN_SB_LU: +-- ch->chnum -= CH_10MHZ_APART; +-+ ch->control_ch_num -= CH_10MHZ_APART; +- break; +- case BRCMU_CHAN_SB_UL: +-- ch->chnum += CH_10MHZ_APART; +-+ ch->control_ch_num += CH_10MHZ_APART; +- break; +- case BRCMU_CHAN_SB_UU: +-- ch->chnum += CH_30MHZ_APART; +-+ ch->control_ch_num += CH_30MHZ_APART; +- break; +- default: +- WARN_ON_ONCE(1); +---- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_d11.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_d11.h +-@@ -125,14 +125,36 @@ enum brcmu_chan_sb { +- BRCMU_CHAN_SB_UU = BRCMU_CHAN_SB_LUU, +- }; +- +-+/** +-+ * struct brcmu_chan - stores channel formats +-+ * +-+ * This structure can be used with functions translating chanspec into generic +-+ * channel info and the other way. +-+ * +-+ * @chspec: firmware specific format +-+ * @chnum: center channel number +-+ * @control_ch_num: control channel number +-+ * @band: frequency band +-+ * @bw: channel width +-+ * @sb: control sideband (location of control channel against the center one) +-+ */ +- struct brcmu_chan { +- u16 chspec; +- u8 chnum; +-+ u8 control_ch_num; +- u8 band; +- enum brcmu_chan_bw bw; +- enum brcmu_chan_sb sb; +- }; +- +-+/** +-+ * struct brcmu_d11inf - provides functions translating channel format +-+ * +-+ * @io_type: determines version of channel format used by firmware +-+ * @encchspec: encodes channel info into a chanspec, requires center channel +-+ * number, ignores control one +-+ * @decchspec: decodes chanspec into generic info +-+ */ +- struct brcmu_d11inf { +- u8 io_type; +- +diff --git a/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch b/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch +deleted file mode 100644 +index 2c536d1..0000000 +--- a/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch ++++ /dev/null +@@ -1,94 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Fri, 20 May 2016 13:38:58 +0200 +-Subject: [PATCH] brcmfmac: support get_channel cfg80211 callback +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-This is important for brcmfmac as some of released firmwares (e.g. +-brcmfmac4366b-pcie.bin) may pick different channel than requested. This +-has been tested with BCM4366B1 in D-Link DIR-885L. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -4847,6 +4847,68 @@ exit: +- return err; +- } +- +-+static int brcmf_cfg80211_get_channel(struct wiphy *wiphy, +-+ struct wireless_dev *wdev, +-+ struct cfg80211_chan_def *chandef) +-+{ +-+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); +-+ struct net_device *ndev = wdev->netdev; +-+ struct brcmf_if *ifp; +-+ struct brcmu_chan ch; +-+ enum nl80211_band band = 0; +-+ enum nl80211_chan_width width = 0; +-+ u32 chanspec; +-+ int freq, err; +-+ +-+ if (!ndev) +-+ return -ENODEV; +-+ ifp = netdev_priv(ndev); +-+ +-+ err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec); +-+ if (err) { +-+ brcmf_err("chanspec failed (%d)\n", err); +-+ return err; +-+ } +-+ +-+ ch.chspec = chanspec; +-+ cfg->d11inf.decchspec(&ch); +-+ +-+ switch (ch.band) { +-+ case BRCMU_CHAN_BAND_2G: +-+ band = NL80211_BAND_2GHZ; +-+ break; +-+ case BRCMU_CHAN_BAND_5G: +-+ band = NL80211_BAND_5GHZ; +-+ break; +-+ } +-+ +-+ switch (ch.bw) { +-+ case BRCMU_CHAN_BW_80: +-+ width = NL80211_CHAN_WIDTH_80; +-+ break; +-+ case BRCMU_CHAN_BW_40: +-+ width = NL80211_CHAN_WIDTH_40; +-+ break; +-+ case BRCMU_CHAN_BW_20: +-+ width = NL80211_CHAN_WIDTH_20; +-+ break; +-+ case BRCMU_CHAN_BW_80P80: +-+ width = NL80211_CHAN_WIDTH_80P80; +-+ break; +-+ case BRCMU_CHAN_BW_160: +-+ width = NL80211_CHAN_WIDTH_160; +-+ break; +-+ } +-+ +-+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, band); +-+ chandef->chan = ieee80211_get_channel(wiphy, freq); +-+ chandef->width = width; +-+ chandef->center_freq1 = ieee80211_channel_to_frequency(ch.chnum, band); +-+ chandef->center_freq2 = 0; +-+ +-+ return 0; +-+} +-+ +- static int brcmf_cfg80211_crit_proto_start(struct wiphy *wiphy, +- struct wireless_dev *wdev, +- enum nl80211_crit_proto_id proto, +-@@ -5009,6 +5071,7 @@ static struct cfg80211_ops brcmf_cfg8021 +- .mgmt_tx = brcmf_cfg80211_mgmt_tx, +- .remain_on_channel = brcmf_p2p_remain_on_channel, +- .cancel_remain_on_channel = brcmf_cfg80211_cancel_remain_on_channel, +-+ .get_channel = brcmf_cfg80211_get_channel, +- .start_p2p_device = brcmf_p2p_start_device, +- .stop_p2p_device = brcmf_p2p_stop_device, +- .crit_proto_start = brcmf_cfg80211_crit_proto_start, +diff --git a/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch b/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch +deleted file mode 100644 +index 1b119b2..0000000 +--- a/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch ++++ /dev/null +@@ -1,59 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Fri, 27 May 2016 10:54:28 +0200 +-Subject: [PATCH] brcmfmac: print errors if creating interface fails +- +-This is helpful for debugging. Without this all I was getting from "iw" +-command on failed creating of P2P interface was: +-> command failed: Too many open files in system (-23) +- +-Signed-off-by: Rafal Milecki +-[arend@broadcom.com: reduce error prints upon iface creation] +-Signed-off-by: Arend van Spriel +-Reviewed-by: Julian Calaby +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -670,20 +670,24 @@ static struct wireless_dev *brcmf_cfg802 +- return ERR_PTR(-EOPNOTSUPP); +- case NL80211_IFTYPE_AP: +- wdev = brcmf_ap_add_vif(wiphy, name, flags, params); +-- if (!IS_ERR(wdev)) +-- brcmf_cfg80211_update_proto_addr_mode(wdev); +-- return wdev; +-+ break; +- case NL80211_IFTYPE_P2P_CLIENT: +- case NL80211_IFTYPE_P2P_GO: +- case NL80211_IFTYPE_P2P_DEVICE: +- wdev = brcmf_p2p_add_vif(wiphy, name, name_assign_type, type, flags, params); +-- if (!IS_ERR(wdev)) +-- brcmf_cfg80211_update_proto_addr_mode(wdev); +-- return wdev; +-+ break; +- case NL80211_IFTYPE_UNSPECIFIED: +- default: +- return ERR_PTR(-EINVAL); +- } +-+ +-+ if (IS_ERR(wdev)) +-+ brcmf_err("add iface %s type %d failed: err=%d\n", +-+ name, type, (int)PTR_ERR(wdev)); +-+ else +-+ brcmf_cfg80211_update_proto_addr_mode(wdev); +-+ +-+ return wdev; +- } +- +- static void brcmf_scan_config_mpc(struct brcmf_if *ifp, int mpc) +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -2030,8 +2030,6 @@ static int brcmf_p2p_request_p2p_if(stru +- +- err = brcmf_fil_iovar_data_set(ifp, "p2p_ifadd", &if_request, +- sizeof(if_request)); +-- if (err) +-- return err; +- +- return err; +- } +diff --git a/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch b/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch +deleted file mode 100644 +index a2e18a5..0000000 +--- a/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch ++++ /dev/null +@@ -1,114 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Fri, 27 May 2016 21:07:19 +0200 +-Subject: [PATCH] brcmfmac: fix setting AP channel with new firmwares +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-Firmware for new chipsets is based on a new major version of code +-internally maintained at Broadcom. E.g. brcmfmac4366b-pcie.bin (used for +-BCM4366B1) is based on 10.10.69.3309 while brcmfmac43602-pcie.ap.bin was +-based on 7.35.177.56. +- +-Currently setting AP 5 GHz channel doesn't work reliably with BCM4366B1. +-When setting e.g. 36 control channel with VHT80 (center channel 42) +-firmware may randomly pick one of: +-1) 52 control channel with 58 as center one +-2) 100 control channel with 106 as center one +-3) 116 control channel with 122 as center one +-4) 149 control channel with 155 as center one +- +-It seems new firmwares require setting AP mode (BRCMF_C_SET_AP) before +-specifying a channel. Changing an order of firmware calls fixes the +-problem. This requirement resulted in two separated "chanspec" calls, +-one in AP code path and one in P2P path. +- +-This fix was verified with BCM4366B1 and tested for regressions on +-BCM43602. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -4382,7 +4382,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- struct brcmf_join_params join_params; +- enum nl80211_iftype dev_role; +- struct brcmf_fil_bss_enable_le bss_enable; +-- u16 chanspec; +-+ u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef); +- bool mbss; +- int is_11d; +- +-@@ -4458,16 +4458,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- +- brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); +- +-+ /* Parameters shared by all radio interfaces */ +- if (!mbss) { +-- chanspec = chandef_to_chanspec(&cfg->d11inf, +-- &settings->chandef); +-- err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); +-- if (err < 0) { +-- brcmf_err("Set Channel failed: chspec=%d, %d\n", +-- chanspec, err); +-- goto exit; +-- } +-- +- if (is_11d != ifp->vif->is_11d) { +- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY, +- is_11d); +-@@ -4515,6 +4507,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- err = -EINVAL; +- goto exit; +- } +-+ +-+ /* Interface specific setup */ +- if (dev_role == NL80211_IFTYPE_AP) { +- if ((brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) && (!mbss)) +- brcmf_fil_iovar_int_set(ifp, "mbss", 1); +-@@ -4524,6 +4518,17 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- brcmf_err("setting AP mode failed %d\n", err); +- goto exit; +- } +-+ if (!mbss) { +-+ /* Firmware 10.x requires setting channel after enabling +-+ * AP and before bringing interface up. +-+ */ +-+ err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); +-+ if (err < 0) { +-+ brcmf_err("Set Channel failed: chspec=%d, %d\n", +-+ chanspec, err); +-+ goto exit; +-+ } +-+ } +- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); +- if (err < 0) { +- brcmf_err("BRCMF_C_UP error (%d)\n", err); +-@@ -4545,7 +4550,13 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- goto exit; +- } +- brcmf_dbg(TRACE, "AP mode configuration complete\n"); +-- } else { +-+ } else if (dev_role == NL80211_IFTYPE_P2P_GO) { +-+ err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); +-+ if (err < 0) { +-+ brcmf_err("Set Channel failed: chspec=%d, %d\n", +-+ chanspec, err); +-+ goto exit; +-+ } +- err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le, +- sizeof(ssid_le)); +- if (err < 0) { +-@@ -4562,7 +4573,10 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- } +- +- brcmf_dbg(TRACE, "GO mode configuration complete\n"); +-+ } else { +-+ WARN_ON(1); +- } +-+ +- set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); +- brcmf_net_setcarrier(ifp, true); +- +diff --git a/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch b/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch +deleted file mode 100644 +index 167e434..0000000 +--- a/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch ++++ /dev/null +@@ -1,60 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Mon, 30 May 2016 06:40:54 +0200 +-Subject: [PATCH] brcmfmac: don't remove interface on link down firmware event +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-There are two firmware events we handle similarly in brcmfmac: +-BRCMF_E_LINK and BRCMF_E_IF. The difference from firmware point of view +-is that the first one means BSS remains present in the firmware. Trying +-to (re)create it (e.g. when adding new virtual interface) will result in +-an error. +- +-Current code treats both events in a similar way. It removes Linux +-interface for each of them. It works OK with e.g. BCM43602. Its firmware +-generates both events for each interface. It means we get BRCMF_E_LINK +-and remove interface. That is soon followed by BRCMF_E_IF which means +-BSS was also removed in a firmware. The only downside of this is a +-harmless error like: +-[ 208.643180] brcmfmac: brcmf_fweh_call_event_handler: no interface object +- +-Unfortunately BCM4366 firmware doesn't automatically remove BSS and so +-it doesn't generate BRCMF_E_IF. In such case we incorrectly remove Linux +-interface on BRCMF_E_LINK as BSS is still present in the firmware. It +-results in an error when trying to re-create virtual interface, e.g.: +-> iw phy phy1 interface add wlan1-1 type __ap +-[ 3602.929199] brcmfmac: brcmf_ap_add_vif: timeout occurred +-command failed: I/O error (-5) +- +-With this patch we don't remove Linux interface while firmware keeps +-BSS. Thanks to this we keep a consistent states of host driver and +-device firmware. +- +-Further improvement should be to mark BSS as disabled and remove +-interface on BRCMF_E_LINK. Then we should add support for reusing +-BSS-es. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -5372,7 +5372,6 @@ brcmf_notify_connect_status_ap(struct br +- struct net_device *ndev, +- const struct brcmf_event_msg *e, void *data) +- { +-- struct brcmf_if *ifp = netdev_priv(ndev); +- static int generation; +- u32 event = e->event_code; +- u32 reason = e->reason; +-@@ -5383,8 +5382,6 @@ brcmf_notify_connect_status_ap(struct br +- ndev != cfg_to_ndev(cfg)) { +- brcmf_dbg(CONN, "AP mode link down\n"); +- complete(&cfg->vif_disabled); +-- if (ifp->vif->mbss) +-- brcmf_remove_interface(ifp); +- return 0; +- } +- +diff --git a/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch b/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch +deleted file mode 100644 +index 28ef3a6..0000000 +--- a/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch ++++ /dev/null +@@ -1,103 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Mon, 6 Jun 2016 23:03:55 +0200 +-Subject: [PATCH] brcmfmac: drop unused pm_block vif attribute +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-This attribute was added 3 years ago by +-commit 3eacf866559c ("brcmfmac: introduce brcmf_cfg80211_vif structure") +-but it remains unused since then. It seems we can safely drop it. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -587,7 +587,7 @@ struct wireless_dev *brcmf_ap_add_vif(st +- +- brcmf_dbg(INFO, "Adding vif \"%s\"\n", name); +- +-- vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP, false); +-+ vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP); +- if (IS_ERR(vif)) +- return (struct wireless_dev *)vif; +- +-@@ -5098,8 +5098,7 @@ static struct cfg80211_ops brcmf_cfg8021 +- }; +- +- struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, +-- enum nl80211_iftype type, +-- bool pm_block) +-+ enum nl80211_iftype type) +- { +- struct brcmf_cfg80211_vif *vif_walk; +- struct brcmf_cfg80211_vif *vif; +-@@ -5114,8 +5113,6 @@ struct brcmf_cfg80211_vif *brcmf_alloc_v +- vif->wdev.wiphy = cfg->wiphy; +- vif->wdev.iftype = type; +- +-- vif->pm_block = pm_block; +-- +- brcmf_init_prof(&vif->profile); +- +- if (type == NL80211_IFTYPE_AP) { +-@@ -6754,7 +6751,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802 +- init_vif_event(&cfg->vif_event); +- INIT_LIST_HEAD(&cfg->vif_list); +- +-- vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION, false); +-+ vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION); +- if (IS_ERR(vif)) +- goto wiphy_out; +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-@@ -167,7 +167,6 @@ struct vif_saved_ie { +- * @wdev: wireless device. +- * @profile: profile information. +- * @sme_state: SME state using enum brcmf_vif_status bits. +-- * @pm_block: power-management blocked. +- * @list: linked list. +- * @mgmt_rx_reg: registered rx mgmt frame types. +- * @mbss: Multiple BSS type, set if not first AP (not relevant for P2P). +-@@ -177,7 +176,6 @@ struct brcmf_cfg80211_vif { +- struct wireless_dev wdev; +- struct brcmf_cfg80211_profile profile; +- unsigned long sme_state; +-- bool pm_block; +- struct vif_saved_ie saved_ie; +- struct list_head list; +- u16 mgmt_rx_reg; +-@@ -388,8 +386,7 @@ s32 brcmf_cfg80211_down(struct net_devic +- enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp); +- +- struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, +-- enum nl80211_iftype type, +-- bool pm_block); +-+ enum nl80211_iftype type); +- void brcmf_free_vif(struct brcmf_cfg80211_vif *vif); +- +- s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag, +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -2074,8 +2074,7 @@ static struct wireless_dev *brcmf_p2p_cr +- if (p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif) +- return ERR_PTR(-ENOSPC); +- +-- p2p_vif = brcmf_alloc_vif(p2p->cfg, NL80211_IFTYPE_P2P_DEVICE, +-- false); +-+ p2p_vif = brcmf_alloc_vif(p2p->cfg, NL80211_IFTYPE_P2P_DEVICE); +- if (IS_ERR(p2p_vif)) { +- brcmf_err("could not create discovery vif\n"); +- return (struct wireless_dev *)p2p_vif; +-@@ -2175,7 +2174,7 @@ struct wireless_dev *brcmf_p2p_add_vif(s +- return ERR_PTR(-EOPNOTSUPP); +- } +- +-- vif = brcmf_alloc_vif(cfg, type, false); +-+ vif = brcmf_alloc_vif(cfg, type); +- if (IS_ERR(vif)) +- return (struct wireless_dev *)vif; +- brcmf_cfg80211_arm_vif_event(cfg, vif); +diff --git a/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch b/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch +deleted file mode 100644 +index 09547d8..0000000 +--- a/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch ++++ /dev/null +@@ -1,37 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Tue, 7 Jun 2016 08:20:21 +0200 +-Subject: [PATCH] brcmfmac: include required headers in cfg80211.h +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-Without this including cfg80211.h in a wrong order could result in: +- +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:122:24: error: array type has incomplete element type +- struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS]; +- ^ +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:291:24: error: field ‘p2p’ has incomplete type +- struct brcmf_p2p_info p2p; +- ^ +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:297:27: error: field ‘pmk_list’ has incomplete type +- struct brcmf_pmk_list_le pmk_list; +- ^ +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:317:28: error: field ‘assoclist’ has incomplete type +- struct brcmf_assoclist_le assoclist; +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-@@ -20,6 +20,9 @@ +- /* for brcmu_d11inf */ +- #include +- +-+#include "fwil_types.h" +-+#include "p2p.h" +-+ +- #define WL_NUM_SCAN_MAX 10 +- #define WL_TLV_INFO_MAX 1024 +- #define WL_BSS_INFO_MAX 2048 +diff --git a/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch b/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch +deleted file mode 100644 +index 461e3db..0000000 +--- a/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch ++++ /dev/null +@@ -1,108 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Tue, 7 Jun 2016 21:10:18 +0200 +-Subject: [PATCH] brcmfmac: slightly simplify building interface combinations +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-This change reorders some operations in brcmf_setup_ifmodes in hope to +-make it simpler: +-1) It allocates arrays right before filling them. This way it's easier +- to follow requested array length as it's immediately followed by +- code filling it. It's easier to check e.g. why we need 4 entries for +- P2P. Other than that it deduplicates some checks (e.g. for P2P). +-2) It reorders code to first prepare limits and then define a new combo. +- Previously this was mixed (e.g. we were setting num of channels +- before preparing limits). +-3) It modifies mbss code to use i variable just like other combos do. +- +-Signed-off-by: Rafał Miłecki +-Acked-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -6208,29 +6208,15 @@ static int brcmf_setup_ifmodes(struct wi +- if (!combo) +- goto err; +- +-- c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL); +-- if (!c0_limits) +-- goto err; +-- +-- if (p2p) { +-- p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL); +-- if (!p2p_limits) +-- goto err; +-- } +-- +-- if (mbss) { +-- mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL); +-- if (!mbss_limits) +-- goto err; +-- } +-- +- wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | +- BIT(NL80211_IFTYPE_ADHOC) | +- BIT(NL80211_IFTYPE_AP); +- +- c = 0; +- i = 0; +-- combo[c].num_different_channels = 1; +-+ c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL); +-+ if (!c0_limits) +-+ goto err; +- c0_limits[i].max = 1; +- c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION); +- if (p2p) { +-@@ -6248,6 +6234,7 @@ static int brcmf_setup_ifmodes(struct wi +- c0_limits[i].max = 1; +- c0_limits[i++].types = BIT(NL80211_IFTYPE_AP); +- } +-+ combo[c].num_different_channels = 1; +- combo[c].max_interfaces = i; +- combo[c].n_limits = i; +- combo[c].limits = c0_limits; +-@@ -6255,7 +6242,9 @@ static int brcmf_setup_ifmodes(struct wi +- if (p2p) { +- c++; +- i = 0; +-- combo[c].num_different_channels = 1; +-+ p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL); +-+ if (!p2p_limits) +-+ goto err; +- p2p_limits[i].max = 1; +- p2p_limits[i++].types = BIT(NL80211_IFTYPE_STATION); +- p2p_limits[i].max = 1; +-@@ -6264,6 +6253,7 @@ static int brcmf_setup_ifmodes(struct wi +- p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT); +- p2p_limits[i].max = 1; +- p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE); +-+ combo[c].num_different_channels = 1; +- combo[c].max_interfaces = i; +- combo[c].n_limits = i; +- combo[c].limits = p2p_limits; +-@@ -6271,14 +6261,19 @@ static int brcmf_setup_ifmodes(struct wi +- +- if (mbss) { +- c++; +-+ i = 0; +-+ mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL); +-+ if (!mbss_limits) +-+ goto err; +-+ mbss_limits[i].max = 4; +-+ mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP); +- combo[c].beacon_int_infra_match = true; +- combo[c].num_different_channels = 1; +-- mbss_limits[0].max = 4; +-- mbss_limits[0].types = BIT(NL80211_IFTYPE_AP); +- combo[c].max_interfaces = 4; +-- combo[c].n_limits = 1; +-+ combo[c].n_limits = i; +- combo[c].limits = mbss_limits; +- } +-+ +- wiphy->n_iface_combinations = n_combos; +- wiphy->iface_combinations = combo; +- return 0; +diff --git a/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch b/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch +deleted file mode 100644 +index e991f32..0000000 +--- a/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch ++++ /dev/null +@@ -1,160 +0,0 @@ +-From b50ddfa8530e9b5f52e873fdd6ff04f327a88799 Mon Sep 17 00:00:00 2001 +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Fri, 17 Jun 2016 12:29:21 +0200 +-Subject: [PATCH] brcmfmac: fix lockup when removing P2P interface after event +- timeout +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-Removing P2P interface is handled by sending a proper request to the +-firmware. On success firmware triggers an event and driver's handler +-removes a matching interface. +- +-However on event timeout we remove interface directly from the cfg80211 +-callback. Current code doesn't handle this case correctly as it always +-assumes rtnl to be unlocked. +- +-Fix it by adding an extra rtnl_locked parameter to functions and calling +-unregister_netdevice when needed. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- .../wireless/broadcom/brcm80211/brcmfmac/core.c | 29 +++++++++++++--------- +- .../wireless/broadcom/brcm80211/brcmfmac/core.h | 2 +- +- .../wireless/broadcom/brcm80211/brcmfmac/fweh.c | 2 +- +- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 4 +-- +- 4 files changed, 21 insertions(+), 16 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -548,12 +548,16 @@ fail: +- return -EBADE; +- } +- +--static void brcmf_net_detach(struct net_device *ndev) +-+static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked) +- { +-- if (ndev->reg_state == NETREG_REGISTERED) +-- unregister_netdev(ndev); +-- else +-+ if (ndev->reg_state == NETREG_REGISTERED) { +-+ if (rtnl_locked) +-+ unregister_netdevice(ndev); +-+ else +-+ unregister_netdev(ndev); +-+ } else { +- brcmf_cfg80211_free_netdev(ndev); +-+ } +- } +- +- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on) +-@@ -651,7 +655,7 @@ struct brcmf_if *brcmf_add_if(struct brc +- brcmf_err("ERROR: netdev:%s already exists\n", +- ifp->ndev->name); +- netif_stop_queue(ifp->ndev); +-- brcmf_net_detach(ifp->ndev); +-+ brcmf_net_detach(ifp->ndev, false); +- drvr->iflist[bsscfgidx] = NULL; +- } else { +- brcmf_dbg(INFO, "netdev:%s ignore IF event\n", +-@@ -699,7 +703,8 @@ struct brcmf_if *brcmf_add_if(struct brc +- return ifp; +- } +- +--static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx) +-+static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx, +-+ bool rtnl_locked) +- { +- struct brcmf_if *ifp; +- +-@@ -729,7 +734,7 @@ static void brcmf_del_if(struct brcmf_pu +- cancel_work_sync(&ifp->multicast_work); +- cancel_work_sync(&ifp->ndoffload_work); +- } +-- brcmf_net_detach(ifp->ndev); +-+ brcmf_net_detach(ifp->ndev, rtnl_locked); +- } else { +- /* Only p2p device interfaces which get dynamically created +- * end up here. In this case the p2p module should be informed +-@@ -743,14 +748,14 @@ static void brcmf_del_if(struct brcmf_pu +- } +- } +- +--void brcmf_remove_interface(struct brcmf_if *ifp) +-+void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked) +- { +- if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bsscfgidx] != ifp)) +- return; +- brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx, +- ifp->ifidx); +- brcmf_fws_del_interface(ifp); +-- brcmf_del_if(ifp->drvr, ifp->bsscfgidx); +-+ brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked); +- } +- +- #ifdef CONFIG_INET +-@@ -1057,9 +1062,9 @@ fail: +- brcmf_fws_deinit(drvr); +- } +- if (ifp) +-- brcmf_net_detach(ifp->ndev); +-+ brcmf_net_detach(ifp->ndev, false); +- if (p2p_ifp) +-- brcmf_net_detach(p2p_ifp->ndev); +-+ brcmf_net_detach(p2p_ifp->ndev, false); +- drvr->iflist[0] = NULL; +- drvr->iflist[1] = NULL; +- if (drvr->settings->ignore_probe_fail) +-@@ -1128,7 +1133,7 @@ void brcmf_detach(struct device *dev) +- +- /* make sure primary interface removed last */ +- for (i = BRCMF_MAX_IFS-1; i > -1; i--) +-- brcmf_remove_interface(drvr->iflist[i]); +-+ brcmf_remove_interface(drvr->iflist[i], false); +- +- brcmf_cfg80211_detach(drvr->config); +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -216,7 +216,7 @@ struct brcmf_if *brcmf_get_ifp(struct br +- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); +- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, +- bool is_p2pdev, char *name, u8 *mac_addr); +--void brcmf_remove_interface(struct brcmf_if *ifp); +-+void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); +- void brcmf_txflowblock_if(struct brcmf_if *ifp, +- enum brcmf_netif_stop_reason reason, bool state); +- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +-@@ -183,7 +183,7 @@ static void brcmf_fweh_handle_if_event(s +- err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data); +- +- if (ifp && ifevent->action == BRCMF_E_IF_DEL) +-- brcmf_remove_interface(ifp); +-+ brcmf_remove_interface(ifp, false); +- } +- +- /** +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -2289,7 +2289,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph +- err = 0; +- } +- if (err) +-- brcmf_remove_interface(vif->ifp); +-+ brcmf_remove_interface(vif->ifp, true); +- +- brcmf_cfg80211_arm_vif_event(cfg, NULL); +- if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) +-@@ -2395,7 +2395,7 @@ void brcmf_p2p_detach(struct brcmf_p2p_i +- if (vif != NULL) { +- brcmf_p2p_cancel_remain_on_channel(vif->ifp); +- brcmf_p2p_deinit_discovery(p2p); +-- brcmf_remove_interface(vif->ifp); +-+ brcmf_remove_interface(vif->ifp, false); +- } +- /* just set it all to zero */ +- memset(p2p, 0, sizeof(*p2p)); +diff --git a/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch b/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch +deleted file mode 100644 +index ed65f4d..0000000 +--- a/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch ++++ /dev/null +@@ -1,39 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Fri, 17 Jun 2016 12:48:44 +0200 +-Subject: [PATCH] brcmfmac: use const char * for interface name in brcmf_add_if +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-This function can work just fine with const pointer, it only calls +-alloc_netdev which take const as well. Moreover it makes this function +-more flexible as some cfg80211 callback may provide const char * as +-well, e.g. add_virtual_intf. This will be needed for more advanced +-interface management. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -638,7 +638,7 @@ fail: +- } +- +- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, +-- bool is_p2pdev, char *name, u8 *mac_addr) +-+ bool is_p2pdev, const char *name, u8 *mac_addr) +- { +- struct brcmf_if *ifp; +- struct net_device *ndev; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -215,7 +215,7 @@ char *brcmf_ifname(struct brcmf_if *ifp) +- struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); +- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); +- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, +-- bool is_p2pdev, char *name, u8 *mac_addr); +-+ bool is_p2pdev, const char *name, u8 *mac_addr); +- void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); +- void brcmf_txflowblock_if(struct brcmf_if *ifp, +- enum brcmf_netif_stop_reason reason, bool state); +diff --git a/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch b/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch +deleted file mode 100644 +index ef35fab..0000000 +--- a/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch ++++ /dev/null +@@ -1,33 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Sat, 18 Jun 2016 18:49:38 +0200 +-Subject: [PATCH] brcmfmac: include also core.h header in cfg80211.h +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-This header provides two inline functions using struct brcmf_if so we +-need core.h to avoid: +- +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h: In function ‘ndev_to_prof’: +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:368:13: error: dereferencing pointer to incomplete type +- return &ifp->vif->profile; +- ^ +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h: In function ‘ndev_to_vif’: +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:374:12: error: dereferencing pointer to incomplete type +- return ifp->vif; +- ^ +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-@@ -20,6 +20,7 @@ +- /* for brcmu_d11inf */ +- #include +- +-+#include "core.h" +- #include "fwil_types.h" +- #include "p2p.h" +- +diff --git a/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch b/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch +deleted file mode 100644 +index ab9a634..0000000 +--- a/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch ++++ /dev/null +@@ -1,27 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Sun, 19 Jun 2016 01:55:57 +0200 +-Subject: [PATCH] brcmfmac: add missing break when deleting P2P_DEVICE +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-We obviously don't want to fall through in that switch. With this change +-1) We wait for event (triggered by p2p_disc) as expected +-2) We remove interface manually on timeout +-3) We return 0 on success instead of -ENOTSUPP +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -2263,6 +2263,8 @@ int brcmf_p2p_del_vif(struct wiphy *wiph +- return 0; +- brcmf_p2p_cancel_remain_on_channel(vif->ifp); +- brcmf_p2p_deinit_discovery(p2p); +-+ break; +-+ +- default: +- return -ENOTSUPP; +- } +diff --git a/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch b/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch +deleted file mode 100644 +index 6dd0c03..0000000 +--- a/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch ++++ /dev/null +@@ -1,75 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Wed, 29 Jun 2016 21:54:26 +0200 +-Subject: [PATCH] brcmfmac: delete interface directly in code that sent fw +- request +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-So far when receiving event about in-firmware-interface removal our +-event worker was notifying listener and afterwards it was removing Linux +-interface. +- +-First of all it was resulting in slightly unexpected order. The listener +-(del_virtual_intf callback) was (usually) returning with success before +-we even called unregister_netdev(ice). +- +-Please note this couldn't be simply fixed by changing order of calls in +-brcmf_fweh_handle_if_event as unregistering interface earlier could free +-struct brcmf_if. +- +-Another problem of current implementation are possible lockups. Focus on +-the time slot between calling event handler and removing Linux +-interface. During that time original caller may leave (unlocking rtnl +-semaphore) *and* another call to the same code may be done (locking it +-again). If that happens our event handler will stuck at removing Linux +-interface, it won't handle another event and will block process holding +-rtnl lock. +- +-This can be simply solved by unregistering interface in a proper +-callback, right after receiving confirmation event from firmware. This +-only required modifying worker to don't unregister on its own if there +-is someone waiting for the event. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c +-@@ -18,6 +18,7 @@ +- #include "brcmu_wifi.h" +- #include "brcmu_utils.h" +- +-+#include "cfg80211.h" +- #include "core.h" +- #include "debug.h" +- #include "tracepoint.h" +-@@ -182,8 +183,13 @@ static void brcmf_fweh_handle_if_event(s +- +- err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data); +- +-- if (ifp && ifevent->action == BRCMF_E_IF_DEL) +-- brcmf_remove_interface(ifp, false); +-+ if (ifp && ifevent->action == BRCMF_E_IF_DEL) { +-+ bool armed = brcmf_cfg80211_vif_event_armed(drvr->config); +-+ +-+ /* Default handling in case no-one waits for this event */ +-+ if (!armed) +-+ brcmf_remove_interface(ifp, false); +-+ } +- } +- +- /** +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -2290,8 +2290,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph +- else +- err = 0; +- } +-- if (err) +-- brcmf_remove_interface(vif->ifp, true); +-+ brcmf_remove_interface(vif->ifp, true); +- +- brcmf_cfg80211_arm_vif_event(cfg, NULL); +- if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) +diff --git a/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch b/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch +deleted file mode 100644 +index 1929f0b..0000000 +--- a/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch ++++ /dev/null +@@ -1,84 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Wed, 29 Jun 2016 21:54:27 +0200 +-Subject: [PATCH] brcmfmac: support removing AP interfaces with +- "interface_remove" +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-New firmwares (e.g. 10.10.69.36 for BCM4366) support "interface_remove" +-for removing interfaces. Try to use this method on cfg80211 request. In +-case of older firmwares (e.g. 7.35.177.56 for BCM43602 as I tested) this +-will just result in firmware rejecting command and this won't change any +-behavior. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -771,12 +771,48 @@ s32 brcmf_notify_escan_complete(struct b +- return err; +- } +- +-+static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy, +-+ struct wireless_dev *wdev) +-+{ +-+ struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); +-+ struct net_device *ndev = wdev->netdev; +-+ struct brcmf_if *ifp = netdev_priv(ndev); +-+ int ret; +-+ int err; +-+ +-+ brcmf_cfg80211_arm_vif_event(cfg, ifp->vif); +-+ +-+ err = brcmf_fil_bsscfg_data_set(ifp, "interface_remove", NULL, 0); +-+ if (err) { +-+ brcmf_err("interface_remove failed %d\n", err); +-+ goto err_unarm; +-+ } +-+ +-+ /* wait for firmware event */ +-+ ret = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_DEL, +-+ BRCMF_VIF_EVENT_TIMEOUT); +-+ if (!ret) { +-+ brcmf_err("timeout occurred\n"); +-+ err = -EIO; +-+ goto err_unarm; +-+ } +-+ +-+ brcmf_remove_interface(ifp, true); +-+ +-+err_unarm: +-+ brcmf_cfg80211_arm_vif_event(cfg, NULL); +-+ return err; +-+} +-+ +- static +- int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev) +- { +- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); +- struct net_device *ndev = wdev->netdev; +- +-+ if (ndev && ndev == cfg_to_ndev(cfg)) +-+ return -ENOTSUPP; +-+ +- /* vif event pending in firmware */ +- if (brcmf_cfg80211_vif_event_armed(cfg)) +- return -EBUSY; +-@@ -793,12 +829,13 @@ int brcmf_cfg80211_del_iface(struct wiph +- switch (wdev->iftype) { +- case NL80211_IFTYPE_ADHOC: +- case NL80211_IFTYPE_STATION: +-- case NL80211_IFTYPE_AP: +- case NL80211_IFTYPE_AP_VLAN: +- case NL80211_IFTYPE_WDS: +- case NL80211_IFTYPE_MONITOR: +- case NL80211_IFTYPE_MESH_POINT: +- return -EOPNOTSUPP; +-+ case NL80211_IFTYPE_AP: +-+ return brcmf_cfg80211_del_ap_iface(wiphy, wdev); +- case NL80211_IFTYPE_P2P_CLIENT: +- case NL80211_IFTYPE_P2P_GO: +- case NL80211_IFTYPE_P2P_DEVICE: +diff --git a/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch b/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch +deleted file mode 100644 +index ae458e7..0000000 +--- a/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch ++++ /dev/null +@@ -1,43 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Wed, 6 Jul 2016 12:22:54 +0200 +-Subject: [PATCH] brcmfmac: respect hidden_ssid for AP interfaces +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-This was succesfully tested with 4366B1. A small workaround is needed +-for the main interface otherwise it would stuck at the hidden state. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -4586,6 +4586,15 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- brcmf_err("SET SSID error (%d)\n", err); +- goto exit; +- } +-+ +-+ if (settings->hidden_ssid) { +-+ err = brcmf_fil_iovar_int_set(ifp, "closednet", 1); +-+ if (err) { +-+ brcmf_err("closednet error (%d)\n", err); +-+ goto exit; +-+ } +-+ } +-+ +- brcmf_dbg(TRACE, "AP mode configuration complete\n"); +- } else if (dev_role == NL80211_IFTYPE_P2P_GO) { +- err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); +-@@ -4644,6 +4653,10 @@ static int brcmf_cfg80211_stop_ap(struct +- return err; +- } +- +-+ /* First BSS doesn't get a full reset */ +-+ if (ifp->bsscfgidx == 0) +-+ brcmf_fil_iovar_int_set(ifp, "closednet", 0); +-+ +- memset(&join_params, 0, sizeof(join_params)); +- err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID, +- &join_params, sizeof(join_params)); +diff --git a/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch b/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch +deleted file mode 100644 +index fcafa79..0000000 +--- a/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch ++++ /dev/null +@@ -1,53 +0,0 @@ +-From: Arend Van Spriel +-Date: Fri, 15 Jul 2016 12:16:12 +0200 +-Subject: [PATCH] brcmfmac: restore stopping netdev queue when bus clogs up +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-When the host-interface bus has hard time handling transmit packets +-it informs higher layer about this and it would stop the netdev +-queue when needed. However, since commit 9cd18359d31e ("brcmfmac: +-Make FWS queueing configurable.") this was broken. With this patch +-the behaviour is restored. +- +-Cc: stable@vger.kernel.org # v4.5, v4.6, v4.7 +-Fixes: 9cd18359d31e ("brcmfmac: Make FWS queueing configurable.") +-Tested-by: Per Förlin +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +-@@ -2469,10 +2469,22 @@ void brcmf_fws_bustxfail(struct brcmf_fw +- void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked) +- { +- struct brcmf_fws_info *fws = drvr->fws; +-+ struct brcmf_if *ifp; +-+ int i; +- +-- fws->bus_flow_blocked = flow_blocked; +-- if (!flow_blocked) +-- brcmf_fws_schedule_deq(fws); +-- else +-- fws->stats.bus_flow_block++; +-+ if (fws->avoid_queueing) { +-+ for (i = 0; i < BRCMF_MAX_IFS; i++) { +-+ ifp = drvr->iflist[i]; +-+ if (!ifp || !ifp->ndev) +-+ continue; +-+ brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FLOW, +-+ flow_blocked); +-+ } +-+ } else { +-+ fws->bus_flow_blocked = flow_blocked; +-+ if (!flow_blocked) +-+ brcmf_fws_schedule_deq(fws); +-+ else +-+ fws->stats.bus_flow_block++; +-+ } +- } +diff --git a/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch b/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch +deleted file mode 100644 +index a24c07f..0000000 +--- a/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch ++++ /dev/null +@@ -1,42 +0,0 @@ +-From fd3ed33f51c2a586412d35b4f64803f019ab589f Mon Sep 17 00:00:00 2001 +-From: Arend Van Spriel +-Date: Fri, 15 Jul 2016 12:39:13 +0200 +-Subject: [PATCH] brcmfmac: defer DPC processing during probe +- +-The sdio dpc starts processing when in SDIOD_STATE_DATA. This state was +-entered right after firmware download. This patch moves that transition +-just before enabling sdio interrupt handling thus avoiding watchdog +-expiry which would put the bus to sleep while probing. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 7 +++---- +- 1 file changed, 3 insertions(+), 4 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-@@ -3304,10 +3304,6 @@ static int brcmf_sdio_download_firmware( +- goto err; +- } +- +-- /* Allow full data communication using DPC from now on. */ +-- brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA); +-- bcmerror = 0; +-- +- err: +- brcmf_sdio_clkctl(bus, CLK_SDONLY, false); +- sdio_release_host(bus->sdiodev->func[1]); +-@@ -4045,6 +4041,9 @@ static void brcmf_sdio_firmware_callback +- } +- +- if (err == 0) { +-+ /* Allow full data communication using DPC from now on. */ +-+ brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA); +-+ +- err = brcmf_sdiod_intr_register(sdiodev); +- if (err != 0) +- brcmf_err("intr register failed:%d\n", err); +diff --git a/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch b/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch +deleted file mode 100644 +index ba9a349..0000000 +--- a/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch ++++ /dev/null +@@ -1,32 +0,0 @@ +-From 3bdae810721b33061d2e541bd78a70f86ca42af3 Mon Sep 17 00:00:00 2001 +-From: Florian Fainelli +-Date: Mon, 18 Jul 2016 16:24:34 -0700 +-Subject: [PATCH] brcmfmac: Fix glob_skb leak in brcmf_sdiod_recv_chain +- +-In case brcmf_sdiod_recv_chain() cannot complete a succeful call to +-brcmf_sdiod_buffrw, we would be leaking glom_skb and not free it as we +-should, fix this. +- +-Reported-by: coverity (CID 1164856) +-Fixes: a413e39a38573 ("brcmfmac: fix brcmf_sdcard_recv_chain() for host without sg support") +-Signed-off-by: Florian Fainelli +-Acked-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 4 +++- +- 1 file changed, 3 insertions(+), 1 deletion(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-@@ -722,8 +722,10 @@ int brcmf_sdiod_recv_chain(struct brcmf_ +- return -ENOMEM; +- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, +- glom_skb); +-- if (err) +-+ if (err) { +-+ brcmu_pkt_buf_free_skb(glom_skb); +- goto done; +-+ } +- +- skb_queue_walk(pktq, skb) { +- memcpy(skb->data, glom_skb->data, skb->len); +diff --git a/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch b/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch +deleted file mode 100644 +index 540b7f0..0000000 +--- a/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch ++++ /dev/null +@@ -1,34 +0,0 @@ +-From 938f89e50a41c2d56710805fb019ad7618cef84b Mon Sep 17 00:00:00 2001 +-From: Wolfram Sang +-Date: Thu, 11 Aug 2016 23:05:31 +0200 +-Subject: [PATCH] net: wireless: broadcom: brcm80211: brcmfmac: usb: don't +- print error when allocating urb fails +- +-kmalloc will print enough information in case of failure. +- +-Signed-off-by: Wolfram Sang +-Signed-off-by: David S. Miller +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 8 ++------ +- 1 file changed, 2 insertions(+), 6 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +-@@ -1099,15 +1099,11 @@ struct brcmf_usbdev *brcmf_usb_attach(st +- devinfo->tx_freecount = ntxq; +- +- devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC); +-- if (!devinfo->ctl_urb) { +-- brcmf_err("usb_alloc_urb (ctl) failed\n"); +-+ if (!devinfo->ctl_urb) +- goto error; +-- } +- devinfo->bulk_urb = usb_alloc_urb(0, GFP_ATOMIC); +-- if (!devinfo->bulk_urb) { +-- brcmf_err("usb_alloc_urb (bulk) failed\n"); +-+ if (!devinfo->bulk_urb) +- goto error; +-- } +- +- return &devinfo->bus_pub; +- +diff --git a/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch b/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch +deleted file mode 100644 +index b98b68a..0000000 +--- a/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch ++++ /dev/null +@@ -1,111 +0,0 @@ +-From 15dacf880e49ce3ecee05eb1a0c6b8e363dbacdc Mon Sep 17 00:00:00 2001 +-From: "mhiramat@kernel.org" +-Date: Mon, 15 Aug 2016 18:40:57 +0900 +-Subject: [PATCH] brcmfmac: Check rtnl_lock is locked when removing interface +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-Check rtnl_lock is locked in brcmf_p2p_ifp_removed() by passing +-rtnl_locked flag. Actually the caller brcmf_del_if() checks whether +-the rtnl_lock is locked, but doesn't pass it to brcmf_p2p_ifp_removed(). +- +-Without this fix, wpa_supplicant goes softlockup with rtnl_lock +-holding (this means all other process using netlink are locked up too) +- +-e.g. +-[ 4495.876627] INFO: task wpa_supplicant:7307 blocked for more than 10 seconds. +-[ 4495.876632] Tainted: G W 4.8.0-rc1+ #8 +-[ 4495.876635] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. +-[ 4495.876638] wpa_supplicant D ffff974c647b39a0 0 7307 1 0x00000000 +-[ 4495.876644] ffff974c647b39a0 0000000000000000 ffff974c00000000 ffff974c7dc59c58 +-[ 4495.876651] ffff974c6b7417c0 ffff974c645017c0 ffff974c647b4000 ffffffff86f16c08 +-[ 4495.876657] ffff974c645017c0 0000000000000246 00000000ffffffff ffff974c647b39b8 +-[ 4495.876664] Call Trace: +-[ 4495.876671] [] schedule+0x3c/0x90 +-[ 4495.876676] [] schedule_preempt_disabled+0x15/0x20 +-[ 4495.876682] [] mutex_lock_nested+0x176/0x3b0 +-[ 4495.876686] [] ? rtnl_lock+0x17/0x20 +-[ 4495.876690] [] rtnl_lock+0x17/0x20 +-[ 4495.876720] [] brcmf_p2p_ifp_removed+0x4d/0x70 [brcmfmac] +-[ 4495.876741] [] brcmf_remove_interface+0x196/0x1b0 [brcmfmac] +-[ 4495.876760] [] brcmf_p2p_del_vif+0x111/0x220 [brcmfmac] +-[ 4495.876777] [] brcmf_cfg80211_del_iface+0x21b/0x270 [brcmfmac] +-[ 4495.876820] [] nl80211_del_interface+0xfe/0x3a0 [cfg80211] +-[ 4495.876825] [] genl_family_rcv_msg+0x1b5/0x370 +-[ 4495.876832] [] ? trace_hardirqs_on+0xd/0x10 +-[ 4495.876836] [] genl_rcv_msg+0x7d/0xb0 +-[ 4495.876839] [] ? genl_family_rcv_msg+0x370/0x370 +-[ 4495.876846] [] netlink_rcv_skb+0x97/0xb0 +-[ 4495.876849] [] genl_rcv+0x28/0x40 +-[ 4495.876854] [] netlink_unicast+0x1d3/0x2f0 +-[ 4495.876860] [] ? netlink_unicast+0x14b/0x2f0 +-[ 4495.876866] [] netlink_sendmsg+0x2eb/0x3a0 +-[ 4495.876870] [] sock_sendmsg+0x38/0x50 +-[ 4495.876874] [] ___sys_sendmsg+0x27f/0x290 +-[ 4495.876882] [] ? mntput_no_expire+0x5/0x3f0 +-[ 4495.876888] [] ? mntput_no_expire+0x8e/0x3f0 +-[ 4495.876894] [] ? mntput_no_expire+0x5/0x3f0 +-[ 4495.876899] [] ? mntput+0x24/0x40 +-[ 4495.876904] [] ? __fput+0x190/0x200 +-[ 4495.876909] [] __sys_sendmsg+0x45/0x80 +-[ 4495.876914] [] SyS_sendmsg+0x12/0x20 +-[ 4495.876918] [] entry_SYSCALL_64_fastpath+0x23/0xc1 +-[ 4495.876924] [] ? trace_hardirqs_off_caller+0x1f/0xc0 +- +-Signed-off-by: Masami Hiramatsu +-Acked-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 2 +- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 8 +++++--- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h | 2 +- +- 3 files changed, 7 insertions(+), 5 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -743,7 +743,7 @@ static void brcmf_del_if(struct brcmf_pu +- * serious troublesome side effects. The p2p module will clean +- * up the ifp if needed. +- */ +-- brcmf_p2p_ifp_removed(ifp); +-+ brcmf_p2p_ifp_removed(ifp, rtnl_locked); +- kfree(ifp); +- } +- } +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +-@@ -2299,7 +2299,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph +- return err; +- } +- +--void brcmf_p2p_ifp_removed(struct brcmf_if *ifp) +-+void brcmf_p2p_ifp_removed(struct brcmf_if *ifp, bool rtnl_locked) +- { +- struct brcmf_cfg80211_info *cfg; +- struct brcmf_cfg80211_vif *vif; +-@@ -2308,9 +2308,11 @@ void brcmf_p2p_ifp_removed(struct brcmf_ +- vif = ifp->vif; +- cfg = wdev_to_cfg(&vif->wdev); +- cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; +-- rtnl_lock(); +-+ if (!rtnl_locked) +-+ rtnl_lock(); +- cfg80211_unregister_wdev(&vif->wdev); +-- rtnl_unlock(); +-+ if (!rtnl_locked) +-+ rtnl_unlock(); +- brcmf_free_vif(vif); +- } +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h +-@@ -155,7 +155,7 @@ struct wireless_dev *brcmf_p2p_add_vif(s +- int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev); +- int brcmf_p2p_ifchange(struct brcmf_cfg80211_info *cfg, +- enum brcmf_fil_p2p_if_types if_type); +--void brcmf_p2p_ifp_removed(struct brcmf_if *ifp); +-+void brcmf_p2p_ifp_removed(struct brcmf_if *ifp, bool rtnl_locked); +- int brcmf_p2p_start_device(struct wiphy *wiphy, struct wireless_dev *wdev); +- void brcmf_p2p_stop_device(struct wiphy *wiphy, struct wireless_dev *wdev); +- int brcmf_p2p_scan_prep(struct wiphy *wiphy, +diff --git a/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch b/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch +deleted file mode 100644 +index 30ca258..0000000 +--- a/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch ++++ /dev/null +@@ -1,175 +0,0 @@ +-From b64abcb7dae6060c67ab0e548da3ef923c49641d Mon Sep 17 00:00:00 2001 +-From: "mhiramat@kernel.org" +-Date: Mon, 15 Aug 2016 18:41:12 +0900 +-Subject: [PATCH] brcmfmac: Change vif_event_lock to spinlock +- +-Change vif_event_lock to spinlock from mutex, since this lock is +-used in wait_event_timeout() via vif_event_equals(). This caused +-a warning report as below. +- +-As far as I can see, this lock protects regions where updating +-structure members, not function calls. Also, since those +-regions are not called from interrupt handlers (of course, it +-was a mutex), spin_lock is used instead of spin_lock_irqsave. +- +-[ 186.678550] ------------[ cut here ]------------ +-[ 186.678556] WARNING: CPU: 2 PID: 7140 at /home/mhiramat/ksrc/linux/kernel/sched/core.c:7545 __might_sleep+0x7c/0x80 +-[ 186.678560] do not call blocking ops when !TASK_RUNNING; state=2 set at [] prepare_to_wait_event+0x60/0x100 +-[ 186.678560] Modules linked in: brcmfmac xt_CHECKSUM rfcomm ipt_MASQUERADE nf_nat_masquerade_ipv4 xt_addrtype br_netfilter xt_tcpudp ip6t_rpfilter ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_conntrack ip_set nfnetlink ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_raw ip6table_security ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_filter ip6_tables iptable_raw iptable_security iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_filter ip_tables x_tables bnep nls_iso8859_1 i2c_designware_platform i2c_designware_core snd_hda_codec_hdmi snd_hda_codec_realtek dcdbas snd_hda_codec_generic snd_hda_intel snd_hda_codec intel_rapl snd_hda_core x86_pkg_temp_thermal intel_powerclamp coretemp +-[ 186.678594] snd_pcm crct10dif_pclmul crc32_pclmul aesni_intel aes_x86_64 joydev glue_helper snd_hwdep lrw gf128mul uvcvideo ablk_helper snd_seq_midi cryptd snd_seq_midi_event snd_rawmidi videobuf2_vmalloc videobuf2_memops snd_seq input_leds videobuf2_v4l2 cfg80211 videobuf2_core snd_timer videodev serio_raw btusb snd_seq_device media btrtl rtsx_pci_ms snd mei_me memstick hid_multitouch mei soundcore brcmutil idma64 virt_dma intel_lpss_pci processor_thermal_device intel_soc_dts_iosf hci_uart btbcm btqca btintel bluetooth int3403_thermal dell_smo8800 intel_lpss_acpi intel_lpss int3402_thermal int340x_thermal_zone intel_hid mac_hid int3400_thermal shpchp sparse_keymap acpi_pad acpi_thermal_rel acpi_als kfifo_buf industrialio kvm_intel kvm irqbypass parport_pc ppdev lp parport autofs4 btrfs xor raid6_pq +-[ 186.678631] usbhid nouveau ttm i915 rtsx_pci_sdmmc mxm_wmi i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops psmouse drm ahci rtsx_pci nvme nvme_core libahci i2c_hid hid pinctrl_sunrisepoint video wmi pinctrl_intel fjes [last unloaded: brcmfmac] +-[ 186.678646] CPU: 2 PID: 7140 Comm: wpa_supplicant Not tainted 4.8.0-rc1+ #8 +-[ 186.678647] Hardware name: Dell Inc. XPS 15 9550/0N7TVV, BIOS 01.02.00 04/07/2016 +-[ 186.678648] 0000000000000000 ffff9d8c64b5b900 ffffffff98442f23 ffff9d8c64b5b950 +-[ 186.678651] 0000000000000000 ffff9d8c64b5b940 ffffffff9808b22b 00001d790000000d +-[ 186.678653] ffffffff98c75e78 000000000000026c 0000000000000000 ffff9d8c2706d058 +-[ 186.678655] Call Trace: +-[ 186.678659] [] dump_stack+0x85/0xc2 +-[ 186.678666] [] __warn+0xcb/0xf0 +-[ 186.678668] [] warn_slowpath_fmt+0x4f/0x60 +-[ 186.678671] [] ? prepare_to_wait_event+0x60/0x100 +-[ 186.678672] [] ? prepare_to_wait_event+0x60/0x100 +-[ 186.678674] [] __might_sleep+0x7c/0x80 +-[ 186.678680] [] mutex_lock_nested+0x33/0x3b0 +-[ 186.678682] [] ? trace_hardirqs_on+0xd/0x10 +-[ 186.678689] [] brcmf_cfg80211_wait_vif_event+0xcd/0x130 [brcmfmac] +-[ 186.678691] [] ? wake_atomic_t_function+0x60/0x60 +-[ 186.678697] [] brcmf_p2p_del_vif+0xf9/0x220 [brcmfmac] +-[ 186.678702] [] brcmf_cfg80211_del_iface+0x21b/0x270 [brcmfmac] +-[ 186.678716] [] nl80211_del_interface+0xfe/0x3a0 [cfg80211] +-[ 186.678718] [] genl_family_rcv_msg+0x1b5/0x370 +-[ 186.678720] [] ? trace_hardirqs_on+0xd/0x10 +-[ 186.678721] [] genl_rcv_msg+0x7d/0xb0 +-[ 186.678722] [] ? genl_family_rcv_msg+0x370/0x370 +-[ 186.678724] [] netlink_rcv_skb+0x97/0xb0 +-[ 186.678726] [] genl_rcv+0x28/0x40 +-[ 186.678727] [] netlink_unicast+0x1d3/0x2f0 +-[ 186.678729] [] ? netlink_unicast+0x14b/0x2f0 +-[ 186.678731] [] netlink_sendmsg+0x2eb/0x3a0 +-[ 186.678733] [] sock_sendmsg+0x38/0x50 +-[ 186.678734] [] ___sys_sendmsg+0x27f/0x290 +-[ 186.678737] [] ? mntput_no_expire+0x5/0x3f0 +-[ 186.678739] [] ? mntput_no_expire+0x8e/0x3f0 +-[ 186.678741] [] ? mntput_no_expire+0x5/0x3f0 +-[ 186.678743] [] ? mntput+0x24/0x40 +-[ 186.678744] [] ? __fput+0x190/0x200 +-[ 186.678746] [] __sys_sendmsg+0x45/0x80 +-[ 186.678748] [] SyS_sendmsg+0x12/0x20 +-[ 186.678749] [] entry_SYSCALL_64_fastpath+0x23/0xc1 +-[ 186.678751] [] ? trace_hardirqs_off_caller+0x1f/0xc0 +-[ 186.678752] ---[ end trace e224d66c5d8408b5 ]--- +- +-Signed-off-by: Masami Hiramatsu +-Acked-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 26 +++++++++++----------- +- .../broadcom/brcm80211/brcmfmac/cfg80211.h | 2 +- +- 2 files changed, 14 insertions(+), 14 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -5555,7 +5555,7 @@ static s32 brcmf_notify_vif_event(struct +- ifevent->action, ifevent->flags, ifevent->ifidx, +- ifevent->bsscfgidx); +- +-- mutex_lock(&event->vif_event_lock); +-+ spin_lock(&event->vif_event_lock); +- event->action = ifevent->action; +- vif = event->vif; +- +-@@ -5563,7 +5563,7 @@ static s32 brcmf_notify_vif_event(struct +- case BRCMF_E_IF_ADD: +- /* waiting process may have timed out */ +- if (!cfg->vif_event.vif) { +-- mutex_unlock(&event->vif_event_lock); +-+ spin_unlock(&event->vif_event_lock); +- return -EBADF; +- } +- +-@@ -5574,24 +5574,24 @@ static s32 brcmf_notify_vif_event(struct +- ifp->ndev->ieee80211_ptr = &vif->wdev; +- SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy)); +- } +-- mutex_unlock(&event->vif_event_lock); +-+ spin_unlock(&event->vif_event_lock); +- wake_up(&event->vif_wq); +- return 0; +- +- case BRCMF_E_IF_DEL: +-- mutex_unlock(&event->vif_event_lock); +-+ spin_unlock(&event->vif_event_lock); +- /* event may not be upon user request */ +- if (brcmf_cfg80211_vif_event_armed(cfg)) +- wake_up(&event->vif_wq); +- return 0; +- +- case BRCMF_E_IF_CHANGE: +-- mutex_unlock(&event->vif_event_lock); +-+ spin_unlock(&event->vif_event_lock); +- wake_up(&event->vif_wq); +- return 0; +- +- default: +-- mutex_unlock(&event->vif_event_lock); +-+ spin_unlock(&event->vif_event_lock); +- break; +- } +- return -EINVAL; +-@@ -5712,7 +5712,7 @@ static void wl_deinit_priv(struct brcmf_ +- static void init_vif_event(struct brcmf_cfg80211_vif_event *event) +- { +- init_waitqueue_head(&event->vif_wq); +-- mutex_init(&event->vif_event_lock); +-+ spin_lock_init(&event->vif_event_lock); +- } +- +- static s32 brcmf_dongle_roam(struct brcmf_if *ifp) +-@@ -6607,9 +6607,9 @@ static inline bool vif_event_equals(stru +- { +- u8 evt_action; +- +-- mutex_lock(&event->vif_event_lock); +-+ spin_lock(&event->vif_event_lock); +- evt_action = event->action; +-- mutex_unlock(&event->vif_event_lock); +-+ spin_unlock(&event->vif_event_lock); +- return evt_action == action; +- } +- +-@@ -6618,10 +6618,10 @@ void brcmf_cfg80211_arm_vif_event(struct +- { +- struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; +- +-- mutex_lock(&event->vif_event_lock); +-+ spin_lock(&event->vif_event_lock); +- event->vif = vif; +- event->action = 0; +-- mutex_unlock(&event->vif_event_lock); +-+ spin_unlock(&event->vif_event_lock); +- } +- +- bool brcmf_cfg80211_vif_event_armed(struct brcmf_cfg80211_info *cfg) +-@@ -6629,9 +6629,9 @@ bool brcmf_cfg80211_vif_event_armed(stru +- struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; +- bool armed; +- +-- mutex_lock(&event->vif_event_lock); +-+ spin_lock(&event->vif_event_lock); +- armed = event->vif != NULL; +-- mutex_unlock(&event->vif_event_lock); +-+ spin_unlock(&event->vif_event_lock); +- +- return armed; +- } +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +-@@ -227,7 +227,7 @@ struct escan_info { +- */ +- struct brcmf_cfg80211_vif_event { +- wait_queue_head_t vif_wq; +-- struct mutex vif_event_lock; +-+ spinlock_t vif_event_lock; +- u8 action; +- struct brcmf_cfg80211_vif *vif; +- }; +diff --git a/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch b/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch +deleted file mode 100644 +index 1a7947b..0000000 +--- a/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch ++++ /dev/null +@@ -1,29 +0,0 @@ +-From 8af92af3f2d55db143417a5d401696f4b642009a Mon Sep 17 00:00:00 2001 +-From: Baoyou Xie +-Date: Mon, 29 Aug 2016 20:39:35 +0800 +-Subject: [PATCH] brcmfmac: add missing header dependencies +- +-We get 1 warning when building kernel with W=1: +- +-drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c:23:6: warning: no previous prototype for '__brcmf_err' [-Wmissing-prototypes] +- +-In fact, this function is declared in brcmfmac/debug.h, so this patch +-adds missing header dependencies. +- +-Signed-off-by: Baoyou Xie +-Acked-by: Arnd Bergmann +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c | 1 + +- 1 file changed, 1 insertion(+) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c +-@@ -19,6 +19,7 @@ +- #ifndef __CHECKER__ +- #define CREATE_TRACE_POINTS +- #include "tracepoint.h" +-+#include "debug.h" +- +- void __brcmf_err(const char *func, const char *fmt, ...) +- { +diff --git a/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch b/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch +deleted file mode 100644 +index 24cd92a..0000000 +--- a/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch ++++ /dev/null +@@ -1,51 +0,0 @@ +-From bccf3ffc8c6d8e0251a15541bb4d12b423c4f729 Mon Sep 17 00:00:00 2001 +-From: Ismael Luceno +-Date: Mon, 22 Aug 2016 19:40:07 -0300 +-Subject: [PATCH] brcmfmac: Add USB ID for Cisco Linksys AE1200 +- +-The AE1200 comes with different revisions of the BCM43235 chipset, +-but all have the same USB ID. Only revision 3 can be supported. +- +-Signed-off-by: Ismael Luceno +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 4 ++++ +- drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 2 ++ +- 2 files changed, 6 insertions(+) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +-@@ -1456,11 +1456,15 @@ static int brcmf_usb_reset_resume(struct +- #define BRCMF_USB_DEVICE(dev_id) \ +- { USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, dev_id) } +- +-+#define LINKSYS_USB_DEVICE(dev_id) \ +-+ { USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id) } +-+ +- static struct usb_device_id brcmf_usb_devid_table[] = { +- BRCMF_USB_DEVICE(BRCM_USB_43143_DEVICE_ID), +- BRCMF_USB_DEVICE(BRCM_USB_43236_DEVICE_ID), +- BRCMF_USB_DEVICE(BRCM_USB_43242_DEVICE_ID), +- BRCMF_USB_DEVICE(BRCM_USB_43569_DEVICE_ID), +-+ LINKSYS_USB_DEVICE(BRCM_USB_43235_LINKSYS_DEVICE_ID), +- { USB_DEVICE(BRCM_USB_VENDOR_ID_LG, BRCM_USB_43242_LG_DEVICE_ID) }, +- /* special entry for device with firmware loaded and running */ +- BRCMF_USB_DEVICE(BRCM_USB_BCMFW_DEVICE_ID), +---- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h +-@@ -22,6 +22,7 @@ +- +- #define BRCM_USB_VENDOR_ID_BROADCOM 0x0a5c +- #define BRCM_USB_VENDOR_ID_LG 0x043e +-+#define BRCM_USB_VENDOR_ID_LINKSYS 0x13b1 +- #define BRCM_PCIE_VENDOR_ID_BROADCOM PCI_VENDOR_ID_BROADCOM +- +- /* Chipcommon Core Chip IDs */ +-@@ -56,6 +57,7 @@ +- +- /* USB Device IDs */ +- #define BRCM_USB_43143_DEVICE_ID 0xbd1e +-+#define BRCM_USB_43235_LINKSYS_DEVICE_ID 0x0039 +- #define BRCM_USB_43236_DEVICE_ID 0xbd17 +- #define BRCM_USB_43242_DEVICE_ID 0xbd1f +- #define BRCM_USB_43242_LG_DEVICE_ID 0x3101 +diff --git a/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch b/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch +deleted file mode 100644 +index b58a266..0000000 +--- a/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch ++++ /dev/null +@@ -1,51 +0,0 @@ +-From 7703773ef1d85b40433902a8da20167331597e4a Mon Sep 17 00:00:00 2001 +-From: Nicolas Iooss +-Date: Tue, 23 Aug 2016 11:37:17 +0200 +-Subject: [PATCH] brcmfmac: fix pmksa->bssid usage +- +-The struct cfg80211_pmksa defines its bssid field as: +- +- const u8 *bssid; +- +-contrary to struct brcmf_pmksa, which uses: +- +- u8 bssid[ETH_ALEN]; +- +-Therefore in brcmf_cfg80211_del_pmksa(), &pmksa->bssid takes the address +-of this field (of type u8**), not the one of its content (which would be +-u8*). Remove the & operator to make brcmf_dbg("%pM") and memcmp() +-behave as expected. +- +-This bug have been found using a custom static checker (which checks the +-usage of %p... attributes at build time). It has been introduced in +-commit 6c404f34f2bd ("brcmfmac: Cleanup pmksa cache handling code"), +-which replaced pmksa->bssid by &pmksa->bssid while refactoring the code, +-without modifying struct cfg80211_pmksa definition. +- +-Replace &pmk[i].bssid with pmk[i].bssid too to make the code clearer, +-this change does not affect the semantic. +- +-Fixes: 6c404f34f2bd ("brcmfmac: Cleanup pmksa cache handling code") +-Cc: stable@vger.kernel.org +-Signed-off-by: Nicolas Iooss +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++-- +- 1 file changed, 2 insertions(+), 2 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -3804,11 +3804,11 @@ brcmf_cfg80211_del_pmksa(struct wiphy *w +- if (!check_vif_up(ifp->vif)) +- return -EIO; +- +-- brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", &pmksa->bssid); +-+ brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", pmksa->bssid); +- +- npmk = le32_to_cpu(cfg->pmk_list.npmk); +- for (i = 0; i < npmk; i++) +-- if (!memcmp(&pmksa->bssid, &pmk[i].bssid, ETH_ALEN)) +-+ if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) +- break; +- +- if ((npmk > 0) && (i < npmk)) { +diff --git a/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch b/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch +deleted file mode 100644 +index 760b6da..0000000 +--- a/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch ++++ /dev/null +@@ -1,34 +0,0 @@ +-From ded89912156b1a47d940a0c954c43afbabd0c42c Mon Sep 17 00:00:00 2001 +-From: Arend Van Spriel +-Date: Mon, 5 Sep 2016 10:45:47 +0100 +-Subject: [PATCH] brcmfmac: avoid potential stack overflow in +- brcmf_cfg80211_start_ap() +- +-User-space can choose to omit NL80211_ATTR_SSID and only provide raw +-IE TLV data. When doing so it can provide SSID IE with length exceeding +-the allowed size. The driver further processes this IE copying it +-into a local variable without checking the length. Hence stack can be +-corrupted and used as exploit. +- +-Cc: stable@vger.kernel.org # v4.7 +-Reported-by: Daxing Guo +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +- +- 1 file changed, 1 insertion(+), 1 deletion(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -4447,7 +4447,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- (u8 *)&settings->beacon.head[ie_offset], +- settings->beacon.head_len - ie_offset, +- WLAN_EID_SSID); +-- if (!ssid_ie) +-+ if (!ssid_ie || ssid_ie->len > IEEE80211_MAX_SSID_LEN) +- return -EINVAL; +- +- memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len); +diff --git a/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch b/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch +deleted file mode 100644 +index 1285b30..0000000 +--- a/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch ++++ /dev/null +@@ -1,55 +0,0 @@ +-From 634faf3686900ccdee87b77e2c56df8b2159912b Mon Sep 17 00:00:00 2001 +-From: Arend Van Spriel +-Date: Mon, 5 Sep 2016 11:42:12 +0100 +-Subject: [PATCH] brcmfmac: add support for bcm4339 chip with modalias +- sdio:c00v02D0d4339 +- +-The driver already supports the bcm4339 chipset but only for the variant +-that shares the same modalias as the bcm4335, ie. sdio:c00v02D0d4335. +-It turns out that there are also bcm4339 devices out there that have a +-more distiguishable modalias sdio:c00v02D0d4339. +- +-Reported-by: Steve deRosier +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 1 + +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 3 ++- +- include/linux/mmc/sdio_ids.h | 1 + +- 3 files changed, 4 insertions(+), 1 deletion(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-@@ -1097,6 +1097,7 @@ static const struct sdio_device_id brcmf +- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341), +- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362), +- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339), +-+ BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339), +- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430), +- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345), +- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354), +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-@@ -3756,7 +3756,8 @@ static u32 brcmf_sdio_buscore_read32(voi +- u32 val, rev; +- +- val = brcmf_sdiod_regrl(sdiodev, addr, NULL); +-- if (sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 && +-+ if ((sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 || +-+ sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4339) && +- addr == CORE_CC_REG(SI_ENUM_BASE, chipid)) { +- rev = (val & CID_REV_MASK) >> CID_REV_SHIFT; +- if (rev >= 2) { +---- a/include/linux/mmc/sdio_ids.h +-+++ b/include/linux/mmc/sdio_ids.h +-@@ -32,6 +32,7 @@ +- #define SDIO_DEVICE_ID_BROADCOM_43340 0xa94c +- #define SDIO_DEVICE_ID_BROADCOM_43341 0xa94d +- #define SDIO_DEVICE_ID_BROADCOM_4335_4339 0x4335 +-+#define SDIO_DEVICE_ID_BROADCOM_4339 0x4339 +- #define SDIO_DEVICE_ID_BROADCOM_43362 0xa962 +- #define SDIO_DEVICE_ID_BROADCOM_43430 0xa9a6 +- #define SDIO_DEVICE_ID_BROADCOM_4345 0x4345 +diff --git a/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch b/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch +deleted file mode 100644 +index 1d5667e..0000000 +--- a/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch ++++ /dev/null +@@ -1,56 +0,0 @@ +-From 5251b6be8bb5c5675bdf12347c7b83937a5c91e5 Mon Sep 17 00:00:00 2001 +-From: Arend Van Spriel +-Date: Mon, 5 Sep 2016 11:42:13 +0100 +-Subject: [PATCH] brcmfmac: sdio: shorten retry loop in +- brcmf_sdio_kso_control() +- +-In brcmf_sdio_kso_control() there is a retry loop as hardware may take +-time to settle. However, when the call to brcmf_sdiod_regrb() returns +-an error it is due to SDIO access failure and it makes no sense to wait +-for hardware to settle. This patch aborts the loop after a number of +-subsequent access errors. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 11 +++++++++-- +- 1 file changed, 9 insertions(+), 2 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +-@@ -313,6 +313,7 @@ struct rte_console { +- +- #define KSO_WAIT_US 50 +- #define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US) +-+#define BRCMF_SDIO_MAX_ACCESS_ERRORS 5 +- +- /* +- * Conversion of 802.1D priority to precedence level +-@@ -675,6 +676,7 @@ brcmf_sdio_kso_control(struct brcmf_sdio +- { +- u8 wr_val = 0, rd_val, cmp_val, bmask; +- int err = 0; +-+ int err_cnt = 0; +- int try_cnt = 0; +- +- brcmf_dbg(TRACE, "Enter: on=%d\n", on); +-@@ -710,9 +712,14 @@ brcmf_sdio_kso_control(struct brcmf_sdio +- */ +- rd_val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, +- &err); +-- if (((rd_val & bmask) == cmp_val) && !err) +-+ if (!err) { +-+ if ((rd_val & bmask) == cmp_val) +-+ break; +-+ err_cnt = 0; +-+ } +-+ /* bail out upon subsequent access errors */ +-+ if (err && (err_cnt++ > BRCMF_SDIO_MAX_ACCESS_ERRORS)) +- break; +-- +- udelay(KSO_WAIT_US); +- brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, +- wr_val, &err); +diff --git a/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch b/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch +deleted file mode 100644 +index 1620e00..0000000 +--- a/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch ++++ /dev/null +@@ -1,84 +0,0 @@ +-From b3589dfe02123a0d0ea82076a9f8ef84a46852c0 Mon Sep 17 00:00:00 2001 +-From: Hante Meuleman +-Date: Mon, 19 Sep 2016 12:09:51 +0100 +-Subject: [PATCH] brcmfmac: ignore 11d configuration errors +- +-802.11d is not always supported by firmware anymore. Currently the +-AP configuration of 11d will cause an abort if the ioctl set is +-failing. This behavior is not correct and the error should be +-ignored. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 27 ++++++++++++---------- +- 1 file changed, 15 insertions(+), 12 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -4422,6 +4422,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef); +- bool mbss; +- int is_11d; +-+ bool supports_11d; +- +- brcmf_dbg(TRACE, "ctrlchn=%d, center=%d, bw=%d, beacon_interval=%d, dtim_period=%d,\n", +- settings->chandef.chan->hw_value, +-@@ -4434,11 +4435,16 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- mbss = ifp->vif->mbss; +- +- /* store current 11d setting */ +-- brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY, &ifp->vif->is_11d); +-- country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, +-- settings->beacon.tail_len, +-- WLAN_EID_COUNTRY); +-- is_11d = country_ie ? 1 : 0; +-+ if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY, +-+ &ifp->vif->is_11d)) { +-+ supports_11d = false; +-+ } else { +-+ country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, +-+ settings->beacon.tail_len, +-+ WLAN_EID_COUNTRY); +-+ is_11d = country_ie ? 1 : 0; +-+ supports_11d = true; +-+ } +- +- memset(&ssid_le, 0, sizeof(ssid_le)); +- if (settings->ssid == NULL || settings->ssid_len == 0) { +-@@ -4497,7 +4503,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- +- /* Parameters shared by all radio interfaces */ +- if (!mbss) { +-- if (is_11d != ifp->vif->is_11d) { +-+ if ((supports_11d) && (is_11d != ifp->vif->is_11d)) { +- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY, +- is_11d); +- if (err < 0) { +-@@ -4539,7 +4545,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi +- brcmf_err("SET INFRA error %d\n", err); +- goto exit; +- } +-- } else if (WARN_ON(is_11d != ifp->vif->is_11d)) { +-+ } else if (WARN_ON(supports_11d && (is_11d != ifp->vif->is_11d))) { +- /* Multiple-BSS should use same 11d configuration */ +- err = -EINVAL; +- goto exit; +-@@ -4673,11 +4679,8 @@ static int brcmf_cfg80211_stop_ap(struct +- brcmf_err("setting INFRA mode failed %d\n", err); +- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) +- brcmf_fil_iovar_int_set(ifp, "mbss", 0); +-- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY, +-- ifp->vif->is_11d); +-- if (err < 0) +-- brcmf_err("restoring REGULATORY setting failed %d\n", +-- err); +-+ brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY, +-+ ifp->vif->is_11d); +- /* Bring device back up so it can be used again */ +- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); +- if (err < 0) +diff --git a/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch b/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch +deleted file mode 100644 +index 9461164..0000000 +--- a/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch ++++ /dev/null +@@ -1,32 +0,0 @@ +-From 704d1c6b56f4ee2ad6a5f012a72a278d17c1a223 Mon Sep 17 00:00:00 2001 +-From: Arend Van Spriel +-Date: Mon, 19 Sep 2016 12:09:52 +0100 +-Subject: [PATCH] brcmfmac: rework pointer trickery in +- brcmf_proto_bcdc_query_dcmd() +- +-The variable info is assigned to point to bcdc->msg[1], which is the +-same as pointing to bcdc->buf. As that is what we want to access +-make it clear by fixing the assignment. This also avoid out-of-bounds +-errors from static analyzers are bcdc->msg[1] is not in the structure +-definition. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | 2 +- +- 1 file changed, 1 insertion(+), 1 deletion(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c +-@@ -194,7 +194,7 @@ retry: +- } +- +- /* Check info buffer */ +-- info = (void *)&msg[1]; +-+ info = (void *)&bcdc->buf[0]; +- +- /* Copy info buffer */ +- if (buf) { +diff --git a/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch b/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch +deleted file mode 100644 +index 2ececdf..0000000 +--- a/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch ++++ /dev/null +@@ -1,39 +0,0 @@ +-From bc981641360183990de59da17f9f560f9150b801 Mon Sep 17 00:00:00 2001 +-From: Arend Van Spriel +-Date: Mon, 19 Sep 2016 12:09:53 +0100 +-Subject: [PATCH] brcmfmac: fix memory leak in brcmf_flowring_add_tdls_peer() +- +-In the error paths in brcmf_flowring_add_tdls_peer() the allocated +-resource should be freed. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c | 8 ++++++-- +- 1 file changed, 6 insertions(+), 2 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c +-@@ -495,14 +495,18 @@ void brcmf_flowring_add_tdls_peer(struct +- } else { +- search = flow->tdls_entry; +- if (memcmp(search->mac, peer, ETH_ALEN) == 0) +-- return; +-+ goto free_entry; +- while (search->next) { +- search = search->next; +- if (memcmp(search->mac, peer, ETH_ALEN) == 0) +-- return; +-+ goto free_entry; +- } +- search->next = tdls_entry; +- } +- +- flow->tdls_active = true; +-+ return; +-+ +-+free_entry: +-+ kfree(tdls_entry); +- } +diff --git a/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch b/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch +deleted file mode 100644 +index 529cc8d..0000000 +--- a/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch ++++ /dev/null +@@ -1,28 +0,0 @@ +-From 26305d3d7298d1ddf8fd4ce95a382aa90534f0a3 Mon Sep 17 00:00:00 2001 +-From: Arend Van Spriel +-Date: Mon, 19 Sep 2016 12:09:54 +0100 +-Subject: [PATCH] brcmfmac: initialize variable in brcmf_sdiod_regrl() +- +-In case of an error the variable returned is uninitialized. The caller +-will probably check the error code before using it, but better assure +-it is set to zero. +- +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 +- +- 1 file changed, 1 insertion(+), 1 deletion(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c +-@@ -416,7 +416,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d +- +- u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) +- { +-- u32 data; +-+ u32 data = 0; +- int retval; +- +- brcmf_dbg(SDIO, "addr:0x%08x\n", addr); +diff --git a/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch b/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch +deleted file mode 100644 +index 67af30e..0000000 +--- a/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch ++++ /dev/null +@@ -1,107 +0,0 @@ +-From 8fa5fdec09cd379c9ecb8972f344f8f308e0ccf3 Mon Sep 17 00:00:00 2001 +-From: Arend Van Spriel +-Date: Mon, 19 Sep 2016 12:09:55 +0100 +-Subject: [PATCH] brcmfmac: remove worker from .ndo_set_mac_address() callback +- +-As it turns out there is no need to use a worker for the callback +-because it is not called from atomic context. +- +-Reported-by: Dan Williams +-Reviewed-by: Hante Meuleman +-Reviewed-by: Pieter-Paul Giesberts +-Reviewed-by: Franky Lin +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- .../wireless/broadcom/brcm80211/brcmfmac/core.c | 39 ++++++++-------------- +- .../wireless/broadcom/brcm80211/brcmfmac/core.h | 2 -- +- 2 files changed, 13 insertions(+), 28 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -136,27 +136,6 @@ static void _brcmf_set_multicast_list(st +- err); +- } +- +--static void +--_brcmf_set_mac_address(struct work_struct *work) +--{ +-- struct brcmf_if *ifp; +-- s32 err; +-- +-- ifp = container_of(work, struct brcmf_if, setmacaddr_work); +-- +-- brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx); +-- +-- err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr, +-- ETH_ALEN); +-- if (err < 0) { +-- brcmf_err("Setting cur_etheraddr failed, %d\n", err); +-- } else { +-- brcmf_dbg(TRACE, "MAC address updated to %pM\n", +-- ifp->mac_addr); +-- memcpy(ifp->ndev->dev_addr, ifp->mac_addr, ETH_ALEN); +-- } +--} +-- +- #if IS_ENABLED(CONFIG_IPV6) +- static void _brcmf_update_ndtable(struct work_struct *work) +- { +-@@ -190,10 +169,20 @@ static int brcmf_netdev_set_mac_address( +- { +- struct brcmf_if *ifp = netdev_priv(ndev); +- struct sockaddr *sa = (struct sockaddr *)addr; +-+ int err; +- +-- memcpy(&ifp->mac_addr, sa->sa_data, ETH_ALEN); +-- schedule_work(&ifp->setmacaddr_work); +-- return 0; +-+ brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx); +-+ +-+ err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", sa->sa_data, +-+ ETH_ALEN); +-+ if (err < 0) { +-+ brcmf_err("Setting cur_etheraddr failed, %d\n", err); +-+ } else { +-+ brcmf_dbg(TRACE, "updated to %pM\n", sa->sa_data); +-+ memcpy(ifp->mac_addr, sa->sa_data, ETH_ALEN); +-+ memcpy(ifp->ndev->dev_addr, ifp->mac_addr, ETH_ALEN); +-+ } +-+ return err; +- } +- +- static void brcmf_netdev_set_multicast_list(struct net_device *ndev) +-@@ -525,7 +514,6 @@ int brcmf_net_attach(struct brcmf_if *if +- /* set the mac address */ +- memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN); +- +-- INIT_WORK(&ifp->setmacaddr_work, _brcmf_set_mac_address); +- INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list); +- INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable); +- +-@@ -730,7 +718,6 @@ static void brcmf_del_if(struct brcmf_pu +- } +- +- if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) { +-- cancel_work_sync(&ifp->setmacaddr_work); +- cancel_work_sync(&ifp->multicast_work); +- cancel_work_sync(&ifp->ndoffload_work); +- } +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -176,7 +176,6 @@ enum brcmf_netif_stop_reason { +- * @vif: points to cfg80211 specific interface information. +- * @ndev: associated network device. +- * @stats: interface specific network statistics. +-- * @setmacaddr_work: worker object for setting mac address. +- * @multicast_work: worker object for multicast provisioning. +- * @ndoffload_work: worker object for neighbor discovery offload configuration. +- * @fws_desc: interface specific firmware-signalling descriptor. +-@@ -193,7 +192,6 @@ struct brcmf_if { +- struct brcmf_cfg80211_vif *vif; +- struct net_device *ndev; +- struct net_device_stats stats; +-- struct work_struct setmacaddr_work; +- struct work_struct multicast_work; +- struct work_struct ndoffload_work; +- struct brcmf_fws_mac_descriptor *fws_desc; +diff --git a/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch b/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch +deleted file mode 100644 +index 5a08479..0000000 +--- a/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch ++++ /dev/null +@@ -1,31 +0,0 @@ +-From 835680b82f029818c813324aed3073cdcf63241f Mon Sep 17 00:00:00 2001 +-From: Hante Meuleman +-Date: Mon, 19 Sep 2016 12:09:56 +0100 +-Subject: [PATCH] brcmfmac: remove unnecessary null pointer check +- +-in the function brcmf_bus_start() in the exception handling a +-check is made to dermine whether ifp is null, though this is not +-possible. Removing the unnessary check. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 +-- +- 1 file changed, 1 insertion(+), 2 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -1048,8 +1048,7 @@ fail: +- brcmf_fws_del_interface(ifp); +- brcmf_fws_deinit(drvr); +- } +-- if (ifp) +-- brcmf_net_detach(ifp->ndev, false); +-+ brcmf_net_detach(ifp->ndev, false); +- if (p2p_ifp) +- brcmf_net_detach(p2p_ifp->ndev, false); +- drvr->iflist[0] = NULL; +diff --git a/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch b/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch +deleted file mode 100644 +index 0b3a23e..0000000 +--- a/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch ++++ /dev/null +@@ -1,37 +0,0 @@ +-From 2b7425f3629b38c438f890c20c5faeca64b144ff Mon Sep 17 00:00:00 2001 +-From: Hante Meuleman +-Date: Mon, 19 Sep 2016 12:09:57 +0100 +-Subject: [PATCH] brcmfmac: fix clearing entry IPv6 address +- +-When IPv6 address is to be cleared there is a possible out of +-bound access. But also the clearing of the last entry and the +-adjustment of total number of stored IPv6 addresses is not +-updated. This patch fixes that bug. Bug was found using coverity. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 7 +++++-- +- 1 file changed, 5 insertions(+), 2 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -873,9 +873,12 @@ static int brcmf_inet6addr_changed(struc +- } +- break; +- case NETDEV_DOWN: +-- if (i < NDOL_MAX_ENTRIES) +-- for (; i < ifp->ipv6addr_idx; i++) +-+ if (i < NDOL_MAX_ENTRIES) { +-+ for (; i < ifp->ipv6addr_idx - 1; i++) +- table[i] = table[i + 1]; +-+ memset(&table[i], 0, sizeof(table[i])); +-+ ifp->ipv6addr_idx--; +-+ } +- break; +- default: +- break; +diff --git a/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch b/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch +deleted file mode 100644 +index a47cb32..0000000 +--- a/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch ++++ /dev/null +@@ -1,44 +0,0 @@ +-From a7ed7828ecda0c2b5e0d7f55dedd4230afd4b583 Mon Sep 17 00:00:00 2001 +-From: Hante Meuleman +-Date: Mon, 19 Sep 2016 12:09:58 +0100 +-Subject: [PATCH] brcmfmac: fix out of bound access on clearing wowl wake +- indicator +- +-Clearing the wowl wakeindicator happens with a rather odd +-construction where the string "clear" is used to set the iovar +-wowl_wakeind. This was implemented incorrectly as it caused an +-out of bound access. Use an intermediate variable of correct +-length and copy string in that. Problem was found using coverity. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 6 ++++-- +- 1 file changed, 4 insertions(+), 2 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -3623,6 +3623,7 @@ static void brcmf_configure_wowl(struct +- struct cfg80211_wowlan *wowl) +- { +- u32 wowl_config; +-+ struct brcmf_wowl_wakeind_le wowl_wakeind; +- u32 i; +- +- brcmf_dbg(TRACE, "Suspend, wowl config.\n"); +-@@ -3664,8 +3665,9 @@ static void brcmf_configure_wowl(struct +- if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) +- wowl_config |= BRCMF_WOWL_UNASSOC; +- +-- brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", "clear", +-- sizeof(struct brcmf_wowl_wakeind_le)); +-+ memcpy(&wowl_wakeind, "clear", 6); +-+ brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", &wowl_wakeind, +-+ sizeof(wowl_wakeind)); +- brcmf_fil_iovar_int_set(ifp, "wowl", wowl_config); +- brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1); +- brcmf_bus_wowl_config(cfg->pub->bus_if, true); +diff --git a/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch b/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch +deleted file mode 100644 +index a652ae6..0000000 +--- a/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch ++++ /dev/null +@@ -1,39 +0,0 @@ +-From 92c313604711a0976def79dabb9e8da3cc2cc780 Mon Sep 17 00:00:00 2001 +-From: Hante Meuleman +-Date: Mon, 19 Sep 2016 12:09:59 +0100 +-Subject: [PATCH] brcmfmac: simplify mapping of auth type +- +-The 802.11 standard only has four valid auth type configurations of which +-our firmware only supports two, ie. Open System and Shared Key. Simplify +-the mapping falling back to automatic for other types specified by +-user-space. +- +-Reviewed-by: Arend Van Spriel +-Reviewed-by: Franky Lin +-Reviewed-by: Pieter-Paul Giesberts +-Signed-off-by: Hante Meuleman +-Signed-off-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 8 +------- +- 1 file changed, 1 insertion(+), 7 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -1577,15 +1577,9 @@ static s32 brcmf_set_auth_type(struct ne +- val = 1; +- brcmf_dbg(CONN, "shared key\n"); +- break; +-- case NL80211_AUTHTYPE_AUTOMATIC: +-- val = 2; +-- brcmf_dbg(CONN, "automatic\n"); +-- break; +-- case NL80211_AUTHTYPE_NETWORK_EAP: +-- brcmf_dbg(CONN, "network eap\n"); +- default: +- val = 2; +-- brcmf_err("invalid auth type (%d)\n", sme->auth_type); +-+ brcmf_dbg(CONN, "automatic, auth type (%d)\n", sme->auth_type); +- break; +- } +- +diff --git a/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch b/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch +deleted file mode 100644 +index a6fae37..0000000 +--- a/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch ++++ /dev/null +@@ -1,41 +0,0 @@ +-From 23e9c128adb2038c27a424a5f91136e7fa3e0dc6 Mon Sep 17 00:00:00 2001 +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Wed, 21 Sep 2016 08:23:24 +0200 +-Subject: [PATCH] brcmfmac: fix memory leak in brcmf_fill_bss_param +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-This function is called from get_station callback which means that every +-time user space was getting/dumping station(s) we were leaking 2 KiB. +- +-Signed-off-by: Rafał Miłecki +-Fixes: 1f0dc59a6de ("brcmfmac: rework .get_station() callback") +-Cc: stable@vger.kernel.org # 4.2+ +-Acked-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 ++++- +- 1 file changed, 4 insertions(+), 1 deletion(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +-@@ -2463,7 +2463,7 @@ static void brcmf_fill_bss_param(struct +- WL_BSS_INFO_MAX); +- if (err) { +- brcmf_err("Failed to get bss info (%d)\n", err); +-- return; +-+ goto out_kfree; +- } +- si->filled |= BIT(NL80211_STA_INFO_BSS_PARAM); +- si->bss_param.beacon_interval = le16_to_cpu(buf->bss_le.beacon_period); +-@@ -2475,6 +2475,9 @@ static void brcmf_fill_bss_param(struct +- si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE; +- if (capability & WLAN_CAPABILITY_SHORT_SLOT_TIME) +- si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME; +-+ +-+out_kfree: +-+ kfree(buf); +- } +- +- static s32 +diff --git a/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch b/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch +deleted file mode 100644 +index 47af73a..0000000 +--- a/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch ++++ /dev/null +@@ -1,60 +0,0 @@ +-From 2df86ad959c9d1cdbeb2f23a0801857731156692 Mon Sep 17 00:00:00 2001 +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Fri, 23 Sep 2016 15:27:46 +0200 +-Subject: [PATCH] brcmfmac: drop unused fields from struct brcmf_pub +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-They seem to be there from the first day. We calculate these values but +-never use them. +- +-Signed-off-by: Rafał Miłecki +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 --- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h | 4 ---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 2 -- +- 3 files changed, 9 deletions(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -508,9 +508,6 @@ int brcmf_net_attach(struct brcmf_if *if +- ndev->hard_header_len += drvr->hdrlen; +- ndev->ethtool_ops = &brcmf_ethtool_ops; +- +-- drvr->rxsz = ndev->mtu + ndev->hard_header_len + +-- drvr->hdrlen; +-- +- /* set the mac address */ +- memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN); +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h +-@@ -112,15 +112,11 @@ struct brcmf_pub { +- +- /* Internal brcmf items */ +- uint hdrlen; /* Total BRCMF header length (proto + bus) */ +-- uint rxsz; /* Rx buffer size bus module should use */ +- +- /* Dongle media info */ +- char fwver[BRCMF_DRIVER_FIRMWARE_VERSION_LEN]; +- u8 mac[ETH_ALEN]; /* MAC address obtained from dongle */ +- +-- /* Multicast data packets sent to dongle */ +-- unsigned long tx_multicast; +-- +- struct mac_address addresses[BRCMF_MAX_IFS]; +- +- struct brcmf_if *iflist[BRCMF_MAX_IFS]; +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +-@@ -2104,8 +2104,6 @@ int brcmf_fws_process_skb(struct brcmf_i +- if (!skb->priority) +- skb->priority = cfg80211_classify8021d(skb, NULL); +- +-- drvr->tx_multicast += !!multicast; +-- +- if (fws->avoid_queueing) { +- rc = brcmf_proto_txdata(drvr, ifp->ifidx, 0, skb); +- if (rc < 0) +diff --git a/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch b/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch +deleted file mode 100644 +index ca4863a..0000000 +--- a/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch ++++ /dev/null +@@ -1,38 +0,0 @@ +-From 2f0e56fa37cce60a5ac5d451bcadec51cd711436 Mon Sep 17 00:00:00 2001 +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Tue, 27 Sep 2016 12:12:24 +0200 +-Subject: [PATCH] brcmfmac: replace WARNING on timeout with a simple error +- message +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-Even with timeout increased to 950 ms we get WARNINGs from time to time. +-It mostly happens on A-MPDU stalls (e.g. when station goes out of +-range). It may take up to 5-10 secods for the firmware to recover and +-for that time it doesn't process packets. +- +-It's still useful to have a message on time out as it may indicate some +-firmware problem and incorrect key update. Raising a WARNING however +-wasn't really that necessary, it doesn't point to any driver bug anymore +-and backtrace wasn't much useful. +- +-Signed-off-by: Rafał Miłecki +-Acked-by: Arend van Spriel +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 ++- +- 1 file changed, 2 insertions(+), 1 deletion(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +-@@ -1155,7 +1155,8 @@ int brcmf_netdev_wait_pend8021x(struct b +- !brcmf_get_pend_8021x_cnt(ifp), +- MAX_WAIT_FOR_8021X_TX); +- +-- WARN_ON(!err); +-+ if (!err) +-+ brcmf_err("Timed out waiting for no pending 802.1x packets\n"); +- +- return !err; +- } +diff --git a/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch b/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch +deleted file mode 100644 +index 6976359..0000000 +--- a/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch ++++ /dev/null +@@ -1,58 +0,0 @@ +-From 7f00ee2bbc630900ba16fc2690473f3e2db0e264 Mon Sep 17 00:00:00 2001 +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Tue, 27 Sep 2016 14:11:04 +0200 +-Subject: [PATCH] brcmfmac: use correct skb freeing helper when deleting +- flowring +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-Flowrings contain skbs waiting for transmission that were passed to us +-by netif. It means we checked every one of them looking for 802.1x +-Ethernet type. When deleting flowring we have to use freeing function +-that will check for 802.1x type as well. +- +-Freeing skbs without a proper check was leading to counter not being +-properly decreased. This was triggering a WARNING every time +-brcmf_netdev_wait_pend8021x was called. +- +-Signed-off-by: Rafał Miłecki +-Acked-by: Arend van Spriel +-Cc: stable@vger.kernel.org # 4.5+ +-Signed-off-by: Kalle Valo +---- +- drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c | 9 ++++++++- +- 1 file changed, 8 insertions(+), 1 deletion(-) +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c +-@@ -234,13 +234,20 @@ static void brcmf_flowring_block(struct +- +- void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid) +- { +-+ struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev); +- struct brcmf_flowring_ring *ring; +-+ struct brcmf_if *ifp; +- u16 hash_idx; +-+ u8 ifidx; +- struct sk_buff *skb; +- +- ring = flow->rings[flowid]; +- if (!ring) +- return; +-+ +-+ ifidx = brcmf_flowring_ifidx_get(flow, flowid); +-+ ifp = brcmf_get_ifp(bus_if->drvr, ifidx); +-+ +- brcmf_flowring_block(flow, flowid, false); +- hash_idx = ring->hash_id; +- flow->hash[hash_idx].ifidx = BRCMF_FLOWRING_INVALID_IFIDX; +-@@ -249,7 +256,7 @@ void brcmf_flowring_delete(struct brcmf_ +- +- skb = skb_dequeue(&ring->skblist); +- while (skb) { +-- brcmu_pkt_buf_free_skb(skb); +-+ brcmf_txfinalize(ifp, skb, false); +- skb = skb_dequeue(&ring->skblist); +- } +- diff --git a/package/kernel/mac80211/patches/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/402-ath_regd_optional.patch index 7351353..4634283 100644 --- a/package/kernel/mac80211/patches/402-ath_regd_optional.patch @@ -13545,6 +22300,38 @@ index 06c731f..f8f555f 100644 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; +diff --git a/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch b/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch +deleted file mode 100644 +index e265354..0000000 +--- a/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch ++++ /dev/null +@@ -1,26 +0,0 @@ +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Subject: [PATCH] brcmfmac: add missing eth_type_trans call +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-There are 2 protocols supported by brcmfmac and msgbuf one was missing a +-proper skb setup before passing it to the netif. This was triggering +-"NULL pointer dereference". +- +-Fixes: 9c349892ccc9 ("brcmfmac: revise handling events in receive path") +-Signed-off-by: Rafał Miłecki +---- +- +---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +-+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +-@@ -1157,6 +1157,9 @@ brcmf_msgbuf_process_rx_complete(struct +- brcmu_pkt_buf_free_skb(skb); +- return; +- } +-+ +-+ skb->protocol = eth_type_trans(skb, ifp->ndev); +-+ +- brcmf_netif_rx(ifp, skb); +- } +- diff --git a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch new file mode 100644 index 0000000..ae571c9 @@ -13650,7 +22437,7 @@ index 0000000..ae571c9 + int brcmf_fw_get_firmwares(struct device *dev, u16 flags, diff --git a/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch deleted file mode 100644 -index 00181f6..0000000 +index f7f44f5..0000000 --- a/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch +++ /dev/null @@ -1,97 +0,0 @@ @@ -13669,8 +22456,8 @@ index 00181f6..0000000 - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -1332,6 +1332,7 @@ static int __init brcmfmac_module_init(v -- #endif +-@@ -1200,6 +1200,7 @@ int __init brcmf_core_init(void) +- { - if (!schedule_work(&brcmf_driver_work)) - return -EBUSY; -+ flush_work(&brcmf_driver_work); @@ -13842,7 +22629,7 @@ index 0000000..f301fe1 + diff --git a/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch deleted file mode 100644 -index 4295b4b..0000000 +index 1e440c0..0000000 --- a/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch +++ /dev/null @@ -1,50 +0,0 @@ @@ -13858,7 +22645,7 @@ index 4295b4b..0000000 - ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -615,9 +615,37 @@ static struct wireless_dev *brcmf_cfg802 +-@@ -651,9 +651,37 @@ static struct wireless_dev *brcmf_cfg802 - u32 *flags, - struct vif_params *params) - { @@ -13890,7 +22677,7 @@ index 4295b4b..0000000 -+ dev = dev_get_by_name(&init_net, name); -+ if (dev) { -+ dev_put(dev); --+ return ERR_PTR(-EEXIST); +-+ return ERR_PTR(-ENFILE); -+ } -+ - brcmf_dbg(TRACE, "enter: %s type %d\n", name, type); @@ -14074,14 +22861,14 @@ index e49dd48..bd851e6 100644 $(PKG_BUILD_DIR)/firmware/mt7662.bin \ $(1)/lib/firmware diff --git a/package/kernel/mwlwifi/Makefile b/package/kernel/mwlwifi/Makefile -index 091928d..b36486d 100644 +index f59943d..b36486d 100644 --- a/package/kernel/mwlwifi/Makefile +++ b/package/kernel/mwlwifi/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mwlwifi --PKG_VERSION:=10.3.0.16-20160105 +-PKG_VERSION:=10.3.0.18-20160804 +PKG_VERSION:=10.3.0.18-20160823-1 PKG_RELEASE=1 @@ -14090,7 +22877,7 @@ index 091928d..b36486d 100644 PKG_SOURCE_URL:=https://github.com/kaloz/mwlwifi PKG_SOURCE_PROTO:=git PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) --PKG_SOURCE_VERSION:=99d3879cc72f2a25d44fb4bee96fd84eca028b04 +-PKG_SOURCE_VERSION:=d48847cc83954930fdcd98818bbf33e75707b8e1 +PKG_SOURCE_VERSION:=af606563453c819fac156faf2b15b9caef844329 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz @@ -14104,129 +22891,6 @@ index 091928d..b36486d 100644 FILES:=$(PKG_BUILD_DIR)/mwlwifi.ko AUTOLOAD:=$(call AutoLoad,50,mac80211 mwlwifi) endef -diff --git a/package/kernel/mwlwifi/patches/100-drop_old_api.patch b/package/kernel/mwlwifi/patches/100-drop_old_api.patch -deleted file mode 100644 -index d2e149e..0000000 ---- a/package/kernel/mwlwifi/patches/100-drop_old_api.patch -+++ /dev/null -@@ -1,92 +0,0 @@ ----- a/main.c --+++ b/main.c --@@ -418,11 +418,7 @@ static void mwl_set_ht_caps(struct mwl_p -- band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_20; -- band->ht_cap.cap |= IEEE80211_HT_CAP_SGI_40; -- ---#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) --- hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION; ---#else -- ieee80211_hw_set(hw, AMPDU_AGGREGATION); ---#endif -- band->ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; -- band->ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_4; -- --@@ -524,29 +520,16 @@ static int mwl_wl_init(struct mwl_priv * -- hw->queues = SYSADPT_TX_WMM_QUEUES; -- -- /* Set rssi values to dBm */ ---#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) --- hw->flags |= IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_HAS_RATE_CONTROL; ---#else -- ieee80211_hw_set(hw, SIGNAL_DBM); -- ieee80211_hw_set(hw, HAS_RATE_CONTROL); ---#endif -- -- /* Ask mac80211 not to trigger PS mode -- * based on PM bit of incoming frames. -- */ ---#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) --- hw->flags |= IEEE80211_HW_AP_LINK_PS; ---#else -- ieee80211_hw_set(hw, AP_LINK_PS); ---#endif -- ---#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 0) --- hw->flags |= IEEE80211_HW_SUPPORTS_PER_STA_GTK | --- IEEE80211_HW_MFP_CAPABLE; ---#else -- ieee80211_hw_set(hw, SUPPORTS_PER_STA_GTK); -- ieee80211_hw_set(hw, MFP_CAPABLE); ---#endif -- -- hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; -- ----- a/dev.h --+++ b/dev.h --@@ -484,10 +484,6 @@ static inline struct mwl_sta *mwl_dev_ge -- return (struct mwl_sta *)&sta->drv_priv; -- } -- ---#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0) ---#define ether_addr_copy(dst, src) memcpy(dst, src, ETH_ALEN) ---#endif --- -- /* Defined in mac80211.c. */ -- extern const struct ieee80211_ops mwl_mac80211_ops; -- ----- a/mac80211.c --+++ b/mac80211.c --@@ -572,19 +572,11 @@ static int mwl_mac80211_get_survey(struc -- return 0; -- } -- ---#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0) ---static int mwl_mac80211_ampdu_action(struct ieee80211_hw *hw, --- struct ieee80211_vif *vif, --- enum ieee80211_ampdu_mlme_action action, --- struct ieee80211_sta *sta, --- u16 tid, u16 *ssn, u8 buf_size) ---#else -- static int mwl_mac80211_ampdu_action(struct ieee80211_hw *hw, -- struct ieee80211_vif *vif, -- enum ieee80211_ampdu_mlme_action action, -- struct ieee80211_sta *sta, -- u16 tid, u16 *ssn, u8 buf_size, bool amsdu) ---#endif -- { -- int rc = 0; -- struct mwl_priv *priv = hw->priv; ----- a/rx.c --+++ b/rx.c --@@ -232,10 +232,8 @@ static inline void mwl_rx_prepare_status -- status->flag |= RX_FLAG_VHT; -- if (bw == RX_RATE_INFO_HT40) -- status->flag |= RX_FLAG_40MHZ; ---#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 18, 0) -- if (bw == RX_RATE_INFO_HT80) -- status->vht_flag |= RX_VHT_FLAG_80MHZ; ---#endif -- if (gi == RX_RATE_INFO_SHORT_INTERVAL) -- status->flag |= RX_FLAG_SHORT_GI; -- status->vht_nss = (nss + 1); -diff --git a/package/kernel/mwlwifi/patches/110-api_sync.patch b/package/kernel/mwlwifi/patches/110-api_sync.patch -deleted file mode 100644 -index ed3e06a..0000000 ---- a/package/kernel/mwlwifi/patches/110-api_sync.patch -+++ /dev/null -@@ -1,19 +0,0 @@ ----- a/mac80211.c --+++ b/mac80211.c --@@ -597,10 +597,13 @@ static int mwl_mac80211_get_survey(struc -- -- static int mwl_mac80211_ampdu_action(struct ieee80211_hw *hw, -- struct ieee80211_vif *vif, --- enum ieee80211_ampdu_mlme_action action, --- struct ieee80211_sta *sta, --- u16 tid, u16 *ssn, u8 buf_size, bool amsdu) --+ struct ieee80211_ampdu_params *params) -- { --+ enum ieee80211_ampdu_mlme_action action = params->action; --+ struct ieee80211_sta *sta = params->sta; --+ u16 tid = params->tid; --+ u16 *ssn = ¶ms->ssn; --+ u8 buf_size = params->buf_size; -- int rc = 0; -- struct mwl_priv *priv = hw->priv; -- struct mwl_ampdu_stream *stream; diff --git a/package/network/services/hostapd/Config.in b/package/network/services/hostapd/Config.in index aee2a15..645888e 100644 --- a/package/network/services/hostapd/Config.in @@ -16525,6 +25189,60 @@ index 3088f6a..0000000 --- -1.9.1 - +diff --git a/package/network/services/hostapd/patches/014-nl80211-Try-running-without-mgmt-frame-subscription-.patch b/package/network/services/hostapd/patches/014-nl80211-Try-running-without-mgmt-frame-subscription-.patch +deleted file mode 100644 +index 25ba87d..0000000 +--- a/package/network/services/hostapd/patches/014-nl80211-Try-running-without-mgmt-frame-subscription-.patch ++++ /dev/null +@@ -1,48 +0,0 @@ +-From f4830bed661f4adff51f50a0d37c64ceb748e780 Mon Sep 17 00:00:00 2001 +-From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +-Date: Mon, 25 Apr 2016 17:10:47 +0200 +-Subject: [PATCH] nl80211: Try running without mgmt frame subscription (driver +- AP SME) +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-One of supported code paths already allows this scenario. It is used if +-driver doesn't report NL80211_ATTR_DEVICE_AP_SME and doesn't support +-monitor interface. In such situation: +-1) We don't quit if subscribing for WLAN_FC_STYPE_PROBE_REQ fails +-2) We don't try subscribing for WLAN_FC_STYPE_ACTION +-3) We fallback to AP SME mode after failing to create monitor interface +-4) We don't quit if subscribing for WLAN_FC_STYPE_PROBE_REQ fails +-Above scenario is used, e.g., with brcmfmac. As you can see - thanks to +-events provided by cfg80211 - it's not really required to receive Probe +-Request or action frames. +- +-However, the previous implementation did not allow using hostapd with +-drivers that: +-1) Report NL80211_ATTR_DEVICE_AP_SME +-2) Don't support subscribing for PROBE_REQ and/or ACTION frames +-In case of using such a driver hostapd will cancel setup after failing +-to subscribe for WLAN_FC_STYPE_ACTION. I noticed it after setting flag +-WIPHY_FLAG_HAVE_AP_SME in brcmfmac driver for my experiments. +- +-This patch allows working with such drivers with just a small warning +-printed as debug message. +- +-Signed-off-by: Rafał Miłecki +---- +- src/drivers/driver_nl80211.c | 3 ++- +- 1 file changed, 2 insertions(+), 1 deletion(-) +- +---- a/src/drivers/driver_nl80211.c +-+++ b/src/drivers/driver_nl80211.c +-@@ -4108,7 +4108,8 @@ static int nl80211_setup_ap(struct i802_ +- +- if (drv->device_ap_sme && !drv->use_monitor) +- if (nl80211_mgmt_subscribe_ap_dev_sme(bss)) +-- return -1; +-+ wpa_printf(MSG_DEBUG, +-+ "nl80211: Failed to subscribe for mgmt frames from SME driver - trying to run without it"); +- +- if (!drv->device_ap_sme && drv->use_monitor && +- nl80211_create_monitor_interface(drv) && diff --git a/package/network/services/hostapd/patches/100-mesh_mode_fix.patch b/package/network/services/hostapd/patches/100-mesh_mode_fix.patch new file mode 100644 index 0000000..ceb4c53 diff --git a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch index 08240588..20832071 100644 --- a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch +++ b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch @@ -5,7 +5,7 @@ Subject: fix UBNT XM model detection Signed-off-by: Neal Oakey diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index dab4d2c..e7b3cd2 100755 +index 2f4b112..b220aad 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -64,6 +64,40 @@ wndr3700_board_detect() { @@ -64,7 +64,7 @@ index dab4d2c..e7b3cd2 100755 ;; *"Nanostation M XW") name="nanostation-m-xw" -@@ -667,6 +703,7 @@ ar71xx_board_detect() { +@@ -682,6 +718,7 @@ ar71xx_board_detect() { ;; *"Rocket M") name="rocket-m" diff --git a/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch b/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch index 77b47675..ce3fe9c7 100644 --- a/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch +++ b/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch @@ -10,7 +10,7 @@ Signed-off-by: Matthias Schiffer Backport of r49105 diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index d025632..c5c1871 100755 +index bf53169..ccccc17 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -66,6 +66,10 @@ tplink_get_image_hwid() { @@ -24,7 +24,7 @@ index d025632..c5c1871 100755 tplink_get_image_boot_size() { get_image "$@" | dd bs=4 count=1 skip=37 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' } -@@ -366,13 +370,17 @@ platform_check_image() { +@@ -371,13 +375,17 @@ platform_check_image() { } local hwid diff --git a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch index 70b3a004..23e69b37 100644 --- a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch +++ b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch @@ -11,7 +11,7 @@ Signed-off-by: Matthias Schiffer Backport of r49106 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index e7b3cd2..180a075 100755 +index b220aad..395a012 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -133,7 +133,7 @@ tplink_board_detect() { diff --git a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch index 9330e547..b7e98439 100644 --- a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch +++ b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch @@ -12,7 +12,7 @@ Signed-off-by: Matthias Schiffer Backport of r49107 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 180a075..ddd6611 100755 +index 395a012..131364c 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -162,6 +162,10 @@ tplink_board_detect() { diff --git a/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch b/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch index 5a225d7d..43e26317 100644 --- a/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch +++ b/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch @@ -11,7 +11,7 @@ Signed off by: Norbert Wegener Backport of r47849 diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 9a7acbd..d42ceef 100644 +index 8551399..7184966 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -476,6 +476,15 @@ define Device/tl-wr710n-v2 diff --git a/patches/openwrt/0035-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch b/patches/openwrt/0032-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch similarity index 100% rename from patches/openwrt/0035-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch rename to patches/openwrt/0032-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch diff --git a/patches/openwrt/0032-tools-pkg-config-fix-build-with-GCC-6.patch b/patches/openwrt/0032-tools-pkg-config-fix-build-with-GCC-6.patch deleted file mode 100644 index 840b8b60..00000000 --- a/patches/openwrt/0032-tools-pkg-config-fix-build-with-GCC-6.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Matthias Schiffer -Date: Sun, 8 May 2016 15:53:14 +0200 -Subject: tools: pkg-config: fix build with GCC 6 - -Fixes the following error: - -gdate.c: In function ‘g_date_strftime’: -gdate.c:2497:7: error: format not a string literal, format string not checked [-Werror=format-nonliteral] - tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm); - ^~~~~~ - -Signed-off-by: Matthias Schiffer - -diff --git a/tools/pkg-config/patches/001-glib-gdate-suppress-string-format-literal-warning.patch b/tools/pkg-config/patches/001-glib-gdate-suppress-string-format-literal-warning.patch -new file mode 100644 -index 0000000..6849299 ---- /dev/null -+++ b/tools/pkg-config/patches/001-glib-gdate-suppress-string-format-literal-warning.patch -@@ -0,0 +1,18 @@ -+--- a/glib/glib/gdate.c -++++ b/glib/glib/gdate.c -+@@ -2439,6 +2439,9 @@ win32_strftime_helper (const GDate *d, -+ * -+ * Returns: number of characters written to the buffer, or 0 the buffer was too small -+ */ -++#pragma GCC diagnostic push -++#pragma GCC diagnostic ignored "-Wformat-nonliteral" -++ -+ gsize -+ g_date_strftime (gchar *s, -+ gsize slen, -+@@ -2549,3 +2552,5 @@ g_date_strftime (gchar *s, -+ return retval; -+ #endif -+ } -++ -++#pragma GCC diagnostic pop diff --git a/patches/openwrt/0036-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch b/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch similarity index 100% rename from patches/openwrt/0036-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch rename to patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch diff --git a/patches/openwrt/0033-tools-mkimage-sync-include-linux-compiler-.h-with-u-boot-master.patch b/patches/openwrt/0033-tools-mkimage-sync-include-linux-compiler-.h-with-u-boot-master.patch deleted file mode 100644 index edca566c..00000000 --- a/patches/openwrt/0033-tools-mkimage-sync-include-linux-compiler-.h-with-u-boot-master.patch +++ /dev/null @@ -1,815 +0,0 @@ -From: Matthias Schiffer -Date: Sun, 8 May 2016 22:06:51 +0200 -Subject: tools: mkimage: sync include/linux/compiler*.h with u-boot master - -Fixes build with GCC 6. - -Signed-off-by: Matthias Schiffer - -diff --git a/tools/mkimage/patches/200-compiler-support.patch b/tools/mkimage/patches/200-compiler-support.patch -new file mode 100644 -index 0000000..ca9c5b5 ---- /dev/null -+++ b/tools/mkimage/patches/200-compiler-support.patch -@@ -0,0 +1,702 @@ -+diff --git b/include/linux/compiler-gcc.h a/include/linux/compiler-gcc.h -+index e057bd2..22ab246 100644 -+--- b/include/linux/compiler-gcc.h -++++ a/include/linux/compiler-gcc.h -+@@ -5,14 +5,28 @@ -+ /* -+ * Common definitions for all gcc versions go here. -+ */ -+-#define GCC_VERSION (__GNUC__ * 10000 \ -+- + __GNUC_MINOR__ * 100 \ -+- + __GNUC_PATCHLEVEL__) -+- -++#define GCC_VERSION (__GNUC__ * 10000 \ -++ + __GNUC_MINOR__ * 100 \ -++ + __GNUC_PATCHLEVEL__) -+ -+ /* Optimization barrier */ -++ -+ /* The "volatile" is due to gcc bugs */ -+ #define barrier() __asm__ __volatile__("": : :"memory") -++/* -++ * This version is i.e. to prevent dead stores elimination on @ptr -++ * where gcc and llvm may behave differently when otherwise using -++ * normal barrier(): while gcc behavior gets along with a normal -++ * barrier(), llvm needs an explicit input variable to be assumed -++ * clobbered. The issue is as follows: while the inline asm might -++ * access any memory it wants, the compiler could have fit all of -++ * @ptr into memory registers instead, and since @ptr never escaped -++ * from that, it proofed that the inline asm wasn't touching any of -++ * it. This version works well with both compilers, i.e. we're telling -++ * the compiler that the inline asm absolutely may see the contents -++ * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495 -++ */ -++#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory") -+ -+ /* -+ * This macro obfuscates arithmetic on a variable address so that gcc -+@@ -32,58 +46,63 @@ -+ * the inline assembly constraint from =g to =r, in this particular -+ * case either is valid. -+ */ -+-#define RELOC_HIDE(ptr, off) \ -+- ({ unsigned long __ptr; \ -+- __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ -+- (typeof(ptr)) (__ptr + (off)); }) -++#define RELOC_HIDE(ptr, off) \ -++({ \ -++ unsigned long __ptr; \ -++ __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ -++ (typeof(ptr)) (__ptr + (off)); \ -++}) -+ -+ /* Make the optimizer believe the variable can be manipulated arbitrarily. */ -+-#define OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "=r" (var) : "0" (var)) -++#define OPTIMIZER_HIDE_VAR(var) \ -++ __asm__ ("" : "=r" (var) : "0" (var)) -+ -+ #ifdef __CHECKER__ -+-#define __must_be_array(arr) 0 -++#define __must_be_array(a) 0 -+ #else -+ /* &a[0] degrades to a pointer: a different type from an array */ -+-#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) -++#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) -+ #endif -+ -+ /* -+ * Force always-inline if the user requests it so via the .config, -+ * or if gcc is too old: -+ */ -+-#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ -++#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ -+ !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) -+-# define inline inline __attribute__((always_inline)) notrace -+-# define __inline__ __inline__ __attribute__((always_inline)) notrace -+-# define __inline __inline __attribute__((always_inline)) notrace -++#define inline inline __attribute__((always_inline)) notrace -++#define __inline__ __inline__ __attribute__((always_inline)) notrace -++#define __inline __inline __attribute__((always_inline)) notrace -+ #else -+ /* A lot of inline functions can cause havoc with function tracing */ -+-# define inline inline notrace -+-# define __inline__ __inline__ notrace -+-# define __inline __inline notrace -++#define inline inline notrace -++#define __inline__ __inline__ notrace -++#define __inline __inline notrace -+ #endif -+ -+-#define __deprecated __attribute__((deprecated)) -+-#ifndef __packed -+-#define __packed __attribute__((packed)) -+-#endif -+-#ifndef __weak -+-#define __weak __attribute__((weak)) -+-#endif -++#define __always_inline inline __attribute__((always_inline)) -++#define noinline __attribute__((noinline)) -++ -++#define __deprecated __attribute__((deprecated)) -++#define __packed __attribute__((packed)) -++#define __weak __attribute__((weak)) -++#define __alias(symbol) __attribute__((alias(#symbol))) -+ -+ /* -+- * it doesn't make sense on ARM (currently the only user of __naked) to trace -+- * naked functions because then mcount is called without stack and frame pointer -+- * being set up and there is no chance to restore the lr register to the value -+- * before mcount was called. -++ * it doesn't make sense on ARM (currently the only user of __naked) -++ * to trace naked functions because then mcount is called without -++ * stack and frame pointer being set up and there is no chance to -++ * restore the lr register to the value before mcount was called. -++ * -++ * The asm() bodies of naked functions often depend on standard calling -++ * conventions, therefore they must be noinline and noclone. -+ * -+- * The asm() bodies of naked functions often depend on standard calling conventions, -+- * therefore they must be noinline and noclone. GCC 4.[56] currently fail to enforce -+- * this, so we must do so ourselves. See GCC PR44290. -++ * GCC 4.[56] currently fail to enforce this, so we must do so ourselves. -++ * See GCC PR44290. -+ */ -+-#define __naked __attribute__((naked)) noinline __noclone notrace -++#define __naked __attribute__((naked)) noinline __noclone notrace -+ -+-#define __noreturn __attribute__((noreturn)) -++#define __noreturn __attribute__((noreturn)) -+ -+ /* -+ * From the GCC manual: -+@@ -95,34 +114,170 @@ -+ * would be. -+ * [...] -+ */ -+-#ifndef __pure -+-#define __pure __attribute__((pure)) -++#define __pure __attribute__((pure)) -++#define __aligned(x) __attribute__((aligned(x))) -++#define __printf(a, b) __attribute__((format(printf, a, b))) -++#define __scanf(a, b) __attribute__((format(scanf, a, b))) -++#define __attribute_const__ __attribute__((__const__)) -++#define __maybe_unused __attribute__((unused)) -++#define __always_unused __attribute__((unused)) -++ -++/* gcc version specific checks */ -++ -++#if GCC_VERSION < 30200 -++# error Sorry, your compiler is too old - please upgrade it. -++#endif -++ -++#if GCC_VERSION < 30300 -++# define __used __attribute__((__unused__)) -++#else -++# define __used __attribute__((__used__)) -++#endif -++ -++#ifdef CONFIG_GCOV_KERNEL -++# if GCC_VERSION < 30400 -++# error "GCOV profiling support for gcc versions below 3.4 not included" -++# endif /* __GNUC_MINOR__ */ -++#endif /* CONFIG_GCOV_KERNEL */ -++ -++#if GCC_VERSION >= 30400 -++#define __must_check __attribute__((warn_unused_result)) -++#endif -++ -++#if GCC_VERSION >= 40000 -++ -++/* GCC 4.1.[01] miscompiles __weak */ -++#ifdef __KERNEL__ -++# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101 -++# error Your version of gcc miscompiles the __weak directive -++# endif -++#endif -++ -++#define __used __attribute__((__used__)) -++#define __compiler_offsetof(a, b) \ -++ __builtin_offsetof(a, b) -++ -++#if GCC_VERSION >= 40100 && GCC_VERSION < 40600 -++# define __compiletime_object_size(obj) __builtin_object_size(obj, 0) -++#endif -++ -++#if GCC_VERSION >= 40300 -++/* Mark functions as cold. gcc will assume any path leading to a call -++ * to them will be unlikely. This means a lot of manual unlikely()s -++ * are unnecessary now for any paths leading to the usual suspects -++ * like BUG(), printk(), panic() etc. [but let's keep them for now for -++ * older compilers] -++ * -++ * Early snapshots of gcc 4.3 don't support this and we can't detect this -++ * in the preprocessor, but we can live with this because they're unreleased. -++ * Maketime probing would be overkill here. -++ * -++ * gcc also has a __attribute__((__hot__)) to move hot functions into -++ * a special section, but I don't see any sense in this right now in -++ * the kernel context -++ */ -++#define __cold __attribute__((__cold__)) -++ -++#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) -++ -++#ifndef __CHECKER__ -++# define __compiletime_warning(message) __attribute__((warning(message))) -++# define __compiletime_error(message) __attribute__((error(message))) -++#endif /* __CHECKER__ */ -++#endif /* GCC_VERSION >= 40300 */ -++ -++#if GCC_VERSION >= 40500 -++/* -++ * Mark a position in code as unreachable. This can be used to -++ * suppress control flow warnings after asm blocks that transfer -++ * control elsewhere. -++ * -++ * Early snapshots of gcc 4.5 don't support this and we can't detect -++ * this in the preprocessor, but we can live with this because they're -++ * unreleased. Really, we need to have autoconf for the kernel. -++ */ -++#define unreachable() __builtin_unreachable() -++ -++/* Mark a function definition as prohibited from being cloned. */ -++#define __noclone __attribute__((__noclone__)) -++ -++#endif /* GCC_VERSION >= 40500 */ -++ -++#if GCC_VERSION >= 40600 -++/* -++ * When used with Link Time Optimization, gcc can optimize away C functions or -++ * variables which are referenced only from assembly code. __visible tells the -++ * optimizer that something else uses this function or variable, thus preventing -++ * this. -++ */ -++#define __visible __attribute__((externally_visible)) -+ #endif -+-#ifndef __aligned -+-#define __aligned(x) __attribute__((aligned(x))) -++ -++ -++#if GCC_VERSION >= 40900 && !defined(__CHECKER__) -++/* -++ * __assume_aligned(n, k): Tell the optimizer that the returned -++ * pointer can be assumed to be k modulo n. The second argument is -++ * optional (default 0), so we use a variadic macro to make the -++ * shorthand. -++ * -++ * Beware: Do not apply this to functions which may return -++ * ERR_PTRs. Also, it is probably unwise to apply it to functions -++ * returning extra information in the low bits (but in that case the -++ * compiler should see some alignment anyway, when the return value is -++ * massaged by 'flags = ptr & 3; ptr &= ~3;'). -++ */ -++#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__))) -+ #endif -+-#define __printf(a, b) __attribute__((format(printf, a, b))) -+-#define __scanf(a, b) __attribute__((format(scanf, a, b))) -+-#define noinline __attribute__((noinline)) -+-#define __attribute_const__ __attribute__((__const__)) -+-#define __maybe_unused __attribute__((unused)) -+-#define __always_unused __attribute__((unused)) -+ -+-#define __gcc_header(x) #x -+-#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) -+-#define gcc_header(x) _gcc_header(x) -+-#include gcc_header(__GNUC__) -++/* -++ * GCC 'asm goto' miscompiles certain code sequences: -++ * -++ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 -++ * -++ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. -++ * -++ * (asm goto is automatically volatile - the naming reflects this.) -++ */ -++#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) -++ -++#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP -++#if GCC_VERSION >= 40400 -++#define __HAVE_BUILTIN_BSWAP32__ -++#define __HAVE_BUILTIN_BSWAP64__ -++#endif -++#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600) -++#define __HAVE_BUILTIN_BSWAP16__ -++#endif -++#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ -++ -++#if GCC_VERSION >= 50000 -++#define KASAN_ABI_VERSION 4 -++#elif GCC_VERSION >= 40902 -++#define KASAN_ABI_VERSION 3 -++#endif -++ -++#if GCC_VERSION >= 40902 -++/* -++ * Tell the compiler that address safety instrumentation (KASAN) -++ * should not be applied to that function. -++ * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 -++ */ -++#define __no_sanitize_address __attribute__((no_sanitize_address)) -++#endif -++ -++#endif /* gcc version >= 40000 specific checks */ -+ -+ #if !defined(__noclone) -+ #define __noclone /* not needed */ -+ #endif -+ -++#if !defined(__no_sanitize_address) -++#define __no_sanitize_address -++#endif -++ -+ /* -+ * A trick to suppress uninitialized variable warning without generating any -+ * code -+ */ -+ #define uninitialized_var(x) x = x -+- -+-#ifndef __always_inline -+-#define __always_inline inline __attribute__((always_inline)) -+-#endif -+diff --git b/include/linux/compiler-gcc3.h a/include/linux/compiler-gcc3.h -+deleted file mode 100644 -+index 7d89feb..0000000 -+--- b/include/linux/compiler-gcc3.h -++++ /dev/null -+@@ -1,23 +0,0 @@ -+-#ifndef __LINUX_COMPILER_H -+-#error "Please don't include directly, include instead." -+-#endif -+- -+-#if GCC_VERSION < 30200 -+-# error Sorry, your compiler is too old - please upgrade it. -+-#endif -+- -+-#if GCC_VERSION >= 30300 -+-# define __used __attribute__((__used__)) -+-#else -+-# define __used __attribute__((__unused__)) -+-#endif -+- -+-#if GCC_VERSION >= 30400 -+-#define __must_check __attribute__((warn_unused_result)) -+-#endif -+- -+-#ifdef CONFIG_GCOV_KERNEL -+-# if GCC_VERSION < 30400 -+-# error "GCOV profiling support for gcc versions below 3.4 not included" -+-# endif /* __GNUC_MINOR__ */ -+-#endif /* CONFIG_GCOV_KERNEL */ -+diff --git b/include/linux/compiler-gcc4.h a/include/linux/compiler-gcc4.h -+deleted file mode 100644 -+index c982a09..0000000 -+--- b/include/linux/compiler-gcc4.h -++++ /dev/null -+@@ -1,81 +0,0 @@ -+-#ifndef __LINUX_COMPILER_H -+-#error "Please don't include directly, include instead." -+-#endif -+- -+-#define __used __attribute__((__used__)) -+-#define __must_check __attribute__((warn_unused_result)) -+-#define __compiler_offsetof(a,b) __builtin_offsetof(a,b) -+- -+-#if GCC_VERSION >= 40100 && GCC_VERSION < 40600 -+-# define __compiletime_object_size(obj) __builtin_object_size(obj, 0) -+-#endif -+- -+-#if GCC_VERSION >= 40300 -+-/* Mark functions as cold. gcc will assume any path leading to a call -+- to them will be unlikely. This means a lot of manual unlikely()s -+- are unnecessary now for any paths leading to the usual suspects -+- like BUG(), printk(), panic() etc. [but let's keep them for now for -+- older compilers] -+- -+- Early snapshots of gcc 4.3 don't support this and we can't detect this -+- in the preprocessor, but we can live with this because they're unreleased. -+- Maketime probing would be overkill here. -+- -+- gcc also has a __attribute__((__hot__)) to move hot functions into -+- a special section, but I don't see any sense in this right now in -+- the kernel context */ -+-#define __cold __attribute__((__cold__)) -+- -+-#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) -+- -+-#ifndef __CHECKER__ -+-# define __compiletime_warning(message) __attribute__((warning(message))) -+-# define __compiletime_error(message) __attribute__((error(message))) -+-#endif /* __CHECKER__ */ -+-#endif /* GCC_VERSION >= 40300 */ -+- -+-#if GCC_VERSION >= 40500 -+-/* -+- * Mark a position in code as unreachable. This can be used to -+- * suppress control flow warnings after asm blocks that transfer -+- * control elsewhere. -+- * -+- * Early snapshots of gcc 4.5 don't support this and we can't detect -+- * this in the preprocessor, but we can live with this because they're -+- * unreleased. Really, we need to have autoconf for the kernel. -+- */ -+-#define unreachable() __builtin_unreachable() -+- -+-/* Mark a function definition as prohibited from being cloned. */ -+-#define __noclone __attribute__((__noclone__)) -+- -+-#endif /* GCC_VERSION >= 40500 */ -+- -+-#if GCC_VERSION >= 40600 -+-/* -+- * Tell the optimizer that something else uses this function or variable. -+- */ -+-#define __visible __attribute__((externally_visible)) -+-#endif -+- -+-/* -+- * GCC 'asm goto' miscompiles certain code sequences: -+- * -+- * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 -+- * -+- * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. -+- * Fixed in GCC 4.8.2 and later versions. -+- * -+- * (asm goto is automatically volatile - the naming reflects this.) -+- */ -+-#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) -+- -+-#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP -+-#if GCC_VERSION >= 40400 -+-#define __HAVE_BUILTIN_BSWAP32__ -+-#define __HAVE_BUILTIN_BSWAP64__ -+-#endif -+-#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600) -+-#define __HAVE_BUILTIN_BSWAP16__ -+-#endif -+-#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ -+diff --git b/include/linux/compiler-intel.h a/include/linux/compiler-intel.h -+index ba147a1..d4c7113 100644 -+--- b/include/linux/compiler-intel.h -++++ a/include/linux/compiler-intel.h -+@@ -13,9 +13,14 @@ -+ /* Intel ECC compiler doesn't support gcc specific asm stmts. -+ * It uses intrinsics to do the equivalent things. -+ */ -++#undef barrier -++#undef barrier_data -+ #undef RELOC_HIDE -+ #undef OPTIMIZER_HIDE_VAR -+ -++#define barrier() __memory_barrier() -++#define barrier_data(ptr) barrier() -++ -+ #define RELOC_HIDE(ptr, off) \ -+ ({ unsigned long __ptr; \ -+ __ptr = (unsigned long) (ptr); \ -+diff --git b/include/linux/compiler.h a/include/linux/compiler.h -+index d5ad7b1..020ad16 100644 -+--- b/include/linux/compiler.h -++++ a/include/linux/compiler.h -+@@ -17,6 +17,7 @@ -+ # define __release(x) __context__(x,-1) -+ # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) -+ # define __percpu __attribute__((noderef, address_space(3))) -++# define __pmem __attribute__((noderef, address_space(5))) -+ #ifdef CONFIG_SPARSE_RCU_POINTER -+ # define __rcu __attribute__((noderef, address_space(4))) -+ #else -+@@ -42,6 +43,7 @@ extern void __chk_io_ptr(const volatile void __iomem *); -+ # define __cond_lock(x,c) (c) -+ # define __percpu -+ # define __rcu -++# define __pmem -+ #endif -+ -+ /* Indirect macros required for expanded argument pasting, eg. __LINE__. */ -+@@ -54,7 +56,11 @@ extern void __chk_io_ptr(const volatile void __iomem *); -+ #include -+ #endif -+ -++#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__) -++#define notrace __attribute__((hotpatch(0,0))) -++#else -+ #define notrace __attribute__((no_instrument_function)) -++#endif -+ -+ /* Intel compiler defines __GNUC__. So we will overwrite implementations -+ * coming from above header files here -+@@ -138,7 +144,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); -+ */ -+ #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) ) -+ #define __trace_if(cond) \ -+- if (__builtin_constant_p((cond)) ? !!(cond) : \ -++ if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ -+ ({ \ -+ int ______r; \ -+ static struct ftrace_branch_data \ -+@@ -165,6 +171,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); -+ # define barrier() __memory_barrier() -+ #endif -+ -++#ifndef barrier_data -++# define barrier_data(ptr) barrier() -++#endif -++ -+ /* Unreachable code */ -+ #ifndef unreachable -+ # define unreachable() do { } while (1) -+@@ -186,6 +196,126 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); -+ # define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__) -+ #endif -+ -++#include -++ -++#define __READ_ONCE_SIZE \ -++({ \ -++ switch (size) { \ -++ case 1: *(__u8 *)res = *(volatile __u8 *)p; break; \ -++ case 2: *(__u16 *)res = *(volatile __u16 *)p; break; \ -++ case 4: *(__u32 *)res = *(volatile __u32 *)p; break; \ -++ case 8: *(__u64 *)res = *(volatile __u64 *)p; break; \ -++ default: \ -++ barrier(); \ -++ __builtin_memcpy((void *)res, (const void *)p, size); \ -++ barrier(); \ -++ } \ -++}) -++ -++static __always_inline -++void __read_once_size(const volatile void *p, void *res, int size) -++{ -++ __READ_ONCE_SIZE; -++} -++ -++#ifdef CONFIG_KASAN -++/* -++ * This function is not 'inline' because __no_sanitize_address confilcts -++ * with inlining. Attempt to inline it may cause a build failure. -++ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 -++ * '__maybe_unused' allows us to avoid defined-but-not-used warnings. -++ */ -++static __no_sanitize_address __maybe_unused -++void __read_once_size_nocheck(const volatile void *p, void *res, int size) -++{ -++ __READ_ONCE_SIZE; -++} -++#else -++static __always_inline -++void __read_once_size_nocheck(const volatile void *p, void *res, int size) -++{ -++ __READ_ONCE_SIZE; -++} -++#endif -++ -++static __always_inline void __write_once_size(volatile void *p, void *res, int size) -++{ -++ switch (size) { -++ case 1: *(volatile __u8 *)p = *(__u8 *)res; break; -++ case 2: *(volatile __u16 *)p = *(__u16 *)res; break; -++ case 4: *(volatile __u32 *)p = *(__u32 *)res; break; -++ case 8: *(volatile __u64 *)p = *(__u64 *)res; break; -++ default: -++ barrier(); -++ __builtin_memcpy((void *)p, (const void *)res, size); -++ barrier(); -++ } -++} -++ -++/* -++ * Prevent the compiler from merging or refetching reads or writes. The -++ * compiler is also forbidden from reordering successive instances of -++ * READ_ONCE, WRITE_ONCE and ACCESS_ONCE (see below), but only when the -++ * compiler is aware of some particular ordering. One way to make the -++ * compiler aware of ordering is to put the two invocations of READ_ONCE, -++ * WRITE_ONCE or ACCESS_ONCE() in different C statements. -++ * -++ * In contrast to ACCESS_ONCE these two macros will also work on aggregate -++ * data types like structs or unions. If the size of the accessed data -++ * type exceeds the word size of the machine (e.g., 32 bits or 64 bits) -++ * READ_ONCE() and WRITE_ONCE() will fall back to memcpy and print a -++ * compile-time warning. -++ * -++ * Their two major use cases are: (1) Mediating communication between -++ * process-level code and irq/NMI handlers, all running on the same CPU, -++ * and (2) Ensuring that the compiler does not fold, spindle, or otherwise -++ * mutilate accesses that either do not require ordering or that interact -++ * with an explicit memory barrier or atomic instruction that provides the -++ * required ordering. -++ */ -++ -++#define __READ_ONCE(x, check) \ -++({ \ -++ union { typeof(x) __val; char __c[1]; } __u; \ -++ if (check) \ -++ __read_once_size(&(x), __u.__c, sizeof(x)); \ -++ else \ -++ __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ -++ __u.__val; \ -++}) -++#define READ_ONCE(x) __READ_ONCE(x, 1) -++ -++/* -++ * Use READ_ONCE_NOCHECK() instead of READ_ONCE() if you need -++ * to hide memory access from KASAN. -++ */ -++#define READ_ONCE_NOCHECK(x) __READ_ONCE(x, 0) -++ -++#define WRITE_ONCE(x, val) \ -++({ \ -++ union { typeof(x) __val; char __c[1]; } __u = \ -++ { .__val = (__force typeof(x)) (val) }; \ -++ __write_once_size(&(x), __u.__c, sizeof(x)); \ -++ __u.__val; \ -++}) -++ -++/** -++ * smp_cond_acquire() - Spin wait for cond with ACQUIRE ordering -++ * @cond: boolean expression to wait for -++ * -++ * Equivalent to using smp_load_acquire() on the condition variable but employs -++ * the control dependency of the wait to reduce the barrier on many platforms. -++ * -++ * The control dependency provides a LOAD->STORE order, the additional RMB -++ * provides LOAD->LOAD order, together they provide LOAD->{LOAD,STORE} order, -++ * aka. ACQUIRE. -++ */ -++#define smp_cond_acquire(cond) do { \ -++ while (!(cond)) \ -++ cpu_relax(); \ -++ smp_rmb(); /* ctrl + rmb := acquire */ \ -++} while (0) -++ -+ #endif /* __KERNEL__ */ -+ -+ #endif /* __ASSEMBLY__ */ -+@@ -304,6 +434,14 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); -+ #define __visible -+ #endif -+ -++/* -++ * Assume alignment of return value. -++ */ -++#ifndef __assume_aligned -++#define __assume_aligned(a, ...) -++#endif -++ -++ -+ /* Are two types/vars the same type (ignoring qualifiers)? */ -+ #ifndef __same_type -+ # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) -+@@ -311,7 +449,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); -+ -+ /* Is this type a native word size -- useful for atomic operations */ -+ #ifndef __native_word -+-# define __native_word(t) (sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) -++# define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) -+ #endif -+ -+ /* Compile time object size, -1 for unknown */ -+@@ -373,12 +511,38 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); -+ * to make the compiler aware of ordering is to put the two invocations of -+ * ACCESS_ONCE() in different C statements. -+ * -+- * This macro does absolutely -nothing- to prevent the CPU from reordering, -+- * merging, or refetching absolutely anything at any time. Its main intended -+- * use is to mediate communication between process-level code and irq/NMI -+- * handlers, all running on the same CPU. -++ * ACCESS_ONCE will only work on scalar types. For union types, ACCESS_ONCE -++ * on a union member will work as long as the size of the member matches the -++ * size of the union and the size is smaller than word size. -++ * -++ * The major use cases of ACCESS_ONCE used to be (1) Mediating communication -++ * between process-level code and irq/NMI handlers, all running on the same CPU, -++ * and (2) Ensuring that the compiler does not fold, spindle, or otherwise -++ * mutilate accesses that either do not require ordering or that interact -++ * with an explicit memory barrier or atomic instruction that provides the -++ * required ordering. -++ * -++ * If possible use READ_ONCE()/WRITE_ONCE() instead. -++ */ -++#define __ACCESS_ONCE(x) ({ \ -++ __maybe_unused typeof(x) __var = (__force typeof(x)) 0; \ -++ (volatile typeof(x) *)&(x); }) -++#define ACCESS_ONCE(x) (*__ACCESS_ONCE(x)) -++ -++/** -++ * lockless_dereference() - safely load a pointer for later dereference -++ * @p: The pointer to load -++ * -++ * Similar to rcu_dereference(), but for situations where the pointed-to -++ * object's lifetime is managed by something other than RCU. That -++ * "something other" might be reference counting or simple immortality. -+ */ -+-#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) -++#define lockless_dereference(p) \ -++({ \ -++ typeof(p) _________p1 = READ_ONCE(p); \ -++ smp_read_barrier_depends(); /* Dependency order vs. p above. */ \ -++ (_________p1); \ -++}) -+ -+ /* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */ -+ #ifdef CONFIG_KPROBES -diff --git a/tools/mkimage/patches/200-gcc5_compat.patch b/tools/mkimage/patches/200-gcc5_compat.patch -deleted file mode 100644 -index 4d55f00..0000000 ---- a/tools/mkimage/patches/200-gcc5_compat.patch -+++ /dev/null -@@ -1,93 +0,0 @@ --From 478b02f1a7043b673565075ea5016376f3293b23 Mon Sep 17 00:00:00 2001 --From: Hans de Goede --Date: Sat, 7 Feb 2015 22:52:40 +0100 --Subject: [PATCH] Add linux/compiler-gcc5.h to fix builds with gcc5 -- --Add linux/compiler-gcc5/h from the kernel sources at: -- --commit 5631b8fba640a4ab2f8a954f63a603fa34eda96b --Author: Steven Noonan --Date: Sat Oct 25 15:09:42 2014 -0700 -- -- compiler/gcc4+: Remove inaccurate comment about 'asm goto' miscompiles -- --Signed-off-by: Hans de Goede ----- -- include/linux/compiler-gcc5.h | 65 +++++++++++++++++++++++++++++++++++++++++ -- 1 file changed, 65 insertions(+) -- create mode 100644 include/linux/compiler-gcc5.h -- --diff --git a/include/linux/compiler-gcc5.h b/include/linux/compiler-gcc5.h --new file mode 100644 --index 0000000..c8c5659 ----- /dev/null --+++ b/include/linux/compiler-gcc5.h --@@ -0,0 +1,65 @@ --+#ifndef __LINUX_COMPILER_H --+#error "Please don't include directly, include instead." --+#endif --+ --+#define __used __attribute__((__used__)) --+#define __must_check __attribute__((warn_unused_result)) --+#define __compiler_offsetof(a, b) __builtin_offsetof(a, b) --+ --+/* Mark functions as cold. gcc will assume any path leading to a call --+ to them will be unlikely. This means a lot of manual unlikely()s --+ are unnecessary now for any paths leading to the usual suspects --+ like BUG(), printk(), panic() etc. [but let's keep them for now for --+ older compilers] --+ --+ Early snapshots of gcc 4.3 don't support this and we can't detect this --+ in the preprocessor, but we can live with this because they're unreleased. --+ Maketime probing would be overkill here. --+ --+ gcc also has a __attribute__((__hot__)) to move hot functions into --+ a special section, but I don't see any sense in this right now in --+ the kernel context */ --+#define __cold __attribute__((__cold__)) --+ --+#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) --+ --+#ifndef __CHECKER__ --+# define __compiletime_warning(message) __attribute__((warning(message))) --+# define __compiletime_error(message) __attribute__((error(message))) --+#endif /* __CHECKER__ */ --+ --+/* --+ * Mark a position in code as unreachable. This can be used to --+ * suppress control flow warnings after asm blocks that transfer --+ * control elsewhere. --+ * --+ * Early snapshots of gcc 4.5 don't support this and we can't detect --+ * this in the preprocessor, but we can live with this because they're --+ * unreleased. Really, we need to have autoconf for the kernel. --+ */ --+#define unreachable() __builtin_unreachable() --+ --+/* Mark a function definition as prohibited from being cloned. */ --+#define __noclone __attribute__((__noclone__)) --+ --+/* --+ * Tell the optimizer that something else uses this function or variable. --+ */ --+#define __visible __attribute__((externally_visible)) --+ --+/* --+ * GCC 'asm goto' miscompiles certain code sequences: --+ * --+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 --+ * --+ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. --+ * --+ * (asm goto is automatically volatile - the naming reflects this.) --+ */ --+#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) --+ --+#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP --+#define __HAVE_BUILTIN_BSWAP32__ --+#define __HAVE_BUILTIN_BSWAP64__ --+#define __HAVE_BUILTIN_BSWAP16__ --+#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ ---- --1.7.10.4 -- diff --git a/patches/openwrt/0037-ar71xx-update-QCA956x-support.patch b/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch similarity index 89% rename from patches/openwrt/0037-ar71xx-update-QCA956x-support.patch rename to patches/openwrt/0034-ar71xx-update-QCA956x-support.patch index 3ae6c249..f93c9c75 100644 --- a/patches/openwrt/0037-ar71xx-update-QCA956x-support.patch +++ b/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch @@ -379,3 +379,37 @@ index d3a14b2..61b8976 100644 +} + extern void __iomem *ath79_ddr_base; +diff --git a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch +index a36b8c3..fa4eba2 100644 +--- a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch ++++ b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch +@@ -9,8 +9,8 @@ + + soc_is_qca955x()) + reg = AR71XX_GPIO_REG_FUNC; + else if (soc_is_ar934x() || +- soc_is_qca953x() || soc_is_qca956x()) +-@@ -185,15 +186,27 @@ void __init ath79_gpio_output_select(uns ++ soc_is_qca953x() || ++@@ -187,15 +188,31 @@ void __init ath79_gpio_output_select(uns + { + void __iomem *base = ath79_gpio_base; + unsigned long flags; +@@ -19,7 +19,7 @@ + + unsigned long gpio_count; + u32 t, s; + +-- BUG_ON(!soc_is_ar934x() && !soc_is_qca953x()); ++ BUG_ON(!soc_is_ar934x() && !soc_is_qca953x() && !soc_is_qca956x()); + + if (soc_is_ar934x()) { + + gpio_count = AR934X_GPIO_COUNT; + + reg_base = AR934X_GPIO_REG_OUT_FUNC0; +@@ -29,6 +29,9 @@ + + } else if (soc_is_qca955x()) { + + gpio_count = QCA955X_GPIO_COUNT; + + reg_base = QCA955X_GPIO_REG_OUT_FUNC0; +++ } else if (soc_is_qca956x()) { +++ gpio_count = QCA956X_GPIO_COUNT; +++ reg_base = QCA956X_GPIO_REG_OUT_FUNC0; + + } else { + + BUG(); + + } diff --git a/patches/openwrt/0034-toolchain-gcc-fix-build-with-GCC-6.patch b/patches/openwrt/0034-toolchain-gcc-fix-build-with-GCC-6.patch deleted file mode 100644 index e828631b..00000000 --- a/patches/openwrt/0034-toolchain-gcc-fix-build-with-GCC-6.patch +++ /dev/null @@ -1,144 +0,0 @@ -From: Matthias Schiffer -Date: Mon, 9 May 2016 00:16:38 +0200 -Subject: toolchain: gcc: fix build with GCC 6 - -At least for GCC 4.8, which is used by most targets. - -Signed-off-by: Matthias Schiffer - -diff --git a/toolchain/gcc/patches/4.8-linaro/030-gcc-6-compile.patch b/toolchain/gcc/patches/4.8-linaro/030-gcc-6-compile.patch -new file mode 100644 -index 0000000..c74f2aa ---- /dev/null -+++ b/toolchain/gcc/patches/4.8-linaro/030-gcc-6-compile.patch -@@ -0,0 +1,130 @@ -+Upstream commit r233721 -+ -+diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in -+index bd1c1d7..a0ea0d4 100644 -+--- a/gcc/cp/Make-lang.in -++++ b/gcc/cp/Make-lang.in -+@@ -111,7 +111,7 @@ else -+ # deleting the $(srcdir)/cp/cfns.h file. -+ $(srcdir)/cp/cfns.h: -+ endif -+- gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L ANSI-C \ -++ gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L C++ \ -+ $(srcdir)/cp/cfns.gperf --output-file $(srcdir)/cp/cfns.h -+ -+ # -+diff --git a/gcc/cp/cfns.gperf b/gcc/cp/cfns.gperf -+index 05ca753..d9b16b8 100644 -+--- a/gcc/cp/cfns.gperf -++++ b/gcc/cp/cfns.gperf -+@@ -1,3 +1,5 @@ -++%language=C++ -++%define class-name libc_name -+ %{ -+ /* Copyright (C) 2000-2014 Free Software Foundation, Inc. -+ -+@@ -16,14 +18,6 @@ for more details. -+ You should have received a copy of the GNU General Public License -+ along with GCC; see the file COPYING3. If not see -+ . */ -+-#ifdef __GNUC__ -+-__inline -+-#endif -+-static unsigned int hash (const char *, unsigned int); -+-#ifdef __GNUC__ -+-__inline -+-#endif -+-const char * libc_name_p (const char *, unsigned int); -+ %} -+ %% -+ # The standard C library functions, for feeding to gperf; the result is used -+diff --git a/gcc/cp/cfns.h b/gcc/cp/cfns.h -+index c845ddf..65801d1 100644 -+--- a/gcc/cp/cfns.h -++++ b/gcc/cp/cfns.h -+@@ -1,5 +1,5 @@ -+-/* ANSI-C code produced by gperf version 3.0.3 */ -+-/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p -L ANSI-C cfns.gperf */ -++/* C++ code produced by gperf version 3.0.4 */ -++/* Command-line: gperf -o -C -E -k '1-6,$' -j1 -D -N libc_name_p -L C++ --output-file cfns.h cfns.gperf */ -+ -+ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ -+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ -+@@ -28,7 +28,7 @@ -+ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." -+ #endif -+ -+-#line 1 "cfns.gperf" -++#line 3 "cfns.gperf" -+ -+ /* Copyright (C) 2000-2014 Free Software Foundation, Inc. -+ -+@@ -47,25 +47,18 @@ for more details. -+ You should have received a copy of the GNU General Public License -+ along with GCC; see the file COPYING3. If not see -+ . */ -+-#ifdef __GNUC__ -+-__inline -+-#endif -+-static unsigned int hash (const char *, unsigned int); -+-#ifdef __GNUC__ -+-__inline -+-#endif -+-const char * libc_name_p (const char *, unsigned int); -+ /* maximum key range = 391, duplicates = 0 */ -+ -+-#ifdef __GNUC__ -+-__inline -+-#else -+-#ifdef __cplusplus -+-inline -+-#endif -+-#endif -+-static unsigned int -+-hash (register const char *str, register unsigned int len) -++class libc_name -++{ -++private: -++ static inline unsigned int hash (const char *str, unsigned int len); -++public: -++ static const char *libc_name_p (const char *str, unsigned int len); -++}; -++ -++inline unsigned int -++libc_name::hash (register const char *str, register unsigned int len) -+ { -+ static const unsigned short asso_values[] = -+ { -+@@ -122,14 +115,8 @@ hash (register const char *str, register unsigned int len) -+ return hval + asso_values[(unsigned char)str[len - 1]]; -+ } -+ -+-#ifdef __GNUC__ -+-__inline -+-#ifdef __GNUC_STDC_INLINE__ -+-__attribute__ ((__gnu_inline__)) -+-#endif -+-#endif -+ const char * -+-libc_name_p (register const char *str, register unsigned int len) -++libc_name::libc_name_p (register const char *str, register unsigned int len) -+ { -+ enum -+ { -+diff --git a/gcc/cp/except.c b/gcc/cp/except.c -+index 221971a..32340f5 100644 -+--- a/gcc/cp/except.c -++++ b/gcc/cp/except.c -+@@ -1030,7 +1030,8 @@ nothrow_libfn_p (const_tree fn) -+ unless the system headers are playing rename tricks, and if -+ they are, we don't want to be confused by them. */ -+ id = DECL_NAME (fn); -+- return !!libc_name_p (IDENTIFIER_POINTER (id), IDENTIFIER_LENGTH (id)); -++ return !!libc_name::libc_name_p (IDENTIFIER_POINTER (id), -++ IDENTIFIER_LENGTH (id)); -+ } -+ -+ /* Returns nonzero if an exception of type FROM will be caught by a -+-- -+1.7.1 -+ diff --git a/patches/openwrt/0038-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch b/patches/openwrt/0035-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch similarity index 100% rename from patches/openwrt/0038-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch rename to patches/openwrt/0035-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch diff --git a/patches/openwrt/0039-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch b/patches/openwrt/0036-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch similarity index 100% rename from patches/openwrt/0039-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch rename to patches/openwrt/0036-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch diff --git a/patches/openwrt/0040-ar71xx-fix-qca956x-ethernet-initialization.patch b/patches/openwrt/0037-ar71xx-fix-qca956x-ethernet-initialization.patch similarity index 100% rename from patches/openwrt/0040-ar71xx-fix-qca956x-ethernet-initialization.patch rename to patches/openwrt/0037-ar71xx-fix-qca956x-ethernet-initialization.patch diff --git a/patches/openwrt/0041-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch similarity index 97% rename from patches/openwrt/0041-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch rename to patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch index 21390fc7..bfb699d9 100644 --- a/patches/openwrt/0041-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch +++ b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch @@ -8,10 +8,10 @@ Signed-off-by: P.Wassi Backport of OpenWrt r48711 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 5a184cd..8c6ac9a 100644 +index c5e39d0..e36c581 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -296,7 +296,8 @@ get_status_led() { +@@ -305,7 +305,8 @@ get_status_led() { unifi) status_led="ubnt:green:dome" ;; @@ -22,10 +22,10 @@ index 5a184cd..8c6ac9a 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index b2e15bb..e4a1473 100755 +index b2b182e..850eac9 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -366,6 +366,7 @@ tl-wa901nd-v3 |\ +@@ -368,6 +368,7 @@ tl-wa901nd-v3 |\ tl-wa901nd-v4 |\ tl-wr703n |\ tube2h |\ @@ -34,10 +34,10 @@ index b2e15bb..e4a1473 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index ddd6611..8670583 100755 +index 131364c..ac77934 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -881,6 +881,9 @@ ar71xx_board_detect() { +@@ -896,6 +896,9 @@ ar71xx_board_detect() { *UniFi) name="unifi" ;; @@ -48,7 +48,7 @@ index ddd6611..8670583 100755 name="uap-pro" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index c5c1871..4c43166 100755 +index ccccc17..4793fa9 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -251,6 +251,7 @@ platform_check_image() { @@ -60,10 +60,10 @@ index c5c1871..4c43166 100755 carambola2 | \ weio ) diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index e2ff826..9a81911 100644 +index e4bed08..514f7d5 100644 --- a/target/linux/ar71xx/config-3.18 +++ b/target/linux/ar71xx/config-3.18 -@@ -137,6 +137,7 @@ CONFIG_ATH79_MACH_TL_WR941ND=y +@@ -140,6 +140,7 @@ CONFIG_ATH79_MACH_TL_WR941ND=y CONFIG_ATH79_MACH_TL_WR941ND_V6=y CONFIG_ATH79_MACH_TUBE2H=y CONFIG_ATH79_MACH_UBNT=y @@ -71,7 +71,7 @@ index e2ff826..9a81911 100644 CONFIG_ATH79_MACH_UBNT_XM=y CONFIG_ATH79_MACH_WEIO=y CONFIG_ATH79_MACH_WHR_HP_G300N=y -@@ -320,7 +321,7 @@ CONFIG_SOC_AR933X=y +@@ -323,7 +324,7 @@ CONFIG_SOC_AR933X=y CONFIG_SOC_AR934X=y CONFIG_SOC_QCA953X=y CONFIG_SOC_QCA955X=y @@ -218,7 +218,7 @@ index d8e24d0..94eff18 100644 NAME:=Ubiquiti UniFiAP Outdoor PACKAGES:= diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index d42ceef..dd59f2d 100644 +index 7184966..209eba4 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -740,6 +740,16 @@ define Device/oolite diff --git a/patches/openwrt/0042-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch b/patches/openwrt/0039-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch similarity index 100% rename from patches/openwrt/0042-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch rename to patches/openwrt/0039-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch diff --git a/patches/openwrt/0043-ar71xx-Rename-unifiac-to-unifiac-lite.patch b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch similarity index 95% rename from patches/openwrt/0043-ar71xx-Rename-unifiac-to-unifiac-lite.patch rename to patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch index 19579875..688cf5c0 100644 --- a/patches/openwrt/0043-ar71xx-Rename-unifiac-to-unifiac-lite.patch +++ b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch @@ -10,10 +10,10 @@ Signed-off-by: P.Wassi Backport of LEDE c855e70491fbd5d432915c4cbeb3b80f3a117e30 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 8c6ac9a..3d711ca 100644 +index e36c581..23fd122 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -297,7 +297,7 @@ get_status_led() { +@@ -306,7 +306,7 @@ get_status_led() { status_led="ubnt:green:dome" ;; uap-pro | \ @@ -23,10 +23,10 @@ index 8c6ac9a..3d711ca 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index e6fcec8..fa8a2c8 100644 +index f01c6d3..6c6b27a 100644 --- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -@@ -75,7 +75,7 @@ case "$FIRMWARE" in +@@ -77,7 +77,7 @@ case "$FIRMWARE" in ath10kcal_extract "ART" 20480 2116 ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16) ;; @@ -36,10 +36,10 @@ index e6fcec8..fa8a2c8 100644 ;; esac diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index e4a1473..0269e6d 100755 +index 850eac9..cb31c69 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -366,7 +366,7 @@ tl-wa901nd-v3 |\ +@@ -368,7 +368,7 @@ tl-wa901nd-v3 |\ tl-wa901nd-v4 |\ tl-wr703n |\ tube2h |\ @@ -49,10 +49,10 @@ index e4a1473..0269e6d 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 8670583..d3e6db9 100755 +index ac77934..f8dd719 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -881,8 +881,8 @@ ar71xx_board_detect() { +@@ -896,8 +896,8 @@ ar71xx_board_detect() { *UniFi) name="unifi" ;; @@ -64,7 +64,7 @@ index 8670583..d3e6db9 100755 *"UniFi AP Pro") name="uap-pro" diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 4c43166..a1b65b7 100755 +index 4793fa9..5aa59fd 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -251,7 +251,7 @@ platform_check_image() { @@ -143,7 +143,7 @@ index 94eff18..eac0240 100644 define Profile/UBNTUNIFIOUTDOOR NAME:=Ubiquiti UniFiAP Outdoor diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index dd59f2d..3efa2e1 100644 +index 209eba4..c9d6ed1 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -741,14 +741,19 @@ endef diff --git a/patches/openwrt/0044-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch similarity index 96% rename from patches/openwrt/0044-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch rename to patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch index 1f28d0f4..50b613c8 100644 --- a/patches/openwrt/0044-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch +++ b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch @@ -8,10 +8,10 @@ Signed-off-by: P.Wassi Backport of LEDE 8307c2fe686ded345c80318359d5b6679e581fa2 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 3d711ca..775aac6 100644 +index 23fd122..f182d60 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -297,7 +297,8 @@ get_status_led() { +@@ -306,7 +306,8 @@ get_status_led() { status_led="ubnt:green:dome" ;; uap-pro | \ @@ -22,10 +22,10 @@ index 3d711ca..775aac6 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index fa8a2c8..cde7aaf 100644 +index 6c6b27a..0e93feb 100644 --- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -@@ -75,7 +75,8 @@ case "$FIRMWARE" in +@@ -77,7 +77,8 @@ case "$FIRMWARE" in ath10kcal_extract "ART" 20480 2116 ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16) ;; @@ -36,10 +36,10 @@ index fa8a2c8..cde7aaf 100644 ;; esac diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 0269e6d..0a23756 100755 +index cb31c69..e5c64bb 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -398,6 +398,13 @@ wpj344) +@@ -400,6 +400,13 @@ wpj344) ucidef_add_switch_vlan "switch0" "2" "0t 2" ;; @@ -54,10 +54,10 @@ index 0269e6d..0a23756 100755 ucidef_set_interfaces_lan_wan "eth0" "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index d3e6db9..7fc951a 100755 +index f8dd719..348e0f6 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -884,6 +884,9 @@ ar71xx_board_detect() { +@@ -899,6 +899,9 @@ ar71xx_board_detect() { *"UniFi-AC-LITE") name="unifiac-lite" ;; @@ -68,7 +68,7 @@ index d3e6db9..7fc951a 100755 name="uap-pro" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index a1b65b7..0e9833d 100755 +index 5aa59fd..0f166eb 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -252,6 +252,7 @@ platform_check_image() { @@ -193,7 +193,7 @@ index eac0240..69b8398 100644 NAME:=Ubiquiti UniFiAP Outdoor PACKAGES:= diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 3efa2e1..58118f2 100644 +index c9d6ed1..0cf1df1 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -753,7 +753,13 @@ define Device/ubnt-unifiac-lite diff --git a/patches/openwrt/0079-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch b/patches/openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch similarity index 100% rename from patches/openwrt/0079-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch rename to patches/openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch diff --git a/patches/openwrt/0080-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch b/patches/openwrt/0043-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch similarity index 100% rename from patches/openwrt/0080-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch rename to patches/openwrt/0043-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch diff --git a/patches/openwrt/0081-ar71xx-Send-power-to-USB-port-on-WNR2200.patch b/patches/openwrt/0044-ar71xx-Send-power-to-USB-port-on-WNR2200.patch similarity index 100% rename from patches/openwrt/0081-ar71xx-Send-power-to-USB-port-on-WNR2200.patch rename to patches/openwrt/0044-ar71xx-Send-power-to-USB-port-on-WNR2200.patch diff --git a/patches/openwrt/0045-ar71xx-Generate-sysupgrade-images-for-OpenMesh-devices.patch b/patches/openwrt/0045-ar71xx-Generate-sysupgrade-images-for-OpenMesh-devices.patch deleted file mode 100644 index 4f3580f5..00000000 --- a/patches/openwrt/0045-ar71xx-Generate-sysupgrade-images-for-OpenMesh-devices.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Sven Eckelmann -Date: Tue, 17 May 2016 16:38:29 +0200 -Subject: ar71xx: Generate sysupgrade images for OpenMesh devices - -Some OpenWrt based firmwares like Gluon expect that a sysupgrade image -exists when a device firmware can be updated via sysupgrade. This image -wasn't created until now because OpenMesh devices use the same image for -factory and sysupgrade flash. Copying the image from *factory.bin to -*sysupgrade.bin is therefore enough to make the sysupgrade functionality -visible. - -Reported-by: Matthias Schiffer -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/624172/ - -diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 58118f2..7aee0c8 100644 ---- a/target/linux/ar71xx/image/Makefile -+++ b/target/linux/ar71xx/image/Makefile -@@ -1877,6 +1877,9 @@ define Image/Build/OpenMesh - "$(BUILD_DIR)/fwupgrade.cfg-$(4)" "fwupgrade.cfg" \ - "$(KDIR_TMP)/vmlinux-$(2).uImage" "kernel" \ - "$(KDIR)/root.$(1)" "rootfs" -+ if [ -e "$(call factoryname,$(1),$(2))" ]; then \ -+ cp "$(call factoryname,$(1),$(2))" "$(call sysupname,$(1),$(2))"; \ -+ fi - endef - - diff --git a/patches/openwrt/0082-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch b/patches/openwrt/0045-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch similarity index 100% rename from patches/openwrt/0082-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch rename to patches/openwrt/0045-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch diff --git a/patches/openwrt/0083-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch b/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch similarity index 99% rename from patches/openwrt/0083-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch rename to patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch index 853104ce..ec735029 100644 --- a/patches/openwrt/0083-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch +++ b/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch @@ -10,10 +10,10 @@ Signed-off-by: Michal Cieslakiewicz Backport of r49101 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 9a768cd..ae17853 100644 +index d7dc9a1..337000c 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -590,6 +590,21 @@ wnr2000-v4) +@@ -592,6 +592,21 @@ wnr2000-v4) ucidef_set_led_usbdev "usb" "USB" "netgear:amber:status" "1-1" ;; diff --git a/patches/openwrt/0046-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750-board.patch b/patches/openwrt/0046-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750-board.patch deleted file mode 100644 index 35dcac61..00000000 --- a/patches/openwrt/0046-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750-board.patch +++ /dev/null @@ -1,202 +0,0 @@ -From: Sven Eckelmann -Date: Mon, 14 Sep 2015 20:10:43 +0000 -Subject: ar71xx: add kernel support for the OpenMesh MR1750 board - -Signed-off-by: Sven Eckelmann - -Backport of r46926 - -Forwarded: https://patchwork.ozlabs.org/patch/624173/ - -diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index 9a81911..c5a3c9a 100644 ---- a/target/linux/ar71xx/config-3.18 -+++ b/target/linux/ar71xx/config-3.18 -@@ -79,6 +79,7 @@ CONFIG_ATH79_MACH_JWAP003=y - CONFIG_ATH79_MACH_MC_MAC1200R=y - CONFIG_ATH79_MACH_MR16=y - CONFIG_ATH79_MACH_MR12=y -+CONFIG_ATH79_MACH_MR1750=y - CONFIG_ATH79_MACH_MR600=y - CONFIG_ATH79_MACH_MR900=y - CONFIG_ATH79_MACH_MYNET_N600=y -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -new file mode 100644 -index 0000000..8ace02f ---- /dev/null -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -@@ -0,0 +1,129 @@ -+/* -+ * MR1750 board support -+ * -+ * Copyright (c) 2012 Qualcomm Atheros -+ * Copyright (c) 2012-2013 Marek Lindner -+ * -+ * Permission to use, copy, modify, and/or distribute this software for any -+ * purpose with or without fee is hereby granted, provided that the above -+ * copyright notice and this permission notice appear in all copies. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -+ * -+ */ -+ -+#include -+#include -+ -+#include -+ -+#include "common.h" -+#include "dev-ap9x-pci.h" -+#include "dev-gpio-buttons.h" -+#include "dev-eth.h" -+#include "dev-leds-gpio.h" -+#include "dev-m25p80.h" -+#include "dev-wmac.h" -+#include "machtypes.h" -+#include "pci.h" -+ -+#define MR1750_GPIO_LED_LAN 12 -+#define MR1750_GPIO_LED_WLAN_2G 13 -+#define MR1750_GPIO_LED_STATUS_GREEN 19 -+#define MR1750_GPIO_LED_STATUS_RED 21 -+#define MR1750_GPIO_LED_POWER 22 -+#define MR1750_GPIO_LED_WLAN_5G 23 -+ -+#define MR1750_GPIO_BTN_RESET 17 -+ -+#define MR1750_KEYS_POLL_INTERVAL 20 /* msecs */ -+#define MR1750_KEYS_DEBOUNCE_INTERVAL (3 * MR1750_KEYS_POLL_INTERVAL) -+ -+#define MR1750_MAC0_OFFSET 0 -+#define MR1750_WMAC_CALDATA_OFFSET 0x1000 -+ -+static struct gpio_led mr1750_leds_gpio[] __initdata = { -+ { -+ .name = "mr1750:blue:power", -+ .gpio = MR1750_GPIO_LED_POWER, -+ .active_low = 1, -+ }, -+ { -+ .name = "mr1750:blue:wan", -+ .gpio = MR1750_GPIO_LED_LAN, -+ .active_low = 1, -+ }, -+ { -+ .name = "mr1750:blue:wlan24", -+ .gpio = MR1750_GPIO_LED_WLAN_2G, -+ .active_low = 1, -+ }, -+ { -+ .name = "mr1750:blue:wlan58", -+ .gpio = MR1750_GPIO_LED_WLAN_5G, -+ .active_low = 1, -+ }, -+ { -+ .name = "mr1750:green:status", -+ .gpio = MR1750_GPIO_LED_STATUS_GREEN, -+ .active_low = 1, -+ }, -+ { -+ .name = "mr1750:red:status", -+ .gpio = MR1750_GPIO_LED_STATUS_RED, -+ .active_low = 1, -+ }, -+}; -+ -+static struct gpio_keys_button mr1750_gpio_keys[] __initdata = { -+ { -+ .desc = "Reset button", -+ .type = EV_KEY, -+ .code = KEY_RESTART, -+ .debounce_interval = MR1750_KEYS_DEBOUNCE_INTERVAL, -+ .gpio = MR1750_GPIO_BTN_RESET, -+ .active_low = 1, -+ }, -+}; -+ -+static void __init mr1750_setup(void) -+{ -+ u8 *art = (u8 *)KSEG1ADDR(0x1fff0000); -+ u8 mac[6]; -+ -+ ath79_eth0_pll_data.pll_1000 = 0xbe000101; -+ ath79_eth0_pll_data.pll_100 = 0x80000101; -+ ath79_eth0_pll_data.pll_10 = 0x80001313; -+ -+ ath79_register_m25p80(NULL); -+ -+ ath79_register_leds_gpio(-1, ARRAY_SIZE(mr1750_leds_gpio), -+ mr1750_leds_gpio); -+ ath79_register_gpio_keys_polled(-1, MR1750_KEYS_POLL_INTERVAL, -+ ARRAY_SIZE(mr1750_gpio_keys), -+ mr1750_gpio_keys); -+ -+ ath79_init_mac(mac, art + MR1750_MAC0_OFFSET, 1); -+ ath79_register_wmac(art + MR1750_WMAC_CALDATA_OFFSET, mac); -+ ath79_register_pci(); -+ -+ ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN); -+ ath79_register_mdio(0, 0x0); -+ -+ ath79_init_mac(ath79_eth0_data.mac_addr, art + MR1750_MAC0_OFFSET, 0); -+ -+ /* GMAC0 is connected to the RMGII interface */ -+ ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII; -+ ath79_eth0_data.phy_mask = BIT(5); -+ ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev; -+ -+ ath79_register_eth(0); -+} -+ -+MIPS_MACHINE(ATH79_MACH_MR1750, "MR1750", "OpenMesh MR1750", mr1750_setup); -diff --git a/target/linux/ar71xx/patches-3.18/815-MIPS-ath79-add-mr1750-support.patch b/target/linux/ar71xx/patches-3.18/815-MIPS-ath79-add-mr1750-support.patch -new file mode 100644 -index 0000000..d802a12 ---- /dev/null -+++ b/target/linux/ar71xx/patches-3.18/815-MIPS-ath79-add-mr1750-support.patch -@@ -0,0 +1,39 @@ -+--- a/arch/mips/ath79/Kconfig -++++ b/arch/mips/ath79/Kconfig -+@@ -763,6 +763,16 @@ config ATH79_MACH_CAP4200AG -+ select ATH79_DEV_M25P80 -+ select ATH79_DEV_WMAC -+ -++config ATH79_MACH_MR1750 -++ bool "OpenMesh MR1750 board support" -++ select SOC_QCA955X -++ select ATH79_DEV_AP9X_PCI if PCI -++ select ATH79_DEV_ETH -++ select ATH79_DEV_GPIO_BUTTONS -++ select ATH79_DEV_LEDS_GPIO -++ select ATH79_DEV_M25P80 -++ select ATH79_DEV_WMAC -++ -+ config ATH79_MACH_MR900 -+ bool "OpenMesh MR900 board support" -+ select SOC_QCA955X -+--- a/arch/mips/ath79/Makefile -++++ b/arch/mips/ath79/Makefile -+@@ -80,6 +80,7 @@ obj-$(CONFIG_ATH79_MACH_HORNET_UB) += ma -+ obj-$(CONFIG_ATH79_MACH_MC_MAC1200R) += mach-mc-mac1200r.o -+ obj-$(CONFIG_ATH79_MACH_MR12) += mach-mr12.o -+ obj-$(CONFIG_ATH79_MACH_MR16) += mach-mr16.o -++obj-$(CONFIG_ATH79_MACH_MR1750) += mach-mr1750.o -+ obj-$(CONFIG_ATH79_MACH_MR600) += mach-mr600.o -+ obj-$(CONFIG_ATH79_MACH_MR900) += mach-mr900.o -+ obj-$(CONFIG_ATH79_MACH_MYNET_N600) += mach-mynet-n600.o -+--- a/arch/mips/ath79/machtypes.h -++++ b/arch/mips/ath79/machtypes.h -+@@ -69,6 +69,7 @@ enum ath79_mach_type { -+ ATH79_MACH_HORNET_UB, /* ALFA Networks Hornet-UB */ -+ ATH79_MACH_MR12, /* Cisco Meraki MR12 */ -+ ATH79_MACH_MR16, /* Cisco Meraki MR16 */ -++ ATH79_MACH_MR1750, /* OpenMesh MR1750 */ -+ ATH79_MACH_MR600V2, /* OpenMesh MR600v2 */ -+ ATH79_MACH_MR600, /* OpenMesh MR600 */ -+ ATH79_MACH_MR900, /* OpenMesh MR900 */ diff --git a/patches/openwrt/0084-ar71xx-add-GL-AR150-support.patch b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch similarity index 98% rename from patches/openwrt/0084-ar71xx-add-GL-AR150-support.patch rename to patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch index bd6bf1aa..1fce6624 100644 --- a/patches/openwrt/0084-ar71xx-add-GL-AR150-support.patch +++ b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch @@ -9,7 +9,7 @@ https://raw.githubusercontent.com/domino-team/OpenWrt-patches/master/AR150%2C%20 (and fixed indentation in target/linux/ar71xx/base-files/lib/ar71xx.sh) diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index ae17853..dc8b8d6 100644 +index 337000c..032acc9 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -181,6 +181,10 @@ dlan-pro-1200-ac) @@ -24,10 +24,10 @@ index ae17853..dc8b8d6 100644 ucidef_set_led_netdev "lan" "LAN" "gl-connect:green:lan" "eth1" ucidef_set_led_wlan "wlan" "WLAN" "gl-connect:red:wlan" "phy0tpt" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 4066506..89a2184 100755 +index e5c64bb..b8ae576 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -381,6 +381,7 @@ dir-505-a1) +@@ -382,6 +382,7 @@ dir-505-a1) alfa-ap96 |\ alfa-nx |\ ap83 |\ @@ -36,7 +36,7 @@ index 4066506..89a2184 100755 jwap003 |\ pb42 |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index fbf76c8..db908f9 100755 +index 348e0f6..5119b36 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -500,6 +500,9 @@ ar71xx_board_detect() { @@ -50,7 +50,7 @@ index fbf76c8..db908f9 100755 name="epg5000" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 4a4c476..aeb4577 100755 +index 0f166eb..f33419f 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -215,6 +215,7 @@ platform_check_image() { diff --git a/patches/openwrt/0047-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750-board.patch b/patches/openwrt/0047-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750-board.patch deleted file mode 100644 index 3e6363c7..00000000 --- a/patches/openwrt/0047-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750-board.patch +++ /dev/null @@ -1,67 +0,0 @@ -From: Sven Eckelmann -Date: Mon, 14 Sep 2015 20:11:01 +0000 -Subject: ar71xx: add user-space support for the OpenMesh MR1750 board - -Signed-off-by: Sven Eckelmann - -Backport of r46927 - -Forwarded: https://patchwork.ozlabs.org/patch/624174/ - -diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 775aac6..44d2ddf 100644 ---- a/target/linux/ar71xx/base-files/etc/diag.sh -+++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -143,6 +143,9 @@ get_status_led() { - mr600v2) - status_led="mr600:blue:power" - ;; -+ mr1750) -+ status_led="mr1750:blue:power" -+ ;; - mr900 | \ - mr900v2) - status_led="mr900:blue:power" -diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index a4b355a..c451124 100644 ---- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -239,6 +239,12 @@ mr600) - ucidef_set_led_wlan "wlan58" "WLAN58" "mr600:green:wlan58" "phy0tpt" - ;; - -+mr1750) -+ ucidef_set_led_netdev "lan" "LAN" "mr1750:blue:wan" "eth0" -+ ucidef_set_led_wlan "wlan58" "WLAN58" "mr1750:blue:wlan58" "phy0tpt" -+ ucidef_set_led_wlan "wlan24" "WLAN24" "mr1750:blue:wlan24" "phy1tpt" -+ ;; -+ - mr900 | \ - mr900v2) - ucidef_set_led_netdev "lan" "LAN" "mr900:blue:wan" "eth0" -diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 0a23756..4066506 100755 ---- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -334,6 +334,7 @@ eap300v2 |\ - eap7660d |\ - el-mini |\ - loco-m-xw |\ -+mr1750 |\ - mr600 |\ - mr600v2 |\ - mr900 |\ -diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 7fc951a..587d029 100755 ---- a/target/linux/ar71xx/base-files/lib/ar71xx.sh -+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -562,6 +562,9 @@ ar71xx_board_detect() { - *MR600v2) - name="mr600v2" - ;; -+ *MR1750) -+ name="mr1750" -+ ;; - *MR600) - name="mr600" - ;; diff --git a/patches/openwrt/0086-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch b/patches/openwrt/0048-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch similarity index 100% rename from patches/openwrt/0086-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch rename to patches/openwrt/0048-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch diff --git a/patches/openwrt/0048-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-MR1750.patch b/patches/openwrt/0048-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-MR1750.patch deleted file mode 100644 index 66b0bc4f..00000000 --- a/patches/openwrt/0048-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-MR1750.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Sven Eckelmann -Date: Mon, 14 Sep 2015 20:11:18 +0000 -Subject: scripts/om-fwupgradecfg-gen.sh: add support for the MR1750 - -Signed-off-by: Sven Eckelmann - -Backport of r46928 - -Forwarded: https://patchwork.ozlabs.org/patch/624175/ - -diff --git a/scripts/om-fwupgradecfg-gen.sh b/scripts/om-fwupgradecfg-gen.sh -index e132954..c790214 100644 ---- a/scripts/om-fwupgradecfg-gen.sh -+++ b/scripts/om-fwupgradecfg-gen.sh -@@ -7,7 +7,7 @@ - # - - usage() { -- echo "Usage: $0 " -+ echo "Usage: $0 " - rm -f $CFG_OUT - exit 1 - } -@@ -26,7 +26,7 @@ case $CE_TYPE in - FLASH_BS=262144 - MD5_SKIP_BLOCKS=1 - ;; -- OM5P|MR600|MR900) -+ OM5P|MR600|MR900|MR1750) - MAX_PART_SIZE=7808 - KERNEL_FLASH_ADDR=0xb0000 - FLASH_BS=65536 diff --git a/patches/openwrt/0049-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750.patch b/patches/openwrt/0049-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750.patch deleted file mode 100644 index dc595593..00000000 --- a/patches/openwrt/0049-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750.patch +++ /dev/null @@ -1,55 +0,0 @@ -From: Sven Eckelmann -Date: Mon, 14 Sep 2015 20:11:24 +0000 -Subject: ar71xx: enable sysupgrade for the OpenMesh MR1750 - -Signed-off-by: Sven Eckelmann - -Backport of r46929 - -Forwarded: https://patchwork.ozlabs.org/patch/624176/ - -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -index 547116e..9ca0f5b 100644 ---- a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -@@ -72,6 +72,11 @@ platform_check_image_openmesh() - echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" - return 1 - ;; -+ MR1750) -+ [ "$board" = "mr1750" ] && break -+ echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" -+ return 1 -+ ;; - MR600) - [ "$board" = "mr600" ] && break - [ "$board" = "mr600v2" ] && break -@@ -157,7 +162,7 @@ platform_do_upgrade_openmesh() - kernel_start_addr1=0x9f1c0000 - kernel_start_addr2=0x9f8c0000 - ;; -- OM5P|MR600|MR900) -+ OM5P|MR600|MR900|MR1750) - block_size=$((64 * 1024)) - total_size=7995392 - kernel_start_addr1=0x9f0b0000 -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 0e9833d..ac060ea 100755 ---- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -296,6 +296,7 @@ platform_check_image() { - - return 0; - ;; -+ mr1750 | \ - mr600 | \ - mr600v2 | \ - mr900 | \ -@@ -528,6 +529,7 @@ platform_do_upgrade() { - tew-673gru) - platform_do_upgrade_dir825b "$ARGV" - ;; -+ mr1750 | \ - mr600 | \ - mr600v2 | \ - mr900 | \ diff --git a/patches/openwrt/0087-tools-cmake-fix-parallel-build-with-Make-4.2.patch b/patches/openwrt/0049-tools-cmake-fix-parallel-build-with-Make-4.2.patch similarity index 100% rename from patches/openwrt/0087-tools-cmake-fix-parallel-build-with-Make-4.2.patch rename to patches/openwrt/0049-tools-cmake-fix-parallel-build-with-Make-4.2.patch diff --git a/patches/openwrt/0088-linux-make-IPv6-builtin-if-selected-saves-30KB.patch b/patches/openwrt/0050-linux-make-IPv6-builtin-if-selected-saves-30KB.patch similarity index 100% rename from patches/openwrt/0088-linux-make-IPv6-builtin-if-selected-saves-30KB.patch rename to patches/openwrt/0050-linux-make-IPv6-builtin-if-selected-saves-30KB.patch diff --git a/patches/openwrt/0050-package-om-watchdog-add-OpenMesh-MR1750-support.patch b/patches/openwrt/0050-package-om-watchdog-add-OpenMesh-MR1750-support.patch deleted file mode 100644 index e16fb3ef..00000000 --- a/patches/openwrt/0050-package-om-watchdog-add-OpenMesh-MR1750-support.patch +++ /dev/null @@ -1,23 +0,0 @@ -From: Sven Eckelmann -Date: Mon, 14 Sep 2015 20:11:35 +0000 -Subject: package/om-watchdog: add OpenMesh MR1750 support - -Signed-off-by: Sven Eckelmann - -Backport of r46930 - -Forwarded: https://patchwork.ozlabs.org/patch/624177/ - -diff --git a/package/kernel/om-watchdog/files/om-watchdog.init b/package/kernel/om-watchdog/files/om-watchdog.init -index 135fef7..c792968 100644 ---- a/package/kernel/om-watchdog/files/om-watchdog.init -+++ b/package/kernel/om-watchdog/files/om-watchdog.init -@@ -25,7 +25,7 @@ boot() { - "mr600v2") - service_start /sbin/om-watchdog 15 - ;; -- "mr900"|"mr900v2") -+ "mr900"|"mr900v2"|"mr1750") - service_start /sbin/om-watchdog 16 - ;; - esac diff --git a/patches/openwrt/0089-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch b/patches/openwrt/0051-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch similarity index 100% rename from patches/openwrt/0089-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch rename to patches/openwrt/0051-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch diff --git a/patches/openwrt/0051-package-uboot-envtools-add-OpenMesh-MR1750-support.patch b/patches/openwrt/0051-package-uboot-envtools-add-OpenMesh-MR1750-support.patch deleted file mode 100644 index 8e975a1c..00000000 --- a/patches/openwrt/0051-package-uboot-envtools-add-OpenMesh-MR1750-support.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Sven Eckelmann -Date: Mon, 14 Sep 2015 20:11:43 +0000 -Subject: package/uboot-envtools: add OpenMesh MR1750 support - -Signed-off-by: Sven Eckelmann - -Backport of r46931 - -Forwarded: https://patchwork.ozlabs.org/patch/624178/ - -diff --git a/package/boot/uboot-envtools/files/ar71xx b/package/boot/uboot-envtools/files/ar71xx -index ec8541c..ef00f17 100644 ---- a/package/boot/uboot-envtools/files/ar71xx -+++ b/package/boot/uboot-envtools/files/ar71xx -@@ -21,6 +21,7 @@ carambola2 | \ - eap300v2 | \ - hornet-ub | \ - hornet-ub-x2 | \ -+mr1750 | \ - mr600 | \ - mr600v2 | \ - mr900 | \ diff --git a/patches/openwrt/0052-ar71xx-create-profile-and-build-image-for-the-OpenMesh-MR1750-board.patch b/patches/openwrt/0052-ar71xx-create-profile-and-build-image-for-the-OpenMesh-MR1750-board.patch deleted file mode 100644 index 1a846049..00000000 --- a/patches/openwrt/0052-ar71xx-create-profile-and-build-image-for-the-OpenMesh-MR1750-board.patch +++ /dev/null @@ -1,57 +0,0 @@ -From: Sven Eckelmann -Date: Mon, 14 Sep 2015 20:11:51 +0000 -Subject: ar71xx: create profile and build image for the OpenMesh MR1750 board - -Signed-off-by: Sven Eckelmann - -Backport of r46932 - -Forwarded: https://patchwork.ozlabs.org/patch/624179/ - -diff --git a/target/linux/ar71xx/generic/profiles/openmesh.mk b/target/linux/ar71xx/generic/profiles/openmesh.mk -index 41b462e..06cf135 100644 ---- a/target/linux/ar71xx/generic/profiles/openmesh.mk -+++ b/target/linux/ar71xx/generic/profiles/openmesh.mk -@@ -49,9 +49,20 @@ endef - - $(eval $(call Profile,MR900)) - -+define Profile/MR1750 -+ NAME:=OpenMesh MR1750 -+ PACKAGES:=kmod-ath9k kmod-ath10k ath10k-firmware-qca988x -+endef -+ -+define Profile/MR1750/Description -+ Package set optimized for the OpenMesh MR1750. -+endef -+ -+$(eval $(call Profile,MR1750)) -+ - define Profile/OPENMESH - NAME:=OpenMesh products -- PACKAGES:=kmod-ath9k om-watchdog -+ PACKAGES:=kmod-ath9k kmod-ath10k om-watchdog - endef - - define Profile/OPENMESH/Description -diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 7aee0c8..0ebb7dc 100644 ---- a/target/linux/ar71xx/image/Makefile -+++ b/target/linux/ar71xx/image/Makefile -@@ -2045,6 +2045,7 @@ $(eval $(call SingleProfile,OpenMesh,squashfs-only,OM2P,om2p,,,,OM2P)) - $(eval $(call SingleProfile,OpenMesh,squashfs-only,OM5P,om5p,,,,OM5P)) - $(eval $(call SingleProfile,OpenMesh,squashfs-only,MR600,mr600,,,,MR600)) - $(eval $(call SingleProfile,OpenMesh,squashfs-only,MR900,mr900,,,,MR900)) -+$(eval $(call SingleProfile,OpenMesh,squashfs-only,MR1750,mr1750,,,,MR1750)) - - $(eval $(call SingleProfile,PB4X,128k,ALL0305,all0305,ALL0305,ttyS0,115200)) - $(eval $(call SingleProfile,PB4X,128k,EAP7660D,eap7660d,EAP7660D,ttyS0,115200)) -@@ -2138,7 +2139,7 @@ $(eval $(call MultiProfile,AP121,AP121_2M AP121_4M)) - $(eval $(call MultiProfile,DIR615IX,DIR615I1 DIR615I3)) - $(eval $(call MultiProfile,AP136,AP136_010 AP136_020)) - $(eval $(call MultiProfile,EWDORIN, EWDORINAP EWDORINRT EWDORIN16M)) --$(eval $(call MultiProfile,OPENMESH,OM2P OM5P MR600 MR900)) -+$(eval $(call MultiProfile,OPENMESH,OM2P OM5P MR600 MR900 MR1750)) - $(eval $(call MultiProfile,TEW652BRP,TEW652BRP_FW TEW652BRP_RECOVERY)) - $(eval $(call MultiProfile,TLMR3220,TLMR3220V1)) - $(eval $(call MultiProfile,TLMR3420,TLMR3420V1)) diff --git a/patches/openwrt/0090-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch b/patches/openwrt/0052-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch similarity index 100% rename from patches/openwrt/0090-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch rename to patches/openwrt/0052-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch diff --git a/patches/openwrt/0053-ar71xx-Extend-the-list-of-bits-in-QCA955X_GMAC_REG_ETH_CFG.patch b/patches/openwrt/0053-ar71xx-Extend-the-list-of-bits-in-QCA955X_GMAC_REG_ETH_CFG.patch deleted file mode 100644 index efe4b609..00000000 --- a/patches/openwrt/0053-ar71xx-Extend-the-list-of-bits-in-QCA955X_GMAC_REG_ETH_CFG.patch +++ /dev/null @@ -1,47 +0,0 @@ -From: Sven Eckelmann -Date: Wed, 16 Mar 2016 09:27:01 +0000 -Subject: ar71xx: Extend the list of bits in QCA955X_GMAC_REG_ETH_CFG - -Signed-off-by: Sven Eckelmann - -Backport of r49027 - -Forwarded: https://patchwork.ozlabs.org/patch/624180/ - -diff --git a/target/linux/ar71xx/patches-3.18/601-MIPS-ath79-add-more-register-defines.patch b/target/linux/ar71xx/patches-3.18/601-MIPS-ath79-add-more-register-defines.patch -index 8bf7658..797977f 100644 ---- a/target/linux/ar71xx/patches-3.18/601-MIPS-ath79-add-more-register-defines.patch -+++ b/target/linux/ar71xx/patches-3.18/601-MIPS-ath79-add-more-register-defines.patch -@@ -207,7 +207,7 @@ - #define AR934X_GPIO_REG_FUNC 0x6c - - #define AR71XX_GPIO_COUNT 16 --@@ -560,4 +663,153 @@ -+@@ -560,4 +663,170 @@ - #define AR934X_SRIF_DPLL2_OUTDIV_SHIFT 13 - #define AR934X_SRIF_DPLL2_OUTDIV_MASK 0x7 - -@@ -358,6 +358,23 @@ - +#define QCA955X_GMAC_REG_ETH_CFG 0x00 - + - +#define QCA955X_ETH_CFG_RGMII_EN BIT(0) -++#define QCA955X_ETH_CFG_MII_GE0 BIT(1) -++#define QCA955X_ETH_CFG_GMII_GE0 BIT(2) -++#define QCA955X_ETH_CFG_MII_GE0_MASTER BIT(3) -++#define QCA955X_ETH_CFG_MII_GE0_SLAVE BIT(4) -++#define QCA955X_ETH_CFG_GE0_ERR_EN BIT(5) - +#define QCA955X_ETH_CFG_GE0_SGMII BIT(6) -++#define QCA955X_ETH_CFG_RMII_GE0 BIT(10) -++#define QCA955X_ETH_CFG_MII_CNTL_SPEED BIT(11) -++#define QCA955X_ETH_CFG_RMII_GE0_MASTER BIT(12) -++#define QCA955X_ETH_CFG_RXD_DELAY_MASK 0x3 -++#define QCA955X_ETH_CFG_RXD_DELAY_SHIFT 14 -++#define QCA955X_ETH_CFG_RDV_DELAY BIT(16) -++#define QCA955X_ETH_CFG_RDV_DELAY_MASK 0x3 -++#define QCA955X_ETH_CFG_RDV_DELAY_SHIFT 16 -++#define QCA955X_ETH_CFG_TXD_DELAY_MASK 0x3 -++#define QCA955X_ETH_CFG_TXD_DELAY_SHIFT 18 -++#define QCA955X_ETH_CFG_TXE_DELAY_MASK 0x3 -++#define QCA955X_ETH_CFG_TXE_DELAY_SHIFT 20 - + - #endif /* __ASM_MACH_AR71XX_REGS_H */ diff --git a/patches/openwrt/0104-x86-stop-relying-on-hexdump-for-image-build-signature.patch b/patches/openwrt/0053-x86-stop-relying-on-hexdump-for-image-build-signature.patch similarity index 100% rename from patches/openwrt/0104-x86-stop-relying-on-hexdump-for-image-build-signature.patch rename to patches/openwrt/0053-x86-stop-relying-on-hexdump-for-image-build-signature.patch diff --git a/patches/openwrt/0054-ar71xx-Use-_eth_cfg-helper-for-Open-Mesh-MR900-boards.patch b/patches/openwrt/0054-ar71xx-Use-_eth_cfg-helper-for-Open-Mesh-MR900-boards.patch deleted file mode 100644 index 43a876d2..00000000 --- a/patches/openwrt/0054-ar71xx-Use-_eth_cfg-helper-for-Open-Mesh-MR900-boards.patch +++ /dev/null @@ -1,49 +0,0 @@ -From: Sven Eckelmann -Date: Tue, 7 Jul 2015 13:47:39 +0000 -Subject: ar71xx: Use *_eth_cfg helper for Open Mesh MR900 boards - -Signed-off-by: Sven Eckelmann - -Backport of r46241 - -Forwarded: https://patchwork.ozlabs.org/patch/624181/ - -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -index fe3e1fa..9c3164d 100644 ---- a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -@@ -94,24 +94,6 @@ static struct gpio_keys_button mr900_gpio_keys[] __initdata = { - }, - }; - -- --static void __init mr900_gmac_setup(void) --{ -- void __iomem *base; -- u32 t; -- -- base = ioremap(QCA955X_GMAC_BASE, QCA955X_GMAC_SIZE); -- -- t = __raw_readl(base + QCA955X_GMAC_REG_ETH_CFG); -- -- t &= ~(QCA955X_ETH_CFG_RGMII_EN | QCA955X_ETH_CFG_GE0_SGMII); -- t |= QCA955X_ETH_CFG_RGMII_EN; -- -- __raw_writel(t, base + QCA955X_GMAC_REG_ETH_CFG); -- -- iounmap(base); --} -- - static void __init mr900_setup(void) - { - u8 *art = (u8 *)KSEG1ADDR(0x1fff0000); -@@ -141,8 +123,7 @@ static void __init mr900_setup(void) - } - pdata->use_eeprom = true; - -- mr900_gmac_setup(); -- -+ ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN); - ath79_register_mdio(0, 0x0); - - ath79_init_mac(ath79_eth0_data.mac_addr, art + MR900_MAC0_OFFSET, 0); diff --git a/patches/openwrt/0105-mt76-fix-build-with-kernel-3.18.patch b/patches/openwrt/0054-mt76-fix-build-with-kernel-3.18.patch similarity index 100% rename from patches/openwrt/0105-mt76-fix-build-with-kernel-3.18.patch rename to patches/openwrt/0054-mt76-fix-build-with-kernel-3.18.patch diff --git a/patches/openwrt/0055-ar71xx-Allow-to-use-ath79_gpio_output_select-on-QCA955x.patch b/patches/openwrt/0055-ar71xx-Allow-to-use-ath79_gpio_output_select-on-QCA955x.patch deleted file mode 100644 index 137aa9d4..00000000 --- a/patches/openwrt/0055-ar71xx-Allow-to-use-ath79_gpio_output_select-on-QCA955x.patch +++ /dev/null @@ -1,79 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 24 Jul 2015 09:10:00 +0000 -Subject: ar71xx: Allow to use ath79_gpio_output_select on QCA955x - -Signed-off-by: Sven Eckelmann - -Backport of r46459 - -Forwarded: https://patchwork.ozlabs.org/patch/624182/ - -diff --git a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -new file mode 100644 -index 0000000..e71b6e2 ---- /dev/null -+++ b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -@@ -0,0 +1,63 @@ -+--- a/arch/mips/ath79/gpio.c -++++ b/arch/mips/ath79/gpio.c -+@@ -187,15 +187,30 @@ void __init ath79_gpio_output_select(uns -+ { -+ void __iomem *base = ath79_gpio_base; -+ unsigned long flags; -+- unsigned int reg; -++ unsigned int reg, reg_base; -++ unsigned long gpio_count; -+ u32 t, s; -+ -+- BUG_ON(!soc_is_ar934x() && !soc_is_qca953x() && !soc_is_qca956x()); -++ if (soc_is_ar934x()) { -++ gpio_count = AR934X_GPIO_COUNT; -++ reg_base = AR934X_GPIO_REG_OUT_FUNC0; -++ } else if (soc_is_qca953x()) { -++ gpio_count = QCA953X_GPIO_COUNT; -++ reg_base = QCA953X_GPIO_REG_OUT_FUNC0; -++ } else if (soc_is_qca955x()) { -++ gpio_count = QCA955X_GPIO_COUNT; -++ reg_base = QCA955X_GPIO_REG_OUT_FUNC0; -++ } else if (soc_is_qca956x()) { -++ gpio_count = QCA956X_GPIO_COUNT; -++ reg_base = QCA956X_GPIO_REG_OUT_FUNC0; -++ } else { -++ BUG(); -++ } -+ -+- if (gpio >= AR934X_GPIO_COUNT) -++ if (gpio >= gpio_count) -+ return; -+ -+- reg = AR934X_GPIO_REG_OUT_FUNC0 + 4 * (gpio / 4); -++ reg = reg_base + 4 * (gpio / 4); -+ s = 8 * (gpio % 4); -+ -+ spin_lock_irqsave(&ath79_gpio_lock, flags); -+--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -++++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -+@@ -875,6 +875,14 @@ -+ #define QCA953X_GPIO_OUT_MUX_LED_LINK4 44 -+ #define QCA953X_GPIO_OUT_MUX_LED_LINK5 45 -+ -++#define QCA955X_GPIO_REG_OUT_FUNC0 0x2c -++#define QCA955X_GPIO_REG_OUT_FUNC1 0x30 -++#define QCA955X_GPIO_REG_OUT_FUNC2 0x34 -++#define QCA955X_GPIO_REG_OUT_FUNC3 0x38 -++#define QCA955X_GPIO_REG_OUT_FUNC4 0x3c -++#define QCA955X_GPIO_REG_OUT_FUNC5 0x40 -++#define QCA955X_GPIO_REG_FUNC 0x6c -++ -+ #define QCA956X_GPIO_REG_OUT_FUNC0 0x2c -+ #define QCA956X_GPIO_REG_OUT_FUNC1 0x30 -+ #define QCA956X_GPIO_REG_OUT_FUNC2 0x34 -+@@ -1014,6 +1022,8 @@ -+ #define AR934X_GPIO_OUT_EXT_LNA0 46 -+ #define AR934X_GPIO_OUT_EXT_LNA1 47 -+ -++#define QCA955X_GPIO_OUT_GPIO 0 -++ -+ /* -+ * MII_CTRL block -+ */ diff --git a/patches/openwrt/0106-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch b/patches/openwrt/0055-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch similarity index 100% rename from patches/openwrt/0106-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch rename to patches/openwrt/0055-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch diff --git a/patches/openwrt/0056-ar71xx-Add-support-for-ath79_gpio_function_-on-QCA955X.patch b/patches/openwrt/0056-ar71xx-Add-support-for-ath79_gpio_function_-on-QCA955X.patch deleted file mode 100644 index 23b42cb6..00000000 --- a/patches/openwrt/0056-ar71xx-Add-support-for-ath79_gpio_function_-on-QCA955X.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Sven Eckelmann -Date: Wed, 23 Mar 2016 12:52:27 +0000 -Subject: ar71xx: Add support for ath79_gpio_function_* on QCA955X - -Signed-off-by: Sven Eckelmann - -Backport of r49074 - -Forwarded: https://patchwork.ozlabs.org/patch/624183/ - -diff --git a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -index e71b6e2..0e87357 100644 ---- a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -+++ b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -@@ -1,6 +1,16 @@ - --- a/arch/mips/ath79/gpio.c - +++ b/arch/mips/ath79/gpio.c --@@ -187,15 +187,30 @@ void __init ath79_gpio_output_select(uns -+@@ -146,7 +146,8 @@ static void __iomem *ath79_gpio_get_func -+ if (soc_is_ar71xx() || -+ soc_is_ar724x() || -+ soc_is_ar913x() || -+- soc_is_ar933x()) -++ soc_is_ar933x() || -++ soc_is_qca955x()) -+ reg = AR71XX_GPIO_REG_FUNC; -+ else if (soc_is_ar934x() || -+ soc_is_qca953x() || -+@@ -187,15 +188,30 @@ void __init ath79_gpio_output_select(uns - { - void __iomem *base = ath79_gpio_base; - unsigned long flags; diff --git a/patches/openwrt/0107-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch b/patches/openwrt/0056-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch similarity index 100% rename from patches/openwrt/0107-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch rename to patches/openwrt/0056-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch diff --git a/patches/openwrt/0057-ar71xx-Add-QCA955X-GPIO-mux-and-function-definitions.patch b/patches/openwrt/0057-ar71xx-Add-QCA955X-GPIO-mux-and-function-definitions.patch deleted file mode 100644 index ee3c3674..00000000 --- a/patches/openwrt/0057-ar71xx-Add-QCA955X-GPIO-mux-and-function-definitions.patch +++ /dev/null @@ -1,159 +0,0 @@ -From: Sven Eckelmann -Date: Wed, 23 Mar 2016 12:52:31 +0000 -Subject: ar71xx: Add QCA955X GPIO mux and function definitions - -Signed-off-by: Sven Eckelmann - -Backport of r49075 - -Forwarded: https://patchwork.ozlabs.org/patch/624184/ - -diff --git a/target/linux/ar71xx/patches-3.18/601-MIPS-ath79-add-more-register-defines.patch b/target/linux/ar71xx/patches-3.18/601-MIPS-ath79-add-more-register-defines.patch -index 797977f..0126f6a 100644 ---- a/target/linux/ar71xx/patches-3.18/601-MIPS-ath79-add-more-register-defines.patch -+++ b/target/linux/ar71xx/patches-3.18/601-MIPS-ath79-add-more-register-defines.patch -@@ -194,7 +194,7 @@ - #define AR933X_BOOTSTRAP_REF_CLK_40 BIT(0) - - #define AR934X_BOOTSTRAP_SW_OPTION8 BIT(23) --@@ -529,6 +626,12 @@ -+@@ -529,8 +626,22 @@ - #define AR71XX_GPIO_REG_INT_ENABLE 0x24 - #define AR71XX_GPIO_REG_FUNC 0x28 - -@@ -206,8 +206,18 @@ - +#define AR934X_GPIO_REG_OUT_FUNC5 0x40 - #define AR934X_GPIO_REG_FUNC 0x6c - -++#define QCA955X_GPIO_REG_OUT_FUNC0 0x2c -++#define QCA955X_GPIO_REG_OUT_FUNC1 0x30 -++#define QCA955X_GPIO_REG_OUT_FUNC2 0x34 -++#define QCA955X_GPIO_REG_OUT_FUNC3 0x38 -++#define QCA955X_GPIO_REG_OUT_FUNC4 0x3c -++#define QCA955X_GPIO_REG_OUT_FUNC5 0x40 -++#define QCA955X_GPIO_REG_FUNC 0x6c -++ - #define AR71XX_GPIO_COUNT 16 --@@ -560,4 +663,170 @@ -+ #define AR7240_GPIO_COUNT 18 -+ #define AR7241_GPIO_COUNT 20 -+@@ -560,4 +671,235 @@ - #define AR934X_SRIF_DPLL2_OUTDIV_SHIFT 13 - #define AR934X_SRIF_DPLL2_OUTDIV_MASK 0x7 - -@@ -288,6 +298,71 @@ - +#define AR934X_GPIO_OUT_EXT_LNA0 46 - +#define AR934X_GPIO_OUT_EXT_LNA1 47 - + -++#define QCA955X_GPIO_FUNC_CLK_OBS7_EN BIT(9) -++#define QCA955X_GPIO_FUNC_CLK_OBS6_EN BIT(8) -++#define QCA955X_GPIO_FUNC_CLK_OBS5_EN BIT(7) -++#define QCA955X_GPIO_FUNC_CLK_OBS4_EN BIT(6) -++#define QCA955X_GPIO_FUNC_CLK_OBS3_EN BIT(5) -++#define QCA955X_GPIO_FUNC_CLK_OBS2_EN BIT(4) -++#define QCA955X_GPIO_FUNC_CLK_OBS1_EN BIT(3) -++#define QCA955X_GPIO_FUNC_JTAG_DISABLE BIT(1) -++ -++#define QCA955X_GPIO_OUT_GPIO 0 -++#define QCA955X_MII_EXT_MDI 1 -++#define QCA955X_SLIC_DATA_OUT 3 -++#define QCA955X_SLIC_PCM_FS 4 -++#define QCA955X_SLIC_PCM_CLK 5 -++#define QCA955X_SPI_CLK 8 -++#define QCA955X_SPI_CS_0 9 -++#define QCA955X_SPI_CS_1 10 -++#define QCA955X_SPI_CS_2 11 -++#define QCA955X_SPI_MISO 12 -++#define QCA955X_I2S_CLK 13 -++#define QCA955X_I2S_WS 14 -++#define QCA955X_I2S_SD 15 -++#define QCA955X_I2S_MCK 16 -++#define QCA955X_SPDIF_OUT 17 -++#define QCA955X_UART1_TD 18 -++#define QCA955X_UART1_RTS 19 -++#define QCA955X_UART1_RD 20 -++#define QCA955X_UART1_CTS 21 -++#define QCA955X_UART0_SOUT 22 -++#define QCA955X_SPDIF2_OUT 23 -++#define QCA955X_LED_SGMII_SPEED0 24 -++#define QCA955X_LED_SGMII_SPEED1 25 -++#define QCA955X_LED_SGMII_DUPLEX 26 -++#define QCA955X_LED_SGMII_LINK_UP 27 -++#define QCA955X_SGMII_SPEED0_INVERT 28 -++#define QCA955X_SGMII_SPEED1_INVERT 29 -++#define QCA955X_SGMII_DUPLEX_INVERT 30 -++#define QCA955X_SGMII_LINK_UP_INVERT 31 -++#define QCA955X_GE1_MII_MDO 32 -++#define QCA955X_GE1_MII_MDC 33 -++#define QCA955X_SWCOM2 38 -++#define QCA955X_SWCOM3 39 -++#define QCA955X_MAC2_GPIO 40 -++#define QCA955X_MAC3_GPIO 41 -++#define QCA955X_ATT_LED 42 -++#define QCA955X_PWR_LED 43 -++#define QCA955X_TX_FRAME 44 -++#define QCA955X_RX_CLEAR_EXTERNAL 45 -++#define QCA955X_LED_NETWORK_EN 46 -++#define QCA955X_LED_POWER_EN 47 -++#define QCA955X_WMAC_GLUE_WOW 68 -++#define QCA955X_RX_CLEAR_EXTENSION 70 -++#define QCA955X_CP_NAND_CS1 73 -++#define QCA955X_USB_SUSPEND 74 -++#define QCA955X_ETH_TX_ERR 75 -++#define QCA955X_DDR_DQ_OE 76 -++#define QCA955X_CLKREQ_N_EP 77 -++#define QCA955X_CLKREQ_N_RC 78 -++#define QCA955X_CLK_OBS0 79 -++#define QCA955X_CLK_OBS1 80 -++#define QCA955X_CLK_OBS2 81 -++#define QCA955X_CLK_OBS3 82 -++#define QCA955X_CLK_OBS4 83 -++#define QCA955X_CLK_OBS5 84 -++ - +/* - + * MII_CTRL block - + */ -diff --git a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -index 0e87357..8a54859 100644 ---- a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -+++ b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -@@ -37,37 +37,12 @@ - + } - - - if (gpio >= AR934X_GPIO_COUNT) -+- return; - + if (gpio >= gpio_count) -- return; -++ return; - - - reg = AR934X_GPIO_REG_OUT_FUNC0 + 4 * (gpio / 4); - + reg = reg_base + 4 * (gpio / 4); - s = 8 * (gpio % 4); - - spin_lock_irqsave(&ath79_gpio_lock, flags); ----- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h --+++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h --@@ -875,6 +875,14 @@ -- #define QCA953X_GPIO_OUT_MUX_LED_LINK4 44 -- #define QCA953X_GPIO_OUT_MUX_LED_LINK5 45 -- --+#define QCA955X_GPIO_REG_OUT_FUNC0 0x2c --+#define QCA955X_GPIO_REG_OUT_FUNC1 0x30 --+#define QCA955X_GPIO_REG_OUT_FUNC2 0x34 --+#define QCA955X_GPIO_REG_OUT_FUNC3 0x38 --+#define QCA955X_GPIO_REG_OUT_FUNC4 0x3c --+#define QCA955X_GPIO_REG_OUT_FUNC5 0x40 --+#define QCA955X_GPIO_REG_FUNC 0x6c --+ -- #define QCA956X_GPIO_REG_OUT_FUNC0 0x2c -- #define QCA956X_GPIO_REG_OUT_FUNC1 0x30 -- #define QCA956X_GPIO_REG_OUT_FUNC2 0x34 --@@ -1014,6 +1022,8 @@ -- #define AR934X_GPIO_OUT_EXT_LNA0 46 -- #define AR934X_GPIO_OUT_EXT_LNA1 47 -- --+#define QCA955X_GPIO_OUT_GPIO 0 --+ -- /* -- * MII_CTRL block -- */ diff --git a/patches/openwrt/0108-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch b/patches/openwrt/0057-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch similarity index 100% rename from patches/openwrt/0108-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch rename to patches/openwrt/0057-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch diff --git a/patches/openwrt/0058-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR900.patch b/patches/openwrt/0058-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR900.patch deleted file mode 100644 index 6a32c80b..00000000 --- a/patches/openwrt/0058-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR900.patch +++ /dev/null @@ -1,78 +0,0 @@ -From: Sven Eckelmann -Date: Wed, 16 Mar 2016 09:27:11 +0000 -Subject: ar71xx: Use PHY fixups for Open Mesh MR900 - -The delays of PHY/MAC on the MR900 are done by u-boot and OpenWrt in -different ways. u-boot only modifies the ETH_CFG of the QCA955x based on -the link speed. But OpenWrt can only modify the PHY delays based on the -link speed. - -This can lead to communication problems when u-boot initializes the ETH_CFG -for a specific link speed (e.g. 10BASE-T) but then OpenWrt the sets the PHY -delays to an incompatible value. - -Instead reset the ETH_CFG delay bits of the QCA955x to a specific value and -only rely on the AT803x PHY settings. - -Signed-off-by: Sven Eckelmann - -Backport of r49030 - -Forwarded: https://patchwork.ozlabs.org/patch/624185/ - -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -index 9c3164d..3634bf0 100644 ---- a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -@@ -23,6 +23,7 @@ - #include - - #include -+#include - - #include "common.h" - #include "dev-ap9x-pci.h" -@@ -94,15 +95,30 @@ static struct gpio_keys_button mr900_gpio_keys[] __initdata = { - }, - }; - -+static struct at803x_platform_data mr900_at803x_data = { -+ .disable_smarteee = 1, -+ .enable_rgmii_rx_delay = 1, -+ .enable_rgmii_tx_delay = 0, -+ .fixup_rgmii_tx_delay = 1, -+}; -+ -+static struct mdio_board_info mr900_mdio0_info[] = { -+ { -+ .bus_id = "ag71xx-mdio.0", -+ .phy_addr = 5, -+ .platform_data = &mr900_at803x_data, -+ }, -+}; -+ - static void __init mr900_setup(void) - { - u8 *art = (u8 *)KSEG1ADDR(0x1fff0000); - u8 mac[6], pcie_mac[6]; - struct ath9k_platform_data *pdata; - -- ath79_eth0_pll_data.pll_1000 = 0xbe000101; -- ath79_eth0_pll_data.pll_100 = 0x80000101; -- ath79_eth0_pll_data.pll_10 = 0x80001313; -+ ath79_eth0_pll_data.pll_1000 = 0xae000000; -+ ath79_eth0_pll_data.pll_100 = 0xa0000101; -+ ath79_eth0_pll_data.pll_10 = 0xa0001313; - - ath79_register_m25p80(NULL); - -@@ -126,6 +142,9 @@ static void __init mr900_setup(void) - ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN); - ath79_register_mdio(0, 0x0); - -+ mdiobus_register_board_info(mr900_mdio0_info, -+ ARRAY_SIZE(mr900_mdio0_info)); -+ - ath79_init_mac(ath79_eth0_data.mac_addr, art + MR900_MAC0_OFFSET, 0); - - /* GMAC0 is connected to the RMGII interface */ diff --git a/patches/openwrt/0109-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch similarity index 100% rename from patches/openwrt/0109-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch rename to patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch diff --git a/patches/openwrt/0110-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch b/patches/openwrt/0059-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch similarity index 100% rename from patches/openwrt/0110-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch rename to patches/openwrt/0059-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch diff --git a/patches/openwrt/0059-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR1750.patch b/patches/openwrt/0059-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR1750.patch deleted file mode 100644 index 50ff879c..00000000 --- a/patches/openwrt/0059-ar71xx-Use-PHY-fixups-for-Open-Mesh-MR1750.patch +++ /dev/null @@ -1,77 +0,0 @@ -From: Sven Eckelmann -Date: Wed, 16 Mar 2016 09:27:14 +0000 -Subject: ar71xx: Use PHY fixups for Open Mesh MR1750 - -The delays of PHY/MAC on the MR1750 are done by u-boot and OpenWrt in -different ways. u-boot only modifies the ETH_CFG of the QCA955x based on -the link speed. But OpenWrt can only modify the PHY delays based on the -link speed. - -This can lead to communication problems when u-boot initializes the ETH_CFG -for a specific link speed (e.g. 10BASE-T) but then OpenWrt the sets the PHY -delays to an incompatible value. - -Instead reset the ETH_CFG delay bits of the QCA955x to a specific value and -only rely on the AT803x PHY settings. - -Signed-off-by: Sven Eckelmann - -Backport of r49031 - -Forwarded: https://patchwork.ozlabs.org/patch/624186/ - -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -index 8ace02f..f9e45bd 100644 ---- a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -@@ -22,6 +22,7 @@ - #include - - #include -+#include - - #include "common.h" - #include "dev-ap9x-pci.h" -@@ -92,14 +93,29 @@ static struct gpio_keys_button mr1750_gpio_keys[] __initdata = { - }, - }; - -+static struct at803x_platform_data mr1750_at803x_data = { -+ .disable_smarteee = 1, -+ .enable_rgmii_rx_delay = 1, -+ .enable_rgmii_tx_delay = 0, -+ .fixup_rgmii_tx_delay = 1, -+}; -+ -+static struct mdio_board_info mr1750_mdio0_info[] = { -+ { -+ .bus_id = "ag71xx-mdio.0", -+ .phy_addr = 5, -+ .platform_data = &mr1750_at803x_data, -+ }, -+}; -+ - static void __init mr1750_setup(void) - { - u8 *art = (u8 *)KSEG1ADDR(0x1fff0000); - u8 mac[6]; - -- ath79_eth0_pll_data.pll_1000 = 0xbe000101; -- ath79_eth0_pll_data.pll_100 = 0x80000101; -- ath79_eth0_pll_data.pll_10 = 0x80001313; -+ ath79_eth0_pll_data.pll_1000 = 0xae000000; -+ ath79_eth0_pll_data.pll_100 = 0xa0000101; -+ ath79_eth0_pll_data.pll_10 = 0xa0001313; - - ath79_register_m25p80(NULL); - -@@ -116,6 +132,9 @@ static void __init mr1750_setup(void) - ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN); - ath79_register_mdio(0, 0x0); - -+ mdiobus_register_board_info(mr1750_mdio0_info, -+ ARRAY_SIZE(mr1750_mdio0_info)); -+ - ath79_init_mac(ath79_eth0_data.mac_addr, art + MR1750_MAC0_OFFSET, 0); - - /* GMAC0 is connected to the RMGII interface */ diff --git a/patches/openwrt/0060-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR900.patch b/patches/openwrt/0060-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR900.patch deleted file mode 100644 index 3567a32f..00000000 --- a/patches/openwrt/0060-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR900.patch +++ /dev/null @@ -1,58 +0,0 @@ -From: Sven Eckelmann -Date: Wed, 23 Mar 2016 12:52:09 +0000 -Subject: ar71xx: Use private version of ath79_setup_qca955x_eth_cfg for MR900 - -The MR900 must unset some bits in ETH_CFG which were set by u-boot to work -correctly under OpenWrt. But the global function -ath79_setup_qca955x_eth_cfg will not unset all of them to increase the -backward compatiblity with older mach-* files. A private (simplified) -version for MR900 can be used instead. - -Signed-off-by: Sven Eckelmann - -Backport of r49069 - -Forwarded: https://patchwork.ozlabs.org/patch/624187/ - -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -index 3634bf0..b439f58 100644 ---- a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr900.c -@@ -110,6 +110,28 @@ static struct mdio_board_info mr900_mdio0_info[] = { - }, - }; - -+static void __init mr900_setup_qca955x_eth_cfg(u32 mask, -+ unsigned int rxd, -+ unsigned int rxdv, -+ unsigned int txd, -+ unsigned int txe) -+{ -+ void __iomem *base; -+ u32 t; -+ -+ base = ioremap(QCA955X_GMAC_BASE, QCA955X_GMAC_SIZE); -+ -+ t = mask; -+ t |= rxd << QCA955X_ETH_CFG_RXD_DELAY_SHIFT; -+ t |= rxdv << QCA955X_ETH_CFG_RDV_DELAY_SHIFT; -+ t |= txd << QCA955X_ETH_CFG_TXD_DELAY_SHIFT; -+ t |= txe << QCA955X_ETH_CFG_TXE_DELAY_SHIFT; -+ -+ __raw_writel(t, base + QCA955X_GMAC_REG_ETH_CFG); -+ -+ iounmap(base); -+} -+ - static void __init mr900_setup(void) - { - u8 *art = (u8 *)KSEG1ADDR(0x1fff0000); -@@ -139,7 +161,7 @@ static void __init mr900_setup(void) - } - pdata->use_eeprom = true; - -- ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN); -+ mr900_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN, 3, 3, 0, 0); - ath79_register_mdio(0, 0x0); - - mdiobus_register_board_info(mr900_mdio0_info, diff --git a/patches/openwrt/0111-x86-generic-enable-CONFIG_SATA_VIA.patch b/patches/openwrt/0060-x86-generic-enable-CONFIG_SATA_VIA.patch similarity index 100% rename from patches/openwrt/0111-x86-generic-enable-CONFIG_SATA_VIA.patch rename to patches/openwrt/0060-x86-generic-enable-CONFIG_SATA_VIA.patch diff --git a/patches/openwrt/0061-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR1750.patch b/patches/openwrt/0061-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR1750.patch deleted file mode 100644 index 8ea16499..00000000 --- a/patches/openwrt/0061-ar71xx-Use-private-version-of-ath79_setup_qca955x_eth_cfg-for-MR1750.patch +++ /dev/null @@ -1,58 +0,0 @@ -From: Sven Eckelmann -Date: Wed, 23 Mar 2016 12:52:12 +0000 -Subject: ar71xx: Use private version of ath79_setup_qca955x_eth_cfg for MR1750 - -The MR1750 must unset some bits in ETH_CFG which were set by u-boot to work -correctly under OpenWrt. But the global function -ath79_setup_qca955x_eth_cfg will not unset all of them to increase the -backward compatiblity with older mach-* files. A private (simplified) -version for MR1750 can be used instead. - -Signed-off-by: Sven Eckelmann - -Backport of r49070 - -Forwarded: https://patchwork.ozlabs.org/patch/624188/ - -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -index f9e45bd..e3c04e7 100644 ---- a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -@@ -108,6 +108,28 @@ static struct mdio_board_info mr1750_mdio0_info[] = { - }, - }; - -+static void __init mr1750_setup_qca955x_eth_cfg(u32 mask, -+ unsigned int rxd, -+ unsigned int rxdv, -+ unsigned int txd, -+ unsigned int txe) -+{ -+ void __iomem *base; -+ u32 t; -+ -+ base = ioremap(QCA955X_GMAC_BASE, QCA955X_GMAC_SIZE); -+ -+ t = mask; -+ t |= rxd << QCA955X_ETH_CFG_RXD_DELAY_SHIFT; -+ t |= rxdv << QCA955X_ETH_CFG_RDV_DELAY_SHIFT; -+ t |= txd << QCA955X_ETH_CFG_TXD_DELAY_SHIFT; -+ t |= txe << QCA955X_ETH_CFG_TXE_DELAY_SHIFT; -+ -+ __raw_writel(t, base + QCA955X_GMAC_REG_ETH_CFG); -+ -+ iounmap(base); -+} -+ - static void __init mr1750_setup(void) - { - u8 *art = (u8 *)KSEG1ADDR(0x1fff0000); -@@ -129,7 +151,7 @@ static void __init mr1750_setup(void) - ath79_register_wmac(art + MR1750_WMAC_CALDATA_OFFSET, mac); - ath79_register_pci(); - -- ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN); -+ mr1750_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN, 3, 3, 0, 0); - ath79_register_mdio(0, 0x0); - - mdiobus_register_board_info(mr1750_mdio0_info, diff --git a/patches/openwrt/0112-libpcap-fix-dependency-of-install-shared-so-make-target.patch b/patches/openwrt/0061-libpcap-fix-dependency-of-install-shared-so-make-target.patch similarity index 100% rename from patches/openwrt/0112-libpcap-fix-dependency-of-install-shared-so-make-target.patch rename to patches/openwrt/0061-libpcap-fix-dependency-of-install-shared-so-make-target.patch diff --git a/patches/openwrt/0113-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch b/patches/openwrt/0062-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch similarity index 100% rename from patches/openwrt/0113-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch rename to patches/openwrt/0062-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch diff --git a/patches/openwrt/0062-scripts-om-fwupgradecfg-gen.sh-Fix-u-boot-image-md5sum-check.patch b/patches/openwrt/0062-scripts-om-fwupgradecfg-gen.sh-Fix-u-boot-image-md5sum-check.patch deleted file mode 100644 index 30658cdb..00000000 --- a/patches/openwrt/0062-scripts-om-fwupgradecfg-gen.sh-Fix-u-boot-image-md5sum-check.patch +++ /dev/null @@ -1,43 +0,0 @@ -From: Sven Eckelmann -Date: Mon, 14 Sep 2015 20:10:10 +0000 -Subject: scripts/om-fwupgradecfg-gen.sh: Fix u-boot image md5sum check - -The u-boot on Open Mesh devices checks the whole transfered image against a -md5sum. This is stored inside the option filemd5sum inside the -fwupgrade.cfg. The bootloader will not check it when this setting is -missing and could therefore write invalid images to the flash. - -Signed-off-by: Sven Eckelmann - -Backport of r46925 - -Forwarded: https://patchwork.ozlabs.org/patch/624189/ - -diff --git a/scripts/om-fwupgradecfg-gen.sh b/scripts/om-fwupgradecfg-gen.sh -index c790214..fab1582 100644 ---- a/scripts/om-fwupgradecfg-gen.sh -+++ b/scripts/om-fwupgradecfg-gen.sh -@@ -48,6 +48,7 @@ ROOTFS_FLASH_ADDR=$(addr=$(($KERNEL_FLASH_ADDR + ($KERNEL_PART_SIZE * 1024))); p - ROOTFS_SIZE=$(stat -c%s "$ROOTFS_PATH") - ROOTFS_CHECK_BLOCKS=$((($ROOTFS_SIZE / $CHECK_BS) - $MD5_SKIP_BLOCKS)) - ROOTFS_MD5=$(md5=$(dd if=$ROOTFS_PATH bs=$CHECK_BS count=$ROOTFS_CHECK_BLOCKS 2>&- | md5sum); echo ${md5%% *}) -+ROOTFS_MD5_FULL=$(md5=$(md5sum $ROOTFS_PATH); echo ${md5%% *}) - ROOTFS_CHECK_SIZE=$(printf '0x%x' $(($ROOTFS_CHECK_BLOCKS * $CHECK_BS))) - ROOTFS_PART_SIZE=$(($MAX_PART_SIZE - $KERNEL_PART_SIZE)) - -@@ -55,6 +56,7 @@ cat << EOF > $CFG_OUT - [vmlinux] - filename=kernel - md5sum=$KERNEL_MD5 -+filemd5sum=$KERNEL_MD5 - flashaddr=$KERNEL_FLASH_ADDR - checksize=0x0 - cmd_success=setenv bootseq 1,2; setenv kernel_size_1 $KERNEL_PART_SIZE; saveenv -@@ -63,6 +65,7 @@ cmd_fail=reset - [rootfs] - filename=rootfs - md5sum=$ROOTFS_MD5 -+filemd5sum=$ROOTFS_MD5_FULL - flashaddr=$ROOTFS_FLASH_ADDR - checksize=$ROOTFS_CHECK_SIZE - cmd_success=setenv bootseq 1,2; setenv kernel_size_1 $KERNEL_PART_SIZE; setenv rootfs_size_1 $ROOTFS_PART_SIZE; saveenv diff --git a/patches/openwrt/0114-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch b/patches/openwrt/0063-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch similarity index 100% rename from patches/openwrt/0114-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch rename to patches/openwrt/0063-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch diff --git a/patches/openwrt/0063-scripts-om-fwupgradecfg-gen.sh-Generate-sha256sum-for-uboot-verification.patch b/patches/openwrt/0063-scripts-om-fwupgradecfg-gen.sh-Generate-sha256sum-for-uboot-verification.patch deleted file mode 100644 index 01bb37b5..00000000 --- a/patches/openwrt/0063-scripts-om-fwupgradecfg-gen.sh-Generate-sha256sum-for-uboot-verification.patch +++ /dev/null @@ -1,50 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:25:42 +0000 -Subject: scripts/om-fwupgradecfg-gen.sh: Generate sha256sum for uboot verification - -Future Open Mesh u-boot versions are changing the check of the image files -(vmlinux, rootfs) from md5 to sha256. Having both in them should be enough -to ensure backward and forward compatibility. - -Signed-off-by: Sven Eckelmann - -Backport of r49140 - -Forwarded: https://patchwork.ozlabs.org/patch/624190/ - -diff --git a/scripts/om-fwupgradecfg-gen.sh b/scripts/om-fwupgradecfg-gen.sh -index fab1582..e208e6d 100644 ---- a/scripts/om-fwupgradecfg-gen.sh -+++ b/scripts/om-fwupgradecfg-gen.sh -@@ -42,6 +42,7 @@ CHECK_BS=65536 - - KERNEL_SIZE=$(stat -c%s "$KERNEL_PATH") - KERNEL_MD5=$(md5=$(md5sum $KERNEL_PATH); echo ${md5%% *}) -+KERNEL_SHA256=$(openssl dgst -sha256 $KERNEL_PATH | awk '{print $2}') - KERNEL_PART_SIZE=$(size=$(($KERNEL_SIZE / $FLASH_BS)); [ $(($size * $FLASH_BS)) -lt $KERNEL_SIZE ] && size=$(($size + 1)); echo $(($size * $FLASH_BS / 1024))) - - ROOTFS_FLASH_ADDR=$(addr=$(($KERNEL_FLASH_ADDR + ($KERNEL_PART_SIZE * 1024))); printf "0x%x" $addr) -@@ -49,6 +50,7 @@ ROOTFS_SIZE=$(stat -c%s "$ROOTFS_PATH") - ROOTFS_CHECK_BLOCKS=$((($ROOTFS_SIZE / $CHECK_BS) - $MD5_SKIP_BLOCKS)) - ROOTFS_MD5=$(md5=$(dd if=$ROOTFS_PATH bs=$CHECK_BS count=$ROOTFS_CHECK_BLOCKS 2>&- | md5sum); echo ${md5%% *}) - ROOTFS_MD5_FULL=$(md5=$(md5sum $ROOTFS_PATH); echo ${md5%% *}) -+ROOTFS_SHA256_FULL=$(openssl dgst -sha256 $ROOTFS_PATH | awk '{print $2}') - ROOTFS_CHECK_SIZE=$(printf '0x%x' $(($ROOTFS_CHECK_BLOCKS * $CHECK_BS))) - ROOTFS_PART_SIZE=$(($MAX_PART_SIZE - $KERNEL_PART_SIZE)) - -@@ -57,6 +59,7 @@ cat << EOF > $CFG_OUT - filename=kernel - md5sum=$KERNEL_MD5 - filemd5sum=$KERNEL_MD5 -+filesha256sum=$KERNEL_SHA256 - flashaddr=$KERNEL_FLASH_ADDR - checksize=0x0 - cmd_success=setenv bootseq 1,2; setenv kernel_size_1 $KERNEL_PART_SIZE; saveenv -@@ -66,6 +69,7 @@ cmd_fail=reset - filename=rootfs - md5sum=$ROOTFS_MD5 - filemd5sum=$ROOTFS_MD5_FULL -+filesha256sum=$ROOTFS_SHA256_FULL - flashaddr=$ROOTFS_FLASH_ADDR - checksize=$ROOTFS_CHECK_SIZE - cmd_success=setenv bootseq 1,2; setenv kernel_size_1 $KERNEL_PART_SIZE; setenv rootfs_size_1 $ROOTFS_PART_SIZE; saveenv diff --git a/patches/openwrt/0064-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-AC-board.patch b/patches/openwrt/0064-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-AC-board.patch deleted file mode 100644 index f3f8b253..00000000 --- a/patches/openwrt/0064-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-AC-board.patch +++ /dev/null @@ -1,265 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:25:47 +0000 -Subject: ar71xx: add kernel support for the OpenMesh OM5P-AC board - -Signed-off-by: Sven Eckelmann - -Backport of r49141 - -Forwarded: https://patchwork.ozlabs.org/patch/624191/ - -diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index c5a3c9a..dd89357 100644 ---- a/target/linux/ar71xx/config-3.18 -+++ b/target/linux/ar71xx/config-3.18 -@@ -91,6 +91,7 @@ CONFIG_ATH79_MACH_NBG460N=y - CONFIG_ATH79_MACH_NBG6716=y - CONFIG_ATH79_MACH_OM2P=y - CONFIG_ATH79_MACH_OM5P=y -+CONFIG_ATH79_MACH_OM5P_AC=y - CONFIG_ATH79_MACH_ONION_OMEGA=y - CONFIG_ATH79_MACH_PB42=y - CONFIG_ATH79_MACH_PB44=y -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-om5pac.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-om5pac.c -new file mode 100644 -index 0000000..f6974af ---- /dev/null -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-om5pac.c -@@ -0,0 +1,193 @@ -+/* -+ * OpenMesh OM5P-AC support -+ * -+ * Copyright (C) 2013 Marek Lindner -+ * Copyright (C) 2014 Sven Eckelmann -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published -+ * by the Free Software Foundation. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "common.h" -+#include "dev-ap9x-pci.h" -+#include "dev-eth.h" -+#include "dev-leds-gpio.h" -+#include "dev-m25p80.h" -+#include "dev-wmac.h" -+#include "machtypes.h" -+#include "pci.h" -+ -+#define OM5PAC_GPIO_LED_POWER 18 -+#define OM5PAC_GPIO_LED_GREEN 21 -+#define OM5PAC_GPIO_LED_RED 23 -+#define OM5PAC_GPIO_LED_YELLOW 22 -+#define OM5PAC_GPIO_LED_LAN 20 -+#define OM5PAC_GPIO_LED_WAN 19 -+#define OM5PAC_GPIO_I2C_SCL 12 -+#define OM5PAC_GPIO_I2C_SDA 11 -+ -+#define OM5PAC_KEYS_POLL_INTERVAL 20 /* msecs */ -+#define OM5PAC_KEYS_DEBOUNCE_INTERVAL (3 * OM5PAC_KEYS_POLL_INTERVAL) -+ -+#define OM5PAC_WMAC_CALDATA_OFFSET 0x1000 -+ -+static struct gpio_led om5pac_leds_gpio[] __initdata = { -+ { -+ .name = "om5pac:blue:power", -+ .gpio = OM5PAC_GPIO_LED_POWER, -+ .active_low = 1, -+ }, { -+ .name = "om5pac:red:wifi", -+ .gpio = OM5PAC_GPIO_LED_RED, -+ .active_low = 1, -+ }, { -+ .name = "om5pac:yellow:wifi", -+ .gpio = OM5PAC_GPIO_LED_YELLOW, -+ .active_low = 1, -+ }, { -+ .name = "om5pac:green:wifi", -+ .gpio = OM5PAC_GPIO_LED_GREEN, -+ .active_low = 1, -+ }, { -+ .name = "om5pac:blue:lan", -+ .gpio = OM5PAC_GPIO_LED_LAN, -+ .active_low = 1, -+ }, { -+ .name = "om5pac:blue:wan", -+ .gpio = OM5PAC_GPIO_LED_WAN, -+ .active_low = 1, -+ } -+}; -+ -+static struct flash_platform_data om5pac_flash_data = { -+ .type = "mx25l12805d", -+}; -+ -+static struct i2c_gpio_platform_data om5pac_i2c_device_platdata = { -+ .sda_pin = OM5PAC_GPIO_I2C_SDA, -+ .scl_pin = OM5PAC_GPIO_I2C_SCL, -+ .udelay = 10, -+ .sda_is_open_drain = 1, -+ .scl_is_open_drain = 1, -+}; -+ -+static struct platform_device om5pac_i2c_device = { -+ .name = "i2c-gpio", -+ .id = 0, -+ .dev = { -+ .platform_data = &om5pac_i2c_device_platdata, -+ }, -+}; -+ -+static struct i2c_board_info om5pac_i2c_devs[] __initdata = { -+ { -+ I2C_BOARD_INFO("tmp423", 0x4c), -+ }, -+}; -+ -+static struct at803x_platform_data om5pac_at803x_data = { -+ .disable_smarteee = 1, -+ .enable_rgmii_rx_delay = 1, -+ .enable_rgmii_tx_delay = 1, -+}; -+ -+static struct mdio_board_info om5pac_mdio0_info[] = { -+ { -+ .bus_id = "ag71xx-mdio.0", -+ .phy_addr = 1, -+ .platform_data = &om5pac_at803x_data, -+ }, -+ { -+ .bus_id = "ag71xx-mdio.0", -+ .phy_addr = 2, -+ .platform_data = &om5pac_at803x_data, -+ }, -+}; -+ -+static void __init om5p_ac_setup_qca955x_eth_cfg(u32 mask, -+ unsigned int rxd, -+ unsigned int rxdv, -+ unsigned int txd, -+ unsigned int txe) -+{ -+ void __iomem *base; -+ u32 t; -+ -+ base = ioremap(QCA955X_GMAC_BASE, QCA955X_GMAC_SIZE); -+ -+ t = mask; -+ t |= rxd << QCA955X_ETH_CFG_RXD_DELAY_SHIFT; -+ t |= rxdv << QCA955X_ETH_CFG_RDV_DELAY_SHIFT; -+ t |= txd << QCA955X_ETH_CFG_TXD_DELAY_SHIFT; -+ t |= txe << QCA955X_ETH_CFG_TXE_DELAY_SHIFT; -+ -+ __raw_writel(t, base + QCA955X_GMAC_REG_ETH_CFG); -+ -+ iounmap(base); -+} -+ -+static void __init om5p_ac_setup(void) -+{ -+ u8 *art = (u8 *)KSEG1ADDR(0x1fff0000); -+ u8 mac[6]; -+ -+ /* temperature sensor */ -+ platform_device_register(&om5pac_i2c_device); -+ i2c_register_board_info(0, om5pac_i2c_devs, -+ ARRAY_SIZE(om5pac_i2c_devs)); -+ -+ ath79_gpio_output_select(OM5PAC_GPIO_LED_WAN, QCA955X_GPIO_OUT_GPIO); -+ -+ ath79_register_m25p80(&om5pac_flash_data); -+ ath79_register_leds_gpio(-1, ARRAY_SIZE(om5pac_leds_gpio), -+ om5pac_leds_gpio); -+ -+ ath79_init_mac(mac, art, 0x02); -+ ath79_register_wmac(art + OM5PAC_WMAC_CALDATA_OFFSET, mac); -+ -+ om5p_ac_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN, 3, 3, 0, 0); -+ ath79_register_mdio(0, 0x0); -+ -+ mdiobus_register_board_info(om5pac_mdio0_info, -+ ARRAY_SIZE(om5pac_mdio0_info)); -+ -+ ath79_init_mac(ath79_eth0_data.mac_addr, art, 0x00); -+ ath79_init_mac(ath79_eth1_data.mac_addr, art, 0x01); -+ -+ /* GMAC0 is connected to the PHY1 */ -+ ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII; -+ ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev; -+ ath79_eth0_data.phy_mask = BIT(1); -+ ath79_eth0_pll_data.pll_1000 = 0x82000101; -+ ath79_eth0_pll_data.pll_100 = 0x80000101; -+ ath79_eth0_pll_data.pll_10 = 0x80001313; -+ ath79_register_eth(0); -+ -+ /* GMAC1 is connected to MDIO1 in SGMII mode */ -+ ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII; -+ ath79_eth1_data.mii_bus_dev = &ath79_mdio0_device.dev; -+ ath79_eth1_data.phy_mask = BIT(2); -+ ath79_eth1_pll_data.pll_1000 = 0x03000101; -+ ath79_eth1_pll_data.pll_100 = 0x80000101; -+ ath79_eth1_pll_data.pll_10 = 0x80001313; -+ ath79_eth1_data.speed = SPEED_1000; -+ ath79_eth1_data.duplex = DUPLEX_FULL; -+ ath79_register_eth(1); -+ -+ ath79_register_pci(); -+} -+ -+MIPS_MACHINE(ATH79_MACH_OM5P_AC, "OM5P-AC", "OpenMesh OM5P AC", om5p_ac_setup); -diff --git a/target/linux/ar71xx/patches-3.18/815-MIPS-ath79-add-om5pac-support.patch b/target/linux/ar71xx/patches-3.18/815-MIPS-ath79-add-om5pac-support.patch -new file mode 100644 -index 0000000..4accd03 ---- /dev/null -+++ b/target/linux/ar71xx/patches-3.18/815-MIPS-ath79-add-om5pac-support.patch -@@ -0,0 +1,38 @@ -+--- a/arch/mips/ath79/Kconfig -++++ b/arch/mips/ath79/Kconfig -+@@ -799,6 +799,15 @@ config ATH79_MACH_OM5P -+ select ATH79_DEV_M25P80 -+ select ATH79_DEV_WMAC -+ -++config ATH79_MACH_OM5P_AC -++ bool "OpenMesh OM5P-AC board support" -++ select SOC_QCA955X -++ select ATH79_DEV_AP9X_PCI if PCI -++ select ATH79_DEV_ETH -++ select ATH79_DEV_LEDS_GPIO -++ select ATH79_DEV_M25P80 -++ select ATH79_DEV_WMAC -++ -+ config ATH79_MACH_ONION_OMEGA -+ bool "ONION OMEGA support" -+ select SOC_AR933X -+--- a/arch/mips/ath79/Makefile -++++ b/arch/mips/ath79/Makefile -+@@ -100,6 +100,7 @@ obj-$(CONFIG_ATH79_MACH_MZK_W300NH) += m -+ obj-$(CONFIG_ATH79_MACH_NBG460N) += mach-nbg460n.o -+ obj-$(CONFIG_ATH79_MACH_OM2P) += mach-om2p.o -+ obj-$(CONFIG_ATH79_MACH_OM5P) += mach-om5p.o -++obj-$(CONFIG_ATH79_MACH_OM5P_AC) += mach-om5pac.o -+ obj-$(CONFIG_ATH79_MACH_ONION_OMEGA) += mach-onion-omega.o -+ obj-$(CONFIG_ATH79_MACH_PB42) += mach-pb42.o -+ obj-$(CONFIG_ATH79_MACH_PB44) += mach-pb44.o -+--- a/arch/mips/ath79/machtypes.h -++++ b/arch/mips/ath79/machtypes.h -+@@ -95,6 +95,7 @@ enum ath79_mach_type { -+ ATH79_MACH_OM2P_LC, /* OpenMesh OM2P-LC */ -+ ATH79_MACH_OM2Pv2, /* OpenMesh OM2Pv2 */ -+ ATH79_MACH_OM2P, /* OpenMesh OM2P */ -++ ATH79_MACH_OM5P_AC, /* OpenMesh OM5P-AC */ -+ ATH79_MACH_OM5P_AN, /* OpenMesh OM5P-AN */ -+ ATH79_MACH_OM5P, /* OpenMesh OM5P */ -+ ATH79_MACH_ONION_OMEGA, /* ONION OMEGA */ diff --git a/patches/openwrt/0115-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch b/patches/openwrt/0064-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch similarity index 100% rename from patches/openwrt/0115-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch rename to patches/openwrt/0064-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch diff --git a/patches/openwrt/0065-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-AC.patch b/patches/openwrt/0065-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-AC.patch deleted file mode 100644 index 7161fdca..00000000 --- a/patches/openwrt/0065-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-AC.patch +++ /dev/null @@ -1,54 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:25:51 +0000 -Subject: ar71xx: add user-space support for the OpenMesh OM5P-AC - -Signed-off-by: Sven Eckelmann - -Backport of r49142 - -Forwarded: https://patchwork.ozlabs.org/patch/624192/ - -diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 44d2ddf..a4051f2 100644 ---- a/target/linux/ar71xx/base-files/etc/diag.sh -+++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -178,6 +178,9 @@ get_status_led() { - om5p-an) - status_led="om5p:blue:power" - ;; -+ om5p-ac) -+ status_led="om5pac:blue:power" -+ ;; - onion-omega) - status_led="onion:amber:system" - ;; -diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index c451124..9a768cd 100644 ---- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -304,6 +304,11 @@ om5p-an) - ucidef_set_led_netdev "port2" "port2" "om5p:blue:lan" "eth1" - ;; - -+om5p-ac) -+ ucidef_set_led_netdev "port1" "port1" "om5pac:blue:lan" "eth0" -+ ucidef_set_led_netdev "port2" "port2" "om5pac:blue:wan" "eth1" -+ ;; -+ - qihoo-c301) - ucidef_set_led_wlan "wlan2g" "WLAN2G" "qihoo:red:status" "phy1tpt" - ;; -diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 587d029..10b8048 100755 ---- a/target/linux/ar71xx/base-files/lib/ar71xx.sh -+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -616,6 +616,9 @@ ar71xx_board_detect() { - *"OM5P AN") - name="om5p-an" - ;; -+ *"OM5P AC") -+ name="om5p-ac" -+ ;; - *"Onion Omega") - name="onion-omega" - ;; diff --git a/patches/openwrt/0116-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch b/patches/openwrt/0065-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch similarity index 100% rename from patches/openwrt/0116-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch rename to patches/openwrt/0065-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch diff --git a/patches/openwrt/0117-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch b/patches/openwrt/0066-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch similarity index 100% rename from patches/openwrt/0117-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch rename to patches/openwrt/0066-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch diff --git a/patches/openwrt/0066-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-OM5P-AC.patch b/patches/openwrt/0066-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-OM5P-AC.patch deleted file mode 100644 index 4b6311e2..00000000 --- a/patches/openwrt/0066-scripts-om-fwupgradecfg-gen.sh-add-support-for-the-OM5P-AC.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:25:54 +0000 -Subject: scripts/om-fwupgradecfg-gen.sh: add support for the OM5P-AC - -Signed-off-by: Sven Eckelmann - -Backport of r49143 - -Forwarded: https://patchwork.ozlabs.org/patch/624193/ - -diff --git a/scripts/om-fwupgradecfg-gen.sh b/scripts/om-fwupgradecfg-gen.sh -index e208e6d..6c3b74c 100644 ---- a/scripts/om-fwupgradecfg-gen.sh -+++ b/scripts/om-fwupgradecfg-gen.sh -@@ -7,7 +7,7 @@ - # - - usage() { -- echo "Usage: $0 " -+ echo "Usage: $0 " - rm -f $CFG_OUT - exit 1 - } -@@ -26,7 +26,7 @@ case $CE_TYPE in - FLASH_BS=262144 - MD5_SKIP_BLOCKS=1 - ;; -- OM5P|MR600|MR900|MR1750) -+ OM5P|OM5PAC|MR600|MR900|MR1750) - MAX_PART_SIZE=7808 - KERNEL_FLASH_ADDR=0xb0000 - FLASH_BS=65536 diff --git a/patches/openwrt/0067-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-AC.patch b/patches/openwrt/0067-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-AC.patch deleted file mode 100644 index ae08198a..00000000 --- a/patches/openwrt/0067-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-AC.patch +++ /dev/null @@ -1,59 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:25:57 +0000 -Subject: ar71xx: enable sysupgrade for the OpenMesh OM5P-AC - -Signed-off-by: Sven Eckelmann - -Backport of r49144 - -Forwarded: https://patchwork.ozlabs.org/patch/624194/ - -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -index 9ca0f5b..1cfead9 100644 ---- a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -@@ -72,6 +72,11 @@ platform_check_image_openmesh() - echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" - return 1 - ;; -+ OM5PAC) -+ [ "$board" = "om5p-ac" ] && break -+ echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" -+ return 1 -+ ;; - MR1750) - [ "$board" = "mr1750" ] && break - echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" -@@ -162,7 +167,7 @@ platform_do_upgrade_openmesh() - kernel_start_addr1=0x9f1c0000 - kernel_start_addr2=0x9f8c0000 - ;; -- OM5P|MR600|MR900|MR1750) -+ OM5P|OM5PAC|MR600|MR900|MR1750) - block_size=$((64 * 1024)) - total_size=7995392 - kernel_start_addr1=0x9f0b0000 -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index ac060ea..67c0661 100755 ---- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -307,7 +307,8 @@ platform_check_image() { - om2p-hsv2 | \ - om2p-lc | \ - om5p | \ -- om5p-an) -+ om5p-an | \ -+ om5p-ac) - platform_check_image_openmesh "$magic_long" "$1" && return 0 - return 1 - ;; -@@ -540,7 +541,8 @@ platform_do_upgrade() { - om2p-hsv2 | \ - om2p-lc | \ - om5p | \ -- om5p-an) -+ om5p-an | \ -+ om5p-ac) - platform_do_upgrade_openmesh "$ARGV" - ;; - unifi-outdoor-plus | \ diff --git a/patches/openwrt/0118-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch b/patches/openwrt/0067-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch similarity index 100% rename from patches/openwrt/0118-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch rename to patches/openwrt/0067-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch diff --git a/patches/openwrt/0119-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch b/patches/openwrt/0068-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch similarity index 100% rename from patches/openwrt/0119-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch rename to patches/openwrt/0068-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch diff --git a/patches/openwrt/0068-om-watchdog-add-OpenMesh-OM5P-AC-support.patch b/patches/openwrt/0068-om-watchdog-add-OpenMesh-OM5P-AC-support.patch deleted file mode 100644 index c2d2e225..00000000 --- a/patches/openwrt/0068-om-watchdog-add-OpenMesh-OM5P-AC-support.patch +++ /dev/null @@ -1,24 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:01 +0000 -Subject: om-watchdog: add OpenMesh OM5P-AC support - -Signed-off-by: Sven Eckelmann - -Backport of r49145 - -Forwarded: https://patchwork.ozlabs.org/patch/624195/ - -diff --git a/package/kernel/om-watchdog/files/om-watchdog.init b/package/kernel/om-watchdog/files/om-watchdog.init -index c792968..8cec13b 100644 ---- a/package/kernel/om-watchdog/files/om-watchdog.init -+++ b/package/kernel/om-watchdog/files/om-watchdog.init -@@ -22,6 +22,9 @@ boot() { - "om5p"|"om5p-an") - service_start /sbin/om-watchdog 11 - ;; -+ "om5p-ac") -+ service_start /sbin/om-watchdog 17 -+ ;; - "mr600v2") - service_start /sbin/om-watchdog 15 - ;; diff --git a/patches/openwrt/0120-ar71xx-Added-support-for-TL-WA801NDv3.patch b/patches/openwrt/0069-ar71xx-Added-support-for-TL-WA801NDv3.patch similarity index 100% rename from patches/openwrt/0120-ar71xx-Added-support-for-TL-WA801NDv3.patch rename to patches/openwrt/0069-ar71xx-Added-support-for-TL-WA801NDv3.patch diff --git a/patches/openwrt/0069-uboot-envtools-add-OpenMesh-OM5P-AC-support.patch b/patches/openwrt/0069-uboot-envtools-add-OpenMesh-OM5P-AC-support.patch deleted file mode 100644 index 0d7b312e..00000000 --- a/patches/openwrt/0069-uboot-envtools-add-OpenMesh-OM5P-AC-support.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:04 +0000 -Subject: uboot-envtools: add OpenMesh OM5P-AC support - -Signed-off-by: Sven Eckelmann - -Backport of r49146 - -Forwarded: https://patchwork.ozlabs.org/patch/624196/ - -diff --git a/package/boot/uboot-envtools/files/ar71xx b/package/boot/uboot-envtools/files/ar71xx -index ef00f17..657b25f 100644 ---- a/package/boot/uboot-envtools/files/ar71xx -+++ b/package/boot/uboot-envtools/files/ar71xx -@@ -28,6 +28,7 @@ mr900 | \ - mr900v2 | \ - nbg6716 | \ - om5p-an | \ -+om5p-ac | \ - om5p | \ - tube2h | \ - wndr3700) diff --git a/patches/openwrt/0070-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-AC-board.patch b/patches/openwrt/0070-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-AC-board.patch deleted file mode 100644 index 0cd9fec5..00000000 --- a/patches/openwrt/0070-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-AC-board.patch +++ /dev/null @@ -1,25 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:08 +0000 -Subject: ar71xx: extract ath10k wifi board.bin for the OpenMesh OM5P-AC board - -Signed-off-by: Sven Eckelmann - -Backport of r49147 - -Forwarded: https://patchwork.ozlabs.org/patch/624197/ - -diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index cde7aaf..c1f4b85 100644 ---- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -+++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -@@ -96,6 +96,10 @@ case "$FIRMWARE" in - rb-911g-5hpacd) - ath10kcal_from_file "/sys/firmware/routerboot/ext_wlan_data" 20480 2116 - ;; -+ om5p-ac) -+ ath10kcal_extract "ART" 20480 2116 -+ ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16) -+ ;; - esac - ;; - *) diff --git a/patches/openwrt/0121-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch b/patches/openwrt/0070-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch similarity index 100% rename from patches/openwrt/0121-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch rename to patches/openwrt/0070-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch diff --git a/patches/openwrt/0122-ar71xx-backport-support-for-new-TP-Link-region-codes.patch b/patches/openwrt/0071-ar71xx-backport-support-for-new-TP-Link-region-codes.patch similarity index 100% rename from patches/openwrt/0122-ar71xx-backport-support-for-new-TP-Link-region-codes.patch rename to patches/openwrt/0071-ar71xx-backport-support-for-new-TP-Link-region-codes.patch diff --git a/patches/openwrt/0071-ar71xx-create-profile-and-build-image-for-the-OpenMesh-OM5P-AC-board.patch b/patches/openwrt/0071-ar71xx-create-profile-and-build-image-for-the-OpenMesh-OM5P-AC-board.patch deleted file mode 100644 index 170aba91..00000000 --- a/patches/openwrt/0071-ar71xx-create-profile-and-build-image-for-the-OpenMesh-OM5P-AC-board.patch +++ /dev/null @@ -1,53 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:11 +0000 -Subject: ar71xx: create profile and build image for the OpenMesh OM5P-AC board - -Signed-off-by: Sven Eckelmann - -Backport of r49148 - -Forwarded: https://patchwork.ozlabs.org/patch/624198/ - -diff --git a/target/linux/ar71xx/generic/profiles/openmesh.mk b/target/linux/ar71xx/generic/profiles/openmesh.mk -index 06cf135..64aaa24 100644 ---- a/target/linux/ar71xx/generic/profiles/openmesh.mk -+++ b/target/linux/ar71xx/generic/profiles/openmesh.mk -@@ -27,6 +27,17 @@ endef - - $(eval $(call Profile,OM5P)) - -+define Profile/OM5PAC -+ NAME:=OpenMesh OM5P-AC -+ PACKAGES:=kmod-ath9k kmod-ath10k om-watchdog ath10k-firmware-qca988x -+endef -+ -+define Profile/OM5PAC/Description -+ Package set optimized for the OpenMesh OM5P-AC. -+endef -+ -+$(eval $(call Profile,OM5PAC)) -+ - define Profile/MR600 - NAME:=OpenMesh MR600 - PACKAGES:=kmod-ath9k om-watchdog -diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 0ebb7dc..0cf1df1 100644 ---- a/target/linux/ar71xx/image/Makefile -+++ b/target/linux/ar71xx/image/Makefile -@@ -2043,6 +2043,7 @@ $(eval $(call SingleProfile,Netgear,64kraw,WPN824N,wpn824n,WPN824N,ttyS0,115200, - - $(eval $(call SingleProfile,OpenMesh,squashfs-only,OM2P,om2p,,,,OM2P)) - $(eval $(call SingleProfile,OpenMesh,squashfs-only,OM5P,om5p,,,,OM5P)) -+$(eval $(call SingleProfile,OpenMesh,squashfs-only,OM5PAC,om5pac,,,,OM5PAC)) - $(eval $(call SingleProfile,OpenMesh,squashfs-only,MR600,mr600,,,,MR600)) - $(eval $(call SingleProfile,OpenMesh,squashfs-only,MR900,mr900,,,,MR900)) - $(eval $(call SingleProfile,OpenMesh,squashfs-only,MR1750,mr1750,,,,MR1750)) -@@ -2139,7 +2140,7 @@ $(eval $(call MultiProfile,AP121,AP121_2M AP121_4M)) - $(eval $(call MultiProfile,DIR615IX,DIR615I1 DIR615I3)) - $(eval $(call MultiProfile,AP136,AP136_010 AP136_020)) - $(eval $(call MultiProfile,EWDORIN, EWDORINAP EWDORINRT EWDORIN16M)) --$(eval $(call MultiProfile,OPENMESH,OM2P OM5P MR600 MR900 MR1750)) -+$(eval $(call MultiProfile,OPENMESH,OM2P OM5P OM5PAC MR600 MR900 MR1750)) - $(eval $(call MultiProfile,TEW652BRP,TEW652BRP_FW TEW652BRP_RECOVERY)) - $(eval $(call MultiProfile,TLMR3220,TLMR3220V1)) - $(eval $(call MultiProfile,TLMR3420,TLMR3420V1)) diff --git a/patches/openwrt/0072-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-ACv2-board.patch b/patches/openwrt/0072-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-ACv2-board.patch deleted file mode 100644 index d2e2cd60..00000000 --- a/patches/openwrt/0072-ar71xx-add-kernel-support-for-the-OpenMesh-OM5P-ACv2-board.patch +++ /dev/null @@ -1,289 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:15 +0000 -Subject: ar71xx: add kernel support for the OpenMesh OM5P-ACv2 board - -Signed-off-by: Sven Eckelmann - -Backport of r49149 - -Forwarded: https://patchwork.ozlabs.org/patch/624199/ - -diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index dd89357..514f7d5 100644 ---- a/target/linux/ar71xx/config-3.18 -+++ b/target/linux/ar71xx/config-3.18 -@@ -92,6 +92,7 @@ CONFIG_ATH79_MACH_NBG6716=y - CONFIG_ATH79_MACH_OM2P=y - CONFIG_ATH79_MACH_OM5P=y - CONFIG_ATH79_MACH_OM5P_AC=y -+CONFIG_ATH79_MACH_OM5P_ACv2=y - CONFIG_ATH79_MACH_ONION_OMEGA=y - CONFIG_ATH79_MACH_PB42=y - CONFIG_ATH79_MACH_PB44=y -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-om5pacv2.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-om5pacv2.c -new file mode 100644 -index 0000000..587ca32 ---- /dev/null -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-om5pacv2.c -@@ -0,0 +1,216 @@ -+/* -+ * OpenMesh OM5P-ACv2 support -+ * -+ * Copyright (C) 2013 Marek Lindner -+ * Copyright (C) 2014-2016 Sven Eckelmann -+ * Copyright (C) 2015 Open-Mesh - Jim Collar -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published -+ * by the Free Software Foundation. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#include "common.h" -+#include "dev-ap9x-pci.h" -+#include "dev-eth.h" -+#include "dev-gpio-buttons.h" -+#include "dev-leds-gpio.h" -+#include "dev-m25p80.h" -+#include "dev-wmac.h" -+#include "machtypes.h" -+#include "pci.h" -+ -+#define OM5PACV2_GPIO_LED_POWER 14 -+#define OM5PACV2_GPIO_LED_GREEN 13 -+#define OM5PACV2_GPIO_LED_RED 23 -+#define OM5PACV2_GPIO_LED_YELLOW 15 -+#define OM5PACV2_GPIO_BTN_RESET 1 -+#define OM5PACV2_GPIO_I2C_SCL 18 -+#define OM5PACV2_GPIO_I2C_SDA 19 -+#define OM5PACV2_GPIO_PA_DCDC 2 -+#define OM5PACV2_GPIO_PA_HIGH 16 -+ -+#define OM5PACV2_KEYS_POLL_INTERVAL 20 /* msecs */ -+#define OM5PACV2_KEYS_DEBOUNCE_INTERVAL (3 * OM5PACV2_KEYS_POLL_INTERVAL) -+ -+#define OM5PACV2_WMAC_CALDATA_OFFSET 0x1000 -+ -+static struct gpio_led om5pacv2_leds_gpio[] __initdata = { -+ { -+ .name = "om5pac:blue:power", -+ .gpio = OM5PACV2_GPIO_LED_POWER, -+ .active_low = 1, -+ }, { -+ .name = "om5pac:red:wifi", -+ .gpio = OM5PACV2_GPIO_LED_RED, -+ .active_low = 1, -+ }, { -+ .name = "om5pac:yellow:wifi", -+ .gpio = OM5PACV2_GPIO_LED_YELLOW, -+ .active_low = 1, -+ }, { -+ .name = "om5pac:green:wifi", -+ .gpio = OM5PACV2_GPIO_LED_GREEN, -+ .active_low = 1, -+ } -+}; -+ -+static struct gpio_keys_button om5pacv2_gpio_keys[] __initdata = { -+ { -+ .desc = "reset", -+ .type = EV_KEY, -+ .code = KEY_RESTART, -+ .debounce_interval = OM5PACV2_KEYS_DEBOUNCE_INTERVAL, -+ .gpio = OM5PACV2_GPIO_BTN_RESET, -+ .active_low = 1, -+ } -+}; -+ -+static struct i2c_gpio_platform_data om5pacv2_i2c_device_platdata = { -+ .sda_pin = OM5PACV2_GPIO_I2C_SDA, -+ .scl_pin = OM5PACV2_GPIO_I2C_SCL, -+ .udelay = 10, -+ .sda_is_open_drain = 1, -+ .scl_is_open_drain = 1, -+}; -+ -+static struct platform_device om5pacv2_i2c_device = { -+ .name = "i2c-gpio", -+ .id = 0, -+ .dev = { -+ .platform_data = &om5pacv2_i2c_device_platdata, -+ }, -+}; -+ -+static struct i2c_board_info om5pacv2_i2c_devs[] __initdata = { -+ { -+ I2C_BOARD_INFO("tmp423", 0x4e), -+ }, -+}; -+ -+static struct flash_platform_data om5pacv2_flash_data = { -+ .type = "mx25l12805d", -+}; -+ -+static struct at803x_platform_data om5pacv2_an_at803x_data = { -+ .disable_smarteee = 1, -+ .enable_rgmii_rx_delay = 1, -+ .enable_rgmii_tx_delay = 1, -+}; -+ -+static struct at803x_platform_data om5pacv2_an_at8031_data = { -+ .disable_smarteee = 1, -+ .enable_rgmii_rx_delay = 1, -+ .enable_rgmii_tx_delay = 1, -+}; -+ -+static struct mdio_board_info om5pacv2_an_mdio0_info[] = { -+ { -+ .bus_id = "ag71xx-mdio.0", -+ .phy_addr = 4, -+ .platform_data = &om5pacv2_an_at803x_data, -+ }, -+ { -+ .bus_id = "ag71xx-mdio.1", -+ .phy_addr = 1, -+ .platform_data = &om5pacv2_an_at8031_data, -+ }, -+}; -+ -+static void __init om5p_acv2_setup_qca955x_eth_cfg(u32 mask, -+ unsigned int rxd, -+ unsigned int rxdv, -+ unsigned int txd, -+ unsigned int txe) -+{ -+ void __iomem *base; -+ u32 t; -+ -+ base = ioremap(QCA955X_GMAC_BASE, QCA955X_GMAC_SIZE); -+ -+ t = mask; -+ t |= rxd << QCA955X_ETH_CFG_RXD_DELAY_SHIFT; -+ t |= rxdv << QCA955X_ETH_CFG_RDV_DELAY_SHIFT; -+ t |= txd << QCA955X_ETH_CFG_TXD_DELAY_SHIFT; -+ t |= txe << QCA955X_ETH_CFG_TXE_DELAY_SHIFT; -+ -+ __raw_writel(t, base + QCA955X_GMAC_REG_ETH_CFG); -+ -+ iounmap(base); -+} -+ -+static void __init om5p_acv2_setup(void) -+{ -+ u8 *art = (u8 *)KSEG1ADDR(0x1fff0000); -+ u8 mac[6]; -+ -+ /* power amplifier high power, 4.2V at RFFM4203/4503 instead of 3.3 */ -+ ath79_gpio_function_enable(QCA955X_GPIO_FUNC_JTAG_DISABLE); -+ ath79_gpio_output_select(OM5PACV2_GPIO_PA_DCDC, QCA955X_GPIO_OUT_GPIO); -+ ath79_gpio_output_select(OM5PACV2_GPIO_PA_HIGH, QCA955X_GPIO_OUT_GPIO); -+ gpio_request_one(OM5PACV2_GPIO_PA_DCDC, GPIOF_OUT_INIT_HIGH, -+ "PA DC/DC"); -+ gpio_request_one(OM5PACV2_GPIO_PA_HIGH, GPIOF_OUT_INIT_HIGH, "PA HIGH"); -+ -+ /* temperature sensor */ -+ platform_device_register(&om5pacv2_i2c_device); -+ i2c_register_board_info(0, om5pacv2_i2c_devs, -+ ARRAY_SIZE(om5pacv2_i2c_devs)); -+ -+ ath79_register_m25p80(&om5pacv2_flash_data); -+ ath79_register_leds_gpio(-1, ARRAY_SIZE(om5pacv2_leds_gpio), -+ om5pacv2_leds_gpio); -+ ath79_register_gpio_keys_polled(-1, OM5PACV2_KEYS_POLL_INTERVAL, -+ ARRAY_SIZE(om5pacv2_gpio_keys), -+ om5pacv2_gpio_keys); -+ -+ ath79_init_mac(mac, art, 0x02); -+ ath79_register_wmac(art + OM5PACV2_WMAC_CALDATA_OFFSET, mac); -+ -+ om5p_acv2_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_RGMII_EN, 2, 2, 0, 0); -+ ath79_register_mdio(0, 0x0); -+ ath79_register_mdio(1, 0x0); -+ -+ mdiobus_register_board_info(om5pacv2_an_mdio0_info, -+ ARRAY_SIZE(om5pacv2_an_mdio0_info)); -+ -+ ath79_init_mac(ath79_eth0_data.mac_addr, art, 0x00); -+ ath79_init_mac(ath79_eth1_data.mac_addr, art, 0x01); -+ -+ /* GMAC0 is connected to the PHY4 */ -+ ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII; -+ ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev; -+ ath79_eth0_data.phy_mask = BIT(4); -+ ath79_eth0_pll_data.pll_1000 = 0x82000101; -+ ath79_eth0_pll_data.pll_100 = 0x80000101; -+ ath79_eth0_pll_data.pll_10 = 0x80001313; -+ ath79_register_eth(0); -+ -+ /* GMAC1 is connected to MDIO1 in SGMII mode */ -+ ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII; -+ ath79_eth1_data.mii_bus_dev = &ath79_mdio1_device.dev; -+ ath79_eth1_data.phy_mask = BIT(1); -+ ath79_eth1_pll_data.pll_1000 = 0x03000101; -+ ath79_eth1_pll_data.pll_100 = 0x80000101; -+ ath79_eth1_pll_data.pll_10 = 0x80001313; -+ ath79_eth1_data.speed = SPEED_1000; -+ ath79_eth1_data.duplex = DUPLEX_FULL; -+ ath79_register_eth(1); -+ -+ ath79_register_pci(); -+} -+ -+MIPS_MACHINE(ATH79_MACH_OM5P_ACv2, "OM5P-ACv2", "OpenMesh OM5P ACv2", om5p_acv2_setup); -diff --git a/target/linux/ar71xx/patches-3.18/816-MIPS-ath79-add-om5pacv-support.patch b/target/linux/ar71xx/patches-3.18/816-MIPS-ath79-add-om5pacv-support.patch -new file mode 100644 -index 0000000..fbbf171 ---- /dev/null -+++ b/target/linux/ar71xx/patches-3.18/816-MIPS-ath79-add-om5pacv-support.patch -@@ -0,0 +1,39 @@ -+--- a/arch/mips/ath79/Kconfig -++++ b/arch/mips/ath79/Kconfig -+@@ -808,6 +808,16 @@ config ATH79_MACH_OM5P_AC -+ select ATH79_DEV_M25P80 -+ select ATH79_DEV_WMAC -+ -++config ATH79_MACH_OM5P_ACv2 -++ bool "OpenMesh OM5P-ACv2 board support" -++ select SOC_QCA955X -++ select ATH79_DEV_AP9X_PCI if PCI -++ select ATH79_DEV_ETH -++ select ATH79_DEV_GPIO_BUTTONS -++ select ATH79_DEV_LEDS_GPIO -++ select ATH79_DEV_M25P80 -++ select ATH79_DEV_WMAC -++ -+ config ATH79_MACH_ONION_OMEGA -+ bool "ONION OMEGA support" -+ select SOC_AR933X -+--- a/arch/mips/ath79/Makefile -++++ b/arch/mips/ath79/Makefile -+@@ -101,6 +101,7 @@ obj-$(CONFIG_ATH79_MACH_NBG460N) += mach -+ obj-$(CONFIG_ATH79_MACH_OM2P) += mach-om2p.o -+ obj-$(CONFIG_ATH79_MACH_OM5P) += mach-om5p.o -+ obj-$(CONFIG_ATH79_MACH_OM5P_AC) += mach-om5pac.o -++obj-$(CONFIG_ATH79_MACH_OM5P_ACv2) += mach-om5pacv2.o -+ obj-$(CONFIG_ATH79_MACH_ONION_OMEGA) += mach-onion-omega.o -+ obj-$(CONFIG_ATH79_MACH_PB42) += mach-pb42.o -+ obj-$(CONFIG_ATH79_MACH_PB44) += mach-pb44.o -+--- a/arch/mips/ath79/machtypes.h -++++ b/arch/mips/ath79/machtypes.h -+@@ -96,6 +96,7 @@ enum ath79_mach_type { -+ ATH79_MACH_OM2Pv2, /* OpenMesh OM2Pv2 */ -+ ATH79_MACH_OM2P, /* OpenMesh OM2P */ -+ ATH79_MACH_OM5P_AC, /* OpenMesh OM5P-AC */ -++ ATH79_MACH_OM5P_ACv2, /* OpenMesh OM5P-ACv2 */ -+ ATH79_MACH_OM5P_AN, /* OpenMesh OM5P-AN */ -+ ATH79_MACH_OM5P, /* OpenMesh OM5P */ -+ ATH79_MACH_ONION_OMEGA, /* ONION OMEGA */ diff --git a/patches/openwrt/0123-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch b/patches/openwrt/0072-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch similarity index 100% rename from patches/openwrt/0123-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch rename to patches/openwrt/0072-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch diff --git a/patches/openwrt/0073-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-ACv2.patch b/patches/openwrt/0073-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-ACv2.patch deleted file mode 100644 index 2ea0cb6a..00000000 --- a/patches/openwrt/0073-ar71xx-add-user-space-support-for-the-OpenMesh-OM5P-ACv2.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:18 +0000 -Subject: ar71xx: add user-space support for the OpenMesh OM5P-ACv2 - -Signed-off-by: Sven Eckelmann - -Backport of r49150 - -Forwarded: https://patchwork.ozlabs.org/patch/624200/ - -diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index a4051f2..d4d8b4e 100644 ---- a/target/linux/ar71xx/base-files/etc/diag.sh -+++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -178,7 +178,8 @@ get_status_led() { - om5p-an) - status_led="om5p:blue:power" - ;; -- om5p-ac) -+ om5p-ac | \ -+ om5p-acv2) - status_led="om5pac:blue:power" - ;; - onion-omega) -diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 10b8048..fbf76c8 100755 ---- a/target/linux/ar71xx/base-files/lib/ar71xx.sh -+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -619,6 +619,9 @@ ar71xx_board_detect() { - *"OM5P AC") - name="om5p-ac" - ;; -+ *"OM5P ACv2") -+ name="om5p-acv2" -+ ;; - *"Onion Omega") - name="onion-omega" - ;; diff --git a/patches/openwrt/0124-mac80211-fix-packet-loss-on-fq-reordering.patch b/patches/openwrt/0073-mac80211-fix-packet-loss-on-fq-reordering.patch similarity index 100% rename from patches/openwrt/0124-mac80211-fix-packet-loss-on-fq-reordering.patch rename to patches/openwrt/0073-mac80211-fix-packet-loss-on-fq-reordering.patch diff --git a/patches/openwrt/0074-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-ACv2.patch b/patches/openwrt/0074-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-ACv2.patch deleted file mode 100644 index 0c4cf031..00000000 --- a/patches/openwrt/0074-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM5P-ACv2.patch +++ /dev/null @@ -1,46 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:22 +0000 -Subject: ar71xx: enable sysupgrade for the OpenMesh OM5P-ACv2 - -Signed-off-by: Sven Eckelmann - -Backport of r49151 - -Forwarded: https://patchwork.ozlabs.org/patch/624201/ - -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -index 1cfead9..209cdaa 100644 ---- a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -@@ -74,6 +74,7 @@ platform_check_image_openmesh() - ;; - OM5PAC) - [ "$board" = "om5p-ac" ] && break -+ [ "$board" = "om5p-acv2" ] && break - echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" - return 1 - ;; -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 67c0661..4a4c476 100755 ---- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -308,7 +308,8 @@ platform_check_image() { - om2p-lc | \ - om5p | \ - om5p-an | \ -- om5p-ac) -+ om5p-ac | \ -+ om5p-acv2) - platform_check_image_openmesh "$magic_long" "$1" && return 0 - return 1 - ;; -@@ -542,7 +543,8 @@ platform_do_upgrade() { - om2p-lc | \ - om5p | \ - om5p-an | \ -- om5p-ac) -+ om5p-ac | \ -+ om5p-acv2) - platform_do_upgrade_openmesh "$ARGV" - ;; - unifi-outdoor-plus | \ diff --git a/patches/openwrt/0125-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch b/patches/openwrt/0074-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch similarity index 100% rename from patches/openwrt/0125-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch rename to patches/openwrt/0074-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch diff --git a/patches/openwrt/0126-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch b/patches/openwrt/0075-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch similarity index 100% rename from patches/openwrt/0126-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch rename to patches/openwrt/0075-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch diff --git a/patches/openwrt/0075-om-watchdog-add-OpenMesh-OM5P-ACv2-support.patch b/patches/openwrt/0075-om-watchdog-add-OpenMesh-OM5P-ACv2-support.patch deleted file mode 100644 index b3c8c8fc..00000000 --- a/patches/openwrt/0075-om-watchdog-add-OpenMesh-OM5P-ACv2-support.patch +++ /dev/null @@ -1,23 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:25 +0000 -Subject: om-watchdog: add OpenMesh OM5P-ACv2 support - -Signed-off-by: Sven Eckelmann - -Backport of r49152 - -Forwarded: https://patchwork.ozlabs.org/patch/624202/ - -diff --git a/package/kernel/om-watchdog/files/om-watchdog.init b/package/kernel/om-watchdog/files/om-watchdog.init -index 8cec13b..6b96966 100644 ---- a/package/kernel/om-watchdog/files/om-watchdog.init -+++ b/package/kernel/om-watchdog/files/om-watchdog.init -@@ -13,7 +13,7 @@ boot() { - local board=$(ar71xx_board_name) - - case "$board" in -- "om2p"|"om2p-hs"|"om2p-hsv2") -+ "om2p"|"om2p-hs"|"om2p-hsv2"|"om5p-acv2") - service_start /sbin/om-watchdog 12 - ;; - "om2pv2"|"om2p-lc") diff --git a/patches/openwrt/0076-uboot-envtools-add-OpenMesh-OM5P-ACv2-support.patch b/patches/openwrt/0076-uboot-envtools-add-OpenMesh-OM5P-ACv2-support.patch deleted file mode 100644 index dd61c6fb..00000000 --- a/patches/openwrt/0076-uboot-envtools-add-OpenMesh-OM5P-ACv2-support.patch +++ /dev/null @@ -1,22 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:28 +0000 -Subject: uboot-envtools: add OpenMesh OM5P-ACv2 support - -Signed-off-by: Sven Eckelmann - -Backport of r49153 - -Forwarded: https://patchwork.ozlabs.org/patch/624203/ - -diff --git a/package/boot/uboot-envtools/files/ar71xx b/package/boot/uboot-envtools/files/ar71xx -index 657b25f..9071c11 100644 ---- a/package/boot/uboot-envtools/files/ar71xx -+++ b/package/boot/uboot-envtools/files/ar71xx -@@ -29,6 +29,7 @@ mr900v2 | \ - nbg6716 | \ - om5p-an | \ - om5p-ac | \ -+om5p-acv2 | \ - om5p | \ - tube2h | \ - wndr3700) diff --git a/patches/openwrt/0077-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-ACv2-board.patch b/patches/openwrt/0077-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-ACv2-board.patch deleted file mode 100644 index 90b634ce..00000000 --- a/patches/openwrt/0077-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-OM5P-ACv2-board.patch +++ /dev/null @@ -1,24 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:31 +0000 -Subject: ar71xx: extract ath10k wifi board.bin for the OpenMesh OM5P-ACv2 board - -Signed-off-by: Sven Eckelmann - -Backport of r49154 - -Forwarded: https://patchwork.ozlabs.org/patch/624204/ - -diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index c1f4b85..d925a85 100644 ---- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -+++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -@@ -71,7 +71,8 @@ case "$FIRMWARE" in - ath10kcal_extract "caldata" 20480 2116 - ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1) - ;; -- mr1750) -+ mr1750 | \ -+ om5p-acv2) - ath10kcal_extract "ART" 20480 2116 - ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16) - ;; diff --git a/patches/openwrt/0078-ar71xx-add-OM5P-ACv2-to-the-OM5P-AC-profile.patch b/patches/openwrt/0078-ar71xx-add-OM5P-ACv2-to-the-OM5P-AC-profile.patch deleted file mode 100644 index d98a115f..00000000 --- a/patches/openwrt/0078-ar71xx-add-OM5P-ACv2-to-the-OM5P-AC-profile.patch +++ /dev/null @@ -1,29 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 9 Apr 2016 10:26:34 +0000 -Subject: ar71xx: add OM5P-ACv2 to the OM5P-AC profile - -Signed-off-by: Sven Eckelmann - -Backport of r49155 - -Forwarded: https://patchwork.ozlabs.org/patch/624205/ - -diff --git a/target/linux/ar71xx/generic/profiles/openmesh.mk b/target/linux/ar71xx/generic/profiles/openmesh.mk -index 64aaa24..c0919ed 100644 ---- a/target/linux/ar71xx/generic/profiles/openmesh.mk -+++ b/target/linux/ar71xx/generic/profiles/openmesh.mk -@@ -28,12 +28,12 @@ endef - $(eval $(call Profile,OM5P)) - - define Profile/OM5PAC -- NAME:=OpenMesh OM5P-AC -+ NAME:=OpenMesh OM5P-AC/OM5P-ACv2 - PACKAGES:=kmod-ath9k kmod-ath10k om-watchdog ath10k-firmware-qca988x - endef - - define Profile/OM5PAC/Description -- Package set optimized for the OpenMesh OM5P-AC. -+ Package set optimized for the OpenMesh OM5P-AC/OM5P-ACv2. - endef - - $(eval $(call Profile,OM5PAC)) diff --git a/patches/openwrt/0085-scripts-feeds-fix-version-detection-for-Make-4.2.1.patch b/patches/openwrt/0085-scripts-feeds-fix-version-detection-for-Make-4.2.1.patch deleted file mode 100644 index 94b0e4e3..00000000 --- a/patches/openwrt/0085-scripts-feeds-fix-version-detection-for-Make-4.2.1.patch +++ /dev/null @@ -1,24 +0,0 @@ -From: Matthias Schiffer -Date: Wed, 15 Jun 2016 19:31:08 +0200 -Subject: scripts: feeds: fix version detection for Make >= 4.2.1 - -Signed-off-by: Jo-Philipp Wich - -Backport of LEDE df18b3756fef6a28d9194368d3156f0cd85fae19 - -diff --git a/scripts/feeds b/scripts/feeds -index f8f29cd..908e56c 100755 ---- a/scripts/feeds -+++ b/scripts/feeds -@@ -22,7 +22,10 @@ my @mkver = split /\s+/, `$mk -v`, 4; - my $valid_mk = 1; - $mkver[0] =~ /^GNU/ or $valid_mk = 0; - $mkver[1] =~ /^Make/ or $valid_mk = 0; --$mkver[2] >= "3.81" or $valid_mk = 0; -+ -+my ($mkv1, $mkv2) = split /\./, $mkver[2]; -+($mkv1 >= 4 || ($mkv1 == 3 && $mkv2 >= 81)) or $valid_mk = 0; -+ - $valid_mk or die "Unsupported version of make found: $mk\n"; - - my @feeds; diff --git a/patches/openwrt/0091-ar71xx-add-kernel-support-for-the-OpenMesh-OM2P-HSv3.patch b/patches/openwrt/0091-ar71xx-add-kernel-support-for-the-OpenMesh-OM2P-HSv3.patch deleted file mode 100644 index 1bfdc8e3..00000000 --- a/patches/openwrt/0091-ar71xx-add-kernel-support-for-the-OpenMesh-OM2P-HSv3.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:48 +0200 -Subject: ar71xx: add kernel support for the OpenMesh OM2P-HSv3 - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637052/ - -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-om2p.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-om2p.c -index 6b0bdc3..3b282a3 100644 ---- a/target/linux/ar71xx/files/arch/mips/ath79/mach-om2p.c -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-om2p.c -@@ -223,3 +223,4 @@ static void __init om2p_hs_setup(void) - - MIPS_MACHINE(ATH79_MACH_OM2P_HS, "OM2P-HS", "OpenMesh OM2P HS", om2p_hs_setup); - MIPS_MACHINE(ATH79_MACH_OM2P_HSv2, "OM2P-HSv2", "OpenMesh OM2P HSv2", om2p_hs_setup); -+MIPS_MACHINE(ATH79_MACH_OM2P_HSv3, "OM2P-HSv3", "OpenMesh OM2P HSv3", om2p_hs_setup); -diff --git a/target/linux/ar71xx/patches-3.18/817-MIPS-ath79-add-om2phsv3-support.patch b/target/linux/ar71xx/patches-3.18/817-MIPS-ath79-add-om2phsv3-support.patch -new file mode 100644 -index 0000000..7305b2e ---- /dev/null -+++ b/target/linux/ar71xx/patches-3.18/817-MIPS-ath79-add-om2phsv3-support.patch -@@ -0,0 +1,10 @@ -+--- a/arch/mips/ath79/machtypes.h -++++ b/arch/mips/ath79/machtypes.h -+@@ -88,6 +88,7 @@ enum ath79_mach_type { -+ ATH79_MACH_NBG460N, /* Zyxel NBG460N/550N/550NH */ -+ ATH79_MACH_NBG6716, /* Zyxel NBG6716 */ -+ ATH79_MACH_OM2P_HSv2, /* OpenMesh OM2P-HSv2 */ -++ ATH79_MACH_OM2P_HSv3, /* OpenMesh OM2P-HSv3 */ -+ ATH79_MACH_OM2P_HS, /* OpenMesh OM2P-HS */ -+ ATH79_MACH_OM2P_LC, /* OpenMesh OM2P-LC */ -+ ATH79_MACH_OM2Pv2, /* OpenMesh OM2Pv2 */ diff --git a/patches/openwrt/0092-ar71xx-add-user-space-support-for-the-OpenMesh-OM2P-HSv3.patch b/patches/openwrt/0092-ar71xx-add-user-space-support-for-the-OpenMesh-OM2P-HSv3.patch deleted file mode 100644 index ab3273a2..00000000 --- a/patches/openwrt/0092-ar71xx-add-user-space-support-for-the-OpenMesh-OM2P-HSv3.patch +++ /dev/null @@ -1,46 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:49 +0200 -Subject: ar71xx: add user-space support for the OpenMesh OM2P-HSv3 - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637053/ - -diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index d4d8b4e..aa02212 100644 ---- a/target/linux/ar71xx/base-files/etc/diag.sh -+++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -171,6 +171,7 @@ get_status_led() { - om2pv2 | \ - om2p-hs | \ - om2p-hsv2 | \ -+ om2p-hsv3 | \ - om2p-lc) - status_led="om2p:blue:power" - ;; -diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index dc8b8d6..5767f48 100644 ---- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -297,6 +297,7 @@ om2p | \ - om2pv2 | \ - om2p-hs | \ - om2p-hsv2 | \ -+om2p-hsv3 | \ - om2p-lc) - ucidef_set_led_netdev "port1" "port1" "om2p:blue:wan" "eth0" - ucidef_set_led_netdev "port2" "port2" "om2p:blue:lan" "eth1" -diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index db908f9..dc51b03 100755 ---- a/target/linux/ar71xx/base-files/lib/ar71xx.sh -+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -610,6 +610,9 @@ ar71xx_board_detect() { - *"OM2P HSv2") - name="om2p-hsv2" - ;; -+ *"OM2P HSv3") -+ name="om2p-hsv3" -+ ;; - *"OM2P LC") - name="om2p-lc" - ;; diff --git a/patches/openwrt/0093-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM2P-HSv3.patch b/patches/openwrt/0093-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM2P-HSv3.patch deleted file mode 100644 index ad60c151..00000000 --- a/patches/openwrt/0093-ar71xx-enable-sysupgrade-for-the-OpenMesh-OM2P-HSv3.patch +++ /dev/null @@ -1,40 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:50 +0200 -Subject: ar71xx: enable sysupgrade for the OpenMesh OM2P-HSv3 - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637054/ - -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -index 209cdaa..0e8ea27 100644 ---- a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -@@ -63,6 +63,7 @@ platform_check_image_openmesh() - [ "$board" = "om2p-lc" ] && break - [ "$board" = "om2p-hs" ] && break - [ "$board" = "om2p-hsv2" ] && break -+ [ "$board" = "om2p-hsv3" ] && break - echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" - return 1 - ;; -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index aeb4577..9b26e73 100755 ---- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -306,6 +306,7 @@ platform_check_image() { - om2pv2 | \ - om2p-hs | \ - om2p-hsv2 | \ -+ om2p-hsv3 | \ - om2p-lc | \ - om5p | \ - om5p-an | \ -@@ -541,6 +542,7 @@ platform_do_upgrade() { - om2pv2 | \ - om2p-hs | \ - om2p-hsv2 | \ -+ om2p-hsv3 | \ - om2p-lc | \ - om5p | \ - om5p-an | \ diff --git a/patches/openwrt/0094-package-om-watchdog-add-OpenMesh-OM2P-HSv3-support.patch b/patches/openwrt/0094-package-om-watchdog-add-OpenMesh-OM2P-HSv3-support.patch deleted file mode 100644 index 95433670..00000000 --- a/patches/openwrt/0094-package-om-watchdog-add-OpenMesh-OM2P-HSv3-support.patch +++ /dev/null @@ -1,21 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:51 +0200 -Subject: package/om-watchdog: add OpenMesh OM2P-HSv3 support - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637055/ - -diff --git a/package/kernel/om-watchdog/files/om-watchdog.init b/package/kernel/om-watchdog/files/om-watchdog.init -index 6b96966..bf8a124 100644 ---- a/package/kernel/om-watchdog/files/om-watchdog.init -+++ b/package/kernel/om-watchdog/files/om-watchdog.init -@@ -13,7 +13,7 @@ boot() { - local board=$(ar71xx_board_name) - - case "$board" in -- "om2p"|"om2p-hs"|"om2p-hsv2"|"om5p-acv2") -+ "om2p"|"om2p-hs"|"om2p-hsv2"|"om2p-hsv3"|"om5p-acv2") - service_start /sbin/om-watchdog 12 - ;; - "om2pv2"|"om2p-lc") diff --git a/patches/openwrt/0095-package-uboot-envtools-add-OpenMesh-OM2P-HSv3-support.patch b/patches/openwrt/0095-package-uboot-envtools-add-OpenMesh-OM2P-HSv3-support.patch deleted file mode 100644 index 1fee2332..00000000 --- a/patches/openwrt/0095-package-uboot-envtools-add-OpenMesh-OM2P-HSv3-support.patch +++ /dev/null @@ -1,20 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:52 +0200 -Subject: package/uboot-envtools: add OpenMesh OM2P-HSv3 support - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637056/ - -diff --git a/package/boot/uboot-envtools/files/ar71xx b/package/boot/uboot-envtools/files/ar71xx -index 9071c11..81c6481 100644 ---- a/package/boot/uboot-envtools/files/ar71xx -+++ b/package/boot/uboot-envtools/files/ar71xx -@@ -41,6 +41,7 @@ om2p | \ - om2pv2 | \ - om2p-hs | \ - om2p-hsv2 | \ -+om2p-hsv3 | \ - om2p-lc) - ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x40000" "0x40000" - ;; diff --git a/patches/openwrt/0096-ar71xx-add-OM2P-HSv3-to-the-OM2P-profile.patch b/patches/openwrt/0096-ar71xx-add-OM2P-HSv3-to-the-OM2P-profile.patch deleted file mode 100644 index 0ad77fc4..00000000 --- a/patches/openwrt/0096-ar71xx-add-OM2P-HSv3-to-the-OM2P-profile.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:53 +0200 -Subject: ar71xx: add OM2P-HSv3 to the OM2P profile - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637057/ - -diff --git a/target/linux/ar71xx/generic/profiles/openmesh.mk b/target/linux/ar71xx/generic/profiles/openmesh.mk -index c0919ed..ddd3f8d 100644 ---- a/target/linux/ar71xx/generic/profiles/openmesh.mk -+++ b/target/linux/ar71xx/generic/profiles/openmesh.mk -@@ -6,12 +6,12 @@ - # - - define Profile/OM2P -- NAME:=OpenMesh OM2P/OM2Pv2/OM2P-HS/OM2P-HSv2/OM2P-LC -+ NAME:=OpenMesh OM2P/OM2Pv2/OM2P-HS/OM2P-HSv2/OM2P-HSv3/OM2P-LC - PACKAGES:=kmod-ath9k om-watchdog - endef - - define Profile/OM2P/Description -- Package set optimized for the OpenMesh OM2P/OM2Pv2/OM2P-HS/OM2P-HSv2/OM2P-LC. -+ Package set optimized for the OpenMesh OM2P/OM2Pv2/OM2P-HS/OM2P-HSv2/OM2P-HSv3/OM2P-LC. - endef - - $(eval $(call Profile,OM2P)) diff --git a/patches/openwrt/0097-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750v2.patch b/patches/openwrt/0097-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750v2.patch deleted file mode 100644 index 1122b7b9..00000000 --- a/patches/openwrt/0097-ar71xx-add-kernel-support-for-the-OpenMesh-MR1750v2.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:54 +0200 -Subject: ar71xx: add kernel support for the OpenMesh MR1750v2 - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637058/ - -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -index e3c04e7..18101ce 100644 ---- a/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-mr1750.c -@@ -168,3 +168,4 @@ static void __init mr1750_setup(void) - } - - MIPS_MACHINE(ATH79_MACH_MR1750, "MR1750", "OpenMesh MR1750", mr1750_setup); -+MIPS_MACHINE(ATH79_MACH_MR1750V2, "MR1750v2", "OpenMesh MR1750v2", mr1750_setup); -diff --git a/target/linux/ar71xx/patches-3.18/818-MIPS-ath79-add-mr1750v2-support.patch b/target/linux/ar71xx/patches-3.18/818-MIPS-ath79-add-mr1750v2-support.patch -new file mode 100644 -index 0000000..de732ec ---- /dev/null -+++ b/target/linux/ar71xx/patches-3.18/818-MIPS-ath79-add-mr1750v2-support.patch -@@ -0,0 +1,10 @@ -+--- a/arch/mips/ath79/machtypes.h -++++ b/arch/mips/ath79/machtypes.h -+@@ -76,6 +76,7 @@ enum ath79_mach_type { -+ ATH79_MACH_MR12, /* Cisco Meraki MR12 */ -+ ATH79_MACH_MR16, /* Cisco Meraki MR16 */ -+ ATH79_MACH_MR1750, /* OpenMesh MR1750 */ -++ ATH79_MACH_MR1750V2, /* OpenMesh MR1750v2 */ -+ ATH79_MACH_MR600V2, /* OpenMesh MR600v2 */ -+ ATH79_MACH_MR600, /* OpenMesh MR600 */ -+ ATH79_MACH_MR900, /* OpenMesh MR900 */ diff --git a/patches/openwrt/0098-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750v2.patch b/patches/openwrt/0098-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750v2.patch deleted file mode 100644 index 3c99224d..00000000 --- a/patches/openwrt/0098-ar71xx-add-user-space-support-for-the-OpenMesh-MR1750v2.patch +++ /dev/null @@ -1,62 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:55 +0200 -Subject: ar71xx: add user-space support for the OpenMesh MR1750v2 - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637059/ - -diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index aa02212..f182d60 100644 ---- a/target/linux/ar71xx/base-files/etc/diag.sh -+++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -143,7 +143,8 @@ get_status_led() { - mr600v2) - status_led="mr600:blue:power" - ;; -- mr1750) -+ mr1750 | \ -+ mr1750v2) - status_led="mr1750:blue:power" - ;; - mr900 | \ -diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 5767f48..032acc9 100644 ---- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -243,7 +243,8 @@ mr600) - ucidef_set_led_wlan "wlan58" "WLAN58" "mr600:green:wlan58" "phy0tpt" - ;; - --mr1750) -+mr1750 | \ -+mr1750v2) - ucidef_set_led_netdev "lan" "LAN" "mr1750:blue:wan" "eth0" - ucidef_set_led_wlan "wlan58" "WLAN58" "mr1750:blue:wlan58" "phy0tpt" - ucidef_set_led_wlan "wlan24" "WLAN24" "mr1750:blue:wlan24" "phy1tpt" -diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 89a2184..b8ae576 100755 ---- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -335,6 +335,7 @@ eap7660d |\ - el-mini |\ - loco-m-xw |\ - mr1750 |\ -+mr1750v2 |\ - mr600 |\ - mr600v2 |\ - mr900 |\ -diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index dc51b03..5119b36 100755 ---- a/target/linux/ar71xx/base-files/lib/ar71xx.sh -+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -568,6 +568,9 @@ ar71xx_board_detect() { - *MR1750) - name="mr1750" - ;; -+ *MR1750v2) -+ name="mr1750v2" -+ ;; - *MR600) - name="mr600" - ;; diff --git a/patches/openwrt/0099-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750v2.patch b/patches/openwrt/0099-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750v2.patch deleted file mode 100644 index 51ba8566..00000000 --- a/patches/openwrt/0099-ar71xx-enable-sysupgrade-for-the-OpenMesh-MR1750v2.patch +++ /dev/null @@ -1,40 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:56 +0200 -Subject: ar71xx: enable sysupgrade for the OpenMesh MR1750v2 - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637060/ - -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -index 0e8ea27..95d39bf 100644 ---- a/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/openmesh.sh -@@ -81,6 +81,7 @@ platform_check_image_openmesh() - ;; - MR1750) - [ "$board" = "mr1750" ] && break -+ [ "$board" = "mr1750v2" ] && break - echo "Invalid image board target ($img_board_target) for this platform: $board. Use the correct image for this platform" - return 1 - ;; -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 9b26e73..f33419f 100755 ---- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -298,6 +298,7 @@ platform_check_image() { - return 0; - ;; - mr1750 | \ -+ mr1750v2 | \ - mr600 | \ - mr600v2 | \ - mr900 | \ -@@ -534,6 +535,7 @@ platform_do_upgrade() { - platform_do_upgrade_dir825b "$ARGV" - ;; - mr1750 | \ -+ mr1750v2 | \ - mr600 | \ - mr600v2 | \ - mr900 | \ diff --git a/patches/openwrt/0100-package-om-watchdog-add-OpenMesh-MR1750v2-support.patch b/patches/openwrt/0100-package-om-watchdog-add-OpenMesh-MR1750v2-support.patch deleted file mode 100644 index c5ee90df..00000000 --- a/patches/openwrt/0100-package-om-watchdog-add-OpenMesh-MR1750v2-support.patch +++ /dev/null @@ -1,21 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:57 +0200 -Subject: package/om-watchdog: add OpenMesh MR1750v2 support - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637062/ - -diff --git a/package/kernel/om-watchdog/files/om-watchdog.init b/package/kernel/om-watchdog/files/om-watchdog.init -index bf8a124..8a1b66e 100644 ---- a/package/kernel/om-watchdog/files/om-watchdog.init -+++ b/package/kernel/om-watchdog/files/om-watchdog.init -@@ -28,7 +28,7 @@ boot() { - "mr600v2") - service_start /sbin/om-watchdog 15 - ;; -- "mr900"|"mr900v2"|"mr1750") -+ "mr900"|"mr900v2"|"mr1750"|"mr1750v2") - service_start /sbin/om-watchdog 16 - ;; - esac diff --git a/patches/openwrt/0101-package-uboot-envtools-add-OpenMesh-MR1750v2-support.patch b/patches/openwrt/0101-package-uboot-envtools-add-OpenMesh-MR1750v2-support.patch deleted file mode 100644 index 5b51bfda..00000000 --- a/patches/openwrt/0101-package-uboot-envtools-add-OpenMesh-MR1750v2-support.patch +++ /dev/null @@ -1,20 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:58 +0200 -Subject: package/uboot-envtools: add OpenMesh MR1750v2 support - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637064/ - -diff --git a/package/boot/uboot-envtools/files/ar71xx b/package/boot/uboot-envtools/files/ar71xx -index 81c6481..459e73d 100644 ---- a/package/boot/uboot-envtools/files/ar71xx -+++ b/package/boot/uboot-envtools/files/ar71xx -@@ -22,6 +22,7 @@ eap300v2 | \ - hornet-ub | \ - hornet-ub-x2 | \ - mr1750 | \ -+mr1750v2 | \ - mr600 | \ - mr600v2 | \ - mr900 | \ diff --git a/patches/openwrt/0102-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-MR1750v2-board.patch b/patches/openwrt/0102-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-MR1750v2-board.patch deleted file mode 100644 index ad8aaca9..00000000 --- a/patches/openwrt/0102-ar71xx-extract-ath10k-wifi-board.bin-for-the-OpenMesh-MR1750v2-board.patch +++ /dev/null @@ -1,20 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:03:59 +0200 -Subject: ar71xx: extract ath10k wifi board.bin for the OpenMesh MR1750v2 board - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637063/ - -diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index d925a85..0e93feb 100644 ---- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -+++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -@@ -72,6 +72,7 @@ case "$FIRMWARE" in - ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +1) - ;; - mr1750 | \ -+ mr1750v2 | \ - om5p-acv2) - ath10kcal_extract "ART" 20480 2116 - ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16) diff --git a/patches/openwrt/0103-ar71xx-add-MR1750v2-to-the-MR1750-profile.patch b/patches/openwrt/0103-ar71xx-add-MR1750v2-to-the-MR1750-profile.patch deleted file mode 100644 index dfcb7b43..00000000 --- a/patches/openwrt/0103-ar71xx-add-MR1750v2-to-the-MR1750-profile.patch +++ /dev/null @@ -1,27 +0,0 @@ -From: Sven Eckelmann -Date: Fri, 20 May 2016 18:04:00 +0200 -Subject: ar71xx: add MR1750v2 to the MR1750 profile - -Signed-off-by: Sven Eckelmann - -Forwarded: https://patchwork.ozlabs.org/patch/637065/ - -diff --git a/target/linux/ar71xx/generic/profiles/openmesh.mk b/target/linux/ar71xx/generic/profiles/openmesh.mk -index ddd3f8d..e245e6c 100644 ---- a/target/linux/ar71xx/generic/profiles/openmesh.mk -+++ b/target/linux/ar71xx/generic/profiles/openmesh.mk -@@ -61,12 +61,12 @@ endef - $(eval $(call Profile,MR900)) - - define Profile/MR1750 -- NAME:=OpenMesh MR1750 -+ NAME:=OpenMesh MR1750/MR1750v2 - PACKAGES:=kmod-ath9k kmod-ath10k ath10k-firmware-qca988x - endef - - define Profile/MR1750/Description -- Package set optimized for the OpenMesh MR1750. -+ Package set optimized for the OpenMesh MR1750/MR1750v2. - endef - - $(eval $(call Profile,MR1750)) From 9934d254dadbda3ac89e0842669a65109788ae92 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 11 Oct 2016 00:47:36 +0200 Subject: [PATCH 014/126] kernel: add fix for CVE-2016-7117 This probably doesn't affect Gluon as nothing is using recvmmsg, but it's still a good idea to get this fixed ASAP. --- ...076-kernel-add-fix-for-CVE-2016-7117.patch | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 patches/openwrt/0076-kernel-add-fix-for-CVE-2016-7117.patch diff --git a/patches/openwrt/0076-kernel-add-fix-for-CVE-2016-7117.patch b/patches/openwrt/0076-kernel-add-fix-for-CVE-2016-7117.patch new file mode 100644 index 00000000..18e6c238 --- /dev/null +++ b/patches/openwrt/0076-kernel-add-fix-for-CVE-2016-7117.patch @@ -0,0 +1,105 @@ +From: Matthias Schiffer +Date: Tue, 11 Oct 2016 00:46:56 +0200 +Subject: kernel: add fix for CVE-2016-7117 + +diff --git a/target/linux/generic/patches-3.18/010-net-Fix-use-after-free-in-the-recvmmsg-exit-path.patch b/target/linux/generic/patches-3.18/010-net-Fix-use-after-free-in-the-recvmmsg-exit-path.patch +new file mode 100644 +index 0000000..98da375 +--- /dev/null ++++ b/target/linux/generic/patches-3.18/010-net-Fix-use-after-free-in-the-recvmmsg-exit-path.patch +@@ -0,0 +1,95 @@ ++From cdd1fd36f4b67d9fdbeb1a4d16025192d44a3e8b Mon Sep 17 00:00:00 2001 ++Message-Id: ++From: Arnaldo Carvalho de Melo ++Date: Mon, 14 Mar 2016 09:56:35 -0300 ++Subject: [PATCH] net: Fix use after free in the recvmmsg exit path ++ ++[ Upstream commit 34b88a68f26a75e4fded796f1a49c40f82234b7d ] ++ ++The syzkaller fuzzer hit the following use-after-free: ++ ++ Call Trace: ++ [] __asan_report_load8_noabort+0x3e/0x40 mm/kasan/report.c:295 ++ [] __sys_recvmmsg+0x6fa/0x7f0 net/socket.c:2261 ++ [< inline >] SYSC_recvmmsg net/socket.c:2281 ++ [] SyS_recvmmsg+0x16f/0x180 net/socket.c:2270 ++ [] entry_SYSCALL_64_fastpath+0x16/0x7a ++ arch/x86/entry/entry_64.S:185 ++ ++And, as Dmitry rightly assessed, that is because we can drop the ++reference and then touch it when the underlying recvmsg calls return ++some packets and then hit an error, which will make recvmmsg to set ++sock->sk->sk_err, oops, fix it. ++ ++Reported-and-Tested-by: Dmitry Vyukov ++Cc: Alexander Potapenko ++Cc: Eric Dumazet ++Cc: Kostya Serebryany ++Cc: Sasha Levin ++Fixes: a2e2725541fa ("net: Introduce recvmmsg socket syscall") ++http://lkml.kernel.org/r/20160122211644.GC2470@redhat.com ++Signed-off-by: Arnaldo Carvalho de Melo ++Signed-off-by: David S. Miller ++Signed-off-by: Sasha Levin ++--- ++ net/socket.c | 38 +++++++++++++++++++------------------- ++ 1 file changed, 19 insertions(+), 19 deletions(-) ++ ++diff --git a/net/socket.c b/net/socket.c ++index 02fc7c8..7f61789 100644 ++--- a/net/socket.c +++++ b/net/socket.c ++@@ -2410,31 +2410,31 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, ++ break; ++ } ++ ++-out_put: ++- fput_light(sock->file, fput_needed); ++- ++ if (err == 0) ++- return datagrams; +++ goto out_put; ++ ++- if (datagrams != 0) { +++ if (datagrams == 0) { +++ datagrams = err; +++ goto out_put; +++ } +++ +++ /* +++ * We may return less entries than requested (vlen) if the +++ * sock is non block and there aren't enough datagrams... +++ */ +++ if (err != -EAGAIN) { ++ /* ++- * We may return less entries than requested (vlen) if the ++- * sock is non block and there aren't enough datagrams... +++ * ... or if recvmsg returns an error after we +++ * received some datagrams, where we record the +++ * error to return on the next call or if the +++ * app asks about it using getsockopt(SO_ERROR). ++ */ ++- if (err != -EAGAIN) { ++- /* ++- * ... or if recvmsg returns an error after we ++- * received some datagrams, where we record the ++- * error to return on the next call or if the ++- * app asks about it using getsockopt(SO_ERROR). ++- */ ++- sock->sk->sk_err = -err; ++- } ++- ++- return datagrams; +++ sock->sk->sk_err = -err; ++ } +++out_put: +++ fput_light(sock->file, fput_needed); ++ ++- return err; +++ return datagrams; ++ } ++ ++ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, ++-- ++2.10.0 ++ From 487922a8d9b7ac564effe25632fd90e2cb6979b9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 11 Oct 2016 03:38:53 +0200 Subject: [PATCH 015/126] Downgrade mac80211 to LEDE 6c2651566cce8f5b3a3d3b976439dee2bac5e07e In addition, the temperature compensation support patch is reverted. It seems that newer mac80211 version are less stable, so we downgrade it for now. --- ...> 0007-mac80211-hostapd-iw-.-update.patch} | 4047 ++++------------- ...73-kernel-add-fix-for-CVE-2016-7117.patch} | 0 ...211-fix-packet-loss-on-fq-reordering.patch | 636 --- ...re-compensation-support-patch-FS-111.patch | 124 + ...e-with-CCMP-PN-generated-in-hardware.patch | 21 - ...issues-with-powersave-devices-FS-176.patch | 1513 ------ 6 files changed, 1127 insertions(+), 5214 deletions(-) rename patches/openwrt/{0007-mac80211-hostapd-iw-.-update-to-LEDE-42f559ed70897a7b74dd3e6293b42e6d2e511eaa.patch => 0007-mac80211-hostapd-iw-.-update.patch} (92%) rename patches/openwrt/{0076-kernel-add-fix-for-CVE-2016-7117.patch => 0073-kernel-add-fix-for-CVE-2016-7117.patch} (100%) delete mode 100644 patches/openwrt/0073-mac80211-fix-packet-loss-on-fq-reordering.patch create mode 100644 patches/openwrt/0074-ath9k-revert-temperature-compensation-support-patch-FS-111.patch delete mode 100644 patches/openwrt/0074-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch delete mode 100644 patches/openwrt/0075-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch diff --git a/patches/openwrt/0007-mac80211-hostapd-iw-.-update-to-LEDE-42f559ed70897a7b74dd3e6293b42e6d2e511eaa.patch b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch similarity index 92% rename from patches/openwrt/0007-mac80211-hostapd-iw-.-update-to-LEDE-42f559ed70897a7b74dd3e6293b42e6d2e511eaa.patch rename to patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch index 04bf2b2d..64eea76e 100644 --- a/patches/openwrt/0007-mac80211-hostapd-iw-.-update-to-LEDE-42f559ed70897a7b74dd3e6293b42e6d2e511eaa.patch +++ b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch @@ -1,6 +1,22 @@ From: Matthias Schiffer -Date: Wed, 7 Sep 2016 05:04:06 +0200 -Subject: mac80211, hostapd, iw, ...: update to LEDE 42f559ed70897a7b74dd3e6293b42e6d2e511eaa +Date: Tue, 11 Oct 2016 02:53:43 +0200 +Subject: mac80211, hostapd, iw, ...: update + +The following package is updated to +LEDE 6c2651566cce8f5b3a3d3b976439dee2bac5e07e: + +* mac80211 + +The following packages are updated to +LEDE 42f559ed70897a7b74dd3e6293b42e6d2e511eaa: + +* acx-mac80211 +* ath10k-firmware +* hostapd +* iw +* linux-firmware +* mt76 +* mwlwifi diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile index b03d644..624da6a 100644 @@ -698,7 +714,7 @@ index 0000000..bbff8d8 + +$(eval $(call KernelPackage,ath10k-ct)) diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile -index 30da1cf..5c0ca3f 100644 +index 30da1cf..f2839cd 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -10,20 +10,21 @@ include $(INCLUDE_DIR)/kernel.mk @@ -930,18 +946,15 @@ index 30da1cf..5c0ca3f 100644 WLAN_VENDOR_INTEL \ WLAN_VENDOR_INTERSIL \ WLAN_VENDOR_MARVELL \ -@@ -1491,8 +1491,10 @@ endif +@@ -1491,6 +1491,8 @@ endif config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP +config-$(call config_package,airo) += AIRO + config-$(call config_package,ath) += ATH_CARDS ATH_COMMON --config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG -+config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG ATH9K_STATION_STATISTICS + config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED - - config-$(call config_package,ath9k) += ATH9K @@ -1501,6 +1503,7 @@ config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB config-$(CONFIG_PCI) += ATH9K_PCI config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD @@ -1139,151 +1152,6 @@ index ea229d6..06f3b8b 100644 dev_id=" option path '$path'" else dev_id=" option macaddr $(cat /sys/class/ieee80211/${dev}/macaddress)" -diff --git a/package/kernel/mac80211/files/regdb.txt b/package/kernel/mac80211/files/regdb.txt -index 463ace3..c4a9b2d 100644 ---- a/package/kernel/mac80211/files/regdb.txt -+++ b/package/kernel/mac80211/files/regdb.txt -@@ -136,19 +136,35 @@ country BF: DFS-FCC - (5490 - 5730 @ 160), (24), DFS - (5735 - 5835 @ 80), (30) - -+# Bulgarian rules as defined by the Communications Regulation Commission in the -+# following documents: -+# -+# Rules for carrying out electronic communications through radio equipment using -+# radio spectrum, which does not need to be individually assigned (the Rules): -+# http://www.crc.bg/files/_bg/Pravila_09_06_2015.pdf -+# -+# List of radio equipment that uses harmonized within the European Union bands -+# and electronic communications terminal equipment (the List): -+# http://www.crc.bg/files/_bg/Spisak_2015.pdf -+# -+# Note: The transmit power limits in the 5250-5350 MHz and 5470-5725 MHz bands -+# can be raised by 3 dBm if TPC is enabled. Refer to BDS EN 301 893 for details. - country BG: DFS-ETSI -+ # Wideband data transmission systems (WDTS) in the 2.4GHz ISM band, ref: -+ # I.22 of the List, BDS EN 300 328 - (2402 - 2482 @ 40), (20) -- (5170 - 5250 @ 80), (20), AUTO-BW -+ # 5 GHz Radio Local Area Networks (RLANs), ref: -+ # II.H01 of the List, BDS EN 301 893 -+ (5170 - 5250 @ 80), (23), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW -+ # II.H01 of the List, I.54 from the List, BDS EN 301 893 - (5490 - 5710 @ 160), (27), DFS -- # 5 GHz Short Range Devices, ref: -- # Etsi EN 300 440-1 -- # Etsi EN 300 440-2 -- # http://crc.bg/files/_bg/Spisak_2015.pdf -- # http://crc.bg/files/_bg/Pravila_2015_resh24.pdf -+ # Short range devices (SRDs) in the 5725-5875 MHz frequency range, ref: -+ # I.43 of the List, BDS EN 300 440-2, BDS EN 300 440-1 - (5725 - 5875 @ 80), (14) -- # 60 GHz band channels 1-4, ref: Etsi En 302 567 -- (57000 - 66000 @ 2160), (40) -+ # 60 GHz Multiple-Gigabit RLAN Systems, ref: -+ # II.H03 of the List, BDS EN 302 567-2 -+ (57000 - 66000 @ 2160), (40), NO-OUTDOOR - - country BH: DFS-JP - (2402 - 2482 @ 40), (20) -@@ -275,6 +291,12 @@ country CR: DFS-FCC - (5490 - 5730 @ 20), (24), DFS - (5735 - 5835 @ 20), (30) - -+# http://www.mincom.gob.cu/?q=marcoregulatorio -+# - Redes Informáticas -+# Resolución 127, 2011 - Reglamento Banda 2,4 GHz. -+country CU: DFS-FCC -+ (2400 - 2483.5 @ 40), (200 mW) -+ - country CX: DFS-FCC - (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW -@@ -302,28 +324,41 @@ country CZ: DFS-ETSI - # 60 GHz band channels 1-4, ref: Etsi En 302 567 - (57000 - 66000 @ 2160), (40) - --# Data from "Frequenznutzungsplan" (as published in April 2008), downloaded from --# http://www.bundesnetzagentur.de/cae/servlet/contentblob/38448/publicationFile/2659/Frequenznutzungsplan2008_Id17448pdf.pdf --# For the 5GHz range also see --# http://www.bundesnetzagentur.de/cae/servlet/contentblob/38216/publicationFile/6579/WLAN5GHzVfg7_2010_28042010pdf.pdf --# The values have been reduced by a factor of 2 (3db) for non TPC devices --# (in other words: devices with TPC can use twice the tx power of this table). --# Note that the docs do not require TPC for 5150--5250; the reduction to --# 100mW thus is not strictly required -- however the conservative 100mW -+# Allocation for the 2.4 GHz band (Vfg 10 / 2013, Allgemeinzuteilung von -+# Frequenzen für die Nutzung in lokalen Netzwerken; Wireless Local Area -+# Networks (WLAN-Funkanwendungen). -+# https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Allgemeinzuteilungen/2013_10_WLAN_2,4GHz_pdf.pdf -+# -+# Allocation for the 5 GHz band (Vfg. 7 / 2010, Allgemeinzuteilung von -+# Frequenzen in den Bereichen 5150 MHz - 5350 MHz und 5470 MHz - 5725 MHz für -+# Funkanwendungen zur breitbandigen Datenübertragung, WAS/WLAN („Wireless -+# Access Systems including Wireless Local Area Networks“). -+# https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Allgemeinzuteilungen/2010_07_WLAN_5GHz_pdf.pdf -+# The values for the 5 GHz have been reduced by a factor of 2 (3db) for non TPC -+# devices (in other words: devices with TPC can use twice the tx power of this -+# table). Note that the docs do not require TPC for 5150--5250; the reduction -+# to 100mW thus is not strictly required -- however the conservative 100mW - # limit is used here as the non-interference with radar and satellite - # apps relies on the attenuation by the building walls only in the - # absence of DFS; the neighbour countries have 100mW limit here as well. -+# -+# The ETSI EN 300 440-1 standard for short range devices in the 5 GHz band has -+# been implemented in Germany: -+# https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Allgemeinzuteilungen/2014_69_SRD_pdf.pdf -+# -+# Allocation for the 60 GHz band (Allgemeinzuteilung von Frequenzen im -+# Bereich 57 GHz - 66 GHz für Funkanwendungen für weitbandige -+# Datenübertragungssysteme; „Multiple Gigabit WAS/RLAN Systems (MGWS)“). -+# https://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Frequenzen/Allgemeinzuteilungen/2011_08_MGWS_pdf.pdf - - country DE: DFS-ETSI -- # entries 279004 and 280006 - (2400 - 2483.5 @ 40), (100 mW) -- # entry 303005 - (5150 - 5250 @ 80), (100 mW), NO-OUTDOOR, AUTO-BW -- # entries 304002 and 305002 - (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR, DFS, AUTO-BW -- # entries 308002, 309001 and 310003 - (5470 - 5725 @ 160), (500 mW), DFS -- # 60 GHz band channels 1-4, ref: Etsi En 302 567 -+ # short range devices (ETSI EN 300 440-1) -+ (5725 - 5875 @ 80), (25 mW) -+ # 60 GHz band channels 1-4 (ETSI EN 302 567) - (57000 - 66000 @ 2160), (40) - - country DK: DFS-ETSI -@@ -629,6 +664,9 @@ country KR: DFS-JP - (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5490 - 5710 @ 160), (30), DFS - (5735 - 5835 @ 80), (30) -+ # 60 GHz band channels 1-4, -+ # ref: http://www.law.go.kr/%ED%96%89%EC%A0%95%EA%B7%9C%EC%B9%99/%EB%AC%B4%EC%84%A0%EC%84%A4%EB%B9%84%EA%B7%9C%EC%B9%99 -+ (57000 - 66000 @ 2160), (43) - - country KW: DFS-ETSI - (2402 - 2482 @ 40), (20) -@@ -844,11 +882,18 @@ country NI: DFS-FCC - (5490 - 5730 @ 160), (24), DFS - (5735 - 5835 @ 80), (30) - -+# Regulation on the use of frequency space without a license and -+# without notification 2015 -+# -+# http://wetten.overheid.nl/BWBR0036378/2015-03-05 -+ - country NL: DFS-ETSI - (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), NO-OUTDOOR, AUTO-BW - (5250 - 5330 @ 80), (20), NO-OUTDOOR, DFS, AUTO-BW - (5490 - 5710 @ 160), (27), DFS -+ # short range devices (ETSI EN 300 440-1) -+ (5725 - 5875 @ 80), (25 mW) - # 60 GHz band channels 1-4, ref: Etsi En 302 567 - (57000 - 66000 @ 2160), (40) - diff --git a/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch b/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch deleted file mode 100644 index 9adfd8f..0000000 @@ -1382,157 +1250,6 @@ index 9b672a8..0000000 - /* - * Complicated way of saying: We only backport netdev_rss_key stuff on kernels - * that either already have net_get_random_once() (>= 3.13) or where we've been -diff --git a/package/kernel/mac80211/patches/006-add-basic-register-field-manipulation-macros.patch b/package/kernel/mac80211/patches/006-add-basic-register-field-manipulation-macros.patch -new file mode 100644 -index 0000000..a51edf8 ---- /dev/null -+++ b/package/kernel/mac80211/patches/006-add-basic-register-field-manipulation-macros.patch -@@ -0,0 +1,145 @@ -+From: Jakub Kicinski -+Date: Wed, 31 Aug 2016 12:46:44 +0100 -+Subject: [PATCH] add basic register-field manipulation macros -+ -+Common approach to accessing register fields is to define -+structures or sets of macros containing mask and shift pair. -+Operations on the register are then performed as follows: -+ -+ field = (reg >> shift) & mask; -+ -+ reg &= ~(mask << shift); -+ reg |= (field & mask) << shift; -+ -+Defining shift and mask separately is tedious. Ivo van Doorn -+came up with an idea of computing them at compilation time -+based on a single shifted mask (later refined by Felix) which -+can be used like this: -+ -+ #define REG_FIELD 0x000ff000 -+ -+ field = FIELD_GET(REG_FIELD, reg); -+ -+ reg &= ~REG_FIELD; -+ reg |= FIELD_PREP(REG_FIELD, field); -+ -+FIELD_{GET,PREP} macros take care of finding out what the -+appropriate shift is based on compilation time ffs operation. -+ -+GENMASK can be used to define registers (which is usually -+less error-prone and easier to match with datasheets). -+ -+This approach is the most convenient I've seen so to limit code -+multiplication let's move the macros to a global header file. -+Attempts to use static inlines instead of macros failed due -+to false positive triggering of BUILD_BUG_ON()s, especially with -+GCC < 6.0. -+ -+Signed-off-by: Jakub Kicinski -+Reviewed-by: Dinan Gunawardena -+--- -+ create mode 100644 include/linux/bitfield.h -+ -+--- /dev/null -++++ b/include/linux/bitfield.h -+@@ -0,0 +1,100 @@ -++/* -++ * Copyright (C) 2014 Felix Fietkau -++ * Copyright (C) 2004 - 2009 Ivo van Doorn -++ * -++ * This program is free software; you can redistribute it and/or modify -++ * it under the terms of the GNU General Public License version 2 -++ * as published by the Free Software Foundation -++ * -++ * This program is distributed in the hope that it will be useful, -++ * but WITHOUT ANY WARRANTY; without even the implied warranty of -++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -++ * GNU General Public License for more details. -++ */ -++ -++#ifndef _LINUX_BITFIELD_H -++#define _LINUX_BITFIELD_H -++ -++#include -++ -++#ifdef __CHECKER__ -++#define __BUILD_BUG_ON_NOT_POWER_OF_2(n) (0) -++#else -++#define __BUILD_BUG_ON_NOT_POWER_OF_2(n) \ -++ BUILD_BUG_ON(((n) & ((n) - 1)) != 0) -++#endif -++ -++/* -++ * Bitfield access macros -++ * -++ * FIELD_{GET,PREP} macros take as first parameter shifted mask -++ * from which they extract the base mask and shift amount. -++ * Mask must be a compilation time constant. -++ * -++ * Example: -++ * -++ * #define REG_FIELD_A GENMASK(6, 0) -++ * #define REG_FIELD_B BIT(7) -++ * #define REG_FIELD_C GENMASK(15, 8) -++ * #define REG_FIELD_D GENMASK(31, 16) -++ * -++ * Get: -++ * a = FIELD_GET(REG_FIELD_A, reg); -++ * b = FIELD_GET(REG_FIELD_B, reg); -++ * -++ * Set: -++ * reg = FIELD_PREP(REG_FIELD_A, 1) | -++ * FIELD_PREP(REG_FIELD_B, 0) | -++ * FIELD_PREP(REG_FIELD_C, c) | -++ * FIELD_PREP(REG_FIELD_D, 0x40); -++ * -++ * Modify: -++ * reg &= ~REG_FIELD_C; -++ * reg |= FIELD_PREP(REG_FIELD_C, c); -++ */ -++ -++#define __bf_shf(x) (__builtin_ffsll(x) - 1) -++ -++#define __BF_FIELD_CHECK(_mask, _reg, _val, _pfx) \ -++ ({ \ -++ BUILD_BUG_ON_MSG(!__builtin_constant_p(_mask), \ -++ _pfx "mask is not constant"); \ -++ BUILD_BUG_ON_MSG(!(_mask), _pfx "mask is zero"); \ -++ BUILD_BUG_ON_MSG(__builtin_constant_p(_val) ? \ -++ ~((_mask) >> __bf_shf(_mask)) & (_val) : 0, \ -++ _pfx "value too large for the field"); \ -++ BUILD_BUG_ON_MSG((_mask) > (typeof(_reg))~0ull, \ -++ _pfx "type of reg too small for mask"); \ -++ __BUILD_BUG_ON_NOT_POWER_OF_2((_mask) + \ -++ (1ULL << __bf_shf(_mask))); \ -++ }) -++ -++/** -++ * FIELD_PREP() - prepare a bitfield element -++ * @_mask: shifted mask defining the field's length and position -++ * @_val: value to put in the field -++ * -++ * FIELD_PREP() masks and shifts up the value. The result should -++ * be combined with other fields of the bitfield using logical OR. -++ */ -++#define FIELD_PREP(_mask, _val) \ -++ ({ \ -++ __BF_FIELD_CHECK(_mask, 0ULL, _val, "FIELD_PREP: "); \ -++ ((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask); \ -++ }) -++ -++/** -++ * FIELD_GET() - extract a bitfield element -++ * @_mask: shifted mask defining the field's length and position -++ * @_reg: 32bit value of entire bitfield -++ * -++ * FIELD_GET() extracts the field specified by @_mask from the -++ * bitfield passed in as @_reg by masking and shifting it down. -++ */ -++#define FIELD_GET(_mask, _reg) \ -++ ({ \ -++ __BF_FIELD_CHECK(_mask, _reg, 0U, "FIELD_GET: "); \ -++ (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); \ -++ }) -++ -++#endif diff --git a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch index fd1e1cf..8be5fa1 100644 --- a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch @@ -5571,45 +5288,883 @@ index b646ab3..0000000 - EXPORT_SYMBOL(ieee80211_data_to_8023); - - int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr, -diff --git a/package/kernel/mac80211/patches/320-ath9k-fix-using-sta-drv_priv-before-initializing-it.patch b/package/kernel/mac80211/patches/320-ath9k-fix-using-sta-drv_priv-before-initializing-it.patch +diff --git a/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch b/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch new file mode 100644 -index 0000000..aaa6706 +index 0000000..f8b8f86 --- /dev/null -+++ b/package/kernel/mac80211/patches/320-ath9k-fix-using-sta-drv_priv-before-initializing-it.patch -@@ -0,0 +1,33 @@ -+From: Felix Fietkau -+Date: Tue, 2 Aug 2016 13:00:01 +0200 -+Subject: [PATCH] ath9k: fix using sta->drv_priv before initializing it ++++ b/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch +@@ -0,0 +1,871 @@ ++From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= ++Date: Wed, 6 Jul 2016 21:34:17 +0200 ++Subject: [PATCH] ath9k: Switch to using mac80211 intermediate software queues. ++MIME-Version: 1.0 ++Content-Type: text/plain; charset=UTF-8 ++Content-Transfer-Encoding: 8bit + -+A station pointer can be passed to the driver on tx, before it has been -+marked as associated. Since ath9k_sta_state was initializing the entry -+too late, it resulted in some spurious crashes. ++This switches ath9k over to using the mac80211 intermediate software ++queueing mechanism for data packets. It removes the queueing inside the ++driver, except for the retry queue, and instead pulls from mac80211 when ++a packet is needed. The retry queue is used to store a packet that was ++pulled but can't be sent immediately. + -+Fixes: df3c6eb34da5 ("ath9k: Use sta_state() callback") -+Cc: stable@vger.kernel.org -+Signed-off-by: Felix Fietkau ++The old code path in ath_tx_start that would queue packets has been ++removed completely, as has the qlen limit tunables (since there's no ++longer a queue in the driver to limit). ++ ++Based on Tim's original patch set, but reworked quite thoroughly. ++ ++Cc: Tim Shepard ++Cc: Felix Fietkau ++Signed-off-by: Toke Høiland-Jørgensen +--- + ++--- a/drivers/net/wireless/ath/ath9k/ath9k.h +++++ b/drivers/net/wireless/ath/ath9k/ath9k.h ++@@ -91,7 +91,6 @@ int ath_descdma_setup(struct ath_softc * ++ #define ATH_RXBUF 512 ++ #define ATH_TXBUF 512 ++ #define ATH_TXBUF_RESERVE 5 ++-#define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE) ++ #define ATH_TXMAXTRY 13 ++ #define ATH_MAX_SW_RETRIES 30 ++ ++@@ -145,7 +144,9 @@ int ath_descdma_setup(struct ath_softc * ++ #define BAW_WITHIN(_start, _bawsz, _seqno) \ ++ ((((_seqno) - (_start)) & 4095) < (_bawsz)) ++ ++-#define ATH_AN_2_TID(_an, _tidno) (&(_an)->tid[(_tidno)]) +++#define ATH_STA_2_TID(_sta, _tidno) ((struct ath_atx_tid *)(_sta)->txq[_tidno]->drv_priv) +++#define ATH_VIF_2_TID(_vif) ((struct ath_atx_tid *)(_vif)->txq->drv_priv) +++#define ATH_AN_2_TID(_an, _tidno) ((_an)->sta ? ATH_STA_2_TID((_an)->sta, _tidno) : ATH_VIF_2_TID((_an)->vif)) ++ ++ #define IS_HT_RATE(rate) (rate & 0x80) ++ #define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e)) ++@@ -164,7 +165,6 @@ struct ath_txq { ++ spinlock_t axq_lock; ++ u32 axq_depth; ++ u32 axq_ampdu_depth; ++- bool stopped; ++ bool axq_tx_inprogress; ++ struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; ++ u8 txq_headidx; ++@@ -232,7 +232,6 @@ struct ath_buf { ++ ++ struct ath_atx_tid { ++ struct list_head list; ++- struct sk_buff_head buf_q; ++ struct sk_buff_head retry_q; ++ struct ath_node *an; ++ struct ath_txq *txq; ++@@ -247,13 +246,13 @@ struct ath_atx_tid { ++ s8 bar_index; ++ bool active; ++ bool clear_ps_filter; +++ bool has_queued; ++ }; ++ ++ struct ath_node { ++ struct ath_softc *sc; ++ struct ieee80211_sta *sta; /* station struct we're part of */ ++ struct ieee80211_vif *vif; /* interface with which we're associated */ ++- struct ath_atx_tid tid[IEEE80211_NUM_TIDS]; ++ ++ u16 maxampdu; ++ u8 mpdudensity; ++@@ -276,7 +275,6 @@ struct ath_tx_control { ++ struct ath_node *an; ++ struct ieee80211_sta *sta; ++ u8 paprd; ++- bool force_channel; ++ }; ++ ++ ++@@ -293,7 +291,6 @@ struct ath_tx { ++ struct ath_descdma txdma; ++ struct ath_txq *txq_map[IEEE80211_NUM_ACS]; ++ struct ath_txq *uapsdq; ++- u32 txq_max_pending[IEEE80211_NUM_ACS]; ++ u16 max_aggr_framelen[IEEE80211_NUM_ACS][4][32]; ++ }; ++ ++@@ -585,6 +582,7 @@ void ath9k_release_buffered_frames(struc ++ u16 tids, int nframes, ++ enum ieee80211_frame_release_type reason, ++ bool more_data); +++void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue); ++ ++ /********/ ++ /* VIFs */ ++--- a/drivers/net/wireless/ath/ath9k/channel.c +++++ b/drivers/net/wireless/ath/ath9k/channel.c ++@@ -1007,7 +1007,6 @@ static void ath_scan_send_probe(struct a ++ goto error; ++ ++ txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO]; ++- txctl.force_channel = true; ++ if (ath_tx_start(sc->hw, skb, &txctl)) ++ goto error; ++ ++@@ -1130,7 +1129,6 @@ ath_chanctx_send_vif_ps_frame(struct ath ++ memset(&txctl, 0, sizeof(txctl)); ++ txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO]; ++ txctl.sta = sta; ++- txctl.force_channel = true; ++ if (ath_tx_start(sc->hw, skb, &txctl)) { ++ ieee80211_free_txskb(sc->hw, skb); ++ return false; ++--- a/drivers/net/wireless/ath/ath9k/debug.c +++++ b/drivers/net/wireless/ath/ath9k/debug.c ++@@ -600,7 +600,6 @@ static int read_file_xmit(struct seq_fil ++ PR("MPDUs XRetried: ", xretries); ++ PR("Aggregates: ", a_aggr); ++ PR("AMPDUs Queued HW:", a_queued_hw); ++- PR("AMPDUs Queued SW:", a_queued_sw); ++ PR("AMPDUs Completed:", a_completed); ++ PR("AMPDUs Retried: ", a_retries); ++ PR("AMPDUs XRetried: ", a_xretries); ++@@ -629,8 +628,7 @@ static void print_queue(struct ath_softc ++ seq_printf(file, "%s: %d ", "qnum", txq->axq_qnum); ++ seq_printf(file, "%s: %2d ", "qdepth", txq->axq_depth); ++ seq_printf(file, "%s: %2d ", "ampdu-depth", txq->axq_ampdu_depth); ++- seq_printf(file, "%s: %3d ", "pending", txq->pending_frames); ++- seq_printf(file, "%s: %d\n", "stopped", txq->stopped); +++ seq_printf(file, "%s: %3d\n", "pending", txq->pending_frames); ++ ++ ath_txq_unlock(sc, txq); ++ } ++@@ -1208,7 +1206,6 @@ static const char ath9k_gstrings_stats[] ++ AMKSTR(d_tx_mpdu_xretries), ++ AMKSTR(d_tx_aggregates), ++ AMKSTR(d_tx_ampdus_queued_hw), ++- AMKSTR(d_tx_ampdus_queued_sw), ++ AMKSTR(d_tx_ampdus_completed), ++ AMKSTR(d_tx_ampdu_retries), ++ AMKSTR(d_tx_ampdu_xretries), ++@@ -1288,7 +1285,6 @@ void ath9k_get_et_stats(struct ieee80211 ++ AWDATA(xretries); ++ AWDATA(a_aggr); ++ AWDATA(a_queued_hw); ++- AWDATA(a_queued_sw); ++ AWDATA(a_completed); ++ AWDATA(a_retries); ++ AWDATA(a_xretries); ++@@ -1346,14 +1342,6 @@ int ath9k_init_debug(struct ath_hw *ah) ++ read_file_xmit); ++ debugfs_create_devm_seqfile(sc->dev, "queues", sc->debug.debugfs_phy, ++ read_file_queues); ++- debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, ++- &sc->tx.txq_max_pending[IEEE80211_AC_BK]); ++- debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, ++- &sc->tx.txq_max_pending[IEEE80211_AC_BE]); ++- debugfs_create_u32("qlen_vi", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, ++- &sc->tx.txq_max_pending[IEEE80211_AC_VI]); ++- debugfs_create_u32("qlen_vo", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, ++- &sc->tx.txq_max_pending[IEEE80211_AC_VO]); ++ debugfs_create_devm_seqfile(sc->dev, "misc", sc->debug.debugfs_phy, ++ read_file_misc); ++ debugfs_create_devm_seqfile(sc->dev, "reset", sc->debug.debugfs_phy, ++--- a/drivers/net/wireless/ath/ath9k/debug.h +++++ b/drivers/net/wireless/ath/ath9k/debug.h ++@@ -147,7 +147,6 @@ struct ath_interrupt_stats { ++ * @completed: Total MPDUs (non-aggr) completed ++ * @a_aggr: Total no. of aggregates queued ++ * @a_queued_hw: Total AMPDUs queued to hardware ++- * @a_queued_sw: Total AMPDUs queued to software queues ++ * @a_completed: Total AMPDUs completed ++ * @a_retries: No. of AMPDUs retried (SW) ++ * @a_xretries: No. of AMPDUs dropped due to xretries ++@@ -174,7 +173,6 @@ struct ath_tx_stats { ++ u32 xretries; ++ u32 a_aggr; ++ u32 a_queued_hw; ++- u32 a_queued_sw; ++ u32 a_completed; ++ u32 a_retries; ++ u32 a_xretries; ++--- a/drivers/net/wireless/ath/ath9k/debug_sta.c +++++ b/drivers/net/wireless/ath/ath9k/debug_sta.c ++@@ -52,8 +52,8 @@ static ssize_t read_file_node_aggr(struc ++ "TID", "SEQ_START", "SEQ_NEXT", "BAW_SIZE", ++ "BAW_HEAD", "BAW_TAIL", "BAR_IDX", "SCHED", "PAUSED"); ++ ++- for (tidno = 0, tid = &an->tid[tidno]; ++- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { +++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +++ tid = ATH_STA_2_TID(an->sta, tidno); ++ txq = tid->txq; ++ ath_txq_lock(sc, txq); ++ if (tid->active) { ++--- a/drivers/net/wireless/ath/ath9k/init.c +++++ b/drivers/net/wireless/ath/ath9k/init.c ++@@ -358,7 +358,6 @@ static int ath9k_init_queues(struct ath_ ++ for (i = 0; i < IEEE80211_NUM_ACS; i++) { ++ sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i); ++ sc->tx.txq_map[i]->mac80211_qnum = i; ++- sc->tx.txq_max_pending[i] = ATH_MAX_QDEPTH; ++ } ++ return 0; ++ } ++@@ -873,6 +872,7 @@ static void ath9k_set_hw_capab(struct at ++ hw->max_rate_tries = 10; ++ hw->sta_data_size = sizeof(struct ath_node); ++ hw->vif_data_size = sizeof(struct ath_vif); +++ hw->txq_data_size = sizeof(struct ath_atx_tid); ++ hw->extra_tx_headroom = 4; ++ ++ hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1; +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c -+@@ -1563,13 +1563,13 @@ static int ath9k_sta_state(struct ieee80 -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ int ret = 0; ++@@ -2695,4 +2695,5 @@ struct ieee80211_ops ath9k_ops = { ++ .sw_scan_start = ath9k_sw_scan_start, ++ .sw_scan_complete = ath9k_sw_scan_complete, ++ .get_txpower = ath9k_get_txpower, +++ .wake_tx_queue = ath9k_wake_tx_queue, ++ }; ++--- a/drivers/net/wireless/ath/ath9k/xmit.c +++++ b/drivers/net/wireless/ath/ath9k/xmit.c ++@@ -65,6 +65,8 @@ static struct ath_buf *ath_tx_setup_buff ++ struct ath_txq *txq, ++ struct ath_atx_tid *tid, ++ struct sk_buff *skb); +++static int ath_tx_prepare(struct ieee80211_hw *hw, struct sk_buff *skb, +++ struct ath_tx_control *txctl); ++ ++ enum { ++ MCS_HT20, ++@@ -118,6 +120,26 @@ static void ath_tx_queue_tid(struct ath_ ++ list_add_tail(&tid->list, list); ++ } ++ +++void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue) +++{ +++ struct ath_softc *sc = hw->priv; +++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); +++ struct ath_atx_tid *tid = (struct ath_atx_tid *) queue->drv_priv; +++ struct ath_txq *txq = tid->txq; +++ +++ ath_dbg(common, QUEUE, "Waking TX queue: %pM (%d)\n", +++ queue->sta ? queue->sta->addr : queue->vif->addr, +++ tid->tidno); +++ +++ ath_txq_lock(sc, txq); +++ +++ tid->has_queued = true; +++ ath_tx_queue_tid(sc, txq, tid); +++ ath_txq_schedule(sc, txq); +++ +++ ath_txq_unlock(sc, txq); +++} +++ ++ static struct ath_frame_info *get_frame_info(struct sk_buff *skb) ++ { ++ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); ++@@ -160,7 +182,6 @@ static void ath_set_rates(struct ieee802 ++ static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, ++ struct sk_buff *skb) ++ { ++- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); ++ struct ath_frame_info *fi = get_frame_info(skb); ++ int q = fi->txq; ++ ++@@ -171,14 +192,6 @@ static void ath_txq_skb_done(struct ath_ ++ if (WARN_ON(--txq->pending_frames < 0)) ++ txq->pending_frames = 0; ++ ++- if (txq->stopped && ++- txq->pending_frames < sc->tx.txq_max_pending[q]) { ++- if (ath9k_is_chanctx_enabled()) ++- ieee80211_wake_queue(sc->hw, info->hw_queue); ++- else ++- ieee80211_wake_queue(sc->hw, q); ++- txq->stopped = false; ++- } ++ } ++ ++ static struct ath_atx_tid * ++@@ -188,9 +201,47 @@ ath_get_skb_tid(struct ath_softc *sc, st ++ return ATH_AN_2_TID(an, tidno); ++ } ++ +++static struct sk_buff * +++ath_tid_pull(struct ath_atx_tid *tid) +++{ +++ struct ath_softc *sc = tid->an->sc; +++ struct ieee80211_hw *hw = sc->hw; +++ struct ath_tx_control txctl = { +++ .txq = tid->txq, +++ .sta = tid->an->sta, +++ }; +++ struct sk_buff *skb; +++ struct ath_frame_info *fi; +++ int q; +++ +++ if (!tid->has_queued) +++ return NULL; +++ +++ skb = ieee80211_tx_dequeue(hw, container_of((void*)tid, struct ieee80211_txq, drv_priv)); +++ if (!skb) { +++ tid->has_queued = false; +++ return NULL; +++ } +++ +++ if (ath_tx_prepare(hw, skb, &txctl)) { +++ ieee80211_free_txskb(hw, skb); +++ return NULL; +++ } +++ +++ q = skb_get_queue_mapping(skb); +++ if (tid->txq == sc->tx.txq_map[q]) { +++ fi = get_frame_info(skb); +++ fi->txq = q; +++ ++tid->txq->pending_frames; +++ } +++ +++ return skb; +++ } +++ +++ ++ static bool ath_tid_has_buffered(struct ath_atx_tid *tid) ++ { ++- return !skb_queue_empty(&tid->buf_q) || !skb_queue_empty(&tid->retry_q); +++ return !skb_queue_empty(&tid->retry_q) || tid->has_queued; ++ } ++ ++ static struct sk_buff *ath_tid_dequeue(struct ath_atx_tid *tid) ++@@ -199,46 +250,11 @@ static struct sk_buff *ath_tid_dequeue(s ++ ++ skb = __skb_dequeue(&tid->retry_q); ++ if (!skb) ++- skb = __skb_dequeue(&tid->buf_q); +++ skb = ath_tid_pull(tid); ++ ++ return skb; ++ } ++ ++-/* ++- * ath_tx_tid_change_state: ++- * - clears a-mpdu flag of previous session ++- * - force sequence number allocation to fix next BlockAck Window ++- */ ++-static void ++-ath_tx_tid_change_state(struct ath_softc *sc, struct ath_atx_tid *tid) ++-{ ++- struct ath_txq *txq = tid->txq; ++- struct ieee80211_tx_info *tx_info; ++- struct sk_buff *skb, *tskb; ++- struct ath_buf *bf; ++- struct ath_frame_info *fi; ++- ++- skb_queue_walk_safe(&tid->buf_q, skb, tskb) { ++- fi = get_frame_info(skb); ++- bf = fi->bf; ++- ++- tx_info = IEEE80211_SKB_CB(skb); ++- tx_info->flags &= ~IEEE80211_TX_CTL_AMPDU; ++- ++- if (bf) ++- continue; ++- ++- bf = ath_tx_setup_buffer(sc, txq, tid, skb); ++- if (!bf) { ++- __skb_unlink(skb, &tid->buf_q); ++- ath_txq_skb_done(sc, txq, skb); ++- ieee80211_free_txskb(sc->hw, skb); ++- continue; ++- } ++- } ++- ++-} ++- ++ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) ++ { ++ struct ath_txq *txq = tid->txq; ++@@ -873,20 +889,16 @@ static int ath_compute_num_delims(struct ++ ++ static struct ath_buf * ++ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq, ++- struct ath_atx_tid *tid, struct sk_buff_head **q) +++ struct ath_atx_tid *tid) ++ { ++ struct ieee80211_tx_info *tx_info; ++ struct ath_frame_info *fi; ++- struct sk_buff *skb; +++ struct sk_buff *skb, *first_skb = NULL; ++ struct ath_buf *bf; ++ u16 seqno; ++ ++ while (1) { ++- *q = &tid->retry_q; ++- if (skb_queue_empty(*q)) ++- *q = &tid->buf_q; ++- ++- skb = skb_peek(*q); +++ skb = ath_tid_dequeue(tid); ++ if (!skb) ++ break; ++ ++@@ -898,7 +910,6 @@ ath_tx_get_tid_subframe(struct ath_softc ++ bf->bf_state.stale = false; ++ ++ if (!bf) { ++- __skb_unlink(skb, *q); ++ ath_txq_skb_done(sc, txq, skb); ++ ieee80211_free_txskb(sc->hw, skb); ++ continue; ++@@ -927,8 +938,19 @@ ath_tx_get_tid_subframe(struct ath_softc ++ seqno = bf->bf_state.seqno; ++ ++ /* do not step over block-ack window */ ++- if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) +++ if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) { +++ __skb_queue_tail(&tid->retry_q, skb); +++ +++ /* If there are other skbs in the retry q, they are +++ * probably within the BAW, so loop immediately to get +++ * one of them. Otherwise the queue can get stuck. */ +++ if (!skb_queue_is_first(&tid->retry_q, skb) && skb != first_skb) { +++ if(!first_skb) /* infinite loop prevention */ +++ first_skb = skb; +++ continue; +++ } ++ break; +++ } ++ ++ if (tid->bar_index > ATH_BA_INDEX(tid->seq_start, seqno)) { ++ struct ath_tx_status ts = {}; ++@@ -936,7 +958,6 @@ ath_tx_get_tid_subframe(struct ath_softc ++ ++ INIT_LIST_HEAD(&bf_head); ++ list_add(&bf->list, &bf_head); ++- __skb_unlink(skb, *q); ++ ath_tx_update_baw(sc, tid, seqno); ++ ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); ++ continue; ++@@ -948,11 +969,10 @@ ath_tx_get_tid_subframe(struct ath_softc ++ return NULL; ++ } ++ ++-static bool +++static int ++ ath_tx_form_aggr(struct ath_softc *sc, struct ath_txq *txq, ++ struct ath_atx_tid *tid, struct list_head *bf_q, ++- struct ath_buf *bf_first, struct sk_buff_head *tid_q, ++- int *aggr_len) +++ struct ath_buf *bf_first) ++ { ++ #define PADBYTES(_len) ((4 - ((_len) % 4)) % 4) ++ struct ath_buf *bf = bf_first, *bf_prev = NULL; ++@@ -962,12 +982,13 @@ ath_tx_form_aggr(struct ath_softc *sc, s ++ struct ieee80211_tx_info *tx_info; ++ struct ath_frame_info *fi; ++ struct sk_buff *skb; ++- bool closed = false; +++ ++ ++ bf = bf_first; ++ aggr_limit = ath_lookup_rate(sc, bf, tid); ++ ++- do { +++ while (bf) +++ { ++ skb = bf->bf_mpdu; ++ fi = get_frame_info(skb); ++ ++@@ -976,12 +997,12 @@ ath_tx_form_aggr(struct ath_softc *sc, s ++ if (nframes) { ++ if (aggr_limit < al + bpad + al_delta || ++ ath_lookup_legacy(bf) || nframes >= h_baw) ++- break; +++ goto stop; ++ ++ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); ++ if ((tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) || ++ !(tx_info->flags & IEEE80211_TX_CTL_AMPDU)) ++- break; +++ goto stop; ++ } ++ ++ /* add padding for previous frame to aggregation length */ ++@@ -1003,20 +1024,18 @@ ath_tx_form_aggr(struct ath_softc *sc, s ++ ath_tx_addto_baw(sc, tid, bf); ++ bf->bf_state.ndelim = ndelim; ++ ++- __skb_unlink(skb, tid_q); ++ list_add_tail(&bf->list, bf_q); ++ if (bf_prev) ++ bf_prev->bf_next = bf; ++ ++ bf_prev = bf; ++ ++- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); ++- if (!bf) { ++- closed = true; ++- break; ++- } ++- } while (ath_tid_has_buffered(tid)); ++- +++ bf = ath_tx_get_tid_subframe(sc, txq, tid); +++ } +++ goto finish; +++stop: +++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); +++finish: ++ bf = bf_first; ++ bf->bf_lastbf = bf_prev; ++ ++@@ -1027,9 +1046,7 @@ ath_tx_form_aggr(struct ath_softc *sc, s ++ TX_STAT_INC(txq->axq_qnum, a_aggr); ++ } ++ ++- *aggr_len = al; ++- ++- return closed; +++ return al; ++ #undef PADBYTES ++ } ++ ++@@ -1406,18 +1423,15 @@ static void ath_tx_fill_desc(struct ath_ ++ static void ++ ath_tx_form_burst(struct ath_softc *sc, struct ath_txq *txq, ++ struct ath_atx_tid *tid, struct list_head *bf_q, ++- struct ath_buf *bf_first, struct sk_buff_head *tid_q) +++ struct ath_buf *bf_first) ++ { ++ struct ath_buf *bf = bf_first, *bf_prev = NULL; ++- struct sk_buff *skb; ++ int nframes = 0; ++ ++ do { ++ struct ieee80211_tx_info *tx_info; ++- skb = bf->bf_mpdu; ++ ++ nframes++; ++- __skb_unlink(skb, tid_q); ++ list_add_tail(&bf->list, bf_q); ++ if (bf_prev) ++ bf_prev->bf_next = bf; ++@@ -1426,13 +1440,15 @@ ath_tx_form_burst(struct ath_softc *sc, ++ if (nframes >= 2) ++ break; ++ ++- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); +++ bf = ath_tx_get_tid_subframe(sc, txq, tid); ++ if (!bf) ++ break; ++ ++ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); ++- if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) +++ if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) { +++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); ++ break; +++ } ++ ++ ath_set_rates(tid->an->vif, tid->an->sta, bf, false); ++ } while (1); ++@@ -1443,34 +1459,33 @@ static bool ath_tx_sched_aggr(struct ath ++ { ++ struct ath_buf *bf; ++ struct ieee80211_tx_info *tx_info; ++- struct sk_buff_head *tid_q; ++ struct list_head bf_q; ++ int aggr_len = 0; ++- bool aggr, last = true; +++ bool aggr; ++ ++ if (!ath_tid_has_buffered(tid)) ++ return false; ++ ++ INIT_LIST_HEAD(&bf_q); ++ ++- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); +++ bf = ath_tx_get_tid_subframe(sc, txq, tid); ++ if (!bf) ++ return false; ++ ++ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); ++ aggr = !!(tx_info->flags & IEEE80211_TX_CTL_AMPDU); ++ if ((aggr && txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) || ++- (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { +++ (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { +++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); ++ *stop = true; ++ return false; ++ } ++ ++ ath_set_rates(tid->an->vif, tid->an->sta, bf, false); ++ if (aggr) ++- last = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf, ++- tid_q, &aggr_len); +++ aggr_len = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf); ++ else ++- ath_tx_form_burst(sc, txq, tid, &bf_q, bf, tid_q); +++ ath_tx_form_burst(sc, txq, tid, &bf_q, bf); ++ ++ if (list_empty(&bf_q)) ++ return false; ++@@ -1513,9 +1528,6 @@ int ath_tx_aggr_start(struct ath_softc * ++ an->mpdudensity = density; ++ } ++ ++- /* force sequence number allocation for pending frames */ ++- ath_tx_tid_change_state(sc, txtid); ++- ++ txtid->active = true; ++ *ssn = txtid->seq_start = txtid->seq_next; ++ txtid->bar_index = -1; ++@@ -1540,7 +1552,6 @@ void ath_tx_aggr_stop(struct ath_softc * ++ ath_txq_lock(sc, txq); ++ txtid->active = false; ++ ath_tx_flush_tid(sc, txtid); ++- ath_tx_tid_change_state(sc, txtid); ++ ath_txq_unlock_complete(sc, txq); ++ } ++ ++@@ -1550,14 +1561,12 @@ void ath_tx_aggr_sleep(struct ieee80211_ ++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); ++ struct ath_atx_tid *tid; ++ struct ath_txq *txq; ++- bool buffered; ++ int tidno; ++ ++ ath_dbg(common, XMIT, "%s called\n", __func__); ++ ++- for (tidno = 0, tid = &an->tid[tidno]; ++- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { ++- +++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +++ tid = ATH_AN_2_TID(an, tidno); ++ txq = tid->txq; ++ ++ ath_txq_lock(sc, txq); ++@@ -1567,13 +1576,12 @@ void ath_tx_aggr_sleep(struct ieee80211_ ++ continue; ++ } ++ ++- buffered = ath_tid_has_buffered(tid); +++ if (!skb_queue_empty(&tid->retry_q)) +++ ieee80211_sta_set_buffered(sta, tid->tidno, true); ++ ++ list_del_init(&tid->list); ++ ++ ath_txq_unlock(sc, txq); ++- ++- ieee80211_sta_set_buffered(sta, tidno, buffered); ++ } ++ } ++ ++@@ -1586,19 +1594,16 @@ void ath_tx_aggr_wakeup(struct ath_softc ++ ++ ath_dbg(common, XMIT, "%s called\n", __func__); ++ ++- for (tidno = 0, tid = &an->tid[tidno]; ++- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { ++- +++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +++ tid = ATH_AN_2_TID(an, tidno); ++ txq = tid->txq; ++ ++ ath_txq_lock(sc, txq); ++ tid->clear_ps_filter = true; ++- ++ if (ath_tid_has_buffered(tid)) { ++ ath_tx_queue_tid(sc, txq, tid); ++ ath_txq_schedule(sc, txq); ++ } ++- ++ ath_txq_unlock_complete(sc, txq); ++ } ++ } ++@@ -1621,11 +1626,6 @@ void ath_tx_aggr_resume(struct ath_softc ++ ++ tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; ++ ++- if (ath_tid_has_buffered(tid)) { ++- ath_tx_queue_tid(sc, txq, tid); ++- ath_txq_schedule(sc, txq); ++- } ++- ++ ath_txq_unlock_complete(sc, txq); ++ } ++ ++@@ -1641,7 +1641,6 @@ void ath9k_release_buffered_frames(struc ++ struct ieee80211_tx_info *info; ++ struct list_head bf_q; ++ struct ath_buf *bf_tail = NULL, *bf; ++- struct sk_buff_head *tid_q; ++ int sent = 0; ++ int i; ++ ++@@ -1656,11 +1655,10 @@ void ath9k_release_buffered_frames(struc ++ ++ ath_txq_lock(sc, tid->txq); ++ while (nframes > 0) { ++- bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid, &tid_q); +++ bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid); ++ if (!bf) ++ break; ++ ++- __skb_unlink(bf->bf_mpdu, tid_q); ++ list_add_tail(&bf->list, &bf_q); ++ ath_set_rates(tid->an->vif, tid->an->sta, bf, true); ++ if (bf_isampdu(bf)) { ++@@ -1675,7 +1673,7 @@ void ath9k_release_buffered_frames(struc ++ sent++; ++ TX_STAT_INC(txq->axq_qnum, a_queued_hw); ++ ++- if (an->sta && !ath_tid_has_buffered(tid)) +++ if (an->sta && skb_queue_empty(&tid->retry_q)) ++ ieee80211_sta_set_buffered(an->sta, i, false); ++ } ++ ath_txq_unlock_complete(sc, tid->txq); ++@@ -1902,13 +1900,7 @@ bool ath_drain_all_txq(struct ath_softc ++ if (!ATH_TXQ_SETUP(sc, i)) ++ continue; ++ ++- /* ++- * The caller will resume queues with ieee80211_wake_queues. ++- * Mark the queue as not stopped to prevent ath_tx_complete ++- * from waking the queue too early. ++- */ ++ txq = &sc->tx.txq[i]; ++- txq->stopped = false; ++ ath_draintxq(sc, txq); ++ } ++ ++@@ -2308,15 +2300,12 @@ int ath_tx_start(struct ieee80211_hw *hw ++ struct ath_txq *txq = txctl->txq; ++ struct ath_atx_tid *tid = NULL; ++ struct ath_buf *bf; ++- bool queue, ps_resp; +++ bool ps_resp; ++ int q, ret; ++ ++ if (vif) ++ avp = (void *)vif->drv_priv; ++ ++- if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) ++- txctl->force_channel = true; ++- ++ ps_resp = !!(info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE); ++ ++ ret = ath_tx_prepare(hw, skb, txctl); ++@@ -2331,63 +2320,13 @@ int ath_tx_start(struct ieee80211_hw *hw ++ ++ q = skb_get_queue_mapping(skb); ++ +++ if (ps_resp) +++ txq = sc->tx.uapsdq; +++ ++ ath_txq_lock(sc, txq); ++ if (txq == sc->tx.txq_map[q]) { ++ fi->txq = q; ++- if (++txq->pending_frames > sc->tx.txq_max_pending[q] && ++- !txq->stopped) { ++- if (ath9k_is_chanctx_enabled()) ++- ieee80211_stop_queue(sc->hw, info->hw_queue); ++- else ++- ieee80211_stop_queue(sc->hw, q); ++- txq->stopped = true; ++- } ++- } ++- ++- queue = ieee80211_is_data_present(hdr->frame_control); ++- ++- /* If chanctx, queue all null frames while NOA could be there */ ++- if (ath9k_is_chanctx_enabled() && ++- ieee80211_is_nullfunc(hdr->frame_control) && ++- !txctl->force_channel) ++- queue = true; ++- ++- /* Force queueing of all frames that belong to a virtual interface on ++- * a different channel context, to ensure that they are sent on the ++- * correct channel. ++- */ ++- if (((avp && avp->chanctx != sc->cur_chan) || ++- sc->cur_chan->stopped) && !txctl->force_channel) { ++- if (!txctl->an) ++- txctl->an = &avp->mcast_node; ++- queue = true; ++- ps_resp = false; ++- } ++- ++- if (txctl->an && queue) ++- tid = ath_get_skb_tid(sc, txctl->an, skb); ++- ++- if (ps_resp) { ++- ath_txq_unlock(sc, txq); ++- txq = sc->tx.uapsdq; ++- ath_txq_lock(sc, txq); ++- } else if (txctl->an && queue) { ++- WARN_ON(tid->txq != txctl->txq); ++- ++- if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) ++- tid->clear_ps_filter = true; ++- ++- /* ++- * Add this frame to software queue for scheduling later ++- * for aggregation. ++- */ ++- TX_STAT_INC(txq->axq_qnum, a_queued_sw); ++- __skb_queue_tail(&tid->buf_q, skb); ++- if (!txctl->an->sleeping) ++- ath_tx_queue_tid(sc, txq, tid); ++- ++- ath_txq_schedule(sc, txq); ++- goto out; +++ ++txq->pending_frames; ++ } ++ ++ bf = ath_tx_setup_buffer(sc, txq, tid, skb); ++@@ -2871,9 +2810,8 @@ void ath_tx_node_init(struct ath_softc * ++ struct ath_atx_tid *tid; ++ int tidno, acno; ++ ++- for (tidno = 0, tid = &an->tid[tidno]; ++- tidno < IEEE80211_NUM_TIDS; ++- tidno++, tid++) { +++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +++ tid = ATH_AN_2_TID(an, tidno); ++ tid->an = an; ++ tid->tidno = tidno; ++ tid->seq_start = tid->seq_next = 0; ++@@ -2881,11 +2819,14 @@ void ath_tx_node_init(struct ath_softc * ++ tid->baw_head = tid->baw_tail = 0; ++ tid->active = false; ++ tid->clear_ps_filter = true; ++- __skb_queue_head_init(&tid->buf_q); +++ tid->has_queued = false; ++ __skb_queue_head_init(&tid->retry_q); ++ INIT_LIST_HEAD(&tid->list); ++ acno = TID_TO_WME_AC(tidno); ++ tid->txq = sc->tx.txq_map[acno]; +++ +++ if (!an->sta) +++ break; /* just one multicast ath_atx_tid */ ++ } ++ } ++ ++@@ -2895,9 +2836,8 @@ void ath_tx_node_cleanup(struct ath_soft ++ struct ath_txq *txq; ++ int tidno; ++ ++- for (tidno = 0, tid = &an->tid[tidno]; ++- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { ++- +++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +++ tid = ATH_AN_2_TID(an, tidno); ++ txq = tid->txq; ++ ++ ath_txq_lock(sc, txq); ++@@ -2909,6 +2849,9 @@ void ath_tx_node_cleanup(struct ath_soft ++ tid->active = false; ++ ++ ath_txq_unlock(sc, txq); +++ +++ if (!an->sta) +++ break; /* just one multicast ath_atx_tid */ ++ } ++ } + -+- if (old_state == IEEE80211_STA_AUTH && -+- new_state == IEEE80211_STA_ASSOC) { -++ if (old_state == IEEE80211_STA_NOTEXIST && -++ new_state == IEEE80211_STA_NONE) { -+ ret = ath9k_sta_add(hw, vif, sta); -+ ath_dbg(common, CONFIG, -+ "Add station: %pM\n", sta->addr); -+- } else if (old_state == IEEE80211_STA_ASSOC && -+- new_state == IEEE80211_STA_AUTH) { -++ } else if (old_state == IEEE80211_STA_NONE && -++ new_state == IEEE80211_STA_NOTEXIST) { -+ ret = ath9k_sta_remove(hw, vif, sta); -+ ath_dbg(common, CONFIG, -+ "Remove station: %pM\n", sta->addr); diff --git a/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch b/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch deleted file mode 100644 index 2eeed22..0000000 @@ -7448,6 +8003,109 @@ index f7f9df9..0000000 - read_lock_bh(&pathtbl_resize_lock); - tbl = resize_dereference_mesh_paths(); - hash_idx = mesh_table_hash(addr, sdata, tbl); +diff --git a/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch +new file mode 100644 +index 0000000..cff32ad +--- /dev/null ++++ b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch +@@ -0,0 +1,97 @@ ++From: Felix Fietkau ++Date: Mon, 11 Jul 2016 11:35:55 +0200 ++Subject: [PATCH] ath9k_hw: implement temperature compensation support for ++ AR9003+ ++ ++Signed-off-by: Felix Fietkau ++--- ++ ++--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c +++++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c ++@@ -33,6 +33,7 @@ struct coeff { ++ ++ enum ar9003_cal_types { ++ IQ_MISMATCH_CAL = BIT(0), +++ TEMP_COMP_CAL = BIT(1), ++ }; ++ ++ static void ar9003_hw_setup_calibration(struct ath_hw *ah, ++@@ -58,6 +59,12 @@ static void ar9003_hw_setup_calibration( ++ /* Kick-off cal */ ++ REG_SET_BIT(ah, AR_PHY_TIMING4, AR_PHY_TIMING4_DO_CAL); ++ break; +++ case TEMP_COMP_CAL: +++ ath_dbg(common, CALIBRATE, +++ "starting Temperature Compensation Calibration\n"); +++ REG_SET_BIT(ah, AR_CH0_THERM, AR_CH0_THERM_LOCAL); +++ REG_SET_BIT(ah, AR_CH0_THERM, AR_CH0_THERM_START); +++ break; ++ default: ++ ath_err(common, "Invalid calibration type\n"); ++ break; ++@@ -86,7 +93,8 @@ static bool ar9003_hw_per_calibration(st ++ /* ++ * Accumulate cal measures for active chains ++ */ ++- cur_caldata->calCollect(ah); +++ if (cur_caldata->calCollect) +++ cur_caldata->calCollect(ah); ++ ah->cal_samples++; ++ ++ if (ah->cal_samples >= cur_caldata->calNumSamples) { ++@@ -99,7 +107,8 @@ static bool ar9003_hw_per_calibration(st ++ /* ++ * Process accumulated data ++ */ ++- cur_caldata->calPostProc(ah, numChains); +++ if (cur_caldata->calPostProc) +++ cur_caldata->calPostProc(ah, numChains); ++ ++ /* Calibration has finished. */ ++ caldata->CalValid |= cur_caldata->calType; ++@@ -314,9 +323,16 @@ static const struct ath9k_percal_data iq ++ ar9003_hw_iqcalibrate ++ }; ++ +++static const struct ath9k_percal_data temp_cal_single_sample = { +++ TEMP_COMP_CAL, +++ MIN_CAL_SAMPLES, +++ PER_MAX_LOG_COUNT, +++}; +++ ++ static void ar9003_hw_init_cal_settings(struct ath_hw *ah) ++ { ++ ah->iq_caldata.calData = &iq_cal_single_sample; +++ ah->temp_caldata.calData = &temp_cal_single_sample; ++ ++ if (AR_SREV_9300_20_OR_LATER(ah)) { ++ ah->enabled_cals |= TX_IQ_CAL; ++@@ -324,7 +340,7 @@ static void ar9003_hw_init_cal_settings( ++ ah->enabled_cals |= TX_IQ_ON_AGC_CAL; ++ } ++ ++- ah->supp_cals = IQ_MISMATCH_CAL; +++ ah->supp_cals = IQ_MISMATCH_CAL | TEMP_COMP_CAL; ++ } ++ ++ #define OFF_UPPER_LT 24 ++@@ -1383,6 +1399,9 @@ static void ar9003_hw_init_cal_common(st ++ INIT_CAL(&ah->iq_caldata); ++ INSERT_CAL(ah, &ah->iq_caldata); ++ +++ INIT_CAL(&ah->temp_caldata); +++ INSERT_CAL(ah, &ah->temp_caldata); +++ ++ /* Initialize current pointer to first element in list */ ++ ah->cal_list_curr = ah->cal_list; ++ ++--- a/drivers/net/wireless/ath/ath9k/hw.h +++++ b/drivers/net/wireless/ath/ath9k/hw.h ++@@ -830,6 +830,7 @@ struct ath_hw { ++ /* Calibration */ ++ u32 supp_cals; ++ struct ath9k_cal_list iq_caldata; +++ struct ath9k_cal_list temp_caldata; ++ struct ath9k_cal_list adcgain_caldata; ++ struct ath9k_cal_list adcdc_caldata; ++ struct ath9k_cal_list *cal_list; diff --git a/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch b/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch deleted file mode 100644 index 740993c..0000000 @@ -8146,702 +8804,6 @@ index 1fd016f..0000000 - int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr); - void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr); - #else -diff --git a/package/kernel/mac80211/patches/331-mac80211-End-the-MPSP-even-if-EOSP-frame-was-not-rec.patch b/package/kernel/mac80211/patches/331-mac80211-End-the-MPSP-even-if-EOSP-frame-was-not-rec.patch -new file mode 100644 -index 0000000..5d8a8fb ---- /dev/null -+++ b/package/kernel/mac80211/patches/331-mac80211-End-the-MPSP-even-if-EOSP-frame-was-not-rec.patch -@@ -0,0 +1,42 @@ -+From: Masashi Honma -+Date: Wed, 13 Jul 2016 16:04:35 +0900 -+Subject: [PATCH] mac80211: End the MPSP even if EOSP frame was not received -+ -+The mesh STA sends QoS frame with EOSP (end of service period) -+subfiled=1 to end the MPSP(mesh peer service period). Previously, if -+the frame was not acked by peer, the mesh STA did not end the MPSP. -+This patch ends the MPSP even if the QoS frame was no acked. -+ -+Signed-off-by: Masashi Honma -+--- -+ -+--- a/net/mac80211/status.c -++++ b/net/mac80211/status.c -+@@ -784,6 +784,13 @@ void ieee80211_tx_status(struct ieee8021 -+ clear_sta_flag(sta, WLAN_STA_SP); -+ -+ acked = !!(info->flags & IEEE80211_TX_STAT_ACK); -++ -++ /* mesh Peer Service Period support */ -++ if (ieee80211_vif_is_mesh(&sta->sdata->vif) && -++ ieee80211_is_data_qos(fc)) -++ ieee80211_mpsp_trigger_process( -++ ieee80211_get_qos_ctl(hdr), sta, true, acked); -++ -+ if (!acked && test_sta_flag(sta, WLAN_STA_PS_STA)) { -+ /* -+ * The STA is in power save mode, so assume -+@@ -794,13 +801,6 @@ void ieee80211_tx_status(struct ieee8021 -+ return; -+ } -+ -+- /* mesh Peer Service Period support */ -+- if (ieee80211_vif_is_mesh(&sta->sdata->vif) && -+- ieee80211_is_data_qos(fc)) -+- ieee80211_mpsp_trigger_process( -+- ieee80211_get_qos_ctl(hdr), -+- sta, true, acked); -+- -+ if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) && -+ (ieee80211_is_data(hdr->frame_control)) && -+ (rates_idx != -1)) -diff --git a/package/kernel/mac80211/patches/332-ath10k-implement-NAPI-support.patch b/package/kernel/mac80211/patches/332-ath10k-implement-NAPI-support.patch -new file mode 100644 -index 0000000..c6cc145 ---- /dev/null -+++ b/package/kernel/mac80211/patches/332-ath10k-implement-NAPI-support.patch -@@ -0,0 +1,642 @@ -+From: Rajkumar Manoharan -+Date: Thu, 21 Jul 2016 11:50:00 +0530 -+Subject: [PATCH] ath10k: implement NAPI support -+ -+Add NAPI support for rx and tx completion. NAPI poll is scheduled -+from interrupt handler. The design is as below -+ -+ - on interrupt -+ - schedule napi and mask interrupts -+ - on poll -+ - process all pipes (no actual Tx/Rx) -+ - process Rx within budget -+ - if quota exceeds budget reschedule napi poll by returning budget -+ - process Tx completions and update budget if necessary -+ - process Tx fetch indications (pull-push) -+ - push any other pending Tx (if possible) -+ - before resched or napi completion replenish htt rx ring buffer -+ - if work done < budget, complete napi poll and unmask interrupts -+ -+This change also get rid of two tasklets (intr_tq and txrx_compl_task). -+ -+Measured peak throughput with NAPI on IPQ4019 platform in controlled -+environment. No noticeable reduction in throughput is seen and also -+observed improvements in CPU usage. Approx. 15% CPU usage got reduced -+in UDP uplink case. -+ -+DL: AP DUT Tx -+UL: AP DUT Rx -+ -+IPQ4019 (avg. cpu usage %) -+======== -+ TOT +NAPI -+ =========== ============= -+TCP DL 644 Mbps (42%) 645 Mbps (36%) -+TCP UL 673 Mbps (30%) 675 Mbps (26%) -+UDP DL 682 Mbps (49%) 680 Mbps (49%) -+UDP UL 720 Mbps (28%) 717 Mbps (11%) -+ -+Signed-off-by: Rajkumar Manoharan -+--- -+ -+--- a/drivers/net/wireless/ath/ath10k/ahb.c -++++ b/drivers/net/wireless/ath/ath10k/ahb.c -+@@ -462,13 +462,13 @@ static void ath10k_ahb_halt_chip(struct -+ static irqreturn_t ath10k_ahb_interrupt_handler(int irq, void *arg) -+ { -+ struct ath10k *ar = arg; -+- struct ath10k_pci *ar_pci = ath10k_pci_priv(ar); -+ -+ if (!ath10k_pci_irq_pending(ar)) -+ return IRQ_NONE; -+ -+ ath10k_pci_disable_and_clear_legacy_irq(ar); -+- tasklet_schedule(&ar_pci->intr_tq); -++ ath10k_pci_irq_msi_fw_mask(ar); -++ napi_schedule(&ar->napi); -+ -+ return IRQ_HANDLED; -+ } -+@@ -831,7 +831,7 @@ static int ath10k_ahb_probe(struct platf -+ goto err_resource_deinit; -+ } -+ -+- ath10k_pci_init_irq_tasklets(ar); -++ ath10k_pci_init_napi(ar); -+ -+ ret = ath10k_ahb_request_irq_legacy(ar); -+ if (ret) -+--- a/drivers/net/wireless/ath/ath10k/core.c -++++ b/drivers/net/wireless/ath/ath10k/core.c -+@@ -2226,6 +2226,8 @@ struct ath10k *ath10k_core_create(size_t -+ INIT_WORK(&ar->register_work, ath10k_core_register_work); -+ INIT_WORK(&ar->restart_work, ath10k_core_restart); -+ -++ init_dummy_netdev(&ar->napi_dev); -++ -+ ret = ath10k_debug_create(ar); -+ if (ret) -+ goto err_free_aux_wq; -+--- a/drivers/net/wireless/ath/ath10k/core.h -++++ b/drivers/net/wireless/ath/ath10k/core.h -+@@ -65,6 +65,10 @@ -+ #define ATH10K_KEEPALIVE_MAX_IDLE 3895 -+ #define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900 -+ -++/* NAPI poll budget */ -++#define ATH10K_NAPI_BUDGET 64 -++#define ATH10K_NAPI_QUOTA_LIMIT 60 -++ -+ struct ath10k; -+ -+ enum ath10k_bus { -+@@ -933,6 +937,10 @@ struct ath10k { -+ struct ath10k_thermal thermal; -+ struct ath10k_wow wow; -+ -++ /* NAPI */ -++ struct net_device napi_dev; -++ struct napi_struct napi; -++ -+ /* must be last */ -+ u8 drv_priv[0] __aligned(sizeof(void *)); -+ }; -+--- a/drivers/net/wireless/ath/ath10k/htt.h -++++ b/drivers/net/wireless/ath/ath10k/htt.h -+@@ -1666,7 +1666,6 @@ struct ath10k_htt { -+ -+ /* This is used to group tx/rx completions separately and process them -+ * in batches to reduce cache stalls */ -+- struct tasklet_struct txrx_compl_task; -+ struct sk_buff_head rx_compl_q; -+ struct sk_buff_head rx_in_ord_compl_q; -+ struct sk_buff_head tx_fetch_ind_q; -+@@ -1799,5 +1798,6 @@ int ath10k_htt_tx(struct ath10k_htt *htt -+ struct sk_buff *msdu); -+ void ath10k_htt_rx_pktlog_completion_handler(struct ath10k *ar, -+ struct sk_buff *skb); -++int ath10k_htt_txrx_compl_task(struct ath10k *ar, int budget); -+ -+ #endif -+--- a/drivers/net/wireless/ath/ath10k/htt_rx.c -++++ b/drivers/net/wireless/ath/ath10k/htt_rx.c -+@@ -34,7 +34,6 @@ -+ #define HTT_RX_RING_REFILL_RESCHED_MS 5 -+ -+ static int ath10k_htt_rx_get_csum_state(struct sk_buff *skb); -+-static void ath10k_htt_txrx_compl_task(unsigned long ptr); -+ -+ static struct sk_buff * -+ ath10k_htt_rx_find_skb_paddr(struct ath10k *ar, u32 paddr) -+@@ -226,7 +225,6 @@ int ath10k_htt_rx_ring_refill(struct ath -+ void ath10k_htt_rx_free(struct ath10k_htt *htt) -+ { -+ del_timer_sync(&htt->rx_ring.refill_retry_timer); -+- tasklet_kill(&htt->txrx_compl_task); -+ -+ skb_queue_purge(&htt->rx_compl_q); -+ skb_queue_purge(&htt->rx_in_ord_compl_q); -+@@ -520,9 +518,6 @@ int ath10k_htt_rx_alloc(struct ath10k_ht -+ skb_queue_head_init(&htt->tx_fetch_ind_q); -+ atomic_set(&htt->num_mpdus_ready, 0); -+ -+- tasklet_init(&htt->txrx_compl_task, ath10k_htt_txrx_compl_task, -+- (unsigned long)htt); -+- -+ ath10k_dbg(ar, ATH10K_DBG_BOOT, "htt rx ring size %d fill_level %d\n", -+ htt->rx_ring.size, htt->rx_ring.fill_level); -+ return 0; -+@@ -958,7 +953,7 @@ static void ath10k_process_rx(struct ath -+ trace_ath10k_rx_hdr(ar, skb->data, skb->len); -+ trace_ath10k_rx_payload(ar, skb->data, skb->len); -+ -+- ieee80211_rx(ar->hw, skb); -++ ieee80211_rx_napi(ar->hw, NULL, skb, &ar->napi); -+ } -+ -+ static int ath10k_htt_rx_nwifi_hdrlen(struct ath10k *ar, -+@@ -1527,7 +1522,7 @@ static int ath10k_htt_rx_handle_amsdu(st -+ struct ath10k *ar = htt->ar; -+ struct ieee80211_rx_status *rx_status = &htt->rx_status; -+ struct sk_buff_head amsdu; -+- int ret; -++ int ret, num_msdus; -+ -+ __skb_queue_head_init(&amsdu); -+ -+@@ -1549,13 +1544,14 @@ static int ath10k_htt_rx_handle_amsdu(st -+ return ret; -+ } -+ -++ num_msdus = skb_queue_len(&amsdu); -+ ath10k_htt_rx_h_ppdu(ar, &amsdu, rx_status, 0xffff); -+ ath10k_htt_rx_h_unchain(ar, &amsdu, ret > 0); -+ ath10k_htt_rx_h_filter(ar, &amsdu, rx_status); -+ ath10k_htt_rx_h_mpdu(ar, &amsdu, rx_status); -+ ath10k_htt_rx_h_deliver(ar, &amsdu, rx_status); -+ -+- return 0; -++ return num_msdus; -+ } -+ -+ static void ath10k_htt_rx_proc_rx_ind(struct ath10k_htt *htt, -+@@ -1579,15 +1575,6 @@ static void ath10k_htt_rx_proc_rx_ind(st -+ mpdu_count += mpdu_ranges[i].mpdu_count; -+ -+ atomic_add(mpdu_count, &htt->num_mpdus_ready); -+- -+- tasklet_schedule(&htt->txrx_compl_task); -+-} -+- -+-static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt) -+-{ -+- atomic_inc(&htt->num_mpdus_ready); -+- -+- tasklet_schedule(&htt->txrx_compl_task); -+ } -+ -+ static void ath10k_htt_rx_tx_compl_ind(struct ath10k *ar, -+@@ -1772,14 +1759,15 @@ static void ath10k_htt_rx_h_rx_offload_p -+ RX_FLAG_MMIC_STRIPPED; -+ } -+ -+-static void ath10k_htt_rx_h_rx_offload(struct ath10k *ar, -+- struct sk_buff_head *list) -++static int ath10k_htt_rx_h_rx_offload(struct ath10k *ar, -++ struct sk_buff_head *list) -+ { -+ struct ath10k_htt *htt = &ar->htt; -+ struct ieee80211_rx_status *status = &htt->rx_status; -+ struct htt_rx_offload_msdu *rx; -+ struct sk_buff *msdu; -+ size_t offset; -++ int num_msdu = 0; -+ -+ while ((msdu = __skb_dequeue(list))) { -+ /* Offloaded frames don't have Rx descriptor. Instead they have -+@@ -1819,10 +1807,12 @@ static void ath10k_htt_rx_h_rx_offload(s -+ ath10k_htt_rx_h_rx_offload_prot(status, msdu); -+ ath10k_htt_rx_h_channel(ar, status, NULL, rx->vdev_id); -+ ath10k_process_rx(ar, status, msdu); -++ num_msdu++; -+ } -++ return num_msdu; -+ } -+ -+-static void ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb) -++static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb) -+ { -+ struct ath10k_htt *htt = &ar->htt; -+ struct htt_resp *resp = (void *)skb->data; -+@@ -1835,12 +1825,12 @@ static void ath10k_htt_rx_in_ord_ind(str -+ u8 tid; -+ bool offload; -+ bool frag; -+- int ret; -++ int ret, num_msdus = 0; -+ -+ lockdep_assert_held(&htt->rx_ring.lock); -+ -+ if (htt->rx_confused) -+- return; -++ return -EIO; -+ -+ skb_pull(skb, sizeof(resp->hdr)); -+ skb_pull(skb, sizeof(resp->rx_in_ord_ind)); -+@@ -1859,7 +1849,7 @@ static void ath10k_htt_rx_in_ord_ind(str -+ -+ if (skb->len < msdu_count * sizeof(*resp->rx_in_ord_ind.msdu_descs)) { -+ ath10k_warn(ar, "dropping invalid in order rx indication\n"); -+- return; -++ return -EINVAL; -+ } -+ -+ /* The event can deliver more than 1 A-MSDU. Each A-MSDU is later -+@@ -1870,14 +1860,14 @@ static void ath10k_htt_rx_in_ord_ind(str -+ if (ret < 0) { -+ ath10k_warn(ar, "failed to pop paddr list: %d\n", ret); -+ htt->rx_confused = true; -+- return; -++ return -EIO; -+ } -+ -+ /* Offloaded frames are very different and need to be handled -+ * separately. -+ */ -+ if (offload) -+- ath10k_htt_rx_h_rx_offload(ar, &list); -++ num_msdus = ath10k_htt_rx_h_rx_offload(ar, &list); -+ -+ while (!skb_queue_empty(&list)) { -+ __skb_queue_head_init(&amsdu); -+@@ -1890,6 +1880,7 @@ static void ath10k_htt_rx_in_ord_ind(str -+ * better to report something than nothing though. This -+ * should still give an idea about rx rate to the user. -+ */ -++ num_msdus += skb_queue_len(&amsdu); -+ ath10k_htt_rx_h_ppdu(ar, &amsdu, status, vdev_id); -+ ath10k_htt_rx_h_filter(ar, &amsdu, status); -+ ath10k_htt_rx_h_mpdu(ar, &amsdu, status); -+@@ -1902,9 +1893,10 @@ static void ath10k_htt_rx_in_ord_ind(str -+ ath10k_warn(ar, "failed to extract amsdu: %d\n", ret); -+ htt->rx_confused = true; -+ __skb_queue_purge(&list); -+- return; -++ return -EIO; -+ } -+ } -++ return num_msdus; -+ } -+ -+ static void ath10k_htt_rx_tx_fetch_resp_id_confirm(struct ath10k *ar, -+@@ -2267,7 +2259,6 @@ bool ath10k_htt_t2h_msg_handler(struct a -+ } -+ case HTT_T2H_MSG_TYPE_TX_COMPL_IND: -+ ath10k_htt_rx_tx_compl_ind(htt->ar, skb); -+- tasklet_schedule(&htt->txrx_compl_task); -+ break; -+ case HTT_T2H_MSG_TYPE_SEC_IND: { -+ struct ath10k *ar = htt->ar; -+@@ -2284,7 +2275,7 @@ bool ath10k_htt_t2h_msg_handler(struct a -+ case HTT_T2H_MSG_TYPE_RX_FRAG_IND: { -+ ath10k_dbg_dump(ar, ATH10K_DBG_HTT_DUMP, NULL, "htt event: ", -+ skb->data, skb->len); -+- ath10k_htt_rx_frag_handler(htt); -++ atomic_inc(&htt->num_mpdus_ready); -+ break; -+ } -+ case HTT_T2H_MSG_TYPE_TEST: -+@@ -2322,8 +2313,7 @@ bool ath10k_htt_t2h_msg_handler(struct a -+ break; -+ } -+ case HTT_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND: { -+- skb_queue_tail(&htt->rx_in_ord_compl_q, skb); -+- tasklet_schedule(&htt->txrx_compl_task); -++ __skb_queue_tail(&htt->rx_in_ord_compl_q, skb); -+ return false; -+ } -+ case HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND: -+@@ -2349,7 +2339,6 @@ bool ath10k_htt_t2h_msg_handler(struct a -+ break; -+ } -+ skb_queue_tail(&htt->tx_fetch_ind_q, tx_fetch_ind); -+- tasklet_schedule(&htt->txrx_compl_task); -+ break; -+ } -+ case HTT_T2H_MSG_TYPE_TX_FETCH_CONFIRM: -+@@ -2378,27 +2367,77 @@ void ath10k_htt_rx_pktlog_completion_han -+ } -+ EXPORT_SYMBOL(ath10k_htt_rx_pktlog_completion_handler); -+ -+-static void ath10k_htt_txrx_compl_task(unsigned long ptr) -++int ath10k_htt_txrx_compl_task(struct ath10k *ar, int budget) -+ { -+- struct ath10k_htt *htt = (struct ath10k_htt *)ptr; -+- struct ath10k *ar = htt->ar; -++ struct ath10k_htt *htt = &ar->htt; -+ struct htt_tx_done tx_done = {}; -+- struct sk_buff_head rx_ind_q; -+ struct sk_buff_head tx_ind_q; -+ struct sk_buff *skb; -+ unsigned long flags; -+- int num_mpdus; -++ int quota = 0, done, num_rx_msdus; -++ bool resched_napi = false; -+ -+- __skb_queue_head_init(&rx_ind_q); -+ __skb_queue_head_init(&tx_ind_q); -+ -+- spin_lock_irqsave(&htt->rx_in_ord_compl_q.lock, flags); -+- skb_queue_splice_init(&htt->rx_in_ord_compl_q, &rx_ind_q); -+- spin_unlock_irqrestore(&htt->rx_in_ord_compl_q.lock, flags); -++ /* Since in-ord-ind can deliver more than 1 A-MSDU in single event, -++ * process it first to utilize full available quota. -++ */ -++ while (quota < budget) { -++ if (skb_queue_empty(&htt->rx_in_ord_compl_q)) -++ break; -+ -+- spin_lock_irqsave(&htt->tx_fetch_ind_q.lock, flags); -+- skb_queue_splice_init(&htt->tx_fetch_ind_q, &tx_ind_q); -+- spin_unlock_irqrestore(&htt->tx_fetch_ind_q.lock, flags); -++ skb = __skb_dequeue(&htt->rx_in_ord_compl_q); -++ if (!skb) { -++ resched_napi = true; -++ goto exit; -++ } -++ -++ spin_lock_bh(&htt->rx_ring.lock); -++ num_rx_msdus = ath10k_htt_rx_in_ord_ind(ar, skb); -++ spin_unlock_bh(&htt->rx_ring.lock); -++ if (num_rx_msdus < 0) { -++ resched_napi = true; -++ goto exit; -++ } -++ -++ dev_kfree_skb_any(skb); -++ if (num_rx_msdus > 0) -++ quota += num_rx_msdus; -++ -++ if ((quota > ATH10K_NAPI_QUOTA_LIMIT) && -++ !skb_queue_empty(&htt->rx_in_ord_compl_q)) { -++ resched_napi = true; -++ goto exit; -++ } -++ } -++ -++ while (quota < budget) { -++ /* no more data to receive */ -++ if (!atomic_read(&htt->num_mpdus_ready)) -++ break; -++ -++ num_rx_msdus = ath10k_htt_rx_handle_amsdu(htt); -++ if (num_rx_msdus < 0) { -++ resched_napi = true; -++ goto exit; -++ } -++ -++ quota += num_rx_msdus; -++ atomic_dec(&htt->num_mpdus_ready); -++ if ((quota > ATH10K_NAPI_QUOTA_LIMIT) && -++ atomic_read(&htt->num_mpdus_ready)) { -++ resched_napi = true; -++ goto exit; -++ } -++ } -++ -++ /* From NAPI documentation: -++ * The napi poll() function may also process TX completions, in which -++ * case if it processes the entire TX ring then it should count that -++ * work as the rest of the budget. -++ */ -++ if ((quota < budget) && !kfifo_is_empty(&htt->txdone_fifo)) -++ quota = budget; -+ -+ /* kfifo_get: called only within txrx_tasklet so it's neatly serialized. -+ * From kfifo_get() documentation: -+@@ -2408,27 +2447,22 @@ static void ath10k_htt_txrx_compl_task(u -+ while (kfifo_get(&htt->txdone_fifo, &tx_done)) -+ ath10k_txrx_tx_unref(htt, &tx_done); -+ -++ spin_lock_irqsave(&htt->tx_fetch_ind_q.lock, flags); -++ skb_queue_splice_init(&htt->tx_fetch_ind_q, &tx_ind_q); -++ spin_unlock_irqrestore(&htt->tx_fetch_ind_q.lock, flags); -++ -+ while ((skb = __skb_dequeue(&tx_ind_q))) { -+ ath10k_htt_rx_tx_fetch_ind(ar, skb); -+ dev_kfree_skb_any(skb); -+ } -+ -+- num_mpdus = atomic_read(&htt->num_mpdus_ready); -+- -+- while (num_mpdus) { -+- if (ath10k_htt_rx_handle_amsdu(htt)) -+- break; -+- -+- num_mpdus--; -+- atomic_dec(&htt->num_mpdus_ready); -+- } -+- -+- while ((skb = __skb_dequeue(&rx_ind_q))) { -+- spin_lock_bh(&htt->rx_ring.lock); -+- ath10k_htt_rx_in_ord_ind(ar, skb); -+- spin_unlock_bh(&htt->rx_ring.lock); -+- dev_kfree_skb_any(skb); -+- } -+- -++exit: -+ ath10k_htt_rx_msdu_buff_replenish(htt); -++ /* In case of rx failure or more data to read, report budget -++ * to reschedule NAPI poll -++ */ -++ done = resched_napi ? budget : quota; -++ -++ return done; -+ } -++EXPORT_SYMBOL(ath10k_htt_txrx_compl_task); -+--- a/drivers/net/wireless/ath/ath10k/htt_tx.c -++++ b/drivers/net/wireless/ath/ath10k/htt_tx.c -+@@ -388,8 +388,6 @@ void ath10k_htt_tx_free(struct ath10k_ht -+ { -+ int size; -+ -+- tasklet_kill(&htt->txrx_compl_task); -+- -+ idr_for_each(&htt->pending_tx, ath10k_htt_tx_clean_up_pending, htt->ar); -+ idr_destroy(&htt->pending_tx); -+ -+--- a/drivers/net/wireless/ath/ath10k/pci.c -++++ b/drivers/net/wireless/ath/ath10k/pci.c -+@@ -1502,12 +1502,10 @@ void ath10k_pci_hif_send_complete_check( -+ ath10k_ce_per_engine_service(ar, pipe); -+ } -+ -+-void ath10k_pci_kill_tasklet(struct ath10k *ar) -++static void ath10k_pci_rx_retry_sync(struct ath10k *ar) -+ { -+ struct ath10k_pci *ar_pci = ath10k_pci_priv(ar); -+ -+- tasklet_kill(&ar_pci->intr_tq); -+- -+ del_timer_sync(&ar_pci->rx_post_retry); -+ } -+ -+@@ -1566,7 +1564,7 @@ void ath10k_pci_hif_get_default_pipe(str -+ ul_pipe, dl_pipe); -+ } -+ -+-static void ath10k_pci_irq_msi_fw_mask(struct ath10k *ar) -++void ath10k_pci_irq_msi_fw_mask(struct ath10k *ar) -+ { -+ u32 val; -+ -+@@ -1747,7 +1745,7 @@ void ath10k_pci_ce_deinit(struct ath10k -+ -+ void ath10k_pci_flush(struct ath10k *ar) -+ { -+- ath10k_pci_kill_tasklet(ar); -++ ath10k_pci_rx_retry_sync(ar); -+ ath10k_pci_buffer_cleanup(ar); -+ } -+ -+@@ -2754,35 +2752,53 @@ static irqreturn_t ath10k_pci_interrupt_ -+ return IRQ_NONE; -+ } -+ -+- if (ar_pci->oper_irq_mode == ATH10K_PCI_IRQ_LEGACY) { -+- if (!ath10k_pci_irq_pending(ar)) -+- return IRQ_NONE; -+- -+- ath10k_pci_disable_and_clear_legacy_irq(ar); -+- } -++ if ((ar_pci->oper_irq_mode == ATH10K_PCI_IRQ_LEGACY) && -++ !ath10k_pci_irq_pending(ar)) -++ return IRQ_NONE; -+ -+- tasklet_schedule(&ar_pci->intr_tq); -++ ath10k_pci_disable_and_clear_legacy_irq(ar); -++ ath10k_pci_irq_msi_fw_mask(ar); -++ napi_schedule(&ar->napi); -+ -+ return IRQ_HANDLED; -+ } -+ -+-static void ath10k_pci_tasklet(unsigned long data) -++static int ath10k_pci_napi_poll(struct napi_struct *ctx, int budget) -+ { -+- struct ath10k *ar = (struct ath10k *)data; -+- struct ath10k_pci *ar_pci = ath10k_pci_priv(ar); -++ struct ath10k *ar = container_of(ctx, struct ath10k, napi); -++ int done = 0; -+ -+ if (ath10k_pci_has_fw_crashed(ar)) { -+- ath10k_pci_irq_disable(ar); -+ ath10k_pci_fw_crashed_clear(ar); -+ ath10k_pci_fw_crashed_dump(ar); -+- return; -++ napi_complete(ctx); -++ return done; -+ } -+ -+ ath10k_ce_per_engine_service_any(ar); -+ -+- /* Re-enable legacy irq that was disabled in the irq handler */ -+- if (ar_pci->oper_irq_mode == ATH10K_PCI_IRQ_LEGACY) -++ done = ath10k_htt_txrx_compl_task(ar, budget); -++ -++ if (done < budget) { -++ napi_complete(ctx); -++ /* In case of MSI, it is possible that interrupts are received -++ * while NAPI poll is inprogress. So pending interrupts that are -++ * received after processing all copy engine pipes by NAPI poll -++ * will not be handled again. This is causing failure to -++ * complete boot sequence in x86 platform. So before enabling -++ * interrupts safer to check for pending interrupts for -++ * immediate servicing. -++ */ -++ if (CE_INTERRUPT_SUMMARY(ar)) { -++ napi_reschedule(&ar->napi); -++ goto out; -++ } -+ ath10k_pci_enable_legacy_irq(ar); -++ ath10k_pci_irq_msi_fw_unmask(ar); -++ } -++ -++out: -++ return done; -+ } -+ -+ static int ath10k_pci_request_irq_msi(struct ath10k *ar) -+@@ -2840,11 +2856,11 @@ static void ath10k_pci_free_irq(struct a -+ free_irq(ar_pci->pdev->irq, ar); -+ } -+ -+-void ath10k_pci_init_irq_tasklets(struct ath10k *ar) -++void ath10k_pci_init_napi(struct ath10k *ar) -+ { -+- struct ath10k_pci *ar_pci = ath10k_pci_priv(ar); -+- -+- tasklet_init(&ar_pci->intr_tq, ath10k_pci_tasklet, (unsigned long)ar); -++ netif_napi_add(&ar->napi_dev, &ar->napi, ath10k_pci_napi_poll, -++ ATH10K_NAPI_BUDGET); -++ napi_enable(&ar->napi); -+ } -+ -+ static int ath10k_pci_init_irq(struct ath10k *ar) -+@@ -2852,7 +2868,7 @@ static int ath10k_pci_init_irq(struct at -+ struct ath10k_pci *ar_pci = ath10k_pci_priv(ar); -+ int ret; -+ -+- ath10k_pci_init_irq_tasklets(ar); -++ ath10k_pci_init_napi(ar); -+ -+ if (ath10k_pci_irq_mode != ATH10K_PCI_IRQ_AUTO) -+ ath10k_info(ar, "limiting irq mode to: %d\n", -+@@ -3113,7 +3129,8 @@ int ath10k_pci_setup_resource(struct ath -+ -+ void ath10k_pci_release_resource(struct ath10k *ar) -+ { -+- ath10k_pci_kill_tasklet(ar); -++ ath10k_pci_rx_retry_sync(ar); -++ netif_napi_del(&ar->napi); -+ ath10k_pci_ce_deinit(ar); -+ ath10k_pci_free_pipes(ar); -+ } -+@@ -3274,7 +3291,7 @@ static int ath10k_pci_probe(struct pci_d -+ -+ err_free_irq: -+ ath10k_pci_free_irq(ar); -+- ath10k_pci_kill_tasklet(ar); -++ ath10k_pci_rx_retry_sync(ar); -+ -+ err_deinit_irq: -+ ath10k_pci_deinit_irq(ar); -+--- a/drivers/net/wireless/ath/ath10k/pci.h -++++ b/drivers/net/wireless/ath/ath10k/pci.h -+@@ -177,8 +177,6 @@ struct ath10k_pci { -+ /* Operating interrupt mode */ -+ enum ath10k_pci_irq_mode oper_irq_mode; -+ -+- struct tasklet_struct intr_tq; -+- -+ struct ath10k_pci_pipe pipe_info[CE_COUNT_MAX]; -+ -+ /* Copy Engine used for Diagnostic Accesses */ -+@@ -294,8 +292,7 @@ void ath10k_pci_free_pipes(struct ath10k -+ void ath10k_pci_free_pipes(struct ath10k *ar); -+ void ath10k_pci_rx_replenish_retry(unsigned long ptr); -+ void ath10k_pci_ce_deinit(struct ath10k *ar); -+-void ath10k_pci_init_irq_tasklets(struct ath10k *ar); -+-void ath10k_pci_kill_tasklet(struct ath10k *ar); -++void ath10k_pci_init_napi(struct ath10k *ar); -+ int ath10k_pci_init_pipes(struct ath10k *ar); -+ int ath10k_pci_init_config(struct ath10k *ar); -+ void ath10k_pci_rx_post(struct ath10k *ar); -+@@ -303,6 +300,7 @@ void ath10k_pci_flush(struct ath10k *ar) -+ void ath10k_pci_enable_legacy_irq(struct ath10k *ar); -+ bool ath10k_pci_irq_pending(struct ath10k *ar); -+ void ath10k_pci_disable_and_clear_legacy_irq(struct ath10k *ar); -++void ath10k_pci_irq_msi_fw_mask(struct ath10k *ar); -+ int ath10k_pci_wait_for_target_init(struct ath10k *ar); -+ int ath10k_pci_setup_resource(struct ath10k *ar); -+ void ath10k_pci_release_resource(struct ath10k *ar); diff --git a/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch b/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch deleted file mode 100644 index e414f23..0000000 @@ -8870,81 +8832,6 @@ index e414f23..0000000 - bool last = false; - - if (has_80211_header) { -diff --git a/package/kernel/mac80211/patches/333-ath9k-fix-client-mode-beacon-configuration.patch b/package/kernel/mac80211/patches/333-ath9k-fix-client-mode-beacon-configuration.patch -new file mode 100644 -index 0000000..d008ceb ---- /dev/null -+++ b/package/kernel/mac80211/patches/333-ath9k-fix-client-mode-beacon-configuration.patch -@@ -0,0 +1,69 @@ -+From: Felix Fietkau -+Date: Tue, 26 Jul 2016 08:05:10 +0200 -+Subject: [PATCH] ath9k: fix client mode beacon configuration -+ -+For pure station mode, iter_data.primary_beacon_vif was used and passed -+to ath_beacon_config, but not set to the station vif. -+This was causing the following warning: -+ -+[ 100.310919] ------------[ cut here ]------------ -+[ 100.315683] WARNING: CPU: 0 PID: 7 at compat-wireless-2016-06-20/drivers/net/wireless/ath/ath9k/beacon.c:642 ath9k_calculate_summary_state+0x250/0x60c [ath9k]() -+[ 100.402028] CPU: 0 PID: 7 Comm: kworker/u2:1 Tainted: G W 4.4.15 #5 -+[ 100.409676] Workqueue: phy0 ieee80211_ibss_leave [mac80211] -+[ 100.415351] Stack : 8736e98c 870b4b20 87a25b54 800a6800 8782a080 80400d63 8039b96c 00000007 -+[ 100.415351] 803c5edc 87875914 80400000 800a47cc 87a25b54 800a6800 803a0fd8 80400000 -+[ 100.415351] 00000003 87875914 80400000 80094ae0 87a25b54 8787594c 00000000 801ef308 -+[ 100.415351] 803ffe70 801ef300 87193d58 87b3a400 87b3ad00 70687930 00000000 00000000 -+[ 100.415351] 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 -+[ 100.415351] ... -+[ 100.451703] Call Trace: -+[ 100.454235] [<800a6800>] vprintk_default+0x24/0x30 -+[ 100.459110] [<800a47cc>] printk+0x2c/0x38 -+[ 100.463190] [<800a6800>] vprintk_default+0x24/0x30 -+[ 100.468072] [<80094ae0>] print_worker_info+0x148/0x174 -+[ 100.473378] [<801ef308>] serial8250_console_putchar+0x0/0x44 -+[ 100.479122] [<801ef300>] wait_for_xmitr+0xc4/0xcc -+[ 100.484014] [<87193d58>] ieee80211_ibss_leave+0xb90/0x1900 [mac80211] -+[ 100.490590] [<80081604>] warn_slowpath_common+0xa0/0xd0 -+[ 100.495922] [<801a359c>] dump_stack+0x14/0x28 -+[ 100.500350] [<80071a00>] show_stack+0x50/0x84 -+[ 100.504784] [<80081604>] warn_slowpath_common+0xa0/0xd0 -+[ 100.510106] [<87024c60>] ath9k_calculate_summary_state+0x250/0x60c [ath9k] -+[ 100.517105] [<800816b8>] warn_slowpath_null+0x18/0x24 -+[ 100.522256] [<87024c60>] ath9k_calculate_summary_state+0x250/0x60c [ath9k] -+[ 100.529273] [<87025418>] ath9k_set_txpower+0x148/0x498 [ath9k] -+[ 100.535302] [<871d2c64>] cleanup_module+0xa74/0xd4c [mac80211] -+[ 100.541237] [<801ef308>] serial8250_console_putchar+0x0/0x44 -+[ 100.547042] [<800a5d18>] wake_up_klogd+0x54/0x68 -+[ 100.551730] [<800a6650>] vprintk_emit+0x404/0x43c -+[ 100.556623] [<871b9db8>] ieee80211_sta_rx_notify+0x258/0x32c [mac80211] -+[ 100.563475] [<871ba6a4>] ieee80211_sta_rx_queued_mgmt+0x63c/0x734 [mac80211] -+[ 100.570693] [<871aa49c>] ieee80211_tx_prepare_skb+0x210/0x230 [mac80211] -+[ 100.577609] [<800af5d4>] mod_timer+0x15c/0x190 -+[ 100.582220] [<871ba8b8>] ieee80211_sta_work+0xfc/0xe1c [mac80211] -+[ 100.588539] [<871940b4>] ieee80211_ibss_leave+0xeec/0x1900 [mac80211] -+[ 100.595122] [<8009ec84>] dequeue_task_fair+0x44/0x130 -+[ 100.600281] [<80092a34>] process_one_work+0x1f8/0x334 -+[ 100.605454] [<80093830>] worker_thread+0x2b4/0x408 -+[ 100.610317] [<8009357c>] worker_thread+0x0/0x408 -+[ 100.615019] [<8009357c>] worker_thread+0x0/0x408 -+[ 100.619705] [<80097b68>] kthread+0xdc/0xe8 -+[ 100.623886] [<80097a8c>] kthread+0x0/0xe8 -+[ 100.627961] [<80060878>] ret_from_kernel_thread+0x14/0x1c -+[ 100.633448] -+[ 100.634956] ---[ end trace aafbe57e9ae6862f ]--- -+ -+Fixes: cfda2d8e2314 ("ath9k: Fix beacon configuration for addition/removal of interfaces") -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/main.c -++++ b/drivers/net/wireless/ath/ath9k/main.c -+@@ -1154,6 +1154,7 @@ void ath9k_calculate_summary_state(struc -+ bool changed = (iter_data.primary_sta != ctx->primary_sta); -+ -+ if (iter_data.primary_sta) { -++ iter_data.primary_beacon_vif = iter_data.primary_sta; -+ iter_data.beacons = true; -+ ath9k_set_assoc_state(sc, iter_data.primary_sta, -+ changed); diff --git a/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch b/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch deleted file mode 100644 index 6e2d0cf..0000000 @@ -9083,66 +8970,6 @@ index 6e2d0cf..0000000 - if (!frame) - goto purge; - -diff --git a/package/kernel/mac80211/patches/334-mac80211-fix-purging-multicast-PS-buffer-queue.patch b/package/kernel/mac80211/patches/334-mac80211-fix-purging-multicast-PS-buffer-queue.patch -new file mode 100644 -index 0000000..dfcc6e4 ---- /dev/null -+++ b/package/kernel/mac80211/patches/334-mac80211-fix-purging-multicast-PS-buffer-queue.patch -@@ -0,0 +1,54 @@ -+From: Felix Fietkau -+Date: Tue, 2 Aug 2016 11:11:13 +0200 -+Subject: [PATCH] mac80211: fix purging multicast PS buffer queue -+ -+The code currently assumes that buffered multicast PS frames don't have -+a pending ACK frame for tx status reporting. -+However, hostapd sends a broadcast deauth frame on teardown for which tx -+status is requested. This can lead to the "Have pending ack frames" -+warning on module reload. -+Fix this by using ieee80211_free_txskb/ieee80211_purge_tx_queue. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/net/mac80211/cfg.c -++++ b/net/mac80211/cfg.c -+@@ -868,7 +868,7 @@ static int ieee80211_stop_ap(struct wiph -+ -+ /* free all potentially still buffered bcast frames */ -+ local->total_ps_buffered -= skb_queue_len(&sdata->u.ap.ps.bc_buf); -+- skb_queue_purge(&sdata->u.ap.ps.bc_buf); -++ ieee80211_purge_tx_queue(&local->hw, &sdata->u.ap.ps.bc_buf); -+ -+ mutex_lock(&local->mtx); -+ ieee80211_vif_copy_chanctx_to_vlans(sdata, true); -+--- a/net/mac80211/tx.c -++++ b/net/mac80211/tx.c -+@@ -368,7 +368,7 @@ static void purge_old_ps_buffers(struct -+ skb = skb_dequeue(&ps->bc_buf); -+ if (skb) { -+ purged++; -+- dev_kfree_skb(skb); -++ ieee80211_free_txskb(&local->hw, skb); -+ } -+ total += skb_queue_len(&ps->bc_buf); -+ } -+@@ -451,7 +451,7 @@ ieee80211_tx_h_multicast_ps_buf(struct i -+ if (skb_queue_len(&ps->bc_buf) >= AP_MAX_BC_BUFFER) { -+ ps_dbg(tx->sdata, -+ "BC TX buffer full - dropping the oldest frame\n"); -+- dev_kfree_skb(skb_dequeue(&ps->bc_buf)); -++ ieee80211_free_txskb(&tx->local->hw, skb_dequeue(&ps->bc_buf)); -+ } else -+ tx->local->total_ps_buffered++; -+ -+@@ -4276,7 +4276,7 @@ ieee80211_get_buffered_bc(struct ieee802 -+ sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev); -+ if (!ieee80211_tx_prepare(sdata, &tx, NULL, skb)) -+ break; -+- dev_kfree_skb_any(skb); -++ ieee80211_free_txskb(hw, skb); -+ } -+ -+ info = IEEE80211_SKB_CB(skb); diff --git a/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch b/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch deleted file mode 100644 index f8f4f09..0000000 @@ -9185,317 +9012,6 @@ index f8f4f09..0000000 - ieee80211_xmit(sdata, NULL, skb); - rcu_read_unlock(); - -diff --git a/package/kernel/mac80211/patches/335-ath9k-use-ieee80211_tx_status_noskb-where-possible.patch b/package/kernel/mac80211/patches/335-ath9k-use-ieee80211_tx_status_noskb-where-possible.patch -new file mode 100644 -index 0000000..dbb5b90 ---- /dev/null -+++ b/package/kernel/mac80211/patches/335-ath9k-use-ieee80211_tx_status_noskb-where-possible.patch -@@ -0,0 +1,305 @@ -+From: Felix Fietkau -+Date: Tue, 2 Aug 2016 12:12:18 +0200 -+Subject: [PATCH] ath9k: use ieee80211_tx_status_noskb where possible -+ -+It removes the need for undoing the padding changes to skb->data and it -+improves performance by eliminating one tx status lookup per MPDU in the -+status path. It is also useful for preparing a follow-up fix to better -+handle powersave filtering. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -50,9 +50,11 @@ static u16 bits_per_symbol[][2] = { -+ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq, -+ struct ath_atx_tid *tid, struct sk_buff *skb); -+ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, -+- int tx_flags, struct ath_txq *txq); -++ int tx_flags, struct ath_txq *txq, -++ struct ieee80211_sta *sta); -+ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, -+ struct ath_txq *txq, struct list_head *bf_q, -++ struct ieee80211_sta *sta, -+ struct ath_tx_status *ts, int txok); -+ static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq, -+ struct list_head *head, bool internal); -+@@ -77,6 +79,22 @@ enum { -+ /* Aggregation logic */ -+ /*********************/ -+ -++static void ath_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) -++{ -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ struct ieee80211_sta *sta = info->status.status_driver_data[0]; -++ -++ if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { -++ ieee80211_tx_status(hw, skb); -++ return; -++ } -++ -++ if (sta) -++ ieee80211_tx_status_noskb(hw, sta, info); -++ -++ dev_kfree_skb(skb); -++} -++ -+ void ath_txq_lock(struct ath_softc *sc, struct ath_txq *txq) -+ __acquires(&txq->axq_lock) -+ { -+@@ -92,6 +110,7 @@ void ath_txq_unlock(struct ath_softc *sc -+ void ath_txq_unlock_complete(struct ath_softc *sc, struct ath_txq *txq) -+ __releases(&txq->axq_lock) -+ { -++ struct ieee80211_hw *hw = sc->hw; -+ struct sk_buff_head q; -+ struct sk_buff *skb; -+ -+@@ -100,7 +119,7 @@ void ath_txq_unlock_complete(struct ath_ -+ spin_unlock_bh(&txq->axq_lock); -+ -+ while ((skb = __skb_dequeue(&q))) -+- ieee80211_tx_status(sc->hw, skb); -++ ath_tx_status(hw, skb); -+ } -+ -+ static void ath_tx_queue_tid(struct ath_softc *sc, struct ath_txq *txq, -+@@ -268,7 +287,7 @@ static void ath_tx_flush_tid(struct ath_ -+ } -+ -+ list_add_tail(&bf->list, &bf_head); -+- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); -++ ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); -+ } -+ -+ if (sendbar) { -+@@ -333,12 +352,12 @@ static void ath_tid_drain(struct ath_sof -+ bf = fi->bf; -+ -+ if (!bf) { -+- ath_tx_complete(sc, skb, ATH_TX_ERROR, txq); -++ ath_tx_complete(sc, skb, ATH_TX_ERROR, txq, NULL); -+ continue; -+ } -+ -+ list_add_tail(&bf->list, &bf_head); -+- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); -++ ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); -+ } -+ } -+ -+@@ -441,12 +460,11 @@ static void ath_tx_count_frames(struct a -+ -+ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, -+ struct ath_buf *bf, struct list_head *bf_q, -++ struct ieee80211_sta *sta, -+ struct ath_tx_status *ts, int txok) -+ { -+ struct ath_node *an = NULL; -+ struct sk_buff *skb; -+- struct ieee80211_sta *sta; -+- struct ieee80211_hw *hw = sc->hw; -+ struct ieee80211_hdr *hdr; -+ struct ieee80211_tx_info *tx_info; -+ struct ath_atx_tid *tid = NULL; -+@@ -475,12 +493,7 @@ static void ath_tx_complete_aggr(struct -+ for (i = 0; i < ts->ts_rateindex; i++) -+ retries += rates[i].count; -+ -+- rcu_read_lock(); -+- -+- sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); -+ if (!sta) { -+- rcu_read_unlock(); -+- -+ INIT_LIST_HEAD(&bf_head); -+ while (bf) { -+ bf_next = bf->bf_next; -+@@ -488,7 +501,7 @@ static void ath_tx_complete_aggr(struct -+ if (!bf->bf_state.stale || bf_next != NULL) -+ list_move_tail(&bf->list, &bf_head); -+ -+- ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, 0); -++ ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, ts, 0); -+ -+ bf = bf_next; -+ } -+@@ -598,7 +611,7 @@ static void ath_tx_complete_aggr(struct -+ ts); -+ } -+ -+- ath_tx_complete_buf(sc, bf, txq, &bf_head, ts, -++ ath_tx_complete_buf(sc, bf, txq, &bf_head, sta, ts, -+ !txfail); -+ } else { -+ if (tx_info->flags & IEEE80211_TX_STATUS_EOSP) { -+@@ -619,7 +632,8 @@ static void ath_tx_complete_aggr(struct -+ ath_tx_update_baw(sc, tid, seqno); -+ -+ ath_tx_complete_buf(sc, bf, txq, -+- &bf_head, ts, 0); -++ &bf_head, NULL, ts, -++ 0); -+ bar_index = max_t(int, bar_index, -+ ATH_BA_INDEX(seq_first, seqno)); -+ break; -+@@ -663,8 +677,6 @@ static void ath_tx_complete_aggr(struct -+ ath_txq_lock(sc, txq); -+ } -+ -+- rcu_read_unlock(); -+- -+ if (needreset) -+ ath9k_queue_reset(sc, RESET_TYPE_TX_ERROR); -+ } -+@@ -679,7 +691,10 @@ static void ath_tx_process_buffer(struct -+ struct ath_tx_status *ts, struct ath_buf *bf, -+ struct list_head *bf_head) -+ { -++ struct ieee80211_hw *hw = sc->hw; -+ struct ieee80211_tx_info *info; -++ struct ieee80211_sta *sta; -++ struct ieee80211_hdr *hdr; -+ bool txok, flush; -+ -+ txok = !(ts->ts_status & ATH9K_TXERR_MASK); -+@@ -692,6 +707,10 @@ static void ath_tx_process_buffer(struct -+ -+ ts->duration = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, -+ ts->ts_rateindex); -++ -++ hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; -++ sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); -++ -+ if (!bf_isampdu(bf)) { -+ if (!flush) { -+ info = IEEE80211_SKB_CB(bf->bf_mpdu); -+@@ -700,9 +719,9 @@ static void ath_tx_process_buffer(struct -+ ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok); -+ ath_dynack_sample_tx_ts(sc->sc_ah, bf->bf_mpdu, ts); -+ } -+- ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok); -++ ath_tx_complete_buf(sc, bf, txq, bf_head, sta, ts, txok); -+ } else -+- ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok); -++ ath_tx_complete_aggr(sc, txq, bf, bf_head, sta, ts, txok); -+ -+ if (!flush) -+ ath_txq_schedule(sc, txq); -+@@ -938,7 +957,7 @@ ath_tx_get_tid_subframe(struct ath_softc -+ list_add(&bf->list, &bf_head); -+ __skb_unlink(skb, *q); -+ ath_tx_update_baw(sc, tid, seqno); -+- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); -++ ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); -+ continue; -+ } -+ -+@@ -1847,6 +1866,7 @@ static void ath_drain_txq_list(struct at -+ */ -+ void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq) -+ { -++ rcu_read_lock(); -+ ath_txq_lock(sc, txq); -+ -+ if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { -+@@ -1865,6 +1885,7 @@ void ath_draintxq(struct ath_softc *sc, -+ ath_drain_txq_list(sc, txq, &txq->axq_q); -+ -+ ath_txq_unlock_complete(sc, txq); -++ rcu_read_unlock(); -+ } -+ -+ bool ath_drain_all_txq(struct ath_softc *sc) -+@@ -2487,7 +2508,8 @@ void ath_tx_cabq(struct ieee80211_hw *hw -+ /*****************/ -+ -+ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, -+- int tx_flags, struct ath_txq *txq) -++ int tx_flags, struct ath_txq *txq, -++ struct ieee80211_sta *sta) -+ { -+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+@@ -2507,15 +2529,17 @@ static void ath_tx_complete(struct ath_s -+ tx_info->flags |= IEEE80211_TX_STAT_ACK; -+ } -+ -+- padpos = ieee80211_hdrlen(hdr->frame_control); -+- padsize = padpos & 3; -+- if (padsize && skb->len>padpos+padsize) { -+- /* -+- * Remove MAC header padding before giving the frame back to -+- * mac80211. -+- */ -+- memmove(skb->data + padsize, skb->data, padpos); -+- skb_pull(skb, padsize); -++ if (tx_info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { -++ padpos = ieee80211_hdrlen(hdr->frame_control); -++ padsize = padpos & 3; -++ if (padsize && skb->len>padpos+padsize) { -++ /* -++ * Remove MAC header padding before giving the frame back to -++ * mac80211. -++ */ -++ memmove(skb->data + padsize, skb->data, padpos); -++ skb_pull(skb, padsize); -++ } -+ } -+ -+ spin_lock_irqsave(&sc->sc_pm_lock, flags); -+@@ -2530,12 +2554,14 @@ static void ath_tx_complete(struct ath_s -+ } -+ spin_unlock_irqrestore(&sc->sc_pm_lock, flags); -+ -+- __skb_queue_tail(&txq->complete_q, skb); -+ ath_txq_skb_done(sc, txq, skb); -++ tx_info->status.status_driver_data[0] = sta; -++ __skb_queue_tail(&txq->complete_q, skb); -+ } -+ -+ static void ath_tx_complete_buf(struct ath_softc *sc, struct ath_buf *bf, -+ struct ath_txq *txq, struct list_head *bf_q, -++ struct ieee80211_sta *sta, -+ struct ath_tx_status *ts, int txok) -+ { -+ struct sk_buff *skb = bf->bf_mpdu; -+@@ -2563,7 +2589,7 @@ static void ath_tx_complete_buf(struct a -+ complete(&sc->paprd_complete); -+ } else { -+ ath_debug_stat_tx(sc, bf, ts, txq, tx_flags); -+- ath_tx_complete(sc, skb, tx_flags, txq); -++ ath_tx_complete(sc, skb, tx_flags, txq, sta); -+ } -+ skip_tx_complete: -+ /* At this point, skb (bf->bf_mpdu) is consumed...make sure we don't -+@@ -2715,10 +2741,12 @@ void ath_tx_tasklet(struct ath_softc *sc -+ u32 qcumask = ((1 << ATH9K_NUM_TX_QUEUES) - 1) & ah->intr_txqs; -+ int i; -+ -++ rcu_read_lock(); -+ for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { -+ if (ATH_TXQ_SETUP(sc, i) && (qcumask & (1 << i))) -+ ath_tx_processq(sc, &sc->tx.txq[i]); -+ } -++ rcu_read_unlock(); -+ } -+ -+ void ath_tx_edma_tasklet(struct ath_softc *sc) -+@@ -2732,6 +2760,7 @@ void ath_tx_edma_tasklet(struct ath_soft -+ struct list_head *fifo_list; -+ int status; -+ -++ rcu_read_lock(); -+ for (;;) { -+ if (test_bit(ATH_OP_HW_RESET, &common->op_flags)) -+ break; -+@@ -2802,6 +2831,7 @@ void ath_tx_edma_tasklet(struct ath_soft -+ ath_tx_process_buffer(sc, txq, &ts, bf, &bf_head); -+ ath_txq_unlock_complete(sc, txq); -+ } -++ rcu_read_unlock(); -+ } -+ -+ /*****************/ diff --git a/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch b/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch deleted file mode 100644 index acaacf7..0000000 @@ -9563,82 +9079,6 @@ index acaacf7..0000000 - rates->rate[i].idx = -1; - rate_control_set_rates(mp->hw, mi->sta, rates); - } -diff --git a/package/kernel/mac80211/patches/336-ath9k-improve-powersave-filter-handling.patch b/package/kernel/mac80211/patches/336-ath9k-improve-powersave-filter-handling.patch -new file mode 100644 -index 0000000..67a6c63 ---- /dev/null -+++ b/package/kernel/mac80211/patches/336-ath9k-improve-powersave-filter-handling.patch -@@ -0,0 +1,70 @@ -+From: Felix Fietkau -+Date: Tue, 2 Aug 2016 12:13:35 +0200 -+Subject: [PATCH] ath9k: improve powersave filter handling -+ -+For non-aggregated frames, ath9k was leaving handling of powersave -+filtered packets to mac80211. This can be too slow if the intermediate -+queue is already filled with packets and mac80211 does not immediately -+send a new packet via drv_tx(). -+ -+Improve response time with filtered frames by triggering clearing the -+powersave filter internally. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -461,13 +461,13 @@ static void ath_tx_count_frames(struct a -+ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, -+ struct ath_buf *bf, struct list_head *bf_q, -+ struct ieee80211_sta *sta, -++ struct ath_atx_tid *tid, -+ struct ath_tx_status *ts, int txok) -+ { -+ struct ath_node *an = NULL; -+ struct sk_buff *skb; -+ struct ieee80211_hdr *hdr; -+ struct ieee80211_tx_info *tx_info; -+- struct ath_atx_tid *tid = NULL; -+ struct ath_buf *bf_next, *bf_last = bf->bf_lastbf; -+ struct list_head bf_head; -+ struct sk_buff_head bf_pending; -+@@ -509,7 +509,6 @@ static void ath_tx_complete_aggr(struct -+ } -+ -+ an = (struct ath_node *)sta->drv_priv; -+- tid = ath_get_skb_tid(sc, an, skb); -+ seq_first = tid->seq_start; -+ isba = ts->ts_flags & ATH9K_TX_BA; -+ -+@@ -695,6 +694,7 @@ static void ath_tx_process_buffer(struct -+ struct ieee80211_tx_info *info; -+ struct ieee80211_sta *sta; -+ struct ieee80211_hdr *hdr; -++ struct ath_atx_tid *tid = NULL; -+ bool txok, flush; -+ -+ txok = !(ts->ts_status & ATH9K_TXERR_MASK); -+@@ -710,6 +710,12 @@ static void ath_tx_process_buffer(struct -+ -+ hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; -+ sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); -++ if (sta) { -++ struct ath_node *an = (struct ath_node *)sta->drv_priv; -++ tid = ath_get_skb_tid(sc, an, bf->bf_mpdu); -++ if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY)) -++ tid->clear_ps_filter = true; -++ } -+ -+ if (!bf_isampdu(bf)) { -+ if (!flush) { -+@@ -721,7 +727,7 @@ static void ath_tx_process_buffer(struct -+ } -+ ath_tx_complete_buf(sc, bf, txq, bf_head, sta, ts, txok); -+ } else -+- ath_tx_complete_aggr(sc, txq, bf, bf_head, sta, ts, txok); -++ ath_tx_complete_aggr(sc, txq, bf, bf_head, sta, tid, ts, txok); -+ -+ if (!flush) -+ ath_txq_schedule(sc, txq); diff --git a/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch b/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch deleted file mode 100644 index 32a2ad6..0000000 @@ -9676,963 +9116,6 @@ index 32a2ad6..0000000 - } - - static void -diff --git a/package/kernel/mac80211/patches/337-ath9k-Switch-to-using-mac80211-intermediate-software.patch b/package/kernel/mac80211/patches/337-ath9k-Switch-to-using-mac80211-intermediate-software.patch -new file mode 100644 -index 0000000..adfd6df ---- /dev/null -+++ b/package/kernel/mac80211/patches/337-ath9k-Switch-to-using-mac80211-intermediate-software.patch -@@ -0,0 +1,951 @@ -+From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= -+Date: Wed, 6 Jul 2016 21:34:17 +0200 -+Subject: [PATCH] ath9k: Switch to using mac80211 intermediate software queues. -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+This switches ath9k over to using the mac80211 intermediate software -+queueing mechanism for data packets. It removes the queueing inside the -+driver, except for the retry queue, and instead pulls from mac80211 when -+a packet is needed. The retry queue is used to store a packet that was -+pulled but can't be sent immediately. -+ -+The old code path in ath_tx_start that would queue packets has been -+removed completely, as has the qlen limit tunables (since there's no -+longer a queue in the driver to limit). -+ -+Based on Tim's original patch set, but reworked quite thoroughly. -+ -+Cc: Tim Shepard -+Cc: Felix Fietkau -+Signed-off-by: Toke Høiland-Jørgensen -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ath9k.h -++++ b/drivers/net/wireless/ath/ath9k/ath9k.h -+@@ -91,7 +91,6 @@ int ath_descdma_setup(struct ath_softc * -+ #define ATH_RXBUF 512 -+ #define ATH_TXBUF 512 -+ #define ATH_TXBUF_RESERVE 5 -+-#define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE) -+ #define ATH_TXMAXTRY 13 -+ #define ATH_MAX_SW_RETRIES 30 -+ -+@@ -145,7 +144,7 @@ int ath_descdma_setup(struct ath_softc * -+ #define BAW_WITHIN(_start, _bawsz, _seqno) \ -+ ((((_seqno) - (_start)) & 4095) < (_bawsz)) -+ -+-#define ATH_AN_2_TID(_an, _tidno) (&(_an)->tid[(_tidno)]) -++#define ATH_AN_2_TID(_an, _tidno) ath_node_to_tid(_an, _tidno) -+ -+ #define IS_HT_RATE(rate) (rate & 0x80) -+ #define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e)) -+@@ -164,7 +163,6 @@ struct ath_txq { -+ spinlock_t axq_lock; -+ u32 axq_depth; -+ u32 axq_ampdu_depth; -+- bool stopped; -+ bool axq_tx_inprogress; -+ struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; -+ u8 txq_headidx; -+@@ -232,7 +230,6 @@ struct ath_buf { -+ -+ struct ath_atx_tid { -+ struct list_head list; -+- struct sk_buff_head buf_q; -+ struct sk_buff_head retry_q; -+ struct ath_node *an; -+ struct ath_txq *txq; -+@@ -247,13 +244,13 @@ struct ath_atx_tid { -+ s8 bar_index; -+ bool active; -+ bool clear_ps_filter; -++ bool has_queued; -+ }; -+ -+ struct ath_node { -+ struct ath_softc *sc; -+ struct ieee80211_sta *sta; /* station struct we're part of */ -+ struct ieee80211_vif *vif; /* interface with which we're associated */ -+- struct ath_atx_tid tid[IEEE80211_NUM_TIDS]; -+ -+ u16 maxampdu; -+ u8 mpdudensity; -+@@ -276,7 +273,6 @@ struct ath_tx_control { -+ struct ath_node *an; -+ struct ieee80211_sta *sta; -+ u8 paprd; -+- bool force_channel; -+ }; -+ -+ -+@@ -293,7 +289,6 @@ struct ath_tx { -+ struct ath_descdma txdma; -+ struct ath_txq *txq_map[IEEE80211_NUM_ACS]; -+ struct ath_txq *uapsdq; -+- u32 txq_max_pending[IEEE80211_NUM_ACS]; -+ u16 max_aggr_framelen[IEEE80211_NUM_ACS][4][32]; -+ }; -+ -+@@ -421,6 +416,22 @@ struct ath_offchannel { -+ int duration; -+ }; -+ -++static inline struct ath_atx_tid * -++ath_node_to_tid(struct ath_node *an, u8 tidno) -++{ -++ struct ieee80211_sta *sta = an->sta; -++ struct ieee80211_vif *vif = an->vif; -++ struct ieee80211_txq *txq; -++ -++ BUG_ON(!vif); -++ if (sta) -++ txq = sta->txq[tidno % ARRAY_SIZE(sta->txq)]; -++ else -++ txq = vif->txq; -++ -++ return (struct ath_atx_tid *) txq->drv_priv; -++} -++ -+ #define case_rtn_string(val) case val: return #val -+ -+ #define ath_for_each_chanctx(_sc, _ctx) \ -+@@ -575,7 +586,6 @@ void ath_tx_edma_tasklet(struct ath_soft -+ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, -+ u16 tid, u16 *ssn); -+ void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); -+-void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); -+ -+ void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an); -+ void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc, -+@@ -585,6 +595,7 @@ void ath9k_release_buffered_frames(struc -+ u16 tids, int nframes, -+ enum ieee80211_frame_release_type reason, -+ bool more_data); -++void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue); -+ -+ /********/ -+ /* VIFs */ -+--- a/drivers/net/wireless/ath/ath9k/channel.c -++++ b/drivers/net/wireless/ath/ath9k/channel.c -+@@ -1007,7 +1007,6 @@ static void ath_scan_send_probe(struct a -+ goto error; -+ -+ txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO]; -+- txctl.force_channel = true; -+ if (ath_tx_start(sc->hw, skb, &txctl)) -+ goto error; -+ -+@@ -1130,7 +1129,6 @@ ath_chanctx_send_vif_ps_frame(struct ath -+ memset(&txctl, 0, sizeof(txctl)); -+ txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO]; -+ txctl.sta = sta; -+- txctl.force_channel = true; -+ if (ath_tx_start(sc->hw, skb, &txctl)) { -+ ieee80211_free_txskb(sc->hw, skb); -+ return false; -+--- a/drivers/net/wireless/ath/ath9k/debug.c -++++ b/drivers/net/wireless/ath/ath9k/debug.c -+@@ -600,7 +600,6 @@ static int read_file_xmit(struct seq_fil -+ PR("MPDUs XRetried: ", xretries); -+ PR("Aggregates: ", a_aggr); -+ PR("AMPDUs Queued HW:", a_queued_hw); -+- PR("AMPDUs Queued SW:", a_queued_sw); -+ PR("AMPDUs Completed:", a_completed); -+ PR("AMPDUs Retried: ", a_retries); -+ PR("AMPDUs XRetried: ", a_xretries); -+@@ -629,8 +628,7 @@ static void print_queue(struct ath_softc -+ seq_printf(file, "%s: %d ", "qnum", txq->axq_qnum); -+ seq_printf(file, "%s: %2d ", "qdepth", txq->axq_depth); -+ seq_printf(file, "%s: %2d ", "ampdu-depth", txq->axq_ampdu_depth); -+- seq_printf(file, "%s: %3d ", "pending", txq->pending_frames); -+- seq_printf(file, "%s: %d\n", "stopped", txq->stopped); -++ seq_printf(file, "%s: %3d\n", "pending", txq->pending_frames); -+ -+ ath_txq_unlock(sc, txq); -+ } -+@@ -1208,7 +1206,6 @@ static const char ath9k_gstrings_stats[] -+ AMKSTR(d_tx_mpdu_xretries), -+ AMKSTR(d_tx_aggregates), -+ AMKSTR(d_tx_ampdus_queued_hw), -+- AMKSTR(d_tx_ampdus_queued_sw), -+ AMKSTR(d_tx_ampdus_completed), -+ AMKSTR(d_tx_ampdu_retries), -+ AMKSTR(d_tx_ampdu_xretries), -+@@ -1288,7 +1285,6 @@ void ath9k_get_et_stats(struct ieee80211 -+ AWDATA(xretries); -+ AWDATA(a_aggr); -+ AWDATA(a_queued_hw); -+- AWDATA(a_queued_sw); -+ AWDATA(a_completed); -+ AWDATA(a_retries); -+ AWDATA(a_xretries); -+@@ -1346,14 +1342,6 @@ int ath9k_init_debug(struct ath_hw *ah) -+ read_file_xmit); -+ debugfs_create_devm_seqfile(sc->dev, "queues", sc->debug.debugfs_phy, -+ read_file_queues); -+- debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+- &sc->tx.txq_max_pending[IEEE80211_AC_BK]); -+- debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+- &sc->tx.txq_max_pending[IEEE80211_AC_BE]); -+- debugfs_create_u32("qlen_vi", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+- &sc->tx.txq_max_pending[IEEE80211_AC_VI]); -+- debugfs_create_u32("qlen_vo", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+- &sc->tx.txq_max_pending[IEEE80211_AC_VO]); -+ debugfs_create_devm_seqfile(sc->dev, "misc", sc->debug.debugfs_phy, -+ read_file_misc); -+ debugfs_create_devm_seqfile(sc->dev, "reset", sc->debug.debugfs_phy, -+--- a/drivers/net/wireless/ath/ath9k/debug.h -++++ b/drivers/net/wireless/ath/ath9k/debug.h -+@@ -147,7 +147,6 @@ struct ath_interrupt_stats { -+ * @completed: Total MPDUs (non-aggr) completed -+ * @a_aggr: Total no. of aggregates queued -+ * @a_queued_hw: Total AMPDUs queued to hardware -+- * @a_queued_sw: Total AMPDUs queued to software queues -+ * @a_completed: Total AMPDUs completed -+ * @a_retries: No. of AMPDUs retried (SW) -+ * @a_xretries: No. of AMPDUs dropped due to xretries -+@@ -174,7 +173,6 @@ struct ath_tx_stats { -+ u32 xretries; -+ u32 a_aggr; -+ u32 a_queued_hw; -+- u32 a_queued_sw; -+ u32 a_completed; -+ u32 a_retries; -+ u32 a_xretries; -+--- a/drivers/net/wireless/ath/ath9k/debug_sta.c -++++ b/drivers/net/wireless/ath/ath9k/debug_sta.c -+@@ -52,8 +52,8 @@ static ssize_t read_file_node_aggr(struc -+ "TID", "SEQ_START", "SEQ_NEXT", "BAW_SIZE", -+ "BAW_HEAD", "BAW_TAIL", "BAR_IDX", "SCHED", "PAUSED"); -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ath_node_to_tid(an, tidno); -+ txq = tid->txq; -+ ath_txq_lock(sc, txq); -+ if (tid->active) { -+--- a/drivers/net/wireless/ath/ath9k/init.c -++++ b/drivers/net/wireless/ath/ath9k/init.c -+@@ -358,7 +358,6 @@ static int ath9k_init_queues(struct ath_ -+ for (i = 0; i < IEEE80211_NUM_ACS; i++) { -+ sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i); -+ sc->tx.txq_map[i]->mac80211_qnum = i; -+- sc->tx.txq_max_pending[i] = ATH_MAX_QDEPTH; -+ } -+ return 0; -+ } -+@@ -873,6 +872,7 @@ static void ath9k_set_hw_capab(struct at -+ hw->max_rate_tries = 10; -+ hw->sta_data_size = sizeof(struct ath_node); -+ hw->vif_data_size = sizeof(struct ath_vif); -++ hw->txq_data_size = sizeof(struct ath_atx_tid); -+ hw->extra_tx_headroom = 4; -+ -+ hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1; -+--- a/drivers/net/wireless/ath/ath9k/main.c -++++ b/drivers/net/wireless/ath/ath9k/main.c -+@@ -1897,9 +1897,11 @@ static int ath9k_ampdu_action(struct iee -+ bool flush = false; -+ int ret = 0; -+ struct ieee80211_sta *sta = params->sta; -++ struct ath_node *an = (struct ath_node *)sta->drv_priv; -+ enum ieee80211_ampdu_mlme_action action = params->action; -+ u16 tid = params->tid; -+ u16 *ssn = ¶ms->ssn; -++ struct ath_atx_tid *atid; -+ -+ mutex_lock(&sc->mutex); -+ -+@@ -1932,9 +1934,9 @@ static int ath9k_ampdu_action(struct iee -+ ath9k_ps_restore(sc); -+ break; -+ case IEEE80211_AMPDU_TX_OPERATIONAL: -+- ath9k_ps_wakeup(sc); -+- ath_tx_aggr_resume(sc, sta, tid); -+- ath9k_ps_restore(sc); -++ atid = ath_node_to_tid(an, tid); -++ atid->baw_size = IEEE80211_MIN_AMPDU_BUF << -++ sta->ht_cap.ampdu_factor; -+ break; -+ default: -+ ath_err(ath9k_hw_common(sc->sc_ah), "Unknown AMPDU action\n"); -+@@ -2696,4 +2698,5 @@ struct ieee80211_ops ath9k_ops = { -+ .sw_scan_start = ath9k_sw_scan_start, -+ .sw_scan_complete = ath9k_sw_scan_complete, -+ .get_txpower = ath9k_get_txpower, -++ .wake_tx_queue = ath9k_wake_tx_queue, -+ }; -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -67,6 +67,8 @@ static struct ath_buf *ath_tx_setup_buff -+ struct ath_txq *txq, -+ struct ath_atx_tid *tid, -+ struct sk_buff *skb); -++static int ath_tx_prepare(struct ieee80211_hw *hw, struct sk_buff *skb, -++ struct ath_tx_control *txctl); -+ -+ enum { -+ MCS_HT20, -+@@ -137,6 +139,26 @@ static void ath_tx_queue_tid(struct ath_ -+ list_add_tail(&tid->list, list); -+ } -+ -++void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue) -++{ -++ struct ath_softc *sc = hw->priv; -++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -++ struct ath_atx_tid *tid = (struct ath_atx_tid *) queue->drv_priv; -++ struct ath_txq *txq = tid->txq; -++ -++ ath_dbg(common, QUEUE, "Waking TX queue: %pM (%d)\n", -++ queue->sta ? queue->sta->addr : queue->vif->addr, -++ tid->tidno); -++ -++ ath_txq_lock(sc, txq); -++ -++ tid->has_queued = true; -++ ath_tx_queue_tid(sc, txq, tid); -++ ath_txq_schedule(sc, txq); -++ -++ ath_txq_unlock(sc, txq); -++} -++ -+ static struct ath_frame_info *get_frame_info(struct sk_buff *skb) -+ { -+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); -+@@ -179,7 +201,6 @@ static void ath_set_rates(struct ieee802 -+ static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, -+ struct sk_buff *skb) -+ { -+- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ struct ath_frame_info *fi = get_frame_info(skb); -+ int q = fi->txq; -+ -+@@ -190,14 +211,6 @@ static void ath_txq_skb_done(struct ath_ -+ if (WARN_ON(--txq->pending_frames < 0)) -+ txq->pending_frames = 0; -+ -+- if (txq->stopped && -+- txq->pending_frames < sc->tx.txq_max_pending[q]) { -+- if (ath9k_is_chanctx_enabled()) -+- ieee80211_wake_queue(sc->hw, info->hw_queue); -+- else -+- ieee80211_wake_queue(sc->hw, q); -+- txq->stopped = false; -+- } -+ } -+ -+ static struct ath_atx_tid * -+@@ -207,9 +220,48 @@ ath_get_skb_tid(struct ath_softc *sc, st -+ return ATH_AN_2_TID(an, tidno); -+ } -+ -++static struct sk_buff * -++ath_tid_pull(struct ath_atx_tid *tid) -++{ -++ struct ieee80211_txq *txq = container_of((void*)tid, struct ieee80211_txq, drv_priv); -++ struct ath_softc *sc = tid->an->sc; -++ struct ieee80211_hw *hw = sc->hw; -++ struct ath_tx_control txctl = { -++ .txq = tid->txq, -++ .sta = tid->an->sta, -++ }; -++ struct sk_buff *skb; -++ struct ath_frame_info *fi; -++ int q; -++ -++ if (!tid->has_queued) -++ return NULL; -++ -++ skb = ieee80211_tx_dequeue(hw, txq); -++ if (!skb) { -++ tid->has_queued = false; -++ return NULL; -++ } -++ -++ if (ath_tx_prepare(hw, skb, &txctl)) { -++ ieee80211_free_txskb(hw, skb); -++ return NULL; -++ } -++ -++ q = skb_get_queue_mapping(skb); -++ if (tid->txq == sc->tx.txq_map[q]) { -++ fi = get_frame_info(skb); -++ fi->txq = q; -++ ++tid->txq->pending_frames; -++ } -++ -++ return skb; -++ } -++ -++ -+ static bool ath_tid_has_buffered(struct ath_atx_tid *tid) -+ { -+- return !skb_queue_empty(&tid->buf_q) || !skb_queue_empty(&tid->retry_q); -++ return !skb_queue_empty(&tid->retry_q) || tid->has_queued; -+ } -+ -+ static struct sk_buff *ath_tid_dequeue(struct ath_atx_tid *tid) -+@@ -218,46 +270,11 @@ static struct sk_buff *ath_tid_dequeue(s -+ -+ skb = __skb_dequeue(&tid->retry_q); -+ if (!skb) -+- skb = __skb_dequeue(&tid->buf_q); -++ skb = ath_tid_pull(tid); -+ -+ return skb; -+ } -+ -+-/* -+- * ath_tx_tid_change_state: -+- * - clears a-mpdu flag of previous session -+- * - force sequence number allocation to fix next BlockAck Window -+- */ -+-static void -+-ath_tx_tid_change_state(struct ath_softc *sc, struct ath_atx_tid *tid) -+-{ -+- struct ath_txq *txq = tid->txq; -+- struct ieee80211_tx_info *tx_info; -+- struct sk_buff *skb, *tskb; -+- struct ath_buf *bf; -+- struct ath_frame_info *fi; -+- -+- skb_queue_walk_safe(&tid->buf_q, skb, tskb) { -+- fi = get_frame_info(skb); -+- bf = fi->bf; -+- -+- tx_info = IEEE80211_SKB_CB(skb); -+- tx_info->flags &= ~IEEE80211_TX_CTL_AMPDU; -+- -+- if (bf) -+- continue; -+- -+- bf = ath_tx_setup_buffer(sc, txq, tid, skb); -+- if (!bf) { -+- __skb_unlink(skb, &tid->buf_q); -+- ath_txq_skb_done(sc, txq, skb); -+- ieee80211_free_txskb(sc->hw, skb); -+- continue; -+- } -+- } -+- -+-} -+- -+ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) -+ { -+ struct ath_txq *txq = tid->txq; -+@@ -898,20 +915,16 @@ static int ath_compute_num_delims(struct -+ -+ static struct ath_buf * -+ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq, -+- struct ath_atx_tid *tid, struct sk_buff_head **q) -++ struct ath_atx_tid *tid) -+ { -+ struct ieee80211_tx_info *tx_info; -+ struct ath_frame_info *fi; -+- struct sk_buff *skb; -++ struct sk_buff *skb, *first_skb = NULL; -+ struct ath_buf *bf; -+ u16 seqno; -+ -+ while (1) { -+- *q = &tid->retry_q; -+- if (skb_queue_empty(*q)) -+- *q = &tid->buf_q; -+- -+- skb = skb_peek(*q); -++ skb = ath_tid_dequeue(tid); -+ if (!skb) -+ break; -+ -+@@ -923,7 +936,6 @@ ath_tx_get_tid_subframe(struct ath_softc -+ bf->bf_state.stale = false; -+ -+ if (!bf) { -+- __skb_unlink(skb, *q); -+ ath_txq_skb_done(sc, txq, skb); -+ ieee80211_free_txskb(sc->hw, skb); -+ continue; -+@@ -952,8 +964,19 @@ ath_tx_get_tid_subframe(struct ath_softc -+ seqno = bf->bf_state.seqno; -+ -+ /* do not step over block-ack window */ -+- if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) -++ if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) { -++ __skb_queue_tail(&tid->retry_q, skb); -++ -++ /* If there are other skbs in the retry q, they are -++ * probably within the BAW, so loop immediately to get -++ * one of them. Otherwise the queue can get stuck. */ -++ if (!skb_queue_is_first(&tid->retry_q, skb) && skb != first_skb) { -++ if(!first_skb) /* infinite loop prevention */ -++ first_skb = skb; -++ continue; -++ } -+ break; -++ } -+ -+ if (tid->bar_index > ATH_BA_INDEX(tid->seq_start, seqno)) { -+ struct ath_tx_status ts = {}; -+@@ -961,7 +984,6 @@ ath_tx_get_tid_subframe(struct ath_softc -+ -+ INIT_LIST_HEAD(&bf_head); -+ list_add(&bf->list, &bf_head); -+- __skb_unlink(skb, *q); -+ ath_tx_update_baw(sc, tid, seqno); -+ ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); -+ continue; -+@@ -973,11 +995,10 @@ ath_tx_get_tid_subframe(struct ath_softc -+ return NULL; -+ } -+ -+-static bool -++static int -+ ath_tx_form_aggr(struct ath_softc *sc, struct ath_txq *txq, -+ struct ath_atx_tid *tid, struct list_head *bf_q, -+- struct ath_buf *bf_first, struct sk_buff_head *tid_q, -+- int *aggr_len) -++ struct ath_buf *bf_first) -+ { -+ #define PADBYTES(_len) ((4 - ((_len) % 4)) % 4) -+ struct ath_buf *bf = bf_first, *bf_prev = NULL; -+@@ -987,12 +1008,13 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ struct ieee80211_tx_info *tx_info; -+ struct ath_frame_info *fi; -+ struct sk_buff *skb; -+- bool closed = false; -++ -+ -+ bf = bf_first; -+ aggr_limit = ath_lookup_rate(sc, bf, tid); -+ -+- do { -++ while (bf) -++ { -+ skb = bf->bf_mpdu; -+ fi = get_frame_info(skb); -+ -+@@ -1001,12 +1023,12 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ if (nframes) { -+ if (aggr_limit < al + bpad + al_delta || -+ ath_lookup_legacy(bf) || nframes >= h_baw) -+- break; -++ goto stop; -+ -+ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); -+ if ((tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) || -+ !(tx_info->flags & IEEE80211_TX_CTL_AMPDU)) -+- break; -++ goto stop; -+ } -+ -+ /* add padding for previous frame to aggregation length */ -+@@ -1028,20 +1050,18 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ ath_tx_addto_baw(sc, tid, bf); -+ bf->bf_state.ndelim = ndelim; -+ -+- __skb_unlink(skb, tid_q); -+ list_add_tail(&bf->list, bf_q); -+ if (bf_prev) -+ bf_prev->bf_next = bf; -+ -+ bf_prev = bf; -+ -+- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); -+- if (!bf) { -+- closed = true; -+- break; -+- } -+- } while (ath_tid_has_buffered(tid)); -+- -++ bf = ath_tx_get_tid_subframe(sc, txq, tid); -++ } -++ goto finish; -++stop: -++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); -++finish: -+ bf = bf_first; -+ bf->bf_lastbf = bf_prev; -+ -+@@ -1052,9 +1072,7 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ TX_STAT_INC(txq->axq_qnum, a_aggr); -+ } -+ -+- *aggr_len = al; -+- -+- return closed; -++ return al; -+ #undef PADBYTES -+ } -+ -+@@ -1431,18 +1449,15 @@ static void ath_tx_fill_desc(struct ath_ -+ static void -+ ath_tx_form_burst(struct ath_softc *sc, struct ath_txq *txq, -+ struct ath_atx_tid *tid, struct list_head *bf_q, -+- struct ath_buf *bf_first, struct sk_buff_head *tid_q) -++ struct ath_buf *bf_first) -+ { -+ struct ath_buf *bf = bf_first, *bf_prev = NULL; -+- struct sk_buff *skb; -+ int nframes = 0; -+ -+ do { -+ struct ieee80211_tx_info *tx_info; -+- skb = bf->bf_mpdu; -+ -+ nframes++; -+- __skb_unlink(skb, tid_q); -+ list_add_tail(&bf->list, bf_q); -+ if (bf_prev) -+ bf_prev->bf_next = bf; -+@@ -1451,13 +1466,15 @@ ath_tx_form_burst(struct ath_softc *sc, -+ if (nframes >= 2) -+ break; -+ -+- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); -++ bf = ath_tx_get_tid_subframe(sc, txq, tid); -+ if (!bf) -+ break; -+ -+ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); -+- if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) -++ if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) { -++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); -+ break; -++ } -+ -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, false); -+ } while (1); -+@@ -1468,34 +1485,33 @@ static bool ath_tx_sched_aggr(struct ath -+ { -+ struct ath_buf *bf; -+ struct ieee80211_tx_info *tx_info; -+- struct sk_buff_head *tid_q; -+ struct list_head bf_q; -+ int aggr_len = 0; -+- bool aggr, last = true; -++ bool aggr; -+ -+ if (!ath_tid_has_buffered(tid)) -+ return false; -+ -+ INIT_LIST_HEAD(&bf_q); -+ -+- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); -++ bf = ath_tx_get_tid_subframe(sc, txq, tid); -+ if (!bf) -+ return false; -+ -+ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); -+ aggr = !!(tx_info->flags & IEEE80211_TX_CTL_AMPDU); -+ if ((aggr && txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) || -+- (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { -++ (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { -++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); -+ *stop = true; -+ return false; -+ } -+ -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, false); -+ if (aggr) -+- last = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf, -+- tid_q, &aggr_len); -++ aggr_len = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf); -+ else -+- ath_tx_form_burst(sc, txq, tid, &bf_q, bf, tid_q); -++ ath_tx_form_burst(sc, txq, tid, &bf_q, bf); -+ -+ if (list_empty(&bf_q)) -+ return false; -+@@ -1538,9 +1554,6 @@ int ath_tx_aggr_start(struct ath_softc * -+ an->mpdudensity = density; -+ } -+ -+- /* force sequence number allocation for pending frames */ -+- ath_tx_tid_change_state(sc, txtid); -+- -+ txtid->active = true; -+ *ssn = txtid->seq_start = txtid->seq_next; -+ txtid->bar_index = -1; -+@@ -1565,7 +1578,6 @@ void ath_tx_aggr_stop(struct ath_softc * -+ ath_txq_lock(sc, txq); -+ txtid->active = false; -+ ath_tx_flush_tid(sc, txtid); -+- ath_tx_tid_change_state(sc, txtid); -+ ath_txq_unlock_complete(sc, txq); -+ } -+ -+@@ -1575,14 +1587,12 @@ void ath_tx_aggr_sleep(struct ieee80211_ -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ struct ath_atx_tid *tid; -+ struct ath_txq *txq; -+- bool buffered; -+ int tidno; -+ -+ ath_dbg(common, XMIT, "%s called\n", __func__); -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { -+- -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ath_node_to_tid(an, tidno); -+ txq = tid->txq; -+ -+ ath_txq_lock(sc, txq); -+@@ -1592,13 +1602,12 @@ void ath_tx_aggr_sleep(struct ieee80211_ -+ continue; -+ } -+ -+- buffered = ath_tid_has_buffered(tid); -++ if (!skb_queue_empty(&tid->retry_q)) -++ ieee80211_sta_set_buffered(sta, tid->tidno, true); -+ -+ list_del_init(&tid->list); -+ -+ ath_txq_unlock(sc, txq); -+- -+- ieee80211_sta_set_buffered(sta, tidno, buffered); -+ } -+ } -+ -+@@ -1611,49 +1620,20 @@ void ath_tx_aggr_wakeup(struct ath_softc -+ -+ ath_dbg(common, XMIT, "%s called\n", __func__); -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { -+- -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ath_node_to_tid(an, tidno); -+ txq = tid->txq; -+ -+ ath_txq_lock(sc, txq); -+ tid->clear_ps_filter = true; -+- -+ if (ath_tid_has_buffered(tid)) { -+ ath_tx_queue_tid(sc, txq, tid); -+ ath_txq_schedule(sc, txq); -+ } -+- -+ ath_txq_unlock_complete(sc, txq); -+ } -+ } -+ -+-void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, -+- u16 tidno) -+-{ -+- struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+- struct ath_atx_tid *tid; -+- struct ath_node *an; -+- struct ath_txq *txq; -+- -+- ath_dbg(common, XMIT, "%s called\n", __func__); -+- -+- an = (struct ath_node *)sta->drv_priv; -+- tid = ATH_AN_2_TID(an, tidno); -+- txq = tid->txq; -+- -+- ath_txq_lock(sc, txq); -+- -+- tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; -+- -+- if (ath_tid_has_buffered(tid)) { -+- ath_tx_queue_tid(sc, txq, tid); -+- ath_txq_schedule(sc, txq); -+- } -+- -+- ath_txq_unlock_complete(sc, txq); -+-} -+- -+ void ath9k_release_buffered_frames(struct ieee80211_hw *hw, -+ struct ieee80211_sta *sta, -+ u16 tids, int nframes, -+@@ -1666,7 +1646,6 @@ void ath9k_release_buffered_frames(struc -+ struct ieee80211_tx_info *info; -+ struct list_head bf_q; -+ struct ath_buf *bf_tail = NULL, *bf; -+- struct sk_buff_head *tid_q; -+ int sent = 0; -+ int i; -+ -+@@ -1681,11 +1660,10 @@ void ath9k_release_buffered_frames(struc -+ -+ ath_txq_lock(sc, tid->txq); -+ while (nframes > 0) { -+- bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid, &tid_q); -++ bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid); -+ if (!bf) -+ break; -+ -+- __skb_unlink(bf->bf_mpdu, tid_q); -+ list_add_tail(&bf->list, &bf_q); -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, true); -+ if (bf_isampdu(bf)) { -+@@ -1700,7 +1678,7 @@ void ath9k_release_buffered_frames(struc -+ sent++; -+ TX_STAT_INC(txq->axq_qnum, a_queued_hw); -+ -+- if (an->sta && !ath_tid_has_buffered(tid)) -++ if (an->sta && skb_queue_empty(&tid->retry_q)) -+ ieee80211_sta_set_buffered(an->sta, i, false); -+ } -+ ath_txq_unlock_complete(sc, tid->txq); -+@@ -1929,13 +1907,7 @@ bool ath_drain_all_txq(struct ath_softc -+ if (!ATH_TXQ_SETUP(sc, i)) -+ continue; -+ -+- /* -+- * The caller will resume queues with ieee80211_wake_queues. -+- * Mark the queue as not stopped to prevent ath_tx_complete -+- * from waking the queue too early. -+- */ -+ txq = &sc->tx.txq[i]; -+- txq->stopped = false; -+ ath_draintxq(sc, txq); -+ } -+ -+@@ -2334,16 +2306,14 @@ int ath_tx_start(struct ieee80211_hw *hw -+ struct ath_softc *sc = hw->priv; -+ struct ath_txq *txq = txctl->txq; -+ struct ath_atx_tid *tid = NULL; -++ struct ath_node *an = NULL; -+ struct ath_buf *bf; -+- bool queue, ps_resp; -++ bool ps_resp; -+ int q, ret; -+ -+ if (vif) -+ avp = (void *)vif->drv_priv; -+ -+- if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) -+- txctl->force_channel = true; -+- -+ ps_resp = !!(info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE); -+ -+ ret = ath_tx_prepare(hw, skb, txctl); -+@@ -2358,63 +2328,18 @@ int ath_tx_start(struct ieee80211_hw *hw -+ -+ q = skb_get_queue_mapping(skb); -+ -+- ath_txq_lock(sc, txq); -+- if (txq == sc->tx.txq_map[q]) { -+- fi->txq = q; -+- if (++txq->pending_frames > sc->tx.txq_max_pending[q] && -+- !txq->stopped) { -+- if (ath9k_is_chanctx_enabled()) -+- ieee80211_stop_queue(sc->hw, info->hw_queue); -+- else -+- ieee80211_stop_queue(sc->hw, q); -+- txq->stopped = true; -+- } -+- } -+- -+- queue = ieee80211_is_data_present(hdr->frame_control); -+- -+- /* If chanctx, queue all null frames while NOA could be there */ -+- if (ath9k_is_chanctx_enabled() && -+- ieee80211_is_nullfunc(hdr->frame_control) && -+- !txctl->force_channel) -+- queue = true; -+- -+- /* Force queueing of all frames that belong to a virtual interface on -+- * a different channel context, to ensure that they are sent on the -+- * correct channel. -+- */ -+- if (((avp && avp->chanctx != sc->cur_chan) || -+- sc->cur_chan->stopped) && !txctl->force_channel) { -+- if (!txctl->an) -+- txctl->an = &avp->mcast_node; -+- queue = true; -+- ps_resp = false; -+- } -+- -+- if (txctl->an && queue) -+- tid = ath_get_skb_tid(sc, txctl->an, skb); -+- -+- if (ps_resp) { -+- ath_txq_unlock(sc, txq); -++ if (ps_resp) -+ txq = sc->tx.uapsdq; -+- ath_txq_lock(sc, txq); -+- } else if (txctl->an && queue) { -+- WARN_ON(tid->txq != txctl->txq); -+- -+- if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) -+- tid->clear_ps_filter = true; -+ -+- /* -+- * Add this frame to software queue for scheduling later -+- * for aggregation. -+- */ -+- TX_STAT_INC(txq->axq_qnum, a_queued_sw); -+- __skb_queue_tail(&tid->buf_q, skb); -+- if (!txctl->an->sleeping) -+- ath_tx_queue_tid(sc, txq, tid); -++ if (txctl->sta) { -++ an = (struct ath_node *) sta->drv_priv; -++ tid = ath_get_skb_tid(sc, an, skb); -++ } -+ -+- ath_txq_schedule(sc, txq); -+- goto out; -++ ath_txq_lock(sc, txq); -++ if (txq == sc->tx.txq_map[q]) { -++ fi->txq = q; -++ ++txq->pending_frames; -+ } -+ -+ bf = ath_tx_setup_buffer(sc, txq, tid, skb); -+@@ -2907,9 +2832,8 @@ void ath_tx_node_init(struct ath_softc * -+ struct ath_atx_tid *tid; -+ int tidno, acno; -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; -+- tidno++, tid++) { -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ath_node_to_tid(an, tidno); -+ tid->an = an; -+ tid->tidno = tidno; -+ tid->seq_start = tid->seq_next = 0; -+@@ -2917,11 +2841,14 @@ void ath_tx_node_init(struct ath_softc * -+ tid->baw_head = tid->baw_tail = 0; -+ tid->active = false; -+ tid->clear_ps_filter = true; -+- __skb_queue_head_init(&tid->buf_q); -++ tid->has_queued = false; -+ __skb_queue_head_init(&tid->retry_q); -+ INIT_LIST_HEAD(&tid->list); -+ acno = TID_TO_WME_AC(tidno); -+ tid->txq = sc->tx.txq_map[acno]; -++ -++ if (!an->sta) -++ break; /* just one multicast ath_atx_tid */ -+ } -+ } -+ -+@@ -2931,9 +2858,8 @@ void ath_tx_node_cleanup(struct ath_soft -+ struct ath_txq *txq; -+ int tidno; -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { -+- -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ath_node_to_tid(an, tidno); -+ txq = tid->txq; -+ -+ ath_txq_lock(sc, txq); -+@@ -2945,6 +2871,9 @@ void ath_tx_node_cleanup(struct ath_soft -+ tid->active = false; -+ -+ ath_txq_unlock(sc, txq); -++ -++ if (!an->sta) -++ break; /* just one multicast ath_atx_tid */ -+ } -+ } -+ diff --git a/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch b/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch deleted file mode 100644 index 229351b..0000000 @@ -10706,98 +9189,6 @@ index 56cd94a..0000000 - !ether_addr_equal(bssid, hdr->addr1)) - return false; - } -diff --git a/package/kernel/mac80211/patches/338-mac80211-fix-tim-recalculation-after-PS-response.patch b/package/kernel/mac80211/patches/338-mac80211-fix-tim-recalculation-after-PS-response.patch -new file mode 100644 -index 0000000..6c0852e ---- /dev/null -+++ b/package/kernel/mac80211/patches/338-mac80211-fix-tim-recalculation-after-PS-response.patch -@@ -0,0 +1,31 @@ -+From: Felix Fietkau -+Date: Fri, 26 Aug 2016 21:57:16 +0200 -+Subject: [PATCH] mac80211: fix tim recalculation after PS response -+ -+Handle the case where the mac80211 intermediate queues are empty and the -+driver has buffered frames -+ -+Fixes: ba8c3d6f16a1 ("mac80211: add an intermediate software queue implementation") -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/net/mac80211/sta_info.c -++++ b/net/mac80211/sta_info.c -+@@ -1616,7 +1616,6 @@ ieee80211_sta_ps_deliver_response(struct -+ -+ sta_info_recalc_tim(sta); -+ } else { -+- unsigned long tids = sta->txq_buffered_tids & driver_release_tids; -+ int tid; -+ -+ /* -+@@ -1648,7 +1647,8 @@ ieee80211_sta_ps_deliver_response(struct -+ for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) { -+ struct txq_info *txqi = to_txq_info(sta->sta.txq[tid]); -+ -+- if (!(tids & BIT(tid)) || txqi->tin.backlog_packets) -++ if (!(driver_release_tids & BIT(tid)) || -++ txqi->tin.backlog_packets) -+ continue; -+ -+ sta_info_recalc_tim(sta); -diff --git a/package/kernel/mac80211/patches/339-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch b/package/kernel/mac80211/patches/339-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch -new file mode 100644 -index 0000000..49b37e4 ---- /dev/null -+++ b/package/kernel/mac80211/patches/339-ath9k-fix-moredata-bit-in-PS-buffered-frame-release.patch -@@ -0,0 +1,49 @@ -+From: Felix Fietkau -+Date: Sun, 28 Aug 2016 13:13:01 +0200 -+Subject: [PATCH] ath9k: fix moredata bit in PS buffered frame release -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -1634,6 +1634,21 @@ void ath_tx_aggr_wakeup(struct ath_softc -+ } -+ } -+ -++static void -++ath9k_set_moredata(struct ath_softc *sc, struct ath_buf *bf, bool val) -++{ -++ struct ieee80211_hdr *hdr; -++ u16 mask = cpu_to_le16(IEEE80211_FCTL_MOREDATA); -++ u16 mask_val = mask * val; -++ -++ hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; -++ if ((hdr->frame_control & mask) != mask_val) { -++ hdr->frame_control = (hdr->frame_control & ~mask) | mask_val; -++ dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, -++ sizeof(*hdr), DMA_TO_DEVICE); -++ } -++} -++ -+ void ath9k_release_buffered_frames(struct ieee80211_hw *hw, -+ struct ieee80211_sta *sta, -+ u16 tids, int nframes, -+@@ -1664,6 +1679,7 @@ void ath9k_release_buffered_frames(struc -+ if (!bf) -+ break; -+ -++ ath9k_set_moredata(sc, bf, true); -+ list_add_tail(&bf->list, &bf_q); -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, true); -+ if (bf_isampdu(bf)) { -+@@ -1687,6 +1703,9 @@ void ath9k_release_buffered_frames(struc -+ if (list_empty(&bf_q)) -+ return; -+ -++ if (!more_data) -++ ath9k_set_moredata(sc, bf_tail, false); -++ -+ info = IEEE80211_SKB_CB(bf_tail->bf_mpdu); -+ info->flags |= IEEE80211_TX_STATUS_EOSP; -+ diff --git a/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch b/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch deleted file mode 100644 index 15d6cd0..0000000 @@ -10825,34 +9216,6 @@ index 15d6cd0..0000000 - /* - * add more here as they are defined in radiotap.h - */ -diff --git a/package/kernel/mac80211/patches/340-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch b/package/kernel/mac80211/patches/340-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch -new file mode 100644 -index 0000000..929da25 ---- /dev/null -+++ b/package/kernel/mac80211/patches/340-ath9k-clear-potentially-stale-EOSP-status-bit-in-int.patch -@@ -0,0 +1,22 @@ -+From: Felix Fietkau -+Date: Sun, 28 Aug 2016 13:13:42 +0200 -+Subject: [PATCH] ath9k: clear potentially stale EOSP status bit in -+ intermediate queues -+ -+Prevents spurious ieee80211_sta_eosp calls. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -945,7 +945,8 @@ ath_tx_get_tid_subframe(struct ath_softc -+ bf->bf_lastbf = bf; -+ -+ tx_info = IEEE80211_SKB_CB(skb); -+- tx_info->flags &= ~IEEE80211_TX_CTL_CLEAR_PS_FILT; -++ tx_info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT | -++ IEEE80211_TX_STATUS_EOSP); -+ -+ /* -+ * No aggregation session is running, but there may be frames diff --git a/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch b/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch deleted file mode 100644 index de1b386..0000000 @@ -10895,52 +9258,6 @@ index de1b386..0000000 - rate_flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; - break; - -diff --git a/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch b/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch -new file mode 100644 -index 0000000..1cc1667 ---- /dev/null -+++ b/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch -@@ -0,0 +1,40 @@ -+From: Felix Fietkau -+Date: Sun, 28 Aug 2016 13:15:10 +0200 -+Subject: [PATCH] ath9k: release PS buffered frames as A-MPDU if enabled -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -1660,10 +1660,11 @@ void ath9k_release_buffered_frames(struc -+ struct ath_node *an = (struct ath_node *)sta->drv_priv; -+ struct ath_txq *txq = sc->tx.uapsdq; -+ struct ieee80211_tx_info *info; -++ struct ath_frame_info *fi; -+ struct list_head bf_q; -+ struct ath_buf *bf_tail = NULL, *bf; -+ int sent = 0; -+- int i; -++ int n, i; -+ -+ INIT_LIST_HEAD(&bf_q); -+ for (i = 0; tids && nframes; i++, tids >>= 1) { -+@@ -1683,10 +1684,15 @@ void ath9k_release_buffered_frames(struc -+ ath9k_set_moredata(sc, bf, true); -+ list_add_tail(&bf->list, &bf_q); -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, true); -+- if (bf_isampdu(bf)) { -++ if (bf_isampdu(bf)) -+ ath_tx_addto_baw(sc, tid, bf); -+- bf->bf_state.bf_type &= ~BUF_AGGR; -++ if (bf_isaggr(bf)) { -++ fi = get_frame_info(bf->bf_mpdu); -++ n = ath_compute_num_delims(sc, tid, bf, -++ fi->framelen, true); -++ bf->bf_state.ndelim = n; -+ } -++ -+ if (bf_tail) -+ bf_tail->bf_next = bf; -+ diff --git a/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch b/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch deleted file mode 100644 index ac1f251..0000000 @@ -11012,31 +9329,6 @@ index ac1f251..0000000 - } else { - for (i = 0; i < sband->n_bitrates; i++) { - if (rate * 5 != sband->bitrates[i].bitrate) -diff --git a/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch b/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch -new file mode 100644 -index 0000000..80a3074 ---- /dev/null -+++ b/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch -@@ -0,0 +1,19 @@ -+From: Felix Fietkau -+Date: Sun, 28 Aug 2016 13:23:27 +0200 -+Subject: [PATCH] ath9k: report tx status on EOSP -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -86,7 +86,8 @@ static void ath_tx_status(struct ieee802 -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ struct ieee80211_sta *sta = info->status.status_driver_data[0]; -+ -+- if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { -++ if (info->flags & (IEEE80211_TX_CTL_REQ_TX_STATUS | -++ IEEE80211_TX_STATUS_EOSP)) { -+ ieee80211_tx_status(hw, skb); -+ return; -+ } diff --git a/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch b/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch deleted file mode 100644 index d7452c2..0000000 @@ -11066,123 +9358,6 @@ index d7452c2..0000000 - info->control.rates[0].flags = rate_flags; - info->control.rates[0].count = min_t(u8, rate_retries + 1, - local->hw.max_rate_tries); -diff --git a/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch b/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch -new file mode 100644 -index 0000000..007a8d7d ---- /dev/null -+++ b/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch -@@ -0,0 +1,111 @@ -+From: Felix Fietkau -+Date: Tue, 30 Aug 2016 12:44:08 +0200 -+Subject: [PATCH] ath9k: fix block-ack window tracking issues -+ -+Ensure that a buffer gets tracked as part of the block-ack window as -+soon as it's dequeued from the tid for the first time. Ensure that -+double calls to ath_tx_addto_baw (e.g. on retransmission) don't cause -+any issues. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -62,7 +62,7 @@ static void ath_tx_rc_status(struct ath_ -+ struct ath_tx_status *ts, int nframes, int nbad, -+ int txok); -+ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, -+- int seqno); -++ struct ath_buf *bf); -+ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, -+ struct ath_txq *txq, -+ struct ath_atx_tid *tid, -+@@ -300,7 +300,7 @@ static void ath_tx_flush_tid(struct ath_ -+ } -+ -+ if (fi->baw_tracked) { -+- ath_tx_update_baw(sc, tid, bf->bf_state.seqno); -++ ath_tx_update_baw(sc, tid, bf); -+ sendbar = true; -+ } -+ -+@@ -316,10 +316,15 @@ static void ath_tx_flush_tid(struct ath_ -+ } -+ -+ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, -+- int seqno) -++ struct ath_buf *bf) -+ { -++ struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu); -++ u16 seqno = bf->bf_state.seqno; -+ int index, cindex; -+ -++ if (!fi->baw_tracked) -++ return; -++ -+ index = ATH_BA_INDEX(tid->seq_start, seqno); -+ cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); -+ -+@@ -340,6 +345,9 @@ static void ath_tx_addto_baw(struct ath_ -+ u16 seqno = bf->bf_state.seqno; -+ int index, cindex; -+ -++ if (fi->baw_tracked) -++ return; -++ -+ index = ATH_BA_INDEX(tid->seq_start, seqno); -+ cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); -+ __set_bit(cindex, tid->tx_buf); -+@@ -616,7 +624,7 @@ static void ath_tx_complete_aggr(struct -+ * complete the acked-ones/xretried ones; update -+ * block-ack window -+ */ -+- ath_tx_update_baw(sc, tid, seqno); -++ ath_tx_update_baw(sc, tid, bf); -+ -+ if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) { -+ memcpy(tx_info->control.rates, rates, sizeof(rates)); -+@@ -646,7 +654,7 @@ static void ath_tx_complete_aggr(struct -+ * run out of tx buf. -+ */ -+ if (!tbf) { -+- ath_tx_update_baw(sc, tid, seqno); -++ ath_tx_update_baw(sc, tid, bf); -+ -+ ath_tx_complete_buf(sc, bf, txq, -+ &bf_head, NULL, ts, -+@@ -986,11 +994,14 @@ ath_tx_get_tid_subframe(struct ath_softc -+ -+ INIT_LIST_HEAD(&bf_head); -+ list_add(&bf->list, &bf_head); -+- ath_tx_update_baw(sc, tid, seqno); -++ ath_tx_update_baw(sc, tid, bf); -+ ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); -+ continue; -+ } -+ -++ if (bf_isampdu(bf)) -++ ath_tx_addto_baw(sc, tid, bf); -++ -+ return bf; -+ } -+ -+@@ -1048,8 +1059,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ bf->bf_next = NULL; -+ -+ /* link buffers of this frame to the aggregate */ -+- if (!fi->baw_tracked) -+- ath_tx_addto_baw(sc, tid, bf); -+ bf->bf_state.ndelim = ndelim; -+ -+ list_add_tail(&bf->list, bf_q); -+@@ -1685,8 +1694,6 @@ void ath9k_release_buffered_frames(struc -+ ath9k_set_moredata(sc, bf, true); -+ list_add_tail(&bf->list, &bf_q); -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, true); -+- if (bf_isampdu(bf)) -+- ath_tx_addto_baw(sc, tid, bf); -+ if (bf_isaggr(bf)) { -+ fi = get_frame_info(bf->bf_mpdu); -+ n = ath_compute_num_delims(sc, tid, bf, diff --git a/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch b/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch deleted file mode 100644 index 55ff817..0000000 @@ -15851,76 +14026,6 @@ index c20d40c..0000000 - - #define DOT11_DEFAULT_RTS_LEN 2347 - #define DOT11_DEFAULT_FRAG_LEN 2346 -diff --git a/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch -new file mode 100644 -index 0000000..3bbca22 ---- /dev/null -+++ b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch -@@ -0,0 +1,64 @@ -+From: Johannes Berg -+Date: Mon, 29 Aug 2016 23:25:18 +0300 -+Subject: [PATCH] mac80211: send delBA on unexpected BlockAck data frames -+ -+When we receive data frames with ACK policy BlockAck, send -+delBA as requested by the 802.11 spec. Since this would be -+happening for every frame inside an A-MPDU if it's really -+received outside a session, limit it to a single attempt. -+ -+Signed-off-by: Johannes Berg -+--- -+ -+--- a/net/mac80211/agg-rx.c -++++ b/net/mac80211/agg-rx.c -+@@ -388,8 +388,10 @@ void __ieee80211_start_rx_ba_session(str -+ } -+ -+ end: -+- if (status == WLAN_STATUS_SUCCESS) -++ if (status == WLAN_STATUS_SUCCESS) { -+ __set_bit(tid, sta->ampdu_mlme.agg_session_valid); -++ __clear_bit(tid, sta->ampdu_mlme.unexpected_agg); -++ } -+ mutex_unlock(&sta->ampdu_mlme.mtx); -+ -+ end_no_lock: -+--- a/net/mac80211/rx.c -++++ b/net/mac80211/rx.c -+@@ -1072,8 +1072,15 @@ static void ieee80211_rx_reorder_ampdu(s -+ tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK; -+ -+ tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); -+- if (!tid_agg_rx) -++ if (!tid_agg_rx) { -++ if (ack_policy == IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && -++ !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && -++ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) -++ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, -++ WLAN_BACK_RECIPIENT, -++ WLAN_REASON_QSTA_REQUIRE_SETUP); -+ goto dont_reorder; -++ } -+ -+ /* qos null data frames are excluded */ -+ if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) -+--- a/net/mac80211/sta_info.h -++++ b/net/mac80211/sta_info.h -+@@ -230,6 +230,8 @@ struct tid_ampdu_rx { -+ * @tid_rx_stop_requested: bitmap indicating which BA sessions per TID the -+ * driver requested to close until the work for it runs -+ * @agg_session_valid: bitmap indicating which TID has a rx BA session open on -++ * @unexpected_agg: bitmap indicating which TID already sent a delBA due to -++ * unexpected aggregation related frames outside a session -+ * @work: work struct for starting/stopping aggregation -+ * @tid_tx: aggregation info for Tx per TID -+ * @tid_start_tx: sessions where start was requested -+@@ -244,6 +246,7 @@ struct sta_ampdu_mlme { -+ unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -+ unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -+ unsigned long agg_session_valid[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -++ unsigned long unexpected_agg[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -+ /* tx */ -+ struct work_struct work; -+ struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; diff --git a/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch b/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch deleted file mode 100644 index 39f4383..0000000 @@ -15981,38 +14086,6 @@ index 39f4383..0000000 - } - } - -diff --git a/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch b/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch -new file mode 100644 -index 0000000..c3d3118 ---- /dev/null -+++ b/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch -@@ -0,0 +1,26 @@ -+From: Johannes Berg -+Date: Mon, 29 Aug 2016 23:25:19 +0300 -+Subject: [PATCH] mac80211: send delBA on unexpected BlockAck Request -+ -+If we don't have a BA session, send delBA, as requested by the -+IEEE 802.11 spec. Apply the same limit of sending such a delBA -+only once as in the previous patch. -+ -+Signed-off-by: Johannes Berg -+--- -+ -+--- a/net/mac80211/rx.c -++++ b/net/mac80211/rx.c -+@@ -2537,6 +2537,12 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_ -+ -+ tid = le16_to_cpu(bar_data.control) >> 12; -+ -++ if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && -++ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) -++ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, -++ WLAN_BACK_RECIPIENT, -++ WLAN_REASON_QSTA_REQUIRE_SETUP); -++ -+ tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); -+ if (!tid_agg_rx) -+ return RX_DROP_MONITOR; diff --git a/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch b/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch deleted file mode 100644 index 3c9ed42..0000000 @@ -16040,119 +14113,6 @@ index 3c9ed42..0000000 - - brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n", - write, fn, addr, regsz); -diff --git a/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch b/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch -new file mode 100644 -index 0000000..a82d12f ---- /dev/null -+++ b/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch -@@ -0,0 +1,107 @@ -+From: Felix Fietkau -+Date: Sun, 4 Sep 2016 17:46:24 +0200 -+Subject: [PATCH] mac80211: fix sequence number assignment for PS response -+ frames -+ -+When using intermediate queues, sequence number allocation is deferred -+until dequeue. This doesn't work for PS response frames, which bypass -+those queues. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/net/mac80211/tx.c -++++ b/net/mac80211/tx.c -+@@ -792,6 +792,36 @@ static __le16 ieee80211_tx_next_seq(stru -+ return ret; -+ } -+ -++static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, -++ struct ieee80211_vif *vif, -++ struct ieee80211_sta *pubsta, -++ struct sk_buff *skb) -++{ -++ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ struct ieee80211_txq *txq = NULL; -++ -++ if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || -++ (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) -++ return NULL; -++ -++ if (!ieee80211_is_data(hdr->frame_control)) -++ return NULL; -++ -++ if (pubsta) { -++ u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; -++ -++ txq = pubsta->txq[tid]; -++ } else if (vif) { -++ txq = vif->txq; -++ } -++ -++ if (!txq) -++ return NULL; -++ -++ return to_txq_info(txq); -++} -++ -+ static ieee80211_tx_result debug_noinline -+ ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) -+ { -+@@ -849,7 +879,8 @@ ieee80211_tx_h_sequence(struct ieee80211 -+ tid = *qc & IEEE80211_QOS_CTL_TID_MASK; -+ tx->sta->tx_stats.msdu[tid]++; -+ -+- if (!tx->sta->sta.txq[0]) -++ if (!ieee80211_get_txq(tx->local, info->control.vif, &tx->sta->sta, -++ tx->skb)) -+ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); -+ -+ return TX_CONTINUE; -+@@ -1238,36 +1269,6 @@ ieee80211_tx_prepare(struct ieee80211_su -+ return TX_CONTINUE; -+ } -+ -+-static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, -+- struct ieee80211_vif *vif, -+- struct ieee80211_sta *pubsta, -+- struct sk_buff *skb) -+-{ -+- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; -+- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+- struct ieee80211_txq *txq = NULL; -+- -+- if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || -+- (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) -+- return NULL; -+- -+- if (!ieee80211_is_data(hdr->frame_control)) -+- return NULL; -+- -+- if (pubsta) { -+- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; -+- -+- txq = pubsta->txq[tid]; -+- } else if (vif) { -+- txq = vif->txq; -+- } -+- -+- if (!txq) -+- return NULL; -+- -+- return to_txq_info(txq); -+-} -+- -+ static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb) -+ { -+ IEEE80211_SKB_CB(skb)->control.enqueue_time = codel_get_time(); -+@@ -3265,7 +3266,7 @@ static bool ieee80211_xmit_fast(struct i -+ -+ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { -+ *ieee80211_get_qos_ctl(hdr) = tid; -+- if (!sta->sta.txq[0]) -++ if (!ieee80211_get_txq(local, &sdata->vif, &sta->sta, skb)) -+ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); -+ } else { -+ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; diff --git a/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch b/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch deleted file mode 100644 index d1deb6e..0000000 @@ -20836,14 +18796,13 @@ index e151a12..c40598d 100644 return result; } diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch -index 5a5e464..69147f6 100644 +index 5a5e464..0b25749 100644 --- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch +++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch @@ -1,16 +1,16 @@ --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h --@@ -814,6 +814,9 @@ static inline int ath9k_dump_btcoex(stru -+@@ -827,6 +827,9 @@ static inline int ath9k_dump_btcoex(stru + @@ -814,6 +814,9 @@ static inline int ath9k_dump_btcoex(stru + #ifdef CPTCFG_MAC80211_LEDS void ath_init_leds(struct ath_softc *sc); void ath_deinit_leds(struct ath_softc *sc); @@ -20856,7 +18815,7 @@ index 5a5e464..69147f6 100644 static inline void ath_init_leds(struct ath_softc *sc) { -@@ -953,6 +956,13 @@ void ath_ant_comb_scan(struct ath_softc -+@@ -963,6 +966,13 @@ void ath_ant_comb_scan(struct ath_softc ++@@ -950,6 +953,13 @@ void ath_ant_comb_scan(struct ath_softc #define ATH9K_NUM_CHANCTX 2 /* supports 2 operating channels */ @@ -20865,7 +18824,7 @@ index 5a5e464..69147f6 100644 struct ieee80211_hw *hw; struct device *dev; -@@ -1005,9 +1015,8 @@ struct ath_softc { -+@@ -1015,9 +1025,8 @@ struct ath_softc { ++@@ -1002,9 +1012,8 @@ struct ath_softc { spinlock_t chan_lock; #ifdef CPTCFG_MAC80211_LEDS @@ -21124,7 +19083,7 @@ index 3c5e9f5..c2d2781 100644 if (i == 0) { diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch -index e83c6bf..6edef09 100644 +index e83c6bf..4615643 100644 --- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch @@ -1,6 +1,6 @@ @@ -21167,7 +19126,7 @@ index e83c6bf..6edef09 100644 bool htc_reset_init; -@@ -1066,6 +1074,7 @@ void ath9k_hw_check_nav(struct ath_hw *a -+@@ -1067,6 +1075,7 @@ void ath9k_hw_check_nav(struct ath_hw *a ++@@ -1068,6 +1076,7 @@ void ath9k_hw_check_nav(struct ath_hw *a bool ath9k_hw_check_alive(struct ath_hw *ah); bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); @@ -21449,7 +19408,7 @@ index 0000000..5d84cf0 + } diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch new file mode 100644 -index 0000000..1330dfe +index 0000000..de7c0ac --- /dev/null +++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch @@ -0,0 +1,234 @@ @@ -21473,7 +19432,7 @@ index 0000000..1330dfe + + #include "common.h" + #include "debug.h" -+@@ -973,6 +974,14 @@ struct ath_led { ++@@ -960,6 +961,14 @@ struct ath_led { + struct led_classdev cdev; + }; + @@ -21488,7 +19447,7 @@ index 0000000..1330dfe + struct ath_softc { + struct ieee80211_hw *hw; + struct device *dev; -+@@ -1027,6 +1036,9 @@ struct ath_softc { ++@@ -1014,6 +1023,9 @@ struct ath_softc { + #ifdef CPTCFG_MAC80211_LEDS + const char *led_default_trigger; + struct list_head leds; @@ -21689,7 +19648,7 @@ index 0000000..1330dfe + /*******************/ diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch new file mode 100644 -index 0000000..f86b015 +index 0000000..b9d1883 --- /dev/null +++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch @@ -0,0 +1,149 @@ @@ -21705,7 +19664,7 @@ index 0000000..f86b015 +--- +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h -+@@ -1038,6 +1038,7 @@ struct ath_softc { ++@@ -1025,6 +1025,7 @@ struct ath_softc { + struct list_head leds; + #ifdef CONFIG_GPIOLIB + struct ath9k_gpio_chip *gpiochip; diff --git a/patches/openwrt/0076-kernel-add-fix-for-CVE-2016-7117.patch b/patches/openwrt/0073-kernel-add-fix-for-CVE-2016-7117.patch similarity index 100% rename from patches/openwrt/0076-kernel-add-fix-for-CVE-2016-7117.patch rename to patches/openwrt/0073-kernel-add-fix-for-CVE-2016-7117.patch diff --git a/patches/openwrt/0073-mac80211-fix-packet-loss-on-fq-reordering.patch b/patches/openwrt/0073-mac80211-fix-packet-loss-on-fq-reordering.patch deleted file mode 100644 index 6328ba4c..00000000 --- a/patches/openwrt/0073-mac80211-fix-packet-loss-on-fq-reordering.patch +++ /dev/null @@ -1,636 +0,0 @@ -From: Matthias Schiffer -Date: Fri, 30 Sep 2016 16:57:44 +0200 -Subject: mac80211: fix packet loss on fq reordering - -Signed-off-by: Felix Fietkau - -Backport of LEDE a194ffd4a89588bc75aeb9a27f59c36afd3d24bd - -diff --git a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -new file mode 100644 -index 0000000..8ceed51 ---- /dev/null -+++ b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -@@ -0,0 +1,478 @@ -+From: Felix Fietkau -+Date: Sun, 4 Sep 2016 17:46:24 +0200 -+Subject: [PATCH] mac80211: fix sequence number assignment for PS response -+ frames -+ -+When using intermediate queues, sequence number allocation is deferred -+until dequeue. This doesn't work for PS response frames, which bypass -+those queues. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/net/mac80211/tx.c -++++ b/net/mac80211/tx.c -+@@ -38,6 +38,12 @@ -+ #include "wme.h" -+ #include "rate.h" -+ -++static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx); -++static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, -++ struct sta_info *sta, u8 pn_offs, -++ struct ieee80211_key_conf *key_conf, -++ struct sk_buff *skb); -++ -+ /* misc utils */ -+ -+ static inline void ieee80211_tx_stats(struct net_device *dev, u32 len) -+@@ -849,8 +855,7 @@ ieee80211_tx_h_sequence(struct ieee80211 -+ tid = *qc & IEEE80211_QOS_CTL_TID_MASK; -+ tx->sta->tx_stats.msdu[tid]++; -+ -+- if (!tx->sta->sta.txq[0]) -+- hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); -++ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); -+ -+ return TX_CONTINUE; -+ } -+@@ -1398,6 +1403,7 @@ void ieee80211_txq_init(struct ieee80211 -+ fq_tin_init(&txqi->tin); -+ fq_flow_init(&txqi->def_flow); -+ codel_vars_init(&txqi->def_cvars); -++ __skb_queue_head_init(&txqi->frags); -+ -+ txqi->txq.vif = &sdata->vif; -+ -+@@ -1420,6 +1426,7 @@ void ieee80211_txq_purge(struct ieee8021 -+ struct fq_tin *tin = &txqi->tin; -+ -+ fq_tin_reset(fq, tin, fq_skb_free_func); -++ ieee80211_purge_tx_queue(&local->hw, &txqi->frags); -+ } -+ -+ int ieee80211_txq_setup_flows(struct ieee80211_local *local) -+@@ -1476,12 +1483,19 @@ struct sk_buff *ieee80211_tx_dequeue(str -+ struct sk_buff *skb = NULL; -+ struct fq *fq = &local->fq; -+ struct fq_tin *tin = &txqi->tin; -++ struct ieee80211_tx_info *info; -+ -+ spin_lock_bh(&fq->lock); -+ -+ if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags)) -+ goto out; -+ -++ /* Make sure fragments stay together. */ -++ skb = __skb_dequeue(&txqi->frags); -++ if (skb) -++ goto out; -++ -++begin: -+ skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func); -+ if (!skb) -+ goto out; -+@@ -1489,16 +1503,38 @@ struct sk_buff *ieee80211_tx_dequeue(str -+ ieee80211_set_skb_vif(skb, txqi); -+ -+ hdr = (struct ieee80211_hdr *)skb->data; -+- if (txq->sta && ieee80211_is_data_qos(hdr->frame_control)) { -++ info = IEEE80211_SKB_CB(skb); -++ if (txq->sta && info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { -+ struct sta_info *sta = container_of(txq->sta, struct sta_info, -+ sta); -+- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ u8 pn_offs = 0; -+ -+- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, txq->tid); -+- if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags)) -+- info->flags |= IEEE80211_TX_CTL_AMPDU; -+- else -+- info->flags &= ~IEEE80211_TX_CTL_AMPDU; -++ if (info->control.hw_key) -++ pn_offs = ieee80211_padded_hdrlen(hw, hdr->frame_control); -++ -++ ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, -++ info->control.hw_key, skb); -++ } else { -++ struct ieee80211_tx_data tx = { }; -++ -++ __skb_queue_head_init(&tx.skbs); -++ tx.local = local; -++ tx.skb = skb; -++ tx.hdrlen = ieee80211_padded_hdrlen(hw, hdr->frame_control); -++ if (txq->sta) { -++ tx.sta = container_of(txq->sta, struct sta_info, sta); -++ tx.sdata = tx.sta->sdata; -++ } else { -++ tx.sdata = vif_to_sdata(info->control.vif); -++ } -++ -++ if (invoke_tx_handlers_late(&tx)) -++ goto begin; -++ -++ skb = __skb_dequeue(&tx.skbs); -++ -++ if (!skb_queue_empty(&tx.skbs)) -++ skb_queue_splice_tail(&tx.skbs, &txqi->frags); -+ } -+ -+ out: -+@@ -1512,6 +1548,47 @@ out: -+ } -+ EXPORT_SYMBOL(ieee80211_tx_dequeue); -+ -++static bool ieee80211_queue_skb(struct ieee80211_local *local, -++ struct ieee80211_sub_if_data *sdata, -++ struct sta_info *sta, -++ struct sk_buff *skb) -++{ -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ struct fq *fq = &local->fq; -++ struct ieee80211_vif *vif; -++ struct txq_info *txqi; -++ struct ieee80211_sta *pubsta; -++ -++ if (!local->ops->wake_tx_queue || -++ sdata->vif.type == NL80211_IFTYPE_MONITOR) -++ return false; -++ -++ if (sta && sta->uploaded) -++ pubsta = &sta->sta; -++ else -++ pubsta = NULL; -++ -++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) -++ sdata = container_of(sdata->bss, -++ struct ieee80211_sub_if_data, u.ap); -++ -++ vif = &sdata->vif; -++ txqi = ieee80211_get_txq(local, vif, pubsta, skb); -++ -++ if (!txqi) -++ return false; -++ -++ info->control.vif = vif; -++ -++ spin_lock_bh(&fq->lock); -++ ieee80211_txq_enqueue(local, txqi, skb); -++ spin_unlock_bh(&fq->lock); -++ -++ drv_wake_tx_queue(local, txqi); -++ -++ return true; -++} -++ -+ static bool ieee80211_tx_frags(struct ieee80211_local *local, -+ struct ieee80211_vif *vif, -+ struct ieee80211_sta *sta, -+@@ -1519,9 +1596,7 @@ static bool ieee80211_tx_frags(struct ie -+ bool txpending) -+ { -+ struct ieee80211_tx_control control = {}; -+- struct fq *fq = &local->fq; -+ struct sk_buff *skb, *tmp; -+- struct txq_info *txqi; -+ unsigned long flags; -+ -+ skb_queue_walk_safe(skbs, skb, tmp) { -+@@ -1536,21 +1611,6 @@ static bool ieee80211_tx_frags(struct ie -+ } -+ #endif -+ -+- txqi = ieee80211_get_txq(local, vif, sta, skb); -+- if (txqi) { -+- info->control.vif = vif; -+- -+- __skb_unlink(skb, skbs); -+- -+- spin_lock_bh(&fq->lock); -+- ieee80211_txq_enqueue(local, txqi, skb); -+- spin_unlock_bh(&fq->lock); -+- -+- drv_wake_tx_queue(local, txqi); -+- -+- continue; -+- } -+- -+ spin_lock_irqsave(&local->queue_stop_reason_lock, flags); -+ if (local->queue_stop_reasons[q] || -+ (!txpending && !skb_queue_empty(&local->pending[q]))) { -+@@ -1671,10 +1731,13 @@ static bool __ieee80211_tx(struct ieee80 -+ /* -+ * Invoke TX handlers, return 0 on success and non-zero if the -+ * frame was dropped or queued. -++ * -++ * The handlers are split into an early and late part. The latter is everything -++ * that can be sensitive to reordering, and will be deferred to after packets -++ * are dequeued from the intermediate queues (when they are enabled). -+ */ -+-static int invoke_tx_handlers(struct ieee80211_tx_data *tx) -++static int invoke_tx_handlers_early(struct ieee80211_tx_data *tx) -+ { -+- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); -+ ieee80211_tx_result res = TX_DROP; -+ -+ #define CALL_TXH(txh) \ -+@@ -1688,16 +1751,42 @@ static int invoke_tx_handlers(struct iee -+ CALL_TXH(ieee80211_tx_h_check_assoc); -+ CALL_TXH(ieee80211_tx_h_ps_buf); -+ CALL_TXH(ieee80211_tx_h_check_control_port_protocol); -+- CALL_TXH(ieee80211_tx_h_select_key); -++ -+ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) -+ CALL_TXH(ieee80211_tx_h_rate_ctrl); -+ -++ txh_done: -++ if (unlikely(res == TX_DROP)) { -++ I802_DEBUG_INC(tx->local->tx_handlers_drop); -++ if (tx->skb) -++ ieee80211_free_txskb(&tx->local->hw, tx->skb); -++ else -++ ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); -++ return -1; -++ } else if (unlikely(res == TX_QUEUED)) { -++ I802_DEBUG_INC(tx->local->tx_handlers_queued); -++ return -1; -++ } -++ -++ return 0; -++} -++ -++/* -++ * Late handlers can be called while the sta lock is held. Handlers that can -++ * cause packets to be generated will cause deadlock! -++ */ -++static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx) -++{ -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); -++ ieee80211_tx_result res = TX_CONTINUE; -++ -+ if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { -+ __skb_queue_tail(&tx->skbs, tx->skb); -+ tx->skb = NULL; -+ goto txh_done; -+ } -+ -++ CALL_TXH(ieee80211_tx_h_select_key); -+ CALL_TXH(ieee80211_tx_h_michael_mic_add); -+ CALL_TXH(ieee80211_tx_h_sequence); -+ CALL_TXH(ieee80211_tx_h_fragment); -+@@ -1724,6 +1813,15 @@ static int invoke_tx_handlers(struct iee -+ return 0; -+ } -+ -++static int invoke_tx_handlers(struct ieee80211_tx_data *tx) -++{ -++ int r = invoke_tx_handlers_early(tx); -++ if (r) -++ return r; -++ -++ return invoke_tx_handlers_late(tx); -++} -++ -+ bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, -+ struct ieee80211_vif *vif, struct sk_buff *skb, -+ int band, struct ieee80211_sta **sta) -+@@ -1798,7 +1896,13 @@ static bool ieee80211_tx(struct ieee8021 -+ info->hw_queue = -+ sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; -+ -+- if (!invoke_tx_handlers(&tx)) -++ if (invoke_tx_handlers_early(&tx)) -++ return false; -++ -++ if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb)) -++ return true; -++ -++ if (!invoke_tx_handlers_late(&tx)) -+ result = __ieee80211_tx(local, &tx.skbs, led_len, -+ tx.sta, txpending); -+ -+@@ -3181,7 +3285,7 @@ out: -+ } -+ -+ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, -+- struct net_device *dev, struct sta_info *sta, -++ struct sta_info *sta, -+ struct ieee80211_fast_tx *fast_tx, -+ struct sk_buff *skb) -+ { -+@@ -3192,9 +3296,9 @@ static bool ieee80211_xmit_fast(struct i -+ struct ethhdr eth; -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; -+- struct ieee80211_tx_data tx; -+- ieee80211_tx_result r; -+ struct tid_ampdu_tx *tid_tx = NULL; -++ ieee80211_tx_result r; -++ struct ieee80211_tx_data tx; -+ u8 tid = IEEE80211_NUM_TIDS; -+ -+ /* control port protocol needs a lot of special handling */ -+@@ -3232,8 +3336,6 @@ static bool ieee80211_xmit_fast(struct i -+ return true; -+ } -+ -+- ieee80211_tx_stats(dev, skb->len + extra_head); -+- -+ if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) && -+ ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb)) -+ return true; -+@@ -3262,24 +3364,7 @@ static bool ieee80211_xmit_fast(struct i -+ info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | -+ IEEE80211_TX_CTL_DONTFRAG | -+ (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0); -+- -+- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { -+- *ieee80211_get_qos_ctl(hdr) = tid; -+- if (!sta->sta.txq[0]) -+- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); -+- } else { -+- info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; -+- hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); -+- sdata->sequence_number += 0x10; -+- } -+- -+- if (skb_shinfo(skb)->gso_size) -+- sta->tx_stats.msdu[tid] += -+- DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); -+- else -+- sta->tx_stats.msdu[tid]++; -+- -+- info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; -++ info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT; -+ -+ __skb_queue_head_init(&tx.skbs); -+ -+@@ -3305,22 +3390,71 @@ static bool ieee80211_xmit_fast(struct i -+ } -+ } -+ -++ if (ieee80211_queue_skb(local, sdata, sta, skb)) -++ return true; -++ -++ ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, -++ &fast_tx->key->conf, skb); -++ -++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) -++ sdata = container_of(sdata->bss, -++ struct ieee80211_sub_if_data, u.ap); -++ -++ __skb_queue_tail(&tx.skbs, skb); -++ ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); -++ -++ return true; -++} -++ -++/* -++ * Can be called while the sta lock is held. Anything that can cause packets to -++ * be generated will cause deadlock! -++ */ -++static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, -++ struct sta_info *sta, u8 pn_offs, -++ struct ieee80211_key_conf *key_conf, -++ struct sk_buff *skb) -++{ -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ struct ieee80211_hdr *hdr = (void *)skb->data; -++ u8 tid = IEEE80211_NUM_TIDS; -++ -++ ieee80211_tx_stats(skb->dev, skb->len); -++ -++ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { -++ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; -++ *ieee80211_get_qos_ctl(hdr) = tid; -++ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); -++ } else { -++ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; -++ hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); -++ sdata->sequence_number += 0x10; -++ } -++ -++ if (skb_shinfo(skb)->gso_size) -++ sta->tx_stats.msdu[tid] += -++ DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); -++ else -++ sta->tx_stats.msdu[tid]++; -++ -++ info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; -++ -+ /* statistics normally done by ieee80211_tx_h_stats (but that -+ * has to consider fragmentation, so is more complex) -+ */ -+ sta->tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len; -+ sta->tx_stats.packets[skb_get_queue_mapping(skb)]++; -+ -+- if (fast_tx->pn_offs) { -++ if (pn_offs) { -+ u64 pn; -+- u8 *crypto_hdr = skb->data + fast_tx->pn_offs; -++ u8 *crypto_hdr = skb->data + pn_offs; -+ -+- switch (fast_tx->key->conf.cipher) { -++ switch (key_conf->cipher) { -+ case WLAN_CIPHER_SUITE_CCMP: -+ case WLAN_CIPHER_SUITE_CCMP_256: -+ case WLAN_CIPHER_SUITE_GCMP: -+ case WLAN_CIPHER_SUITE_GCMP_256: -+- pn = atomic64_inc_return(&fast_tx->key->conf.tx_pn); -++ pn = atomic64_inc_return(&key_conf->tx_pn); -+ crypto_hdr[0] = pn; -+ crypto_hdr[1] = pn >> 8; -+ crypto_hdr[4] = pn >> 16; -+@@ -3331,12 +3465,6 @@ static bool ieee80211_xmit_fast(struct i -+ } -+ } -+ -+- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) -+- sdata = container_of(sdata->bss, -+- struct ieee80211_sub_if_data, u.ap); -+- -+- __skb_queue_tail(&tx.skbs, skb); -+- ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); -+ return true; -+ } -+ -+@@ -3364,7 +3492,7 @@ void __ieee80211_subif_start_xmit(struct -+ fast_tx = rcu_dereference(sta->fast_tx); -+ -+ if (fast_tx && -+- ieee80211_xmit_fast(sdata, dev, sta, fast_tx, skb)) -++ ieee80211_xmit_fast(sdata, sta, fast_tx, skb)) -+ goto out; -+ } -+ -+--- a/include/net/mac80211.h -++++ b/include/net/mac80211.h -+@@ -715,6 +715,7 @@ enum mac80211_tx_info_flags { -+ * frame (PS-Poll or uAPSD). -+ * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information -+ * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame -++ * @IEEE80211_TX_CTRL_FAST_XMIT: This frame is going through the fast_xmit path -+ * -+ * These flags are used in tx_info->control.flags. -+ */ -+@@ -723,6 +724,7 @@ enum mac80211_tx_control_flags { -+ IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), -+ IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), -+ IEEE80211_TX_CTRL_AMSDU = BIT(3), -++ IEEE80211_TX_CTRL_FAST_XMIT = BIT(4), -+ }; -+ -+ /* -+--- a/net/mac80211/ieee80211_i.h -++++ b/net/mac80211/ieee80211_i.h -+@@ -814,11 +814,13 @@ enum txq_info_flags { -+ * @def_flow: used as a fallback flow when a packet destined to @tin hashes to -+ * a fq_flow which is already owned by a different tin -+ * @def_cvars: codel vars for @def_flow -++ * @frags: used to keep fragments created after dequeue -+ */ -+ struct txq_info { -+ struct fq_tin tin; -+ struct fq_flow def_flow; -+ struct codel_vars def_cvars; -++ struct sk_buff_head frags; -+ unsigned long flags; -+ -+ /* keep last! */ -diff --git a/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch b/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch -deleted file mode 100644 -index a82d12f..0000000 ---- a/package/kernel/mac80211/patches/346-mac80211-fix-sequence-number-assignment-for-PS-respo.patch -+++ /dev/null -@@ -1,107 +0,0 @@ --From: Felix Fietkau --Date: Sun, 4 Sep 2016 17:46:24 +0200 --Subject: [PATCH] mac80211: fix sequence number assignment for PS response -- frames -- --When using intermediate queues, sequence number allocation is deferred --until dequeue. This doesn't work for PS response frames, which bypass --those queues. -- --Signed-off-by: Felix Fietkau ----- -- ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -792,6 +792,36 @@ static __le16 ieee80211_tx_next_seq(stru -- return ret; -- } -- --+static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, --+ struct ieee80211_vif *vif, --+ struct ieee80211_sta *pubsta, --+ struct sk_buff *skb) --+{ --+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; --+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); --+ struct ieee80211_txq *txq = NULL; --+ --+ if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || --+ (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) --+ return NULL; --+ --+ if (!ieee80211_is_data(hdr->frame_control)) --+ return NULL; --+ --+ if (pubsta) { --+ u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; --+ --+ txq = pubsta->txq[tid]; --+ } else if (vif) { --+ txq = vif->txq; --+ } --+ --+ if (!txq) --+ return NULL; --+ --+ return to_txq_info(txq); --+} --+ -- static ieee80211_tx_result debug_noinline -- ieee80211_tx_h_sequence(struct ieee80211_tx_data *tx) -- { --@@ -849,7 +879,8 @@ ieee80211_tx_h_sequence(struct ieee80211 -- tid = *qc & IEEE80211_QOS_CTL_TID_MASK; -- tx->sta->tx_stats.msdu[tid]++; -- --- if (!tx->sta->sta.txq[0]) --+ if (!ieee80211_get_txq(tx->local, info->control.vif, &tx->sta->sta, --+ tx->skb)) -- hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); -- -- return TX_CONTINUE; --@@ -1238,36 +1269,6 @@ ieee80211_tx_prepare(struct ieee80211_su -- return TX_CONTINUE; -- } -- ---static struct txq_info *ieee80211_get_txq(struct ieee80211_local *local, --- struct ieee80211_vif *vif, --- struct ieee80211_sta *pubsta, --- struct sk_buff *skb) ---{ --- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; --- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); --- struct ieee80211_txq *txq = NULL; --- --- if ((info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) || --- (info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE)) --- return NULL; --- --- if (!ieee80211_is_data(hdr->frame_control)) --- return NULL; --- --- if (pubsta) { --- u8 tid = skb->priority & IEEE80211_QOS_CTL_TID_MASK; --- --- txq = pubsta->txq[tid]; --- } else if (vif) { --- txq = vif->txq; --- } --- --- if (!txq) --- return NULL; --- --- return to_txq_info(txq); ---} --- -- static void ieee80211_set_skb_enqueue_time(struct sk_buff *skb) -- { -- IEEE80211_SKB_CB(skb)->control.enqueue_time = codel_get_time(); --@@ -3265,7 +3266,7 @@ static bool ieee80211_xmit_fast(struct i -- -- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { -- *ieee80211_get_qos_ctl(hdr) = tid; --- if (!sta->sta.txq[0]) --+ if (!ieee80211_get_txq(local, &sdata->vif, &sta->sta, skb)) -- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); -- } else { -- info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; -diff --git a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch -index c40598d..aba065e 100644 ---- a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch -+++ b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch -@@ -18,7 +18,7 @@ - const u8 *addr); - --- a/include/net/mac80211.h - +++ b/include/net/mac80211.h --@@ -1317,6 +1317,7 @@ enum ieee80211_smps_mode { -+@@ -1319,6 +1319,7 @@ enum ieee80211_smps_mode { - * - * @power_level: requested transmit power (in dBm), backward compatibility - * value only that is set to the minimum of all interfaces -@@ -26,7 +26,7 @@ - * - * @chandef: the channel definition to tune to - * @radar_enabled: whether radar detection is enabled --@@ -1337,6 +1338,7 @@ enum ieee80211_smps_mode { -+@@ -1339,6 +1340,7 @@ enum ieee80211_smps_mode { - struct ieee80211_conf { - u32 flags; - int power_level, dynamic_ps_timeout; -@@ -87,7 +87,7 @@ - CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) - --- a/net/mac80211/ieee80211_i.h - +++ b/net/mac80211/ieee80211_i.h --@@ -1338,6 +1338,7 @@ struct ieee80211_local { -+@@ -1340,6 +1340,7 @@ struct ieee80211_local { - int dynamic_ps_forced_timeout; - - int user_power_level; /* in dBm, for all interfaces */ diff --git a/patches/openwrt/0074-ath9k-revert-temperature-compensation-support-patch-FS-111.patch b/patches/openwrt/0074-ath9k-revert-temperature-compensation-support-patch-FS-111.patch new file mode 100644 index 00000000..803db695 --- /dev/null +++ b/patches/openwrt/0074-ath9k-revert-temperature-compensation-support-patch-FS-111.patch @@ -0,0 +1,124 @@ +From: Matthias Schiffer +Date: Tue, 11 Oct 2016 02:54:27 +0200 +Subject: ath9k: revert temperature compensation support patch (FS#111) + +Signed-off-by: Felix Fietkau + +Backport of LEDE 3e4d0e3e77dcf9b2116e5ed53f30e2bf53b1c6b7 + +diff --git a/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch +deleted file mode 100644 +index cff32ad..0000000 +--- a/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch ++++ /dev/null +@@ -1,97 +0,0 @@ +-From: Felix Fietkau +-Date: Mon, 11 Jul 2016 11:35:55 +0200 +-Subject: [PATCH] ath9k_hw: implement temperature compensation support for +- AR9003+ +- +-Signed-off-by: Felix Fietkau +---- +- +---- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c +-+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c +-@@ -33,6 +33,7 @@ struct coeff { +- +- enum ar9003_cal_types { +- IQ_MISMATCH_CAL = BIT(0), +-+ TEMP_COMP_CAL = BIT(1), +- }; +- +- static void ar9003_hw_setup_calibration(struct ath_hw *ah, +-@@ -58,6 +59,12 @@ static void ar9003_hw_setup_calibration( +- /* Kick-off cal */ +- REG_SET_BIT(ah, AR_PHY_TIMING4, AR_PHY_TIMING4_DO_CAL); +- break; +-+ case TEMP_COMP_CAL: +-+ ath_dbg(common, CALIBRATE, +-+ "starting Temperature Compensation Calibration\n"); +-+ REG_SET_BIT(ah, AR_CH0_THERM, AR_CH0_THERM_LOCAL); +-+ REG_SET_BIT(ah, AR_CH0_THERM, AR_CH0_THERM_START); +-+ break; +- default: +- ath_err(common, "Invalid calibration type\n"); +- break; +-@@ -86,7 +93,8 @@ static bool ar9003_hw_per_calibration(st +- /* +- * Accumulate cal measures for active chains +- */ +-- cur_caldata->calCollect(ah); +-+ if (cur_caldata->calCollect) +-+ cur_caldata->calCollect(ah); +- ah->cal_samples++; +- +- if (ah->cal_samples >= cur_caldata->calNumSamples) { +-@@ -99,7 +107,8 @@ static bool ar9003_hw_per_calibration(st +- /* +- * Process accumulated data +- */ +-- cur_caldata->calPostProc(ah, numChains); +-+ if (cur_caldata->calPostProc) +-+ cur_caldata->calPostProc(ah, numChains); +- +- /* Calibration has finished. */ +- caldata->CalValid |= cur_caldata->calType; +-@@ -314,9 +323,16 @@ static const struct ath9k_percal_data iq +- ar9003_hw_iqcalibrate +- }; +- +-+static const struct ath9k_percal_data temp_cal_single_sample = { +-+ TEMP_COMP_CAL, +-+ MIN_CAL_SAMPLES, +-+ PER_MAX_LOG_COUNT, +-+}; +-+ +- static void ar9003_hw_init_cal_settings(struct ath_hw *ah) +- { +- ah->iq_caldata.calData = &iq_cal_single_sample; +-+ ah->temp_caldata.calData = &temp_cal_single_sample; +- +- if (AR_SREV_9300_20_OR_LATER(ah)) { +- ah->enabled_cals |= TX_IQ_CAL; +-@@ -324,7 +340,7 @@ static void ar9003_hw_init_cal_settings( +- ah->enabled_cals |= TX_IQ_ON_AGC_CAL; +- } +- +-- ah->supp_cals = IQ_MISMATCH_CAL; +-+ ah->supp_cals = IQ_MISMATCH_CAL | TEMP_COMP_CAL; +- } +- +- #define OFF_UPPER_LT 24 +-@@ -1383,6 +1399,9 @@ static void ar9003_hw_init_cal_common(st +- INIT_CAL(&ah->iq_caldata); +- INSERT_CAL(ah, &ah->iq_caldata); +- +-+ INIT_CAL(&ah->temp_caldata); +-+ INSERT_CAL(ah, &ah->temp_caldata); +-+ +- /* Initialize current pointer to first element in list */ +- ah->cal_list_curr = ah->cal_list; +- +---- a/drivers/net/wireless/ath/ath9k/hw.h +-+++ b/drivers/net/wireless/ath/ath9k/hw.h +-@@ -830,6 +830,7 @@ struct ath_hw { +- /* Calibration */ +- u32 supp_cals; +- struct ath9k_cal_list iq_caldata; +-+ struct ath9k_cal_list temp_caldata; +- struct ath9k_cal_list adcgain_caldata; +- struct ath9k_cal_list adcdc_caldata; +- struct ath9k_cal_list *cal_list; +diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +index 4615643..6edef09 100644 +--- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch ++++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +@@ -84,7 +84,7 @@ + bool reset_power_on; + bool htc_reset_init; + +-@@ -1068,6 +1076,7 @@ void ath9k_hw_check_nav(struct ath_hw *a ++@@ -1067,6 +1075,7 @@ void ath9k_hw_check_nav(struct ath_hw *a + bool ath9k_hw_check_alive(struct ath_hw *ah); + + bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); diff --git a/patches/openwrt/0074-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch b/patches/openwrt/0074-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch deleted file mode 100644 index f464421c..00000000 --- a/patches/openwrt/0074-mac80211-fix-tx-issue-with-CCMP-PN-generated-in-hardware.patch +++ /dev/null @@ -1,21 +0,0 @@ -From: Matthias Schiffer -Date: Fri, 30 Sep 2016 16:57:57 +0200 -Subject: mac80211: fix tx issue with CCMP PN generated in hardware - -Signed-off-by: Felix Fietkau - -Backport of LEDE f3747020e202883a43729fc245986f9e36289d6c - -diff --git a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -index 8ceed51..aba1ff4 100644 ---- a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -+++ b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -@@ -404,7 +404,7 @@ Signed-off-by: Felix Fietkau - sta->tx_stats.packets[skb_get_queue_mapping(skb)]++; - - - if (fast_tx->pn_offs) { --+ if (pn_offs) { -++ if (pn_offs && (key_conf->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { - u64 pn; - - u8 *crypto_hdr = skb->data + fast_tx->pn_offs; - + u8 *crypto_hdr = skb->data + pn_offs; diff --git a/patches/openwrt/0075-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch b/patches/openwrt/0075-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch deleted file mode 100644 index ddfb6445..00000000 --- a/patches/openwrt/0075-ath9k-remove-patch-causing-stability-issues-with-powersave-devices-FS-176.patch +++ /dev/null @@ -1,1513 +0,0 @@ -From: Matthias Schiffer -Date: Fri, 30 Sep 2016 16:58:01 +0200 -Subject: ath9k: remove patch causing stability issues with powersave devices (FS#176) - -Signed-off-by: Felix Fietkau - -Backport of LEDE fc88eb3fdfce6d39b4c62158cf6f42605a360a1e - -diff --git a/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch b/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch -deleted file mode 100644 -index 1cc1667..0000000 ---- a/package/kernel/mac80211/patches/341-ath9k-release-PS-buffered-frames-as-A-MPDU-if-enable.patch -+++ /dev/null -@@ -1,40 +0,0 @@ --From: Felix Fietkau --Date: Sun, 28 Aug 2016 13:15:10 +0200 --Subject: [PATCH] ath9k: release PS buffered frames as A-MPDU if enabled -- --Signed-off-by: Felix Fietkau ----- -- ----- a/drivers/net/wireless/ath/ath9k/xmit.c --+++ b/drivers/net/wireless/ath/ath9k/xmit.c --@@ -1660,10 +1660,11 @@ void ath9k_release_buffered_frames(struc -- struct ath_node *an = (struct ath_node *)sta->drv_priv; -- struct ath_txq *txq = sc->tx.uapsdq; -- struct ieee80211_tx_info *info; --+ struct ath_frame_info *fi; -- struct list_head bf_q; -- struct ath_buf *bf_tail = NULL, *bf; -- int sent = 0; --- int i; --+ int n, i; -- -- INIT_LIST_HEAD(&bf_q); -- for (i = 0; tids && nframes; i++, tids >>= 1) { --@@ -1683,10 +1684,15 @@ void ath9k_release_buffered_frames(struc -- ath9k_set_moredata(sc, bf, true); -- list_add_tail(&bf->list, &bf_q); -- ath_set_rates(tid->an->vif, tid->an->sta, bf, true); --- if (bf_isampdu(bf)) { --+ if (bf_isampdu(bf)) -- ath_tx_addto_baw(sc, tid, bf); --- bf->bf_state.bf_type &= ~BUF_AGGR; --+ if (bf_isaggr(bf)) { --+ fi = get_frame_info(bf->bf_mpdu); --+ n = ath_compute_num_delims(sc, tid, bf, --+ fi->framelen, true); --+ bf->bf_state.ndelim = n; -- } --+ -- if (bf_tail) -- bf_tail->bf_next = bf; -- -diff --git a/package/kernel/mac80211/patches/341-ath9k-report-tx-status-on-EOSP.patch b/package/kernel/mac80211/patches/341-ath9k-report-tx-status-on-EOSP.patch -new file mode 100644 -index 0000000..80a3074 ---- /dev/null -+++ b/package/kernel/mac80211/patches/341-ath9k-report-tx-status-on-EOSP.patch -@@ -0,0 +1,19 @@ -+From: Felix Fietkau -+Date: Sun, 28 Aug 2016 13:23:27 +0200 -+Subject: [PATCH] ath9k: report tx status on EOSP -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -86,7 +86,8 @@ static void ath_tx_status(struct ieee802 -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ struct ieee80211_sta *sta = info->status.status_driver_data[0]; -+ -+- if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { -++ if (info->flags & (IEEE80211_TX_CTL_REQ_TX_STATUS | -++ IEEE80211_TX_STATUS_EOSP)) { -+ ieee80211_tx_status(hw, skb); -+ return; -+ } -diff --git a/package/kernel/mac80211/patches/342-ath9k-fix-block-ack-window-tracking-issues.patch b/package/kernel/mac80211/patches/342-ath9k-fix-block-ack-window-tracking-issues.patch -new file mode 100644 -index 0000000..fea147b ---- /dev/null -+++ b/package/kernel/mac80211/patches/342-ath9k-fix-block-ack-window-tracking-issues.patch -@@ -0,0 +1,114 @@ -+From: Felix Fietkau -+Date: Tue, 30 Aug 2016 12:44:08 +0200 -+Subject: [PATCH] ath9k: fix block-ack window tracking issues -+ -+Ensure that a buffer gets tracked as part of the block-ack window as -+soon as it's dequeued from the tid for the first time. Ensure that -+double calls to ath_tx_addto_baw (e.g. on retransmission) don't cause -+any issues. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -62,7 +62,7 @@ static void ath_tx_rc_status(struct ath_ -+ struct ath_tx_status *ts, int nframes, int nbad, -+ int txok); -+ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, -+- int seqno); -++ struct ath_buf *bf); -+ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, -+ struct ath_txq *txq, -+ struct ath_atx_tid *tid, -+@@ -300,7 +300,7 @@ static void ath_tx_flush_tid(struct ath_ -+ } -+ -+ if (fi->baw_tracked) { -+- ath_tx_update_baw(sc, tid, bf->bf_state.seqno); -++ ath_tx_update_baw(sc, tid, bf); -+ sendbar = true; -+ } -+ -+@@ -316,10 +316,15 @@ static void ath_tx_flush_tid(struct ath_ -+ } -+ -+ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, -+- int seqno) -++ struct ath_buf *bf) -+ { -++ struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu); -++ u16 seqno = bf->bf_state.seqno; -+ int index, cindex; -+ -++ if (!fi->baw_tracked) -++ return; -++ -+ index = ATH_BA_INDEX(tid->seq_start, seqno); -+ cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); -+ -+@@ -340,6 +345,9 @@ static void ath_tx_addto_baw(struct ath_ -+ u16 seqno = bf->bf_state.seqno; -+ int index, cindex; -+ -++ if (fi->baw_tracked) -++ return; -++ -+ index = ATH_BA_INDEX(tid->seq_start, seqno); -+ cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); -+ __set_bit(cindex, tid->tx_buf); -+@@ -616,7 +624,7 @@ static void ath_tx_complete_aggr(struct -+ * complete the acked-ones/xretried ones; update -+ * block-ack window -+ */ -+- ath_tx_update_baw(sc, tid, seqno); -++ ath_tx_update_baw(sc, tid, bf); -+ -+ if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) { -+ memcpy(tx_info->control.rates, rates, sizeof(rates)); -+@@ -646,7 +654,7 @@ static void ath_tx_complete_aggr(struct -+ * run out of tx buf. -+ */ -+ if (!tbf) { -+- ath_tx_update_baw(sc, tid, seqno); -++ ath_tx_update_baw(sc, tid, bf); -+ -+ ath_tx_complete_buf(sc, bf, txq, -+ &bf_head, NULL, ts, -+@@ -986,11 +994,14 @@ ath_tx_get_tid_subframe(struct ath_softc -+ -+ INIT_LIST_HEAD(&bf_head); -+ list_add(&bf->list, &bf_head); -+- ath_tx_update_baw(sc, tid, seqno); -++ ath_tx_update_baw(sc, tid, bf); -+ ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); -+ continue; -+ } -+ -++ if (bf_isampdu(bf)) -++ ath_tx_addto_baw(sc, tid, bf); -++ -+ return bf; -+ } -+ -+@@ -1048,8 +1059,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ bf->bf_next = NULL; -+ -+ /* link buffers of this frame to the aggregate */ -+- if (!fi->baw_tracked) -+- ath_tx_addto_baw(sc, tid, bf); -+ bf->bf_state.ndelim = ndelim; -+ -+ list_add_tail(&bf->list, bf_q); -+@@ -1684,10 +1693,8 @@ void ath9k_release_buffered_frames(struc -+ ath9k_set_moredata(sc, bf, true); -+ list_add_tail(&bf->list, &bf_q); -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, true); -+- if (bf_isampdu(bf)) { -+- ath_tx_addto_baw(sc, tid, bf); -++ if (bf_isampdu(bf)) -+ bf->bf_state.bf_type &= ~BUF_AGGR; -+- } -+ if (bf_tail) -+ bf_tail->bf_next = bf; -+ -diff --git a/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch b/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch -deleted file mode 100644 -index 80a3074..0000000 ---- a/package/kernel/mac80211/patches/342-ath9k-report-tx-status-on-EOSP.patch -+++ /dev/null -@@ -1,19 +0,0 @@ --From: Felix Fietkau --Date: Sun, 28 Aug 2016 13:23:27 +0200 --Subject: [PATCH] ath9k: report tx status on EOSP -- --Signed-off-by: Felix Fietkau ----- -- ----- a/drivers/net/wireless/ath/ath9k/xmit.c --+++ b/drivers/net/wireless/ath/ath9k/xmit.c --@@ -86,7 +86,8 @@ static void ath_tx_status(struct ieee802 -- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -- struct ieee80211_sta *sta = info->status.status_driver_data[0]; -- --- if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) { --+ if (info->flags & (IEEE80211_TX_CTL_REQ_TX_STATUS | --+ IEEE80211_TX_STATUS_EOSP)) { -- ieee80211_tx_status(hw, skb); -- return; -- } -diff --git a/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch b/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch -deleted file mode 100644 -index 007a8d7d..0000000 ---- a/package/kernel/mac80211/patches/343-ath9k-fix-block-ack-window-tracking-issues.patch -+++ /dev/null -@@ -1,111 +0,0 @@ --From: Felix Fietkau --Date: Tue, 30 Aug 2016 12:44:08 +0200 --Subject: [PATCH] ath9k: fix block-ack window tracking issues -- --Ensure that a buffer gets tracked as part of the block-ack window as --soon as it's dequeued from the tid for the first time. Ensure that --double calls to ath_tx_addto_baw (e.g. on retransmission) don't cause --any issues. -- --Signed-off-by: Felix Fietkau ----- -- ----- a/drivers/net/wireless/ath/ath9k/xmit.c --+++ b/drivers/net/wireless/ath/ath9k/xmit.c --@@ -62,7 +62,7 @@ static void ath_tx_rc_status(struct ath_ -- struct ath_tx_status *ts, int nframes, int nbad, -- int txok); -- static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, --- int seqno); --+ struct ath_buf *bf); -- static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, -- struct ath_txq *txq, -- struct ath_atx_tid *tid, --@@ -300,7 +300,7 @@ static void ath_tx_flush_tid(struct ath_ -- } -- -- if (fi->baw_tracked) { --- ath_tx_update_baw(sc, tid, bf->bf_state.seqno); --+ ath_tx_update_baw(sc, tid, bf); -- sendbar = true; -- } -- --@@ -316,10 +316,15 @@ static void ath_tx_flush_tid(struct ath_ -- } -- -- static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, --- int seqno) --+ struct ath_buf *bf) -- { --+ struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu); --+ u16 seqno = bf->bf_state.seqno; -- int index, cindex; -- --+ if (!fi->baw_tracked) --+ return; --+ -- index = ATH_BA_INDEX(tid->seq_start, seqno); -- cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); -- --@@ -340,6 +345,9 @@ static void ath_tx_addto_baw(struct ath_ -- u16 seqno = bf->bf_state.seqno; -- int index, cindex; -- --+ if (fi->baw_tracked) --+ return; --+ -- index = ATH_BA_INDEX(tid->seq_start, seqno); -- cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1); -- __set_bit(cindex, tid->tx_buf); --@@ -616,7 +624,7 @@ static void ath_tx_complete_aggr(struct -- * complete the acked-ones/xretried ones; update -- * block-ack window -- */ --- ath_tx_update_baw(sc, tid, seqno); --+ ath_tx_update_baw(sc, tid, bf); -- -- if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) { -- memcpy(tx_info->control.rates, rates, sizeof(rates)); --@@ -646,7 +654,7 @@ static void ath_tx_complete_aggr(struct -- * run out of tx buf. -- */ -- if (!tbf) { --- ath_tx_update_baw(sc, tid, seqno); --+ ath_tx_update_baw(sc, tid, bf); -- -- ath_tx_complete_buf(sc, bf, txq, -- &bf_head, NULL, ts, --@@ -986,11 +994,14 @@ ath_tx_get_tid_subframe(struct ath_softc -- -- INIT_LIST_HEAD(&bf_head); -- list_add(&bf->list, &bf_head); --- ath_tx_update_baw(sc, tid, seqno); --+ ath_tx_update_baw(sc, tid, bf); -- ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0); -- continue; -- } -- --+ if (bf_isampdu(bf)) --+ ath_tx_addto_baw(sc, tid, bf); --+ -- return bf; -- } -- --@@ -1048,8 +1059,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s -- bf->bf_next = NULL; -- -- /* link buffers of this frame to the aggregate */ --- if (!fi->baw_tracked) --- ath_tx_addto_baw(sc, tid, bf); -- bf->bf_state.ndelim = ndelim; -- -- list_add_tail(&bf->list, bf_q); --@@ -1685,8 +1694,6 @@ void ath9k_release_buffered_frames(struc -- ath9k_set_moredata(sc, bf, true); -- list_add_tail(&bf->list, &bf_q); -- ath_set_rates(tid->an->vif, tid->an->sta, bf, true); --- if (bf_isampdu(bf)) --- ath_tx_addto_baw(sc, tid, bf); -- if (bf_isaggr(bf)) { -- fi = get_frame_info(bf->bf_mpdu); -- n = ath_compute_num_delims(sc, tid, bf, -diff --git a/package/kernel/mac80211/patches/343-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch b/package/kernel/mac80211/patches/343-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch -new file mode 100644 -index 0000000..3bbca22 ---- /dev/null -+++ b/package/kernel/mac80211/patches/343-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch -@@ -0,0 +1,64 @@ -+From: Johannes Berg -+Date: Mon, 29 Aug 2016 23:25:18 +0300 -+Subject: [PATCH] mac80211: send delBA on unexpected BlockAck data frames -+ -+When we receive data frames with ACK policy BlockAck, send -+delBA as requested by the 802.11 spec. Since this would be -+happening for every frame inside an A-MPDU if it's really -+received outside a session, limit it to a single attempt. -+ -+Signed-off-by: Johannes Berg -+--- -+ -+--- a/net/mac80211/agg-rx.c -++++ b/net/mac80211/agg-rx.c -+@@ -388,8 +388,10 @@ void __ieee80211_start_rx_ba_session(str -+ } -+ -+ end: -+- if (status == WLAN_STATUS_SUCCESS) -++ if (status == WLAN_STATUS_SUCCESS) { -+ __set_bit(tid, sta->ampdu_mlme.agg_session_valid); -++ __clear_bit(tid, sta->ampdu_mlme.unexpected_agg); -++ } -+ mutex_unlock(&sta->ampdu_mlme.mtx); -+ -+ end_no_lock: -+--- a/net/mac80211/rx.c -++++ b/net/mac80211/rx.c -+@@ -1072,8 +1072,15 @@ static void ieee80211_rx_reorder_ampdu(s -+ tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK; -+ -+ tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); -+- if (!tid_agg_rx) -++ if (!tid_agg_rx) { -++ if (ack_policy == IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && -++ !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && -++ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) -++ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, -++ WLAN_BACK_RECIPIENT, -++ WLAN_REASON_QSTA_REQUIRE_SETUP); -+ goto dont_reorder; -++ } -+ -+ /* qos null data frames are excluded */ -+ if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) -+--- a/net/mac80211/sta_info.h -++++ b/net/mac80211/sta_info.h -+@@ -230,6 +230,8 @@ struct tid_ampdu_rx { -+ * @tid_rx_stop_requested: bitmap indicating which BA sessions per TID the -+ * driver requested to close until the work for it runs -+ * @agg_session_valid: bitmap indicating which TID has a rx BA session open on -++ * @unexpected_agg: bitmap indicating which TID already sent a delBA due to -++ * unexpected aggregation related frames outside a session -+ * @work: work struct for starting/stopping aggregation -+ * @tid_tx: aggregation info for Tx per TID -+ * @tid_start_tx: sessions where start was requested -+@@ -244,6 +246,7 @@ struct sta_ampdu_mlme { -+ unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -+ unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -+ unsigned long agg_session_valid[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -++ unsigned long unexpected_agg[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -+ /* tx */ -+ struct work_struct work; -+ struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; -diff --git a/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch -new file mode 100644 -index 0000000..c3d3118 ---- /dev/null -+++ b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch -@@ -0,0 +1,26 @@ -+From: Johannes Berg -+Date: Mon, 29 Aug 2016 23:25:19 +0300 -+Subject: [PATCH] mac80211: send delBA on unexpected BlockAck Request -+ -+If we don't have a BA session, send delBA, as requested by the -+IEEE 802.11 spec. Apply the same limit of sending such a delBA -+only once as in the previous patch. -+ -+Signed-off-by: Johannes Berg -+--- -+ -+--- a/net/mac80211/rx.c -++++ b/net/mac80211/rx.c -+@@ -2537,6 +2537,12 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_ -+ -+ tid = le16_to_cpu(bar_data.control) >> 12; -+ -++ if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && -++ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) -++ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, -++ WLAN_BACK_RECIPIENT, -++ WLAN_REASON_QSTA_REQUIRE_SETUP); -++ -+ tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); -+ if (!tid_agg_rx) -+ return RX_DROP_MONITOR; -diff --git a/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch b/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch -deleted file mode 100644 -index 3bbca22..0000000 ---- a/package/kernel/mac80211/patches/344-mac80211-send-delBA-on-unexpected-BlockAck-data-fram.patch -+++ /dev/null -@@ -1,64 +0,0 @@ --From: Johannes Berg --Date: Mon, 29 Aug 2016 23:25:18 +0300 --Subject: [PATCH] mac80211: send delBA on unexpected BlockAck data frames -- --When we receive data frames with ACK policy BlockAck, send --delBA as requested by the 802.11 spec. Since this would be --happening for every frame inside an A-MPDU if it's really --received outside a session, limit it to a single attempt. -- --Signed-off-by: Johannes Berg ----- -- ----- a/net/mac80211/agg-rx.c --+++ b/net/mac80211/agg-rx.c --@@ -388,8 +388,10 @@ void __ieee80211_start_rx_ba_session(str -- } -- -- end: --- if (status == WLAN_STATUS_SUCCESS) --+ if (status == WLAN_STATUS_SUCCESS) { -- __set_bit(tid, sta->ampdu_mlme.agg_session_valid); --+ __clear_bit(tid, sta->ampdu_mlme.unexpected_agg); --+ } -- mutex_unlock(&sta->ampdu_mlme.mtx); -- -- end_no_lock: ----- a/net/mac80211/rx.c --+++ b/net/mac80211/rx.c --@@ -1072,8 +1072,15 @@ static void ieee80211_rx_reorder_ampdu(s -- tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK; -- -- tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]); --- if (!tid_agg_rx) --+ if (!tid_agg_rx) { --+ if (ack_policy == IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK && --+ !test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && --+ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) --+ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, --+ WLAN_BACK_RECIPIENT, --+ WLAN_REASON_QSTA_REQUIRE_SETUP); -- goto dont_reorder; --+ } -- -- /* qos null data frames are excluded */ -- if (unlikely(hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_NULLFUNC))) ----- a/net/mac80211/sta_info.h --+++ b/net/mac80211/sta_info.h --@@ -230,6 +230,8 @@ struct tid_ampdu_rx { -- * @tid_rx_stop_requested: bitmap indicating which BA sessions per TID the -- * driver requested to close until the work for it runs -- * @agg_session_valid: bitmap indicating which TID has a rx BA session open on --+ * @unexpected_agg: bitmap indicating which TID already sent a delBA due to --+ * unexpected aggregation related frames outside a session -- * @work: work struct for starting/stopping aggregation -- * @tid_tx: aggregation info for Tx per TID -- * @tid_start_tx: sessions where start was requested --@@ -244,6 +246,7 @@ struct sta_ampdu_mlme { -- unsigned long tid_rx_timer_expired[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -- unsigned long tid_rx_stop_requested[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -- unsigned long agg_session_valid[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; --+ unsigned long unexpected_agg[BITS_TO_LONGS(IEEE80211_NUM_TIDS)]; -- /* tx */ -- struct work_struct work; -- struct tid_ampdu_tx __rcu *tid_tx[IEEE80211_NUM_TIDS]; -diff --git a/package/kernel/mac80211/patches/345-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch b/package/kernel/mac80211/patches/345-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -new file mode 100644 -index 0000000..aba1ff4 ---- /dev/null -+++ b/package/kernel/mac80211/patches/345-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -@@ -0,0 +1,478 @@ -+From: Felix Fietkau -+Date: Sun, 4 Sep 2016 17:46:24 +0200 -+Subject: [PATCH] mac80211: fix sequence number assignment for PS response -+ frames -+ -+When using intermediate queues, sequence number allocation is deferred -+until dequeue. This doesn't work for PS response frames, which bypass -+those queues. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/net/mac80211/tx.c -++++ b/net/mac80211/tx.c -+@@ -38,6 +38,12 @@ -+ #include "wme.h" -+ #include "rate.h" -+ -++static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx); -++static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, -++ struct sta_info *sta, u8 pn_offs, -++ struct ieee80211_key_conf *key_conf, -++ struct sk_buff *skb); -++ -+ /* misc utils */ -+ -+ static inline void ieee80211_tx_stats(struct net_device *dev, u32 len) -+@@ -849,8 +855,7 @@ ieee80211_tx_h_sequence(struct ieee80211 -+ tid = *qc & IEEE80211_QOS_CTL_TID_MASK; -+ tx->sta->tx_stats.msdu[tid]++; -+ -+- if (!tx->sta->sta.txq[0]) -+- hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); -++ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); -+ -+ return TX_CONTINUE; -+ } -+@@ -1398,6 +1403,7 @@ void ieee80211_txq_init(struct ieee80211 -+ fq_tin_init(&txqi->tin); -+ fq_flow_init(&txqi->def_flow); -+ codel_vars_init(&txqi->def_cvars); -++ __skb_queue_head_init(&txqi->frags); -+ -+ txqi->txq.vif = &sdata->vif; -+ -+@@ -1420,6 +1426,7 @@ void ieee80211_txq_purge(struct ieee8021 -+ struct fq_tin *tin = &txqi->tin; -+ -+ fq_tin_reset(fq, tin, fq_skb_free_func); -++ ieee80211_purge_tx_queue(&local->hw, &txqi->frags); -+ } -+ -+ int ieee80211_txq_setup_flows(struct ieee80211_local *local) -+@@ -1476,12 +1483,19 @@ struct sk_buff *ieee80211_tx_dequeue(str -+ struct sk_buff *skb = NULL; -+ struct fq *fq = &local->fq; -+ struct fq_tin *tin = &txqi->tin; -++ struct ieee80211_tx_info *info; -+ -+ spin_lock_bh(&fq->lock); -+ -+ if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags)) -+ goto out; -+ -++ /* Make sure fragments stay together. */ -++ skb = __skb_dequeue(&txqi->frags); -++ if (skb) -++ goto out; -++ -++begin: -+ skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func); -+ if (!skb) -+ goto out; -+@@ -1489,16 +1503,38 @@ struct sk_buff *ieee80211_tx_dequeue(str -+ ieee80211_set_skb_vif(skb, txqi); -+ -+ hdr = (struct ieee80211_hdr *)skb->data; -+- if (txq->sta && ieee80211_is_data_qos(hdr->frame_control)) { -++ info = IEEE80211_SKB_CB(skb); -++ if (txq->sta && info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { -+ struct sta_info *sta = container_of(txq->sta, struct sta_info, -+ sta); -+- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ u8 pn_offs = 0; -+ -+- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, txq->tid); -+- if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags)) -+- info->flags |= IEEE80211_TX_CTL_AMPDU; -+- else -+- info->flags &= ~IEEE80211_TX_CTL_AMPDU; -++ if (info->control.hw_key) -++ pn_offs = ieee80211_padded_hdrlen(hw, hdr->frame_control); -++ -++ ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, -++ info->control.hw_key, skb); -++ } else { -++ struct ieee80211_tx_data tx = { }; -++ -++ __skb_queue_head_init(&tx.skbs); -++ tx.local = local; -++ tx.skb = skb; -++ tx.hdrlen = ieee80211_padded_hdrlen(hw, hdr->frame_control); -++ if (txq->sta) { -++ tx.sta = container_of(txq->sta, struct sta_info, sta); -++ tx.sdata = tx.sta->sdata; -++ } else { -++ tx.sdata = vif_to_sdata(info->control.vif); -++ } -++ -++ if (invoke_tx_handlers_late(&tx)) -++ goto begin; -++ -++ skb = __skb_dequeue(&tx.skbs); -++ -++ if (!skb_queue_empty(&tx.skbs)) -++ skb_queue_splice_tail(&tx.skbs, &txqi->frags); -+ } -+ -+ out: -+@@ -1512,6 +1548,47 @@ out: -+ } -+ EXPORT_SYMBOL(ieee80211_tx_dequeue); -+ -++static bool ieee80211_queue_skb(struct ieee80211_local *local, -++ struct ieee80211_sub_if_data *sdata, -++ struct sta_info *sta, -++ struct sk_buff *skb) -++{ -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ struct fq *fq = &local->fq; -++ struct ieee80211_vif *vif; -++ struct txq_info *txqi; -++ struct ieee80211_sta *pubsta; -++ -++ if (!local->ops->wake_tx_queue || -++ sdata->vif.type == NL80211_IFTYPE_MONITOR) -++ return false; -++ -++ if (sta && sta->uploaded) -++ pubsta = &sta->sta; -++ else -++ pubsta = NULL; -++ -++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) -++ sdata = container_of(sdata->bss, -++ struct ieee80211_sub_if_data, u.ap); -++ -++ vif = &sdata->vif; -++ txqi = ieee80211_get_txq(local, vif, pubsta, skb); -++ -++ if (!txqi) -++ return false; -++ -++ info->control.vif = vif; -++ -++ spin_lock_bh(&fq->lock); -++ ieee80211_txq_enqueue(local, txqi, skb); -++ spin_unlock_bh(&fq->lock); -++ -++ drv_wake_tx_queue(local, txqi); -++ -++ return true; -++} -++ -+ static bool ieee80211_tx_frags(struct ieee80211_local *local, -+ struct ieee80211_vif *vif, -+ struct ieee80211_sta *sta, -+@@ -1519,9 +1596,7 @@ static bool ieee80211_tx_frags(struct ie -+ bool txpending) -+ { -+ struct ieee80211_tx_control control = {}; -+- struct fq *fq = &local->fq; -+ struct sk_buff *skb, *tmp; -+- struct txq_info *txqi; -+ unsigned long flags; -+ -+ skb_queue_walk_safe(skbs, skb, tmp) { -+@@ -1536,21 +1611,6 @@ static bool ieee80211_tx_frags(struct ie -+ } -+ #endif -+ -+- txqi = ieee80211_get_txq(local, vif, sta, skb); -+- if (txqi) { -+- info->control.vif = vif; -+- -+- __skb_unlink(skb, skbs); -+- -+- spin_lock_bh(&fq->lock); -+- ieee80211_txq_enqueue(local, txqi, skb); -+- spin_unlock_bh(&fq->lock); -+- -+- drv_wake_tx_queue(local, txqi); -+- -+- continue; -+- } -+- -+ spin_lock_irqsave(&local->queue_stop_reason_lock, flags); -+ if (local->queue_stop_reasons[q] || -+ (!txpending && !skb_queue_empty(&local->pending[q]))) { -+@@ -1671,10 +1731,13 @@ static bool __ieee80211_tx(struct ieee80 -+ /* -+ * Invoke TX handlers, return 0 on success and non-zero if the -+ * frame was dropped or queued. -++ * -++ * The handlers are split into an early and late part. The latter is everything -++ * that can be sensitive to reordering, and will be deferred to after packets -++ * are dequeued from the intermediate queues (when they are enabled). -+ */ -+-static int invoke_tx_handlers(struct ieee80211_tx_data *tx) -++static int invoke_tx_handlers_early(struct ieee80211_tx_data *tx) -+ { -+- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); -+ ieee80211_tx_result res = TX_DROP; -+ -+ #define CALL_TXH(txh) \ -+@@ -1688,16 +1751,42 @@ static int invoke_tx_handlers(struct iee -+ CALL_TXH(ieee80211_tx_h_check_assoc); -+ CALL_TXH(ieee80211_tx_h_ps_buf); -+ CALL_TXH(ieee80211_tx_h_check_control_port_protocol); -+- CALL_TXH(ieee80211_tx_h_select_key); -++ -+ if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) -+ CALL_TXH(ieee80211_tx_h_rate_ctrl); -+ -++ txh_done: -++ if (unlikely(res == TX_DROP)) { -++ I802_DEBUG_INC(tx->local->tx_handlers_drop); -++ if (tx->skb) -++ ieee80211_free_txskb(&tx->local->hw, tx->skb); -++ else -++ ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); -++ return -1; -++ } else if (unlikely(res == TX_QUEUED)) { -++ I802_DEBUG_INC(tx->local->tx_handlers_queued); -++ return -1; -++ } -++ -++ return 0; -++} -++ -++/* -++ * Late handlers can be called while the sta lock is held. Handlers that can -++ * cause packets to be generated will cause deadlock! -++ */ -++static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx) -++{ -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); -++ ieee80211_tx_result res = TX_CONTINUE; -++ -+ if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { -+ __skb_queue_tail(&tx->skbs, tx->skb); -+ tx->skb = NULL; -+ goto txh_done; -+ } -+ -++ CALL_TXH(ieee80211_tx_h_select_key); -+ CALL_TXH(ieee80211_tx_h_michael_mic_add); -+ CALL_TXH(ieee80211_tx_h_sequence); -+ CALL_TXH(ieee80211_tx_h_fragment); -+@@ -1724,6 +1813,15 @@ static int invoke_tx_handlers(struct iee -+ return 0; -+ } -+ -++static int invoke_tx_handlers(struct ieee80211_tx_data *tx) -++{ -++ int r = invoke_tx_handlers_early(tx); -++ if (r) -++ return r; -++ -++ return invoke_tx_handlers_late(tx); -++} -++ -+ bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, -+ struct ieee80211_vif *vif, struct sk_buff *skb, -+ int band, struct ieee80211_sta **sta) -+@@ -1798,7 +1896,13 @@ static bool ieee80211_tx(struct ieee8021 -+ info->hw_queue = -+ sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; -+ -+- if (!invoke_tx_handlers(&tx)) -++ if (invoke_tx_handlers_early(&tx)) -++ return false; -++ -++ if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb)) -++ return true; -++ -++ if (!invoke_tx_handlers_late(&tx)) -+ result = __ieee80211_tx(local, &tx.skbs, led_len, -+ tx.sta, txpending); -+ -+@@ -3181,7 +3285,7 @@ out: -+ } -+ -+ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, -+- struct net_device *dev, struct sta_info *sta, -++ struct sta_info *sta, -+ struct ieee80211_fast_tx *fast_tx, -+ struct sk_buff *skb) -+ { -+@@ -3192,9 +3296,9 @@ static bool ieee80211_xmit_fast(struct i -+ struct ethhdr eth; -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; -+- struct ieee80211_tx_data tx; -+- ieee80211_tx_result r; -+ struct tid_ampdu_tx *tid_tx = NULL; -++ ieee80211_tx_result r; -++ struct ieee80211_tx_data tx; -+ u8 tid = IEEE80211_NUM_TIDS; -+ -+ /* control port protocol needs a lot of special handling */ -+@@ -3232,8 +3336,6 @@ static bool ieee80211_xmit_fast(struct i -+ return true; -+ } -+ -+- ieee80211_tx_stats(dev, skb->len + extra_head); -+- -+ if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) && -+ ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb)) -+ return true; -+@@ -3262,24 +3364,7 @@ static bool ieee80211_xmit_fast(struct i -+ info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | -+ IEEE80211_TX_CTL_DONTFRAG | -+ (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0); -+- -+- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { -+- *ieee80211_get_qos_ctl(hdr) = tid; -+- if (!sta->sta.txq[0]) -+- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); -+- } else { -+- info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; -+- hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); -+- sdata->sequence_number += 0x10; -+- } -+- -+- if (skb_shinfo(skb)->gso_size) -+- sta->tx_stats.msdu[tid] += -+- DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); -+- else -+- sta->tx_stats.msdu[tid]++; -+- -+- info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; -++ info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT; -+ -+ __skb_queue_head_init(&tx.skbs); -+ -+@@ -3305,22 +3390,71 @@ static bool ieee80211_xmit_fast(struct i -+ } -+ } -+ -++ if (ieee80211_queue_skb(local, sdata, sta, skb)) -++ return true; -++ -++ ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, -++ &fast_tx->key->conf, skb); -++ -++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) -++ sdata = container_of(sdata->bss, -++ struct ieee80211_sub_if_data, u.ap); -++ -++ __skb_queue_tail(&tx.skbs, skb); -++ ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); -++ -++ return true; -++} -++ -++/* -++ * Can be called while the sta lock is held. Anything that can cause packets to -++ * be generated will cause deadlock! -++ */ -++static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, -++ struct sta_info *sta, u8 pn_offs, -++ struct ieee80211_key_conf *key_conf, -++ struct sk_buff *skb) -++{ -++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -++ struct ieee80211_hdr *hdr = (void *)skb->data; -++ u8 tid = IEEE80211_NUM_TIDS; -++ -++ ieee80211_tx_stats(skb->dev, skb->len); -++ -++ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { -++ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; -++ *ieee80211_get_qos_ctl(hdr) = tid; -++ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); -++ } else { -++ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; -++ hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); -++ sdata->sequence_number += 0x10; -++ } -++ -++ if (skb_shinfo(skb)->gso_size) -++ sta->tx_stats.msdu[tid] += -++ DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); -++ else -++ sta->tx_stats.msdu[tid]++; -++ -++ info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; -++ -+ /* statistics normally done by ieee80211_tx_h_stats (but that -+ * has to consider fragmentation, so is more complex) -+ */ -+ sta->tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len; -+ sta->tx_stats.packets[skb_get_queue_mapping(skb)]++; -+ -+- if (fast_tx->pn_offs) { -++ if (pn_offs && (key_conf->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { -+ u64 pn; -+- u8 *crypto_hdr = skb->data + fast_tx->pn_offs; -++ u8 *crypto_hdr = skb->data + pn_offs; -+ -+- switch (fast_tx->key->conf.cipher) { -++ switch (key_conf->cipher) { -+ case WLAN_CIPHER_SUITE_CCMP: -+ case WLAN_CIPHER_SUITE_CCMP_256: -+ case WLAN_CIPHER_SUITE_GCMP: -+ case WLAN_CIPHER_SUITE_GCMP_256: -+- pn = atomic64_inc_return(&fast_tx->key->conf.tx_pn); -++ pn = atomic64_inc_return(&key_conf->tx_pn); -+ crypto_hdr[0] = pn; -+ crypto_hdr[1] = pn >> 8; -+ crypto_hdr[4] = pn >> 16; -+@@ -3331,12 +3465,6 @@ static bool ieee80211_xmit_fast(struct i -+ } -+ } -+ -+- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) -+- sdata = container_of(sdata->bss, -+- struct ieee80211_sub_if_data, u.ap); -+- -+- __skb_queue_tail(&tx.skbs, skb); -+- ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); -+ return true; -+ } -+ -+@@ -3364,7 +3492,7 @@ void __ieee80211_subif_start_xmit(struct -+ fast_tx = rcu_dereference(sta->fast_tx); -+ -+ if (fast_tx && -+- ieee80211_xmit_fast(sdata, dev, sta, fast_tx, skb)) -++ ieee80211_xmit_fast(sdata, sta, fast_tx, skb)) -+ goto out; -+ } -+ -+--- a/include/net/mac80211.h -++++ b/include/net/mac80211.h -+@@ -715,6 +715,7 @@ enum mac80211_tx_info_flags { -+ * frame (PS-Poll or uAPSD). -+ * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information -+ * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame -++ * @IEEE80211_TX_CTRL_FAST_XMIT: This frame is going through the fast_xmit path -+ * -+ * These flags are used in tx_info->control.flags. -+ */ -+@@ -723,6 +724,7 @@ enum mac80211_tx_control_flags { -+ IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), -+ IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), -+ IEEE80211_TX_CTRL_AMSDU = BIT(3), -++ IEEE80211_TX_CTRL_FAST_XMIT = BIT(4), -+ }; -+ -+ /* -+--- a/net/mac80211/ieee80211_i.h -++++ b/net/mac80211/ieee80211_i.h -+@@ -814,11 +814,13 @@ enum txq_info_flags { -+ * @def_flow: used as a fallback flow when a packet destined to @tin hashes to -+ * a fq_flow which is already owned by a different tin -+ * @def_cvars: codel vars for @def_flow -++ * @frags: used to keep fragments created after dequeue -+ */ -+ struct txq_info { -+ struct fq_tin tin; -+ struct fq_flow def_flow; -+ struct codel_vars def_cvars; -++ struct sk_buff_head frags; -+ unsigned long flags; -+ -+ /* keep last! */ -diff --git a/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch b/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch -deleted file mode 100644 -index c3d3118..0000000 ---- a/package/kernel/mac80211/patches/345-mac80211-send-delBA-on-unexpected-BlockAck-Request.patch -+++ /dev/null -@@ -1,26 +0,0 @@ --From: Johannes Berg --Date: Mon, 29 Aug 2016 23:25:19 +0300 --Subject: [PATCH] mac80211: send delBA on unexpected BlockAck Request -- --If we don't have a BA session, send delBA, as requested by the --IEEE 802.11 spec. Apply the same limit of sending such a delBA --only once as in the previous patch. -- --Signed-off-by: Johannes Berg ----- -- ----- a/net/mac80211/rx.c --+++ b/net/mac80211/rx.c --@@ -2537,6 +2537,12 @@ ieee80211_rx_h_ctrl(struct ieee80211_rx_ -- -- tid = le16_to_cpu(bar_data.control) >> 12; -- --+ if (!test_bit(tid, rx->sta->ampdu_mlme.agg_session_valid) && --+ !test_and_set_bit(tid, rx->sta->ampdu_mlme.unexpected_agg)) --+ ieee80211_send_delba(rx->sdata, rx->sta->sta.addr, tid, --+ WLAN_BACK_RECIPIENT, --+ WLAN_REASON_QSTA_REQUIRE_SETUP); --+ -- tid_agg_rx = rcu_dereference(rx->sta->ampdu_mlme.tid_rx[tid]); -- if (!tid_agg_rx) -- return RX_DROP_MONITOR; -diff --git a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch b/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -deleted file mode 100644 -index aba1ff4..0000000 ---- a/package/kernel/mac80211/patches/346-mac80211-Move-reorder-sensitive-TX-handlers-to-after.patch -+++ /dev/null -@@ -1,478 +0,0 @@ --From: Felix Fietkau --Date: Sun, 4 Sep 2016 17:46:24 +0200 --Subject: [PATCH] mac80211: fix sequence number assignment for PS response -- frames -- --When using intermediate queues, sequence number allocation is deferred --until dequeue. This doesn't work for PS response frames, which bypass --those queues. -- --Signed-off-by: Felix Fietkau ----- -- ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -38,6 +38,12 @@ -- #include "wme.h" -- #include "rate.h" -- --+static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx); --+static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, --+ struct sta_info *sta, u8 pn_offs, --+ struct ieee80211_key_conf *key_conf, --+ struct sk_buff *skb); --+ -- /* misc utils */ -- -- static inline void ieee80211_tx_stats(struct net_device *dev, u32 len) --@@ -849,8 +855,7 @@ ieee80211_tx_h_sequence(struct ieee80211 -- tid = *qc & IEEE80211_QOS_CTL_TID_MASK; -- tx->sta->tx_stats.msdu[tid]++; -- --- if (!tx->sta->sta.txq[0]) --- hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); --+ hdr->seq_ctrl = ieee80211_tx_next_seq(tx->sta, tid); -- -- return TX_CONTINUE; -- } --@@ -1398,6 +1403,7 @@ void ieee80211_txq_init(struct ieee80211 -- fq_tin_init(&txqi->tin); -- fq_flow_init(&txqi->def_flow); -- codel_vars_init(&txqi->def_cvars); --+ __skb_queue_head_init(&txqi->frags); -- -- txqi->txq.vif = &sdata->vif; -- --@@ -1420,6 +1426,7 @@ void ieee80211_txq_purge(struct ieee8021 -- struct fq_tin *tin = &txqi->tin; -- -- fq_tin_reset(fq, tin, fq_skb_free_func); --+ ieee80211_purge_tx_queue(&local->hw, &txqi->frags); -- } -- -- int ieee80211_txq_setup_flows(struct ieee80211_local *local) --@@ -1476,12 +1483,19 @@ struct sk_buff *ieee80211_tx_dequeue(str -- struct sk_buff *skb = NULL; -- struct fq *fq = &local->fq; -- struct fq_tin *tin = &txqi->tin; --+ struct ieee80211_tx_info *info; -- -- spin_lock_bh(&fq->lock); -- -- if (test_bit(IEEE80211_TXQ_STOP, &txqi->flags)) -- goto out; -- --+ /* Make sure fragments stay together. */ --+ skb = __skb_dequeue(&txqi->frags); --+ if (skb) --+ goto out; --+ --+begin: -- skb = fq_tin_dequeue(fq, tin, fq_tin_dequeue_func); -- if (!skb) -- goto out; --@@ -1489,16 +1503,38 @@ struct sk_buff *ieee80211_tx_dequeue(str -- ieee80211_set_skb_vif(skb, txqi); -- -- hdr = (struct ieee80211_hdr *)skb->data; --- if (txq->sta && ieee80211_is_data_qos(hdr->frame_control)) { --+ info = IEEE80211_SKB_CB(skb); --+ if (txq->sta && info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { -- struct sta_info *sta = container_of(txq->sta, struct sta_info, -- sta); --- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); --+ u8 pn_offs = 0; -- --- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, txq->tid); --- if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags)) --- info->flags |= IEEE80211_TX_CTL_AMPDU; --- else --- info->flags &= ~IEEE80211_TX_CTL_AMPDU; --+ if (info->control.hw_key) --+ pn_offs = ieee80211_padded_hdrlen(hw, hdr->frame_control); --+ --+ ieee80211_xmit_fast_finish(sta->sdata, sta, pn_offs, --+ info->control.hw_key, skb); --+ } else { --+ struct ieee80211_tx_data tx = { }; --+ --+ __skb_queue_head_init(&tx.skbs); --+ tx.local = local; --+ tx.skb = skb; --+ tx.hdrlen = ieee80211_padded_hdrlen(hw, hdr->frame_control); --+ if (txq->sta) { --+ tx.sta = container_of(txq->sta, struct sta_info, sta); --+ tx.sdata = tx.sta->sdata; --+ } else { --+ tx.sdata = vif_to_sdata(info->control.vif); --+ } --+ --+ if (invoke_tx_handlers_late(&tx)) --+ goto begin; --+ --+ skb = __skb_dequeue(&tx.skbs); --+ --+ if (!skb_queue_empty(&tx.skbs)) --+ skb_queue_splice_tail(&tx.skbs, &txqi->frags); -- } -- -- out: --@@ -1512,6 +1548,47 @@ out: -- } -- EXPORT_SYMBOL(ieee80211_tx_dequeue); -- --+static bool ieee80211_queue_skb(struct ieee80211_local *local, --+ struct ieee80211_sub_if_data *sdata, --+ struct sta_info *sta, --+ struct sk_buff *skb) --+{ --+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); --+ struct fq *fq = &local->fq; --+ struct ieee80211_vif *vif; --+ struct txq_info *txqi; --+ struct ieee80211_sta *pubsta; --+ --+ if (!local->ops->wake_tx_queue || --+ sdata->vif.type == NL80211_IFTYPE_MONITOR) --+ return false; --+ --+ if (sta && sta->uploaded) --+ pubsta = &sta->sta; --+ else --+ pubsta = NULL; --+ --+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) --+ sdata = container_of(sdata->bss, --+ struct ieee80211_sub_if_data, u.ap); --+ --+ vif = &sdata->vif; --+ txqi = ieee80211_get_txq(local, vif, pubsta, skb); --+ --+ if (!txqi) --+ return false; --+ --+ info->control.vif = vif; --+ --+ spin_lock_bh(&fq->lock); --+ ieee80211_txq_enqueue(local, txqi, skb); --+ spin_unlock_bh(&fq->lock); --+ --+ drv_wake_tx_queue(local, txqi); --+ --+ return true; --+} --+ -- static bool ieee80211_tx_frags(struct ieee80211_local *local, -- struct ieee80211_vif *vif, -- struct ieee80211_sta *sta, --@@ -1519,9 +1596,7 @@ static bool ieee80211_tx_frags(struct ie -- bool txpending) -- { -- struct ieee80211_tx_control control = {}; --- struct fq *fq = &local->fq; -- struct sk_buff *skb, *tmp; --- struct txq_info *txqi; -- unsigned long flags; -- -- skb_queue_walk_safe(skbs, skb, tmp) { --@@ -1536,21 +1611,6 @@ static bool ieee80211_tx_frags(struct ie -- } -- #endif -- --- txqi = ieee80211_get_txq(local, vif, sta, skb); --- if (txqi) { --- info->control.vif = vif; --- --- __skb_unlink(skb, skbs); --- --- spin_lock_bh(&fq->lock); --- ieee80211_txq_enqueue(local, txqi, skb); --- spin_unlock_bh(&fq->lock); --- --- drv_wake_tx_queue(local, txqi); --- --- continue; --- } --- -- spin_lock_irqsave(&local->queue_stop_reason_lock, flags); -- if (local->queue_stop_reasons[q] || -- (!txpending && !skb_queue_empty(&local->pending[q]))) { --@@ -1671,10 +1731,13 @@ static bool __ieee80211_tx(struct ieee80 -- /* -- * Invoke TX handlers, return 0 on success and non-zero if the -- * frame was dropped or queued. --+ * --+ * The handlers are split into an early and late part. The latter is everything --+ * that can be sensitive to reordering, and will be deferred to after packets --+ * are dequeued from the intermediate queues (when they are enabled). -- */ ---static int invoke_tx_handlers(struct ieee80211_tx_data *tx) --+static int invoke_tx_handlers_early(struct ieee80211_tx_data *tx) -- { --- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); -- ieee80211_tx_result res = TX_DROP; -- -- #define CALL_TXH(txh) \ --@@ -1688,16 +1751,42 @@ static int invoke_tx_handlers(struct iee -- CALL_TXH(ieee80211_tx_h_check_assoc); -- CALL_TXH(ieee80211_tx_h_ps_buf); -- CALL_TXH(ieee80211_tx_h_check_control_port_protocol); --- CALL_TXH(ieee80211_tx_h_select_key); --+ -- if (!ieee80211_hw_check(&tx->local->hw, HAS_RATE_CONTROL)) -- CALL_TXH(ieee80211_tx_h_rate_ctrl); -- --+ txh_done: --+ if (unlikely(res == TX_DROP)) { --+ I802_DEBUG_INC(tx->local->tx_handlers_drop); --+ if (tx->skb) --+ ieee80211_free_txskb(&tx->local->hw, tx->skb); --+ else --+ ieee80211_purge_tx_queue(&tx->local->hw, &tx->skbs); --+ return -1; --+ } else if (unlikely(res == TX_QUEUED)) { --+ I802_DEBUG_INC(tx->local->tx_handlers_queued); --+ return -1; --+ } --+ --+ return 0; --+} --+ --+/* --+ * Late handlers can be called while the sta lock is held. Handlers that can --+ * cause packets to be generated will cause deadlock! --+ */ --+static int invoke_tx_handlers_late(struct ieee80211_tx_data *tx) --+{ --+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); --+ ieee80211_tx_result res = TX_CONTINUE; --+ -- if (unlikely(info->flags & IEEE80211_TX_INTFL_RETRANSMISSION)) { -- __skb_queue_tail(&tx->skbs, tx->skb); -- tx->skb = NULL; -- goto txh_done; -- } -- --+ CALL_TXH(ieee80211_tx_h_select_key); -- CALL_TXH(ieee80211_tx_h_michael_mic_add); -- CALL_TXH(ieee80211_tx_h_sequence); -- CALL_TXH(ieee80211_tx_h_fragment); --@@ -1724,6 +1813,15 @@ static int invoke_tx_handlers(struct iee -- return 0; -- } -- --+static int invoke_tx_handlers(struct ieee80211_tx_data *tx) --+{ --+ int r = invoke_tx_handlers_early(tx); --+ if (r) --+ return r; --+ --+ return invoke_tx_handlers_late(tx); --+} --+ -- bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, -- struct ieee80211_vif *vif, struct sk_buff *skb, -- int band, struct ieee80211_sta **sta) --@@ -1798,7 +1896,13 @@ static bool ieee80211_tx(struct ieee8021 -- info->hw_queue = -- sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; -- --- if (!invoke_tx_handlers(&tx)) --+ if (invoke_tx_handlers_early(&tx)) --+ return false; --+ --+ if (ieee80211_queue_skb(local, sdata, tx.sta, tx.skb)) --+ return true; --+ --+ if (!invoke_tx_handlers_late(&tx)) -- result = __ieee80211_tx(local, &tx.skbs, led_len, -- tx.sta, txpending); -- --@@ -3181,7 +3285,7 @@ out: -- } -- -- static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, --- struct net_device *dev, struct sta_info *sta, --+ struct sta_info *sta, -- struct ieee80211_fast_tx *fast_tx, -- struct sk_buff *skb) -- { --@@ -3192,9 +3296,9 @@ static bool ieee80211_xmit_fast(struct i -- struct ethhdr eth; -- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -- struct ieee80211_hdr *hdr = (void *)fast_tx->hdr; --- struct ieee80211_tx_data tx; --- ieee80211_tx_result r; -- struct tid_ampdu_tx *tid_tx = NULL; --+ ieee80211_tx_result r; --+ struct ieee80211_tx_data tx; -- u8 tid = IEEE80211_NUM_TIDS; -- -- /* control port protocol needs a lot of special handling */ --@@ -3232,8 +3336,6 @@ static bool ieee80211_xmit_fast(struct i -- return true; -- } -- --- ieee80211_tx_stats(dev, skb->len + extra_head); --- -- if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) && -- ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb)) -- return true; --@@ -3262,24 +3364,7 @@ static bool ieee80211_xmit_fast(struct i -- info->flags = IEEE80211_TX_CTL_FIRST_FRAGMENT | -- IEEE80211_TX_CTL_DONTFRAG | -- (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0); --- --- if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { --- *ieee80211_get_qos_ctl(hdr) = tid; --- if (!sta->sta.txq[0]) --- hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); --- } else { --- info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; --- hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); --- sdata->sequence_number += 0x10; --- } --- --- if (skb_shinfo(skb)->gso_size) --- sta->tx_stats.msdu[tid] += --- DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); --- else --- sta->tx_stats.msdu[tid]++; --- --- info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; --+ info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT; -- -- __skb_queue_head_init(&tx.skbs); -- --@@ -3305,22 +3390,71 @@ static bool ieee80211_xmit_fast(struct i -- } -- } -- --+ if (ieee80211_queue_skb(local, sdata, sta, skb)) --+ return true; --+ --+ ieee80211_xmit_fast_finish(sdata, sta, fast_tx->pn_offs, --+ &fast_tx->key->conf, skb); --+ --+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) --+ sdata = container_of(sdata->bss, --+ struct ieee80211_sub_if_data, u.ap); --+ --+ __skb_queue_tail(&tx.skbs, skb); --+ ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); --+ --+ return true; --+} --+ --+/* --+ * Can be called while the sta lock is held. Anything that can cause packets to --+ * be generated will cause deadlock! --+ */ --+static bool ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata, --+ struct sta_info *sta, u8 pn_offs, --+ struct ieee80211_key_conf *key_conf, --+ struct sk_buff *skb) --+{ --+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); --+ struct ieee80211_hdr *hdr = (void *)skb->data; --+ u8 tid = IEEE80211_NUM_TIDS; --+ --+ ieee80211_tx_stats(skb->dev, skb->len); --+ --+ if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { --+ tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; --+ *ieee80211_get_qos_ctl(hdr) = tid; --+ hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); --+ } else { --+ info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; --+ hdr->seq_ctrl = cpu_to_le16(sdata->sequence_number); --+ sdata->sequence_number += 0x10; --+ } --+ --+ if (skb_shinfo(skb)->gso_size) --+ sta->tx_stats.msdu[tid] += --+ DIV_ROUND_UP(skb->len, skb_shinfo(skb)->gso_size); --+ else --+ sta->tx_stats.msdu[tid]++; --+ --+ info->hw_queue = sdata->vif.hw_queue[skb_get_queue_mapping(skb)]; --+ -- /* statistics normally done by ieee80211_tx_h_stats (but that -- * has to consider fragmentation, so is more complex) -- */ -- sta->tx_stats.bytes[skb_get_queue_mapping(skb)] += skb->len; -- sta->tx_stats.packets[skb_get_queue_mapping(skb)]++; -- --- if (fast_tx->pn_offs) { --+ if (pn_offs && (key_conf->flags & IEEE80211_KEY_FLAG_GENERATE_IV)) { -- u64 pn; --- u8 *crypto_hdr = skb->data + fast_tx->pn_offs; --+ u8 *crypto_hdr = skb->data + pn_offs; -- --- switch (fast_tx->key->conf.cipher) { --+ switch (key_conf->cipher) { -- case WLAN_CIPHER_SUITE_CCMP: -- case WLAN_CIPHER_SUITE_CCMP_256: -- case WLAN_CIPHER_SUITE_GCMP: -- case WLAN_CIPHER_SUITE_GCMP_256: --- pn = atomic64_inc_return(&fast_tx->key->conf.tx_pn); --+ pn = atomic64_inc_return(&key_conf->tx_pn); -- crypto_hdr[0] = pn; -- crypto_hdr[1] = pn >> 8; -- crypto_hdr[4] = pn >> 16; --@@ -3331,12 +3465,6 @@ static bool ieee80211_xmit_fast(struct i -- } -- } -- --- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) --- sdata = container_of(sdata->bss, --- struct ieee80211_sub_if_data, u.ap); --- --- __skb_queue_tail(&tx.skbs, skb); --- ieee80211_tx_frags(local, &sdata->vif, &sta->sta, &tx.skbs, false); -- return true; -- } -- --@@ -3364,7 +3492,7 @@ void __ieee80211_subif_start_xmit(struct -- fast_tx = rcu_dereference(sta->fast_tx); -- -- if (fast_tx && --- ieee80211_xmit_fast(sdata, dev, sta, fast_tx, skb)) --+ ieee80211_xmit_fast(sdata, sta, fast_tx, skb)) -- goto out; -- } -- ----- a/include/net/mac80211.h --+++ b/include/net/mac80211.h --@@ -715,6 +715,7 @@ enum mac80211_tx_info_flags { -- * frame (PS-Poll or uAPSD). -- * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information -- * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame --+ * @IEEE80211_TX_CTRL_FAST_XMIT: This frame is going through the fast_xmit path -- * -- * These flags are used in tx_info->control.flags. -- */ --@@ -723,6 +724,7 @@ enum mac80211_tx_control_flags { -- IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), -- IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), -- IEEE80211_TX_CTRL_AMSDU = BIT(3), --+ IEEE80211_TX_CTRL_FAST_XMIT = BIT(4), -- }; -- -- /* ----- a/net/mac80211/ieee80211_i.h --+++ b/net/mac80211/ieee80211_i.h --@@ -814,11 +814,13 @@ enum txq_info_flags { -- * @def_flow: used as a fallback flow when a packet destined to @tin hashes to -- * a fq_flow which is already owned by a different tin -- * @def_cvars: codel vars for @def_flow --+ * @frags: used to keep fragments created after dequeue -- */ -- struct txq_info { -- struct fq_tin tin; -- struct fq_flow def_flow; -- struct codel_vars def_cvars; --+ struct sk_buff_head frags; -- unsigned long flags; -- -- /* keep last! */ From df5f4ad24342d5a916b9fde099545d998d45c9a0 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 13 Oct 2016 10:02:11 +0200 Subject: [PATCH 016/126] ath9k: remove intermediate queueing patch The downgraded version of ath9k was reported to cause issues with Windows clients before. Remove the problematic patch. --- ...ing-patch-until-it-is-fixed-properly.patch | 885 ++++++++++++++++++ 1 file changed, 885 insertions(+) create mode 100644 patches/openwrt/0075-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch diff --git a/patches/openwrt/0075-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch b/patches/openwrt/0075-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch new file mode 100644 index 00000000..f55441e7 --- /dev/null +++ b/patches/openwrt/0075-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch @@ -0,0 +1,885 @@ +From: Matthias Schiffer +Date: Thu, 13 Oct 2016 10:01:19 +0200 +Subject: ath9k: remove intermediate queueing patch until it is fixed properly + +Signed-off-by: Felix Fietkau + +Backport of LEDE 04a69843198f2252992812e35ac05016db4a1a94 + +diff --git a/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch b/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch +deleted file mode 100644 +index f8b8f86..0000000 +--- a/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch ++++ /dev/null +@@ -1,871 +0,0 @@ +-From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= +-Date: Wed, 6 Jul 2016 21:34:17 +0200 +-Subject: [PATCH] ath9k: Switch to using mac80211 intermediate software queues. +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=UTF-8 +-Content-Transfer-Encoding: 8bit +- +-This switches ath9k over to using the mac80211 intermediate software +-queueing mechanism for data packets. It removes the queueing inside the +-driver, except for the retry queue, and instead pulls from mac80211 when +-a packet is needed. The retry queue is used to store a packet that was +-pulled but can't be sent immediately. +- +-The old code path in ath_tx_start that would queue packets has been +-removed completely, as has the qlen limit tunables (since there's no +-longer a queue in the driver to limit). +- +-Based on Tim's original patch set, but reworked quite thoroughly. +- +-Cc: Tim Shepard +-Cc: Felix Fietkau +-Signed-off-by: Toke Høiland-Jørgensen +---- +- +---- a/drivers/net/wireless/ath/ath9k/ath9k.h +-+++ b/drivers/net/wireless/ath/ath9k/ath9k.h +-@@ -91,7 +91,6 @@ int ath_descdma_setup(struct ath_softc * +- #define ATH_RXBUF 512 +- #define ATH_TXBUF 512 +- #define ATH_TXBUF_RESERVE 5 +--#define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE) +- #define ATH_TXMAXTRY 13 +- #define ATH_MAX_SW_RETRIES 30 +- +-@@ -145,7 +144,9 @@ int ath_descdma_setup(struct ath_softc * +- #define BAW_WITHIN(_start, _bawsz, _seqno) \ +- ((((_seqno) - (_start)) & 4095) < (_bawsz)) +- +--#define ATH_AN_2_TID(_an, _tidno) (&(_an)->tid[(_tidno)]) +-+#define ATH_STA_2_TID(_sta, _tidno) ((struct ath_atx_tid *)(_sta)->txq[_tidno]->drv_priv) +-+#define ATH_VIF_2_TID(_vif) ((struct ath_atx_tid *)(_vif)->txq->drv_priv) +-+#define ATH_AN_2_TID(_an, _tidno) ((_an)->sta ? ATH_STA_2_TID((_an)->sta, _tidno) : ATH_VIF_2_TID((_an)->vif)) +- +- #define IS_HT_RATE(rate) (rate & 0x80) +- #define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e)) +-@@ -164,7 +165,6 @@ struct ath_txq { +- spinlock_t axq_lock; +- u32 axq_depth; +- u32 axq_ampdu_depth; +-- bool stopped; +- bool axq_tx_inprogress; +- struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; +- u8 txq_headidx; +-@@ -232,7 +232,6 @@ struct ath_buf { +- +- struct ath_atx_tid { +- struct list_head list; +-- struct sk_buff_head buf_q; +- struct sk_buff_head retry_q; +- struct ath_node *an; +- struct ath_txq *txq; +-@@ -247,13 +246,13 @@ struct ath_atx_tid { +- s8 bar_index; +- bool active; +- bool clear_ps_filter; +-+ bool has_queued; +- }; +- +- struct ath_node { +- struct ath_softc *sc; +- struct ieee80211_sta *sta; /* station struct we're part of */ +- struct ieee80211_vif *vif; /* interface with which we're associated */ +-- struct ath_atx_tid tid[IEEE80211_NUM_TIDS]; +- +- u16 maxampdu; +- u8 mpdudensity; +-@@ -276,7 +275,6 @@ struct ath_tx_control { +- struct ath_node *an; +- struct ieee80211_sta *sta; +- u8 paprd; +-- bool force_channel; +- }; +- +- +-@@ -293,7 +291,6 @@ struct ath_tx { +- struct ath_descdma txdma; +- struct ath_txq *txq_map[IEEE80211_NUM_ACS]; +- struct ath_txq *uapsdq; +-- u32 txq_max_pending[IEEE80211_NUM_ACS]; +- u16 max_aggr_framelen[IEEE80211_NUM_ACS][4][32]; +- }; +- +-@@ -585,6 +582,7 @@ void ath9k_release_buffered_frames(struc +- u16 tids, int nframes, +- enum ieee80211_frame_release_type reason, +- bool more_data); +-+void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue); +- +- /********/ +- /* VIFs */ +---- a/drivers/net/wireless/ath/ath9k/channel.c +-+++ b/drivers/net/wireless/ath/ath9k/channel.c +-@@ -1007,7 +1007,6 @@ static void ath_scan_send_probe(struct a +- goto error; +- +- txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO]; +-- txctl.force_channel = true; +- if (ath_tx_start(sc->hw, skb, &txctl)) +- goto error; +- +-@@ -1130,7 +1129,6 @@ ath_chanctx_send_vif_ps_frame(struct ath +- memset(&txctl, 0, sizeof(txctl)); +- txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO]; +- txctl.sta = sta; +-- txctl.force_channel = true; +- if (ath_tx_start(sc->hw, skb, &txctl)) { +- ieee80211_free_txskb(sc->hw, skb); +- return false; +---- a/drivers/net/wireless/ath/ath9k/debug.c +-+++ b/drivers/net/wireless/ath/ath9k/debug.c +-@@ -600,7 +600,6 @@ static int read_file_xmit(struct seq_fil +- PR("MPDUs XRetried: ", xretries); +- PR("Aggregates: ", a_aggr); +- PR("AMPDUs Queued HW:", a_queued_hw); +-- PR("AMPDUs Queued SW:", a_queued_sw); +- PR("AMPDUs Completed:", a_completed); +- PR("AMPDUs Retried: ", a_retries); +- PR("AMPDUs XRetried: ", a_xretries); +-@@ -629,8 +628,7 @@ static void print_queue(struct ath_softc +- seq_printf(file, "%s: %d ", "qnum", txq->axq_qnum); +- seq_printf(file, "%s: %2d ", "qdepth", txq->axq_depth); +- seq_printf(file, "%s: %2d ", "ampdu-depth", txq->axq_ampdu_depth); +-- seq_printf(file, "%s: %3d ", "pending", txq->pending_frames); +-- seq_printf(file, "%s: %d\n", "stopped", txq->stopped); +-+ seq_printf(file, "%s: %3d\n", "pending", txq->pending_frames); +- +- ath_txq_unlock(sc, txq); +- } +-@@ -1208,7 +1206,6 @@ static const char ath9k_gstrings_stats[] +- AMKSTR(d_tx_mpdu_xretries), +- AMKSTR(d_tx_aggregates), +- AMKSTR(d_tx_ampdus_queued_hw), +-- AMKSTR(d_tx_ampdus_queued_sw), +- AMKSTR(d_tx_ampdus_completed), +- AMKSTR(d_tx_ampdu_retries), +- AMKSTR(d_tx_ampdu_xretries), +-@@ -1288,7 +1285,6 @@ void ath9k_get_et_stats(struct ieee80211 +- AWDATA(xretries); +- AWDATA(a_aggr); +- AWDATA(a_queued_hw); +-- AWDATA(a_queued_sw); +- AWDATA(a_completed); +- AWDATA(a_retries); +- AWDATA(a_xretries); +-@@ -1346,14 +1342,6 @@ int ath9k_init_debug(struct ath_hw *ah) +- read_file_xmit); +- debugfs_create_devm_seqfile(sc->dev, "queues", sc->debug.debugfs_phy, +- read_file_queues); +-- debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, +-- &sc->tx.txq_max_pending[IEEE80211_AC_BK]); +-- debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, +-- &sc->tx.txq_max_pending[IEEE80211_AC_BE]); +-- debugfs_create_u32("qlen_vi", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, +-- &sc->tx.txq_max_pending[IEEE80211_AC_VI]); +-- debugfs_create_u32("qlen_vo", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, +-- &sc->tx.txq_max_pending[IEEE80211_AC_VO]); +- debugfs_create_devm_seqfile(sc->dev, "misc", sc->debug.debugfs_phy, +- read_file_misc); +- debugfs_create_devm_seqfile(sc->dev, "reset", sc->debug.debugfs_phy, +---- a/drivers/net/wireless/ath/ath9k/debug.h +-+++ b/drivers/net/wireless/ath/ath9k/debug.h +-@@ -147,7 +147,6 @@ struct ath_interrupt_stats { +- * @completed: Total MPDUs (non-aggr) completed +- * @a_aggr: Total no. of aggregates queued +- * @a_queued_hw: Total AMPDUs queued to hardware +-- * @a_queued_sw: Total AMPDUs queued to software queues +- * @a_completed: Total AMPDUs completed +- * @a_retries: No. of AMPDUs retried (SW) +- * @a_xretries: No. of AMPDUs dropped due to xretries +-@@ -174,7 +173,6 @@ struct ath_tx_stats { +- u32 xretries; +- u32 a_aggr; +- u32 a_queued_hw; +-- u32 a_queued_sw; +- u32 a_completed; +- u32 a_retries; +- u32 a_xretries; +---- a/drivers/net/wireless/ath/ath9k/debug_sta.c +-+++ b/drivers/net/wireless/ath/ath9k/debug_sta.c +-@@ -52,8 +52,8 @@ static ssize_t read_file_node_aggr(struc +- "TID", "SEQ_START", "SEQ_NEXT", "BAW_SIZE", +- "BAW_HEAD", "BAW_TAIL", "BAR_IDX", "SCHED", "PAUSED"); +- +-- for (tidno = 0, tid = &an->tid[tidno]; +-- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { +-+ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +-+ tid = ATH_STA_2_TID(an->sta, tidno); +- txq = tid->txq; +- ath_txq_lock(sc, txq); +- if (tid->active) { +---- a/drivers/net/wireless/ath/ath9k/init.c +-+++ b/drivers/net/wireless/ath/ath9k/init.c +-@@ -358,7 +358,6 @@ static int ath9k_init_queues(struct ath_ +- for (i = 0; i < IEEE80211_NUM_ACS; i++) { +- sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i); +- sc->tx.txq_map[i]->mac80211_qnum = i; +-- sc->tx.txq_max_pending[i] = ATH_MAX_QDEPTH; +- } +- return 0; +- } +-@@ -873,6 +872,7 @@ static void ath9k_set_hw_capab(struct at +- hw->max_rate_tries = 10; +- hw->sta_data_size = sizeof(struct ath_node); +- hw->vif_data_size = sizeof(struct ath_vif); +-+ hw->txq_data_size = sizeof(struct ath_atx_tid); +- hw->extra_tx_headroom = 4; +- +- hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1; +---- a/drivers/net/wireless/ath/ath9k/main.c +-+++ b/drivers/net/wireless/ath/ath9k/main.c +-@@ -2695,4 +2695,5 @@ struct ieee80211_ops ath9k_ops = { +- .sw_scan_start = ath9k_sw_scan_start, +- .sw_scan_complete = ath9k_sw_scan_complete, +- .get_txpower = ath9k_get_txpower, +-+ .wake_tx_queue = ath9k_wake_tx_queue, +- }; +---- a/drivers/net/wireless/ath/ath9k/xmit.c +-+++ b/drivers/net/wireless/ath/ath9k/xmit.c +-@@ -65,6 +65,8 @@ static struct ath_buf *ath_tx_setup_buff +- struct ath_txq *txq, +- struct ath_atx_tid *tid, +- struct sk_buff *skb); +-+static int ath_tx_prepare(struct ieee80211_hw *hw, struct sk_buff *skb, +-+ struct ath_tx_control *txctl); +- +- enum { +- MCS_HT20, +-@@ -118,6 +120,26 @@ static void ath_tx_queue_tid(struct ath_ +- list_add_tail(&tid->list, list); +- } +- +-+void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue) +-+{ +-+ struct ath_softc *sc = hw->priv; +-+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); +-+ struct ath_atx_tid *tid = (struct ath_atx_tid *) queue->drv_priv; +-+ struct ath_txq *txq = tid->txq; +-+ +-+ ath_dbg(common, QUEUE, "Waking TX queue: %pM (%d)\n", +-+ queue->sta ? queue->sta->addr : queue->vif->addr, +-+ tid->tidno); +-+ +-+ ath_txq_lock(sc, txq); +-+ +-+ tid->has_queued = true; +-+ ath_tx_queue_tid(sc, txq, tid); +-+ ath_txq_schedule(sc, txq); +-+ +-+ ath_txq_unlock(sc, txq); +-+} +-+ +- static struct ath_frame_info *get_frame_info(struct sk_buff *skb) +- { +- struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); +-@@ -160,7 +182,6 @@ static void ath_set_rates(struct ieee802 +- static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, +- struct sk_buff *skb) +- { +-- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); +- struct ath_frame_info *fi = get_frame_info(skb); +- int q = fi->txq; +- +-@@ -171,14 +192,6 @@ static void ath_txq_skb_done(struct ath_ +- if (WARN_ON(--txq->pending_frames < 0)) +- txq->pending_frames = 0; +- +-- if (txq->stopped && +-- txq->pending_frames < sc->tx.txq_max_pending[q]) { +-- if (ath9k_is_chanctx_enabled()) +-- ieee80211_wake_queue(sc->hw, info->hw_queue); +-- else +-- ieee80211_wake_queue(sc->hw, q); +-- txq->stopped = false; +-- } +- } +- +- static struct ath_atx_tid * +-@@ -188,9 +201,47 @@ ath_get_skb_tid(struct ath_softc *sc, st +- return ATH_AN_2_TID(an, tidno); +- } +- +-+static struct sk_buff * +-+ath_tid_pull(struct ath_atx_tid *tid) +-+{ +-+ struct ath_softc *sc = tid->an->sc; +-+ struct ieee80211_hw *hw = sc->hw; +-+ struct ath_tx_control txctl = { +-+ .txq = tid->txq, +-+ .sta = tid->an->sta, +-+ }; +-+ struct sk_buff *skb; +-+ struct ath_frame_info *fi; +-+ int q; +-+ +-+ if (!tid->has_queued) +-+ return NULL; +-+ +-+ skb = ieee80211_tx_dequeue(hw, container_of((void*)tid, struct ieee80211_txq, drv_priv)); +-+ if (!skb) { +-+ tid->has_queued = false; +-+ return NULL; +-+ } +-+ +-+ if (ath_tx_prepare(hw, skb, &txctl)) { +-+ ieee80211_free_txskb(hw, skb); +-+ return NULL; +-+ } +-+ +-+ q = skb_get_queue_mapping(skb); +-+ if (tid->txq == sc->tx.txq_map[q]) { +-+ fi = get_frame_info(skb); +-+ fi->txq = q; +-+ ++tid->txq->pending_frames; +-+ } +-+ +-+ return skb; +-+ } +-+ +-+ +- static bool ath_tid_has_buffered(struct ath_atx_tid *tid) +- { +-- return !skb_queue_empty(&tid->buf_q) || !skb_queue_empty(&tid->retry_q); +-+ return !skb_queue_empty(&tid->retry_q) || tid->has_queued; +- } +- +- static struct sk_buff *ath_tid_dequeue(struct ath_atx_tid *tid) +-@@ -199,46 +250,11 @@ static struct sk_buff *ath_tid_dequeue(s +- +- skb = __skb_dequeue(&tid->retry_q); +- if (!skb) +-- skb = __skb_dequeue(&tid->buf_q); +-+ skb = ath_tid_pull(tid); +- +- return skb; +- } +- +--/* +-- * ath_tx_tid_change_state: +-- * - clears a-mpdu flag of previous session +-- * - force sequence number allocation to fix next BlockAck Window +-- */ +--static void +--ath_tx_tid_change_state(struct ath_softc *sc, struct ath_atx_tid *tid) +--{ +-- struct ath_txq *txq = tid->txq; +-- struct ieee80211_tx_info *tx_info; +-- struct sk_buff *skb, *tskb; +-- struct ath_buf *bf; +-- struct ath_frame_info *fi; +-- +-- skb_queue_walk_safe(&tid->buf_q, skb, tskb) { +-- fi = get_frame_info(skb); +-- bf = fi->bf; +-- +-- tx_info = IEEE80211_SKB_CB(skb); +-- tx_info->flags &= ~IEEE80211_TX_CTL_AMPDU; +-- +-- if (bf) +-- continue; +-- +-- bf = ath_tx_setup_buffer(sc, txq, tid, skb); +-- if (!bf) { +-- __skb_unlink(skb, &tid->buf_q); +-- ath_txq_skb_done(sc, txq, skb); +-- ieee80211_free_txskb(sc->hw, skb); +-- continue; +-- } +-- } +-- +--} +-- +- static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) +- { +- struct ath_txq *txq = tid->txq; +-@@ -873,20 +889,16 @@ static int ath_compute_num_delims(struct +- +- static struct ath_buf * +- ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq, +-- struct ath_atx_tid *tid, struct sk_buff_head **q) +-+ struct ath_atx_tid *tid) +- { +- struct ieee80211_tx_info *tx_info; +- struct ath_frame_info *fi; +-- struct sk_buff *skb; +-+ struct sk_buff *skb, *first_skb = NULL; +- struct ath_buf *bf; +- u16 seqno; +- +- while (1) { +-- *q = &tid->retry_q; +-- if (skb_queue_empty(*q)) +-- *q = &tid->buf_q; +-- +-- skb = skb_peek(*q); +-+ skb = ath_tid_dequeue(tid); +- if (!skb) +- break; +- +-@@ -898,7 +910,6 @@ ath_tx_get_tid_subframe(struct ath_softc +- bf->bf_state.stale = false; +- +- if (!bf) { +-- __skb_unlink(skb, *q); +- ath_txq_skb_done(sc, txq, skb); +- ieee80211_free_txskb(sc->hw, skb); +- continue; +-@@ -927,8 +938,19 @@ ath_tx_get_tid_subframe(struct ath_softc +- seqno = bf->bf_state.seqno; +- +- /* do not step over block-ack window */ +-- if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) +-+ if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) { +-+ __skb_queue_tail(&tid->retry_q, skb); +-+ +-+ /* If there are other skbs in the retry q, they are +-+ * probably within the BAW, so loop immediately to get +-+ * one of them. Otherwise the queue can get stuck. */ +-+ if (!skb_queue_is_first(&tid->retry_q, skb) && skb != first_skb) { +-+ if(!first_skb) /* infinite loop prevention */ +-+ first_skb = skb; +-+ continue; +-+ } +- break; +-+ } +- +- if (tid->bar_index > ATH_BA_INDEX(tid->seq_start, seqno)) { +- struct ath_tx_status ts = {}; +-@@ -936,7 +958,6 @@ ath_tx_get_tid_subframe(struct ath_softc +- +- INIT_LIST_HEAD(&bf_head); +- list_add(&bf->list, &bf_head); +-- __skb_unlink(skb, *q); +- ath_tx_update_baw(sc, tid, seqno); +- ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); +- continue; +-@@ -948,11 +969,10 @@ ath_tx_get_tid_subframe(struct ath_softc +- return NULL; +- } +- +--static bool +-+static int +- ath_tx_form_aggr(struct ath_softc *sc, struct ath_txq *txq, +- struct ath_atx_tid *tid, struct list_head *bf_q, +-- struct ath_buf *bf_first, struct sk_buff_head *tid_q, +-- int *aggr_len) +-+ struct ath_buf *bf_first) +- { +- #define PADBYTES(_len) ((4 - ((_len) % 4)) % 4) +- struct ath_buf *bf = bf_first, *bf_prev = NULL; +-@@ -962,12 +982,13 @@ ath_tx_form_aggr(struct ath_softc *sc, s +- struct ieee80211_tx_info *tx_info; +- struct ath_frame_info *fi; +- struct sk_buff *skb; +-- bool closed = false; +-+ +- +- bf = bf_first; +- aggr_limit = ath_lookup_rate(sc, bf, tid); +- +-- do { +-+ while (bf) +-+ { +- skb = bf->bf_mpdu; +- fi = get_frame_info(skb); +- +-@@ -976,12 +997,12 @@ ath_tx_form_aggr(struct ath_softc *sc, s +- if (nframes) { +- if (aggr_limit < al + bpad + al_delta || +- ath_lookup_legacy(bf) || nframes >= h_baw) +-- break; +-+ goto stop; +- +- tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); +- if ((tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) || +- !(tx_info->flags & IEEE80211_TX_CTL_AMPDU)) +-- break; +-+ goto stop; +- } +- +- /* add padding for previous frame to aggregation length */ +-@@ -1003,20 +1024,18 @@ ath_tx_form_aggr(struct ath_softc *sc, s +- ath_tx_addto_baw(sc, tid, bf); +- bf->bf_state.ndelim = ndelim; +- +-- __skb_unlink(skb, tid_q); +- list_add_tail(&bf->list, bf_q); +- if (bf_prev) +- bf_prev->bf_next = bf; +- +- bf_prev = bf; +- +-- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); +-- if (!bf) { +-- closed = true; +-- break; +-- } +-- } while (ath_tid_has_buffered(tid)); +-- +-+ bf = ath_tx_get_tid_subframe(sc, txq, tid); +-+ } +-+ goto finish; +-+stop: +-+ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); +-+finish: +- bf = bf_first; +- bf->bf_lastbf = bf_prev; +- +-@@ -1027,9 +1046,7 @@ ath_tx_form_aggr(struct ath_softc *sc, s +- TX_STAT_INC(txq->axq_qnum, a_aggr); +- } +- +-- *aggr_len = al; +-- +-- return closed; +-+ return al; +- #undef PADBYTES +- } +- +-@@ -1406,18 +1423,15 @@ static void ath_tx_fill_desc(struct ath_ +- static void +- ath_tx_form_burst(struct ath_softc *sc, struct ath_txq *txq, +- struct ath_atx_tid *tid, struct list_head *bf_q, +-- struct ath_buf *bf_first, struct sk_buff_head *tid_q) +-+ struct ath_buf *bf_first) +- { +- struct ath_buf *bf = bf_first, *bf_prev = NULL; +-- struct sk_buff *skb; +- int nframes = 0; +- +- do { +- struct ieee80211_tx_info *tx_info; +-- skb = bf->bf_mpdu; +- +- nframes++; +-- __skb_unlink(skb, tid_q); +- list_add_tail(&bf->list, bf_q); +- if (bf_prev) +- bf_prev->bf_next = bf; +-@@ -1426,13 +1440,15 @@ ath_tx_form_burst(struct ath_softc *sc, +- if (nframes >= 2) +- break; +- +-- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); +-+ bf = ath_tx_get_tid_subframe(sc, txq, tid); +- if (!bf) +- break; +- +- tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); +-- if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) +-+ if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) { +-+ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); +- break; +-+ } +- +- ath_set_rates(tid->an->vif, tid->an->sta, bf, false); +- } while (1); +-@@ -1443,34 +1459,33 @@ static bool ath_tx_sched_aggr(struct ath +- { +- struct ath_buf *bf; +- struct ieee80211_tx_info *tx_info; +-- struct sk_buff_head *tid_q; +- struct list_head bf_q; +- int aggr_len = 0; +-- bool aggr, last = true; +-+ bool aggr; +- +- if (!ath_tid_has_buffered(tid)) +- return false; +- +- INIT_LIST_HEAD(&bf_q); +- +-- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); +-+ bf = ath_tx_get_tid_subframe(sc, txq, tid); +- if (!bf) +- return false; +- +- tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); +- aggr = !!(tx_info->flags & IEEE80211_TX_CTL_AMPDU); +- if ((aggr && txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) || +-- (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { +-+ (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { +-+ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); +- *stop = true; +- return false; +- } +- +- ath_set_rates(tid->an->vif, tid->an->sta, bf, false); +- if (aggr) +-- last = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf, +-- tid_q, &aggr_len); +-+ aggr_len = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf); +- else +-- ath_tx_form_burst(sc, txq, tid, &bf_q, bf, tid_q); +-+ ath_tx_form_burst(sc, txq, tid, &bf_q, bf); +- +- if (list_empty(&bf_q)) +- return false; +-@@ -1513,9 +1528,6 @@ int ath_tx_aggr_start(struct ath_softc * +- an->mpdudensity = density; +- } +- +-- /* force sequence number allocation for pending frames */ +-- ath_tx_tid_change_state(sc, txtid); +-- +- txtid->active = true; +- *ssn = txtid->seq_start = txtid->seq_next; +- txtid->bar_index = -1; +-@@ -1540,7 +1552,6 @@ void ath_tx_aggr_stop(struct ath_softc * +- ath_txq_lock(sc, txq); +- txtid->active = false; +- ath_tx_flush_tid(sc, txtid); +-- ath_tx_tid_change_state(sc, txtid); +- ath_txq_unlock_complete(sc, txq); +- } +- +-@@ -1550,14 +1561,12 @@ void ath_tx_aggr_sleep(struct ieee80211_ +- struct ath_common *common = ath9k_hw_common(sc->sc_ah); +- struct ath_atx_tid *tid; +- struct ath_txq *txq; +-- bool buffered; +- int tidno; +- +- ath_dbg(common, XMIT, "%s called\n", __func__); +- +-- for (tidno = 0, tid = &an->tid[tidno]; +-- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { +-- +-+ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +-+ tid = ATH_AN_2_TID(an, tidno); +- txq = tid->txq; +- +- ath_txq_lock(sc, txq); +-@@ -1567,13 +1576,12 @@ void ath_tx_aggr_sleep(struct ieee80211_ +- continue; +- } +- +-- buffered = ath_tid_has_buffered(tid); +-+ if (!skb_queue_empty(&tid->retry_q)) +-+ ieee80211_sta_set_buffered(sta, tid->tidno, true); +- +- list_del_init(&tid->list); +- +- ath_txq_unlock(sc, txq); +-- +-- ieee80211_sta_set_buffered(sta, tidno, buffered); +- } +- } +- +-@@ -1586,19 +1594,16 @@ void ath_tx_aggr_wakeup(struct ath_softc +- +- ath_dbg(common, XMIT, "%s called\n", __func__); +- +-- for (tidno = 0, tid = &an->tid[tidno]; +-- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { +-- +-+ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +-+ tid = ATH_AN_2_TID(an, tidno); +- txq = tid->txq; +- +- ath_txq_lock(sc, txq); +- tid->clear_ps_filter = true; +-- +- if (ath_tid_has_buffered(tid)) { +- ath_tx_queue_tid(sc, txq, tid); +- ath_txq_schedule(sc, txq); +- } +-- +- ath_txq_unlock_complete(sc, txq); +- } +- } +-@@ -1621,11 +1626,6 @@ void ath_tx_aggr_resume(struct ath_softc +- +- tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; +- +-- if (ath_tid_has_buffered(tid)) { +-- ath_tx_queue_tid(sc, txq, tid); +-- ath_txq_schedule(sc, txq); +-- } +-- +- ath_txq_unlock_complete(sc, txq); +- } +- +-@@ -1641,7 +1641,6 @@ void ath9k_release_buffered_frames(struc +- struct ieee80211_tx_info *info; +- struct list_head bf_q; +- struct ath_buf *bf_tail = NULL, *bf; +-- struct sk_buff_head *tid_q; +- int sent = 0; +- int i; +- +-@@ -1656,11 +1655,10 @@ void ath9k_release_buffered_frames(struc +- +- ath_txq_lock(sc, tid->txq); +- while (nframes > 0) { +-- bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid, &tid_q); +-+ bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid); +- if (!bf) +- break; +- +-- __skb_unlink(bf->bf_mpdu, tid_q); +- list_add_tail(&bf->list, &bf_q); +- ath_set_rates(tid->an->vif, tid->an->sta, bf, true); +- if (bf_isampdu(bf)) { +-@@ -1675,7 +1673,7 @@ void ath9k_release_buffered_frames(struc +- sent++; +- TX_STAT_INC(txq->axq_qnum, a_queued_hw); +- +-- if (an->sta && !ath_tid_has_buffered(tid)) +-+ if (an->sta && skb_queue_empty(&tid->retry_q)) +- ieee80211_sta_set_buffered(an->sta, i, false); +- } +- ath_txq_unlock_complete(sc, tid->txq); +-@@ -1902,13 +1900,7 @@ bool ath_drain_all_txq(struct ath_softc +- if (!ATH_TXQ_SETUP(sc, i)) +- continue; +- +-- /* +-- * The caller will resume queues with ieee80211_wake_queues. +-- * Mark the queue as not stopped to prevent ath_tx_complete +-- * from waking the queue too early. +-- */ +- txq = &sc->tx.txq[i]; +-- txq->stopped = false; +- ath_draintxq(sc, txq); +- } +- +-@@ -2308,15 +2300,12 @@ int ath_tx_start(struct ieee80211_hw *hw +- struct ath_txq *txq = txctl->txq; +- struct ath_atx_tid *tid = NULL; +- struct ath_buf *bf; +-- bool queue, ps_resp; +-+ bool ps_resp; +- int q, ret; +- +- if (vif) +- avp = (void *)vif->drv_priv; +- +-- if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) +-- txctl->force_channel = true; +-- +- ps_resp = !!(info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE); +- +- ret = ath_tx_prepare(hw, skb, txctl); +-@@ -2331,63 +2320,13 @@ int ath_tx_start(struct ieee80211_hw *hw +- +- q = skb_get_queue_mapping(skb); +- +-+ if (ps_resp) +-+ txq = sc->tx.uapsdq; +-+ +- ath_txq_lock(sc, txq); +- if (txq == sc->tx.txq_map[q]) { +- fi->txq = q; +-- if (++txq->pending_frames > sc->tx.txq_max_pending[q] && +-- !txq->stopped) { +-- if (ath9k_is_chanctx_enabled()) +-- ieee80211_stop_queue(sc->hw, info->hw_queue); +-- else +-- ieee80211_stop_queue(sc->hw, q); +-- txq->stopped = true; +-- } +-- } +-- +-- queue = ieee80211_is_data_present(hdr->frame_control); +-- +-- /* If chanctx, queue all null frames while NOA could be there */ +-- if (ath9k_is_chanctx_enabled() && +-- ieee80211_is_nullfunc(hdr->frame_control) && +-- !txctl->force_channel) +-- queue = true; +-- +-- /* Force queueing of all frames that belong to a virtual interface on +-- * a different channel context, to ensure that they are sent on the +-- * correct channel. +-- */ +-- if (((avp && avp->chanctx != sc->cur_chan) || +-- sc->cur_chan->stopped) && !txctl->force_channel) { +-- if (!txctl->an) +-- txctl->an = &avp->mcast_node; +-- queue = true; +-- ps_resp = false; +-- } +-- +-- if (txctl->an && queue) +-- tid = ath_get_skb_tid(sc, txctl->an, skb); +-- +-- if (ps_resp) { +-- ath_txq_unlock(sc, txq); +-- txq = sc->tx.uapsdq; +-- ath_txq_lock(sc, txq); +-- } else if (txctl->an && queue) { +-- WARN_ON(tid->txq != txctl->txq); +-- +-- if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) +-- tid->clear_ps_filter = true; +-- +-- /* +-- * Add this frame to software queue for scheduling later +-- * for aggregation. +-- */ +-- TX_STAT_INC(txq->axq_qnum, a_queued_sw); +-- __skb_queue_tail(&tid->buf_q, skb); +-- if (!txctl->an->sleeping) +-- ath_tx_queue_tid(sc, txq, tid); +-- +-- ath_txq_schedule(sc, txq); +-- goto out; +-+ ++txq->pending_frames; +- } +- +- bf = ath_tx_setup_buffer(sc, txq, tid, skb); +-@@ -2871,9 +2810,8 @@ void ath_tx_node_init(struct ath_softc * +- struct ath_atx_tid *tid; +- int tidno, acno; +- +-- for (tidno = 0, tid = &an->tid[tidno]; +-- tidno < IEEE80211_NUM_TIDS; +-- tidno++, tid++) { +-+ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +-+ tid = ATH_AN_2_TID(an, tidno); +- tid->an = an; +- tid->tidno = tidno; +- tid->seq_start = tid->seq_next = 0; +-@@ -2881,11 +2819,14 @@ void ath_tx_node_init(struct ath_softc * +- tid->baw_head = tid->baw_tail = 0; +- tid->active = false; +- tid->clear_ps_filter = true; +-- __skb_queue_head_init(&tid->buf_q); +-+ tid->has_queued = false; +- __skb_queue_head_init(&tid->retry_q); +- INIT_LIST_HEAD(&tid->list); +- acno = TID_TO_WME_AC(tidno); +- tid->txq = sc->tx.txq_map[acno]; +-+ +-+ if (!an->sta) +-+ break; /* just one multicast ath_atx_tid */ +- } +- } +- +-@@ -2895,9 +2836,8 @@ void ath_tx_node_cleanup(struct ath_soft +- struct ath_txq *txq; +- int tidno; +- +-- for (tidno = 0, tid = &an->tid[tidno]; +-- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { +-- +-+ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { +-+ tid = ATH_AN_2_TID(an, tidno); +- txq = tid->txq; +- +- ath_txq_lock(sc, txq); +-@@ -2909,6 +2849,9 @@ void ath_tx_node_cleanup(struct ath_soft +- tid->active = false; +- +- ath_txq_unlock(sc, txq); +-+ +-+ if (!an->sta) +-+ break; /* just one multicast ath_atx_tid */ +- } +- } +- From a606b32b17a84474500520b8f461889d18a29f04 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 15 Oct 2016 19:11:35 +0200 Subject: [PATCH 017/126] ar71xx-generic: set region code for TL-WA901ND v4 and remove BROKEN Tested-by: Jannis Pinter --- docs/index.rst | 2 +- ...egion-code-for-TP-Link-TL-WA901ND-v4.patch | 29 +++++++++++++++++++ targets/ar71xx-generic/profiles.mk | 4 +-- 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 patches/openwrt/0076-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch diff --git a/docs/index.rst b/docs/index.rst index f1f36c29..0ddd1878 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -173,7 +173,7 @@ ar71xx-generic - TL-WA830RE (v1, v2) - TL-WA850RE (v1) - TL-WA860RE (v1) - - TL-WA901N/ND (v1, v2, v3) + - TL-WA901N/ND (v1, v2, v3, v4) - TL-WDR3500 (v1) - TL-WDR3600 (v1) - TL-WDR4300 (v1) diff --git a/patches/openwrt/0076-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch b/patches/openwrt/0076-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch new file mode 100644 index 00000000..448584cf --- /dev/null +++ b/patches/openwrt/0076-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch @@ -0,0 +1,29 @@ +From: Matthias Schiffer +Date: Sat, 15 Oct 2016 19:10:33 +0200 +Subject: ar71xx: set EU region code for TP-Link TL-WA901ND v4 + +There is no US firmware for the TL-WA901ND v4 yet, so we'll just +unconditionally set the EU region for now. + +This makes LEDE flashable on these devices again. The format of the region +string is slightly different from the one used on the Archer C7 that is +generated by mktplinkfw (the second half of the region string is missing), +but it's similar enough to make it work. + +Tested-by: Jannis Pinter +Signed-off-by: Matthias Schiffer + +Backport of LEDE 83f7ec31f8f9641ef842212c45db61b72682debf + +diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile +index cbd8a49..ac21e71 100644 +--- a/target/linux/ar71xx/image/Makefile ++++ b/target/linux/ar71xx/image/Makefile +@@ -736,6 +736,7 @@ define Device/tl-wa901nd-v4 + BOARDNAME := TL-WA901ND-v4 + DEVICE_PROFILE := TLWA901 + TPLINK_HWID := 0x09010004 ++ IMAGE/factory.bin := append-rootfs | mktplinkfw factory -C EU + endef + + TARGET_DEVICES += tl-wa901nd-v3 tl-wa901nd-v4 diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index a8a1740c..416a4ebd 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -136,9 +136,7 @@ $(eval $(call GluonProfile,TLWA901)) $(eval $(call GluonModel,TLWA901,tl-wa901nd-v1,tp-link-tl-wa901n-nd-v1)) $(eval $(call GluonModel,TLWA901,tl-wa901nd-v2,tp-link-tl-wa901n-nd-v2)) $(eval $(call GluonModel,TLWA901,tl-wa901nd-v3,tp-link-tl-wa901n-nd-v3)) -ifneq ($(BROKEN),) -$(eval $(call GluonModel,TLWA901,tl-wa901nd-v4,tp-link-tl-wa901n-nd-v4)) # BROKEN: untested -endif +$(eval $(call GluonModel,TLWA901,tl-wa901nd-v4,tp-link-tl-wa901n-nd-v4)) # TL-MR13U v1 $(eval $(call GluonProfile,TLMR13U)) From 9aa31f18e3a444854128dc7689072e289a0562f0 Mon Sep 17 00:00:00 2001 From: Franz Pletz Date: Wed, 19 Oct 2016 19:06:02 +0200 Subject: [PATCH 018/126] docs: mention dependency on wget (#906) Tested build on a minimal Ubuntu 16.04 container image without wget. --- docs/user/getting_started.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/user/getting_started.rst b/docs/user/getting_started.rst index 813eb3e4..1ebe37a1 100644 --- a/docs/user/getting_started.rst +++ b/docs/user/getting_started.rst @@ -36,6 +36,7 @@ freshly installed Debian Wheezy system the following packages are required: * `libncurses-dev` (actually `libncurses5-dev`) * `libz-dev` (actually `zlib1g-dev`) * `libssl-dev` +* `wget` Building the images From 30811f7f1bd214dce161f7f3319801f71d575115 Mon Sep 17 00:00:00 2001 From: Ruben Barkow Date: Thu, 20 Oct 2016 16:44:04 +0200 Subject: [PATCH 019/126] Docs: autoupdater->build instructions num cores +1 (#908) --- docs/features/autoupdater.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/features/autoupdater.rst b/docs/features/autoupdater.rst index 8c4ca73f..7cfd0f21 100644 --- a/docs/features/autoupdater.rst +++ b/docs/features/autoupdater.rst @@ -28,7 +28,8 @@ A fully automated nightly build could use the following commands: (cd site && git pull) make update make clean - make -j5 GLUON_TARGET=ar71xx-generic GLUON_BRANCH=experimental + NUM_CORES_PLUS_ONE=$(expr $(nproc) + 1) + make -j$NUM_CORES_PLUS_ONE GLUON_TARGET=ar71xx-generic GLUON_BRANCH=experimental make manifest GLUON_BRANCH=experimental contrib/sign.sh $SECRETKEY output/images/sysupgrade/experimental.manifest From e80f751a85c9d8bd9052d2a0760447efe89f815f Mon Sep 17 00:00:00 2001 From: Brother-Lal Date: Mon, 24 Oct 2016 14:18:01 +0200 Subject: [PATCH 020/126] fix error in statuspage if cookies are disabled (#912) If cookies are disabled, the Statuspage only displays an empty ("Not connected") This checks if the localStorage API is available and working and only uses it in this case Also allows better backwards compatibility. --- package/gluon-status-page/src/js/main.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/package/gluon-status-page/src/js/main.js b/package/gluon-status-page/src/js/main.js index 3bdbe2a0..eb668698 100644 --- a/package/gluon-status-page/src/js/main.js +++ b/package/gluon-status-page/src/js/main.js @@ -83,7 +83,17 @@ require([ "bacon" return a } - if (localStorage.nodes) + var lsavailable = false + try { + localStorage.setItem("t", "t") + localStorage.removeItem("t") + lsavailable = true + } catch(e) { + lsavailable = false + } + + + if ( lsavailable && localStorage.nodes) JSON.parse(localStorage.nodes).forEach(nodesBusIn.push) nodesBus.map(".nodes").onValue(function (nodes) { @@ -92,7 +102,8 @@ require([ "bacon" for (var k in nodes) out.push(nodes[k]) - localStorage.nodes = JSON.stringify(out) + if (lsavailable) + localStorage.nodes = JSON.stringify(out) }) var bootstrap = Helper.getJSON(bootstrapUrl) From 740c60c7e43f7a0d93d639843fa05beac4e31021 Mon Sep 17 00:00:00 2001 From: Brother-Lal Date: Mon, 24 Oct 2016 14:43:12 +0200 Subject: [PATCH 021/126] gluon-status-page: add hint to enable JavaScript if it is disabled (#913) --- package/gluon-status-page/src/index.html.m4 | 1 + 1 file changed, 1 insertion(+) diff --git a/package/gluon-status-page/src/index.html.m4 b/package/gluon-status-page/src/index.html.m4 index 489c1cf0..2726f2e3 100644 --- a/package/gluon-status-page/src/index.html.m4 +++ b/package/gluon-status-page/src/index.html.m4 @@ -13,5 +13,6 @@ + From 095583ba9221b94eb8b29aabfacd65f39a77de18 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 2 Nov 2016 17:33:54 +0100 Subject: [PATCH 022/126] Update OpenWrt base --- modules | 2 +- .../0007-mac80211-hostapd-iw-.-update.patch | 31 --- .../0013-fix-UBNT-XM-model-detection.patch | 6 +- ...HWREV-on-upgrades-of-TP-LINK-devices.patch | 4 +- ...a-space-on-some-TP-LINK-like-devices.patch | 2 +- ...XX_MODEL-to-match-labels-image-names.patch | 2 +- ...r71xx-build-image-for-TL-WR710N-v2.1.patch | 2 +- ...ion-register-bitmask-for-QCA956x-SoC.patch | 2 +- .../0034-ar71xx-update-QCA956x-support.patch | 6 +- ...upport-for-Ubiquiti-UniFi-AP-AC-LITE.patch | 60 ++--- ...r71xx-Rename-unifiac-to-unifiac-lite.patch | 28 +-- ...support-for-Ubiquiti-UniFi-AP-AC-PRO.patch | 38 ++-- ...able-control-of-all-LEDs-and-buttons.patch | 4 +- .../0047-ar71xx-add-GL-AR150-support.patch | 22 +- ...-support-for-TP-LINK-TL-WR842N-ND-v3.patch | 89 ++++---- ...WR841N-v11-LEDs-use-separate-machine.patch | 209 ------------------ ...-x86-generic-enable-CONFIG_SATA_VIA.patch} | 0 ...cy-of-install-shared-so-make-target.patch} | 0 ...-detection-for-D-Link-DIR-505-A1-A2.patch} | 2 +- ...05-status-LED-as-ethernet-indicator.patch} | 4 +- ...0-enable-LNA-for-CPE210-220-510-520.patch} | 0 ...e-into-2-profiles-cpe210-and-cpe510.patch} | 18 +- ...ader.c-Add-support-for-Archer-C2600.patch} | 0 ...er-split-CPE210-from-CPE510-profile.patch} | 4 +- ...5c21ae0ede4e15e66cbd801b9fb502531df.patch} | 0 ...71xx-Added-support-for-TL-WA801NDv3.patch} | 14 +- ...2bc0ea4010ddbfbd738453c9db70988a57c.patch} | 0 ...upport-for-new-TP-Link-region-codes.patch} | 2 +- ...are-add-ath10k-firmware-qca988x-11s.patch} | 0 ...e-compensation-support-patch-FS-111.patch} | 0 ...ng-patch-until-it-is-fixed-properly.patch} | 0 ...073-kernel-add-fix-for-CVE-2016-7117.patch | 105 --------- ...gion-code-for-TP-Link-TL-WA901ND-v4.patch} | 2 +- 33 files changed, 156 insertions(+), 502 deletions(-) delete mode 100644 patches/openwrt/0059-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch rename patches/openwrt/{0060-x86-generic-enable-CONFIG_SATA_VIA.patch => 0059-x86-generic-enable-CONFIG_SATA_VIA.patch} (100%) rename patches/openwrt/{0061-libpcap-fix-dependency-of-install-shared-so-make-target.patch => 0060-libpcap-fix-dependency-of-install-shared-so-make-target.patch} (100%) rename patches/openwrt/{0062-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch => 0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch} (97%) rename patches/openwrt/{0063-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch => 0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch} (94%) rename patches/openwrt/{0064-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch => 0063-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch} (100%) rename patches/openwrt/{0065-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch => 0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch} (95%) rename patches/openwrt/{0066-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch => 0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch} (100%) rename patches/openwrt/{0067-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch => 0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch} (97%) rename patches/openwrt/{0068-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch => 0067-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch} (100%) rename patches/openwrt/{0069-ar71xx-Added-support-for-TL-WA801NDv3.patch => 0068-ar71xx-Added-support-for-TL-WA801NDv3.patch} (98%) rename patches/openwrt/{0070-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch => 0069-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch} (100%) rename patches/openwrt/{0071-ar71xx-backport-support-for-new-TP-Link-region-codes.patch => 0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch} (97%) rename patches/openwrt/{0072-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch => 0071-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch} (100%) rename patches/openwrt/{0074-ath9k-revert-temperature-compensation-support-patch-FS-111.patch => 0072-ath9k-revert-temperature-compensation-support-patch-FS-111.patch} (100%) rename patches/openwrt/{0075-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch => 0073-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch} (100%) delete mode 100644 patches/openwrt/0073-kernel-add-fix-for-CVE-2016-7117.patch rename patches/openwrt/{0076-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch => 0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch} (97%) diff --git a/modules b/modules index 555d6995..2c1c8e91 100644 --- a/modules +++ b/modules @@ -1,7 +1,7 @@ GLUON_FEEDS='openwrt gluon routing luci' OPENWRT_REPO=git://github.com/openwrt/openwrt.git -OPENWRT_COMMIT=b21852c60f82bbd53c19098fc0eb1f4cfccfaf35 +OPENWRT_COMMIT=0f757bd2606971252f901ef3faf4dbd0086315f7 OPENWRT_BRANCH=chaos_calmer PACKAGES_OPENWRT_REPO=git://github.com/openwrt/packages.git diff --git a/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch index 64eea76e..ef8c2b72 100644 --- a/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch +++ b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch @@ -20819,37 +20819,6 @@ index e49dd48..bd851e6 100644 $(PKG_BUILD_DIR)/firmware/mt7662_rom_patch.bin \ $(PKG_BUILD_DIR)/firmware/mt7662.bin \ $(1)/lib/firmware -diff --git a/package/kernel/mwlwifi/Makefile b/package/kernel/mwlwifi/Makefile -index f59943d..b36486d 100644 ---- a/package/kernel/mwlwifi/Makefile -+++ b/package/kernel/mwlwifi/Makefile -@@ -8,7 +8,7 @@ - include $(TOPDIR)/rules.mk - - PKG_NAME:=mwlwifi --PKG_VERSION:=10.3.0.18-20160804 -+PKG_VERSION:=10.3.0.18-20160823-1 - PKG_RELEASE=1 - - PKG_LICENSE:=ISC -@@ -17,7 +17,7 @@ PKG_LICENSE_FILES:= - PKG_SOURCE_URL:=https://github.com/kaloz/mwlwifi - PKG_SOURCE_PROTO:=git - PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) --PKG_SOURCE_VERSION:=d48847cc83954930fdcd98818bbf33e75707b8e1 -+PKG_SOURCE_VERSION:=af606563453c819fac156faf2b15b9caef844329 - PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz - - PKG_MAINTAINER:=Imre Kaloz -@@ -29,7 +29,7 @@ include $(INCLUDE_DIR)/package.mk - define KernelPackage/mwlwifi - SUBMENU:=Wireless Drivers - TITLE:=Marvell 88W8864 wireless driver -- DEPENDS:=+kmod-mac80211 +@DRIVER_11N_SUPPORT @PCI_SUPPORT @TARGET_mvebu -+ DEPENDS:=+kmod-mac80211 +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT @PCI_SUPPORT @TARGET_mvebu - FILES:=$(PKG_BUILD_DIR)/mwlwifi.ko - AUTOLOAD:=$(call AutoLoad,50,mac80211 mwlwifi) - endef diff --git a/package/network/services/hostapd/Config.in b/package/network/services/hostapd/Config.in index aee2a15..645888e 100644 --- a/package/network/services/hostapd/Config.in diff --git a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch index 20832071..c1e8e28a 100644 --- a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch +++ b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch @@ -5,7 +5,7 @@ Subject: fix UBNT XM model detection Signed-off-by: Neal Oakey diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 2f4b112..b220aad 100755 +index a9dca58..1985c88 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -64,6 +64,40 @@ wndr3700_board_detect() { @@ -49,7 +49,7 @@ index 2f4b112..b220aad 100755 cybertan_get_hw_magic() { local part -@@ -475,12 +509,14 @@ ar71xx_board_detect() { +@@ -478,12 +512,14 @@ ar71xx_board_detect() { ;; *"Bullet M") name="bullet-m" @@ -64,7 +64,7 @@ index 2f4b112..b220aad 100755 ;; *"Nanostation M XW") name="nanostation-m-xw" -@@ -682,6 +718,7 @@ ar71xx_board_detect() { +@@ -685,6 +721,7 @@ ar71xx_board_detect() { ;; *"Rocket M") name="rocket-m" diff --git a/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch b/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch index ce3fe9c7..5584a904 100644 --- a/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch +++ b/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch @@ -10,7 +10,7 @@ Signed-off-by: Matthias Schiffer Backport of r49105 diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index bf53169..ccccc17 100755 +index 762cd76..024e493 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -66,6 +66,10 @@ tplink_get_image_hwid() { @@ -24,7 +24,7 @@ index bf53169..ccccc17 100755 tplink_get_image_boot_size() { get_image "$@" | dd bs=4 count=1 skip=37 2>/dev/null | hexdump -v -n 4 -e '1/1 "%02x"' } -@@ -371,13 +375,17 @@ platform_check_image() { +@@ -373,13 +377,17 @@ platform_check_image() { } local hwid diff --git a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch index 23e69b37..32f573f4 100644 --- a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch +++ b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch @@ -11,7 +11,7 @@ Signed-off-by: Matthias Schiffer Backport of r49106 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index b220aad..395a012 100755 +index 1985c88..99c808c 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -133,7 +133,7 @@ tplink_board_detect() { diff --git a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch index b7e98439..e56b053b 100644 --- a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch +++ b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch @@ -12,7 +12,7 @@ Signed-off-by: Matthias Schiffer Backport of r49107 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 395a012..131364c 100755 +index 99c808c..4780e2f 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -162,6 +162,10 @@ tplink_board_detect() { diff --git a/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch b/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch index 43e26317..4793bbac 100644 --- a/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch +++ b/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch @@ -11,7 +11,7 @@ Signed off by: Norbert Wegener Backport of r47849 diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 8551399..7184966 100644 +index a8073f2..0783381 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -476,6 +476,15 @@ define Device/tl-wr710n-v2 diff --git a/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch b/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch index 3a9968e3..5d05b286 100644 --- a/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch +++ b/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau Backport of OpenWrt r47363 diff --git a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch -index b5c88e9..d3a14b2 100644 +index 0da8142..2bb4286 100644 --- a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch +++ b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch @@ -529,7 +529,7 @@ diff --git a/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch b/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch index f93c9c75..7406d2f6 100644 --- a/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch +++ b/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch @@ -12,7 +12,7 @@ Signed-off-by: Roman Yeryomin Backport of OpenWrt r47981 diff --git a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch -index d3a14b2..61b8976 100644 +index 2bb4286..61b8976 100644 --- a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch +++ b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch @@ -105,7 +105,7 @@ @@ -327,7 +327,7 @@ index d3a14b2..61b8976 100644 /* * SPI block */ --@@ -766,6 +868,19 @@ +-@@ -774,6 +876,19 @@ +@@ -766,6 +875,19 @@ #define QCA953X_GPIO_OUT_MUX_LED_LINK4 44 #define QCA953X_GPIO_OUT_MUX_LED_LINK5 45 @@ -336,7 +336,7 @@ index d3a14b2..61b8976 100644 #define AR71XX_GPIO_COUNT 16 #define AR7240_GPIO_COUNT 18 #define AR7241_GPIO_COUNT 20 --@@ -774,6 +889,7 @@ +-@@ -782,6 +897,7 @@ +@@ -774,6 +896,7 @@ #define AR934X_GPIO_COUNT 23 #define QCA953X_GPIO_COUNT 18 diff --git a/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch index bfb699d9..9821b367 100644 --- a/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch +++ b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch @@ -8,10 +8,10 @@ Signed-off-by: P.Wassi Backport of OpenWrt r48711 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index c5e39d0..e36c581 100644 +index 486879f..3adc449 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -305,7 +305,8 @@ get_status_led() { +@@ -309,7 +309,8 @@ get_status_led() { unifi) status_led="ubnt:green:dome" ;; @@ -22,10 +22,10 @@ index c5e39d0..e36c581 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index b2b182e..850eac9 100755 +index 032c671..a79376a 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -368,6 +368,7 @@ tl-wa901nd-v3 |\ +@@ -369,6 +369,7 @@ tl-wa901nd-v3 |\ tl-wa901nd-v4 |\ tl-wr703n |\ tube2h |\ @@ -34,10 +34,10 @@ index b2b182e..850eac9 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 131364c..ac77934 100755 +index 4780e2f..0fd139c 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -896,6 +896,9 @@ ar71xx_board_detect() { +@@ -902,6 +902,9 @@ ar71xx_board_detect() { *UniFi) name="unifi" ;; @@ -48,10 +48,10 @@ index 131364c..ac77934 100755 name="uap-pro" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index ccccc17..4793fa9 100755 +index 024e493..fff1c3c 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -251,6 +251,7 @@ platform_check_image() { +@@ -252,6 +252,7 @@ platform_check_image() { wlae-ag300n | \ nbg460n_550n_550nh | \ unifi | \ @@ -60,10 +60,10 @@ index ccccc17..4793fa9 100755 carambola2 | \ weio ) diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index e4bed08..514f7d5 100644 +index e0d52d9..a068cc5 100644 --- a/target/linux/ar71xx/config-3.18 +++ b/target/linux/ar71xx/config-3.18 -@@ -140,6 +140,7 @@ CONFIG_ATH79_MACH_TL_WR941ND=y +@@ -141,6 +141,7 @@ CONFIG_ATH79_MACH_TL_WR941ND=y CONFIG_ATH79_MACH_TL_WR941ND_V6=y CONFIG_ATH79_MACH_TUBE2H=y CONFIG_ATH79_MACH_UBNT=y @@ -71,7 +71,7 @@ index e4bed08..514f7d5 100644 CONFIG_ATH79_MACH_UBNT_XM=y CONFIG_ATH79_MACH_WEIO=y CONFIG_ATH79_MACH_WHR_HP_G300N=y -@@ -323,7 +324,7 @@ CONFIG_SOC_AR933X=y +@@ -324,7 +325,7 @@ CONFIG_SOC_AR933X=y CONFIG_SOC_AR934X=y CONFIG_SOC_QCA953X=y CONFIG_SOC_QCA955X=y @@ -218,7 +218,7 @@ index d8e24d0..94eff18 100644 NAME:=Ubiquiti UniFiAP Outdoor PACKAGES:= diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 7184966..209eba4 100644 +index 0783381..aaaf89a 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -740,6 +740,16 @@ define Device/oolite @@ -263,18 +263,18 @@ index 626d676..f62cf1a 100644 # CONFIG_ATH79_MACH_WLAE_AG300N is not set # CONFIG_ATH79_MACH_WNDAP360 is not set diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index d6e786d..5a7a72c 100644 +index 76aeb94..27dc73f 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ --- a/arch/mips/ath79/machtypes.h +++ b/arch/mips/ath79/machtypes.h --@@ -16,22 +16,199 @@ -+@@ -16,22 +16,200 @@ +-@@ -16,22 +16,200 @@ ++@@ -16,22 +16,201 @@ enum ath79_mach_type { ATH79_MACH_GENERIC = 0, -@@ -164,6 +164,7 @@ +@@ -165,6 +165,7 @@ + ATH79_MACH_UBNT_RS, /* Ubiquiti RouterStation */ ATH79_MACH_UBNT_UAP_PRO, /* Ubiquiti UniFi AP Pro */ ATH79_MACH_UBNT_UNIFI, /* Ubiquiti Unifi */ @@ -282,7 +282,7 @@ index d6e786d..5a7a72c 100644 ATH79_MACH_UBNT_UNIFI_OUTDOOR, /* Ubiquiti UnifiAP Outdoor */ + ATH79_MACH_UBNT_UNIFI_OUTDOOR_PLUS, /* Ubiquiti UnifiAP Outdoor+ */ ATH79_MACH_UBNT_XM, /* Ubiquiti Networks XM board rev 1.0 */ -@@ -1097,10 +1098,7 @@ +@@ -1098,10 +1099,7 @@ + select ATH79_DEV_M25P80 + select ATH79_DEV_USB + select ATH79_DEV_WMAC @@ -294,7 +294,7 @@ index d6e786d..5a7a72c 100644 +config ATH79_MACH_TL_WA7210N_V2 + bool "TP-LINK TL-WA7210N v2 support" + select SOC_AR724X -@@ -1115,19 +1113,12 @@ +@@ -1116,19 +1114,12 @@ + bool "TP-LINK TL-WA830RE v2 support" + select SOC_AR934X + select ATH79_DEV_ETH @@ -319,7 +319,7 @@ index d6e786d..5a7a72c 100644 +config ATH79_MACH_TL_WA901ND + bool "TP-LINK TL-WA901ND/TL-WA7510N support" + select SOC_AR724X -@@ -1139,11 +1130,11 @@ +@@ -1140,11 +1131,11 @@ + +config ATH79_MACH_TL_WA901ND_V2 + bool "TP-LINK TL-WA901ND v2 support" @@ -336,7 +336,7 @@ index d6e786d..5a7a72c 100644 + select ATH79_DEV_WMAC + +config ATH79_MACH_TL_WDR3500 -@@ -1154,34 +1145,13 @@ +@@ -1155,34 +1146,13 @@ + select ATH79_DEV_GPIO_BUTTONS + select ATH79_DEV_LEDS_GPIO + select ATH79_DEV_M25P80 @@ -376,7 +376,7 @@ index d6e786d..5a7a72c 100644 + select ATH79_DEV_ETH + select ATH79_DEV_GPIO_BUTTONS + select ATH79_DEV_LEDS_GPIO -@@ -1189,8 +1159,8 @@ +@@ -1190,8 +1160,8 @@ + select ATH79_DEV_USB + select ATH79_DEV_WMAC + @@ -387,7 +387,7 @@ index d6e786d..5a7a72c 100644 + select SOC_AR933X + select ATH79_DEV_ETH + select ATH79_DEV_GPIO_BUTTONS -@@ -1198,7 +1168,28 @@ +@@ -1199,7 +1169,28 @@ + select ATH79_DEV_M25P80 + select ATH79_DEV_USB + select ATH79_DEV_WMAC @@ -417,7 +417,7 @@ index d6e786d..5a7a72c 100644 +config ATH79_MACH_TL_WR741ND + bool "TP-LINK TL-WR741ND support" + select SOC_AR724X -@@ -1211,21 +1202,25 @@ +@@ -1212,21 +1203,25 @@ +config ATH79_MACH_TL_WR741ND_V4 + bool "TP-LINK TL-WR741ND v4/TL-MR3220 v2 support" + select SOC_AR933X @@ -455,7 +455,7 @@ index d6e786d..5a7a72c 100644 + select ATH79_DEV_M25P80 + +config ATH79_MACH_TL_WR841N_V8 -@@ -1268,15 +1263,21 @@ +@@ -1269,15 +1264,21 @@ + +config ATH79_MACH_TL_WR1041N_V2 + bool "TP-LINK TL-WR1041N v2 support" @@ -486,7 +486,7 @@ index d6e786d..5a7a72c 100644 +config ATH79_MACH_TL_WR1043ND + bool "TP-LINK TL-WR1043ND support" + select SOC_AR913X -@@ -1319,11 +1320,12 @@ +@@ -1320,11 +1321,12 @@ + +config ATH79_MACH_TEW_673GRU + bool "TRENDnet TEW-673GRU support" @@ -503,7 +503,7 @@ index d6e786d..5a7a72c 100644 + select ATH79_DEV_M25P80 + select ATH79_DEV_USB + select ATH79_NVRAM -@@ -1361,10 +1363,20 @@ +@@ -1362,10 +1364,20 @@ config ATH79_MACH_UBNT_XM bool "Ubiquiti Networks XM/UniFi boards" @@ -525,7 +525,7 @@ index d6e786d..5a7a72c 100644 +config ATH79_MACH_WEIO + bool "WeIO board" + select SOC_AR933X -@@ -1468,7 +1480,7 @@ +@@ -1469,7 +1481,7 @@ endmenu config SOC_AR71XX @@ -534,7 +534,7 @@ index d6e786d..5a7a72c 100644 config ATH79_DEV_ETH def_bool n -@@ -1480,7 +1492,7 @@ +@@ -1481,7 +1493,7 @@ def_bool n config ATH79_DEV_GPIO_BUTTONS @@ -543,7 +543,7 @@ index d6e786d..5a7a72c 100644 def_bool n config ATH79_ROUTERBOOT -@@ -1494,7 +1506,7 @@ +@@ -1495,7 +1507,7 @@ endif --- a/arch/mips/ath79/Makefile +++ b/arch/mips/ath79/Makefile @@ -552,7 +552,7 @@ index d6e786d..5a7a72c 100644 # # Machines # -@@ -1596,6 +1608,7 @@ +@@ -1597,6 +1609,7 @@ +obj-$(CONFIG_ATH79_MACH_TL_WR720N_V3) += mach-tl-wr720n-v3.o +obj-$(CONFIG_ATH79_MACH_TUBE2H) += mach-tube2h.o +obj-$(CONFIG_ATH79_MACH_UBNT) += mach-ubnt.o diff --git a/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch index 688cf5c0..b111d191 100644 --- a/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch +++ b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch @@ -10,10 +10,10 @@ Signed-off-by: P.Wassi Backport of LEDE c855e70491fbd5d432915c4cbeb3b80f3a117e30 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index e36c581..23fd122 100644 +index 3adc449..924c116 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -306,7 +306,7 @@ get_status_led() { +@@ -310,7 +310,7 @@ get_status_led() { status_led="ubnt:green:dome" ;; uap-pro | \ @@ -23,10 +23,10 @@ index e36c581..23fd122 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index f01c6d3..6c6b27a 100644 +index ab7d93c..7777734 100644 --- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -@@ -77,7 +77,7 @@ case "$FIRMWARE" in +@@ -81,7 +81,7 @@ case "$FIRMWARE" in ath10kcal_extract "ART" 20480 2116 ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16) ;; @@ -36,10 +36,10 @@ index f01c6d3..6c6b27a 100644 ;; esac diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 850eac9..cb31c69 100755 +index a79376a..2007042 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -368,7 +368,7 @@ tl-wa901nd-v3 |\ +@@ -369,7 +369,7 @@ tl-wa901nd-v3 |\ tl-wa901nd-v4 |\ tl-wr703n |\ tube2h |\ @@ -49,10 +49,10 @@ index 850eac9..cb31c69 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index ac77934..f8dd719 100755 +index 0fd139c..a8d8896 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -896,8 +896,8 @@ ar71xx_board_detect() { +@@ -902,8 +902,8 @@ ar71xx_board_detect() { *UniFi) name="unifi" ;; @@ -64,10 +64,10 @@ index ac77934..f8dd719 100755 *"UniFi AP Pro") name="uap-pro" diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 4793fa9..5aa59fd 100755 +index fff1c3c..90f961f 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -251,7 +251,7 @@ platform_check_image() { +@@ -252,7 +252,7 @@ platform_check_image() { wlae-ag300n | \ nbg460n_550n_550nh | \ unifi | \ @@ -143,7 +143,7 @@ index 94eff18..eac0240 100644 define Profile/UBNTUNIFIOUTDOOR NAME:=Ubiquiti UniFiAP Outdoor diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 209eba4..c9d6ed1 100644 +index aaaf89a..42ffc69 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -741,14 +741,19 @@ endef @@ -170,10 +170,10 @@ index 209eba4..c9d6ed1 100644 rootfs_type=$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1))) diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index 5a7a72c..0ade403 100644 +index 27dc73f..9a28f58 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -@@ -164,7 +164,7 @@ +@@ -165,7 +165,7 @@ + ATH79_MACH_UBNT_RS, /* Ubiquiti RouterStation */ ATH79_MACH_UBNT_UAP_PRO, /* Ubiquiti UniFi AP Pro */ ATH79_MACH_UBNT_UNIFI, /* Ubiquiti Unifi */ @@ -182,7 +182,7 @@ index 5a7a72c..0ade403 100644 ATH79_MACH_UBNT_UNIFI_OUTDOOR, /* Ubiquiti UnifiAP Outdoor */ + ATH79_MACH_UBNT_UNIFI_OUTDOOR_PLUS, /* Ubiquiti UnifiAP Outdoor+ */ ATH79_MACH_UBNT_XM, /* Ubiquiti Networks XM board rev 1.0 */ -@@ -1368,7 +1368,7 @@ +@@ -1369,7 +1369,7 @@ Ubiquiti Networks XM (rev 1.0) board. +config ATH79_MACH_UBNT_UNIFIAC diff --git a/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch index 50b613c8..6fb4e88e 100644 --- a/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch +++ b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch @@ -8,10 +8,10 @@ Signed-off-by: P.Wassi Backport of LEDE 8307c2fe686ded345c80318359d5b6679e581fa2 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 23fd122..f182d60 100644 +index 924c116..cb92349 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -306,7 +306,8 @@ get_status_led() { +@@ -310,7 +310,8 @@ get_status_led() { status_led="ubnt:green:dome" ;; uap-pro | \ @@ -22,10 +22,10 @@ index 23fd122..f182d60 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index 6c6b27a..0e93feb 100644 +index 7777734..5eb20bb 100644 --- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -@@ -77,7 +77,8 @@ case "$FIRMWARE" in +@@ -81,7 +81,8 @@ case "$FIRMWARE" in ath10kcal_extract "ART" 20480 2116 ath10kcal_patch_mac $(macaddr_add $(cat /sys/class/net/eth0/address) +16) ;; @@ -36,10 +36,10 @@ index 6c6b27a..0e93feb 100644 ;; esac diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index cb31c69..e5c64bb 100755 +index 2007042..b59844e 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -400,6 +400,13 @@ wpj344) +@@ -401,6 +401,13 @@ wpj344) ucidef_add_switch_vlan "switch0" "2" "0t 2" ;; @@ -54,10 +54,10 @@ index cb31c69..e5c64bb 100755 ucidef_set_interfaces_lan_wan "eth0" "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index f8dd719..348e0f6 100755 +index a8d8896..28f07b8 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -899,6 +899,9 @@ ar71xx_board_detect() { +@@ -905,6 +905,9 @@ ar71xx_board_detect() { *"UniFi-AC-LITE") name="unifiac-lite" ;; @@ -68,10 +68,10 @@ index f8dd719..348e0f6 100755 name="uap-pro" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 5aa59fd..0f166eb 100755 +index 90f961f..0228f14 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -252,6 +252,7 @@ platform_check_image() { +@@ -253,6 +253,7 @@ platform_check_image() { nbg460n_550n_550nh | \ unifi | \ unifiac-lite | \ @@ -193,7 +193,7 @@ index eac0240..69b8398 100644 NAME:=Ubiquiti UniFiAP Outdoor PACKAGES:= diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index c9d6ed1..0cf1df1 100644 +index 42ffc69..7c648f2 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -753,7 +753,13 @@ define Device/ubnt-unifiac-lite @@ -212,18 +212,18 @@ index c9d6ed1..0cf1df1 100644 rootfs_type=$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1))) diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index 0ade403..dbd3fca 100644 +index 9a28f58..debde6e 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ --- a/arch/mips/ath79/machtypes.h +++ b/arch/mips/ath79/machtypes.h --@@ -16,22 +16,200 @@ -+@@ -16,22 +16,201 @@ +-@@ -16,22 +16,201 @@ ++@@ -16,22 +16,202 @@ enum ath79_mach_type { ATH79_MACH_GENERIC = 0, -@@ -165,6 +165,7 @@ +@@ -166,6 +166,7 @@ ATH79_MACH_UBNT_UAP_PRO, /* Ubiquiti UniFi AP Pro */ ATH79_MACH_UBNT_UNIFI, /* Ubiquiti Unifi */ + ATH79_MACH_UBNT_UNIFIAC_LITE, /* Ubiquiti Unifi AC LITE/LR */ @@ -231,7 +231,7 @@ index 0ade403..dbd3fca 100644 ATH79_MACH_UBNT_UNIFI_OUTDOOR, /* Ubiquiti UnifiAP Outdoor */ + ATH79_MACH_UBNT_UNIFI_OUTDOOR_PLUS, /* Ubiquiti UnifiAP Outdoor+ */ ATH79_MACH_UBNT_XM, /* Ubiquiti Networks XM board rev 1.0 */ -@@ -1363,12 +1364,12 @@ +@@ -1364,12 +1365,12 @@ config ATH79_MACH_UBNT_XM bool "Ubiquiti Networks XM/UniFi boards" @@ -246,7 +246,7 @@ index 0ade403..dbd3fca 100644 + select SOC_QCA956X + select ATH79_DEV_AP9X_PCI if PCI + select ATH79_DEV_ETH -@@ -1376,6 +1377,7 @@ +@@ -1377,6 +1378,7 @@ + select ATH79_DEV_LEDS_GPIO + select ATH79_DEV_M25P80 + select ATH79_DEV_WMAC @@ -254,7 +254,7 @@ index 0ade403..dbd3fca 100644 + +config ATH79_MACH_WEIO + bool "WeIO board" -@@ -1480,7 +1482,7 @@ +@@ -1481,7 +1483,7 @@ endmenu config SOC_AR71XX @@ -263,7 +263,7 @@ index 0ade403..dbd3fca 100644 config ATH79_DEV_ETH def_bool n -@@ -1492,7 +1494,7 @@ +@@ -1493,7 +1495,7 @@ def_bool n config ATH79_DEV_GPIO_BUTTONS diff --git a/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch b/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch index ec735029..dbdb42c9 100644 --- a/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch +++ b/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch @@ -10,10 +10,10 @@ Signed-off-by: Michal Cieslakiewicz Backport of r49101 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index d7dc9a1..337000c 100644 +index f4d5234..b867796 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -592,6 +592,21 @@ wnr2000-v4) +@@ -600,6 +600,21 @@ wnr2000-v4) ucidef_set_led_usbdev "usb" "USB" "netgear:amber:status" "1-1" ;; diff --git a/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch index 1fce6624..b0c94afb 100644 --- a/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch +++ b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch @@ -9,10 +9,10 @@ https://raw.githubusercontent.com/domino-team/OpenWrt-patches/master/AR150%2C%20 (and fixed indentation in target/linux/ar71xx/base-files/lib/ar71xx.sh) diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 337000c..032acc9 100644 +index b867796..d81358d 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -181,6 +181,10 @@ dlan-pro-1200-ac) +@@ -188,6 +188,10 @@ dlan-pro-1200-ac) ucidef_set_led_trigger_gpio "plcr" "dLAN" "devolo:error:dlan" "16" "0" ;; @@ -24,10 +24,10 @@ index 337000c..032acc9 100644 ucidef_set_led_netdev "lan" "LAN" "gl-connect:green:lan" "eth1" ucidef_set_led_wlan "wlan" "WLAN" "gl-connect:red:wlan" "phy0tpt" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index e5c64bb..b8ae576 100755 +index b59844e..ac3deb8 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -382,6 +382,7 @@ dir-505-a1) +@@ -383,6 +383,7 @@ dir-505-a1) alfa-ap96 |\ alfa-nx |\ ap83 |\ @@ -36,10 +36,10 @@ index e5c64bb..b8ae576 100755 jwap003 |\ pb42 |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 348e0f6..5119b36 100755 +index 28f07b8..3bd6aed 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -500,6 +500,9 @@ ar71xx_board_detect() { +@@ -503,6 +503,9 @@ ar71xx_board_detect() { name="gl-inet" gl_inet_board_detect ;; @@ -50,10 +50,10 @@ index 348e0f6..5119b36 100755 name="epg5000" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 0f166eb..f33419f 100755 +index 0228f14..d816f21 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -215,6 +215,7 @@ platform_check_image() { +@@ -216,6 +216,7 @@ platform_check_image() { dlan-pro-500-wp | \ dlan-pro-1200-ac | \ dragino2 | \ @@ -62,10 +62,10 @@ index 0f166eb..f33419f 100755 esr1750 | \ esr900 | \ diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index 514f7d5..0903ee9 100644 +index a068cc5..d4d9273 100644 --- a/target/linux/ar71xx/config-3.18 +++ b/target/linux/ar71xx/config-3.18 -@@ -69,6 +69,7 @@ CONFIG_ATH79_MACH_ESR1750=y +@@ -70,6 +70,7 @@ CONFIG_ATH79_MACH_ESR1750=y CONFIG_ATH79_MACH_ESR900=y CONFIG_ATH79_MACH_EW_DORIN=y CONFIG_ATH79_MACH_F9K1115V2=y @@ -261,7 +261,7 @@ index 0000000..a6ad661 + +$(eval $(call Profile,GL-AR150)) diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 0cf1df1..b790610 100644 +index 7c648f2..05eea0b 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -144,6 +144,14 @@ define Device/weio diff --git a/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch index f4756c6f..2aeddc22 100644 --- a/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch +++ b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch @@ -14,11 +14,11 @@ Signed-off-by: Cezary Jackiewicz Backport of LEDE 0b45bec22c59cc6e6b2fa71dc9a88386c5587132 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index f182d60..c3aeffc 100644 +index cb92349..2c5d6af 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -276,6 +276,7 @@ get_status_led() { - tl-wr841n-v8 | \ +@@ -280,6 +280,7 @@ get_status_led() { + tl-wr841n-v11 | \ tl-wa830re-v2 | \ tl-wr842n-v2 | \ + tl-wr842n-v3 | \ @@ -26,10 +26,10 @@ index f182d60..c3aeffc 100644 tl-wr941nd-v5) status_led="tp-link:green:system" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 032acc9..e118e0a 100644 +index d81358d..14aa7bc 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -515,6 +515,16 @@ tl-wr842n-v2) +@@ -523,6 +523,16 @@ tl-wr842n-v2) ucidef_set_led_usbdev "usb" "USB" "tp-link:green:3g" "1-1" ;; @@ -47,22 +47,22 @@ index 032acc9..e118e0a 100644 tl-wa901nd-v3) ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan" "eth0" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index b8ae576..3c428ba 100755 +index ac3deb8..ca9c577 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -447,6 +447,7 @@ tl-wr741nd |\ - tl-wr741nd-v4 |\ +@@ -449,6 +449,7 @@ tl-wr741nd-v4 |\ tl-wr841n-v7 |\ tl-wr841n-v9 |\ + tl-wr841n-v11 |\ +tl-wr842n-v3 |\ whr-g301n |\ whr-hp-g300n |\ whr-hp-gn |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 5119b36..e4a617e 100755 +index 3bd6aed..43ce7da 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -863,6 +863,9 @@ ar71xx_board_detect() { +@@ -869,6 +869,9 @@ ar71xx_board_detect() { *"TL-WR842N/ND v2") name="tl-wr842n-v2" ;; @@ -73,42 +73,41 @@ index 5119b36..e4a617e 100755 name="tl-wr941nd" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index f33419f..2a1abf3 100755 +index d816f21..53284df 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -365,6 +365,7 @@ platform_check_image() { - tl-wr841n-v8 | \ +@@ -367,6 +367,7 @@ platform_check_image() { tl-wr841n-v9 | \ + tl-wr841n-v11 | \ tl-wr842n-v2 | \ + tl-wr842n-v3 | \ tl-wr941nd | \ tl-wr941nd-v5 | \ tl-wr941nd-v6 | \ diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c -index 3e5c2a2..0209603 100644 +index 004f719..ebaed15 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c -@@ -1,7 +1,8 @@ +@@ -1,9 +1,16 @@ /* -- * TP-LINK TL-WR841N/ND v9 -+ * TP-LINK TL-WR841N/ND v9/TL-WR842N/ND v3 ++<<<<<<< HEAD + * TP-LINK TL-WR841N/ND v9/v11 * * Copyright (C) 2014 Matthias Schiffer + * Copyright (C) 2016 Cezary Jackiewicz + * Copyright (C) 2016 Stijn Segers ++======= ++ * TP-LINK TL-WR841N/ND v9/TL-WR842N/ND v3 ++ * ++ * Copyright (C) 2014 Matthias Schiffer + * Copyright (C) 2016 Cezary Jackiewicz ++>>>>>>> ar71xx: add support for TP-LINK TL-WR842N/ND v3 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published -@@ -19,6 +20,7 @@ - #include "dev-gpio-buttons.h" - #include "dev-leds-gpio.h" - #include "dev-m25p80.h" -+#include "dev-usb.h" - #include "dev-wmac.h" - #include "machtypes.h" - -@@ -33,6 +35,20 @@ - #define TL_WR841NV9_GPIO_BTN_RESET 12 - #define TL_WR841NV9_GPIO_BTN_WIFI 17 +@@ -49,6 +56,20 @@ + #define TL_WR841NV11_GPIO_BTN_RESET 12 + #define TL_WR841NV11_GPIO_BTN_WIFI 17 +#define TL_WR842NV3_GPIO_LED_SYSTEM 2 +#define TL_WR842NV3_GPIO_LED_WLAN 3 @@ -127,8 +126,8 @@ index 3e5c2a2..0209603 100644 #define TL_WR841NV9_KEYS_POLL_INTERVAL 20 /* msecs */ #define TL_WR841NV9_KEYS_DEBOUNCE_INTERVAL (3 * TL_WR841NV9_KEYS_POLL_INTERVAL) -@@ -95,6 +111,68 @@ static struct gpio_keys_button tl_wr841n_v9_gpio_keys[] __initdata = { - } +@@ -151,6 +172,68 @@ static struct gpio_led tl_wr841n_v11_leds_gpio[] __initdata = { + }, }; +static struct gpio_led tl_wr842n_v3_leds_gpio[] __initdata = { @@ -193,13 +192,13 @@ index 3e5c2a2..0209603 100644 + } +}; + - static void __init tl_ap143_setup(void) { -@@ -142,3 +220,20 @@ static void __init tl_wr841n_v9_setup(void) + u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00); +@@ -212,3 +295,20 @@ static void __init tl_wr841n_v11_setup(void) - MIPS_MACHINE(ATH79_MACH_TL_WR841N_V9, "TL-WR841N-v9", "TP-LINK TL-WR841N/ND v9", - tl_wr841n_v9_setup); + MIPS_MACHINE(ATH79_MACH_TL_WR841N_V11, "TL-WR841N-v11", "TP-LINK TL-WR841N/ND v11", + tl_wr841n_v11_setup); + +static void __init tl_wr842n_v3_setup(void) +{ @@ -218,7 +217,7 @@ index 3e5c2a2..0209603 100644 +MIPS_MACHINE(ATH79_MACH_TL_WR842N_V3, "TL-WR842N-v3", "TP-LINK TL-WR842N/ND v3", + tl_wr842n_v3_setup); diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index b790610..e074f8a 100644 +index 05eea0b..d66bd25 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -607,6 +607,13 @@ define Device/tl-wr842n-v2 @@ -245,26 +244,26 @@ index b790610..e074f8a 100644 define Device/tl-wr941nd-v5 $(Device/tplink-4mlzma) diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index dbd3fca..4a53355 100644 +index debde6e..d4b417b 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ --- a/arch/mips/ath79/machtypes.h +++ b/arch/mips/ath79/machtypes.h --@@ -16,22 +16,201 @@ -+@@ -16,22 +16,202 @@ +-@@ -16,22 +16,202 @@ ++@@ -16,22 +16,203 @@ enum ath79_mach_type { ATH79_MACH_GENERIC = 0, -@@ -147,6 +147,7 @@ - + ATH79_MACH_TL_WR841N_V8, /* TP-LINK TL-WR841N/ND v8 */ +@@ -148,6 +148,7 @@ + ATH79_MACH_TL_WR841N_V9, /* TP-LINK TL-WR841N/ND v9 */ + + ATH79_MACH_TL_WR841N_V11, /* TP-LINK TL-WR841N/ND v11 */ + ATH79_MACH_TL_WR842N_V2, /* TP-LINK TL-WR842N/ND v2 */ ++ ATH79_MACH_TL_WR842N_V3, /* TP-LINK TL-WR842N/ND v3 */ + ATH79_MACH_TL_WR941ND, /* TP-LINK TL-WR941ND */ + ATH79_MACH_TL_WR941ND_V5, /* TP-LINK TL-WR941ND v5 */ + ATH79_MACH_TL_WR941ND_V6, /* TP-LINK TL-WR941ND v6 */ -@@ -284,7 +285,7 @@ +@@ -285,7 +286,7 @@ config ATH79_MACH_AP121 bool "Atheros AP121 reference board" select SOC_AR933X @@ -273,7 +272,7 @@ index dbd3fca..4a53355 100644 select ATH79_DEV_M25P80 select ATH79_DEV_USB select ATH79_DEV_WMAC -@@ -1235,13 +1236,14 @@ +@@ -1236,13 +1237,14 @@ + select ATH79_DEV_WMAC + +config ATH79_MACH_TL_WR841N_V9 @@ -295,7 +294,7 @@ index dbd3fca..4a53355 100644 + +config ATH79_MACH_TL_WR941ND + bool "TP-LINK TL-WR941ND support" -@@ -1364,7 +1366,7 @@ +@@ -1365,7 +1367,7 @@ config ATH79_MACH_UBNT_XM bool "Ubiquiti Networks XM/UniFi boards" @@ -304,7 +303,7 @@ index dbd3fca..4a53355 100644 Say 'Y' here if you want your kernel to support the Ubiquiti Networks XM (rev 1.0) board. -@@ -1482,7 +1484,7 @@ +@@ -1483,7 +1485,7 @@ endmenu config SOC_AR71XX @@ -313,7 +312,7 @@ index dbd3fca..4a53355 100644 config ATH79_DEV_ETH def_bool n -@@ -1494,7 +1496,7 @@ +@@ -1495,7 +1497,7 @@ def_bool n config ATH79_DEV_GPIO_BUTTONS diff --git a/patches/openwrt/0059-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch b/patches/openwrt/0059-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch deleted file mode 100644 index 73a7b194..00000000 --- a/patches/openwrt/0059-ar71xx-Fix-TL-WR841N-v11-LEDs-use-separate-machine.patch +++ /dev/null @@ -1,209 +0,0 @@ -From: Matthias Schiffer -Date: Sun, 3 Jul 2016 22:21:13 +0200 -Subject: ar71xx: Fix TL-WR841N v11 LEDs, use separate machine - -Signed-off-by: Stijn Segers - -Backport of LEDE d2a91f9853a9bfb47cb5d6e3078372f3f85557c5 - -diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index c3aeffc..ef59d11 100644 ---- a/target/linux/ar71xx/base-files/etc/diag.sh -+++ b/target/linux/ar71xx/base-files/etc/diag.sh -@@ -274,6 +274,7 @@ get_status_led() { - tl-wr841n-v1 | \ - tl-wr841n-v7 | \ - tl-wr841n-v8 | \ -+ tl-wr841n-v11 | \ - tl-wa830re-v2 | \ - tl-wr842n-v2 | \ - tl-wr842n-v3 | \ -diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index e118e0a..9a0d7eb 100644 ---- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -496,7 +496,8 @@ tl-wa830re-v2) - ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" - ;; - --tl-wr841n-v9) -+tl-wr841n-v9 | \ -+tl-wr841n-v11) - ucidef_set_led_netdev "wan" "WAN" "tp-link:green:wan" "eth1" - ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" - ucidef_set_led_switch "lan2" "LAN2" "tp-link:green:lan2" "switch0" "0x08" -diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 3c428ba..d5603d7 100755 ---- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -+++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -447,6 +447,7 @@ tl-wr741nd |\ - tl-wr741nd-v4 |\ - tl-wr841n-v7 |\ - tl-wr841n-v9 |\ -+tl-wr841n-v11 |\ - tl-wr842n-v3 |\ - whr-g301n |\ - whr-hp-g300n |\ -diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index e4a617e..beca73a 100755 ---- a/target/linux/ar71xx/base-files/lib/ar71xx.sh -+++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -860,6 +860,9 @@ ar71xx_board_detect() { - *"TL-WR841N/ND v9") - name="tl-wr841n-v9" - ;; -+ *"TL-WR841N/ND v11") -+ name="tl-wr841n-v11" -+ ;; - *"TL-WR842N/ND v2") - name="tl-wr842n-v2" - ;; -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 2a1abf3..f50cd53 100755 ---- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -364,6 +364,7 @@ platform_check_image() { - tl-wr841n-v7 | \ - tl-wr841n-v8 | \ - tl-wr841n-v9 | \ -+ tl-wr841n-v11 | \ - tl-wr842n-v2 | \ - tl-wr842n-v3 | \ - tl-wr941nd | \ -diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c -index 0209603..f806568 100644 ---- a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c -+++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c -@@ -1,8 +1,9 @@ - /* -- * TP-LINK TL-WR841N/ND v9/TL-WR842N/ND v3 -+ * TP-LINK TL-WR841N/ND v9/v11 / TL-WR842N/ND v3 - * - * Copyright (C) 2014 Matthias Schiffer - * Copyright (C) 2016 Cezary Jackiewicz -+ * Copyright (C) 2016 Stijn Segers - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published -@@ -35,6 +36,19 @@ - #define TL_WR841NV9_GPIO_BTN_RESET 12 - #define TL_WR841NV9_GPIO_BTN_WIFI 17 - -+#define TL_WR841NV11_GPIO_LED_SYSTEM 1 -+#define TL_WR841NV11_GPIO_LED_QSS 3 -+#define TL_WR841NV11_GPIO_LED_WAN 4 -+#define TL_WR841NV11_GPIO_LED_WAN_STATUS 2 -+#define TL_WR841NV11_GPIO_LED_WLAN 13 -+#define TL_WR841NV11_GPIO_LED_LAN1 16 -+#define TL_WR841NV11_GPIO_LED_LAN2 15 -+#define TL_WR841NV11_GPIO_LED_LAN3 14 -+#define TL_WR841NV11_GPIO_LED_LAN4 11 -+ -+#define TL_WR841NV11_GPIO_BTN_RESET 12 -+#define TL_WR841NV11_GPIO_BTN_WIFI 17 -+ - #define TL_WR842NV3_GPIO_LED_SYSTEM 2 - #define TL_WR842NV3_GPIO_LED_WLAN 3 - #define TL_WR842NV3_GPIO_LED_WAN_RED 4 -@@ -111,6 +125,46 @@ static struct gpio_keys_button tl_wr841n_v9_gpio_keys[] __initdata = { - } - }; - -+static struct gpio_led tl_wr841n_v11_leds_gpio[] __initdata = { -+ { -+ .name = "tp-link:green:lan1", -+ .gpio = TL_WR841NV9_GPIO_LED_LAN1, -+ .active_low = 1, -+ }, { -+ .name = "tp-link:green:lan2", -+ .gpio = TL_WR841NV9_GPIO_LED_LAN2, -+ .active_low = 1, -+ }, { -+ .name = "tp-link:green:lan3", -+ .gpio = TL_WR841NV9_GPIO_LED_LAN3, -+ .active_low = 1, -+ }, { -+ .name = "tp-link:green:lan4", -+ .gpio = TL_WR841NV9_GPIO_LED_LAN4, -+ .active_low = 1, -+ }, { -+ .name = "tp-link:green:qss", -+ .gpio = TL_WR841NV9_GPIO_LED_QSS, -+ .active_low = 1, -+ }, { -+ .name = "tp-link:green:system", -+ .gpio = TL_WR841NV11_GPIO_LED_SYSTEM, -+ .active_low = 1, -+ }, { -+ .name = "tp-link:green:wan", -+ .gpio = TL_WR841NV9_GPIO_LED_WAN, -+ .active_low = 1, -+ }, { -+ .name = "tp-link:green:wan_status", -+ .gpio = TL_WR841NV11_GPIO_LED_WAN_STATUS, -+ .active_low = 1, -+ }, { -+ .name = "tp-link:green:wlan", -+ .gpio = TL_WR841NV9_GPIO_LED_WLAN, -+ .active_low = 1, -+ }, -+}; -+ - static struct gpio_led tl_wr842n_v3_leds_gpio[] __initdata = { - { - .name = "tp-link:green:lan1", -@@ -221,6 +275,21 @@ static void __init tl_wr841n_v9_setup(void) - MIPS_MACHINE(ATH79_MACH_TL_WR841N_V9, "TL-WR841N-v9", "TP-LINK TL-WR841N/ND v9", - tl_wr841n_v9_setup); - -+static void __init tl_wr841n_v11_setup(void) -+{ -+ tl_ap143_setup(); -+ -+ ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr841n_v11_leds_gpio), -+ tl_wr841n_v11_leds_gpio); -+ -+ ath79_register_gpio_keys_polled(1, TL_WR841NV9_KEYS_POLL_INTERVAL, -+ ARRAY_SIZE(tl_wr841n_v9_gpio_keys), -+ tl_wr841n_v9_gpio_keys); -+} -+ -+MIPS_MACHINE(ATH79_MACH_TL_WR841N_V11, "TL-WR841N-v11", "TP-LINK TL-WR841N/ND v11", -+ tl_wr841n_v11_setup); -+ - static void __init tl_wr842n_v3_setup(void) - { - tl_ap143_setup(); -diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index e074f8a..f99ea2b 100644 ---- a/target/linux/ar71xx/image/Makefile -+++ b/target/linux/ar71xx/image/Makefile -@@ -595,7 +595,7 @@ endef - - define Device/tl-wr841n-v11 - $(Device/tplink-4mlzma) -- BOARDNAME := TL-WR841N-v9 -+ BOARDNAME := TL-WR841N-v11 - DEVICE_PROFILE := TLWR841 - TPLINK_HWID := 0x08410011 - endef -diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index 4a53355..d4b417b 100644 ---- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -+++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -@@ -1,6 +1,6 @@ - --- a/arch/mips/ath79/machtypes.h - +++ b/arch/mips/ath79/machtypes.h --@@ -16,22 +16,202 @@ -+@@ -16,22 +16,203 @@ - - enum ath79_mach_type { - ATH79_MACH_GENERIC = 0, -@@ -146,6 +146,7 @@ - + ATH79_MACH_TL_WR841N_V7, /* TP-LINK TL-WR841N/ND v7 */ - + ATH79_MACH_TL_WR841N_V8, /* TP-LINK TL-WR841N/ND v8 */ - + ATH79_MACH_TL_WR841N_V9, /* TP-LINK TL-WR841N/ND v9 */ -++ ATH79_MACH_TL_WR841N_V11, /* TP-LINK TL-WR841N/ND v11 */ - + ATH79_MACH_TL_WR842N_V2, /* TP-LINK TL-WR842N/ND v2 */ - + ATH79_MACH_TL_WR842N_V3, /* TP-LINK TL-WR842N/ND v3 */ - + ATH79_MACH_TL_WR941ND, /* TP-LINK TL-WR941ND */ diff --git a/patches/openwrt/0060-x86-generic-enable-CONFIG_SATA_VIA.patch b/patches/openwrt/0059-x86-generic-enable-CONFIG_SATA_VIA.patch similarity index 100% rename from patches/openwrt/0060-x86-generic-enable-CONFIG_SATA_VIA.patch rename to patches/openwrt/0059-x86-generic-enable-CONFIG_SATA_VIA.patch diff --git a/patches/openwrt/0061-libpcap-fix-dependency-of-install-shared-so-make-target.patch b/patches/openwrt/0060-libpcap-fix-dependency-of-install-shared-so-make-target.patch similarity index 100% rename from patches/openwrt/0061-libpcap-fix-dependency-of-install-shared-so-make-target.patch rename to patches/openwrt/0060-libpcap-fix-dependency-of-install-shared-so-make-target.patch diff --git a/patches/openwrt/0062-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch b/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch similarity index 97% rename from patches/openwrt/0062-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch rename to patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch index 9689ccfb..9cd6c689 100644 --- a/patches/openwrt/0062-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch +++ b/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch @@ -9,7 +9,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 500a67a167a256002f8ab05171f49dfb86b03260 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index beca73a..480cf93 100755 +index 43ce7da..4bf484b 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -107,6 +107,15 @@ cybertan_get_hw_magic() { diff --git a/patches/openwrt/0063-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch b/patches/openwrt/0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch similarity index 94% rename from patches/openwrt/0063-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch rename to patches/openwrt/0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch index 7f75f41e..c0b48b3b 100644 --- a/patches/openwrt/0063-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch +++ b/patches/openwrt/0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch @@ -12,10 +12,10 @@ Signed-off-by: Matthias Schiffer Backport of LEDE adbbfb7ff900c489e6be34b2ec2834172dff7943 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 9a0d7eb..7c18346 100644 +index 14aa7bc..3d240fb 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -@@ -132,10 +132,6 @@ dhp-1565-a1) +@@ -139,10 +139,6 @@ dhp-1565-a1) ucidef_set_led_switch "wan" "WAN" "d-link:green:planet" "switch0" "0x20" ;; diff --git a/patches/openwrt/0064-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch b/patches/openwrt/0063-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch similarity index 100% rename from patches/openwrt/0064-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch rename to patches/openwrt/0063-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch diff --git a/patches/openwrt/0065-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch b/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch similarity index 95% rename from patches/openwrt/0065-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch rename to patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch index eeaad631..e8d2ca51 100644 --- a/patches/openwrt/0065-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch +++ b/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch @@ -22,7 +22,7 @@ index b41f275..0f7a415 100644 ucidef_set_gpio_switch "poe_passthrough" "PoE Passthrough" "20" ;; diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 7c18346..0056520 100644 +index 3d240fb..f1266d8 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -78,6 +78,7 @@ carambola2) @@ -34,10 +34,10 @@ index 7c18346..0056520 100644 ucidef_set_led_switch "lan0" "LAN0" "tp-link:green:lan0" "switch0" "0x20" ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index d5603d7..dd6ca98 100755 +index ca9c577..6c3ecf5 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -71,6 +71,7 @@ bsb) +@@ -72,6 +72,7 @@ bsb) ucidef_set_interface_wlan ;; @@ -46,7 +46,7 @@ index d5603d7..dd6ca98 100755 ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2" ucidef_add_switch "switch0" "1" "1" diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 480cf93..47ddd56 100755 +index 4bf484b..51102d6 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -447,7 +447,11 @@ ar71xx_board_detect() { @@ -63,10 +63,10 @@ index 480cf93..47ddd56 100755 tplink_pharos_board_detect ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index f50cd53..8594de6 100755 +index 53284df..4003b21 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -264,6 +264,7 @@ platform_check_image() { +@@ -265,6 +265,7 @@ platform_check_image() { return 0 ;; @@ -126,10 +126,10 @@ index 5cb052a..74daf43 100644 +MIPS_MACHINE(ATH79_MACH_CPE510, "CPE510", "TP-LINK CPE510/520", cpe510_setup); diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index f99ea2b..33a2da5 100644 +index d66bd25..75083f9 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile -@@ -2109,7 +2109,8 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR10 +@@ -2111,7 +2111,8 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR10 $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V3,tl-wr1043nd-v3,TL-WR1043ND-v2,ttyS0,115200,0x10430003,1,8M)) $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR2543,tl-wr2543-v1,TL-WR2543N,ttyS0,115200,0x25430001,1,8Mlzma,-v 3.13.99)) @@ -139,7 +139,7 @@ index f99ea2b..33a2da5 100644 $(eval $(call SingleProfile,UAPPRO,64k,UAPPRO,ubnt-uap-pro,UAP-PRO,ttyS0,115200,BZ,BZ,ar934x)) $(eval $(call SingleProfile,UAPPRO,64k,UBNTUNIFIOUTDOORPLUS,ubnt-unifi-outdoor-plus,UBNT-UOP,ttyS0,115200,BZ,BZ,ar7240)) -@@ -2173,6 +2174,7 @@ $(eval $(call MultiProfile,TLWR842,TLWR842V1)) +@@ -2175,6 +2176,7 @@ $(eval $(call MultiProfile,TLWR842,TLWR842V1)) $(eval $(call MultiProfile,TLWR941,TLWR941NV2 TLWR941NV3 TLWR941NV4)) $(eval $(call MultiProfile,TLWR1043,TLWR1043V1 TLWR1043V2 TLWR1043V3)) $(eval $(call MultiProfile,TLWDR4300,TLWDR3500V1 TLWDR3600V1 TLWDR4300V1 TLWDR4300V1IL TLWDR4310V1 MW4530RV1)) diff --git a/patches/openwrt/0066-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch b/patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch similarity index 100% rename from patches/openwrt/0066-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch rename to patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch diff --git a/patches/openwrt/0067-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch b/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch similarity index 97% rename from patches/openwrt/0067-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch rename to patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch index 6fb38a92..fe68cd6a 100644 --- a/patches/openwrt/0067-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch +++ b/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch @@ -12,10 +12,10 @@ Signed-off-by: Alexander Couzens Backport of LEDE 824147960569f2c1cd22140c9074c62c3df911a5 diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 33a2da5..b288a1d 100644 +index 75083f9..bb2bb94 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile -@@ -2109,7 +2109,7 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR10 +@@ -2111,7 +2111,7 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR10 $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V3,tl-wr1043nd-v3,TL-WR1043ND-v2,ttyS0,115200,0x10430003,1,8M)) $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR2543,tl-wr2543-v1,TL-WR2543N,ttyS0,115200,0x25430001,1,8Mlzma,-v 3.13.99)) diff --git a/patches/openwrt/0068-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch b/patches/openwrt/0067-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch similarity index 100% rename from patches/openwrt/0068-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch rename to patches/openwrt/0067-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch diff --git a/patches/openwrt/0069-ar71xx-Added-support-for-TL-WA801NDv3.patch b/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch similarity index 98% rename from patches/openwrt/0069-ar71xx-Added-support-for-TL-WA801NDv3.patch rename to patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch index 9f7bcc2b..a4711806 100644 --- a/patches/openwrt/0069-ar71xx-Added-support-for-TL-WA801NDv3.patch +++ b/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch @@ -7,10 +7,10 @@ Signed-off-by: Tiziano Bacocco Backport of OpenWrt r48705 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index dd6ca98..e6b129a 100755 +index 6c3ecf5..027a671 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -@@ -376,6 +376,7 @@ wp543) +@@ -377,6 +377,7 @@ wp543) ucidef_set_interface_lan "eth0" ;; @@ -19,10 +19,10 @@ index dd6ca98..e6b129a 100755 ucidef_set_interface_lan "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 47ddd56..7641e63 100755 +index 51102d6..83be329 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh -@@ -835,6 +835,9 @@ ar71xx_board_detect() { +@@ -838,6 +838,9 @@ ar71xx_board_detect() { *"TL-WA801ND v2") name="tl-wa801nd-v2" ;; @@ -33,10 +33,10 @@ index 47ddd56..7641e63 100755 name="tl-wa901nd" ;; diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index 0903ee9..c75833d 100644 +index d4d9273..d7cbe2e 100644 --- a/target/linux/ar71xx/config-3.18 +++ b/target/linux/ar71xx/config-3.18 -@@ -119,6 +119,7 @@ CONFIG_ATH79_MACH_TL_MR3020=y +@@ -120,6 +120,7 @@ CONFIG_ATH79_MACH_TL_MR3020=y CONFIG_ATH79_MACH_TL_MR3X20=y CONFIG_ATH79_MACH_TL_WA701ND_V2=y CONFIG_ATH79_MACH_TL_WA7210N_V2=y @@ -187,7 +187,7 @@ index 0000000..39cdb10 +MIPS_MACHINE(ATH79_MACH_TL_WA801ND_V3, "TL-WA801ND-v3", "TP-LINK TL-WA801ND v3", + tl_wa801n_v3_setup); diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index b288a1d..dfc0d71 100644 +index bb2bb94..868a502 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -691,6 +691,13 @@ define Device/tl-wa801nd-v2 diff --git a/patches/openwrt/0070-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch b/patches/openwrt/0069-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch similarity index 100% rename from patches/openwrt/0070-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch rename to patches/openwrt/0069-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch diff --git a/patches/openwrt/0071-ar71xx-backport-support-for-new-TP-Link-region-codes.patch b/patches/openwrt/0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch similarity index 97% rename from patches/openwrt/0071-ar71xx-backport-support-for-new-TP-Link-region-codes.patch rename to patches/openwrt/0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch index 3c1c80da..cef1e8a2 100644 --- a/patches/openwrt/0071-ar71xx-backport-support-for-new-TP-Link-region-codes.patch +++ b/patches/openwrt/0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch @@ -6,7 +6,7 @@ Generate flashable images for the Archer C7 v2 with current stock firmware again. diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index dfc0d71..cbd8a49 100644 +index 868a502..95f6d46 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -58,13 +58,14 @@ define Build/mktplinkfw diff --git a/patches/openwrt/0072-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch b/patches/openwrt/0071-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch similarity index 100% rename from patches/openwrt/0072-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch rename to patches/openwrt/0071-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch diff --git a/patches/openwrt/0074-ath9k-revert-temperature-compensation-support-patch-FS-111.patch b/patches/openwrt/0072-ath9k-revert-temperature-compensation-support-patch-FS-111.patch similarity index 100% rename from patches/openwrt/0074-ath9k-revert-temperature-compensation-support-patch-FS-111.patch rename to patches/openwrt/0072-ath9k-revert-temperature-compensation-support-patch-FS-111.patch diff --git a/patches/openwrt/0075-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch b/patches/openwrt/0073-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch similarity index 100% rename from patches/openwrt/0075-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch rename to patches/openwrt/0073-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch diff --git a/patches/openwrt/0073-kernel-add-fix-for-CVE-2016-7117.patch b/patches/openwrt/0073-kernel-add-fix-for-CVE-2016-7117.patch deleted file mode 100644 index 18e6c238..00000000 --- a/patches/openwrt/0073-kernel-add-fix-for-CVE-2016-7117.patch +++ /dev/null @@ -1,105 +0,0 @@ -From: Matthias Schiffer -Date: Tue, 11 Oct 2016 00:46:56 +0200 -Subject: kernel: add fix for CVE-2016-7117 - -diff --git a/target/linux/generic/patches-3.18/010-net-Fix-use-after-free-in-the-recvmmsg-exit-path.patch b/target/linux/generic/patches-3.18/010-net-Fix-use-after-free-in-the-recvmmsg-exit-path.patch -new file mode 100644 -index 0000000..98da375 ---- /dev/null -+++ b/target/linux/generic/patches-3.18/010-net-Fix-use-after-free-in-the-recvmmsg-exit-path.patch -@@ -0,0 +1,95 @@ -+From cdd1fd36f4b67d9fdbeb1a4d16025192d44a3e8b Mon Sep 17 00:00:00 2001 -+Message-Id: -+From: Arnaldo Carvalho de Melo -+Date: Mon, 14 Mar 2016 09:56:35 -0300 -+Subject: [PATCH] net: Fix use after free in the recvmmsg exit path -+ -+[ Upstream commit 34b88a68f26a75e4fded796f1a49c40f82234b7d ] -+ -+The syzkaller fuzzer hit the following use-after-free: -+ -+ Call Trace: -+ [] __asan_report_load8_noabort+0x3e/0x40 mm/kasan/report.c:295 -+ [] __sys_recvmmsg+0x6fa/0x7f0 net/socket.c:2261 -+ [< inline >] SYSC_recvmmsg net/socket.c:2281 -+ [] SyS_recvmmsg+0x16f/0x180 net/socket.c:2270 -+ [] entry_SYSCALL_64_fastpath+0x16/0x7a -+ arch/x86/entry/entry_64.S:185 -+ -+And, as Dmitry rightly assessed, that is because we can drop the -+reference and then touch it when the underlying recvmsg calls return -+some packets and then hit an error, which will make recvmmsg to set -+sock->sk->sk_err, oops, fix it. -+ -+Reported-and-Tested-by: Dmitry Vyukov -+Cc: Alexander Potapenko -+Cc: Eric Dumazet -+Cc: Kostya Serebryany -+Cc: Sasha Levin -+Fixes: a2e2725541fa ("net: Introduce recvmmsg socket syscall") -+http://lkml.kernel.org/r/20160122211644.GC2470@redhat.com -+Signed-off-by: Arnaldo Carvalho de Melo -+Signed-off-by: David S. Miller -+Signed-off-by: Sasha Levin -+--- -+ net/socket.c | 38 +++++++++++++++++++------------------- -+ 1 file changed, 19 insertions(+), 19 deletions(-) -+ -+diff --git a/net/socket.c b/net/socket.c -+index 02fc7c8..7f61789 100644 -+--- a/net/socket.c -++++ b/net/socket.c -+@@ -2410,31 +2410,31 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, -+ break; -+ } -+ -+-out_put: -+- fput_light(sock->file, fput_needed); -+- -+ if (err == 0) -+- return datagrams; -++ goto out_put; -+ -+- if (datagrams != 0) { -++ if (datagrams == 0) { -++ datagrams = err; -++ goto out_put; -++ } -++ -++ /* -++ * We may return less entries than requested (vlen) if the -++ * sock is non block and there aren't enough datagrams... -++ */ -++ if (err != -EAGAIN) { -+ /* -+- * We may return less entries than requested (vlen) if the -+- * sock is non block and there aren't enough datagrams... -++ * ... or if recvmsg returns an error after we -++ * received some datagrams, where we record the -++ * error to return on the next call or if the -++ * app asks about it using getsockopt(SO_ERROR). -+ */ -+- if (err != -EAGAIN) { -+- /* -+- * ... or if recvmsg returns an error after we -+- * received some datagrams, where we record the -+- * error to return on the next call or if the -+- * app asks about it using getsockopt(SO_ERROR). -+- */ -+- sock->sk->sk_err = -err; -+- } -+- -+- return datagrams; -++ sock->sk->sk_err = -err; -+ } -++out_put: -++ fput_light(sock->file, fput_needed); -+ -+- return err; -++ return datagrams; -+ } -+ -+ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, -+-- -+2.10.0 -+ diff --git a/patches/openwrt/0076-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch b/patches/openwrt/0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch similarity index 97% rename from patches/openwrt/0076-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch rename to patches/openwrt/0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch index 448584cf..46d945a1 100644 --- a/patches/openwrt/0076-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch +++ b/patches/openwrt/0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch @@ -16,7 +16,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 83f7ec31f8f9641ef842212c45db61b72682debf diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index cbd8a49..ac21e71 100644 +index 95f6d46..9ac1d60 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -736,6 +736,7 @@ define Device/tl-wa901nd-v4 From 233a7a3c5e608968f26ae8fa075b063327fde5f8 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 5 Nov 2016 04:36:08 +0100 Subject: [PATCH 023/126] ar71xx: fix syntax error in /etc/uci-defaults/01_leds --- ...ax-error-in-etc-uci-defaults-01_leds.patch | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch diff --git a/patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch b/patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch new file mode 100644 index 00000000..91eb2316 --- /dev/null +++ b/patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch @@ -0,0 +1,21 @@ +From: Matthias Schiffer +Date: Sat, 5 Nov 2016 04:31:47 +0100 +Subject: ar71xx: fix syntax error in /etc/uci-defaults/01_leds + +Fixes f98117a "CC: ar71xx: backport LED fix for TL-WR841N-v11". + +Signed-off-by: Matthias Schiffer + +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +index f1266d8..87d6fcc 100644 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +@@ -500,7 +500,7 @@ tl-wa830re-v2) + ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" + ;; + +-tl-wr841n-v9) | \ ++tl-wr841n-v9 | \ + tl-wr841n-v11) + ucidef_set_led_netdev "wan" "WAN" "tp-link:green:wan" "eth1" + ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" From b707840949193cf8ef2ed067add0701e7c9c9bbb Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 5 Nov 2016 12:29:09 +0100 Subject: [PATCH 024/126] README: update mailing list subscribe/unsubscribe addresses --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9fe74651..6f487a43 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,11 @@ If you upgrade using random master commits the nodes *will break* eventually. To subscribe to the list, send a message to: - gluon-subscribe@luebeck.freifunk.net + gluon+subscribe@luebeck.freifunk.net To remove your address from the list, just send a message to the address in the `List-Unsubscribe` header of any list message. If you haven't changed addresses since subscribing, you can also send a message to: - gluon-unsubscribe@luebeck.freifunk.net + gluon+unsubscribe@luebeck.freifunk.net From 539081d31548eb7a37bd2797c1cd06a5b94488ec Mon Sep 17 00:00:00 2001 From: viisauksena Date: Sun, 6 Nov 2016 00:01:49 +0100 Subject: [PATCH 025/126] gluon-mesh-vpn-fastd: make fastd syslog level configurable (#915) --- docs/site-example/site.conf | 1 + docs/user/site.rst | 3 +++ package/gluon-mesh-vpn-fastd/check_site.lua | 1 + .../luasrc/lib/gluon/upgrade/400-mesh-vpn-fastd | 4 ++-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/site-example/site.conf b/docs/site-example/site.conf index 7c5bbe25..8949ebb9 100644 --- a/docs/site-example/site.conf +++ b/docs/site-example/site.conf @@ -102,6 +102,7 @@ methods = {'salsa2012+umac'}, -- enabled = true, -- configurable = true, + -- syslog_level = 'warn', mtu = 1280, groups = { diff --git a/docs/user/site.rst b/docs/user/site.rst index 0987a444..21e2d5a4 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -182,12 +182,15 @@ fastd_mesh_vpn In any case, the ``null`` method should always be the first method in the list if it is supported at all. You should only set `configurable` to `true` if the configured peers support both the ``null`` method and methods with encryption. + + You can set syslog_level from verbose (default) to warn to reduce syslog output. :: fastd_mesh_vpn = { methods = {'salsa2012+umac'}, -- enabled = true, -- configurable = true, + -- syslog_level = 'warn', mtu = 1280, groups = { backbone = { diff --git a/package/gluon-mesh-vpn-fastd/check_site.lua b/package/gluon-mesh-vpn-fastd/check_site.lua index 30cca11d..c1bf0ea1 100644 --- a/package/gluon-mesh-vpn-fastd/check_site.lua +++ b/package/gluon-mesh-vpn-fastd/check_site.lua @@ -3,6 +3,7 @@ need_number('fastd_mesh_vpn.mtu') need_boolean('fastd_mesh_vpn.enabled', false) need_boolean('fastd_mesh_vpn.configurable', false) +need_one_of('fastd_mesh_vpn.syslog_level', {'error', 'warn', 'info', 'verbose', 'debug', 'debug2'}, false) local function check_peer(prefix) return function(k, _) diff --git a/package/gluon-mesh-vpn-fastd/luasrc/lib/gluon/upgrade/400-mesh-vpn-fastd b/package/gluon-mesh-vpn-fastd/luasrc/lib/gluon/upgrade/400-mesh-vpn-fastd index 74ab4a41..102ae0b4 100755 --- a/package/gluon-mesh-vpn-fastd/luasrc/lib/gluon/upgrade/400-mesh-vpn-fastd +++ b/package/gluon-mesh-vpn-fastd/luasrc/lib/gluon/upgrade/400-mesh-vpn-fastd @@ -20,6 +20,7 @@ if not enabled then enabled = site.fastd_mesh_vpn.enabled and 1 or 0 end +local syslog_level = uci:get('fastd', 'mesh_vpn', 'syslog_level') or 'verbose' local methods @@ -31,7 +32,6 @@ if site.fastd_mesh_vpn.configurable then has_null = lutil.contains(old_methods, 'null') end - methods = {} if has_null then table.insert(methods, 'null') @@ -52,7 +52,7 @@ uci:section('fastd', 'fastd', 'mesh_vpn', { enabled = enabled, group = 'gluon-fastd', - syslog_level = 'verbose', + syslog_level = syslog_level, interface = 'mesh-vpn', mode = 'tap', mtu = site.fastd_mesh_vpn.mtu, From dbc6fe70d7a50bf5d06f23d946d1b1e1be02f9d0 Mon Sep 17 00:00:00 2001 From: Andreas Ziegler Date: Sun, 6 Nov 2016 15:06:24 +0100 Subject: [PATCH 026/126] x86: sort network packages alphabetically --- targets/x86-64/profiles.mk | 2 +- targets/x86-generic/profiles.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/x86-64/profiles.mk b/targets/x86-64/profiles.mk index 8f561fc1..04973860 100644 --- a/targets/x86-64/profiles.mk +++ b/targets/x86-64/profiles.mk @@ -1,4 +1,4 @@ -X86_64_NETWORK_MODULES := kmod-3c59x kmod-e100 kmod-e1000 kmod-e1000e kmod-natsemi kmod-ne2k-pci kmod-pcnet32 kmod-8139too kmod-r8169 kmod-sis900 kmod-tg3 kmod-via-rhine kmod-via-velocity kmod-forcedeth +X86_64_NETWORK_MODULES := kmod-3c59x kmod-8139too kmod-e100 kmod-e1000 kmod-e1000e kmod-forcedeth kmod-natsemi kmod-ne2k-pci kmod-pcnet32 kmod-r8169 kmod-sis900 kmod-tg3 kmod-via-rhine kmod-via-velocity $(eval $(call GluonProfile,GENERIC,$(X86_64_NETWORK_MODULES))) diff --git a/targets/x86-generic/profiles.mk b/targets/x86-generic/profiles.mk index a8ca3dbb..7e052791 100644 --- a/targets/x86-generic/profiles.mk +++ b/targets/x86-generic/profiles.mk @@ -1,4 +1,4 @@ -X86_GENERIC_NETWORK_MODULES := kmod-3c59x kmod-e100 kmod-e1000 kmod-e1000e kmod-natsemi kmod-ne2k-pci kmod-pcnet32 kmod-8139too kmod-r8169 kmod-sis900 kmod-tg3 kmod-via-rhine kmod-via-velocity kmod-forcedeth +X86_GENERIC_NETWORK_MODULES := kmod-3c59x kmod-8139too kmod-e100 kmod-e1000 kmod-e1000e kmod-forcedeth kmod-natsemi kmod-ne2k-pci kmod-pcnet32 kmod-r8169 kmod-sis900 kmod-tg3 kmod-via-rhine kmod-via-velocity $(eval $(call GluonProfile,GENERIC,$(X86_GENERIC_NETWORK_MODULES))) From 9fba8d7a64da4aff7081ad178976831651aa5af6 Mon Sep 17 00:00:00 2001 From: Andreas Ziegler Date: Sun, 6 Nov 2016 15:07:06 +0100 Subject: [PATCH 027/126] x86: include kmod-igb, kmod-sky2 and kmod-tulip into generic and 64 subtargets --- targets/x86-64/profiles.mk | 2 +- targets/x86-generic/profiles.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/targets/x86-64/profiles.mk b/targets/x86-64/profiles.mk index 04973860..9b5d62df 100644 --- a/targets/x86-64/profiles.mk +++ b/targets/x86-64/profiles.mk @@ -1,4 +1,4 @@ -X86_64_NETWORK_MODULES := kmod-3c59x kmod-8139too kmod-e100 kmod-e1000 kmod-e1000e kmod-forcedeth kmod-natsemi kmod-ne2k-pci kmod-pcnet32 kmod-r8169 kmod-sis900 kmod-tg3 kmod-via-rhine kmod-via-velocity +X86_64_NETWORK_MODULES := kmod-3c59x kmod-8139too kmod-e100 kmod-e1000 kmod-e1000e kmod-forcedeth kmod-igb kmod-natsemi kmod-ne2k-pci kmod-pcnet32 kmod-r8169 kmod-sis900 kmod-sky2 kmod-tg3 kmod-tulip kmod-via-rhine kmod-via-velocity $(eval $(call GluonProfile,GENERIC,$(X86_64_NETWORK_MODULES))) diff --git a/targets/x86-generic/profiles.mk b/targets/x86-generic/profiles.mk index 7e052791..e2d2f041 100644 --- a/targets/x86-generic/profiles.mk +++ b/targets/x86-generic/profiles.mk @@ -1,4 +1,4 @@ -X86_GENERIC_NETWORK_MODULES := kmod-3c59x kmod-8139too kmod-e100 kmod-e1000 kmod-e1000e kmod-forcedeth kmod-natsemi kmod-ne2k-pci kmod-pcnet32 kmod-r8169 kmod-sis900 kmod-tg3 kmod-via-rhine kmod-via-velocity +X86_GENERIC_NETWORK_MODULES := kmod-3c59x kmod-8139too kmod-e100 kmod-e1000 kmod-e1000e kmod-forcedeth kmod-igb kmod-natsemi kmod-ne2k-pci kmod-pcnet32 kmod-r8169 kmod-sis900 kmod-sky2 kmod-tg3 kmod-tulip kmod-via-rhine kmod-via-velocity $(eval $(call GluonProfile,GENERIC,$(X86_GENERIC_NETWORK_MODULES))) From 138a3a008e77229eb2ef68898f00373e4d4385fd Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 8 Nov 2016 17:28:12 +0100 Subject: [PATCH 028/126] docs, README: import release notes from Gluon v2016.2.1 --- README.md | 2 +- docs/index.rst | 1 + docs/releases/v2016.2.1.rst | 59 +++++++++++++++++++++++++++++++++++ docs/user/getting_started.rst | 4 +-- 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 docs/releases/v2016.2.1.rst diff --git a/README.md b/README.md index 6f487a43..59b4b852 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ the future development of Gluon. Please refrain from using the `master` branch for anything else but development purposes! Use the most recent release instead. You can list all relaseses by running `git branch -a` -and switch to one by running `git checkout v2016.2 && make update`. +and switch to one by running `git checkout v2016.2.1 && make update`. If you're using the autoupdater, do not autoupdate nodes with anything but releases. If you upgrade using random master commits the nodes *will break* eventually. diff --git a/docs/index.rst b/docs/index.rst index 0ddd1878..0ef31113 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -64,6 +64,7 @@ Releases .. toctree:: :maxdepth: 1 + releases/v2016.2.1 releases/v2016.2 releases/v2016.1.6 releases/v2016.1.5 diff --git a/docs/releases/v2016.2.1.rst b/docs/releases/v2016.2.1.rst new file mode 100644 index 00000000..2f71205c --- /dev/null +++ b/docs/releases/v2016.2.1.rst @@ -0,0 +1,59 @@ +Gluon 2016.2.1 +============== + +Added hardware support +~~~~~~~~~~~~~~~~~~~~~~ + +ar71xx-generic +^^^^^^^^^^^^^^ + +* TP-Link + + - TL-WA901ND v4 + +Bugfixes +~~~~~~~~ + +* Make status page work with disabled cookies/local storage + (`#912 `_) + +* Update kernel to 3.18.44 + + Fixes CVE-2016-5195 and CVE-2016-7117. It is unlikely that these issues pose + a threat to usual Gluon setups, but installing additional packages may make a + system vulnerable. In any case, updating is highly recommended. + +* Downgrade mac80211 to an earlier state + + Unfortunately, a mac80211 update that was done shortly before the release of + Gluon v2016.2 (that seemed necessary to properly support ath10k devices) had + again caused severe ath9k stability issues that remained unreported until v2016.2 + was out. + + We have now reverted mac80211 to an earlier state that was reported to be very + stable (while keeping the ath10k-specific changes); in addition, some patches + that were reported to cause connection or performance issues with certain clients + have been reverted. While is it still not perfectly stable, is should be at least + as good as (and probably better than) the v2016.1.x release series. + +Known Issues +~~~~~~~~~~~~ + +* Default TX power on many Ubiquiti devices is too high, correct offsets are unknown (`#94 `_) + + Reducing the TX power in the Advanced Settings is recommended. + +* The MAC address of the WAN interface is modified even when Mesh-on-WAN is disabled (`#496 `_) + + This may lead to issues in environments where a fixed MAC address is expected (like VMware when promicious mode is disallowed). + +* Inconsistent respondd API (`#522 `_) + + The current API is inconsistent and will be replaced eventually. The old API will still be supported for a while. + +* Git HTTPS downloads from git.kernel.org fail on Debian Wheezy (`#919 `_) + + The GnuTLS version on Debian Wheezy is too old and can't establish a connection with + git.kernel.org anymore. A newer GnuTLS version is available in wheezy-backports, but + as there is no libcurl3-gnutls package linked against the new version, installing the + new version has no effect. diff --git a/docs/user/getting_started.rst b/docs/user/getting_started.rst index 1ebe37a1..f5f4759d 100644 --- a/docs/user/getting_started.rst +++ b/docs/user/getting_started.rst @@ -8,7 +8,7 @@ Gluon's releases are managed using `Git tags`_. If you are just getting started with Gluon we recommend to use the latest stable release of Gluon. Take a look at the `list of gluon releases`_ and notice the latest release, -e.g. *v2016.2*. Always get Gluon using git and don't try to download it +e.g. *v2016.2.1*. Always get Gluon using git and don't try to download it as a Zip archive as the archive will be missing version information. Please keep in mind that there is no "default Gluon" build; a site configuration @@ -43,7 +43,7 @@ Building the images ------------------- To build Gluon, first check out the repository. Replace *RELEASE* with the -version you'd like to checkout, e.g. *v2016.2*. +version you'd like to checkout, e.g. *v2016.2.1*. :: From 3fd43d7bdbfe143c37b181700815f687943fc3be Mon Sep 17 00:00:00 2001 From: Kevin Olbrich Date: Tue, 8 Nov 2016 23:19:50 +0100 Subject: [PATCH 029/126] docs: user/site: fix typo (#924) --- docs/user/site.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/site.rst b/docs/user/site.rst index 21e2d5a4..6dcb7664 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -83,7 +83,7 @@ regdom \: optional regdom = 'DE' - Setting ``regdom`` in mandatory if ``wifi24`` or ``wifi5`` is defined. + Setting ``regdom`` is mandatory if ``wifi24`` or ``wifi5`` is defined. wifi24 \: optional WLAN configuration for 2.4 GHz devices. From 60b4830c51f1defbae0b19bff0bed549426fd6a2 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 10 Nov 2016 03:28:06 +0100 Subject: [PATCH 030/126] linux-firmware: switch back to git protocol from https for download Using HTTPS breaks the download on Debian Wheezy. The switch was an unintended side effect of the backport from LEDE. Also, fix the commit message of the backport patch (mwlwifi is not updated anymore since the last OpenWrt base upgrade). Fixes #919 --- patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch index ef8c2b72..59103f84 100644 --- a/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch +++ b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch @@ -16,7 +16,6 @@ LEDE 42f559ed70897a7b74dd3e6293b42e6d2e511eaa: * iw * linux-firmware * mt76 -* mwlwifi diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile index b03d644..624da6a 100644 @@ -271,16 +270,14 @@ index b03d644..624da6a 100644 +$(eval $(call BuildPackage,ath10k-firmware-qca99x0-ct)) +$(eval $(call BuildPackage,ath10k-firmware-qca9984-ct)) diff --git a/package/firmware/linux-firmware/Makefile b/package/firmware/linux-firmware/Makefile -index 2fcd93b..7a2e977 100644 +index 2fcd93b..ae5894c 100644 --- a/package/firmware/linux-firmware/Makefile +++ b/package/firmware/linux-firmware/Makefile -@@ -16,10 +16,10 @@ PKG_SOURCE_PROTO:=git - PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +@@ -17,9 +17,9 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION) PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR) --PKG_SOURCE_URL:=git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git + PKG_SOURCE_URL:=git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git -PKG_MIRROR_MD5SUM:=ca4d289ad9380471cae376fc7dd3660a -+PKG_SOURCE_URL:=https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git +PKG_MIRROR_MD5SUM:=8d44332359de89b1936b4ff608a72614 -PKG_MAINTAINER:=Felix Fietkau From 5ef3d883a5ba9a08dc658821619ab7c48911df9f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 11 Nov 2016 03:45:49 +0100 Subject: [PATCH 031/126] ar71xx-generic: backport region code support for TP-Link TL-WR841ND v11 --- ...ry-images-for-TP-Link-TL-WR841ND-v11.patch | 26 +++++++++++++++++++ targets/ar71xx-generic/profiles.mk | 8 ++++-- 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch diff --git a/patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch b/patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch new file mode 100644 index 00000000..51b1e001 --- /dev/null +++ b/patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch @@ -0,0 +1,26 @@ +From: Matthias Schiffer +Date: Fri, 11 Nov 2016 03:29:59 +0100 +Subject: ar71xx: generate region-coded factory images for TP-Link TL-WR841ND v11 + +The latest stock firmwares for US and EU regions have started checking the +region code. + +Tested-by: Andreas Ziegler +Signed-off-by: Matthias Schiffer + +Backport of LEDE 9cac5e8be014b89326880ae5d7b885013614e0ca + +diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile +index 9ac1d60..6346eb9 100644 +--- a/target/linux/ar71xx/image/Makefile ++++ b/target/linux/ar71xx/image/Makefile +@@ -602,6 +602,9 @@ define Device/tl-wr841n-v11 + BOARDNAME := TL-WR841N-v11 + DEVICE_PROFILE := TLWR841 + TPLINK_HWID := 0x08410011 ++ IMAGES += factory-us.bin factory-eu.bin ++ IMAGE/factory-us.bin := append-rootfs | mktplinkfw factory -C US ++ IMAGE/factory-eu.bin := append-rootfs | mktplinkfw factory -C EU + endef + + define Device/tl-wr842n-v2 diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index 416a4ebd..f626029e 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -70,7 +70,7 @@ ifneq ($(BROKEN),) $(eval $(call GluonModel,TLWA801,tl-wa801nd-v3,tp-link-tl-wa801n-nd-v3)) # BROKEN: untested endif -# TL-WR841N/ND v3, v5, v7, v8, v9, v10, v11 +# TL-WR841N/ND v3, v5, v7, v8, v9, v10 $(eval $(call GluonProfile,TLWR841)) $(eval $(call GluonModel,TLWR841,tl-wr841nd-v3,tp-link-tl-wr841n-nd-v3)) $(eval $(call GluonModel,TLWR841,tl-wr841nd-v5,tp-link-tl-wr841n-nd-v5)) @@ -78,7 +78,11 @@ $(eval $(call GluonModel,TLWR841,tl-wr841nd-v7,tp-link-tl-wr841n-nd-v7)) $(eval $(call GluonModel,TLWR841,tl-wr841n-v8,tp-link-tl-wr841n-nd-v8)) $(eval $(call GluonModel,TLWR841,tl-wr841n-v9,tp-link-tl-wr841n-nd-v9)) $(eval $(call GluonModel,TLWR841,tl-wr841n-v10,tp-link-tl-wr841n-nd-v10)) -$(eval $(call GluonModel,TLWR841,tl-wr841n-v11,tp-link-tl-wr841n-nd-v11)) + +# TL-WR841N/ND v11 +$(eval $(call GluonProfile,TLWR841_REGION,,TLWR841)) +$(eval $(call GluonModel,TLWR841_REGION,tl-wr841n-v11,tp-link-tl-wr841n-nd-v11)) +$(eval $(call GluonProfileFactorySuffix,TLWR841_REGION,-squashfs-factory$(if $(GLUON_REGION),-$(GLUON_REGION)),.bin)) # TL-WR842N/ND v1, v2 $(eval $(call GluonProfile,TLWR842)) From aa61a5d489a8a6e2cc9959b51e28722a30bd1788 Mon Sep 17 00:00:00 2001 From: Andreas Ziegler Date: Wed, 9 Nov 2016 04:56:46 +0100 Subject: [PATCH 032/126] x86-64: add pata drivers --- .../0076-x86-64-add-pata-drivers.patch | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 patches/openwrt/0076-x86-64-add-pata-drivers.patch diff --git a/patches/openwrt/0076-x86-64-add-pata-drivers.patch b/patches/openwrt/0076-x86-64-add-pata-drivers.patch new file mode 100644 index 00000000..15faeea6 --- /dev/null +++ b/patches/openwrt/0076-x86-64-add-pata-drivers.patch @@ -0,0 +1,23 @@ +From: Andreas Ziegler +Date: Wed, 9 Nov 2016 04:39:16 +0100 +Subject: x86-64: add pata drivers + +diff --git a/target/linux/x86/64/config-default b/target/linux/x86/64/config-default +index 1caad74..1fda585 100644 +--- a/target/linux/x86/64/config-default ++++ b/target/linux/x86/64/config-default +@@ -131,6 +131,14 @@ CONFIG_PARAVIRT_CLOCK=y + # CONFIG_PARAVIRT_DEBUG is not set + # CONFIG_PARAVIRT_SPINLOCKS is not set + # CONFIG_PARAVIRT_TIME_ACCOUNTING is not set ++CONFIG_PATA_AMD=y ++CONFIG_PATA_ATIIXP=y ++CONFIG_PATA_LEGACY=y ++CONFIG_PATA_MPIIX=y ++CONFIG_PATA_OLDPIIX=y ++CONFIG_PATA_PLATFORM=y ++CONFIG_PATA_SC1200=y ++CONFIG_PATA_VIA=y + CONFIG_PCIEAER=y + CONFIG_PCIEPORTBUS=y + # CONFIG_PCI_IOAPIC is not set From 6107f215d25a88e1f6e2ebd2765e41b26b6f8a4b Mon Sep 17 00:00:00 2001 From: Andreas Ziegler Date: Wed, 9 Nov 2016 04:57:48 +0100 Subject: [PATCH 033/126] x86: add mmc drivers to generic and 64 subtargets --- ...77-x86-add-mmc-drivers-to-generic-64.patch | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 patches/openwrt/0077-x86-add-mmc-drivers-to-generic-64.patch diff --git a/patches/openwrt/0077-x86-add-mmc-drivers-to-generic-64.patch b/patches/openwrt/0077-x86-add-mmc-drivers-to-generic-64.patch new file mode 100644 index 00000000..1a9ccd7b --- /dev/null +++ b/patches/openwrt/0077-x86-add-mmc-drivers-to-generic-64.patch @@ -0,0 +1,42 @@ +From: Andreas Ziegler +Date: Wed, 9 Nov 2016 04:39:59 +0100 +Subject: x86: add mmc drivers to generic+64 + +diff --git a/target/linux/x86/64/config-default b/target/linux/x86/64/config-default +index 1fda585..9d2cfdb 100644 +--- a/target/linux/x86/64/config-default ++++ b/target/linux/x86/64/config-default +@@ -117,6 +117,14 @@ CONFIG_LPC_ICH=y + CONFIG_MEMORY_BALLOON=y + # CONFIG_MEMORY_HOTPLUG is not set + CONFIG_MFD_CORE=y ++CONFIG_MMC=y ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_RICOH_MMC=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_PCI=y ++# CONFIG_MMC_SDHCI_PLTFM is not set ++# CONFIG_MMC_TIFM_SD is not set ++# CONFIG_MMC_WBSD is not set + CONFIG_MODULES_USE_ELF_RELA=y + # CONFIG_MPSC is not set + CONFIG_MUTEX_SPIN_ON_OWNER=y +diff --git a/target/linux/x86/generic/config-default b/target/linux/x86/generic/config-default +index 4fc5131..1d72811 100644 +--- a/target/linux/x86/generic/config-default ++++ b/target/linux/x86/generic/config-default +@@ -136,6 +136,14 @@ CONFIG_ISO9660_FS=y + # CONFIG_LEDS_CLEVO_MAIL is not set + # CONFIG_MDA_CONSOLE is not set + # CONFIG_MIXCOMWD is not set ++CONFIG_MMC=y ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_RICOH_MMC=y ++CONFIG_MMC_SDHCI=y ++CONFIG_MMC_SDHCI_PCI=y ++# CONFIG_MMC_SDHCI_PLTFM is not set ++# CONFIG_MMC_TIFM_SD is not set ++# CONFIG_MMC_WBSD is not set + # CONFIG_MOUSE_BCM5974 is not set + # CONFIG_MOUSE_CYAPA is not set + CONFIG_MOUSE_PS2=y From de2551d435a3c50c52ee6d8df95f55866daf9d58 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 14 Nov 2016 22:38:58 +0100 Subject: [PATCH 034/126] Fix OpenWrt patch numbering --- ...-add-pata-drivers.patch => 0077-x86-64-add-pata-drivers.patch} | 0 ...eric-64.patch => 0078-x86-add-mmc-drivers-to-generic-64.patch} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename patches/openwrt/{0076-x86-64-add-pata-drivers.patch => 0077-x86-64-add-pata-drivers.patch} (100%) rename patches/openwrt/{0077-x86-add-mmc-drivers-to-generic-64.patch => 0078-x86-add-mmc-drivers-to-generic-64.patch} (100%) diff --git a/patches/openwrt/0076-x86-64-add-pata-drivers.patch b/patches/openwrt/0077-x86-64-add-pata-drivers.patch similarity index 100% rename from patches/openwrt/0076-x86-64-add-pata-drivers.patch rename to patches/openwrt/0077-x86-64-add-pata-drivers.patch diff --git a/patches/openwrt/0077-x86-add-mmc-drivers-to-generic-64.patch b/patches/openwrt/0078-x86-add-mmc-drivers-to-generic-64.patch similarity index 100% rename from patches/openwrt/0077-x86-add-mmc-drivers-to-generic-64.patch rename to patches/openwrt/0078-x86-add-mmc-drivers-to-generic-64.patch From 0e85726a0a9bf4fd2b7faa08f5d86eac03283071 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 15 Nov 2016 19:28:55 +0100 Subject: [PATCH 035/126] ath9k: fix ath9k_hw_gpio_get() to return 0 or 1 on success Fixes the Ubiquiti UAP Outdoor+ HSR. --- ...gpio_get-to-return-0-or-1-on-success.patch | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch diff --git a/patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch b/patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch new file mode 100644 index 00000000..a3fa2b6d --- /dev/null +++ b/patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch @@ -0,0 +1,43 @@ +From: Matthias Schiffer +Date: Tue, 15 Nov 2016 19:26:52 +0100 +Subject: ath9k: fix ath9k_hw_gpio_get() to return 0 or 1 on success + +Signed-off-by: Matthias Schiffer + +Backport of LEDE a250556d27556ec94a8d800fd27be40c2de8139c + +diff --git a/package/kernel/mac80211/patches/331-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-succ.patch b/package/kernel/mac80211/patches/331-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-succ.patch +new file mode 100644 +index 0000000..627b401 +--- /dev/null ++++ b/package/kernel/mac80211/patches/331-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-succ.patch +@@ -0,0 +1,29 @@ ++From: Matthias Schiffer ++Date: Tue, 15 Nov 2016 16:08:29 +0100 ++Subject: [PATCH] ath9k: fix ath9k_hw_gpio_get() to return 0 or 1 on success ++ ++Commit b2d70d4944c1 ("ath9k: make GPIO API to support both of WMAC and ++SOC") refactored ath9k_hw_gpio_get() to support both WMAC and SOC GPIOs, ++changing the return on success from 1 to BIT(gpio). This broke some callers ++like ath_is_rfkill_set(). ++ ++Instead of fixing all callers, change ath9k_hw_gpio_get() back to only ++return 0 or 1. ++ ++Fixes: b2d70d4944c1 ("ath9k: make GPIO API to support both of WMAC and SOC") ++Signed-off-by: Matthias Schiffer ++--- ++ drivers/net/wireless/ath/ath9k/hw.c | 2 +- ++ 1 file changed, 1 insertion(+), 1 deletion(-) ++ ++--- a/drivers/net/wireless/ath/ath9k/hw.c +++++ b/drivers/net/wireless/ath/ath9k/hw.c ++@@ -2816,7 +2816,7 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah, ++ WARN_ON(1); ++ } ++ ++- return val; +++ return !!val; ++ } ++ EXPORT_SYMBOL(ath9k_hw_gpio_get); ++ From 849f8f66bfe4f05fee188ccc02f1c45daf07bf3f Mon Sep 17 00:00:00 2001 From: Vieno Foo Date: Sun, 13 Nov 2016 21:49:00 +0100 Subject: [PATCH 036/126] docs: fix typo in features/wlan-configuration --- docs/features/wlan-configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/wlan-configuration.rst b/docs/features/wlan-configuration.rst index 1c1e3e54..445b4bf1 100644 --- a/docs/features/wlan-configuration.rst +++ b/docs/features/wlan-configuration.rst @@ -13,7 +13,7 @@ Upgrade behaviour For each of these networks, the site configuration may define a `disabled` flag (by default, all configured networks are enabled). This flag is merely a default setting, on upgrades the existing setting is always retained (as this setting may have been changed -by the user). This means that is is not possible to enable or disable an existing network +by the user). This means that it is not possible to enable or disable an existing network configurations during upgrades. For the "mesh" and "ibss" networks, the default setting only has an effect if none From 9279fe4b3ba484a3437f52a89072638e63e313d8 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 16 Nov 2016 01:55:04 +0100 Subject: [PATCH 037/126] ar71xx, ramips: reduce CPU load and flickering on devices using rsslieds Fixes #897 --- ...flickering-on-devices-using-rsslieds.patch | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch diff --git a/patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch b/patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch new file mode 100644 index 00000000..75b81e4a --- /dev/null +++ b/patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch @@ -0,0 +1,101 @@ +From: Martin Weinelt +Date: Wed, 2 Nov 2016 16:10:44 +0100 +Subject: ar71xx, ramips: reduce CPU load and flickering on devices using rsslieds + +Polling every 40ms causes more than 10% CPU load on weak devices. An +interval of 200ms is much more reasonable. + +Signed-off-by: Martin Weinelt +[Matthias Schiffer: adapt OpenWrt patch; add ramips; extend commit message] +Signed-off-by: Matthias Schiffer + +Backport of LEDE 5247ac2f805e39afe2e6e30980e439ea8b8ae7f8 + +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +index 87d6fcc..2a0f996 100644 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +@@ -18,14 +18,14 @@ alfa-nx) + ;; + + all0258n) +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "all0258n:red:rssilow" "wlan0" "1" "40" "0" "6" + ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "all0258n:yellow:rssimedium" "wlan0" "30" "80" "-29" "5" + ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "all0258n:green:rssihigh" "wlan0" "70" "100" "-69" "8" + ;; + + all0315n) +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "all0315n:red:rssilow" "wlan0" "1" "40" "0" "6" + ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "all0315n:yellow:rssimedium" "wlan0" "30" "80" "-29" "5" + ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "all0315n:green:rssihigh" "wlan0" "70" "100" "-69" "8" +@@ -82,7 +82,7 @@ cpe210|\ + cpe510) + ucidef_set_led_switch "lan0" "LAN0" "tp-link:green:lan0" "switch0" "0x20" + ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "tp-link:green:link1" "wlan0" "1" "100" "0" "13" + ucidef_set_led_rssi "rssimediumlow" "RSSIMEDIUMLOW" "tp-link:green:link2" "wlan0" "26" "100" "-25" "13" + ucidef_set_led_rssi "rssimediumhigh" "RSSIMEDIUMHIGH" "tp-link:green:link3" "wlan0" "51" "100" "-50" "13" +@@ -271,7 +271,7 @@ mynet-n600) + + mynet-rext) + ucidef_set_led_netdev "lan" "LAN" "wd:blue:ethernet" "eth0" +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "wd:blue:quality1" "wlan0" "1" "40" "0" "6" + ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "wd:blue:quality2" "wlan0" "30" "80" "-29" "5" + ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "wd:blue:quality3" "wlan0" "70" "100" "-69" "8" +@@ -381,7 +381,7 @@ tl-mr3420-v2) + + tl-wa7210n-v2) + ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan" "eth0" +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "tp-link:green:signal1" "wlan0" "1" "100" "0" "13" + ucidef_set_led_rssi "rssimediumlow" "RSSIMEDIUMLOW" "tp-link:green:signal2" "wlan0" "26" "100" "-25" "13" + ucidef_set_led_rssi "rssimediumhigh" "RSSIMEDIUMHIGH" "tp-link:green:signal3" "wlan0" "51" "100" "-50" "13" +@@ -391,7 +391,7 @@ tl-wa7210n-v2) + tl-wa750re) + ucidef_set_led_netdev "lan" "LAN" "tp-link:orange:lan" "eth0" + ucidef_set_led_wlan "wlan" "WLAN" "tp-link:orange:wlan" "phy0tpt" +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "tp-link:orange:signal1" "wlan0" "1" "100" "0" "13" + ucidef_set_led_rssi "rssimediumlow" "RSSIMEDIUMLOW" "tp-link:orange:signal2" "wlan0" "20" "100" "-19" "13" + ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "tp-link:orange:signal3" "wlan0" "40" "100" "-39" "13" +@@ -402,7 +402,7 @@ tl-wa750re) + tl-wa850re) + ucidef_set_led_netdev "lan" "LAN" "tp-link:blue:lan" "eth0" + ucidef_set_led_wlan "wlan" "WLAN" "tp-link:blue:wlan" "phy0tpt" +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "tp-link:blue:signal1" "wlan0" "1" "100" "0" "13" + ucidef_set_led_rssi "rssimediumlow" "RSSIMEDIUMLOW" "tp-link:blue:signal2" "wlan0" "20" "100" "-19" "13" + ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "tp-link:blue:signal3" "wlan0" "40" "100" "-39" "13" +@@ -553,7 +553,7 @@ tl-wr2543n) + + tube2h) + ucidef_set_led_netdev "lan" "LAN" "alfa:blue:lan" "eth0" +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "signal1" "SIGNAL1" "alfa:red:signal1" "wlan0" "1" "100" "0" "13" + ucidef_set_led_rssi "signal2" "SIGNAL2" "alfa:orange:signal2" "wlan0" "26" "100" "-25" "13" + ucidef_set_led_rssi "signal3" "SIGNAL3" "alfa:green:signal3" "wlan0" "51" "100" "-50" "13" +diff --git a/target/linux/ramips/base-files/etc/board.d/01_leds b/target/linux/ramips/base-files/etc/board.d/01_leds +index 5fb28a5..2b0341d 100755 +--- a/target/linux/ramips/base-files/etc/board.d/01_leds ++++ b/target/linux/ramips/base-files/etc/board.d/01_leds +@@ -40,7 +40,7 @@ case $board in + set_usb_led "airlive:green:mobile" + ;; + all0256n) +- ucidef_set_rssimon "wlan0" "40000" "1" ++ ucidef_set_rssimon "wlan0" "200000" "1" + ucidef_set_led_rssi "rssilow" "RSSILOW" "all0256n:green:rssilow" "wlan0" "1" "40" "0" "6" + ucidef_set_led_rssi "rssimedium" "RSSIMEDIUM" "all0256n:green:rssimed" "wlan0" "30" "80" "-29" "5" + ucidef_set_led_rssi "rssihigh" "RSSIHIGH" "all0256n:green:rssihigh" "wlan0" "70" "100" "-69" "8" From ce53ed209b6d78aabe6a90d4689734618db68d62 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 16 Nov 2016 18:24:15 +0100 Subject: [PATCH 038/126] docs: user/site: improve mcast_rate description --- docs/user/site.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/user/site.rst b/docs/user/site.rst index 6dcb7664..43e16d89 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -115,7 +115,8 @@ wifi24 \: optional An optional parameter ``vlan`` (integer) is supported. Both ``mesh`` and ``ibss`` accept an optional ``mcast_rate`` (kbit/s) parameter for - setting the default multicast datarate. + setting the multicast bitrate. Increasing the default value of 1000 to something + like 12000 is recommended. :: wifi24 = { From 3ac9d34c49ef722162d61d254a3c5053ac15719b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 19 Nov 2016 17:34:19 +0100 Subject: [PATCH 039/126] docs: dev/basics: remove outdated docs about patch and unpatch commands --- docs/dev/basics.rst | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/docs/dev/basics.rst b/docs/dev/basics.rst index 7e7d9f58..acb66fa3 100644 --- a/docs/dev/basics.rst +++ b/docs/dev/basics.rst @@ -34,21 +34,7 @@ rerun `patches`; the resulting branch will be called `patched`, while the commit specified in `modules` can be refered to by the branch `base`. -:: - - make unpatch - -sets the repositories to the `base` branch, - -:: - - make patch - -re-applies the patches by resetting the `patched` branch to `base` and calling `git am` -for the patch files. Calling `make` or a similar command after calling `make unpatch` -is generally not a good idea. - -After new patches have been commited on top of the patched branch (or existing commits +After new patches have been commited on top of the `patched` branch (or existing commits since the base commit have been edited or removed), the patch directories can be regenerated using From 7e1dd5730c8a2ffe29767c14c6fb26508a687b0a Mon Sep 17 00:00:00 2001 From: viisauksena Date: Mon, 21 Nov 2016 10:25:45 +0100 Subject: [PATCH 040/126] docs/wired make uci commit more specific (#942) propose to make uci commit more specific to minimize unwanted changes in other temporary written config files like wireless ssid (in some offline changers) --- docs/features/wired-mesh.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/features/wired-mesh.rst b/docs/features/wired-mesh.rst index f1e50181..63341f1f 100644 --- a/docs/features/wired-mesh.rst +++ b/docs/features/wired-mesh.rst @@ -33,12 +33,12 @@ Mesh-on-WAN It's possible to enable Mesh-on-WAN like this:: uci set network.mesh_wan.auto=1 - uci commit + uci commit network It may be disabled by running:: uci set network.mesh_wan.auto=0 - uci commit + uci commit network Mesh-on-LAN @@ -50,7 +50,7 @@ Configuring Mesh-on-LAN is a bit more complicated:: for ifname in $(cat /lib/gluon/core/sysconfig/lan_ifname); do uci del_list network.client.ifname=$ifname done - uci commit + uci commit network It may be disabled by running:: @@ -58,7 +58,7 @@ It may be disabled by running:: for ifname in $(cat /lib/gluon/core/sysconfig/lan_ifname); do uci add_list network.client.ifname=$ifname done - uci commit + uci commit network Please note that this configuration has changed in Gluon v2016.1. Using the old commands on v2016.1 and later will break the corresponding options From f98b175da1fdc01d6628d3a1e2239f1aca3dc00f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 22 Nov 2016 18:27:54 +0100 Subject: [PATCH 041/126] build: fix setting of opkg tmpdir Don't use system /tmp for build. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5c02c752..76cdc42f 100644 --- a/Makefile +++ b/Makefile @@ -379,7 +379,7 @@ BIN_DIR = $(PROFILE_BUILDDIR)/images TARGET_DIR = $(PROFILE_BUILDDIR)/root OPKG:= \ - IPKG_TMP="$(TMP_DIR)/ipkgtmp" \ + TMPDIR="$(TMP_DIR)" \ IPKG_INSTROOT="$(TARGET_DIR)" \ IPKG_CONF_DIR="$(TMP_DIR)" \ IPKG_OFFLINE_ROOT="$(TARGET_DIR)" \ From b6285800d1100a8f7ea3b21876d061f1f5c917b3 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 22 Nov 2016 18:29:55 +0100 Subject: [PATCH 042/126] build: clean up postinst scripts after build OpenWrt does this by default to save some space. --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 76cdc42f..98faefbc 100644 --- a/Makefile +++ b/Makefile @@ -415,6 +415,7 @@ package_install: FORCE +$(GLUONMAKE) enable_initscripts rm -f $(TARGET_DIR)/usr/lib/opkg/lists/* $(TARGET_DIR)/tmp/opkg.lock + rm -f $(TARGET_DIR)/usr/lib/opkg/info/*.postinst* # Remove opkg database when opkg is not intalled if [ ! -x $(TARGET_DIR)/bin/opkg ]; then rm -rf $(TARGET_DIR)/usr/lib/opkg; fi From 20fc162b381a7d52f313012a529e4bfb258d9c79 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 22 Nov 2016 20:01:13 +0100 Subject: [PATCH 043/126] gluon-core, gluon-setup-mode: fix WAN/LAN assignment on CPE210 The interfaces were accidentially switched when the CPE210 was separated from the CPE510 code. --- package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces | 2 +- .../gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces b/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces index 34e1c8bb..6e728134 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces @@ -16,7 +16,7 @@ if not (sysconfig.lan_ifname or sysconfig.wan_ifname) then local lan_ifname = uci:get('network', 'lan', 'ifname') local wan_ifname = uci:get('network', 'wan', 'ifname') - if platform.match('ar71xx', 'generic', {'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) then + if platform.match('ar71xx', 'generic', {'cpe210', 'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) then lan_ifname, wan_ifname = wan_ifname, lan_ifname end diff --git a/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname b/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname index 3dba79a9..a2cf47af 100755 --- a/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname +++ b/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname @@ -9,7 +9,7 @@ if sysconfig.setup_ifname then end if - platform.match('ar71xx', 'generic', {'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) or + platform.match('ar71xx', 'generic', {'cpe210', 'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) or platform.match('ar71xx', 'mikrotik') then sysconfig.setup_ifname = sysconfig.config_ifname or sysconfig.wan_ifname or sysconfig.lan_ifname From 3d9a3f35be0bb83ecb986a76d34cc5f1623340df Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Tue, 29 Nov 2016 15:29:19 +0100 Subject: [PATCH 044/126] kernel: add at803x workaround for sgmii mode (#949) Some (possibly broken) bootloaders incorrectly initialize the at8033 phy. This breaks auto-negotation on these SGMII devices. The mode has therefore to be set back in to a valid configuration by Linux. Fixes #911 --- ...kernel-add-at803x-fix-for-sgmii-mode.patch | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch diff --git a/patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch b/patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch new file mode 100644 index 00000000..f2967b1a --- /dev/null +++ b/patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch @@ -0,0 +1,114 @@ +From: Felix Fietkau +Date: Sun, 27 Nov 2016 22:49:27 +0100 +Subject: kernel: add at803x fix for sgmii mode + +Some (possibly broken) bootloaders incorreclty initialize at8033 +phy. This patch enables sgmii autonegotiation mode. + +Signed-off-by: Roman Yeryomin + +Origin: backport, https://git.lede-project.org/?p=source.git;a=commit;h=e14d2aee0ab91c43d0bb14baf84cc9b997185870 +Bug-gluon: https://github.com/freifunk-gluon/gluon/issues/911 + +diff --git a/target/linux/ar71xx/patches-3.18/735-net-phy-at803x-fix-at8033-sgmii-mode.patch b/target/linux/ar71xx/patches-3.18/735-net-phy-at803x-fix-at8033-sgmii-mode.patch +new file mode 100644 +index 0000000..4a8f532 +--- /dev/null ++++ b/target/linux/ar71xx/patches-3.18/735-net-phy-at803x-fix-at8033-sgmii-mode.patch +@@ -0,0 +1,96 @@ ++--- a/drivers/net/phy/at803x.c +++++ b/drivers/net/phy/at803x.c ++@@ -36,6 +36,9 @@ ++ #define AT803X_INER 0x0012 ++ #define AT803X_INER_INIT 0xec00 ++ #define AT803X_INSR 0x0013 +++#define AT803X_REG_CHIP_CONFIG 0x1f +++#define AT803X_BT_BX_REG_SEL 0x8000 +++#define AT803X_SGMII_ANEG_EN 0x1000 ++ ++ #define AT803X_PCS_SMART_EEE_CTRL3 0x805D ++ #define AT803X_SMART_EEE_CTRL3_LPI_TX_DELAY_SEL_MASK 0x3 ++@@ -49,9 +52,10 @@ ++ #define AT803X_DEBUG_SYSTEM_MODE_CTRL 0x05 ++ #define AT803X_DEBUG_RGMII_TX_CLK_DLY BIT(8) ++ ++-#define ATH8030_PHY_ID 0x004dd076 ++-#define ATH8031_PHY_ID 0x004dd074 ++-#define ATH8035_PHY_ID 0x004dd072 +++#define AT803X_PHY_ID_MASK 0xffffffef +++#define ATH8030_PHY_ID 0x004dd076 +++#define ATH8031_PHY_ID 0x004dd074 +++#define ATH8035_PHY_ID 0x004dd072 ++ ++ MODULE_DESCRIPTION("Atheros 803x PHY driver"); ++ MODULE_AUTHOR("Matus Ujhelyi"); ++@@ -267,6 +271,27 @@ static int at803x_config_init(struct phy ++ { ++ struct at803x_platform_data *pdata; ++ int ret; +++ u32 v; +++ +++ if (phydev->drv->phy_id == ATH8031_PHY_ID && +++ phydev->interface == PHY_INTERFACE_MODE_SGMII) +++ { +++ v = phy_read(phydev, AT803X_REG_CHIP_CONFIG); +++ /* select SGMII/fiber page */ +++ ret = phy_write(phydev, AT803X_REG_CHIP_CONFIG, +++ v & ~AT803X_BT_BX_REG_SEL); +++ if (ret) +++ return ret; +++ /* enable SGMII autonegotiation */ +++ ret = phy_write(phydev, MII_BMCR, AT803X_SGMII_ANEG_EN); +++ if (ret) +++ return ret; +++ /* select copper page */ +++ ret = phy_write(phydev, AT803X_REG_CHIP_CONFIG, +++ v | AT803X_BT_BX_REG_SEL); +++ if (ret) +++ return ret; +++ } ++ ++ ret = genphy_config_init(phydev); ++ if (ret < 0) ++@@ -393,7 +418,7 @@ static struct phy_driver at803x_driver[] ++ /* ATHEROS 8035 */ ++ .phy_id = ATH8035_PHY_ID, ++ .name = "Atheros 8035 ethernet", ++- .phy_id_mask = 0xffffffef, +++ .phy_id_mask = AT803X_PHY_ID_MASK, ++ .probe = at803x_probe, ++ .config_init = at803x_config_init, ++ .link_change_notify = at803x_link_change_notify, ++@@ -412,7 +437,7 @@ static struct phy_driver at803x_driver[] ++ /* ATHEROS 8030 */ ++ .phy_id = ATH8030_PHY_ID, ++ .name = "Atheros 8030 ethernet", ++- .phy_id_mask = 0xffffffef, +++ .phy_id_mask = AT803X_PHY_ID_MASK, ++ .probe = at803x_probe, ++ .config_init = at803x_config_init, ++ .link_change_notify = at803x_link_change_notify, ++@@ -430,8 +455,8 @@ static struct phy_driver at803x_driver[] ++ }, { ++ /* ATHEROS 8031 */ ++ .phy_id = ATH8031_PHY_ID, ++- .name = "Atheros 8031 ethernet", ++- .phy_id_mask = 0xffffffef, +++ .name = "Atheros 8031/8033 ethernet", +++ .phy_id_mask = AT803X_PHY_ID_MASK, ++ .probe = at803x_probe, ++ .config_init = at803x_config_init, ++ .link_change_notify = at803x_link_change_notify, ++@@ -465,9 +490,9 @@ module_init(atheros_init); ++ module_exit(atheros_exit); ++ ++ static struct mdio_device_id __maybe_unused atheros_tbl[] = { ++- { ATH8030_PHY_ID, 0xffffffef }, ++- { ATH8031_PHY_ID, 0xffffffef }, ++- { ATH8035_PHY_ID, 0xffffffef }, +++ { ATH8030_PHY_ID, AT803X_PHY_ID_MASK }, +++ { ATH8031_PHY_ID, AT803X_PHY_ID_MASK }, +++ { ATH8035_PHY_ID, AT803X_PHY_ID_MASK }, ++ { } ++ }; ++ From 212c38f0747db08694749140c838572bc3c71946 Mon Sep 17 00:00:00 2001 From: Neal Oakey Date: Tue, 29 Nov 2016 15:33:19 +0100 Subject: [PATCH 045/126] ar71xx: add model detection for UBNT Rocket Ti (#943) --- patches/openwrt/0013-fix-UBNT-XM-model-detection.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch index c1e8e28a..df4f15ce 100644 --- a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch +++ b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch @@ -30,8 +30,8 @@ index a9dca58..1985c88 100755 + "e0a") + model="Ubiquiti NanoStation loco M" + ;; -+ "e1b") # Note: the M5 has not been tested! -+ # and the Ti Versions are still missing ++ "e1b"|\ # Note: the M5 / M5 Ti haven't yet been verified! ++ "e1d") # Rocket Ti M + model="Ubiquiti Rocket M" + ;; + "e20"|\ From 32400db28214ecc102880338d0e39aa32e4dcc44 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 29 Nov 2016 18:49:35 +0100 Subject: [PATCH 046/126] Update Gluon packages --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 2c1c8e91..23771539 100644 --- a/modules +++ b/modules @@ -9,7 +9,7 @@ PACKAGES_OPENWRT_COMMIT=73776792f7d58e982be9e5819450d4875b273159 PACKAGES_OPENWRT_BRANCH=for-15.05 PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git -PACKAGES_GLUON_COMMIT=90380414f10842238b7ebc21c34dbaf986659320 +PACKAGES_GLUON_COMMIT=078ba81ed2e2e2a5845eac7099e9cc8e3b75ea12 PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git PACKAGES_ROUTING_COMMIT=a4eae82c155079a4372e4b910ec733f77288b717 From 78ccfaa58d0d691274ad74758bf850b529b3612a Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 29 Nov 2016 19:15:18 +0100 Subject: [PATCH 047/126] Update OpenWrt patches --- patches/openwrt/0013-fix-UBNT-XM-model-detection.patch | 2 +- ...MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch | 2 +- ...NK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch | 2 +- .../0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch | 2 +- .../openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch | 2 +- .../0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch | 2 +- patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch | 2 +- .../0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch | 2 +- ...ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch | 2 +- ...cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch | 2 +- .../openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch index df4f15ce..cc2b83b2 100644 --- a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch +++ b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch @@ -5,7 +5,7 @@ Subject: fix UBNT XM model detection Signed-off-by: Neal Oakey diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index a9dca58..1985c88 100755 +index a9dca58..7da8f54 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -64,6 +64,40 @@ wndr3700_board_detect() { diff --git a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch index 32f573f4..6b1774ee 100644 --- a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch +++ b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch @@ -11,7 +11,7 @@ Signed-off-by: Matthias Schiffer Backport of r49106 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 1985c88..99c808c 100755 +index 7da8f54..c980633 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -133,7 +133,7 @@ tplink_board_detect() { diff --git a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch index e56b053b..2ce7dde4 100644 --- a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch +++ b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch @@ -12,7 +12,7 @@ Signed-off-by: Matthias Schiffer Backport of r49107 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 99c808c..4780e2f 100755 +index c980633..7e69d81 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -162,6 +162,10 @@ tplink_board_detect() { diff --git a/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch index 9821b367..fe195bc8 100644 --- a/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch +++ b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch @@ -34,7 +34,7 @@ index 032c671..a79376a 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 4780e2f..0fd139c 100755 +index 7e69d81..478510f 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -902,6 +902,9 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch index b111d191..75e415ae 100644 --- a/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch +++ b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch @@ -49,7 +49,7 @@ index a79376a..2007042 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 0fd139c..a8d8896 100755 +index 478510f..e4c6057 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -902,8 +902,8 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch index 6fb4e88e..2799871c 100644 --- a/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch +++ b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch @@ -54,7 +54,7 @@ index 2007042..b59844e 100755 ucidef_set_interfaces_lan_wan "eth0" "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index a8d8896..28f07b8 100755 +index e4c6057..7434a93 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -905,6 +905,9 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch index b0c94afb..d2a5a1c2 100644 --- a/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch +++ b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch @@ -36,7 +36,7 @@ index b59844e..ac3deb8 100755 jwap003 |\ pb42 |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 28f07b8..3bd6aed 100755 +index 7434a93..f689098 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -503,6 +503,9 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch index 2aeddc22..43269923 100644 --- a/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch +++ b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch @@ -59,7 +59,7 @@ index ac3deb8..ca9c577 100755 whr-hp-g300n |\ whr-hp-gn |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 3bd6aed..43ce7da 100755 +index f689098..748b9c7 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -869,6 +869,9 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch b/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch index 9cd6c689..c4d07f59 100644 --- a/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch +++ b/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch @@ -9,7 +9,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 500a67a167a256002f8ab05171f49dfb86b03260 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 43ce7da..4bf484b 100755 +index 748b9c7..28066b1 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -107,6 +107,15 @@ cybertan_get_hw_magic() { diff --git a/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch b/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch index e8d2ca51..2ff0c1c6 100644 --- a/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch +++ b/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch @@ -46,7 +46,7 @@ index ca9c577..6c3ecf5 100755 ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2" ucidef_add_switch "switch0" "1" "1" diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 4bf484b..51102d6 100755 +index 28066b1..45b1f62 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -447,7 +447,11 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch b/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch index a4711806..0d5924f3 100644 --- a/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch +++ b/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch @@ -19,7 +19,7 @@ index 6c3ecf5..027a671 100755 ucidef_set_interface_lan "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 51102d6..83be329 100755 +index 45b1f62..d0e1d09 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -838,6 +838,9 @@ ar71xx_board_detect() { From 6ebf7120dfbfe55b560e06d529f2469ae59d1562 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 29 Nov 2016 20:01:54 +0100 Subject: [PATCH 048/126] ar71xx: fix syntax error in /lib/ar71xx.sh Fixes: 212c38f0 "ar71xx: add model detection for UBNT Rocket Ti" --- patches/openwrt/0013-fix-UBNT-XM-model-detection.patch | 10 +++++----- ...ing-with-a-space-on-some-TP-LINK-like-devices.patch | 2 +- ...s-in-AR71XX_MODEL-to-match-labels-image-names.patch | 2 +- ...-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch | 2 +- .../0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch | 2 +- ...71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch | 2 +- patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch | 2 +- ...r71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch | 2 +- ...d-revision-detection-for-D-Link-DIR-505-A1-A2.patch | 2 +- ...lit-profile-into-2-profiles-cpe210-and-cpe510.patch | 2 +- .../0068-ar71xx-Added-support-for-TL-WA801NDv3.patch | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch index cc2b83b2..f99e0f35 100644 --- a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch +++ b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch @@ -5,7 +5,7 @@ Subject: fix UBNT XM model detection Signed-off-by: Neal Oakey diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index a9dca58..7da8f54 100755 +index a9dca58..0aa1c86 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -64,6 +64,40 @@ wndr3700_board_detect() { @@ -24,18 +24,18 @@ index a9dca58..7da8f54 100755 + case ${magic:0:3} in + "e00"|\ + "e01"|\ -+ "e80") # It seams that there are different Versions of the Nanostation ++ "e80") + model="Ubiquiti NanoStation M" + ;; + "e0a") + model="Ubiquiti NanoStation loco M" + ;; -+ "e1b"|\ # Note: the M5 / M5 Ti haven't yet been verified! -+ "e1d") # Rocket Ti M ++ "e1b"|\ ++ "e1d") + model="Ubiquiti Rocket M" + ;; + "e20"|\ -+ "e2d") # Bullet Ti M ++ "e2d") + model="Ubiquiti Bullet M" + ;; + "e30") diff --git a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch index 6b1774ee..9ea96a61 100644 --- a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch +++ b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch @@ -11,7 +11,7 @@ Signed-off-by: Matthias Schiffer Backport of r49106 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 7da8f54..c980633 100755 +index 0aa1c86..96a37b4 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -133,7 +133,7 @@ tplink_board_detect() { diff --git a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch index 2ce7dde4..7f4173eb 100644 --- a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch +++ b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch @@ -12,7 +12,7 @@ Signed-off-by: Matthias Schiffer Backport of r49107 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index c980633..7e69d81 100755 +index 96a37b4..6c10617 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -162,6 +162,10 @@ tplink_board_detect() { diff --git a/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch index fe195bc8..79318eca 100644 --- a/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch +++ b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch @@ -34,7 +34,7 @@ index 032c671..a79376a 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 7e69d81..478510f 100755 +index 6c10617..ecf584d 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -902,6 +902,9 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch index 75e415ae..ed85b252 100644 --- a/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch +++ b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch @@ -49,7 +49,7 @@ index a79376a..2007042 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 478510f..e4c6057 100755 +index ecf584d..6bc0b86 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -902,8 +902,8 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch index 2799871c..ad505e3c 100644 --- a/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch +++ b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch @@ -54,7 +54,7 @@ index 2007042..b59844e 100755 ucidef_set_interfaces_lan_wan "eth0" "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index e4c6057..7434a93 100755 +index 6bc0b86..aded7ad 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -905,6 +905,9 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch index d2a5a1c2..0896c8b2 100644 --- a/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch +++ b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch @@ -36,7 +36,7 @@ index b59844e..ac3deb8 100755 jwap003 |\ pb42 |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 7434a93..f689098 100755 +index aded7ad..f242980 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -503,6 +503,9 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch index 43269923..a9d03330 100644 --- a/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch +++ b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch @@ -59,7 +59,7 @@ index ac3deb8..ca9c577 100755 whr-hp-g300n |\ whr-hp-gn |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index f689098..748b9c7 100755 +index f242980..fcd0bc3 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -869,6 +869,9 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch b/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch index c4d07f59..415254f0 100644 --- a/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch +++ b/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch @@ -9,7 +9,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 500a67a167a256002f8ab05171f49dfb86b03260 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 748b9c7..28066b1 100755 +index fcd0bc3..20250e9 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -107,6 +107,15 @@ cybertan_get_hw_magic() { diff --git a/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch b/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch index 2ff0c1c6..e19937f9 100644 --- a/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch +++ b/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch @@ -46,7 +46,7 @@ index ca9c577..6c3ecf5 100755 ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2" ucidef_add_switch "switch0" "1" "1" diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 28066b1..45b1f62 100755 +index 20250e9..0d8ccd2 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -447,7 +447,11 @@ ar71xx_board_detect() { diff --git a/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch b/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch index 0d5924f3..2b3aa8de 100644 --- a/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch +++ b/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch @@ -19,7 +19,7 @@ index 6c3ecf5..027a671 100755 ucidef_set_interface_lan "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 45b1f62..d0e1d09 100755 +index 0d8ccd2..5928439 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -838,6 +838,9 @@ ar71xx_board_detect() { From 54109702bd3bf27b90491cb772b80323a9502a97 Mon Sep 17 00:00:00 2001 From: Christof Schulze Date: Tue, 29 Nov 2016 20:45:25 +0100 Subject: [PATCH 049/126] docs: add development guide including one first guideline wrt lua vs. sh usage (#951) --- docs/dev/basics.rst | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/dev/basics.rst b/docs/dev/basics.rst index acb66fa3..54febc30 100644 --- a/docs/dev/basics.rst +++ b/docs/dev/basics.rst @@ -47,3 +47,12 @@ and you can try rebasing it onto the new `base` branch yourself and after that c Always call `make update-patches` after making changes to a module repository as `make update` will overwrite your commits, making `git reflog` the only way to recover them! + +Development Guidelines +---------------------- +lua should be used instead of sh whenever sensible. The following criteria +should be considered: + +- Is the script doing more than just executing external commands? if so, use lua +- Is the script parsing/editing json-data? If so, use lua for speed + From 9223639ffe5f14810f4af7b3b1886dbda399f9a8 Mon Sep 17 00:00:00 2001 From: Neal Oakey Date: Tue, 29 Nov 2016 23:11:50 +0100 Subject: [PATCH 050/126] ar71xx-generic: make UBNT image names consistent (#809) --- targets/ar71xx-generic/profiles.mk | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index f626029e..9c38a940 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -199,10 +199,22 @@ $(eval $(call GluonModelAlias,UBNT,ubiquiti-nanostation-m,ubiquiti-nanostation-m $(eval $(call GluonModelAlias,UBNT,ubiquiti-nanostation-m,ubiquiti-nanostation-m5)) $(eval $(call GluonModel,UBNT,ubnt-loco-m-xw,ubiquiti-loco-m-xw)) +$(eval $(call GluonModelAlias,UBNT,ubiquiti-loco-m-xw,ubiquiti-nanostation-loco-m2-xw)) +$(eval $(call GluonModelAlias,UBNT,ubiquiti-loco-m-xw,ubiquiti-nanostation-loco-m5-xw)) + $(eval $(call GluonModel,UBNT,ubnt-nano-m-xw,ubiquiti-nanostation-m-xw)) +$(eval $(call GluonModelAlias,UBNT,ubiquiti-nanostation-m-xw,ubiquiti-nanostation-m2-xw)) +$(eval $(call GluonModelAlias,UBNT,ubiquiti-nanostation-m-xw,ubiquiti-nanostation-m5-xw)) + $(eval $(call GluonModel,UBNT,ubnt-rocket-m-xw,ubiquiti-rocket-m-xw)) -$(eval $(call GluonModel,UBNT,ubnt-uap-pro,ubiquiti-unifi-ap-pro)) +$(eval $(call GluonModelAlias,UBNT,ubiquiti-rocket-m-xw,ubiquiti-rocket-m2-xw)) +$(eval $(call GluonModelAlias,UBNT,ubiquiti-rocket-m-xw,ubiquiti-rocket-m5-xw)) + $(eval $(call GluonModel,UBNT,ubnt-unifi,ubiquiti-unifi)) +$(eval $(call GluonModelAlias,UBNT,ubiquiti-unifi,ubiquiti-unifi-ap)) +$(eval $(call GluonModelAlias,UBNT,ubiquiti-unifi,ubiquiti-unifi-ap-lr)) + +$(eval $(call GluonModel,UBNT,ubnt-uap-pro,ubiquiti-unifi-ap-pro)) $(eval $(call GluonModel,UBNT,ubnt-unifi-outdoor,ubiquiti-unifiap-outdoor)) $(eval $(call GluonModel,UBNT,ubnt-unifi-outdoor-plus,ubiquiti-unifiap-outdoor+)) From 34deeac380527d5bfc2a87d1ebae0a784af76c6f Mon Sep 17 00:00:00 2001 From: Ruben Barkow Date: Wed, 30 Nov 2016 13:13:59 +0100 Subject: [PATCH 051/126] gluon-config-mode-geo-location: make the label for altitude definable in the site folder (#883) --- docs/site-example/i18n/de.po | 8 ++++++++ docs/site-example/i18n/en.po | 9 ++++++++- docs/site-example/i18n/fr.po | 8 ++++++++ docs/site-example/i18n/gluon-site.pot | 6 ++++++ docs/user/site.rst | 6 ++++++ package/gluon-config-mode-geo-location/i18n/de.po | 10 ---------- package/gluon-config-mode-geo-location/i18n/fr.po | 10 ---------- .../i18n/gluon-config-mode-geo-location.pot | 8 -------- .../lib/gluon/config-mode/wizard/0400-geo-location.lua | 5 ++--- 9 files changed, 38 insertions(+), 32 deletions(-) diff --git a/docs/site-example/i18n/de.po b/docs/site-example/i18n/de.po index 30f5c838..c3c763dd 100644 --- a/docs/site-example/i18n/de.po +++ b/docs/site-example/i18n/de.po @@ -42,3 +42,11 @@ msgstr "" "Betrieb für drei Sekunden den Reset-Button. Das Gerät wird dann im Config " "Mode neustarten.

" "

Viel Spaß mit deinem Knoten und der Erkundung von Freifunk!

" + +msgid "gluon-config-mode:altitude-label" +msgstr "Höhe" + +msgid "gluon-config-mode:altitude-help" +msgstr "" +"Die Höhenangabe ist optional und sollte nur gesetzt werden, wenn ein " +"exakter Wert bekannt ist." diff --git a/docs/site-example/i18n/en.po b/docs/site-example/i18n/en.po index e6d1e672..94aa8bc5 100644 --- a/docs/site-example/i18n/en.po +++ b/docs/site-example/i18n/en.po @@ -29,7 +29,6 @@ msgstr "" "<%= pubkey %>" "" - msgid "gluon-config-mode:reboot" msgstr "" "

The node is currently rebooting and will try to connect to other " @@ -40,3 +39,11 @@ msgstr "" "3 seconds during normal operation. The device will then reboot into config " "mode.

" "

Have fun with your node and exploring of the Freifunk network!

" + +msgid "gluon-config-mode:altitude-label" +msgstr "Altitude" + +msgid "gluon-config-mode:altitude-help" +msgstr "" +"Specifying the altitude is optional and should only be done if a proper " +"value is known." diff --git a/docs/site-example/i18n/fr.po b/docs/site-example/i18n/fr.po index 1462fdbf..c38dca6e 100644 --- a/docs/site-example/i18n/fr.po +++ b/docs/site-example/i18n/fr.po @@ -41,3 +41,11 @@ msgstr "" "fonctionement normal pendant 3 Secondes sur le bouton reset. L'appareil va ensuite " "redémarer en mode configuration.

" "

Profitez votre de nœud et amusez vous à découvrir le réseau Freifunk!

" + +msgid "gluon-config-mode:altitude-label" +msgstr "Hauteur" + +msgid "gluon-config-mode:altitude-help" +msgstr "" +"La altitude est optionelle et ne devrait que être ajoutée si la valeur " +"exacte est connue." diff --git a/docs/site-example/i18n/gluon-site.pot b/docs/site-example/i18n/gluon-site.pot index 670de410..a161a12b 100644 --- a/docs/site-example/i18n/gluon-site.pot +++ b/docs/site-example/i18n/gluon-site.pot @@ -9,3 +9,9 @@ msgstr "" msgid "gluon-config-mode:reboot" msgstr "" + +msgid "gluon-config-mode:altitude-label" +msgstr "" + +msgid "gluon-config-mode:altitude-help" +msgstr "" diff --git a/docs/user/site.rst b/docs/user/site.rst index 43e16d89..8e9371ee 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -364,6 +364,12 @@ gluon-config-mode:welcome gluon-config-mode:pubkey Information about the public VPN key on the reboot page. +gluon-config-mode:altitude-label + Label for the ``altitude`` field + +gluon-config-mode:altitude-help + Description for the usage of the ``altitude`` field + gluon-config-mode:reboot General information shown on the reboot page. diff --git a/package/gluon-config-mode-geo-location/i18n/de.po b/package/gluon-config-mode-geo-location/i18n/de.po index 3580732b..c8bc906a 100644 --- a/package/gluon-config-mode-geo-location/i18n/de.po +++ b/package/gluon-config-mode-geo-location/i18n/de.po @@ -17,22 +17,12 @@ msgstr "" "Um deinen Knoten auf der Karte anzeigen zu können, benötigen wir seine " "Koordinaten. Hier hast du die Möglichkeit, diese zu hinterlegen." -msgid "" -"Specifying the altitude is optional and should only be done if a proper " -"value is known." -msgstr "" -"Die Höhenangabe ist optional und sollte nur gesetzt werden, wenn ein " -"exakter Wert bekannt ist." - msgid "Latitude" msgstr "Breitengrad" msgid "Longitude" msgstr "Längengrad" -msgid "Altitude" -msgstr "Höhe" - msgid "Show node on the map" msgstr "Knoten auf der Karte anzeigen" diff --git a/package/gluon-config-mode-geo-location/i18n/fr.po b/package/gluon-config-mode-geo-location/i18n/fr.po index b239c84c..d3d7c6e8 100644 --- a/package/gluon-config-mode-geo-location/i18n/fr.po +++ b/package/gluon-config-mode-geo-location/i18n/fr.po @@ -17,22 +17,12 @@ msgstr "" "Pour Afficher votre nœud sur la Carte nous avons besoin de ses coordonnées. " "Ici vous pouvez entrer sa position." -msgid "" -"Specifying the altitude is optional and should only be done if a proper " -"value is known." -msgstr "" -"La altitude est optionelle et ne devrait que être ajoutée si la valeur " -"exacte est connue." - msgid "Latitude" msgstr "Latitude" msgid "Longitude" msgstr "Longitude" -msgid "Altitude" -msgstr "Hauteur" - msgid "Show node on the map" msgstr "Afficher le nœud sur la carte" diff --git a/package/gluon-config-mode-geo-location/i18n/gluon-config-mode-geo-location.pot b/package/gluon-config-mode-geo-location/i18n/gluon-config-mode-geo-location.pot index 48f26f70..7acf7f28 100644 --- a/package/gluon-config-mode-geo-location/i18n/gluon-config-mode-geo-location.pot +++ b/package/gluon-config-mode-geo-location/i18n/gluon-config-mode-geo-location.pot @@ -6,20 +6,12 @@ msgid "" "enter its coordinates here." msgstr "" -msgid "" -"Specifying the altitude is optional and should only be done if a proper " -"value is known." -msgstr "" - msgid "Latitude" msgstr "" msgid "Longitude" msgstr "" -msgid "Altitude" -msgstr "" - msgid "Show node on the map" msgstr "" diff --git a/package/gluon-config-mode-geo-location/luasrc/lib/gluon/config-mode/wizard/0400-geo-location.lua b/package/gluon-config-mode-geo-location/luasrc/lib/gluon/config-mode/wizard/0400-geo-location.lua index 9bc70301..04e9b144 100644 --- a/package/gluon-config-mode-geo-location/luasrc/lib/gluon/config-mode/wizard/0400-geo-location.lua +++ b/package/gluon-config-mode-geo-location/luasrc/lib/gluon/config-mode/wizard/0400-geo-location.lua @@ -19,8 +19,7 @@ function M.section(form) local text = i18n.translate('If you want the location of your node to ' .. 'be displayed on the map, you can enter its coordinates here.') if show_altitude() then - text = text .. ' ' .. i18n.translate('Specifying the altitude is ' - .. 'optional and should only be done if a proper value is known.') + text = text .. ' ' .. i18n.translate("gluon-config-mode:altitude-help") end local s = form:section(cbi.SimpleSection, nil, text) @@ -46,7 +45,7 @@ function M.section(form) o.description = i18n.translatef("e.g. %s", "10.689901") if show_altitude() then - o = s:option(cbi.Value, "_altitude", i18n.translate("Altitude")) + o = s:option(cbi.Value, "_altitude", i18n.translate("gluon-config-mode:altitude-label")) o.default = uci:get_first("gluon-node-info", "location", "altitude") o:depends("_location", "1") o.rmempty = true From 1f3e7894639e1d1e45bfdeecac52762e4daeb87b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 30 Nov 2016 15:27:06 +0100 Subject: [PATCH 052/126] gluon-next-node: fix ebtables rules without next_node.ip4 --- .../files/lib/gluon/ebtables/250-next-node | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node b/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node index 0df7abcc..abe297e7 100644 --- a/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node +++ b/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node @@ -1,18 +1,20 @@ local site = require 'gluon.site_config' local next_node = site.next_node -rule('FORWARD --logical-in br-client -p ARP --arp-ip-src ' .. next_node.ip4 .. ' -j DROP') -rule('FORWARD --logical-in br-client -p ARP --arp-ip-dst ' .. next_node.ip4 .. ' -j DROP') - rule('FORWARD --logical-out br-client -o bat0 -d ' .. next_node.mac .. ' -j DROP') rule('OUTPUT --logical-out br-client -o bat0 -d ' .. next_node.mac .. ' -j DROP') rule('FORWARD --logical-out br-client -o bat0 -s ' .. next_node.mac .. ' -j DROP') rule('OUTPUT --logical-out br-client -o bat0 -s ' .. next_node.mac .. ' -j DROP') -rule('FORWARD --logical-out br-client -o bat0 -p IPv4 --ip-destination ' .. next_node.ip4 .. ' -j DROP') -rule('OUTPUT --logical-out br-client -o bat0 -p IPv4 --ip-destination ' .. next_node.ip4 .. ' -j DROP') -rule('FORWARD --logical-out br-client -o bat0 -p IPv4 --ip-source ' .. next_node.ip4 .. ' -j DROP') -rule('OUTPUT --logical-out br-client -o bat0 -p IPv4 --ip-source ' .. next_node.ip4 .. ' -j DROP') +if next_node.ip4 then + rule('FORWARD --logical-in br-client -p ARP --arp-ip-src ' .. next_node.ip4 .. ' -j DROP') + rule('FORWARD --logical-in br-client -p ARP --arp-ip-dst ' .. next_node.ip4 .. ' -j DROP') + + rule('FORWARD --logical-out br-client -o bat0 -p IPv4 --ip-destination ' .. next_node.ip4 .. ' -j DROP') + rule('OUTPUT --logical-out br-client -o bat0 -p IPv4 --ip-destination ' .. next_node.ip4 .. ' -j DROP') + rule('FORWARD --logical-out br-client -o bat0 -p IPv4 --ip-source ' .. next_node.ip4 .. ' -j DROP') + rule('OUTPUT --logical-out br-client -o bat0 -p IPv4 --ip-source ' .. next_node.ip4 .. ' -j DROP') +end rule('FORWARD --logical-out br-client -o bat0 -p IPv6 --ip6-destination ' .. next_node.ip6 .. ' -j DROP') rule('OUTPUT --logical-out br-client -o bat0 -p IPv6 --ip6-destination ' .. next_node.ip6 .. ' -j DROP') From b32ed384c747b438796df99fadb5aaf4fa536a2e Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 3 Dec 2016 13:22:22 +0100 Subject: [PATCH 053/126] gluon-mesh-batman-adv-core: respondd: correctly detect lower interface types (#954) Fixes #941 --- .../gluon-mesh-batman-adv-core/src/respondd.c | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/package/gluon-mesh-batman-adv-core/src/respondd.c b/package/gluon-mesh-batman-adv-core/src/respondd.c index f21eb62e..ba14997a 100644 --- a/package/gluon-mesh-batman-adv-core/src/respondd.c +++ b/package/gluon-mesh-batman-adv-core/src/respondd.c @@ -121,9 +121,31 @@ static void mesh_add_subif(const char *ifname, struct json_object *wireless, struct json_object *tunnel, struct json_object *other) { struct json_object *address = gluonutil_wrap_and_free_string(gluonutil_get_interface_address(ifname)); - if (interface_file_exists(ifname, "wireless")) + char lowername[IFNAMSIZ]; + strncpy(lowername, ifname, sizeof(lowername)-1); + lowername[sizeof(lowername)-1] = 0; + + const char *format = "/sys/class/net/%s/lower_*"; + char pattern[strlen(format) + IFNAMSIZ]; + + /* In case of VLAN and bridge interfaces, we want the lower interface + * to determine the interface type (but not for the interface address) */ + while (true) { + snprintf(pattern, sizeof(pattern), format, lowername); + size_t pattern_len = strlen(pattern); + + glob_t lower; + if (glob(pattern, GLOB_NOSORT, NULL, &lower)) + break; + + strncpy(lowername, lower.gl_pathv[0] + pattern_len - 1, sizeof(lowername)-1); + + globfree(&lower); + } + + if (interface_file_exists(lowername, "wireless")) json_object_array_add(wireless, address); - else if (interface_file_exists(ifname, "tun_flags")) + else if (interface_file_exists(lowername, "tun_flags")) json_object_array_add(tunnel, address); else json_object_array_add(other, address); From eed79bc37c0acd0c1b09ebea2587549f156e88f5 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Mon, 5 Dec 2016 10:42:40 +0100 Subject: [PATCH 054/126] openwrt: Remove extra soc check in ath79_gpio_output_select (#965) The assignment of the gpio_count and reg_base in ath79_gpio_output_select takes care that only supported platforms can use ath79_gpio_output_select. But the rebase of the patches after the last OpenWrt base update accidentally added an extra check for the SoC which was missing support soc_is_qca955x(). Boots on QCA955X devices which were using ath79_gpio_output_select stopped with Kernel bug detected[#1]: [...] Call Trace: [<803e6174>] ath79_gpio_output_select+0x30/0xe8 [<803ed590>] om5p_acv2_setup+0x24/0x200 [<803e4dc0>] ath79_setup+0x28/0x38 [<80069ac8>] do_one_initcall+0x148/0x1ec [<803e2cc4>] kernel_init_freeable+0x150/0x208 [<80065218>] kernel_init+0x10/0x114 [<80060878>] ret_from_kernel_thread+0x14/0x1c Fixes: a22c1d5670c1 ("Update OpenWrt base") Signed-off-by: Sven Eckelmann --- patches/openwrt/0034-ar71xx-update-QCA956x-support.patch | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch b/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch index 7406d2f6..6ca69dda 100644 --- a/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch +++ b/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch @@ -380,7 +380,7 @@ index 2bb4286..61b8976 100644 + extern void __iomem *ath79_ddr_base; diff --git a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -index a36b8c3..fa4eba2 100644 +index a36b8c3..44c9c62 100644 --- a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch +++ b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch @@ -9,8 +9,8 @@ @@ -390,7 +390,7 @@ index a36b8c3..fa4eba2 100644 - soc_is_qca953x() || soc_is_qca956x()) -@@ -185,15 +186,27 @@ void __init ath79_gpio_output_select(uns + soc_is_qca953x() || -+@@ -187,15 +188,31 @@ void __init ath79_gpio_output_select(uns ++@@ -187,15 +188,30 @@ void __init ath79_gpio_output_select(uns { void __iomem *base = ath79_gpio_base; unsigned long flags; @@ -399,7 +399,7 @@ index a36b8c3..fa4eba2 100644 u32 t, s; -- BUG_ON(!soc_is_ar934x() && !soc_is_qca953x()); -+ BUG_ON(!soc_is_ar934x() && !soc_is_qca953x() && !soc_is_qca956x()); ++- BUG_ON(!soc_is_ar934x() && !soc_is_qca953x() && !soc_is_qca956x()); + if (soc_is_ar934x()) { + gpio_count = AR934X_GPIO_COUNT; + reg_base = AR934X_GPIO_REG_OUT_FUNC0; From a9e29725c045462d8cf9bd067aae9e1d4294c9d1 Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 5 Dec 2016 10:45:05 +0100 Subject: [PATCH 055/126] Add support for mvebu target (#964) --- targets/mvebu/profiles.mk | 10 ++++++++++ targets/targets.mk | 1 + 2 files changed, 11 insertions(+) create mode 100644 targets/mvebu/profiles.mk diff --git a/targets/mvebu/profiles.mk b/targets/mvebu/profiles.mk new file mode 100644 index 00000000..fcf72849 --- /dev/null +++ b/targets/mvebu/profiles.mk @@ -0,0 +1,10 @@ +# List of hardware profiles + +# Linksys WRT1200AC +$(eval $(call GluonProfile,Caiman,kmod-usb2 kmod-usb3 kmod-usb-storage kmod-i2c-core \ + kmod-i2c-mv64xxx kmod-ata-core kmod-ata-mvebu-ahci kmod-rtc-armada38x \ + kmod-thermal-armada kmod-gpio-button-hotplug kmod-hwmon-tmp421 kmod-leds-pca963x \ + kmod-ledtrig-usbdev kmod-mwlwifi swconfig)) +$(eval $(call GluonProfileFactorySuffix,Caiman,-squashfs-factory,.img)) +$(eval $(call GluonProfileSysupgradeSuffix,Caiman,-squashfs-sysupgrade,.tar)) +$(eval $(call GluonModel,Caiman,armada-385-linksys-caiman,linksys-wrt1200ac)) diff --git a/targets/targets.mk b/targets/targets.mk index c5fd657e..6b26a959 100644 --- a/targets/targets.mk +++ b/targets/targets.mk @@ -10,6 +10,7 @@ $(eval $(call GluonTarget,x86,xen_domu)) ifneq ($(BROKEN),) $(eval $(call GluonTarget,ar71xx,mikrotik)) # BROKEN: no sysupgrade support +$(eval $(call GluonTarget,mvebu)) # BROKEN: No AP+IBSS support $(eval $(call GluonTarget,ramips,mt7621)) # BROKEN: No AP+IBSS support, 11s has high packet loss $(eval $(call GluonTarget,ramips,rt305x)) # BROKEN: No AP+IBSS support $(eval $(call GluonTarget,sunxi)) # BROKEN: Untested, no sysupgrade support From e9835e3c98ce85e872e0b5ba68d59ce513da1874 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 5 Dec 2016 10:44:27 +0100 Subject: [PATCH 056/126] Update Gluon packages --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 23771539..d586f720 100644 --- a/modules +++ b/modules @@ -9,7 +9,7 @@ PACKAGES_OPENWRT_COMMIT=73776792f7d58e982be9e5819450d4875b273159 PACKAGES_OPENWRT_BRANCH=for-15.05 PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git -PACKAGES_GLUON_COMMIT=078ba81ed2e2e2a5845eac7099e9cc8e3b75ea12 +PACKAGES_GLUON_COMMIT=738d8a236583233c0d49bbef73ac9b721534d1fc PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git PACKAGES_ROUTING_COMMIT=a4eae82c155079a4372e4b910ec733f77288b717 From 28e697c4488278d0c9c95f91c7e7f6aa99bfdf31 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 6 Dec 2016 16:20:09 +0100 Subject: [PATCH 057/126] ar71xx: fix sysupgrade on TL-WR801ND v3 --- ...r71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 patches/openwrt/0082-ar71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch diff --git a/patches/openwrt/0082-ar71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch b/patches/openwrt/0082-ar71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch new file mode 100644 index 00000000..6719b989 --- /dev/null +++ b/patches/openwrt/0082-ar71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch @@ -0,0 +1,18 @@ +From: Matthias Schiffer +Date: Tue, 6 Dec 2016 16:18:49 +0100 +Subject: ar71xx: fix sysupgrade on TL-WR801ND v3 + +Signed-off-by: Matthias Schiffer + +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +index 4003b21..ee2e596 100755 +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +@@ -349,6 +349,7 @@ platform_check_image() { + tl-wa850re | \ + tl-wa860re | \ + tl-wa801nd-v2 | \ ++ tl-wa801nd-v3 | \ + tl-wa901nd | \ + tl-wa901nd-v2 | \ + tl-wa901nd-v3 | \ From 1677b62e4b6ba8372c1bc5211580fb877d1621d9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 6 Dec 2016 17:06:38 +0100 Subject: [PATCH 058/126] ar71xx: fix LEDs for TL-WA801ND v3, remove BROKEN --- ...sysupgrade-support-for-TL-WA801ND-v3.patch | 70 +++++++++++++++++++ ...71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch | 18 ----- targets/ar71xx-generic/profiles.mk | 4 +- 3 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch delete mode 100644 patches/openwrt/0082-ar71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch diff --git a/patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch b/patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch new file mode 100644 index 00000000..ffb357d0 --- /dev/null +++ b/patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch @@ -0,0 +1,70 @@ +From: Matthias Schiffer +Date: Tue, 6 Dec 2016 16:18:49 +0100 +Subject: ar71xx: fix LEDs and sysupgrade support for TL-WA801ND v3 + +Signed-off-by: Matthias Schiffer + +diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh +index 2c5d6af..6b0caa6 100644 +--- a/target/linux/ar71xx/base-files/etc/diag.sh ++++ b/target/linux/ar71xx/base-files/etc/diag.sh +@@ -274,6 +274,7 @@ get_status_led() { + tl-wr1043nd-v2 | \ + tl-wr741nd | \ + tl-wr741nd-v4 | \ ++ tl-wa801nd-v3 | \ + tl-wr841n-v1 | \ + tl-wr841n-v7 | \ + tl-wr841n-v8 | \ +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +index 2a0f996..849755f 100644 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +@@ -536,6 +536,11 @@ tl-wa901nd-v3) + ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" + ;; + ++tl-wa801nd-v3) ++ ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan" "eth1" ++ ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" ++ ;; ++ + tl-wr941nd | \ + tl-wr1041n-v2) + ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +index 4003b21..ee2e596 100755 +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +@@ -349,6 +349,7 @@ platform_check_image() { + tl-wa850re | \ + tl-wa860re | \ + tl-wa801nd-v2 | \ ++ tl-wa801nd-v3 | \ + tl-wa901nd | \ + tl-wa901nd-v2 | \ + tl-wa901nd-v3 | \ +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c +index 39cdb10..054c14e 100644 +--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c ++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c +@@ -24,7 +24,7 @@ + #include "machtypes.h" + + #define TL_WA801NDV3_GPIO_LED_WLAN 12 +-#define TL_WA801NDV3_GPIO_LED_QSS 13 ++#define TL_WA801NDV3_GPIO_LED_SYSTEM 13 + #define TL_WA801NDV3_GPIO_LED_SECURITY_RED 11 + #define TL_WA801NDV3_GPIO_LED_SECURITY_GREEN 15 + #define TL_WA801NDV3_GPIO_LED_LAN 3 +@@ -46,8 +46,8 @@ static struct flash_platform_data tl_wa801n_v3_flash_data = { + + static struct gpio_led tl_wa801n_v3_leds_gpio[] __initdata = { + { +- .name = "tp-link:green:qss", +- .gpio = TL_WA801NDV3_GPIO_LED_QSS, ++ .name = "tp-link:green:system", ++ .gpio = TL_WA801NDV3_GPIO_LED_SYSTEM, + .active_low = 1, + }, { + .name = "tp-link:green:lan", diff --git a/patches/openwrt/0082-ar71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch b/patches/openwrt/0082-ar71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch deleted file mode 100644 index 6719b989..00000000 --- a/patches/openwrt/0082-ar71xx-fix-sysupgrade-on-TL-WR801ND-v3.patch +++ /dev/null @@ -1,18 +0,0 @@ -From: Matthias Schiffer -Date: Tue, 6 Dec 2016 16:18:49 +0100 -Subject: ar71xx: fix sysupgrade on TL-WR801ND v3 - -Signed-off-by: Matthias Schiffer - -diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 4003b21..ee2e596 100755 ---- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -+++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -@@ -349,6 +349,7 @@ platform_check_image() { - tl-wa850re | \ - tl-wa860re | \ - tl-wa801nd-v2 | \ -+ tl-wa801nd-v3 | \ - tl-wa901nd | \ - tl-wa901nd-v2 | \ - tl-wa901nd-v3 | \ diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index 9c38a940..79ac78e5 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -66,9 +66,7 @@ $(eval $(call GluonModel,TLWR743,tl-wr743nd-v2,tp-link-tl-wr743n-nd-v2)) $(eval $(call GluonProfile,TLWA801)) $(eval $(call GluonModel,TLWA801,tl-wa801nd-v1,tp-link-tl-wa801n-nd-v1)) $(eval $(call GluonModel,TLWA801,tl-wa801nd-v2,tp-link-tl-wa801n-nd-v2)) -ifneq ($(BROKEN),) -$(eval $(call GluonModel,TLWA801,tl-wa801nd-v3,tp-link-tl-wa801n-nd-v3)) # BROKEN: untested -endif +$(eval $(call GluonModel,TLWA801,tl-wa801nd-v3,tp-link-tl-wa801n-nd-v3)) # TL-WR841N/ND v3, v5, v7, v8, v9, v10 $(eval $(call GluonProfile,TLWR841)) From cb9b2335af346751d421ebdf9cddb432f3cdf1d0 Mon Sep 17 00:00:00 2001 From: Ruben Barkow Date: Tue, 6 Dec 2016 20:02:51 +0100 Subject: [PATCH 059/126] docs: rename Freifunk Entenhausen to Alpha Centauri (#955) --- docs/site-example/i18n/de.po | 12 ++++++------ docs/site-example/i18n/en.po | 11 +++++------ docs/site-example/i18n/fr.po | 4 ++-- docs/site-example/site.conf | 6 +++--- docs/user/getting_started.rst | 2 +- docs/user/site.rst | 24 ++++++++++++------------ 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/docs/site-example/i18n/de.po b/docs/site-example/i18n/de.po index c3c763dd..872d2d1c 100644 --- a/docs/site-example/i18n/de.po +++ b/docs/site-example/i18n/de.po @@ -12,18 +12,18 @@ msgstr "" msgid "gluon-config-mode:welcome" msgstr "" -"Willkommen zum Einrichtungsassistenten für deinen neuen Entenhausener " +"Willkommen zum Einrichtungsassistenten für deinen neuen Alpha Centauri " "Freifunk-Knoten. Fülle das folgende Formular deinen Vorstellungen " "entsprechend aus und sende es ab." msgid "gluon-config-mode:pubkey" msgstr "" "

Dies ist der öffentliche Schlüssel deines Freifunk-Knotens. Erst nachdem " -"er auf den Servern des Entenhausener Freifunk-Projektes eingetragen wurde, " -"kann sich dein Knoten mit dem Entenhausener Mesh-VPN verbinden. Bitte " +"er auf den Servern des Freifunk-Projektes auf Alpha Centauri eingetragen wurde, " +"kann sich dein Knoten mit dem Mesh-VPN dort verbinden. Bitte " "schicke dazu diesen Schlüssel und den Namen deines Knotens " "(<%=escape(hostname)%>) an " -"keys@entenhausen.freifunk.net." +"keys@alpha-centauri.freifunk.net." "

" "
" " # <%= escape(hostname) %>" @@ -36,8 +36,8 @@ msgstr "" "

Dein Knoten startet gerade neu und wird anschließend versuchen, " "sich mit anderen Freifunkknoten in seiner Nähe zu " "verbinden. Weitere Informationen zur " -"Entenhausener Freifunk-Community findest du auf " -"unserer Webseite.

" +"Alpha Centauri Freifunk-Community findest du auf " +"unserer Webseite.

" "

Um zu dieser Konfigurationsseite zurückzugelangen, drücke im normalen " "Betrieb für drei Sekunden den Reset-Button. Das Gerät wird dann im Config " "Mode neustarten.

" diff --git a/docs/site-example/i18n/en.po b/docs/site-example/i18n/en.po index 94aa8bc5..e119818b 100644 --- a/docs/site-example/i18n/en.po +++ b/docs/site-example/i18n/en.po @@ -12,16 +12,15 @@ msgstr "" msgid "gluon-config-mode:welcome" msgstr "" -"Welcome to the setup wizard of your new Freifunk Duckburg node. " +"Welcome to the setup wizard of your new Freifunk Alpha Centauri node. " "Please fill out the following form and submit it." msgid "gluon-config-mode:pubkey" msgstr "" "

This is your Freifunk node's public key. The node won't be able to " -"connect to the mesh VPN until the key has been registered on the Freifunk " -"Duckburg servers. " +"connect to the mesh VPN until the key has been registered on the Freifunk servers. " "To register, send the key together with your node's name (<%=escape(hostname)%>) to " -"keys@entenhausen.freifunk.net." +"keys@alpha-centauri.freifunk.net." "

" "
" " # <%= escape(hostname) %>" @@ -33,8 +32,8 @@ msgid "gluon-config-mode:reboot" msgstr "" "

The node is currently rebooting and will try to connect to other " "nearby Freifunk nodes after that. " -"For more information on the Freifunk Duckburg community, have a look at " -"our homepage.

" +"For more information on the Freifunk Alpha Centauri community, have a look at " +"our homepage.

" "

To get back to this configuration interface, press the reset button for " "3 seconds during normal operation. The device will then reboot into config " "mode.

" diff --git a/docs/site-example/i18n/fr.po b/docs/site-example/i18n/fr.po index c38dca6e..e83ce0de 100644 --- a/docs/site-example/i18n/fr.po +++ b/docs/site-example/i18n/fr.po @@ -23,7 +23,7 @@ msgstr "" "sur les serveur Mesh-VPN de votre groupe Freifunk. Veuillez envoyer la clé avec le " "nom de votre nœud " "(<%=escape(hostname)%>) à " -"keys@entenhausen.freifunk.net." +"keys@alpha-centauri.freifunk.net." "

" "
" " # <%= escape(hostname) %>" @@ -36,7 +36,7 @@ msgstr "" "

Votre nœud es en train de redémarrer et va ensuite éssayer de se connecter " "avec les autres nœuds du réseau Freifunk " "Vous pourrez trouver plus d'informations sur votre groupe Freifunk sur la page " -" de ton groupe .

" +" de ton groupe .

" "

Pour retrouver cette page de configuration veuillier appuyez pendant le " "fonctionement normal pendant 3 Secondes sur le bouton reset. L'appareil va ensuite " "redémarer en mode configuration.

" diff --git a/docs/site-example/site.conf b/docs/site-example/site.conf index 8949ebb9..07639b18 100644 --- a/docs/site-example/site.conf +++ b/docs/site-example/site.conf @@ -10,7 +10,7 @@ -- hostname_prefix = 'freifunk-', -- Name of the community. - site_name = 'Freifunk Entenhausen', + site_name = 'Freifunk Alpha Centauri', -- Shorthand of the community. site_code = 'ffxx', @@ -47,7 +47,7 @@ -- ESSID used for client network. ap = { - ssid = 'entenhausen.freifunk.net', + ssid = 'alpha-centauri.freifunk.net', -- disabled = true, (optional) }, @@ -65,7 +65,7 @@ wifi5 = { channel = 44, ap = { - ssid = 'entenhausen.freifunk.net', + ssid = 'alpha-centauri.freifunk.net', }, mesh = { id = 'ffxx-mesh', diff --git a/docs/user/getting_started.rst b/docs/user/getting_started.rst index f5f4759d..5bb81b5a 100644 --- a/docs/user/getting_started.rst +++ b/docs/user/getting_started.rst @@ -59,7 +59,7 @@ Now, enter the freshly created directory:: It's time to add (or create) your site configuration. If you already have a site repository, just clone it:: - git clone https://github.com/freifunk-duckburg/site-ffdb.git site + git clone https://github.com/freifunk-alpha-centauri/site-ffac.git site If you want to build a new site, create a new git repository *site/*:: diff --git a/docs/user/site.rst b/docs/user/site.rst index 8e9371ee..eb830416 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -46,7 +46,7 @@ ntp_server List of NTP servers available in your community or used by your community, e.g.: :: - ntp_servers = {'1.ntp.services.ffeh','2.ntp.services.ffeh'} + ntp_servers = {'1.ntp.services.ffac','2.ntp.services.ffac'} This NTP servers must be reachable via IPv6 from the nodes. If you don't want to set an IPv6 address explicitly, but use a hostname (which is recommended), see also the :ref:`FAQ `. @@ -62,9 +62,9 @@ opkg \: optional :: opkg = { - openwrt = 'http://opkg.services.ffeh/openwrt/%n/%v/%S/packages', + openwrt = 'http://opkg.services.ffac/openwrt/%n/%v/%S/packages', extra = { - modules = 'http://opkg.services.ffeh/modules/gluon-%GS-%GR/%S', + modules = 'http://opkg.services.ffac/modules/gluon-%GS-%GR/%S', }, } @@ -124,10 +124,10 @@ wifi24 \: optional supported_rates = {6000, 9000, 12000, 18000, 24000, 36000, 48000, 54000}, basic_rate = {6000, 9000, 18000, 36000, 54000}, ap = { - ssid = 'entenhausen.freifunk.net', + ssid = 'alpha-centauri.freifunk.net', }, mesh = { - id = 'entenhausen-mesh', + id = 'alpha-centauri-mesh', mcast_rate = 12000, }, ibss = { @@ -202,14 +202,14 @@ fastd_mesh_vpn key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', -- Having multiple domains prevents SPOF in freifunk.net remotes = { - 'ipv4 "vpn1.entenhausen.freifunk.net" port 10000', - 'ipv4 "vpn1.entenhausener-freifunk.de" port 10000', + 'ipv4 "vpn1.alpha-centauri.freifunk.net" port 10000', + 'ipv4 "vpn1.alpha-centauri-freifunk.de" port 10000', }, }, peer2 = { key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', -- You can also omit the ipv4 to allow both connection via ipv4 and ipv6 - remotes = {'"vpn2.entenhausen.freifunk.net" port 10000'}, + remotes = {'"vpn2.alpha-centauri.freifunk.net" port 10000'}, }, }, -- Optional: nested peer groups @@ -262,7 +262,7 @@ autoupdater \: package name = 'stable', mirrors = { 'http://[fdca:ffee:babe:1::fec1]/firmware/stable/sysupgrade/', - 'http://autoupdate.entenhausen.freifunk.net/firmware/stable/sysupgrade/', + 'http://autoupdate.alpha-centauri.freifunk.net/firmware/stable/sysupgrade/', }, -- Number of good signatures required good_signatures = 2, @@ -317,9 +317,9 @@ legacy \: package legacy = { version_files = {'/etc/.freifunk_version_keep', '/etc/.eff_version_keep'}, - old_files = {'/etc/config/config_mode', '/etc/config/ffeh', '/etc/config/freifunk'}, - config_mode_configs = {'config_mode', 'ffeh', 'freifunk'}, - fastd_configs = {'ffeh_mesh_vpn', 'mesh_vpn'}, + old_files = {'/etc/config/config_mode', '/etc/config/ffac', '/etc/config/freifunk'}, + config_mode_configs = {'config_mode', 'ffac', 'freifunk'}, + fastd_configs = {'ffac_mesh_vpn', 'mesh_vpn'}, mesh_ifname = 'freifunk', tc_configs = {'ffki', 'freifunk'}, wifi_names = {'wifi_freifunk', 'wifi_freifunk5', 'wifi_mesh', 'wifi_mesh5'}, From 2a101ddd561057c4b82bc29dbc1d3028e848d1bf Mon Sep 17 00:00:00 2001 From: rubo77 Date: Wed, 16 Nov 2016 09:26:03 +0100 Subject: [PATCH 060/126] gluon-core: add dirty flag to gluon-version, add site-version --- include/gluon.mk | 5 ++++- package/gluon-core/Makefile | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/gluon.mk b/include/gluon.mk index ef0f5311..29ecf3ed 100644 --- a/include/gluon.mk +++ b/include/gluon.mk @@ -35,9 +35,12 @@ $(GLUON_SITEDIR)/site.mk: -include $(GLUON_SITEDIR)/site.mk -GLUON_VERSION := $(shell cd $(GLUONDIR) && git describe --always 2>/dev/null || echo unknown) +GLUON_VERSION := $(shell cd $(GLUONDIR) && git describe --always --dirty=+ 2>/dev/null || echo unknown) export GLUON_VERSION +GLUON_SITE_VERSION := $(shell cd $(GLUON_SITEDIR) && git --git-dir=.git describe --always --dirty=+ 2>/dev/null || echo unknown) +export GLUON_SITE_VERSION + GLUON_LANGS ?= en export GLUON_LANGS diff --git a/package/gluon-core/Makefile b/package/gluon-core/Makefile index 2b9cfb47..9917a5e0 100644 --- a/package/gluon-core/Makefile +++ b/package/gluon-core/Makefile @@ -38,6 +38,7 @@ define Package/gluon-core/install $(INSTALL_DIR) $(1)/lib/gluon echo "$(GLUON_VERSION)" > $(1)/lib/gluon/gluon-version + echo "$(GLUON_SITE_VERSION)" > $(1)/lib/gluon/site-version endef define Package/gluon-core/postinst From 3fd0ca77c73450a6b3c9989389be41540fc5f8fa Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 7 Dec 2016 11:43:50 +0100 Subject: [PATCH 061/126] docs: feature/roles: update outdates site config docs --- docs/features/roles.rst | 16 ++++++++++------ docs/user/site.rst | 6 +++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/docs/features/roles.rst b/docs/features/roles.rst index 4cbf1f29..a4a8ab59 100644 --- a/docs/features/roles.rst +++ b/docs/features/roles.rst @@ -2,7 +2,7 @@ Roles ===== It is possible to define a set of roles you want to distinguish at backend side. One node can own one -role which it will announce via alfred inside the mesh. This will make it easier to differentiate +role which it will announce via alfred inside the mesh. This will make it easier to differentiate nodes when parsing alfred data. E.g to count only **normal** nodes and not the gateways or servers (nodemap). A lot of things are possible. @@ -11,17 +11,21 @@ For this the section ``roles`` in ``site.conf`` is needed:: roles = { default = 'node', list = { - node = 'Normal Node', - test = 'Test Node', - backbone = 'Backbone Node', - service = 'Service Node', + 'node', + 'test', + 'backbone', + 'service', }, }, +The strings to display in the LuCI interface are configured per language in the +``i18n/en.po``, ``i18n/de.po``, etc. files of the site repository using message IDs like +``gluon-luci-node-role:role:node`` and ``gluon-luci-node-role:role:backbone``. + The value of ``default`` is the role every node will initially own. This value should be part of ``list`` as well. If you want node owners to change the defined roles via config-mode you can add the package ``gluon-luci-node-role`` to your ``site.mk``. Then, you can select one of the defined roles from a dropdown list -where the right-handed value is the one which is displayed and the left-handed key the one which is configured into +where the right-handed value is the one which is displayed and the left-handed key the one which is configured into the system. The role is saved in ``gluon-node-info.system.role``. To change the role using command line do:: diff --git a/docs/user/site.rst b/docs/user/site.rst index eb830416..bb7f7542 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -183,7 +183,7 @@ fastd_mesh_vpn In any case, the ``null`` method should always be the first method in the list if it is supported at all. You should only set `configurable` to `true` if the configured peers support both the ``null`` method and methods with encryption. - + You can set syslog_level from verbose (default) to warn to reduce syslog output. :: @@ -286,7 +286,7 @@ roles \: optional part of ``list``. If you want node owners to change the role via config mode add the package ``gluon-luci-node-role`` to ``site.mk``. - The strings to display in the LuCI interface can be configured per language in the + The strings to display in the LuCI interface are configured per language in the ``i18n/en.po``, ``i18n/de.po``, etc. files of the site repository using message IDs like ``gluon-luci-node-role:role:node`` and ``gluon-luci-node-role:role:backbone``. :: @@ -366,7 +366,7 @@ gluon-config-mode:pubkey gluon-config-mode:altitude-label Label for the ``altitude`` field - + gluon-config-mode:altitude-help Description for the usage of the ``altitude`` field From ddf021739591ee97c4baf9e081fef5011744ae84 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 7 Dec 2016 11:46:18 +0100 Subject: [PATCH 062/126] docs: feature/roles: remove another outdates sentence --- docs/features/roles.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/features/roles.rst b/docs/features/roles.rst index a4a8ab59..38d84f85 100644 --- a/docs/features/roles.rst +++ b/docs/features/roles.rst @@ -24,9 +24,7 @@ The strings to display in the LuCI interface are configured per language in the The value of ``default`` is the role every node will initially own. This value should be part of ``list`` as well. If you want node owners to change the defined roles via config-mode you can add the package -``gluon-luci-node-role`` to your ``site.mk``. Then, you can select one of the defined roles from a dropdown list -where the right-handed value is the one which is displayed and the left-handed key the one which is configured into -the system. +``gluon-luci-node-role`` to your ``site.mk``. The role is saved in ``gluon-node-info.system.role``. To change the role using command line do:: From ca57cdfe77b73351708f3b18235f508a42bccac9 Mon Sep 17 00:00:00 2001 From: Christof Schulze Date: Thu, 8 Dec 2016 17:44:29 +0100 Subject: [PATCH 063/126] gluon-respondd: make initialisation mesh protocol agnostic (#946) --- .../files/lib/gluon/respondd/client.dev | 1 + .../etc/hotplug.d/iface/10-gluon-respondd | 24 +++---------------- .../files/etc/init.d/gluon-respondd | 7 ++++-- .../gluon/core/mesh/setup.d/10-gluon-respondd | 2 ++ 4 files changed, 11 insertions(+), 23 deletions(-) create mode 100644 package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev create mode 100644 package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev b/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev new file mode 100644 index 00000000..30594e2c --- /dev/null +++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev @@ -0,0 +1 @@ +br-client diff --git a/package/gluon-respondd/files/etc/hotplug.d/iface/10-gluon-respondd b/package/gluon-respondd/files/etc/hotplug.d/iface/10-gluon-respondd index 4f49be52..564559e7 100644 --- a/package/gluon-respondd/files/etc/hotplug.d/iface/10-gluon-respondd +++ b/package/gluon-respondd/files/etc/hotplug.d/iface/10-gluon-respondd @@ -1,34 +1,16 @@ #!/bin/sh -. /usr/share/libubox/jshn.sh . /lib/functions/service.sh -DEVLIST=/var/run/gluon-respondd.devs - ifname_to_dev () { - json_load "$(ubus call network.interface.$1 status)" - json_get_var dev device - - echo "$dev" + ifstatus client "$1"|jsonfilter -e "@.device" } case "$ACTION" in - ifdown) - sed "/ $INTERFACE$/d" $DEVLIST > $DEVLIST.new - mv $DEVLIST.new $DEVLIST - ;; ifup) DEVICE="$(ifname_to_dev "$INTERFACE")" - MESH="$(cat "/sys/class/net/$DEVICE/batman_adv/mesh_iface" 2>/dev/null)" - - [ "$MESH" = "bat0" -o "$INTERFACE" = "client" ] || exit 0 - - DEVS=$(cat $DEVLIST 2>/dev/null; echo $DEVICE $INTERFACE) - - echo "$DEVS" | sort -u > $DEVLIST.new - mv $DEVLIST.new $DEVLIST - - /etc/init.d/gluon-respondd restart_if_running & + [ "$DEVICE" != "$(cat /lib/gluon/respondd/client.dev 2>/dev/null)" ] || + /etc/init.d/gluon-respondd restart_if_running & ;; esac diff --git a/package/gluon-respondd/files/etc/init.d/gluon-respondd b/package/gluon-respondd/files/etc/init.d/gluon-respondd index a1bf979f..49afef4f 100755 --- a/package/gluon-respondd/files/etc/init.d/gluon-respondd +++ b/package/gluon-respondd/files/etc/init.d/gluon-respondd @@ -7,13 +7,16 @@ START=50 SERVICE_WRITE_PID=1 SERVICE_DAEMONIZE=1 -DEVLIST=/var/run/gluon-respondd.devs DAEMON=/usr/bin/respondd LOCK=/var/run/gluon-respondd.lock do_start() { - DEVS=$(cat $DEVLIST 2>/dev/null | while read dev iface; do echo -n " -i $dev"; done) + DEVS="" + for dev in $( ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device") $(cat /lib/gluon/respondd/client.dev 2>/dev/null) + do + DEVS="$DEVS -i $dev" + done service_start $DAEMON -g ff02::2:1001 -p 1001 -d /lib/gluon/respondd $DEVS } diff --git a/package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd b/package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd new file mode 100644 index 00000000..811386e0 --- /dev/null +++ b/package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd @@ -0,0 +1,2 @@ +#!/bin/sh +/etc/init.d/gluon-respondd restart_if_running & From 1f927af82ee00664cdc2e9fefc51780d6d3c6b75 Mon Sep 17 00:00:00 2001 From: "txt.file" Date: Wed, 7 Dec 2016 01:44:46 +0100 Subject: [PATCH 064/126] docs: fix typo in docs/user/site.rst --- docs/user/site.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user/site.rst b/docs/user/site.rst index bb7f7542..df8525be 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -98,7 +98,7 @@ wifi24 \: optional Each interface may be disabled by setting ``disabled`` to ``true``. This will only affect new installations. - Upgrades will not changed the disabled state. + Upgrades will not change the disabled state. Additionally it is possible to configure the ``supported_rates`` and ``basic_rate`` of each radio. Both are optional, by default hostapd/driver dictate the rates. From cb86fce29f5572119228ee98a4db5a9d9f7e27d9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Thu, 8 Dec 2016 23:02:23 +0100 Subject: [PATCH 065/126] gluon-respondd: make setup.d script executable --- .../files/lib/gluon/core/mesh/setup.d/10-gluon-respondd | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd diff --git a/package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd b/package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd old mode 100644 new mode 100755 From d8bb97831b197c543d9727f1c81539bb6fba127a Mon Sep 17 00:00:00 2001 From: Jan-Philipp Litza Date: Thu, 8 Dec 2016 23:13:56 +0100 Subject: [PATCH 066/126] gluon-respondd: Use procd in initscript and to restart on network changes --- .../etc/hotplug.d/iface/10-gluon-respondd | 16 ------- .../files/etc/init.d/gluon-respondd | 48 ++++++------------- .../gluon/core/mesh/setup.d/10-gluon-respondd | 2 - 3 files changed, 14 insertions(+), 52 deletions(-) delete mode 100644 package/gluon-respondd/files/etc/hotplug.d/iface/10-gluon-respondd delete mode 100755 package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd diff --git a/package/gluon-respondd/files/etc/hotplug.d/iface/10-gluon-respondd b/package/gluon-respondd/files/etc/hotplug.d/iface/10-gluon-respondd deleted file mode 100644 index 564559e7..00000000 --- a/package/gluon-respondd/files/etc/hotplug.d/iface/10-gluon-respondd +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh - -. /lib/functions/service.sh - -ifname_to_dev () { - ifstatus client "$1"|jsonfilter -e "@.device" -} - -case "$ACTION" in - ifup) - DEVICE="$(ifname_to_dev "$INTERFACE")" - - [ "$DEVICE" != "$(cat /lib/gluon/respondd/client.dev 2>/dev/null)" ] || - /etc/init.d/gluon-respondd restart_if_running & - ;; -esac diff --git a/package/gluon-respondd/files/etc/init.d/gluon-respondd b/package/gluon-respondd/files/etc/init.d/gluon-respondd index 49afef4f..6b61d731 100755 --- a/package/gluon-respondd/files/etc/init.d/gluon-respondd +++ b/package/gluon-respondd/files/etc/init.d/gluon-respondd @@ -1,48 +1,28 @@ #!/bin/sh /etc/rc.common -EXTRA_COMMANDS='restart_if_running' - +USE_PROCD=1 START=50 -SERVICE_WRITE_PID=1 -SERVICE_DAEMONIZE=1 - DAEMON=/usr/bin/respondd -LOCK=/var/run/gluon-respondd.lock - -do_start() { +start_service() { DEVS="" for dev in $( ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device") $(cat /lib/gluon/respondd/client.dev 2>/dev/null) do DEVS="$DEVS -i $dev" done - service_start $DAEMON -g ff02::2:1001 -p 1001 -d /lib/gluon/respondd $DEVS + procd_open_instance + procd_set_param command $DAEMON -g ff02::2:1001 -p 1001 -d /lib/gluon/respondd $DEVS + procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} + procd_set_param stderr 1 + procd_close_instance } -do_stop() { - service_stop $DAEMON -} - -start() { - lock $LOCK - do_start - lock -u $LOCK -} - -stop() { - lock $LOCK - do_stop - lock -u $LOCK -} - -restart_if_running() { - lock $LOCK - - if service_check $DAEMON; then - do_stop - do_start - fi - - lock -u $LOCK +service_triggers() { + local script=$(readlink "$initscript") + local name=$(basename ${script:-$initscript}) + + procd_open_trigger + procd_add_raw_trigger "interface.*" 0 "/etc/init.d/$name" reload + procd_close_trigger } diff --git a/package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd b/package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd deleted file mode 100755 index 811386e0..00000000 --- a/package/gluon-respondd/files/lib/gluon/core/mesh/setup.d/10-gluon-respondd +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -/etc/init.d/gluon-respondd restart_if_running & From 4a1b47de4583e5e3f16783cc17bddd6d962213ab Mon Sep 17 00:00:00 2001 From: Christof Schulze Date: Thu, 8 Dec 2016 23:56:43 +0100 Subject: [PATCH 067/126] docs: dev/basics: add rules for coding guide (#970) * use tabs instead of spaces * use jsonfilter for speed --- docs/dev/basics.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/dev/basics.rst b/docs/dev/basics.rst index 54febc30..2f4d1d89 100644 --- a/docs/dev/basics.rst +++ b/docs/dev/basics.rst @@ -55,4 +55,11 @@ should be considered: - Is the script doing more than just executing external commands? if so, use lua - Is the script parsing/editing json-data? If so, use lua for speed +- When using sh, use jsonfilter instead of json_* functions for speed +Code formatting may sound like a topic for the pedantic, however it helps if +the code in the project is formatted in the same way. The following rules +apply: + +- use tabs instead of spaces +- trailing whitespaces must be eliminated From fcf3abd9c42a777804bd1f3512363abc95164f3b Mon Sep 17 00:00:00 2001 From: Jan-Philipp Litza Date: Fri, 9 Dec 2016 10:43:24 +0100 Subject: [PATCH 068/126] gluon-respondd: restart on state change of client iface Because we unconditionally appended `-i br-client` to the command line of respondd, it wasn't restarted when br-client changed state. Now, we use a jsonfilter expression on the network.interface dump data, similar to how the other interface names are generated, and only add the interface to the argument list if it is up. --- .../files/lib/gluon/respondd/client.dev | 2 +- package/gluon-respondd/files/etc/init.d/gluon-respondd | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev b/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev index 30594e2c..b051c6c5 100644 --- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev +++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev @@ -1 +1 @@ -br-client +client diff --git a/package/gluon-respondd/files/etc/init.d/gluon-respondd b/package/gluon-respondd/files/etc/init.d/gluon-respondd index 6b61d731..412f1153 100755 --- a/package/gluon-respondd/files/etc/init.d/gluon-respondd +++ b/package/gluon-respondd/files/etc/init.d/gluon-respondd @@ -7,7 +7,9 @@ DAEMON=/usr/bin/respondd start_service() { DEVS="" - for dev in $( ubus call network.interface dump | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device") $(cat /lib/gluon/respondd/client.dev 2>/dev/null) + for dev in $( ubus call network.interface dump | jsonfilter \ + -e "@.interface[@.proto='gluon_mesh' && @.up=true].device" \ + -e "@.interface[@.interface='$(cat /lib/gluon/respondd/client.dev 2>/dev/null)' && @.up=true].device") do DEVS="$DEVS -i $dev" done From fb85d96d5e4007751ec5290f64cc5f5066e0e17a Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 30 Nov 2016 15:27:33 +0100 Subject: [PATCH 069/126] gluon-next-node: don't require next_node.ip6 The next-node interface may be useful with IPv4 only or even just a MAC address. This prepares merging gluon-next-node into gluon-batman-adv-core. --- package/gluon-next-node/check_site.lua | 2 +- .../files/lib/gluon/ebtables/250-next-node | 10 ++++++---- .../files/lib/gluon/upgrade/400-next-node | 8 ++++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/package/gluon-next-node/check_site.lua b/package/gluon-next-node/check_site.lua index b38de2a4..b4d7dd2c 100644 --- a/package/gluon-next-node/check_site.lua +++ b/package/gluon-next-node/check_site.lua @@ -2,6 +2,6 @@ if need_string_match('next_node.ip4', '^%d+.%d+.%d+.%d+$', false) then need_string_match('prefix4', '^%d+.%d+.%d+.%d+/%d+$') end -need_string_match('next_node.ip6', '^[%x:]+$') +need_string_match('next_node.ip6', '^[%x:]+$', false) need_string_match('next_node.mac', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') diff --git a/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node b/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node index abe297e7..64b32859 100644 --- a/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node +++ b/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node @@ -16,7 +16,9 @@ if next_node.ip4 then rule('OUTPUT --logical-out br-client -o bat0 -p IPv4 --ip-source ' .. next_node.ip4 .. ' -j DROP') end -rule('FORWARD --logical-out br-client -o bat0 -p IPv6 --ip6-destination ' .. next_node.ip6 .. ' -j DROP') -rule('OUTPUT --logical-out br-client -o bat0 -p IPv6 --ip6-destination ' .. next_node.ip6 .. ' -j DROP') -rule('FORWARD --logical-out br-client -o bat0 -p IPv6 --ip6-source ' .. next_node.ip6 .. ' -j DROP') -rule('OUTPUT --logical-out br-client -o bat0 -p IPv6 --ip6-source ' .. next_node.ip6 .. ' -j DROP') +if next_node.ip6 then + rule('FORWARD --logical-out br-client -o bat0 -p IPv6 --ip6-destination ' .. next_node.ip6 .. ' -j DROP') + rule('OUTPUT --logical-out br-client -o bat0 -p IPv6 --ip6-destination ' .. next_node.ip6 .. ' -j DROP') + rule('FORWARD --logical-out br-client -o bat0 -p IPv6 --ip6-source ' .. next_node.ip6 .. ' -j DROP') + rule('OUTPUT --logical-out br-client -o bat0 -p IPv6 --ip6-source ' .. next_node.ip6 .. ' -j DROP') +end diff --git a/package/gluon-next-node/files/lib/gluon/upgrade/400-next-node b/package/gluon-next-node/files/lib/gluon/upgrade/400-next-node index e8ecfca4..98dffbc9 100755 --- a/package/gluon-next-node/files/lib/gluon/upgrade/400-next-node +++ b/package/gluon-next-node/files/lib/gluon/upgrade/400-next-node @@ -17,13 +17,17 @@ c:section('network', 'device', 'local_node_dev', } ) -local ip4, netmask +local ip4, netmask, ip6 if site.next_node.ip4 then ip4 = site.next_node.ip4 netmask = ip.IPv4(site.prefix4):mask():string() end +if site.next_node.ip6 then + ip6 = site.next_node.ip6 .. '/128' +end + c:delete('network', 'local_node') c:section('network', 'interface', 'local_node', { @@ -31,7 +35,7 @@ c:section('network', 'interface', 'local_node', proto = 'static', ipaddr = ip4, netmask = netmask, - ip6addr = site.next_node.ip6 .. '/128', + ip6addr = ip6, } ) From 3fc9154d1dce2d873d26e3a4d88252d1ec7a38b0 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 30 Nov 2016 15:02:00 +0100 Subject: [PATCH 070/126] gluon-batman-adv-core: merge gluon-next-node into gluon-batman-adv-core --- docs/site-example/site.mk | 1 - package/gluon-mesh-batman-adv-core/Makefile | 2 +- .../gluon-mesh-batman-adv-core/check_site.lua | 38 ++++++++++------- .../files/lib/gluon/ebtables/250-next-node | 0 .../luasrc}/lib/gluon/upgrade/400-next-node | 0 package/gluon-next-node/Makefile | 41 ------------------- package/gluon-next-node/check_site.lua | 7 ---- 7 files changed, 24 insertions(+), 65 deletions(-) rename package/{gluon-next-node => gluon-mesh-batman-adv-core}/files/lib/gluon/ebtables/250-next-node (100%) rename package/{gluon-next-node/files => gluon-mesh-batman-adv-core/luasrc}/lib/gluon/upgrade/400-next-node (100%) delete mode 100644 package/gluon-next-node/Makefile delete mode 100644 package/gluon-next-node/check_site.lua diff --git a/docs/site-example/site.mk b/docs/site-example/site.mk index 9f729890..f55db144 100644 --- a/docs/site-example/site.mk +++ b/docs/site-example/site.mk @@ -21,7 +21,6 @@ GLUON_SITE_PACKAGES := \ gluon-luci-autoupdater \ gluon-luci-portconfig \ gluon-luci-wifi-config \ - gluon-next-node \ gluon-mesh-vpn-fastd \ gluon-radvd \ gluon-setup-mode \ diff --git a/package/gluon-mesh-batman-adv-core/Makefile b/package/gluon-mesh-batman-adv-core/Makefile index efcf1698..25c3b9b0 100644 --- a/package/gluon-mesh-batman-adv-core/Makefile +++ b/package/gluon-mesh-batman-adv-core/Makefile @@ -13,7 +13,7 @@ define Package/gluon-mesh-batman-adv-core SECTION:=gluon CATEGORY:=Gluon TITLE:=Support for batman-adv meshing (core) - DEPENDS:=+gluon-core +libgluonutil +gluon-client-bridge +firewall +libiwinfo +kmod-dummy + DEPENDS:=+gluon-core +libgluonutil +gluon-client-bridge +gluon-ebtables +firewall +libiwinfo +kmod-dummy +kmod-macvlan endef define Build/Prepare diff --git a/package/gluon-mesh-batman-adv-core/check_site.lua b/package/gluon-mesh-batman-adv-core/check_site.lua index 07bf9a0a..bd0c00a4 100644 --- a/package/gluon-mesh-batman-adv-core/check_site.lua +++ b/package/gluon-mesh-batman-adv-core/check_site.lua @@ -1,25 +1,33 @@ for _, config in ipairs({'wifi24', 'wifi5'}) do - local rates = {1000, 2000, 5500, 6000, 9000, 11000, 12000, 18000, 24000, 36000, 48000, 54000} - rates = need_array_of(config .. '.supported_rates', rates, false) or rates + local rates = {1000, 2000, 5500, 6000, 9000, 11000, 12000, 18000, 24000, 36000, 48000, 54000} + rates = need_array_of(config .. '.supported_rates', rates, false) or rates - if need_table(config .. '.ibss', nil, false) then - need_string(config .. '.ibss.ssid') - need_string_match(config .. '.ibss.bssid', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') - need_one_of(config .. '.ibss.mcast_rate', rates, false) - need_number(config .. '.ibss.vlan', false) - need_boolean(config .. '.ibss.disabled', false) - end + if need_table(config .. '.ibss', nil, false) then + need_string(config .. '.ibss.ssid') + need_string_match(config .. '.ibss.bssid', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') + need_one_of(config .. '.ibss.mcast_rate', rates, false) + need_number(config .. '.ibss.vlan', false) + need_boolean(config .. '.ibss.disabled', false) + end - if need_table(config .. '.mesh', nil, false) then - need_string(config .. '.mesh.id') - need_one_of(config .. '.mesh.mcast_rate', rates, false) - need_boolean(config .. '.mesh.disabled', false) - end + if need_table(config .. '.mesh', nil, false) then + need_string(config .. '.mesh.id') + need_one_of(config .. '.mesh.mcast_rate', rates, false) + need_boolean(config .. '.mesh.disabled', false) + end end need_boolean('mesh_on_wan', false) need_boolean('mesh_on_lan', false) if need_table('mesh', nil, false) and need_table('mesh.batman_adv', nil, false) then - need_number('mesh.batman_adv.gw_sel_class', false) + need_number('mesh.batman_adv.gw_sel_class', false) end + +need_string_match('next_node.mac', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') + +if need_string_match('next_node.ip4', '^%d+.%d+.%d+.%d+$', false) then + need_string_match('prefix4', '^%d+.%d+.%d+.%d+/%d+$') +end + +need_string_match('next_node.ip6', '^[%x:]+$', false) diff --git a/package/gluon-next-node/files/lib/gluon/ebtables/250-next-node b/package/gluon-mesh-batman-adv-core/files/lib/gluon/ebtables/250-next-node similarity index 100% rename from package/gluon-next-node/files/lib/gluon/ebtables/250-next-node rename to package/gluon-mesh-batman-adv-core/files/lib/gluon/ebtables/250-next-node diff --git a/package/gluon-next-node/files/lib/gluon/upgrade/400-next-node b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/400-next-node similarity index 100% rename from package/gluon-next-node/files/lib/gluon/upgrade/400-next-node rename to package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/400-next-node diff --git a/package/gluon-next-node/Makefile b/package/gluon-next-node/Makefile deleted file mode 100644 index 87c8edf9..00000000 --- a/package/gluon-next-node/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -include $(TOPDIR)/rules.mk - -PKG_NAME:=gluon-next-node -PKG_VERSION:=3 - -PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) - -include $(GLUONDIR)/include/package.mk - - -define Package/gluon-next-node - SECTION:=gluon - CATEGORY:=Gluon - TITLE:=Next-node anycast address - DEPENDS:=+gluon-core +gluon-ebtables +gluon-mesh-batman-adv +kmod-macvlan -endef - -define Package/gluon-next-node/description - Gluon community wifi mesh firmware framework: next-node anycast address -endef - -define Build/Prepare - mkdir -p $(PKG_BUILD_DIR) -endef - -define Build/Configure -endef - -define Build/Compile -endef - -define Package/gluon-next-node/install - $(CP) ./files/* $(1)/ -endef - -define Package/gluon-next-node/postinst -#!/bin/sh -$(call GluonCheckSite,check_site.lua) -endef - -$(eval $(call BuildPackage,gluon-next-node)) diff --git a/package/gluon-next-node/check_site.lua b/package/gluon-next-node/check_site.lua deleted file mode 100644 index b4d7dd2c..00000000 --- a/package/gluon-next-node/check_site.lua +++ /dev/null @@ -1,7 +0,0 @@ -if need_string_match('next_node.ip4', '^%d+.%d+.%d+.%d+$', false) then - need_string_match('prefix4', '^%d+.%d+.%d+.%d+/%d+$') -end - -need_string_match('next_node.ip6', '^[%x:]+$', false) - -need_string_match('next_node.mac', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') From d2373590e03d9f2002b77fac2ae33459e2ec51db Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 30 Nov 2016 19:38:05 +0100 Subject: [PATCH 071/126] gluon-core: add support for removing sysctl settings --- package/gluon-core/luasrc/usr/lib/lua/gluon/sysctl.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/sysctl.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/sysctl.lua index 44b0c217..ee429437 100644 --- a/package/gluon-core/luasrc/usr/lib/lua/gluon/sysctl.lua +++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/sysctl.lua @@ -4,5 +4,9 @@ local util = require 'gluon.util' module 'gluon.sysctl' function set(name, value) - util.replace_prefix('/etc/sysctl.conf', name .. '=', name .. '=' .. value .. '\n') + local new + if value then + new = name .. '=' .. value .. '\n' + end + util.replace_prefix('/etc/sysctl.conf', name .. '=', new) end From 8c4403ba115f5901203a069ea52c03458b9c5fbd Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 30 Nov 2016 20:29:25 +0100 Subject: [PATCH 072/126] gluon-client-bridge, gluon-mesh-batman-adv-core: switch roles of br-client and local-node interfaces MAC and IP addresses are switched. This makes the gluon-client-bridge package more useful for different routing protocols that don't need a unique address on the client bridge. As a side effect, gluon-radvd is now using the next-node address, which had been considered before, but was dismissed to avoid having gluon-radvd depend on gluon-next-node and gluon-mesh-batman-adv. This will be useful for announcing default routes via gluon-radvd. One downside is that this introduces a minor dependency on batman-adv in gluon-respondd: the hotplug script that checked for the client interface before will now check for local-node. This doesn't really matter: for mesh protocols without a local-node interface, the check will do nothing (which makes sense, as there is no interface to bind to for mesh-wide respondd). --- package/gluon-alfred/Makefile | 2 +- .../lib/gluon/upgrade/500-enable-alfred | 2 +- package/gluon-client-bridge/check_site.lua | 9 ++ .../upgrade/300-gluon-client-bridge-network | 62 +++++++++--- .../gluon-mesh-batman-adv-core/check_site.lua | 8 -- .../files/lib/gluon/respondd/client.dev | 2 +- .../310-gluon-mesh-batman-adv-core-mesh | 99 ++++--------------- ...0-gluon-mesh-batman-adv-core-client-bridge | 45 +++++++++ .../330-gluon-mesh-batman-adv-core-local-node | 77 +++++++++++++++ ...-gluon-mesh-batman-adv-core-mac-addresses} | 0 .../luasrc/lib/gluon/upgrade/400-next-node | 63 ------------ .../gluon-mesh-batman-adv-core/src/respondd.c | 2 +- 12 files changed, 202 insertions(+), 169 deletions(-) create mode 100755 package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-client-bridge create mode 100755 package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/330-gluon-mesh-batman-adv-core-local-node rename package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/{320-gluon-mesh-batman-adv-core-mac-addresses => 340-gluon-mesh-batman-adv-core-mac-addresses} (100%) delete mode 100755 package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/400-next-node diff --git a/package/gluon-alfred/Makefile b/package/gluon-alfred/Makefile index f38b0dbe..01fbdf43 100644 --- a/package/gluon-alfred/Makefile +++ b/package/gluon-alfred/Makefile @@ -12,7 +12,7 @@ include $(GLUONDIR)/include/package.mk define Package/gluon-alfred SECTION:=gluon CATEGORY:=Gluon - DEPENDS:=+gluon-core +gluon-respondd +gluon-neighbour-info +micrond +alfred + DEPENDS:=+gluon-core +gluon-respondd +gluon-neighbour-info gluon-mesh-batman-adv +micrond +alfred TITLE:=Configure alfred endef diff --git a/package/gluon-alfred/luasrc/lib/gluon/upgrade/500-enable-alfred b/package/gluon-alfred/luasrc/lib/gluon/upgrade/500-enable-alfred index d3802d8a..ce4ac0ad 100755 --- a/package/gluon-alfred/luasrc/lib/gluon/upgrade/500-enable-alfred +++ b/package/gluon-alfred/luasrc/lib/gluon/upgrade/500-enable-alfred @@ -7,7 +7,7 @@ local c = uci.cursor() c:delete('alfred', 'alfred') c:section('alfred', 'alfred', 'alfred', { - interface = 'br-client', + interface = 'local-node', mode = 'slave', batmanif = 'bat0', start_vis = '1', diff --git a/package/gluon-client-bridge/check_site.lua b/package/gluon-client-bridge/check_site.lua index 3a7d81ee..c71f11c0 100644 --- a/package/gluon-client-bridge/check_site.lua +++ b/package/gluon-client-bridge/check_site.lua @@ -1,3 +1,12 @@ +need_string_match('next_node.mac', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') + +if need_string_match('next_node.ip4', '^%d+.%d+.%d+.%d+$', false) then + need_string_match('prefix4', '^%d+.%d+.%d+.%d+/%d+$') +end + +need_string_match('next_node.ip6', '^[%x:]+$', false) + + for _, config in ipairs({'wifi24', 'wifi5'}) do if need_table(config .. '.ap', nil, false) then need_string(config .. '.ap.ssid') diff --git a/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/300-gluon-client-bridge-network b/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/300-gluon-client-bridge-network index f5ab8582..67d0c061 100755 --- a/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/300-gluon-client-bridge-network +++ b/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/300-gluon-client-bridge-network @@ -1,33 +1,69 @@ #!/usr/bin/lua +local site = require 'gluon.site_config' local sysconfig = require 'gluon.sysconfig' +local ip = require 'luci.ip' local lutil = require 'luci.util' local uci = require('luci.model.uci').cursor() +local ip4, netmask, ip6 + +if site.next_node.ip4 then + ip4 = site.next_node.ip4 + netmask = ip.IPv4(site.prefix4):mask():string() +end + +if site.next_node.ip6 then + ip6 = site.next_node.ip6 .. '/128' +end + uci:section('network', 'interface', 'client', - { - type = 'bridge', - } + { + type = 'bridge', + proto = 'static', + macaddr = site.next_node.mac, + ipaddr = ip4, + netmask = netmask, + ip6addr = ip6, + } ) +uci:delete('network', 'client', 'reqprefix') +uci:delete('network', 'client', 'peerdns') +uci:delete('network', 'client', 'sourcefilter') + + local ifname = uci:get('network', 'client', 'ifname') if type(ifname) == 'string' then - uci:delete('network', 'client', 'ifname') - for x in ifname:gmatch("[^%s]+") do - uci:add_to_set('network', 'client', 'ifname', x) - end + uci:delete('network', 'client', 'ifname') + for x in ifname:gmatch("[^%s]+") do + uci:add_to_set('network', 'client', 'ifname', x) + end end if sysconfig.lan_ifname and not ifname and not uci:get_bool('network', 'mesh_lan', 'auto') then - for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do - uci:add_to_set('network', 'client', 'ifname', lanif) - end + for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do + uci:add_to_set('network', 'client', 'ifname', lanif) + end end - -uci:set('network', 'client', 'macaddr', sysconfig.primary_mac) - uci:save('network') + + +local dnsmasq = uci:get_first('dhcp', 'dnsmasq') +uci:set('dhcp', dnsmasq, 'boguspriv', 0) +uci:set('dhcp', dnsmasq, 'localise_queries', 0) +uci:set('dhcp', dnsmasq, 'rebind_protection', 0) + +uci:delete('dhcp', 'client') +uci:section('dhcp', 'dhcp', 'client', + { + interface = 'client', + ignore = 1, + } +) + +uci:save('dhcp') diff --git a/package/gluon-mesh-batman-adv-core/check_site.lua b/package/gluon-mesh-batman-adv-core/check_site.lua index bd0c00a4..d1f577c8 100644 --- a/package/gluon-mesh-batman-adv-core/check_site.lua +++ b/package/gluon-mesh-batman-adv-core/check_site.lua @@ -23,11 +23,3 @@ need_boolean('mesh_on_lan', false) if need_table('mesh', nil, false) and need_table('mesh.batman_adv', nil, false) then need_number('mesh.batman_adv.gw_sel_class', false) end - -need_string_match('next_node.mac', '^%x[02468aAcCeE]:%x%x:%x%x:%x%x:%x%x:%x%x$') - -if need_string_match('next_node.ip4', '^%d+.%d+.%d+.%d+$', false) then - need_string_match('prefix4', '^%d+.%d+.%d+.%d+/%d+$') -end - -need_string_match('next_node.ip6', '^[%x:]+$', false) diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev b/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev index b051c6c5..9a074885 100644 --- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev +++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/respondd/client.dev @@ -1 +1 @@ -client +local_node diff --git a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/310-gluon-mesh-batman-adv-core-mesh b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/310-gluon-mesh-batman-adv-core-mesh index 4710d47c..9569df25 100755 --- a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/310-gluon-mesh-batman-adv-core-mesh +++ b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/310-gluon-mesh-batman-adv-core-mesh @@ -1,7 +1,6 @@ #!/usr/bin/lua local sysconfig = require 'gluon.sysconfig' -local sysctl = require 'gluon.sysctl' local site = require 'gluon.site_config' local uci = require('luci.model.uci').cursor() @@ -9,94 +8,32 @@ local uci = require('luci.model.uci').cursor() local gw_sel_class if site.mesh and site.mesh.batman_adv then - gw_sel_class = site.mesh.batman_adv.gw_sel_class + gw_sel_class = site.mesh.batman_adv.gw_sel_class end uci:delete('batman-adv', 'bat0') uci:section('batman-adv', 'mesh', 'bat0', - { - orig_interval = 5000, - gw_mode = 'client', - gw_sel_class = gw_sel_class, - hop_penalty = 15, - multicast_mode = 0, - } + { + orig_interval = 5000, + gw_mode = 'client', + gw_sel_class = gw_sel_class, + hop_penalty = 15, + multicast_mode = 0, + } ) uci:save('batman-adv') +uci:delete('network', 'bat0') +uci:section('network', 'interface', 'bat0', + { + ifname = 'bat0', + proto = 'none', + macaddr = sysconfig.primary_mac, + multicast_router = 2, + learning = 0, + } +) uci:add_to_set('network', 'client', 'ifname', 'bat0') -uci:set('network', 'client', 'proto', 'dhcpv6') -uci:set('network', 'client', 'reqprefix', 'no') -uci:delete('network', 'client', 'igmp_snooping') -uci:set('network', 'client', 'robustness', 3) -uci:set('network', 'client', 'query_interval', 2000) -uci:set('network', 'client', 'query_response_interval', 500) -uci:set('network', 'client', 'peerdns', 1) -uci:set('network', 'client', 'sourcefilter', 0) - -uci:delete('network', 'bat0') -uci:section('network', 'interface', 'bat0', - { - ifname = 'bat0', - proto = 'none', - macaddr = sysconfig.primary_mac, - multicast_router = 2, - learning = 0, - } -) - -uci:delete('network', 'client_lan') -if sysconfig.lan_ifname then - uci:section('network', 'interface', 'client_lan', - { - unicast_flood = 0, - } - ) - uci:set('network', 'client_lan', 'ifname', sysconfig.lan_ifname) -end - uci:save('network') - - -uci:delete('firewall', 'client') -uci:section('firewall', 'zone', 'client', - { - name = 'client', - network = {'client'}, - input = 'ACCEPT', - output = 'ACCEPT', - forward = 'REJECT', - } -) - -uci:section('firewall', 'rule', 'client_dns', - { - name = 'client_dns', - src = 'client', - dest_port = '53', - target = 'REJECT', - } -) - -uci:save('firewall') - - -local dnsmasq = uci:get_first('dhcp', 'dnsmasq') -uci:set('dhcp', dnsmasq, 'boguspriv', 0) -uci:set('dhcp', dnsmasq, 'localise_queries', 0) -uci:set('dhcp', dnsmasq, 'rebind_protection', 0) - -uci:delete('dhcp', 'client') -uci:section('dhcp', 'dhcp', 'client', - { - interface = 'client', - ignore = 1, - } -) - -uci:save('dhcp') - - -sysctl.set('net.ipv6.conf.br-client.forwarding', 0) diff --git a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-client-bridge b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-client-bridge new file mode 100755 index 00000000..30a0dfb2 --- /dev/null +++ b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-client-bridge @@ -0,0 +1,45 @@ +#!/usr/bin/lua + +local sysconfig = require 'gluon.sysconfig' +local sysctl = require 'gluon.sysctl' + +local uci = require('luci.model.uci').cursor() + +uci:section('network', 'interface', 'client', + { + robustness = 3, + query_interval = 2000, + query_response_interval = 500, + } +) +uci:delete('network', 'client', 'igmp_snooping') + +uci:delete('network', 'client_lan') +if sysconfig.lan_ifname then + uci:section('network', 'interface', 'client_lan', + { + unicast_flood = 0, + } + ) + uci:set('network', 'client_lan', 'ifname', sysconfig.lan_ifname) +end + +uci:save('network') + + +uci:delete('firewall', 'client') +uci:section('firewall', 'zone', 'client', + { + name = 'client', + network = {'client'}, + input = 'ACCEPT', + output = 'ACCEPT', + forward = 'REJECT', + } +) + +uci:delete('firewall', 'client_dns') + +uci:save('firewall') + +sysctl.set('net.ipv6.conf.br-client.forwarding') diff --git a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/330-gluon-mesh-batman-adv-core-local-node b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/330-gluon-mesh-batman-adv-core-local-node new file mode 100755 index 00000000..04909fa6 --- /dev/null +++ b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/330-gluon-mesh-batman-adv-core-local-node @@ -0,0 +1,77 @@ +#!/usr/bin/lua + +local site = require 'gluon.site_config' +local sysconfig = require 'gluon.sysconfig' +local sysctl = require 'gluon.sysctl' + +local uci = require('luci.model.uci').cursor() + + +uci:delete('network', 'local_node_dev') +uci:section('network', 'device', 'local_node_dev', + { + name = 'local-node', + ifname = 'br-client', + type = 'macvlan', + macaddr = sysconfig.primary_mac, + } +) + +uci:delete('network', 'local_node') +uci:section('network', 'interface', 'local_node', + { + ifname = 'local-node', + proto = 'dhcpv6', + reqprefix = 'no', + peerdns = 1, + sourcefilter = 0, + } +) + +uci:delete('network', 'local_node_route6') +uci:section('network', 'route6', 'local_node_route6', + { + interface = 'local-node', + target = site.prefix6, + gateway = '::', + } +) + +uci:save('network') + + +uci:delete('firewall', 'local_node') +uci:section('firewall', 'zone', 'local_node', + { + name = 'local_node', + network = {'local_node'}, + input = 'ACCEPT', + output = 'ACCEPT', + forward = 'REJECT', + } +) + +uci:section('firewall', 'rule', 'local_node_dns', + { + name = 'local_node_dns', + src = 'local_node', + dest_port = '53', + target = 'REJECT', + } +) + +uci:save('firewall') + + +uci:delete('dhcp', 'local_node') +uci:section('dhcp', 'dhcp', 'local_node', + { + interface = 'local_node', + ignore = 1, + } +) + +uci:save('dhcp') + + +sysctl.set('net.ipv6.conf.local_node.forwarding', 0) diff --git a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-mac-addresses b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/340-gluon-mesh-batman-adv-core-mac-addresses similarity index 100% rename from package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/320-gluon-mesh-batman-adv-core-mac-addresses rename to package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/340-gluon-mesh-batman-adv-core-mac-addresses diff --git a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/400-next-node b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/400-next-node deleted file mode 100755 index 98dffbc9..00000000 --- a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/400-next-node +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/lua - -local site = require 'gluon.site_config' -local uci = require 'luci.model.uci' -local ip = require 'luci.ip' - -local c = uci.cursor() - - -c:delete('network', 'local_node_dev') -c:section('network', 'device', 'local_node_dev', - { - name = 'local-node', - ifname = 'br-client', - type = 'macvlan', - macaddr = site.next_node.mac, - } -) - -local ip4, netmask, ip6 - -if site.next_node.ip4 then - ip4 = site.next_node.ip4 - netmask = ip.IPv4(site.prefix4):mask():string() -end - -if site.next_node.ip6 then - ip6 = site.next_node.ip6 .. '/128' -end - -c:delete('network', 'local_node') -c:section('network', 'interface', 'local_node', - { - ifname = 'local-node', - proto = 'static', - ipaddr = ip4, - netmask = netmask, - ip6addr = ip6, - } -) - -c:delete('network', 'local_node_route6') -c:section('network', 'route6', 'local_node_route6', - { - interface = 'client', - target = site.prefix6, - gateway = '::', - } -) - -c:save('network') - -c:delete('firewall', 'local_node') -c:section('firewall', 'zone', 'local_node', - { - name = 'local_node', - network = {'local_node'}, - input = 'ACCEPT', - output = 'ACCEPT', - forward = 'REJECT', - } -) -c:save('firewall') diff --git a/package/gluon-mesh-batman-adv-core/src/respondd.c b/package/gluon-mesh-batman-adv-core/src/respondd.c index ba14997a..a84076e9 100644 --- a/package/gluon-mesh-batman-adv-core/src/respondd.c +++ b/package/gluon-mesh-batman-adv-core/src/respondd.c @@ -85,7 +85,7 @@ static struct json_object * get_addresses(void) { &flags, ifname) != 18) continue; - if (strcmp(ifname, "br-client")) + if (strcmp(ifname, "local-node")) continue; if (flags & (IFA_F_TENTATIVE|IFA_F_DEPRECATED)) From f2524ee1790808d4c74384d337ec666367972c0b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 11 Dec 2016 00:22:18 +0100 Subject: [PATCH 073/126] Update Gluon packages --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index d586f720..3caa6a94 100644 --- a/modules +++ b/modules @@ -9,7 +9,7 @@ PACKAGES_OPENWRT_COMMIT=73776792f7d58e982be9e5819450d4875b273159 PACKAGES_OPENWRT_BRANCH=for-15.05 PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git -PACKAGES_GLUON_COMMIT=738d8a236583233c0d49bbef73ac9b721534d1fc +PACKAGES_GLUON_COMMIT=e7fbcf75a95da3c39a3a7a85a2da481c3bf7d93d PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git PACKAGES_ROUTING_COMMIT=a4eae82c155079a4372e4b910ec733f77288b717 From 9a06a9865120747fa5b2d3179936e3b7b169deab Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 11 Dec 2016 00:42:41 +0100 Subject: [PATCH 074/126] gluon-respondd: add delay to mesh-wide multicast requests Mesh-wide multicast requests are answered with a random delay of up to 10s. --- .../files/etc/init.d/gluon-respondd | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/package/gluon-respondd/files/etc/init.d/gluon-respondd b/package/gluon-respondd/files/etc/init.d/gluon-respondd index 412f1153..bd47ebfa 100755 --- a/package/gluon-respondd/files/etc/init.d/gluon-respondd +++ b/package/gluon-respondd/files/etc/init.d/gluon-respondd @@ -4,17 +4,22 @@ USE_PROCD=1 START=50 DAEMON=/usr/bin/respondd +MAXDELAY=10 start_service() { - DEVS="" - for dev in $( ubus call network.interface dump | jsonfilter \ - -e "@.interface[@.proto='gluon_mesh' && @.up=true].device" \ - -e "@.interface[@.interface='$(cat /lib/gluon/respondd/client.dev 2>/dev/null)' && @.up=true].device") - do - DEVS="$DEVS -i $dev" + local ifdump="$(ubus call network.interface dump)" + + local devs='' + local dev + for dev in $(echo "$ifdump" | jsonfilter -e "@.interface[@.proto='gluon_mesh' && @.up=true].device"); do + devs="$devs -i $dev" done + for dev in $(echo "$ifdump" | jsonfilter -e "@.interface[@.interface='$(cat /lib/gluon/respondd/client.dev 2>/dev/null)' && @.up=true].device"); do + devs="$devs -i $dev -t $MAXDELAY" + done + procd_open_instance - procd_set_param command $DAEMON -g ff02::2:1001 -p 1001 -d /lib/gluon/respondd $DEVS + procd_set_param command $DAEMON -g ff02::2:1001 -p 1001 -d /lib/gluon/respondd $devs procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} procd_set_param stderr 1 procd_close_instance From bab42a3a4c2aa2bb57b75c7b982ca3fee50599ce Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 11 Dec 2016 00:54:06 +0100 Subject: [PATCH 075/126] Update Gluon packages --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 3caa6a94..638b6107 100644 --- a/modules +++ b/modules @@ -9,7 +9,7 @@ PACKAGES_OPENWRT_COMMIT=73776792f7d58e982be9e5819450d4875b273159 PACKAGES_OPENWRT_BRANCH=for-15.05 PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git -PACKAGES_GLUON_COMMIT=e7fbcf75a95da3c39a3a7a85a2da481c3bf7d93d +PACKAGES_GLUON_COMMIT=5ab6385331a2eea9c7d2d643dc9fcc78a9f07271 PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git PACKAGES_ROUTING_COMMIT=a4eae82c155079a4372e4b910ec733f77288b717 From a7d840946642d247d94afae38b35dc5cd6b9a996 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 11 Dec 2016 01:16:27 +0100 Subject: [PATCH 076/126] Update routing packages This lifts batman-adv and alfred to version 2016.4. --- modules | 2 +- ...-adv-introduce-no_rebroadcast-option.patch | 44 +++++++++---------- ...n-adv-decrease-maximum-fragment-size.patch | 16 +++---- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/modules b/modules index 638b6107..60e33537 100644 --- a/modules +++ b/modules @@ -12,7 +12,7 @@ PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git PACKAGES_GLUON_COMMIT=5ab6385331a2eea9c7d2d643dc9fcc78a9f07271 PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git -PACKAGES_ROUTING_COMMIT=a4eae82c155079a4372e4b910ec733f77288b717 +PACKAGES_ROUTING_COMMIT=899235a4a6370e86ad3674c38c3f95d23c8f3dc8 PACKAGES_LUCI_REPO=git://github.com/openwrt/luci.git PACKAGES_LUCI_COMMIT=70a4d43cc895b7d728b4fc201f2b6fd9f4b8aaec diff --git a/patches/packages/routing/0002-batman-adv-introduce-no_rebroadcast-option.patch b/patches/packages/routing/0002-batman-adv-introduce-no_rebroadcast-option.patch index f564a011..53d60524 100644 --- a/patches/packages/routing/0002-batman-adv-introduce-no_rebroadcast-option.patch +++ b/patches/packages/routing/0002-batman-adv-introduce-no_rebroadcast-option.patch @@ -33,12 +33,12 @@ index 1e0c9d0..d0ab238 100644 } diff --git a/batman-adv/patches/1001-batman-adv-introduce-no_rebroadcast-option.patch b/batman-adv/patches/1001-batman-adv-introduce-no_rebroadcast-option.patch new file mode 100644 -index 0000000..e9f5ffb +index 0000000..2d274d1 --- /dev/null +++ b/batman-adv/patches/1001-batman-adv-introduce-no_rebroadcast-option.patch @@ -0,0 +1,189 @@ -+From bb66988dc6972d5400b4ff4f0b49ed090007d635 Mon Sep 17 00:00:00 2001 -+Message-Id: ++From eaeec9a5366d5e21fe07063ccede2edb7aa55e8e Mon Sep 17 00:00:00 2001 ++Message-Id: +From: =?UTF-8?q?Linus=20L=C3=BCssing?= +Date: Tue, 24 Sep 2013 04:36:27 +0200 +Subject: [PATCH 1/2] batman-adv: introduce 'no_rebroadcast' option @@ -74,13 +74,13 @@ index 0000000..e9f5ffb + 5 files changed, 77 insertions(+) + +diff --git a/Documentation/ABI/testing/sysfs-class-net-batman-adv b/Documentation/ABI/testing/sysfs-class-net-batman-adv -+index 518f6a1..896c480 100644 ++index 8981068..738c46d 100644 +--- a/Documentation/ABI/testing/sysfs-class-net-batman-adv ++++ b/Documentation/ABI/testing/sysfs-class-net-batman-adv -+@@ -28,3 +28,14 @@ Description: -+ The /sys/class/net//batman-adv/mesh_iface file -+ displays the batman mesh interface this -+ currently is associated with. ++@@ -28,3 +28,14 @@ description: ++ when estimating the link throughput using this interface. ++ If the value is set to 0 then batman-adv will try to ++ estimate the throughput by itself. ++ ++What: /sys/class/net//batman-adv/no_rebroadcast ++Date: Sep 2013 @@ -93,23 +93,23 @@ index 0000000..e9f5ffb ++ or wired links. Using this option wrongly is going to ++ break your mesh network, use at your own risk! +diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c -+index 8c2f399..48e53d0 100644 ++index 08ce361..b0e2896 100644 +--- a/net/batman-adv/hard-interface.c ++++ b/net/batman-adv/hard-interface.c -+@@ -690,6 +690,8 @@ batadv_hardif_add_interface(struct net_device *net_dev) -+ kref_init(&hard_iface->refcount); -+ kref_get(&hard_iface->refcount); ++@@ -702,6 +702,8 @@ batadv_hardif_add_interface(struct net_device *net_dev) ++ ++ batadv_v_hardif_init(hard_iface); + ++ atomic_set(&hard_iface->no_rebroadcast, 0); ++ + batadv_check_known_mac_addr(hard_iface->net_dev); ++ kref_get(&hard_iface->refcount); + list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list); -+ +diff --git a/net/batman-adv/send.c b/net/batman-adv/send.c -+index f2f1256..3736d75 100644 ++index 8d4e1f5..c8250f9 100644 +--- a/net/batman-adv/send.c ++++ b/net/batman-adv/send.c -+@@ -578,6 +578,10 @@ static void batadv_send_outstanding_bcast_packet(struct work_struct *work) ++@@ -636,6 +636,10 @@ static void batadv_send_outstanding_bcast_packet(struct work_struct *work) + if (forw_packet->num_packets >= hard_iface->num_bcasts) + continue; + @@ -121,10 +121,10 @@ index 0000000..e9f5ffb + continue; + +diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c -+index 414b207..9aa043f 100644 ++index 02d96f2..f91d09c 100644 +--- a/net/batman-adv/sysfs.c ++++ b/net/batman-adv/sysfs.c -+@@ -134,6 +134,17 @@ struct batadv_attribute batadv_attr_vlan_##_name = { \ ++@@ -136,6 +136,17 @@ struct batadv_attribute batadv_attr_vlan_##_name = { \ + .store = _store, \ + } + @@ -142,7 +142,7 @@ index 0000000..e9f5ffb + /* Use this, if you have customized show and store functions */ + #define BATADV_ATTR(_name, _mode, _show, _store) \ + struct batadv_attribute batadv_attr_##_name = { \ -+@@ -293,6 +304,52 @@ ssize_t batadv_show_##_name(struct kobject *kobj, \ ++@@ -295,6 +306,52 @@ ssize_t batadv_show_##_name(struct kobject *kobj, \ + static BATADV_ATTR(_name, _mode, batadv_show_##_name, \ + batadv_store_##_name) + @@ -195,7 +195,7 @@ index 0000000..e9f5ffb + static int batadv_store_bool_attr(char *buff, size_t count, + struct net_device *net_dev, + const char *attr_name, atomic_t *attr, -+@@ -993,6 +1050,7 @@ static ssize_t batadv_show_throughput_override(struct kobject *kobj, ++@@ -1119,6 +1176,7 @@ static ssize_t batadv_show_throughput_override(struct kobject *kobj, + static BATADV_ATTR(mesh_iface, S_IRUGO | S_IWUSR, batadv_show_mesh_iface, + batadv_store_mesh_iface); + static BATADV_ATTR(iface_status, S_IRUGO, batadv_show_iface_status, NULL); @@ -203,7 +203,7 @@ index 0000000..e9f5ffb + #ifdef CONFIG_BATMAN_ADV_BATMAN_V + BATADV_ATTR_HIF_UINT(elp_interval, bat_v.elp_interval, S_IRUGO | S_IWUSR, + 2 * BATADV_JITTER, INT_MAX, NULL); -+@@ -1004,6 +1062,7 @@ static BATADV_ATTR(throughput_override, S_IRUGO | S_IWUSR, ++@@ -1130,6 +1188,7 @@ static BATADV_ATTR(throughput_override, S_IRUGO | S_IWUSR, + static struct batadv_attribute *batadv_batman_attrs[] = { + &batadv_attr_mesh_iface, + &batadv_attr_iface_status, @@ -212,7 +212,7 @@ index 0000000..e9f5ffb + &batadv_attr_elp_interval, + &batadv_attr_throughput_override, +diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h -+index ba846b0..1a596c5 100644 ++index b3dd1a3..9ee810d 100644 +--- a/net/batman-adv/types.h ++++ b/net/batman-adv/types.h +@@ -156,6 +156,7 @@ struct batadv_hard_iface { @@ -224,5 +224,5 @@ index 0000000..e9f5ffb + + /** +-- -+2.8.3 ++2.10.2 + diff --git a/patches/packages/routing/0003-batman-adv-decrease-maximum-fragment-size.patch b/patches/packages/routing/0003-batman-adv-decrease-maximum-fragment-size.patch index ede150b3..49f43017 100644 --- a/patches/packages/routing/0003-batman-adv-decrease-maximum-fragment-size.patch +++ b/patches/packages/routing/0003-batman-adv-decrease-maximum-fragment-size.patch @@ -4,14 +4,14 @@ Subject: batman-adv: decrease maximum fragment size diff --git a/batman-adv/patches/1002-batman-adv-decrease-maximum-fragment-size.patch b/batman-adv/patches/1002-batman-adv-decrease-maximum-fragment-size.patch new file mode 100644 -index 0000000..a97146b +index 0000000..1a0b561 --- /dev/null +++ b/batman-adv/patches/1002-batman-adv-decrease-maximum-fragment-size.patch @@ -0,0 +1,28 @@ -+From 9e7384fde3c5a71f733221a137fdc4593a9638be Mon Sep 17 00:00:00 2001 -+Message-Id: <9e7384fde3c5a71f733221a137fdc4593a9638be.1466048916.git.mschiffer@universe-factory.net> -+In-Reply-To: <8e4c2084bbf2a65ad663a2b1ba27144e5dadfd5f.1466048916.git.mschiffer@universe-factory.net> -+References: <8e4c2084bbf2a65ad663a2b1ba27144e5dadfd5f.1466048916.git.mschiffer@universe-factory.net> ++From 32afa5d50ed6d5c3df288a0fb174ab512e9f9450 Mon Sep 17 00:00:00 2001 ++Message-Id: <32afa5d50ed6d5c3df288a0fb174ab512e9f9450.1481414736.git.mschiffer@universe-factory.net> ++In-Reply-To: ++References: +From: Matthias Schiffer +Date: Thu, 6 Aug 2015 22:27:01 +0200 +Subject: [PATCH 2/2] batman-adv: decrease maximum fragment size @@ -21,10 +21,10 @@ index 0000000..a97146b + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/batman-adv/main.h b/net/batman-adv/main.h -+index 7692526..d314e6c 100644 ++index 09af21e..23ebb8e 100644 +--- a/net/batman-adv/main.h ++++ b/net/batman-adv/main.h -+@@ -159,7 +159,7 @@ enum batadv_uev_type { ++@@ -167,7 +167,7 @@ enum batadv_uev_type { + /* Maximum number of fragments for one packet */ + #define BATADV_FRAG_MAX_FRAGMENTS 16 + /* Maxumim size of each fragment */ @@ -34,5 +34,5 @@ index 0000000..a97146b + #define BATADV_FRAG_TIMEOUT 10000 + +-- -+2.8.3 ++2.10.2 + From dc090d35871487248ffbd0af98487a19b1d7bddd Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 11 Dec 2016 01:31:40 +0100 Subject: [PATCH 077/126] Update Gluon packages --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 60e33537..0a9a16de 100644 --- a/modules +++ b/modules @@ -9,7 +9,7 @@ PACKAGES_OPENWRT_COMMIT=73776792f7d58e982be9e5819450d4875b273159 PACKAGES_OPENWRT_BRANCH=for-15.05 PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git -PACKAGES_GLUON_COMMIT=5ab6385331a2eea9c7d2d643dc9fcc78a9f07271 +PACKAGES_GLUON_COMMIT=5280cd19070ccccc36a39dc48c7f51fe76bc4268 PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git PACKAGES_ROUTING_COMMIT=899235a4a6370e86ad3674c38c3f95d23c8f3dc8 From ff0ad2075246913f869d7410d5b9b0cd37f713f4 Mon Sep 17 00:00:00 2001 From: Ruben Barkow Date: Sun, 11 Dec 2016 03:13:28 +0100 Subject: [PATCH 078/126] gluon-config-mode-core: hand over more info to the reboot screen (#930) --- docs/site-example/i18n/de.po | 4 ++-- docs/site-example/i18n/en.po | 6 ++--- docs/site-example/i18n/fr.po | 6 ++--- .../config-mode/reboot/0900-msg-reboot.lua | 22 ++++++++++++++++++- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/docs/site-example/i18n/de.po b/docs/site-example/i18n/de.po index 872d2d1c..6eb0e469 100644 --- a/docs/site-example/i18n/de.po +++ b/docs/site-example/i18n/de.po @@ -33,8 +33,8 @@ msgstr "" msgid "gluon-config-mode:reboot" msgstr "" -"

Dein Knoten startet gerade neu und wird anschließend versuchen, " -"sich mit anderen Freifunkknoten in seiner Nähe zu " +"

Dein Knoten <%= escape(hostname) %> startet gerade neu und wird " +"anschließend versuchen, sich mit anderen Freifunkknoten in seiner Nähe zu " "verbinden. Weitere Informationen zur " "Alpha Centauri Freifunk-Community findest du auf " "unserer Webseite.

" diff --git a/docs/site-example/i18n/en.po b/docs/site-example/i18n/en.po index e119818b..7df16365 100644 --- a/docs/site-example/i18n/en.po +++ b/docs/site-example/i18n/en.po @@ -30,9 +30,9 @@ msgstr "" msgid "gluon-config-mode:reboot" msgstr "" -"

The node is currently rebooting and will try to connect to other " -"nearby Freifunk nodes after that. " -"For more information on the Freifunk Alpha Centauri community, have a look at " +"

Your node <%= escape(hostname) %> is currently rebooting and will " +"try to connect to other nearby Freifunk nodes after that. For more " +"information about the Freifunk community on Alpha Centauri, have a look at " "our homepage.

" "

To get back to this configuration interface, press the reset button for " "3 seconds during normal operation. The device will then reboot into config " diff --git a/docs/site-example/i18n/fr.po b/docs/site-example/i18n/fr.po index e83ce0de..2e05db22 100644 --- a/docs/site-example/i18n/fr.po +++ b/docs/site-example/i18n/fr.po @@ -14,7 +14,7 @@ msgid "gluon-config-mode:welcome" msgstr "" "Bienvenue dans l'assistant de configuration pour votre nouveau nœud " "Freifunk. Remplissez le formulaire suivant en fonction de vos besoins " -"et enregistrez le" +"et enregistrez le" msgid "gluon-config-mode:pubkey" msgstr "" @@ -33,8 +33,8 @@ msgstr "" msgid "gluon-config-mode:reboot" msgstr "" -"

Votre nœud es en train de redémarrer et va ensuite éssayer de se connecter " -"avec les autres nœuds du réseau Freifunk " +"

Votre nœud <%= escape(hostname) %> es en train de redémarrer et " +"va ensuite éssayer de se connecter avec les autres nœuds du réseau Freifunk " "Vous pourrez trouver plus d'informations sur votre groupe Freifunk sur la page " " de ton groupe .

" "

Pour retrouver cette page de configuration veuillier appuyez pendant le " diff --git a/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/reboot/0900-msg-reboot.lua b/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/reboot/0900-msg-reboot.lua index bf27c07f..96557f41 100644 --- a/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/reboot/0900-msg-reboot.lua +++ b/package/gluon-config-mode-core/luasrc/lib/gluon/config-mode/reboot/0900-msg-reboot.lua @@ -1,3 +1,23 @@ local i18n = require 'luci.i18n' +local site = require 'gluon.site_config' +local gluon_luci = require 'gluon.luci' +local sysconfig = require 'gluon.sysconfig' +local pretty_hostname = require 'pretty_hostname' -return function () luci.template.render_string(i18n.translate('gluon-config-mode:reboot')) end +local uci = luci.model.uci.cursor() + +local hostname = pretty_hostname.get(uci) +local contact = uci:get_first('gluon-node-info', 'owner', 'contact') + +local msg = i18n.translate('gluon-config-mode:reboot') + +return function () + luci.template.render_string(msg, { + hostname = hostname, + site = site, + sysconfig = sysconfig, + contact = contact, + escape = gluon_luci.escape, + urlescape = gluon_luci.urlescape, + }) +end From 6ac5b9cbc85985d5c64a9487aa95f8ce5ab4195e Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Sat, 24 Sep 2016 19:59:44 +0200 Subject: [PATCH 079/126] gluon-status-page-api: Switch from debugfs to batadv netlink The batadv debugfs requires large memory blocks to write the text debug tables. This is inefficient for large tables like the global translation table or the originators table. The memory requirement can be reduced by using netlink. It copies smaller packets in a binary format to the userspace program. gluon-status-page-api can therefore parse larger originator tables without causing an OOM on systems which are tight on memory. Signed-off-by: Sven Eckelmann --- package/gluon-status-page-api/Makefile | 2 +- package/gluon-status-page-api/src/Makefile | 21 +- .../src/batadv-netlink.c | 145 ++++++++++++ .../src/batadv-netlink.h | 68 ++++++ .../gluon-status-page-api/src/batman_adv.h | 208 ++++++++++++++++++ .../src/neighbours-batadv.c | 125 ++++++++--- 6 files changed, 536 insertions(+), 33 deletions(-) create mode 100644 package/gluon-status-page-api/src/batadv-netlink.c create mode 100644 package/gluon-status-page-api/src/batadv-netlink.h create mode 100644 package/gluon-status-page-api/src/batman_adv.h diff --git a/package/gluon-status-page-api/Makefile b/package/gluon-status-page-api/Makefile index ddad2cab..703d97f6 100644 --- a/package/gluon-status-page-api/Makefile +++ b/package/gluon-status-page-api/Makefile @@ -14,7 +14,7 @@ define Package/gluon-status-page-api SECTION:=gluon CATEGORY:=Gluon TITLE:=API for gluon-status-page - DEPENDS:=+gluon-core +uhttpd +sse-multiplex +gluon-neighbour-info +gluon-respondd +libiwinfo +libjson-c + DEPENDS:=+gluon-core +uhttpd +sse-multiplex +gluon-neighbour-info +gluon-respondd +libiwinfo +libjson-c +libnl-tiny endef define Build/Prepare diff --git a/package/gluon-status-page-api/src/Makefile b/package/gluon-status-page-api/src/Makefile index 81b48b6d..e67a595e 100644 --- a/package/gluon-status-page-api/src/Makefile +++ b/package/gluon-status-page-api/src/Makefile @@ -1,12 +1,29 @@ CFLAGS += -std=c99 -D_BSD_SOURCE +CPPFLAGS += -D_GNU_SOURCE + +ifeq ($(origin PKG_CONFIG), undefined) + PKG_CONFIG = pkg-config + ifeq ($(shell which $(PKG_CONFIG) 2>/dev/null),) + $(error $(PKG_CONFIG) not found) + endif +endif + +ifeq ($(origin LIBNL_CFLAGS) $(origin LIBNL_LDLIBS), undefined undefined) + LIBNL_NAME ?= libnl-tiny + ifeq ($(shell $(PKG_CONFIG) --modversion $(LIBNL_NAME) 2>/dev/null),) + $(error No $(LIBNL_NAME) development libraries found!) + endif + LIBNL_CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBNL_NAME)) + LIBNL_LDLIBS += $(shell $(PKG_CONFIG) --libs $(LIBNL_NAME)) +endif CFLAGS_JSONC = $(shell pkg-config --cflags json-c) LDFLAGS_JSONC = $(shell pkg-config --libs json-c) all: neighbours-batadv stations respondd.so -neighbours-batadv: neighbours-batadv.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LDFLAGS) $(LDFLAGS_JSONC) -Wall -o $@ $^ $(LDLIBS) +neighbours-batadv: neighbours-batadv.c batadv-netlink.c + $(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LIBNL_CFLAGS) $(LDFLAGS) $(LDFLAGS_JSONC) $(LIBNL_LDLIBS) -Wall -o $@ $^ $(LDLIBS) stations: stations.c $(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_JSONC) $(LDFLAGS) $(LDFLAGS_JSONC) -Wall -o $@ $^ $(LDLIBS) -liwinfo diff --git a/package/gluon-status-page-api/src/batadv-netlink.c b/package/gluon-status-page-api/src/batadv-netlink.c new file mode 100644 index 00000000..ca965d48 --- /dev/null +++ b/package/gluon-status-page-api/src/batadv-netlink.c @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2009-2016 B.A.T.M.A.N. contributors: + * + * Marek Lindner , Andrew Lunn + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + * + */ + +#include "batadv-netlink.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "batman_adv.h" + +#ifndef __maybe_unused +#define __maybe_unused __attribute__((unused)) +#endif + +struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = { + [BATADV_ATTR_HARD_IFINDEX] = { .type = NLA_U32 }, + [BATADV_ATTR_ORIG_ADDRESS] = { .type = NLA_UNSPEC, + .minlen = ETH_ALEN, + .maxlen = ETH_ALEN }, + [BATADV_ATTR_FLAG_BEST] = { .type = NLA_FLAG }, + [BATADV_ATTR_LAST_SEEN_MSECS] = { .type = NLA_U32 }, + [BATADV_ATTR_NEIGH_ADDRESS] = { .type = NLA_UNSPEC, + .minlen = ETH_ALEN, + .maxlen = ETH_ALEN }, + [BATADV_ATTR_TQ] = { .type = NLA_U8 }, +}; + +static int nlquery_error_cb(struct sockaddr_nl *nla __maybe_unused, + struct nlmsgerr *nlerr, void *arg) +{ + struct batadv_nlquery_opts *query_opts = arg; + + query_opts->err = nlerr->error; + + return NL_STOP; +} + +static int nlquery_stop_cb(struct nl_msg *msg, void *arg) +{ + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct batadv_nlquery_opts *query_opts = arg; + int *error = nlmsg_data(nlh); + + if (*error) + query_opts->err = *error; + + return NL_STOP; +} + +int batadv_nl_query_common(const char *mesh_iface, + enum batadv_nl_commands nl_cmd, + nl_recvmsg_msg_cb_t callback, int flags, + struct batadv_nlquery_opts *query_opts) +{ + struct nl_sock *sock; + struct nl_msg *msg; + struct nl_cb *cb; + int ifindex; + int family; + int ret; + + query_opts->err = 0; + + sock = nl_socket_alloc(); + if (!sock) + return -ENOMEM; + + ret = genl_connect(sock); + if (ret < 0) { + query_opts->err = ret; + goto err_free_sock; + } + + family = genl_ctrl_resolve(sock, BATADV_NL_NAME); + if (family < 0) { + query_opts->err = -EOPNOTSUPP; + goto err_free_sock; + } + + ifindex = if_nametoindex(mesh_iface); + if (!ifindex) { + query_opts->err = -ENODEV; + goto err_free_sock; + } + + cb = nl_cb_alloc(NL_CB_DEFAULT); + if (!cb) { + query_opts->err = -ENOMEM; + goto err_free_sock; + } + + nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, callback, query_opts); + nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, nlquery_stop_cb, query_opts); + nl_cb_err(cb, NL_CB_CUSTOM, nlquery_error_cb, query_opts); + + msg = nlmsg_alloc(); + if (!msg) { + query_opts->err = -ENOMEM; + goto err_free_cb; + } + + genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, flags, + nl_cmd, 1); + + nla_put_u32(msg, BATADV_ATTR_MESH_IFINDEX, ifindex); + nl_send_auto_complete(sock, msg); + nlmsg_free(msg); + + nl_recvmsgs(sock, cb); + +err_free_cb: + nl_cb_put(cb); +err_free_sock: + nl_socket_free(sock); + + return query_opts->err; +} diff --git a/package/gluon-status-page-api/src/batadv-netlink.h b/package/gluon-status-page-api/src/batadv-netlink.h new file mode 100644 index 00000000..8b85a6c2 --- /dev/null +++ b/package/gluon-status-page-api/src/batadv-netlink.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2009-2016 B.A.T.M.A.N. contributors: + * + * Marek Lindner , Andrew Lunn + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + * + */ + +#ifndef _BATADV_NETLINK_H +#define _BATADV_NETLINK_H + +#include +#include +#include +#include +#include + +#include "batman_adv.h" + +struct batadv_nlquery_opts { + int err; +}; + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) +#endif + +#ifndef container_of +#define container_of(ptr, type, member) __extension__ ({ \ + const __typeof__(((type *)0)->member) *__pmember = (ptr); \ + (type *)((char *)__pmember - offsetof(type, member)); }) +#endif + +int batadv_nl_query_common(const char *mesh_iface, + enum batadv_nl_commands nl_cmd, + nl_recvmsg_msg_cb_t callback, int flags, + struct batadv_nlquery_opts *query_opts); + +static inline bool batadv_nl_missing_attrs(struct nlattr *attrs[], + const enum batadv_nl_attrs mandatory[], + size_t num) +{ + size_t i; + + for (i = 0; i < num; i++) { + if (!attrs[mandatory[i]]) + return true; + } + + return false; +} + +extern struct nla_policy batadv_netlink_policy[]; + +#endif /* _BATADV_NETLINK_H */ diff --git a/package/gluon-status-page-api/src/batman_adv.h b/package/gluon-status-page-api/src/batman_adv.h new file mode 100644 index 00000000..734fe83a --- /dev/null +++ b/package/gluon-status-page-api/src/batman_adv.h @@ -0,0 +1,208 @@ +/* Copyright (C) 2016 B.A.T.M.A.N. contributors: + * + * Matthias Schiffer + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _UAPI_LINUX_BATMAN_ADV_H_ +#define _UAPI_LINUX_BATMAN_ADV_H_ + +#define BATADV_NL_NAME "batadv" + +#define BATADV_NL_MCAST_GROUP_TPMETER "tpmeter" + +/** + * enum batadv_tt_client_flags - TT client specific flags + * @BATADV_TT_CLIENT_DEL: the client has to be deleted from the table + * @BATADV_TT_CLIENT_ROAM: the client roamed to/from another node and the new + * update telling its new real location has not been received/sent yet + * @BATADV_TT_CLIENT_WIFI: this client is connected through a wifi interface. + * This information is used by the "AP Isolation" feature + * @BATADV_TT_CLIENT_ISOLA: this client is considered "isolated". This + * information is used by the Extended Isolation feature + * @BATADV_TT_CLIENT_NOPURGE: this client should never be removed from the table + * @BATADV_TT_CLIENT_NEW: this client has been added to the local table but has + * not been announced yet + * @BATADV_TT_CLIENT_PENDING: this client is marked for removal but it is kept + * in the table for one more originator interval for consistency purposes + * @BATADV_TT_CLIENT_TEMP: this global client has been detected to be part of + * the network but no nnode has already announced it + * + * Bits from 0 to 7 are called _remote flags_ because they are sent on the wire. + * Bits from 8 to 15 are called _local flags_ because they are used for local + * computations only. + * + * Bits from 4 to 7 - a subset of remote flags - are ensured to be in sync with + * the other nodes in the network. To achieve this goal these flags are included + * in the TT CRC computation. + */ +enum batadv_tt_client_flags { + BATADV_TT_CLIENT_DEL = (1 << 0), + BATADV_TT_CLIENT_ROAM = (1 << 1), + BATADV_TT_CLIENT_WIFI = (1 << 4), + BATADV_TT_CLIENT_ISOLA = (1 << 5), + BATADV_TT_CLIENT_NOPURGE = (1 << 8), + BATADV_TT_CLIENT_NEW = (1 << 9), + BATADV_TT_CLIENT_PENDING = (1 << 10), + BATADV_TT_CLIENT_TEMP = (1 << 11), +}; + +/** + * enum batadv_nl_attrs - batman-adv netlink attributes + * + * @BATADV_ATTR_UNSPEC: unspecified attribute to catch errors + * @BATADV_ATTR_VERSION: batman-adv version string + * @BATADV_ATTR_ALGO_NAME: name of routing algorithm + * @BATADV_ATTR_MESH_IFINDEX: index of the batman-adv interface + * @BATADV_ATTR_MESH_IFNAME: name of the batman-adv interface + * @BATADV_ATTR_MESH_ADDRESS: mac address of the batman-adv interface + * @BATADV_ATTR_HARD_IFINDEX: index of the non-batman-adv interface + * @BATADV_ATTR_HARD_IFNAME: name of the non-batman-adv interface + * @BATADV_ATTR_HARD_ADDRESS: mac address of the non-batman-adv interface + * @BATADV_ATTR_ORIG_ADDRESS: originator mac address + * @BATADV_ATTR_TPMETER_RESULT: result of run (see batadv_tp_meter_status) + * @BATADV_ATTR_TPMETER_TEST_TIME: time (msec) the run took + * @BATADV_ATTR_TPMETER_BYTES: amount of acked bytes during run + * @BATADV_ATTR_TPMETER_COOKIE: session cookie to match tp_meter session + * @BATADV_ATTR_PAD: attribute used for padding for 64-bit alignment + * @BATADV_ATTR_ACTIVE: Flag indicating if the hard interface is active + * @BATADV_ATTR_TT_ADDRESS: Client MAC address + * @BATADV_ATTR_TT_TTVN: Translation table version + * @BATADV_ATTR_TT_LAST_TTVN: Previous translation table version + * @BATADV_ATTR_TT_CRC32: CRC32 over translation table + * @BATADV_ATTR_TT_VID: VLAN ID + * @BATADV_ATTR_TT_FLAGS: Translation table client flags + * @BATADV_ATTR_FLAG_BEST: Flags indicating entry is the best + * @BATADV_ATTR_LAST_SEEN_MSECS: Time in milliseconds since last seen + * @BATADV_ATTR_NEIGH_ADDRESS: Neighbour MAC address + * @BATADV_ATTR_TQ: TQ to neighbour + * @BATADV_ATTR_THROUGHPUT: Estimated throughput to Neighbour + * @BATADV_ATTR_BANDWIDTH_UP: Reported uplink bandwidth + * @BATADV_ATTR_BANDWIDTH_DOWN: Reported downlink bandwidth + * @BATADV_ATTR_ROUTER: Gateway router MAC address + * @BATADV_ATTR_BLA_OWN: Flag indicating own originator + * @BATADV_ATTR_BLA_ADDRESS: Bridge loop avoidance claim MAC address + * @BATADV_ATTR_BLA_VID: BLA VLAN ID + * @BATADV_ATTR_BLA_BACKBONE: BLA gateway originator MAC address + * @BATADV_ATTR_BLA_CRC: BLA CRC + * @__BATADV_ATTR_AFTER_LAST: internal use + * @NUM_BATADV_ATTR: total number of batadv_nl_attrs available + * @BATADV_ATTR_MAX: highest attribute number currently defined + */ +enum batadv_nl_attrs { + BATADV_ATTR_UNSPEC, + BATADV_ATTR_VERSION, + BATADV_ATTR_ALGO_NAME, + BATADV_ATTR_MESH_IFINDEX, + BATADV_ATTR_MESH_IFNAME, + BATADV_ATTR_MESH_ADDRESS, + BATADV_ATTR_HARD_IFINDEX, + BATADV_ATTR_HARD_IFNAME, + BATADV_ATTR_HARD_ADDRESS, + BATADV_ATTR_ORIG_ADDRESS, + BATADV_ATTR_TPMETER_RESULT, + BATADV_ATTR_TPMETER_TEST_TIME, + BATADV_ATTR_TPMETER_BYTES, + BATADV_ATTR_TPMETER_COOKIE, + BATADV_ATTR_PAD, + BATADV_ATTR_ACTIVE, + BATADV_ATTR_TT_ADDRESS, + BATADV_ATTR_TT_TTVN, + BATADV_ATTR_TT_LAST_TTVN, + BATADV_ATTR_TT_CRC32, + BATADV_ATTR_TT_VID, + BATADV_ATTR_TT_FLAGS, + BATADV_ATTR_FLAG_BEST, + BATADV_ATTR_LAST_SEEN_MSECS, + BATADV_ATTR_NEIGH_ADDRESS, + BATADV_ATTR_TQ, + BATADV_ATTR_THROUGHPUT, + BATADV_ATTR_BANDWIDTH_UP, + BATADV_ATTR_BANDWIDTH_DOWN, + BATADV_ATTR_ROUTER, + BATADV_ATTR_BLA_OWN, + BATADV_ATTR_BLA_ADDRESS, + BATADV_ATTR_BLA_VID, + BATADV_ATTR_BLA_BACKBONE, + BATADV_ATTR_BLA_CRC, + /* add attributes above here, update the policy in netlink.c */ + __BATADV_ATTR_AFTER_LAST, + NUM_BATADV_ATTR = __BATADV_ATTR_AFTER_LAST, + BATADV_ATTR_MAX = __BATADV_ATTR_AFTER_LAST - 1 +}; + +/** + * enum batadv_nl_commands - supported batman-adv netlink commands + * + * @BATADV_CMD_UNSPEC: unspecified command to catch errors + * @BATADV_CMD_GET_MESH_INFO: Query basic information about batman-adv device + * @BATADV_CMD_TP_METER: Start a tp meter session + * @BATADV_CMD_TP_METER_CANCEL: Cancel a tp meter session + * @BATADV_CMD_GET_ROUTING_ALGOS: Query the list of routing algorithms. + * @BATADV_CMD_GET_HARDIFS: Query list of hard interfaces + * @BATADV_CMD_GET_TRANSTABLE_LOCAL: Query list of local translations + * @BATADV_CMD_GET_TRANSTABLE_GLOBAL Query list of global translations + * @BATADV_CMD_GET_ORIGINATORS: Query list of originators + * @BATADV_CMD_GET_NEIGHBORS: Query list of neighbours + * @BATADV_CMD_GET_GATEWAYS: Query list of gateways + * @BATADV_CMD_GET_BLA_CLAIM: Query list of bridge loop avoidance claims + * @BATADV_CMD_GET_BLA_BACKBONE: Query list of bridge loop avoidance backbones + * @__BATADV_CMD_AFTER_LAST: internal use + * @BATADV_CMD_MAX: highest used command number + */ +enum batadv_nl_commands { + BATADV_CMD_UNSPEC, + BATADV_CMD_GET_MESH_INFO, + BATADV_CMD_TP_METER, + BATADV_CMD_TP_METER_CANCEL, + BATADV_CMD_GET_ROUTING_ALGOS, + BATADV_CMD_GET_HARDIFS, + BATADV_CMD_GET_TRANSTABLE_LOCAL, + BATADV_CMD_GET_TRANSTABLE_GLOBAL, + BATADV_CMD_GET_ORIGINATORS, + BATADV_CMD_GET_NEIGHBORS, + BATADV_CMD_GET_GATEWAYS, + BATADV_CMD_GET_BLA_CLAIM, + BATADV_CMD_GET_BLA_BACKBONE, + /* add new commands above here */ + __BATADV_CMD_AFTER_LAST, + BATADV_CMD_MAX = __BATADV_CMD_AFTER_LAST - 1 +}; + +/** + * enum batadv_tp_meter_reason - reason of a tp meter test run stop + * @BATADV_TP_REASON_COMPLETE: sender finished tp run + * @BATADV_TP_REASON_CANCEL: sender was stopped during run + * @BATADV_TP_REASON_DST_UNREACHABLE: receiver could not be reached or didn't + * answer + * @BATADV_TP_REASON_RESEND_LIMIT: (unused) sender retry reached limit + * @BATADV_TP_REASON_ALREADY_ONGOING: test to or from the same node already + * ongoing + * @BATADV_TP_REASON_MEMORY_ERROR: test was stopped due to low memory + * @BATADV_TP_REASON_CANT_SEND: failed to send via outgoing interface + * @BATADV_TP_REASON_TOO_MANY: too many ongoing sessions + */ +enum batadv_tp_meter_reason { + BATADV_TP_REASON_COMPLETE = 3, + BATADV_TP_REASON_CANCEL = 4, + /* error status >= 128 */ + BATADV_TP_REASON_DST_UNREACHABLE = 128, + BATADV_TP_REASON_RESEND_LIMIT = 129, + BATADV_TP_REASON_ALREADY_ONGOING = 130, + BATADV_TP_REASON_MEMORY_ERROR = 131, + BATADV_TP_REASON_CANT_SEND = 132, + BATADV_TP_REASON_TOO_MANY = 133, +}; + +#endif /* _UAPI_LINUX_BATMAN_ADV_H_ */ diff --git a/package/gluon-status-page-api/src/neighbours-batadv.c b/package/gluon-status-page-api/src/neighbours-batadv.c index f0a484b2..7d5d0211 100644 --- a/package/gluon-status-page-api/src/neighbours-batadv.c +++ b/package/gluon-status-page-api/src/neighbours-batadv.c @@ -4,45 +4,110 @@ #include #include +#include "batadv-netlink.h" + #define STR(x) #x #define XSTR(x) STR(x) +struct neigh_netlink_opts { + struct json_object *obj; + struct batadv_nlquery_opts query_opts; +}; + +static const enum batadv_nl_attrs parse_orig_list_mandatory[] = { + BATADV_ATTR_ORIG_ADDRESS, + BATADV_ATTR_NEIGH_ADDRESS, + BATADV_ATTR_TQ, + BATADV_ATTR_HARD_IFINDEX, + BATADV_ATTR_LAST_SEEN_MSECS, +}; + +static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg) +{ + struct nlattr *attrs[BATADV_ATTR_MAX+1]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct batadv_nlquery_opts *query_opts = arg; + struct genlmsghdr *ghdr; + uint8_t *orig; + uint8_t *dest; + uint8_t tq; + uint32_t hardif; + uint32_t lastseen; + char ifname_buf[IF_NAMESIZE], *ifname; + struct neigh_netlink_opts *opts; + char mac1[18]; + + opts = container_of(query_opts, struct neigh_netlink_opts, query_opts); + + if (!genlmsg_valid_hdr(nlh, 0)) + return NL_OK; + + ghdr = nlmsg_data(nlh); + + if (ghdr->cmd != BATADV_CMD_GET_ORIGINATORS) + return NL_OK; + + if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0), + genlmsg_len(ghdr), batadv_netlink_policy)) + return NL_OK; + + if (batadv_nl_missing_attrs(attrs, parse_orig_list_mandatory, + ARRAY_SIZE(parse_orig_list_mandatory))) + return NL_OK; + + if (!attrs[BATADV_ATTR_FLAG_BEST]) + return NL_OK; + + orig = nla_data(attrs[BATADV_ATTR_ORIG_ADDRESS]); + dest = nla_data(attrs[BATADV_ATTR_NEIGH_ADDRESS]); + tq = nla_get_u8(attrs[BATADV_ATTR_TQ]); + hardif = nla_get_u32(attrs[BATADV_ATTR_HARD_IFINDEX]); + lastseen = nla_get_u32(attrs[BATADV_ATTR_LAST_SEEN_MSECS]); + + if (memcmp(orig, dest, 6) != 0) + return NL_OK; + + ifname = if_indextoname(hardif, ifname_buf); + if (!ifname) + return NL_OK; + + sprintf(mac1, "%02x:%02x:%02x:%02x:%02x:%02x", + orig[0], orig[1], orig[2], orig[3], orig[4], orig[5]); + + struct json_object *neigh = json_object_new_object(); + if (!neigh) + return NL_OK; + + json_object_object_add(neigh, "tq", json_object_new_int(tq)); + json_object_object_add(neigh, "lastseen", json_object_new_double(lastseen / 1000.)); + json_object_object_add(neigh, "ifname", json_object_new_string(ifname)); + + json_object_object_add(opts->obj, mac1, neigh); + + return NL_OK; +} + static json_object *neighbours(void) { - struct json_object *obj = json_object_new_object(); + struct neigh_netlink_opts opts = { + .query_opts = { + .err = 0, + }, + }; + int ret; - FILE *f; - - f = fopen("/sys/kernel/debug/batman_adv/bat0/originators" , "r"); - - if (f == NULL) + opts.obj = json_object_new_object(); + if (!opts.obj) return NULL; - while (!feof(f)) { - char mac1[18]; - char mac2[18]; - char ifname[IF_NAMESIZE+1]; - int tq; - double lastseen; - - int count = fscanf(f, "%17s%*[\t ]%lfs%*[\t (]%d) %17s%*[[ ]%" XSTR(IF_NAMESIZE) "[^]]]", mac1, &lastseen, &tq, mac2, ifname); - - if (count != 5) - continue; - - if (strcmp(mac1, mac2) == 0) { - struct json_object *neigh = json_object_new_object(); - - json_object_object_add(neigh, "tq", json_object_new_int(tq)); - json_object_object_add(neigh, "lastseen", json_object_new_double(lastseen)); - json_object_object_add(neigh, "ifname", json_object_new_string(ifname)); - - json_object_object_add(obj, mac1, neigh); - } + ret = batadv_nl_query_common("bat0", BATADV_CMD_GET_ORIGINATORS, + parse_orig_list_netlink_cb, NLM_F_DUMP, + &opts.query_opts); + if (ret < 0) { + json_object_put(opts.obj); + return NULL; } - fclose(f); - - return obj; + return opts.obj; } int main(void) { From 22946b14b6b29caa7361256215eb42643bf68055 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Sat, 24 Sep 2016 19:59:44 +0200 Subject: [PATCH 080/126] gluon-mesh-batman-adv-core: Switch from debugfs to batadv netlink The batadv debugfs requires large memory blocks to write the text debug tables. This is inefficient for large tables like the global translation table or the originators table. The memory requirement can be reduced by using netlink. It copies smaller packets in a binary format to the userspace program. The respondd module of gluon-mesh-batman-adv-core can therefore parse larger originator tables without causing an OOM on systems which are tight on memory. Signed-off-by: Sven Eckelmann --- package/gluon-mesh-batman-adv-core/Makefile | 2 +- .../gluon-mesh-batman-adv-core/src/Makefile | 20 +- .../src/batadv-netlink.c | 149 +++++++++ .../src/batadv-netlink.h | 68 ++++ .../src/batman_adv.h | 208 ++++++++++++ .../gluon-mesh-batman-adv-core/src/respondd.c | 303 +++++++++++++----- 6 files changed, 668 insertions(+), 82 deletions(-) create mode 100644 package/gluon-mesh-batman-adv-core/src/batadv-netlink.c create mode 100644 package/gluon-mesh-batman-adv-core/src/batadv-netlink.h create mode 100644 package/gluon-mesh-batman-adv-core/src/batman_adv.h diff --git a/package/gluon-mesh-batman-adv-core/Makefile b/package/gluon-mesh-batman-adv-core/Makefile index 25c3b9b0..1989ab78 100644 --- a/package/gluon-mesh-batman-adv-core/Makefile +++ b/package/gluon-mesh-batman-adv-core/Makefile @@ -13,7 +13,7 @@ define Package/gluon-mesh-batman-adv-core SECTION:=gluon CATEGORY:=Gluon TITLE:=Support for batman-adv meshing (core) - DEPENDS:=+gluon-core +libgluonutil +gluon-client-bridge +gluon-ebtables +firewall +libiwinfo +kmod-dummy +kmod-macvlan + DEPENDS:=+gluon-core +libgluonutil +gluon-client-bridge +gluon-ebtables +firewall +libiwinfo +kmod-dummy +kmod-macvlan +libnl-tiny endef define Build/Prepare diff --git a/package/gluon-mesh-batman-adv-core/src/Makefile b/package/gluon-mesh-batman-adv-core/src/Makefile index 84d9d48e..9206a067 100644 --- a/package/gluon-mesh-batman-adv-core/src/Makefile +++ b/package/gluon-mesh-batman-adv-core/src/Makefile @@ -2,5 +2,23 @@ all: respondd.so CFLAGS += -Wall -respondd.so: respondd.c +ifeq ($(origin PKG_CONFIG), undefined) + PKG_CONFIG = pkg-config + ifeq ($(shell which $(PKG_CONFIG) 2>/dev/null),) + $(error $(PKG_CONFIG) not found) + endif +endif + +ifeq ($(origin LIBNL_CFLAGS) $(origin LIBNL_LDLIBS), undefined undefined) + LIBNL_NAME ?= libnl-tiny + ifeq ($(shell $(PKG_CONFIG) --modversion $(LIBNL_NAME) 2>/dev/null),) + $(error No $(LIBNL_NAME) development libraries found!) + endif + LIBNL_CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBNL_NAME)) + LIBNL_LDLIBS += $(shell $(PKG_CONFIG) --libs $(LIBNL_NAME)) +endif +CFLAGS += $(LIBNL_CFLAGS) +LDLIBS += $(LIBNL_LDLIBS) + +respondd.so: respondd.c batadv-netlink.c $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -shared -fPIC -D_GNU_SOURCE -o $@ $^ $(LDLIBS) -lgluonutil -liwinfo -luci diff --git a/package/gluon-mesh-batman-adv-core/src/batadv-netlink.c b/package/gluon-mesh-batman-adv-core/src/batadv-netlink.c new file mode 100644 index 00000000..aeea7624 --- /dev/null +++ b/package/gluon-mesh-batman-adv-core/src/batadv-netlink.c @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2009-2016 B.A.T.M.A.N. contributors: + * + * Marek Lindner , Andrew Lunn + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + * + */ + +#include "batadv-netlink.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "batman_adv.h" + +#ifndef __maybe_unused +#define __maybe_unused __attribute__((unused)) +#endif + +struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = { + [BATADV_ATTR_HARD_IFINDEX] = { .type = NLA_U32 }, + [BATADV_ATTR_ORIG_ADDRESS] = { .type = NLA_UNSPEC, + .minlen = ETH_ALEN, + .maxlen = ETH_ALEN }, + [BATADV_ATTR_TT_FLAGS] = { .type = NLA_U32 }, + [BATADV_ATTR_FLAG_BEST] = { .type = NLA_FLAG }, + [BATADV_ATTR_LAST_SEEN_MSECS] = { .type = NLA_U32 }, + [BATADV_ATTR_NEIGH_ADDRESS] = { .type = NLA_UNSPEC, + .minlen = ETH_ALEN, + .maxlen = ETH_ALEN }, + [BATADV_ATTR_TQ] = { .type = NLA_U8 }, + [BATADV_ATTR_ROUTER] = { .type = NLA_UNSPEC, + .minlen = ETH_ALEN, + .maxlen = ETH_ALEN }, +}; + +static int nlquery_error_cb(struct sockaddr_nl *nla __maybe_unused, + struct nlmsgerr *nlerr, void *arg) +{ + struct batadv_nlquery_opts *query_opts = arg; + + query_opts->err = nlerr->error; + + return NL_STOP; +} + +static int nlquery_stop_cb(struct nl_msg *msg, void *arg) +{ + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct batadv_nlquery_opts *query_opts = arg; + int *error = nlmsg_data(nlh); + + if (*error) + query_opts->err = *error; + + return NL_STOP; +} + +int batadv_nl_query_common(const char *mesh_iface, + enum batadv_nl_commands nl_cmd, + nl_recvmsg_msg_cb_t callback, int flags, + struct batadv_nlquery_opts *query_opts) +{ + struct nl_sock *sock; + struct nl_msg *msg; + struct nl_cb *cb; + int ifindex; + int family; + int ret; + + query_opts->err = 0; + + sock = nl_socket_alloc(); + if (!sock) + return -ENOMEM; + + ret = genl_connect(sock); + if (ret < 0) { + query_opts->err = ret; + goto err_free_sock; + } + + family = genl_ctrl_resolve(sock, BATADV_NL_NAME); + if (family < 0) { + query_opts->err = -EOPNOTSUPP; + goto err_free_sock; + } + + ifindex = if_nametoindex(mesh_iface); + if (!ifindex) { + query_opts->err = -ENODEV; + goto err_free_sock; + } + + cb = nl_cb_alloc(NL_CB_DEFAULT); + if (!cb) { + query_opts->err = -ENOMEM; + goto err_free_sock; + } + + nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, callback, query_opts); + nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, nlquery_stop_cb, query_opts); + nl_cb_err(cb, NL_CB_CUSTOM, nlquery_error_cb, query_opts); + + msg = nlmsg_alloc(); + if (!msg) { + query_opts->err = -ENOMEM; + goto err_free_cb; + } + + genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family, 0, flags, + nl_cmd, 1); + + nla_put_u32(msg, BATADV_ATTR_MESH_IFINDEX, ifindex); + nl_send_auto_complete(sock, msg); + nlmsg_free(msg); + + nl_recvmsgs(sock, cb); + +err_free_cb: + nl_cb_put(cb); +err_free_sock: + nl_socket_free(sock); + + return query_opts->err; +} diff --git a/package/gluon-mesh-batman-adv-core/src/batadv-netlink.h b/package/gluon-mesh-batman-adv-core/src/batadv-netlink.h new file mode 100644 index 00000000..8b85a6c2 --- /dev/null +++ b/package/gluon-mesh-batman-adv-core/src/batadv-netlink.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2009-2016 B.A.T.M.A.N. contributors: + * + * Marek Lindner , Andrew Lunn + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + * + */ + +#ifndef _BATADV_NETLINK_H +#define _BATADV_NETLINK_H + +#include +#include +#include +#include +#include + +#include "batman_adv.h" + +struct batadv_nlquery_opts { + int err; +}; + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) +#endif + +#ifndef container_of +#define container_of(ptr, type, member) __extension__ ({ \ + const __typeof__(((type *)0)->member) *__pmember = (ptr); \ + (type *)((char *)__pmember - offsetof(type, member)); }) +#endif + +int batadv_nl_query_common(const char *mesh_iface, + enum batadv_nl_commands nl_cmd, + nl_recvmsg_msg_cb_t callback, int flags, + struct batadv_nlquery_opts *query_opts); + +static inline bool batadv_nl_missing_attrs(struct nlattr *attrs[], + const enum batadv_nl_attrs mandatory[], + size_t num) +{ + size_t i; + + for (i = 0; i < num; i++) { + if (!attrs[mandatory[i]]) + return true; + } + + return false; +} + +extern struct nla_policy batadv_netlink_policy[]; + +#endif /* _BATADV_NETLINK_H */ diff --git a/package/gluon-mesh-batman-adv-core/src/batman_adv.h b/package/gluon-mesh-batman-adv-core/src/batman_adv.h new file mode 100644 index 00000000..734fe83a --- /dev/null +++ b/package/gluon-mesh-batman-adv-core/src/batman_adv.h @@ -0,0 +1,208 @@ +/* Copyright (C) 2016 B.A.T.M.A.N. contributors: + * + * Matthias Schiffer + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _UAPI_LINUX_BATMAN_ADV_H_ +#define _UAPI_LINUX_BATMAN_ADV_H_ + +#define BATADV_NL_NAME "batadv" + +#define BATADV_NL_MCAST_GROUP_TPMETER "tpmeter" + +/** + * enum batadv_tt_client_flags - TT client specific flags + * @BATADV_TT_CLIENT_DEL: the client has to be deleted from the table + * @BATADV_TT_CLIENT_ROAM: the client roamed to/from another node and the new + * update telling its new real location has not been received/sent yet + * @BATADV_TT_CLIENT_WIFI: this client is connected through a wifi interface. + * This information is used by the "AP Isolation" feature + * @BATADV_TT_CLIENT_ISOLA: this client is considered "isolated". This + * information is used by the Extended Isolation feature + * @BATADV_TT_CLIENT_NOPURGE: this client should never be removed from the table + * @BATADV_TT_CLIENT_NEW: this client has been added to the local table but has + * not been announced yet + * @BATADV_TT_CLIENT_PENDING: this client is marked for removal but it is kept + * in the table for one more originator interval for consistency purposes + * @BATADV_TT_CLIENT_TEMP: this global client has been detected to be part of + * the network but no nnode has already announced it + * + * Bits from 0 to 7 are called _remote flags_ because they are sent on the wire. + * Bits from 8 to 15 are called _local flags_ because they are used for local + * computations only. + * + * Bits from 4 to 7 - a subset of remote flags - are ensured to be in sync with + * the other nodes in the network. To achieve this goal these flags are included + * in the TT CRC computation. + */ +enum batadv_tt_client_flags { + BATADV_TT_CLIENT_DEL = (1 << 0), + BATADV_TT_CLIENT_ROAM = (1 << 1), + BATADV_TT_CLIENT_WIFI = (1 << 4), + BATADV_TT_CLIENT_ISOLA = (1 << 5), + BATADV_TT_CLIENT_NOPURGE = (1 << 8), + BATADV_TT_CLIENT_NEW = (1 << 9), + BATADV_TT_CLIENT_PENDING = (1 << 10), + BATADV_TT_CLIENT_TEMP = (1 << 11), +}; + +/** + * enum batadv_nl_attrs - batman-adv netlink attributes + * + * @BATADV_ATTR_UNSPEC: unspecified attribute to catch errors + * @BATADV_ATTR_VERSION: batman-adv version string + * @BATADV_ATTR_ALGO_NAME: name of routing algorithm + * @BATADV_ATTR_MESH_IFINDEX: index of the batman-adv interface + * @BATADV_ATTR_MESH_IFNAME: name of the batman-adv interface + * @BATADV_ATTR_MESH_ADDRESS: mac address of the batman-adv interface + * @BATADV_ATTR_HARD_IFINDEX: index of the non-batman-adv interface + * @BATADV_ATTR_HARD_IFNAME: name of the non-batman-adv interface + * @BATADV_ATTR_HARD_ADDRESS: mac address of the non-batman-adv interface + * @BATADV_ATTR_ORIG_ADDRESS: originator mac address + * @BATADV_ATTR_TPMETER_RESULT: result of run (see batadv_tp_meter_status) + * @BATADV_ATTR_TPMETER_TEST_TIME: time (msec) the run took + * @BATADV_ATTR_TPMETER_BYTES: amount of acked bytes during run + * @BATADV_ATTR_TPMETER_COOKIE: session cookie to match tp_meter session + * @BATADV_ATTR_PAD: attribute used for padding for 64-bit alignment + * @BATADV_ATTR_ACTIVE: Flag indicating if the hard interface is active + * @BATADV_ATTR_TT_ADDRESS: Client MAC address + * @BATADV_ATTR_TT_TTVN: Translation table version + * @BATADV_ATTR_TT_LAST_TTVN: Previous translation table version + * @BATADV_ATTR_TT_CRC32: CRC32 over translation table + * @BATADV_ATTR_TT_VID: VLAN ID + * @BATADV_ATTR_TT_FLAGS: Translation table client flags + * @BATADV_ATTR_FLAG_BEST: Flags indicating entry is the best + * @BATADV_ATTR_LAST_SEEN_MSECS: Time in milliseconds since last seen + * @BATADV_ATTR_NEIGH_ADDRESS: Neighbour MAC address + * @BATADV_ATTR_TQ: TQ to neighbour + * @BATADV_ATTR_THROUGHPUT: Estimated throughput to Neighbour + * @BATADV_ATTR_BANDWIDTH_UP: Reported uplink bandwidth + * @BATADV_ATTR_BANDWIDTH_DOWN: Reported downlink bandwidth + * @BATADV_ATTR_ROUTER: Gateway router MAC address + * @BATADV_ATTR_BLA_OWN: Flag indicating own originator + * @BATADV_ATTR_BLA_ADDRESS: Bridge loop avoidance claim MAC address + * @BATADV_ATTR_BLA_VID: BLA VLAN ID + * @BATADV_ATTR_BLA_BACKBONE: BLA gateway originator MAC address + * @BATADV_ATTR_BLA_CRC: BLA CRC + * @__BATADV_ATTR_AFTER_LAST: internal use + * @NUM_BATADV_ATTR: total number of batadv_nl_attrs available + * @BATADV_ATTR_MAX: highest attribute number currently defined + */ +enum batadv_nl_attrs { + BATADV_ATTR_UNSPEC, + BATADV_ATTR_VERSION, + BATADV_ATTR_ALGO_NAME, + BATADV_ATTR_MESH_IFINDEX, + BATADV_ATTR_MESH_IFNAME, + BATADV_ATTR_MESH_ADDRESS, + BATADV_ATTR_HARD_IFINDEX, + BATADV_ATTR_HARD_IFNAME, + BATADV_ATTR_HARD_ADDRESS, + BATADV_ATTR_ORIG_ADDRESS, + BATADV_ATTR_TPMETER_RESULT, + BATADV_ATTR_TPMETER_TEST_TIME, + BATADV_ATTR_TPMETER_BYTES, + BATADV_ATTR_TPMETER_COOKIE, + BATADV_ATTR_PAD, + BATADV_ATTR_ACTIVE, + BATADV_ATTR_TT_ADDRESS, + BATADV_ATTR_TT_TTVN, + BATADV_ATTR_TT_LAST_TTVN, + BATADV_ATTR_TT_CRC32, + BATADV_ATTR_TT_VID, + BATADV_ATTR_TT_FLAGS, + BATADV_ATTR_FLAG_BEST, + BATADV_ATTR_LAST_SEEN_MSECS, + BATADV_ATTR_NEIGH_ADDRESS, + BATADV_ATTR_TQ, + BATADV_ATTR_THROUGHPUT, + BATADV_ATTR_BANDWIDTH_UP, + BATADV_ATTR_BANDWIDTH_DOWN, + BATADV_ATTR_ROUTER, + BATADV_ATTR_BLA_OWN, + BATADV_ATTR_BLA_ADDRESS, + BATADV_ATTR_BLA_VID, + BATADV_ATTR_BLA_BACKBONE, + BATADV_ATTR_BLA_CRC, + /* add attributes above here, update the policy in netlink.c */ + __BATADV_ATTR_AFTER_LAST, + NUM_BATADV_ATTR = __BATADV_ATTR_AFTER_LAST, + BATADV_ATTR_MAX = __BATADV_ATTR_AFTER_LAST - 1 +}; + +/** + * enum batadv_nl_commands - supported batman-adv netlink commands + * + * @BATADV_CMD_UNSPEC: unspecified command to catch errors + * @BATADV_CMD_GET_MESH_INFO: Query basic information about batman-adv device + * @BATADV_CMD_TP_METER: Start a tp meter session + * @BATADV_CMD_TP_METER_CANCEL: Cancel a tp meter session + * @BATADV_CMD_GET_ROUTING_ALGOS: Query the list of routing algorithms. + * @BATADV_CMD_GET_HARDIFS: Query list of hard interfaces + * @BATADV_CMD_GET_TRANSTABLE_LOCAL: Query list of local translations + * @BATADV_CMD_GET_TRANSTABLE_GLOBAL Query list of global translations + * @BATADV_CMD_GET_ORIGINATORS: Query list of originators + * @BATADV_CMD_GET_NEIGHBORS: Query list of neighbours + * @BATADV_CMD_GET_GATEWAYS: Query list of gateways + * @BATADV_CMD_GET_BLA_CLAIM: Query list of bridge loop avoidance claims + * @BATADV_CMD_GET_BLA_BACKBONE: Query list of bridge loop avoidance backbones + * @__BATADV_CMD_AFTER_LAST: internal use + * @BATADV_CMD_MAX: highest used command number + */ +enum batadv_nl_commands { + BATADV_CMD_UNSPEC, + BATADV_CMD_GET_MESH_INFO, + BATADV_CMD_TP_METER, + BATADV_CMD_TP_METER_CANCEL, + BATADV_CMD_GET_ROUTING_ALGOS, + BATADV_CMD_GET_HARDIFS, + BATADV_CMD_GET_TRANSTABLE_LOCAL, + BATADV_CMD_GET_TRANSTABLE_GLOBAL, + BATADV_CMD_GET_ORIGINATORS, + BATADV_CMD_GET_NEIGHBORS, + BATADV_CMD_GET_GATEWAYS, + BATADV_CMD_GET_BLA_CLAIM, + BATADV_CMD_GET_BLA_BACKBONE, + /* add new commands above here */ + __BATADV_CMD_AFTER_LAST, + BATADV_CMD_MAX = __BATADV_CMD_AFTER_LAST - 1 +}; + +/** + * enum batadv_tp_meter_reason - reason of a tp meter test run stop + * @BATADV_TP_REASON_COMPLETE: sender finished tp run + * @BATADV_TP_REASON_CANCEL: sender was stopped during run + * @BATADV_TP_REASON_DST_UNREACHABLE: receiver could not be reached or didn't + * answer + * @BATADV_TP_REASON_RESEND_LIMIT: (unused) sender retry reached limit + * @BATADV_TP_REASON_ALREADY_ONGOING: test to or from the same node already + * ongoing + * @BATADV_TP_REASON_MEMORY_ERROR: test was stopped due to low memory + * @BATADV_TP_REASON_CANT_SEND: failed to send via outgoing interface + * @BATADV_TP_REASON_TOO_MANY: too many ongoing sessions + */ +enum batadv_tp_meter_reason { + BATADV_TP_REASON_COMPLETE = 3, + BATADV_TP_REASON_CANCEL = 4, + /* error status >= 128 */ + BATADV_TP_REASON_DST_UNREACHABLE = 128, + BATADV_TP_REASON_RESEND_LIMIT = 129, + BATADV_TP_REASON_ALREADY_ONGOING = 130, + BATADV_TP_REASON_MEMORY_ERROR = 131, + BATADV_TP_REASON_CANT_SEND = 132, + BATADV_TP_REASON_TOO_MANY = 133, +}; + +#endif /* _UAPI_LINUX_BATMAN_ADV_H_ */ diff --git a/package/gluon-mesh-batman-adv-core/src/respondd.c b/package/gluon-mesh-batman-adv-core/src/respondd.c index a84076e9..33e1e0d5 100644 --- a/package/gluon-mesh-batman-adv-core/src/respondd.c +++ b/package/gluon-mesh-batman-adv-core/src/respondd.c @@ -51,11 +51,28 @@ #include #include +#include "batadv-netlink.h" #define _STRINGIFY(s) #s #define STRINGIFY(s) _STRINGIFY(s) +struct neigh_netlink_opts { + struct json_object *interfaces; + struct batadv_nlquery_opts query_opts; +}; + +struct gw_netlink_opts { + struct json_object *obj; + struct batadv_nlquery_opts query_opts; +}; + +struct clients_netlink_opts { + size_t total; + size_t wifi; + struct batadv_nlquery_opts query_opts; +}; + static struct json_object * get_addresses(void) { FILE *f = fopen("/proc/net/if_inet6", "r"); @@ -223,29 +240,70 @@ static struct json_object * respondd_provider_nodeinfo(void) { return ret; } +static const enum batadv_nl_attrs gateways_mandatory[] = { + BATADV_ATTR_ORIG_ADDRESS, + BATADV_ATTR_ROUTER, +}; + +static int parse_gw_list_netlink_cb(struct nl_msg *msg, void *arg) +{ + struct nlattr *attrs[BATADV_ATTR_MAX+1]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct batadv_nlquery_opts *query_opts = arg; + struct genlmsghdr *ghdr; + uint8_t *orig; + uint8_t *router; + struct gw_netlink_opts *opts; + char addr[18]; + + opts = container_of(query_opts, struct gw_netlink_opts, query_opts); + + if (!genlmsg_valid_hdr(nlh, 0)) + return NL_OK; + + ghdr = nlmsg_data(nlh); + + if (ghdr->cmd != BATADV_CMD_GET_GATEWAYS) + return NL_OK; + + if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0), + genlmsg_len(ghdr), batadv_netlink_policy)) + return NL_OK; + + if (batadv_nl_missing_attrs(attrs, gateways_mandatory, + ARRAY_SIZE(gateways_mandatory))) + return NL_OK; + + if (!attrs[BATADV_ATTR_FLAG_BEST]) + return NL_OK; + + orig = nla_data(attrs[BATADV_ATTR_ORIG_ADDRESS]); + router = nla_data(attrs[BATADV_ATTR_ROUTER]); + + sprintf(addr, "%02x:%02x:%02x:%02x:%02x:%02x", + orig[0], orig[1], orig[2], orig[3], orig[4], orig[5]); + + json_object_object_add(opts->obj, "gateway", json_object_new_string(addr)); + + sprintf(addr, "%02x:%02x:%02x:%02x:%02x:%02x", + router[0], router[1], router[2], router[3], router[4], router[5]); + + json_object_object_add(opts->obj, "gateway_nexthop", json_object_new_string(addr)); + + return NL_STOP; +} static void add_gateway(struct json_object *obj) { - FILE *f = fopen("/sys/kernel/debug/batman_adv/bat0/gateways", "r"); - if (!f) - return; + struct gw_netlink_opts opts = { + .obj = obj, + .query_opts = { + .err = 0, + }, + }; - char *line = NULL; - size_t len = 0; - - while (getline(&line, &len, f) >= 0) { - char addr[18]; - char nexthop[18]; - - if (sscanf(line, "=> %17[0-9a-fA-F:] ( %*u) %17[0-9a-fA-F:]", addr, nexthop) != 2) - continue; - - json_object_object_add(obj, "gateway", json_object_new_string(addr)); - json_object_object_add(obj, "gateway_nexthop", json_object_new_string(nexthop)); - break; - } - - free(line); - fclose(f); + batadv_nl_query_common("bat0", BATADV_CMD_GET_GATEWAYS, + parse_gw_list_netlink_cb, NLM_F_DUMP, + &opts.query_opts); } static inline bool ethtool_ioctl(int fd, struct ifreq *ifr, void *data) { @@ -421,39 +479,69 @@ static void count_stations(size_t *wifi24, size_t *wifi5) { uci_free_context(ctx); } +static const enum batadv_nl_attrs clients_mandatory[] = { + BATADV_ATTR_TT_FLAGS, +}; + +static int parse_clients_list_netlink_cb(struct nl_msg *msg, void *arg) +{ + struct nlattr *attrs[BATADV_ATTR_MAX+1]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct batadv_nlquery_opts *query_opts = arg; + struct genlmsghdr *ghdr; + struct clients_netlink_opts *opts; + uint32_t flags; + + opts = container_of(query_opts, struct clients_netlink_opts, query_opts); + + if (!genlmsg_valid_hdr(nlh, 0)) + return NL_OK; + + ghdr = nlmsg_data(nlh); + + if (ghdr->cmd != BATADV_CMD_GET_TRANSTABLE_LOCAL) + return NL_OK; + + if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0), + genlmsg_len(ghdr), batadv_netlink_policy)) + return NL_OK; + + if (batadv_nl_missing_attrs(attrs, clients_mandatory, + ARRAY_SIZE(clients_mandatory))) + return NL_OK; + + flags = nla_get_u32(attrs[BATADV_ATTR_TT_FLAGS]); + + if (flags & BATADV_TT_CLIENT_NOPURGE) + return NL_OK; + + if (flags & BATADV_TT_CLIENT_WIFI) + opts->wifi++; + + opts->total++; + + return NL_OK; +} + static struct json_object * get_clients(void) { - size_t total = 0, wifi = 0, wifi24 = 0, wifi5 = 0; + size_t wifi24 = 0, wifi5 = 0; + struct clients_netlink_opts opts = { + .total = 0, + .wifi = 0, + .query_opts = { + .err = 0, + }, + }; - FILE *f = fopen("/sys/kernel/debug/batman_adv/bat0/transtable_local", "r"); - if (!f) - return NULL; - - char *line = NULL; - size_t len = 0; - - while (getline(&line, &len, f) >= 0) { - char flags[16]; - - if (sscanf(line, " * %*[^[] [%15[^]]]", flags) != 1) - continue; - - if (strchr(flags, 'P')) - continue; - - total++; - - if (strchr(flags, 'W')) - wifi++; - } - - free(line); - fclose(f); + batadv_nl_query_common("bat0", BATADV_CMD_GET_TRANSTABLE_LOCAL, + parse_clients_list_netlink_cb, NLM_F_DUMP, + &opts.query_opts); count_stations(&wifi24, &wifi5); struct json_object *ret = json_object_new_object(); - json_object_object_add(ret, "total", json_object_new_int(total)); - json_object_object_add(ret, "wifi", json_object_new_int(wifi)); + json_object_object_add(ret, "total", json_object_new_int(opts.total)); + json_object_object_add(ret, "wifi", json_object_new_int(opts.wifi)); json_object_object_add(ret, "wifi24", json_object_new_int(wifi24)); json_object_object_add(ret, "wifi5", json_object_new_int(wifi5)); return ret; @@ -492,49 +580,104 @@ static struct json_object * ifnames2addrs(struct json_object *interfaces) { return ret; } -static struct json_object * get_batadv(void) { - FILE *f = fopen("/sys/kernel/debug/batman_adv/bat0/originators", "r"); - if (!f) - return NULL; +static const enum batadv_nl_attrs parse_orig_list_mandatory[] = { + BATADV_ATTR_ORIG_ADDRESS, + BATADV_ATTR_NEIGH_ADDRESS, + BATADV_ATTR_TQ, + BATADV_ATTR_HARD_IFINDEX, + BATADV_ATTR_LAST_SEEN_MSECS, +}; - char *line = NULL; - size_t len = 0; +static int parse_orig_list_netlink_cb(struct nl_msg *msg, void *arg) +{ + struct nlattr *attrs[BATADV_ATTR_MAX+1]; + struct nlmsghdr *nlh = nlmsg_hdr(msg); + struct batadv_nlquery_opts *query_opts = arg; + struct genlmsghdr *ghdr; + uint8_t *orig; + uint8_t *dest; + uint8_t tq; + uint32_t hardif; + uint32_t lastseen; + char ifname_buf[IF_NAMESIZE], *ifname; + struct neigh_netlink_opts *opts; + char mac1[18]; - struct json_object *interfaces = json_object_new_object(); + opts = container_of(query_opts, struct neigh_netlink_opts, query_opts); - while (getline(&line, &len, f) >= 0) { - char mac1[18], mac2[18]; - /* IF_NAMESIZE would be enough, but adding 1 here is simpler than subtracting 1 in the format string */ - char ifname[IF_NAMESIZE+1]; - double lastseen; - int tq; + if (!genlmsg_valid_hdr(nlh, 0)) + return NL_OK; - if (sscanf(line, - "%17[0-9a-fA-F:] %lfs ( %i ) %17[0-9a-fA-F:] [ %"STRINGIFY(IF_NAMESIZE)"[^]] ]", - mac1, &lastseen, &tq, mac2, ifname) != 5) - continue; + ghdr = nlmsg_data(nlh); - if (strcmp(mac1, mac2)) - continue; + if (ghdr->cmd != BATADV_CMD_GET_ORIGINATORS) + return NL_OK; - struct json_object *interface; - if (!json_object_object_get_ex(interfaces, ifname, &interface)) { - interface = json_object_new_object(); - json_object_object_add(interfaces, ifname, interface); - } + if (nla_parse(attrs, BATADV_ATTR_MAX, genlmsg_attrdata(ghdr, 0), + genlmsg_len(ghdr), batadv_netlink_policy)) + return NL_OK; - struct json_object *obj = json_object_new_object(); - json_object_object_add(obj, "tq", json_object_new_int(tq)); - struct json_object *jso = json_object_new_double(lastseen); - json_object_set_serializer(jso, json_object_double_to_json_string, "%.3f", NULL); - json_object_object_add(obj, "lastseen", jso); - json_object_object_add(interface, mac1, obj); + if (batadv_nl_missing_attrs(attrs, parse_orig_list_mandatory, + ARRAY_SIZE(parse_orig_list_mandatory))) + return NL_OK; + + if (!attrs[BATADV_ATTR_FLAG_BEST]) + return NL_OK; + + orig = nla_data(attrs[BATADV_ATTR_ORIG_ADDRESS]); + dest = nla_data(attrs[BATADV_ATTR_NEIGH_ADDRESS]); + tq = nla_get_u8(attrs[BATADV_ATTR_TQ]); + hardif = nla_get_u32(attrs[BATADV_ATTR_HARD_IFINDEX]); + lastseen = nla_get_u32(attrs[BATADV_ATTR_LAST_SEEN_MSECS]); + + if (memcmp(orig, dest, 6) != 0) + return NL_OK; + + ifname = if_indextoname(hardif, ifname_buf); + if (!ifname) + return NL_OK; + + sprintf(mac1, "%02x:%02x:%02x:%02x:%02x:%02x", + orig[0], orig[1], orig[2], orig[3], orig[4], orig[5]); + + struct json_object *obj = json_object_new_object(); + if (!obj) + return NL_OK; + + struct json_object *interface; + if (!json_object_object_get_ex(opts->interfaces, ifname, &interface)) { + interface = json_object_new_object(); + json_object_object_add(opts->interfaces, ifname, interface); } - fclose(f); - free(line); + json_object_object_add(obj, "tq", json_object_new_int(tq)); + json_object_object_add(obj, "lastseen", json_object_new_double(lastseen / 1000.)); + json_object_object_add(interface, mac1, obj); - return ifnames2addrs(interfaces); + return NL_OK; +} + +static struct json_object * get_batadv(void) { + struct neigh_netlink_opts opts = { + .query_opts = { + .err = 0, + }, + }; + int ret; + + opts.interfaces = json_object_new_object(); + if (!opts.interfaces) + return NULL; + + ret = batadv_nl_query_common("bat0", BATADV_CMD_GET_ORIGINATORS, + parse_orig_list_netlink_cb, NLM_F_DUMP, + &opts.query_opts); + if (ret < 0) { + json_object_put(opts.interfaces); + return NULL; + } + + return ifnames2addrs(opts.interfaces); } static struct json_object * get_wifi_neighbours(const char *ifname) { From 182c21eddc7eac25d2e76b05c564af45f2703a8f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 24 Sep 2016 02:05:01 +0200 Subject: [PATCH 081/126] gluon-site: convert site.conf to JSON in compile instead of install step --- package/gluon-site/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package/gluon-site/Makefile b/package/gluon-site/Makefile index a7084ad0..a0d120e8 100644 --- a/package/gluon-site/Makefile +++ b/package/gluon-site/Makefile @@ -28,12 +28,13 @@ define Build/Configure endef define Build/Compile + lua -e 'print(require("cjson").encode(assert(dofile("$(GLUONDIR)/scripts/site_config.lua"))))' > $(PKG_BUILD_DIR)/site.json $(call GluonBuildI18N,gluon-site,$(GLUON_SITEDIR)/i18n) endef define Package/gluon-site/install $(INSTALL_DIR) $(1)/lib/gluon - lua -e 'print(require("cjson").encode(assert(dofile("$(GLUONDIR)/scripts/site_config.lua"))))' > $(1)/lib/gluon/site.json + $(INSTALL_DATA) $(PKG_BUILD_DIR)/site.json $(1)/lib/gluon/ echo "$(GLUON_RELEASE)" > $(1)/lib/gluon/release $(call GluonInstallI18N,gluon-site,$(1)) From 77c649e296a8ad7da951f87b059e3fd99a464266 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 11 Dec 2016 18:03:04 +0100 Subject: [PATCH 082/126] ar71xx-generic: update support list for CPE210/510/... Fixes #975 --- ...detection-for-TP-Link-Pharos-devices.patch | 40 +++++++++++++++++ ...r-update-support-list-for-CPE210-510.patch | 45 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch create mode 100644 patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch diff --git a/patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch b/patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch new file mode 100644 index 00000000..ca7ef944 --- /dev/null +++ b/patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch @@ -0,0 +1,40 @@ +From: Matthias Schiffer +Date: Sun, 11 Dec 2016 17:54:49 +0100 +Subject: ar71xx: simplify model detection for TP-Link Pharos devices + +This also makes the detection more flexible, as it doesn't need to check +for each model explicitly. + +Signed-off-by: Matthias Schiffer + +diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh +index 5928439..4a9a730 100755 +--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh ++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh +@@ -329,24 +329,10 @@ tplink_pharos_get_model_string() { + tplink_pharos_board_detect() { + local model_string="$(tplink_pharos_get_model_string | tr -d '\r')" + local oIFS="$IFS"; IFS=":"; set -- $model_string; IFS="$oIFS" +- local model + +- case "$1" in +- 'CPE210(TP-LINK|UN|N300-2)') +- model='TP-Link CPE210' +- ;; +- 'CPE220(TP-LINK|UN|N300-2)') +- model='TP-Link CPE220' +- ;; +- 'CPE510(TP-LINK|UN|N300-5)') +- model='TP-Link CPE510' +- ;; +- 'CPE520(TP-LINK|UN|N300-5)') +- model='TP-Link CPE520' +- ;; +- esac ++ local model="${1%%\(*}" + +- [ -n "$model" ] && AR71XX_MODEL="$model v$2" ++ AR71XX_MODEL="TP-Link $model v$2" + } + + gl_inet_board_detect() { diff --git a/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch b/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch new file mode 100644 index 00000000..2949e2ee --- /dev/null +++ b/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch @@ -0,0 +1,45 @@ +From: Matthias Schiffer +Date: Sun, 11 Dec 2016 18:00:13 +0100 +Subject: firmware-utils: tplink-safeloader: update support list for CPE210/510/... + +Adds support for new EU and US variants, removes a few strings that were +never actually used and have been removed from the stock firmwares. + +Signed-off-by: Matthias Schiffer + +diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c +index 4938f74..4a38dff 100644 +--- a/tools/firmware-utils/src/tplink-safeloader.c ++++ b/tools/firmware-utils/src/tplink-safeloader.c +@@ -169,8 +169,13 @@ static const char cpe210_support_list[] = + "SupportList:\r\n" + "CPE210(TP-LINK|UN|N300-2):1.0\r\n" + "CPE210(TP-LINK|UN|N300-2):1.1\r\n" +- "CPE220(TP-LINK|UN|N300-2):1.0\r\n" +- "CPE220(TP-LINK|UN|N300-2):1.1\r\n"; ++ "CPE210(TP-LINK|US|N300-2):1.1\r\n" ++ "CPE210(TP-LINK|EU|N300-2):1.1\r\n" ++ "CPE220(TP-LINK|UN|N300-2):1.1\r\n" ++ "CPE220(TP-LINK|US|N300-2):1.1\r\n" ++ "CPE220(TP-LINK|EU|N300-2):1.1\r\n" ++ ; ++ + /** + The support list for CPE210/220/510/520 + */ +@@ -178,8 +183,13 @@ static const char cpe510_support_list[] = + "SupportList:\r\n" + "CPE510(TP-LINK|UN|N300-5):1.0\r\n" + "CPE510(TP-LINK|UN|N300-5):1.1\r\n" +- "CPE520(TP-LINK|UN|N300-5):1.0\r\n" +- "CPE520(TP-LINK|UN|N300-5):1.1\r\n"; ++ "CPE510(TP-LINK|UN|N300-5):1.1\r\n" ++ "CPE510(TP-LINK|US|N300-5):1.1\r\n" ++ "CPE510(TP-LINK|EU|N300-5):1.1\r\n" ++ "CPE520(TP-LINK|UN|N300-5):1.1\r\n" ++ "CPE520(TP-LINK|US|N300-5):1.1\r\n" ++ "CPE520(TP-LINK|EU|N300-5):1.1\r\n" ++ ; + + /** + The support list for C2600 From 5b10928ce0b4ad85185f77871f2a1bff63de41a1 Mon Sep 17 00:00:00 2001 From: Julian Labus Date: Mon, 12 Dec 2016 14:42:09 +0100 Subject: [PATCH 083/126] mvebu: add missing package uboot-envtools which is needed for sysupgrade --- targets/mvebu/profiles.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/mvebu/profiles.mk b/targets/mvebu/profiles.mk index fcf72849..6ac04fa0 100644 --- a/targets/mvebu/profiles.mk +++ b/targets/mvebu/profiles.mk @@ -4,7 +4,7 @@ $(eval $(call GluonProfile,Caiman,kmod-usb2 kmod-usb3 kmod-usb-storage kmod-i2c-core \ kmod-i2c-mv64xxx kmod-ata-core kmod-ata-mvebu-ahci kmod-rtc-armada38x \ kmod-thermal-armada kmod-gpio-button-hotplug kmod-hwmon-tmp421 kmod-leds-pca963x \ - kmod-ledtrig-usbdev kmod-mwlwifi swconfig)) + kmod-ledtrig-usbdev kmod-mwlwifi swconfig uboot-envtools)) $(eval $(call GluonProfileFactorySuffix,Caiman,-squashfs-factory,.img)) $(eval $(call GluonProfileSysupgradeSuffix,Caiman,-squashfs-sysupgrade,.tar)) $(eval $(call GluonModel,Caiman,armada-385-linksys-caiman,linksys-wrt1200ac)) From 61de5b8841c5f3a1d7d9d876a5e742492d879465 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 12 Dec 2016 15:02:45 +0100 Subject: [PATCH 084/126] mvebu: fix comment about BROKEN status --- targets/targets.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/targets.mk b/targets/targets.mk index 6b26a959..fe4d78de 100644 --- a/targets/targets.mk +++ b/targets/targets.mk @@ -10,7 +10,7 @@ $(eval $(call GluonTarget,x86,xen_domu)) ifneq ($(BROKEN),) $(eval $(call GluonTarget,ar71xx,mikrotik)) # BROKEN: no sysupgrade support -$(eval $(call GluonTarget,mvebu)) # BROKEN: No AP+IBSS support +$(eval $(call GluonTarget,mvebu)) # BROKEN: No AP+IBSS or 11s support $(eval $(call GluonTarget,ramips,mt7621)) # BROKEN: No AP+IBSS support, 11s has high packet loss $(eval $(call GluonTarget,ramips,rt305x)) # BROKEN: No AP+IBSS support $(eval $(call GluonTarget,sunxi)) # BROKEN: Untested, no sysupgrade support From ef39158ed1bc6b1b67bf6ada9fdea24767c9253a Mon Sep 17 00:00:00 2001 From: David Lutz Date: Sun, 11 Dec 2016 21:43:49 +0100 Subject: [PATCH 085/126] ar71xx-generic: add Support for TP-LINK TL-WR940N v4 --- ...add-Support-for-TP-LINK-TL-WR940N-v4.patch | 400 ++++++++++++++++++ targets/ar71xx-generic/profiles.mk | 6 +- 2 files changed, 405 insertions(+), 1 deletion(-) create mode 100644 patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch diff --git a/patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch b/patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch new file mode 100644 index 00000000..7612be88 --- /dev/null +++ b/patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch @@ -0,0 +1,400 @@ +From: David Lutz +Date: Sun, 11 Dec 2016 21:06:14 +0100 +Subject: ar71xx-generic: add Support for TP-LINK TL-WR940N v4 + +Signed-off-by: David Lutz + +diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh +index 6b0caa6..67043d4 100644 +--- a/target/linux/ar71xx/base-files/etc/diag.sh ++++ b/target/linux/ar71xx/base-files/etc/diag.sh +@@ -296,6 +296,7 @@ get_status_led() { + tl-wr703n | \ + tl-wr710n | \ + tl-wr720n-v3 | \ ++ tl-wr940n-v4 | \ + tl-wr941nd-v6) + status_led="tp-link:blue:system" + ;; +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +index 849755f..e47cbb0 100644 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +@@ -486,6 +486,7 @@ tl-wr941nd-v5) + ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" + ;; + ++tl-wr940n-v4 | \ + tl-wr941nd-v6) + ucidef_set_led_netdev "wan" "WAN" "tp-link:blue:wan" "eth0" + ucidef_set_led_switch "lan1" "LAN1" "tp-link:blue:lan1" "switch0" "0x10" +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +index 027a671..878623c 100755 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +@@ -229,6 +229,7 @@ tl-wr841n-v8 |\ + tl-wr842n-v2 |\ + tl-wr941nd-v5 |\ + tl-wr941nd-v6 |\ ++tl-wr940n-v4 |\ + wnr2000-v3 |\ + wnr2000-v4 |\ + wnr2200 |\ +diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh +index 4a9a730..6df0d8a 100755 +--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh ++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh +@@ -235,6 +235,9 @@ tplink_board_detect() { + "090100"*) + model="TP-Link TL-WA901N/ND" + ;; ++ "094000"*) ++ model="TP-Link TL-WR940N" ++ ;; + "094100"*) + if [ "$hwid" = "09410002" -a "$mid" = "00420001" ]; then + model="Rosewill RNX-N360RT" +@@ -884,6 +887,9 @@ ar71xx_board_detect() { + *"TL-WR941N/ND v6") + name="tl-wr941nd-v6" + ;; ++ *"TL-WR940N v4") ++ name="tl-wr940n-v4" ++ ;; + *"TL-WR703N v1") + name="tl-wr703n" + ;; +diff --git a/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx b/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx +index f552453..e5e4abd 100644 +--- a/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx ++++ b/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx +@@ -36,6 +36,7 @@ set_preinit_iface() { + tl-wr841n-v8 |\ + tl-wr842n-v2 |\ + tl-wr941nd-v6 |\ ++ tl-wr940n-v4 |\ + wnr2000-v3 |\ + wnr2200 |\ + wnr612-v2 |\ +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +index ee2e596..76c252c 100755 +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +@@ -373,6 +373,7 @@ platform_check_image() { + tl-wr941nd | \ + tl-wr941nd-v5 | \ + tl-wr941nd-v6 | \ ++ tl-wr940n-v4 | \ + tl-wr1041n-v2 | \ + tl-wr1043nd | \ + tl-wr1043nd-v2 | \ +diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 +index d7cbe2e..0503626 100644 +--- a/target/linux/ar71xx/config-3.18 ++++ b/target/linux/ar71xx/config-3.18 +@@ -141,6 +141,7 @@ CONFIG_ATH79_MACH_TL_WR841N_V8=y + CONFIG_ATH79_MACH_TL_WR841N_V9=y + CONFIG_ATH79_MACH_TL_WR941ND=y + CONFIG_ATH79_MACH_TL_WR941ND_V6=y ++CONFIG_ATH79_MACH_TL_WR940N_V4=y + CONFIG_ATH79_MACH_TUBE2H=y + CONFIG_ATH79_MACH_UBNT=y + CONFIG_ATH79_MACH_UBNT_UNIFIAC=y +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr940n-v4.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr940n-v4.c +new file mode 100644 +index 0000000..d693b94 +--- /dev/null ++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr940n-v4.c +@@ -0,0 +1,149 @@ ++/* ++ * TP-LINK TL-WR940N v4 board support ++ * ++ * Copyright (C) 2016 David Lutz ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 as published ++ * by the Free Software Foundation. ++ */ ++ ++#include ++#include ++ ++#include ++#include ++ ++#include "common.h" ++#include "dev-eth.h" ++#include "dev-gpio-buttons.h" ++#include "dev-leds-gpio.h" ++#include "dev-m25p80.h" ++#include "dev-wmac.h" ++#include "machtypes.h" ++ ++ ++#define TL_WR940N_V4_GPIO_LED_QSS 3 ++#define TL_WR940N_V4_GPIO_LED_WAN 14 ++#define TL_WR940N_V4_GPIO_LED_WAN_RED 15 ++#define TL_WR940N_V4_GPIO_LED_LAN4 4 ++#define TL_WR940N_V4_GPIO_LED_LAN3 18 ++#define TL_WR940N_V4_GPIO_LED_LAN2 6 ++#define TL_WR940N_V4_GPIO_LED_LAN1 8 ++#define TL_WR940N_V4_GPIO_LED_WLAN 7 ++#define TL_WR940N_V4_GPIO_LED_SYSTEM 5 ++ ++#define TL_WR940N_V4_GPIO_BTN_RESET 1 ++#define TL_WR940N_V4_GPIO_BTN_RFKILL 2 ++ ++#define TL_WR940N_V4_KEYS_POLL_INTERVAL 20 ++#define TL_WR940N_V4_KEYS_DEBOUNCE_INTERVAL (3 * TL_WR940N_V4_KEYS_POLL_INTERVAL) ++ ++ ++static struct gpio_led tl_wr940n_v4_leds_gpio[] __initdata = { ++ { ++ .name = "tp-link:blue:qss", ++ .gpio = TL_WR940N_V4_GPIO_LED_QSS, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:blue:wan", ++ .gpio = TL_WR940N_V4_GPIO_LED_WAN, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:red:wan", ++ .gpio = TL_WR940N_V4_GPIO_LED_WAN_RED, ++ .active_low = 0, ++ }, ++ { ++ .name = "tp-link:blue:lan1", ++ .gpio = TL_WR940N_V4_GPIO_LED_LAN1, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:blue:lan2", ++ .gpio = TL_WR940N_V4_GPIO_LED_LAN2, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:blue:lan3", ++ .gpio = TL_WR940N_V4_GPIO_LED_LAN3, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:blue:lan4", ++ .gpio = TL_WR940N_V4_GPIO_LED_LAN4, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:blue:wlan", ++ .gpio = TL_WR940N_V4_GPIO_LED_WLAN, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:blue:system", ++ .gpio = TL_WR940N_V4_GPIO_LED_SYSTEM, ++ .active_low = 1, ++ }, ++}; ++ ++static struct gpio_keys_button tl_wr940n_v4_gpio_keys[] __initdata = { ++ { ++ .desc = "Reset button", ++ .type = EV_KEY, ++ .code = KEY_RESTART, ++ .debounce_interval = TL_WR940N_V4_KEYS_DEBOUNCE_INTERVAL, ++ .gpio = TL_WR940N_V4_GPIO_BTN_RESET, ++ .active_low = 1, ++ }, { ++ .desc = "RFKILL button", ++ .type = EV_KEY, ++ .code = KEY_RFKILL, ++ .debounce_interval = TL_WR940N_V4_KEYS_DEBOUNCE_INTERVAL, ++ .gpio = TL_WR940N_V4_GPIO_BTN_RFKILL, ++ .active_low = 1, ++ } ++}; ++ ++ ++static const char *tl_wr940n_v4_part_probes[] = { ++ "tp-link", ++ NULL, ++}; ++ ++static struct flash_platform_data tl_wr940n_v4_flash_data = { ++ .part_probes = tl_wr940n_v4_part_probes, ++}; ++ ++ ++static void __init tl_wr940n_v4_setup(void) ++{ ++ u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00); ++ u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); ++ ++ ath79_register_m25p80(&tl_wr940n_v4_flash_data); ++ ++ ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr940n_v4_leds_gpio), ++ tl_wr940n_v4_leds_gpio); ++ ++ ath79_register_gpio_keys_polled(-1, TL_WR940N_V4_KEYS_POLL_INTERVAL, ++ ARRAY_SIZE(tl_wr940n_v4_gpio_keys), ++ tl_wr940n_v4_gpio_keys); ++ ++ ath79_register_mdio(0, 0x0); ++ ++ ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1); ++ ath79_init_mac(ath79_eth1_data.mac_addr, mac, -1); ++ ++ ath79_switch_data.phy4_mii_en = 1; ++ ++ ath79_register_eth(0); ++ ath79_register_eth(1); ++ ++ ath79_register_wmac(ee, mac); ++ ++} ++ ++MIPS_MACHINE(ATH79_MACH_TL_WR940N_V4, "TL-WR940N-v4", "TP-LINK TL-WR940N v4", ++ tl_wr940n_v4_setup); +diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile +index 6346eb9..b35c713 100644 +--- a/target/linux/ar71xx/image/Makefile ++++ b/target/linux/ar71xx/image/Makefile +@@ -650,6 +650,16 @@ define Device/tl-wr941nd-v6 + TPLINK_HWID := 0x09410006 + endef + ++define Device/tl-wr940n-v4 ++ $(Device/tplink-4mlzma) ++ BOARDNAME := TL-WR940N-v4 ++ DEVICE_PROFILE := TLWR941 ++ TPLINK_HWID := 0x09400004 ++ IMAGES += factory-us.bin factory-eu.bin ++ IMAGE/factory-us.bin := append-rootfs | mktplinkfw factory -C US ++ IMAGE/factory-eu.bin := append-rootfs | mktplinkfw factory -C EU ++endef ++ + # Chinese version (unlike European) is similar to the TL-WDR3500 + define Device/tl-wr941nd-v6-cn + $(Device/tplink-4mlzma) +@@ -657,7 +667,7 @@ define Device/tl-wr941nd-v6-cn + DEVICE_PROFILE := TLWR941 + TPLINK_HWID := 0x09410006 + endef +-TARGET_DEVICES += tl-wr941nd-v5 tl-wr941nd-v6 tl-wr941nd-v6-cn ++TARGET_DEVICES += tl-wr941nd-v5 tl-wr941nd-v6 tl-wr941nd-v6-cn tl-wr940n-v4 + + define Device/tl-wr1041n-v2 + $(Device/tplink-4mlzma) +diff --git a/target/linux/ar71xx/mikrotik/config-default b/target/linux/ar71xx/mikrotik/config-default +index 2b1fe24..75155b2 100644 +--- a/target/linux/ar71xx/mikrotik/config-default ++++ b/target/linux/ar71xx/mikrotik/config-default +@@ -94,6 +94,7 @@ CONFIG_ATH79_MACH_RBSXTLITE=y + # CONFIG_ATH79_MACH_TL_WR841N_V8 is not set + # CONFIG_ATH79_MACH_TL_WR841N_V9 is not set + # CONFIG_ATH79_MACH_TL_WR941ND is not set ++# CONFIG_ATH79_MACH_TL_WR940N_V4 is not set + # CONFIG_ATH79_MACH_TUBE2H is not set + # CONFIG_ATH79_MACH_UBNT is not set + # CONFIG_ATH79_MACH_UBNT_XM is not set +diff --git a/target/linux/ar71xx/nand/config-default b/target/linux/ar71xx/nand/config-default +index f62cf1a..802d6e0 100644 +--- a/target/linux/ar71xx/nand/config-default ++++ b/target/linux/ar71xx/nand/config-default +@@ -57,6 +57,7 @@ + # CONFIG_ATH79_MACH_TL_WR841N_V1 is not set + # CONFIG_ATH79_MACH_TL_WR841N_V8 is not set + # CONFIG_ATH79_MACH_TL_WR941ND is not set ++# CONFIG_ATH79_MACH_TL_WR940N_V4 is not set + # CONFIG_ATH79_MACH_UBNT is not set + # CONFIG_ATH79_MACH_UBNT_XM is not set + # CONFIG_ATH79_MACH_UBNT_UNIFIAC is not set +diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +index d23f0cf..b751746 100644 +--- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch ++++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +@@ -1,6 +1,6 @@ + --- a/arch/mips/ath79/machtypes.h + +++ b/arch/mips/ath79/machtypes.h +-@@ -16,22 +16,205 @@ ++@@ -16,22 +16,206 @@ + + enum ath79_mach_type { + ATH79_MACH_GENERIC = 0, +@@ -154,6 +154,7 @@ + + ATH79_MACH_TL_WR941ND, /* TP-LINK TL-WR941ND */ + + ATH79_MACH_TL_WR941ND_V5, /* TP-LINK TL-WR941ND v5 */ + + ATH79_MACH_TL_WR941ND_V6, /* TP-LINK TL-WR941ND v6 */ +++ ATH79_MACH_TL_WR940N_V4, /* TP-LINK TL-WR940N v4 */ + + ATH79_MACH_TUBE2H, /* Alfa Network Tube2H */ + + ATH79_MACH_UBNT_AIRGW, /* Ubiquiti AirGateway */ + ATH79_MACH_UBNT_AIRROUTER, /* Ubiquiti AirRouter */ +@@ -354,7 +355,7 @@ + config ATH79_MACH_PB44 + bool "Atheros PB44 reference board" + select SOC_AR71XX +-@@ -68,6 +178,967 @@ config ATH79_MACH_PB44 ++@@ -68,6 +178,976 @@ config ATH79_MACH_PB44 + Say 'Y' here if you want your kernel to support the + Atheros PB44 reference board. + +@@ -1229,6 +1230,15 @@ + + select ATH79_DEV_M25P80 + + select ATH79_DEV_WMAC + + +++config ATH79_MACH_TL_WR940N_V4 +++ bool "TP-LINK TL-WR940N v4 support" +++ select SOC_QCA956X +++ select ATH79_DEV_ETH +++ select ATH79_DEV_GPIO_BUTTONS +++ select ATH79_DEV_LEDS_GPIO +++ select ATH79_DEV_M25P80 +++ select ATH79_DEV_WMAC +++ + +config ATH79_MACH_TL_WR1041N_V2 + + bool "TP-LINK TL-WR1041N v2 support" + + select SOC_AR934X +@@ -1322,7 +1332,7 @@ + config ATH79_MACH_UBNT_XM + bool "Ubiquiti Networks XM/UniFi boards" + select SOC_AR724X +-@@ -83,6 +1154,117 @@ config ATH79_MACH_UBNT_XM ++@@ -83,6 +1163,117 @@ config ATH79_MACH_UBNT_XM + Say 'Y' here if you want your kernel to support the + Ubiquiti Networks XM (rev 1.0) board. + +@@ -1440,7 +1450,7 @@ + endmenu + + config SOC_AR71XX +-@@ -124,7 +1306,10 @@ config ATH79_DEV_DSA ++@@ -124,7 +1315,10 @@ config ATH79_DEV_DSA + config ATH79_DEV_ETH + def_bool n + +@@ -1452,7 +1462,7 @@ + def_bool n + + config ATH79_DEV_GPIO_BUTTONS +-@@ -154,6 +1339,11 @@ config ATH79_PCI_ATH9K_FIXUP ++@@ -154,6 +1348,11 @@ config ATH79_PCI_ATH9K_FIXUP + def_bool n + + config ATH79_ROUTERBOOT +@@ -1466,7 +1476,7 @@ + endif + --- a/arch/mips/ath79/Makefile + +++ b/arch/mips/ath79/Makefile +-@@ -38,9 +38,130 @@ obj-$(CONFIG_ATH79_ROUTERBOOT) += route ++@@ -38,9 +47,131 @@ obj-$(CONFIG_ATH79_ROUTERBOOT) += route + # + # Machines + # +@@ -1561,6 +1571,7 @@ + +obj-$(CONFIG_ATH79_MACH_TL_WR841N_V9) += mach-tl-wr841n-v9.o + +obj-$(CONFIG_ATH79_MACH_TL_WR941ND) += mach-tl-wr941nd.o + +obj-$(CONFIG_ATH79_MACH_TL_WR941ND_V6) += mach-tl-wr941nd-v6.o +++obj-$(CONFIG_ATH79_MACH_TL_WR940N_V4) += mach-tl-wr940n-v4.o + +obj-$(CONFIG_ATH79_MACH_TL_WR1041N_V2) += mach-tl-wr1041n-v2.o + +obj-$(CONFIG_ATH79_MACH_TL_WR1043ND) += mach-tl-wr1043nd.o + +obj-$(CONFIG_ATH79_MACH_TL_WR1043ND_V2) += mach-tl-wr1043nd-v2.o diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index 79ac78e5..85c87dfe 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -92,7 +92,7 @@ $(eval $(call GluonModel,TLWR842,tl-wr842n-v3,tp-link-tl-wr842n-nd-v3)) $(eval $(call GluonProfile,TLWR843)) $(eval $(call GluonModel,TLWR843,tl-wr843nd-v1,tp-link-tl-wr843n-nd-v1)) -# TL-WR941N/ND v2, v3, v4, v5, v6; TL-WR940N/ND v1, v2, v3 +# TL-WR941N/ND v2, v3, v4, v5, v6; TL-WR940N/ND v1, v2, v3, v4 $(eval $(call GluonProfile,TLWR941)) $(eval $(call GluonModel,TLWR941,tl-wr941nd-v2,tp-link-tl-wr941n-nd-v2)) $(eval $(call GluonModel,TLWR941,tl-wr941nd-v3,tp-link-tl-wr941n-nd-v3)) @@ -104,6 +104,10 @@ $(eval $(call GluonModelAlias,TLWR941,tp-link-tl-wr941n-nd-v4,tp-link-tl-wr940n- $(eval $(call GluonModelAlias,TLWR941,tp-link-tl-wr941n-nd-v5,tp-link-tl-wr940n-nd-v2)) $(eval $(call GluonModelAlias,TLWR941,tp-link-tl-wr941n-nd-v6,tp-link-tl-wr940n-nd-v3)) +$(eval $(call GluonProfile,TLWR940_REGION,,TLWR941)) +$(eval $(call GluonModel,TLWR940_REGION,tl-wr940n-v4,tp-link-tl-wr940n-v4)) +$(eval $(call GluonProfileFactorySuffix,TLWR940_REGION,-squashfs-factory$(if $(GLUON_REGION),-$(GLUON_REGION)),.bin)) + # TL-WR1043N/ND v1, v2, v3 $(eval $(call GluonProfile,TLWR1043)) $(eval $(call GluonModel,TLWR1043,tl-wr1043nd-v1,tp-link-tl-wr1043n-nd-v1)) From 5058d0c2f17539b45c30149f5aabc2c03071ff00 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 17 Dec 2016 03:11:41 +0100 Subject: [PATCH 086/126] docs: index: add TP-Link TL-WA801N/ND v3 to hardware list --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 0ef31113..4ff4080a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -170,7 +170,7 @@ ar71xx-generic - TL-WA701N/ND (v1, v2) - TL-WA750RE (v1) - TL-WA7510N (v1) - - TL-WA801N/ND (v1, v2) + - TL-WA801N/ND (v1, v2, v3) - TL-WA830RE (v1, v2) - TL-WA850RE (v1) - TL-WA860RE (v1) From e6c3ee64d6ac72ca3bfeb8d29173dc7da41e163f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 17 Dec 2016 03:11:04 +0100 Subject: [PATCH 087/126] docs: add release notes for Gluon v2016.2.2 --- docs/index.rst | 1 + docs/releases/v2016.2.2.rst | 78 +++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 docs/releases/v2016.2.2.rst diff --git a/docs/index.rst b/docs/index.rst index 4ff4080a..cf231241 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -64,6 +64,7 @@ Releases .. toctree:: :maxdepth: 1 + releases/v2016.2.2 releases/v2016.2.1 releases/v2016.2 releases/v2016.1.6 diff --git a/docs/releases/v2016.2.2.rst b/docs/releases/v2016.2.2.rst new file mode 100644 index 00000000..fe054f54 --- /dev/null +++ b/docs/releases/v2016.2.2.rst @@ -0,0 +1,78 @@ +Gluon 2016.2.2 +============== + +Added hardware support +~~~~~~~~~~~~~~~~~~~~~~ + +ar71xx-generic +^^^^^^^^^^^^^^ + +* TP-Link + + - CPE210/510 EU/US versions + - TL-WA801N/ND v3 + - TL-WR841ND v11 EU/US versions + +Bugfixes +~~~~~~~~ + +* Fix boot on certain QCA955x-based devices (e.g. OpenMesh OM5P AC v2) (`#965 `_) + + This issue was a regression in Gluon v2016.2.1. + +* Build: Fix git downloads from git.kernel.org on Debian Wheezy (`#919 `_) + + We've switched back from HTTPS to the git protocol for now to avoid using + the old GnuTLS version of Debian Wheezy which can't establish a HTTPS connection + with git.kernel.org anymore. + + This issue was a regression in Gluon v2016.2. + +* Fix RX filter of Ubiquiti UAP Outdoor+ (`d43147a8e03d `_) + + This issue was a regression in Gluon v2016.2. + +* Fix switched WAN/LAN interface assignment on CPE210 (`59deb2064d54 `_) + + This issue was a regression in Gluon v2016.2. + +* Significantly reduce CPU load used by signal strength LEDs (`#897 `_) + +* Fix ethernet port of the Ubiquiti UAP AC Lite (`#911 `_) + +* Build: Don't use host ``/tmp`` directory (`f9072a36411b `_) + + Fixes build when ``/tmp`` is mounted with *noexec*. + +* Fix mesh interface type respondd/alfred announcements when using VLANs over IBSS (`#941 `_) + +* Fix next-node ebtables rules without *next_node.ip4* (`9dbe9f785d2b `_) + + Gluon v2016.2 added support for using the next-node feature without specifying an IPv4 + address. Some scripts had not been adjusted, making the next-node unreliable when + no IPv4 address was specified. + +Other changes +~~~~~~~~~~~~~ + +* x86-generic and x86-64 images now have PATA and MMC support to allow using them + on various devices that were previously unsupported. + +* Clean up opkg postinst scripts up on image generation + + OpenWrt does this by default to save a little space. + +Known Issues +~~~~~~~~~~~~ + +* Default TX power on many Ubiquiti devices is too high, correct offsets are unknown (`#94 `_) + + Reducing the TX power in the Advanced Settings is recommended. + +* The MAC address of the WAN interface is modified even when Mesh-on-WAN is disabled (`#496 `_) + + This may lead to issues in environments where a fixed MAC address is expected (like VMware when promicious mode is disallowed). + +* Inconsistent respondd API (`#522 `_) + + The current API is inconsistent and will be replaced eventually. The old API will still be supported for a while. From c25a87b1fce9e092a7d6c4606bfbf999fbaadd50 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 18 Dec 2016 23:15:12 +0100 Subject: [PATCH 088/126] docs, README: Gluon v2016.2.2 --- README.md | 2 +- docs/user/getting_started.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 59b4b852..0726e8cc 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ the future development of Gluon. Please refrain from using the `master` branch for anything else but development purposes! Use the most recent release instead. You can list all relaseses by running `git branch -a` -and switch to one by running `git checkout v2016.2.1 && make update`. +and switch to one by running `git checkout v2016.2.2 && make update`. If you're using the autoupdater, do not autoupdate nodes with anything but releases. If you upgrade using random master commits the nodes *will break* eventually. diff --git a/docs/user/getting_started.rst b/docs/user/getting_started.rst index 5bb81b5a..c9df1d62 100644 --- a/docs/user/getting_started.rst +++ b/docs/user/getting_started.rst @@ -8,7 +8,7 @@ Gluon's releases are managed using `Git tags`_. If you are just getting started with Gluon we recommend to use the latest stable release of Gluon. Take a look at the `list of gluon releases`_ and notice the latest release, -e.g. *v2016.2.1*. Always get Gluon using git and don't try to download it +e.g. *v2016.2.2*. Always get Gluon using git and don't try to download it as a Zip archive as the archive will be missing version information. Please keep in mind that there is no "default Gluon" build; a site configuration @@ -43,7 +43,7 @@ Building the images ------------------- To build Gluon, first check out the repository. Replace *RELEASE* with the -version you'd like to checkout, e.g. *v2016.2.1*. +version you'd like to checkout, e.g. *v2016.2.2*. :: From 74ac0c6c7847ca61e21d30c347106adc27896374 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 19 Dec 2016 15:09:24 +0100 Subject: [PATCH 089/126] docs: add TP-Link TL-WR940N v4 to hardware list --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index cf231241..9a6ffcb7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -188,7 +188,7 @@ ar71xx-generic - TL-WR841N/ND (v3, v5, v7, v8, v9, v10, v11) - TL-WR842N/ND (v1, v2, v3) - TL-WR843N/ND (v1) - - TL-WR940N (v1, v2, v3) + - TL-WR940N (v1, v2, v3, v4) - TL-WR941ND (v2, v3, v4, v5, v6) - TL-WR1043N/ND (v1, v2, v3) - TL-WR2543N/ND (v1) From 62ac802d4acda255143c11825c70cc24d19fbede Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 20 Dec 2016 01:08:11 +0100 Subject: [PATCH 090/126] scripts/update-patches: include unabbreviated object IDs in patch files The default abbreviation length depends on factors like user configuration, git version and number of repository objects. Use unabbreviates IDs to make patch generation more reproducible. --- scripts/update-patches.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/update-patches.sh b/scripts/update-patches.sh index 62d5bf78..41ee55d5 100755 --- a/scripts/update-patches.sh +++ b/scripts/update-patches.sh @@ -16,6 +16,6 @@ for module in $GLUON_MODULES; do n=0 for commit in $(git rev-list --reverse --no-merges base..patched); do let n=n+1 - git show --pretty=format:'From: %an <%ae>%nDate: %aD%nSubject: %B' --no-renames "$commit" > "$GLUONDIR/patches/$module/$(printf '%04u' $n)-$(git show -s --pretty=format:%f "$commit").patch" + git -c core.abbrev=40 show --pretty=format:'From: %an <%ae>%nDate: %aD%nSubject: %B' --no-renames "$commit" > "$GLUONDIR/patches/$module/$(printf '%04u' $n)-$(git show -s --pretty=format:%f "$commit").patch" done done From 7dce74c0f9af63307f6d6d1285b06da711ff8816 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 20 Dec 2016 01:09:53 +0100 Subject: [PATCH 091/126] Refresh patches --- ...le-fix-host-tools-build-dependencies.patch | 2 +- ...ort-for-alternative-rc.d-directories.patch | 2 +- ...ndent-of-the-default-router-lifetime.patch | 2 +- ...s-really-empty-not-when-it-is-locked.patch | 2 +- ...-files-disable-reset-button-handling.patch | 2 +- ...fine-wmac-reset-function-for-QCA955x.patch | 2 +- .../0007-mac80211-hostapd-iw-.-update.patch | 600 +++++++++--------- ...ate-NanoStation-Loco-txpower-offsets.patch | 2 +- ...tapd-prevent-channel-switch-for-5GHz.patch | 2 +- ...ts-with-prohibited-blackholed-source.patch | 2 +- ...stallation-of-headers-for-host-build.patch | 2 +- ...malloc-instead-of-oom-kill-processes.patch | 2 +- .../0013-fix-UBNT-XM-model-detection.patch | 2 +- ...files-implemented-basic-GPIO-control.patch | 6 +- ...-pin-for-Ubiquiti-Nanostation-models.patch | 2 +- ...0016-netifd-update-to-latest-version.patch | 8 +- ...xport_bootpart-for-Xen-virtual-disks.patch | 2 +- ...port-LibreSSL-as-provider-of-openssl.patch | 2 +- ...HWREV-on-upgrades-of-TP-LINK-devices.patch | 2 +- ...a-space-on-some-TP-LINK-like-devices.patch | 2 +- ...XX_MODEL-to-match-labels-image-names.patch | 2 +- ...r71xx-build-image-for-TL-WR710N-v2.1.patch | 2 +- ...igure-compatiblity-with-POSIX-shells.patch | 4 +- ...was-only-added-in-the-latest-version.patch | 6 +- ...compile-flock-before-everything-else.patch | 2 +- ...-fall-back-to-unlocked-shell-command.patch | 2 +- ...ce-conditions-with-multiple-variants.patch | 2 +- ...ix-packed-checkout-mirroring-support.patch | 2 +- ...l-backport-spi-nor-driver-from-4.4.9.patch | 32 +- ...til-status-register-writes-are-ready.patch | 4 +- ...el-mtd-spi-nor-unlock-Winbond-flashs.patch | 2 +- ...9561-set-phy-interface-mode-and-mask.patch | 2 +- ...ion-register-bitmask-for-QCA956x-SoC.patch | 2 +- .../0034-ar71xx-update-QCA956x-support.patch | 4 +- ...or-QCA956x-ethernet.patch-into-files.patch | 2 +- ...ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch | 2 +- ...-fix-qca956x-ethernet-initialization.patch | 2 +- ...upport-for-Ubiquiti-UniFi-AP-AC-LITE.patch | 22 +- ...th0-support-for-Ubiquiti-UniFi-AP-AC.patch | 2 +- ...r71xx-Rename-unifiac-to-unifiac-lite.patch | 18 +- ...support-for-Ubiquiti-UniFi-AP-AC-PRO.patch | 18 +- ...or-custom-format-strings-for-doubles.patch | 2 +- ...tuner-support-for-UniFi-Outdoor-Plus.patch | 6 +- ...xx-Send-power-to-USB-port-on-WNR2200.patch | 2 +- ...71xx-WNR2200-fix-for-random-WLAN-MAC.patch | 2 +- ...able-control-of-all-LEDs-and-buttons.patch | 4 +- .../0047-ar71xx-add-GL-AR150-support.patch | 20 +- ...-j-for-parallel-builds-with-Make-4.2.patch | 4 +- ...ake-fix-parallel-build-with-Make-4.2.patch | 2 +- ...-IPv6-builtin-if-selected-saves-30KB.patch | 8 +- ...kages-with-multiple-PROVIDES-entries.patch | 2 +- ...mod-crypto-core-and-kmod-crypto-arc4.patch | 14 +- ...on-hexdump-for-image-build-signature.patch | 2 +- ...0054-mt76-fix-build-with-kernel-3.18.patch | 4 +- ...s-Support-LEDs-on-D-Link-DIR-860L-B1.patch | 2 +- ...s-known-to-userspace-for-DIR-860L-B1.patch | 6 +- ...LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch | 2 +- ...-support-for-TP-LINK-TL-WR842N-ND-v3.patch | 16 +- ...9-x86-generic-enable-CONFIG_SATA_VIA.patch | 2 +- ...ncy-of-install-shared-so-make-target.patch | 2 +- ...n-detection-for-D-Link-DIR-505-A1-A2.patch | 2 +- ...505-status-LED-as-ethernet-indicator.patch | 2 +- ...10-enable-LNA-for-CPE210-220-510-520.patch | 2 +- ...le-into-2-profiles-cpe210-and-cpe510.patch | 16 +- ...oader.c-Add-support-for-Archer-C2600.patch | 2 +- ...der-split-CPE210-from-CPE510-profile.patch | 4 +- ...85c21ae0ede4e15e66cbd801b9fb502531df.patch | 22 +- ...r71xx-Added-support-for-TL-WA801NDv3.patch | 14 +- ...62bc0ea4010ddbfbd738453c9db70988a57c.patch | 4 +- ...support-for-new-TP-Link-region-codes.patch | 2 +- ...ware-add-ath10k-firmware-qca988x-11s.patch | 2 +- ...re-compensation-support-patch-FS-111.patch | 4 +- ...ing-patch-until-it-is-fixed-properly.patch | 2 +- ...egion-code-for-TP-Link-TL-WA901ND-v4.patch | 2 +- ...ax-error-in-etc-uci-defaults-01_leds.patch | 2 +- ...ry-images-for-TP-Link-TL-WR841ND-v11.patch | 2 +- .../0077-x86-64-add-pata-drivers.patch | 2 +- ...78-x86-add-mmc-drivers-to-generic-64.patch | 4 +- ...gpio_get-to-return-0-or-1-on-success.patch | 2 +- ...flickering-on-devices-using-rsslieds.patch | 4 +- ...kernel-add-at803x-fix-for-sgmii-mode.patch | 2 +- ...sysupgrade-support-for-TL-WA801ND-v3.patch | 8 +- ...detection-for-TP-Link-Pharos-devices.patch | 2 +- ...r-update-support-list-for-CPE210-510.patch | 2 +- ...add-Support-for-TP-LINK-TL-WR940N-v4.patch | 24 +- ...ue.html-add-label-that-can-be-styled.patch | 2 +- ...none-provided-by-the-browser-matches.patch | 2 +- ...-non-string-or-number-keys-in-tables.patch | 2 +- ...lib-jsonc-allow-encoding-empty-lists.patch | 2 +- ...b-jsonc-Fix-memory-leak-in-stringify.patch | 2 +- ...nc-Add-ltn12-compatible-sink-factory.patch | 4 +- ...l.uci-add-add_to_set-remove_from_set.patch | 4 +- ...ency-from-luci-base-to-luci-mode-rpc.patch | 4 +- ...n-host-to-HOST_BUILD_DEPENDS-as-well.patch | 2 +- ...002-lua-cjson-add-host-build-support.patch | 2 +- .../openwrt/0003-libuecc-update-to-v7.patch | 2 +- .../openwrt/0004-fastd-update-to-v18.patch | 4 +- .../0005-node-update-to-v0.12.14.patch | 2 +- ...ur-leading-to-broken-code-with-GCC-6.patch | 2 +- ...use-shared-instead-of-static-library.patch | 4 +- .../0001-alfred-adjust-intervals.patch | 2 +- ...-adv-introduce-no_rebroadcast-option.patch | 4 +- ...n-adv-decrease-maximum-fragment-size.patch | 2 +- 103 files changed, 533 insertions(+), 533 deletions(-) diff --git a/patches/openwrt/0001-tools-Makefile-fix-host-tools-build-dependencies.patch b/patches/openwrt/0001-tools-Makefile-fix-host-tools-build-dependencies.patch index 0db0eda7..e86fba90 100644 --- a/patches/openwrt/0001-tools-Makefile-fix-host-tools-build-dependencies.patch +++ b/patches/openwrt/0001-tools-Makefile-fix-host-tools-build-dependencies.patch @@ -3,7 +3,7 @@ Date: Sat, 26 Jul 2014 06:10:23 +0200 Subject: tools/Makefile: fix host tools build dependencies diff --git a/tools/Makefile b/tools/Makefile -index d2fe2ff..c6cded8 100644 +index d2fe2ffddf4b7207a937ca75efe1c2728e8067aa..c6cded8eccd81c422f99e7ee50754c4bc66decc7 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -95,10 +95,16 @@ define PrepareStaging diff --git a/patches/openwrt/0002-procd-add-support-for-alternative-rc.d-directories.patch b/patches/openwrt/0002-procd-add-support-for-alternative-rc.d-directories.patch index ced85fed..db29794d 100644 --- a/patches/openwrt/0002-procd-add-support-for-alternative-rc.d-directories.patch +++ b/patches/openwrt/0002-procd-add-support-for-alternative-rc.d-directories.patch @@ -4,7 +4,7 @@ Subject: procd: add support for alternative rc.d directories diff --git a/package/system/procd/patches/0001-Add-support-for-alternative-rc.d-directories.patch b/package/system/procd/patches/0001-Add-support-for-alternative-rc.d-directories.patch new file mode 100644 -index 0000000..bc24342 +index 0000000000000000000000000000000000000000..bc2434200364b46f1db4c2eec22c4e8b973844d5 --- /dev/null +++ b/package/system/procd/patches/0001-Add-support-for-alternative-rc.d-directories.patch @@ -0,0 +1,97 @@ diff --git a/patches/openwrt/0003-odhcp6c-always-accept-RDNSS-independent-of-the-default-router-lifetime.patch b/patches/openwrt/0003-odhcp6c-always-accept-RDNSS-independent-of-the-default-router-lifetime.patch index 82de5300..50efa243 100644 --- a/patches/openwrt/0003-odhcp6c-always-accept-RDNSS-independent-of-the-default-router-lifetime.patch +++ b/patches/openwrt/0003-odhcp6c-always-accept-RDNSS-independent-of-the-default-router-lifetime.patch @@ -4,7 +4,7 @@ Subject: odhcp6c: always accept RDNSS, independent of the default router lifetim diff --git a/package/network/ipv6/odhcp6c/patches/001-always_accept_rdnss.patch b/package/network/ipv6/odhcp6c/patches/001-always_accept_rdnss.patch new file mode 100644 -index 0000000..cb694ca +index 0000000000000000000000000000000000000000..cb694cadf4df4b487b3a4035eacca9c6a7798ecb --- /dev/null +++ b/package/network/ipv6/odhcp6c/patches/001-always_accept_rdnss.patch @@ -0,0 +1,21 @@ diff --git a/patches/openwrt/0004-busybox-enable-telnet-only-when-root-password-is-really-empty-not-when-it-is-locked.patch b/patches/openwrt/0004-busybox-enable-telnet-only-when-root-password-is-really-empty-not-when-it-is-locked.patch index 772ade62..74e6ad36 100644 --- a/patches/openwrt/0004-busybox-enable-telnet-only-when-root-password-is-really-empty-not-when-it-is-locked.patch +++ b/patches/openwrt/0004-busybox-enable-telnet-only-when-root-password-is-really-empty-not-when-it-is-locked.patch @@ -3,7 +3,7 @@ Date: Fri, 5 Dec 2014 18:57:16 +0100 Subject: busybox: enable telnet only when root password is really empty, not when it is locked diff --git a/package/utils/busybox/files/telnet b/package/utils/busybox/files/telnet -index a1d1cdf..f95be90 100755 +index a1d1cdf9b18d69895e7a08a8b1318f1ff591ea07..f95be90490597f6251d8c3e1247b522dfd9e72c0 100755 --- a/package/utils/busybox/files/telnet +++ b/package/utils/busybox/files/telnet @@ -11,7 +11,7 @@ has_root_pwd() { diff --git a/patches/openwrt/0005-base-files-disable-reset-button-handling.patch b/patches/openwrt/0005-base-files-disable-reset-button-handling.patch index a889df96..3d990893 100644 --- a/patches/openwrt/0005-base-files-disable-reset-button-handling.patch +++ b/patches/openwrt/0005-base-files-disable-reset-button-handling.patch @@ -6,7 +6,7 @@ This conflicts with our reset button usage. diff --git a/package/base-files/files/etc/rc.button/reset b/package/base-files/files/etc/rc.button/reset deleted file mode 100755 -index 3e24146..0000000 +index 3e241460efbb08abaa775c1a7843b5fa3e237d44..0000000000000000000000000000000000000000 --- a/package/base-files/files/etc/rc.button/reset +++ /dev/null @@ -1,20 +0,0 @@ diff --git a/patches/openwrt/0006-ar71xx-define-wmac-reset-function-for-QCA955x.patch b/patches/openwrt/0006-ar71xx-define-wmac-reset-function-for-QCA955x.patch index 81d95a9a..dfc85491 100644 --- a/patches/openwrt/0006-ar71xx-define-wmac-reset-function-for-QCA955x.patch +++ b/patches/openwrt/0006-ar71xx-define-wmac-reset-function-for-QCA955x.patch @@ -8,7 +8,7 @@ Backport of LEDE a176168a85477caa44eef7e979567d1d52868fde diff --git a/target/linux/ar71xx/patches-3.18/640-MIPS-ath79-add-QCA955x-wmac-reset.patch b/target/linux/ar71xx/patches-3.18/640-MIPS-ath79-add-QCA955x-wmac-reset.patch new file mode 100644 -index 0000000..4ac5acd +index 0000000000000000000000000000000000000000..4ac5acd618748fc9ad0f091d110d2503cdc39d53 --- /dev/null +++ b/target/linux/ar71xx/patches-3.18/640-MIPS-ath79-add-QCA955x-wmac-reset.patch @@ -0,0 +1,71 @@ diff --git a/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch index 59103f84..5a47e39d 100644 --- a/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch +++ b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch @@ -18,7 +18,7 @@ LEDE 42f559ed70897a7b74dd3e6293b42e6d2e511eaa: * mt76 diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile -index b03d644..624da6a 100644 +index b03d64491a554fafb72170eaa4fae171b5599835..624da6a1ed43ea37bbb3409b3dbe4b3af01263b5 100644 --- a/package/firmware/ath10k-firmware/Makefile +++ b/package/firmware/ath10k-firmware/Makefile @@ -8,7 +8,7 @@ @@ -270,7 +270,7 @@ index b03d644..624da6a 100644 +$(eval $(call BuildPackage,ath10k-firmware-qca99x0-ct)) +$(eval $(call BuildPackage,ath10k-firmware-qca9984-ct)) diff --git a/package/firmware/linux-firmware/Makefile b/package/firmware/linux-firmware/Makefile -index 2fcd93b..ae5894c 100644 +index 2fcd93b2ef104647a61c3aa40e2cef4404b1e484..ae5894cc56ff28271dff8871d640cc213c5c0107 100644 --- a/package/firmware/linux-firmware/Makefile +++ b/package/firmware/linux-firmware/Makefile @@ -17,9 +17,9 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz @@ -286,7 +286,7 @@ index 2fcd93b..ae5894c 100644 SCAN_DEPS = *.mk diff --git a/package/firmware/linux-firmware/realtek.mk b/package/firmware/linux-firmware/realtek.mk -index 0f8b1ce..4229ca0 100644 +index 0f8b1ce75053713b25ea601fd56ad02c410861b7..4229ca0ebbaa1fe55c3e30be5769c0cc492084d6 100644 --- a/package/firmware/linux-firmware/realtek.mk +++ b/package/firmware/linux-firmware/realtek.mk @@ -43,8 +43,15 @@ endef @@ -307,7 +307,7 @@ index 0f8b1ce..4229ca0 100644 +endef +$(eval $(call BuildPackage,rtl8192su-firmware)) diff --git a/package/kernel/acx-mac80211/Makefile b/package/kernel/acx-mac80211/Makefile -index 1820e7a..8fce374 100644 +index 1820e7abb3ed5adbe74c1e9774b9c910d72d34eb..8fce374d2b99446d11e3bf56b2df014fdd9cbc9d 100644 --- a/package/kernel/acx-mac80211/Makefile +++ b/package/kernel/acx-mac80211/Makefile @@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk @@ -337,7 +337,7 @@ index 1820e7a..8fce374 100644 -I$(LINUX_DIR)/include -I$(LINUX_DIR)/include/$(LINUX_UAPI_DIR) \ diff --git a/package/kernel/acx-mac80211/patches/001-pci-mem-Fix-3.8-build.patch b/package/kernel/acx-mac80211/patches/001-pci-mem-Fix-3.8-build.patch deleted file mode 100644 -index fa4a6be..0000000 +index fa4a6be6ab09ad9515ccc9595808a093aeac7ab2..0000000000000000000000000000000000000000 --- a/package/kernel/acx-mac80211/patches/001-pci-mem-Fix-3.8-build.patch +++ /dev/null @@ -1,129 +0,0 @@ @@ -472,7 +472,7 @@ index fa4a6be..0000000 - diff --git a/package/kernel/acx-mac80211/patches/003-Fix-3.10-build.patch b/package/kernel/acx-mac80211/patches/003-Fix-3.10-build.patch deleted file mode 100644 -index c737844..0000000 +index c73784465e0729863aeba1c51a64ee8069bc99d1..0000000000000000000000000000000000000000 --- a/package/kernel/acx-mac80211/patches/003-Fix-3.10-build.patch +++ /dev/null @@ -1,31 +0,0 @@ @@ -509,7 +509,7 @@ index c737844..0000000 - } diff --git a/package/kernel/acx-mac80211/patches/004-Fix-3.14-build.patch b/package/kernel/acx-mac80211/patches/004-Fix-3.14-build.patch deleted file mode 100644 -index 847b573..0000000 +index 847b5731598caee82179813fcc9dea2d75ffdebd..0000000000000000000000000000000000000000 --- a/package/kernel/acx-mac80211/patches/004-Fix-3.14-build.patch +++ /dev/null @@ -1,22 +0,0 @@ @@ -537,7 +537,7 @@ index 847b573..0000000 - diff --git a/package/kernel/acx-mac80211/patches/300-api_sync.patch b/package/kernel/acx-mac80211/patches/300-api_sync.patch new file mode 100644 -index 0000000..94d6135 +index 0000000000000000000000000000000000000000..94d61351aaaa530cc881448679219b28ab51888c --- /dev/null +++ b/package/kernel/acx-mac80211/patches/300-api_sync.patch @@ -0,0 +1,83 @@ @@ -626,7 +626,7 @@ index 0000000..94d6135 + diff --git a/package/kernel/ath10k-ct/Makefile b/package/kernel/ath10k-ct/Makefile new file mode 100644 -index 0000000..bbff8d8 +index 0000000000000000000000000000000000000000..bbff8d8042ade849e467196056ca4ae1828dc3fe --- /dev/null +++ b/package/kernel/ath10k-ct/Makefile @@ -0,0 +1,80 @@ @@ -711,7 +711,7 @@ index 0000000..bbff8d8 + +$(eval $(call KernelPackage,ath10k-ct)) diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile -index 30da1cf..f2839cd 100644 +index 30da1cfe250fd9cd630bf04e0c68cd7382355a2a..f2839cde2b1514f4342989b72e0baf1d79fddab2 100644 --- a/package/kernel/mac80211/Makefile +++ b/package/kernel/mac80211/Makefile @@ -10,20 +10,21 @@ include $(INCLUDE_DIR)/kernel.mk @@ -991,7 +991,7 @@ index 30da1cf..f2839cd 100644 $(eval $(call KernelPackage,ath10k)) $(eval $(call KernelPackage,ath5k)) diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh -index fb2f928..e3d612e 100644 +index fb2f928751a8c7dd282022d64be784cfcca4663b..e3d612e4b2f3d6dc1345bf71311fd31ee3649f1e 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -23,6 +23,7 @@ drv_mac80211_init_device_config() { @@ -1120,7 +1120,7 @@ index fb2f928..e3d612e 100644 done } diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh -index ea229d6..06f3b8b 100644 +index ea229d6c03393d4673c733c99ead4c24ff92817d..06f3b8b449fbf482d42123fd3d21f8c5b0d315bf 100644 --- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh +++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh @@ -9,11 +9,10 @@ lookup_phy() { @@ -1151,7 +1151,7 @@ index ea229d6..06f3b8b 100644 dev_id=" option macaddr $(cat /sys/class/ieee80211/${dev}/macaddress)" diff --git a/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch b/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch deleted file mode 100644 -index 9adfd8f..0000000 +index 9adfd8f719805961fb06d4fc3bc104b668e4fd41..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch +++ /dev/null @@ -1,21 +0,0 @@ @@ -1178,7 +1178,7 @@ index 9adfd8f..0000000 - #endif /* __BACKPORT_SKBUFF_H */ diff --git a/package/kernel/mac80211/patches/004-fix_duplicate_skcipher_backport.patch b/package/kernel/mac80211/patches/004-fix_duplicate_skcipher_backport.patch new file mode 100644 -index 0000000..38b3179 +index 0000000000000000000000000000000000000000..38b31795a4ee0f3c5f0ad4895554117a63c2f037 --- /dev/null +++ b/package/kernel/mac80211/patches/004-fix_duplicate_skcipher_backport.patch @@ -0,0 +1,11 @@ @@ -1195,7 +1195,7 @@ index 0000000..38b3179 + cordic-objs += lib-cordic.o diff --git a/package/kernel/mac80211/patches/005-backport_skb_get_hash_perturb.patch b/package/kernel/mac80211/patches/005-backport_skb_get_hash_perturb.patch new file mode 100644 -index 0000000..29bccc1 +index 0000000000000000000000000000000000000000..29bccc1e995f910ff6d1aeaf0829e9bdfe4f72d7 --- /dev/null +++ b/package/kernel/mac80211/patches/005-backport_skb_get_hash_perturb.patch @@ -0,0 +1,22 @@ @@ -1223,7 +1223,7 @@ index 0000000..29bccc1 + #endif /* __BACKPORT_SKBUFF_H */ diff --git a/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch b/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch deleted file mode 100644 -index 9b672a8..0000000 +index 9b672a8d14ec4e27c7d14bd6018059520ae8296c..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch +++ /dev/null @@ -1,20 +0,0 @@ @@ -1248,7 +1248,7 @@ index 9b672a8..0000000 - * Complicated way of saying: We only backport netdev_rss_key stuff on kernels - * that either already have net_get_random_once() (>= 3.13) or where we've been diff --git a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch -index fd1e1cf..8be5fa1 100644 +index fd1e1cff3020078b5529982d5868ec65b8b4c9da..8be5fa15e92b747bfeedb3360b62cb139ae5257a 100644 --- a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch +++ b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch @@ -1,6 +1,6 @@ @@ -1278,7 +1278,7 @@ index fd1e1cf..8be5fa1 100644 hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */ diff --git a/package/kernel/mac80211/patches/080-disable_clk_backport.patch b/package/kernel/mac80211/patches/080-disable_clk_backport.patch deleted file mode 100644 -index 3765591..0000000 +index 3765591ebb8c5863e552417c3fb36275c711b118..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/080-disable_clk_backport.patch +++ /dev/null @@ -1,20 +0,0 @@ @@ -1303,7 +1303,7 @@ index 3765591..0000000 --EXPORT_SYMBOL_GPL(clk_disable); --#endif diff --git a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch -index 02f46c7..fbe22e5 100644 +index 02f46c778d8cd704b96af062ea73c2cffbf2c19a..fbe22e51b71eb513e3612d021b7c8ab62415d583 100644 --- a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch +++ b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch @@ -309,7 +309,7 @@ @@ -1361,7 +1361,7 @@ index 02f46c7..fbe22e5 100644 u8 b_0[AES_BLOCK_SIZE]; /* hardware didn't decrypt/verify MIC */ diff --git a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch -index d1d9fbd..3ca166f 100644 +index d1d9fbd9b157c5b888797ab650db04064dfa7d31..3ca166ff45552c1c544e301fd2833b06ffd9f8a1 100644 --- a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch +++ b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch @@ -2,7 +2,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects @@ -1374,7 +1374,7 @@ index d1d9fbd..3ca166f 100644 __sta_info_flush(sdata, true); diff --git a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch -index 2855a88..16fab84 100644 +index 2855a88af7b4017f8dfeebeb34ea430a0ad51914..16fab845356343480dd706bfe558a08420a6be90 100644 --- a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch +++ b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch @@ -18,9 +18,9 @@ @@ -1411,7 +1411,7 @@ index 2855a88..16fab84 100644 tasklet_kill(&local->tasklet); diff --git a/package/kernel/mac80211/patches/210-ap_scan.patch b/package/kernel/mac80211/patches/210-ap_scan.patch -index a99cbd2..29f05c4 100644 +index a99cbd2bee913d292310e258c15c94050e90db71..29f05c44d6e205fe0a7f20009899f1de690ada5a 100644 --- a/package/kernel/mac80211/patches/210-ap_scan.patch +++ b/package/kernel/mac80211/patches/210-ap_scan.patch @@ -1,6 +1,6 @@ @@ -1424,7 +1424,7 @@ index a99cbd2..29f05c4 100644 */ diff --git a/package/kernel/mac80211/patches/220-fq_disable_hack.patch b/package/kernel/mac80211/patches/220-fq_disable_hack.patch new file mode 100644 -index 0000000..7f420be +index 0000000000000000000000000000000000000000..7f420beea56335d5043de6fd71b5febae3e9bd79 --- /dev/null +++ b/package/kernel/mac80211/patches/220-fq_disable_hack.patch @@ -0,0 +1,15 @@ @@ -1444,7 +1444,7 @@ index 0000000..7f420be + idx = reciprocal_scale(hash, fq->flows_cnt); + flow = &fq->flows[idx]; diff --git a/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch b/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch -index bddb15a..098bda7 100644 +index bddb15ad1a6bbcfcd0903c8b063c8289e5b6c43f..098bda7e93aa4453aa282eb170b2bc502bc85edd 100644 --- a/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch +++ b/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch @@ -3,15 +3,16 @@ Date: Sun, 7 Jun 2015 13:53:35 +0200 @@ -1483,7 +1483,7 @@ index bddb15a..098bda7 100644 } diff --git a/package/kernel/mac80211/patches/302-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch b/package/kernel/mac80211/patches/302-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch new file mode 100644 -index 0000000..7caa9be +index 0000000000000000000000000000000000000000..7caa9be5a8b963b6199bf1a29cc370899d30b291 --- /dev/null +++ b/package/kernel/mac80211/patches/302-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch @@ -0,0 +1,37 @@ @@ -1526,7 +1526,7 @@ index 0000000..7caa9be + void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test) diff --git a/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch b/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch deleted file mode 100644 -index 22b987a..0000000 +index 22b987aa7aaae92f889adc938ca88042d3edfdf6..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch +++ /dev/null @@ -1,95 +0,0 @@ @@ -1627,7 +1627,7 @@ index 22b987a..0000000 - {0x00009800, 0xafe68e30}, diff --git a/package/kernel/mac80211/patches/303-ath10k-Ensure-txrx-compl-task-is-stopped-when-cleani.patch b/package/kernel/mac80211/patches/303-ath10k-Ensure-txrx-compl-task-is-stopped-when-cleani.patch new file mode 100644 -index 0000000..73accd8 +index 0000000000000000000000000000000000000000..73accd866b91e84bfc42684daa3804b0a3bbc563 --- /dev/null +++ b/package/kernel/mac80211/patches/303-ath10k-Ensure-txrx-compl-task-is-stopped-when-cleani.patch @@ -0,0 +1,21 @@ @@ -1654,7 +1654,7 @@ index 0000000..73accd8 + diff --git a/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch b/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch deleted file mode 100644 -index 7bb7435..0000000 +index 7bb74353eb128442bf26bc098d62a89c32cfc9d4..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch +++ /dev/null @@ -1,156 +0,0 @@ @@ -1816,7 +1816,7 @@ index 7bb7435..0000000 - rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST, diff --git a/package/kernel/mac80211/patches/304-ath10k-Ensure-peer_map-references-are-cleaned-up.patch b/package/kernel/mac80211/patches/304-ath10k-Ensure-peer_map-references-are-cleaned-up.patch new file mode 100644 -index 0000000..7dec1fb +index 0000000000000000000000000000000000000000..7dec1fb55ab64fed606c9162d39f90902a20d4e0 --- /dev/null +++ b/package/kernel/mac80211/patches/304-ath10k-Ensure-peer_map-references-are-cleaned-up.patch @@ -0,0 +1,60 @@ @@ -1882,7 +1882,7 @@ index 0000000..7dec1fb + ar->num_peers = 0; diff --git a/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch b/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch deleted file mode 100644 -index 049059a..0000000 +index 049059aa24b50e71636336e3928bc66e64c39ae1..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch +++ /dev/null @@ -1,32 +0,0 @@ @@ -1920,7 +1920,7 @@ index 049059a..0000000 - EXPORT_SYMBOL(ath9k_hw_ani_monitor); diff --git a/package/kernel/mac80211/patches/305-ath10k-Clean-up-peer-when-sta-goes-away.patch b/package/kernel/mac80211/patches/305-ath10k-Clean-up-peer-when-sta-goes-away.patch new file mode 100644 -index 0000000..7248a8c +index 0000000000000000000000000000000000000000..7248a8cecf6b0798d354aa3fd44386f2e1f1b52d --- /dev/null +++ b/package/kernel/mac80211/patches/305-ath10k-Clean-up-peer-when-sta-goes-away.patch @@ -0,0 +1,32 @@ @@ -1958,7 +1958,7 @@ index 0000000..7248a8c + spin_unlock_bh(&ar->data_lock); diff --git a/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch b/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch deleted file mode 100644 -index a1ac67c..0000000 +index a1ac67c828deb429af4ba4db0e8c18e87a3e12b6..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch +++ /dev/null @@ -1,91 +0,0 @@ @@ -2055,7 +2055,7 @@ index a1ac67c..0000000 - diff --git a/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch b/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch deleted file mode 100644 -index cf8194a..0000000 +index cf8194aa334c7b85e26404ec3a104dff5431d4e9..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch +++ /dev/null @@ -1,31 +0,0 @@ @@ -2092,7 +2092,7 @@ index cf8194a..0000000 - return true; diff --git a/package/kernel/mac80211/patches/306-mac80211-add-hdrlen-to-ieee80211_tx_data.patch b/package/kernel/mac80211/patches/306-mac80211-add-hdrlen-to-ieee80211_tx_data.patch new file mode 100644 -index 0000000..4a8f143 +index 0000000000000000000000000000000000000000..4a8f14394640020ae7b32aa3e295cfb9494896df --- /dev/null +++ b/package/kernel/mac80211/patches/306-mac80211-add-hdrlen-to-ieee80211_tx_data.patch @@ -0,0 +1,203 @@ @@ -2301,7 +2301,7 @@ index 0000000..4a8f143 + diff --git a/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch b/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch deleted file mode 100644 -index 80b781c..0000000 +index 80b781ca54dc8c217ffe5fa304bf2bc515cf1c90..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch +++ /dev/null @@ -1,27 +0,0 @@ @@ -2334,7 +2334,7 @@ index 80b781c..0000000 - AR9300_PAPRD_SCALE_1); diff --git a/package/kernel/mac80211/patches/307-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch b/package/kernel/mac80211/patches/307-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch new file mode 100644 -index 0000000..eeb881e +index 0000000000000000000000000000000000000000..eeb881e03064fc7b0fdbcb5dbb5ffc2600c9754e --- /dev/null +++ b/package/kernel/mac80211/patches/307-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch @@ -0,0 +1,235 @@ @@ -2575,7 +2575,7 @@ index 0000000..eeb881e + key_len, key_idx); diff --git a/package/kernel/mac80211/patches/308-ath10k-Fix-sending-NULL-Qos-NULL-data-frames-for-QCA.patch b/package/kernel/mac80211/patches/308-ath10k-Fix-sending-NULL-Qos-NULL-data-frames-for-QCA.patch new file mode 100644 -index 0000000..8590aad +index 0000000000000000000000000000000000000000..8590aadabe8d622a9691e13c17af23bd5d91886c --- /dev/null +++ b/package/kernel/mac80211/patches/308-ath10k-Fix-sending-NULL-Qos-NULL-data-frames-for-QCA.patch @@ -0,0 +1,72 @@ @@ -2653,7 +2653,7 @@ index 0000000..8590aad + ar->running_fw->fw_file.fw_features)) diff --git a/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch b/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch deleted file mode 100644 -index d408866..0000000 +index d4088664bf68166ecf5c25a9ac727578805da176..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch +++ /dev/null @@ -1,65 +0,0 @@ @@ -2724,7 +2724,7 @@ index d408866..0000000 - diff --git a/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch b/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch deleted file mode 100644 -index d9511c8..0000000 +index d9511c8d5f5c8051bf2ed9c1cd408911c0ba02d9..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch +++ /dev/null @@ -1,19 +0,0 @@ @@ -2749,7 +2749,7 @@ index d9511c8..0000000 - #include "core.h" diff --git a/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch b/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch deleted file mode 100644 -index 711e019..0000000 +index 711e019e2b6836c6907a614fc3a3b1c17693f2cf..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch +++ /dev/null @@ -1,118 +0,0 @@ @@ -2873,7 +2873,7 @@ index 711e019..0000000 - #ifdef CONFIG_PM_SLEEP diff --git a/package/kernel/mac80211/patches/309-cfg80211-fix-proto-in-ieee80211_data_to_8023-for-fra.patch b/package/kernel/mac80211/patches/309-cfg80211-fix-proto-in-ieee80211_data_to_8023-for-fra.patch new file mode 100644 -index 0000000..41c27ca +index 0000000000000000000000000000000000000000..41c27cac4129547e1e6df0f4ed96d61279c13a44 --- /dev/null +++ b/package/kernel/mac80211/patches/309-cfg80211-fix-proto-in-ieee80211_data_to_8023-for-fra.patch @@ -0,0 +1,37 @@ @@ -2916,7 +2916,7 @@ index 0000000..41c27ca + diff --git a/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch b/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch deleted file mode 100644 -index 287d6e1..0000000 +index 287d6e13bd4a1dd4132cc2020a626e6bc60083fd..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch +++ /dev/null @@ -1,38 +0,0 @@ @@ -2960,7 +2960,7 @@ index 287d6e1..0000000 - return -EINVAL; diff --git a/package/kernel/mac80211/patches/310-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch b/package/kernel/mac80211/patches/310-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch new file mode 100644 -index 0000000..25929c9 +index 0000000000000000000000000000000000000000..25929c98136c33e4e18be47c1a4c1f8c756220ba --- /dev/null +++ b/package/kernel/mac80211/patches/310-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch @@ -0,0 +1,81 @@ @@ -3047,7 +3047,7 @@ index 0000000..25929c9 + } diff --git a/package/kernel/mac80211/patches/311-ath10k-disable-wake_tx_queue-for-older-devices.patch b/package/kernel/mac80211/patches/311-ath10k-disable-wake_tx_queue-for-older-devices.patch new file mode 100644 -index 0000000..4cf26a6 +index 0000000000000000000000000000000000000000..4cf26a631f4404b7b3a0c18ab8186203f405a50a --- /dev/null +++ b/package/kernel/mac80211/patches/311-ath10k-disable-wake_tx_queue-for-older-devices.patch @@ -0,0 +1,73 @@ @@ -3126,7 +3126,7 @@ index 0000000..4cf26a6 + if (ret) { diff --git a/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch b/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch deleted file mode 100644 -index 070efa9..0000000 +index 070efa98e834e0dfe2334fc0eb9bc433e0f037e8..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch +++ /dev/null @@ -1,55 +0,0 @@ @@ -3187,7 +3187,7 @@ index 070efa9..0000000 - #ifdef CPTCFG_ATH9K_CHANNEL_CONTEXT diff --git a/package/kernel/mac80211/patches/312-ath9k-Correct-TSF-adjustment-to-align-the-beacon-tim.patch b/package/kernel/mac80211/patches/312-ath9k-Correct-TSF-adjustment-to-align-the-beacon-tim.patch new file mode 100644 -index 0000000..df43105 +index 0000000000000000000000000000000000000000..df43105cb8233828bef396d500b391731c5c580a --- /dev/null +++ b/package/kernel/mac80211/patches/312-ath9k-Correct-TSF-adjustment-to-align-the-beacon-tim.patch @@ -0,0 +1,45 @@ @@ -3238,7 +3238,7 @@ index 0000000..df43105 + bool ath9k_csa_is_finished(struct ath_softc *sc, struct ieee80211_vif *vif) diff --git a/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch b/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch deleted file mode 100644 -index 61cafc7..0000000 +index 61cafc7625a8f8df5b67558a875794f5d20dbb99..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch +++ /dev/null @@ -1,27 +0,0 @@ @@ -3271,7 +3271,7 @@ index 61cafc7..0000000 - diff --git a/package/kernel/mac80211/patches/313-ath9k-Handle-channel-context-in-get_-set_-reset_tsf.patch b/package/kernel/mac80211/patches/313-ath9k-Handle-channel-context-in-get_-set_-reset_tsf.patch new file mode 100644 -index 0000000..ef0afbe +index 0000000000000000000000000000000000000000..ef0afbea9c60f69b6a55be1ce1f2dcd4c0d43928 --- /dev/null +++ b/package/kernel/mac80211/patches/313-ath9k-Handle-channel-context-in-get_-set_-reset_tsf.patch @@ -0,0 +1,70 @@ @@ -3347,7 +3347,7 @@ index 0000000..ef0afbe + mutex_unlock(&sc->mutex); diff --git a/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch b/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch deleted file mode 100644 -index 844d43b..0000000 +index 844d43bfc7875b937d8c67aba60f1204bcb7020a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch +++ /dev/null @@ -1,57 +0,0 @@ @@ -3410,7 +3410,7 @@ index 844d43b..0000000 - return RX_DROP_MONITOR; diff --git a/package/kernel/mac80211/patches/314-ath9k-Use-tsf-offset-helper-in-ath9k_hw_reset.patch b/package/kernel/mac80211/patches/314-ath9k-Use-tsf-offset-helper-in-ath9k_hw_reset.patch new file mode 100644 -index 0000000..e725a8b +index 0000000000000000000000000000000000000000..e725a8bd6099ad12d0151b90241489f063a5196d --- /dev/null +++ b/package/kernel/mac80211/patches/314-ath9k-Use-tsf-offset-helper-in-ath9k_hw_reset.patch @@ -0,0 +1,65 @@ @@ -3481,7 +3481,7 @@ index 0000000..e725a8b + ath9k_hw_init_mfp(ah); diff --git a/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch b/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch deleted file mode 100644 -index 5b3efbd..0000000 +index 5b3efbdc5aff65de96b959fbc250f7ddde0c5459..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch +++ /dev/null @@ -1,103 +0,0 @@ @@ -3590,7 +3590,7 @@ index 5b3efbd..0000000 - } diff --git a/package/kernel/mac80211/patches/315-ath9k-Expose-tsf_adjustment-in-mac80211-tsf-getters-.patch b/package/kernel/mac80211/patches/315-ath9k-Expose-tsf_adjustment-in-mac80211-tsf-getters-.patch new file mode 100644 -index 0000000..c95ab7e +index 0000000000000000000000000000000000000000..c95ab7e644c4c932b619ae9b09a16a91347fc8da --- /dev/null +++ b/package/kernel/mac80211/patches/315-ath9k-Expose-tsf_adjustment-in-mac80211-tsf-getters-.patch @@ -0,0 +1,32 @@ @@ -3628,7 +3628,7 @@ index 0000000..c95ab7e + ath9k_hw_settsf64(sc->sc_ah, tsf); diff --git a/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch b/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch deleted file mode 100644 -index 52fecb9..0000000 +index 52fecb96b002de8ed650e2155f846cbcc9ba0900..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch +++ /dev/null @@ -1,57 +0,0 @@ @@ -3691,7 +3691,7 @@ index 52fecb9..0000000 - diff --git a/package/kernel/mac80211/patches/316-ath9k-Remove-some-defined-constants-to-decrease-verb.patch b/package/kernel/mac80211/patches/316-ath9k-Remove-some-defined-constants-to-decrease-verb.patch new file mode 100644 -index 0000000..36aaa10 +index 0000000000000000000000000000000000000000..36aaa1030ea87569202cd109bb59479cbb0b64e5 --- /dev/null +++ b/package/kernel/mac80211/patches/316-ath9k-Remove-some-defined-constants-to-decrease-verb.patch @@ -0,0 +1,137 @@ @@ -3834,7 +3834,7 @@ index 0000000..36aaa10 + * Defer update, so that connected stations can adjust diff --git a/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch b/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch deleted file mode 100644 -index e78df36..0000000 +index e78df366003ee0d1cb5402e7c0760d96c45a40d7..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch +++ /dev/null @@ -1,50 +0,0 @@ @@ -3890,7 +3890,7 @@ index e78df36..0000000 - diff --git a/package/kernel/mac80211/patches/317-ath9k-Fix-beacon-configuration-for-addition-removal-.patch b/package/kernel/mac80211/patches/317-ath9k-Fix-beacon-configuration-for-addition-removal-.patch new file mode 100644 -index 0000000..360dfbf +index 0000000000000000000000000000000000000000..360dfbfafb9b2c98e4b679aa45db5c7a2e747a3b --- /dev/null +++ b/package/kernel/mac80211/patches/317-ath9k-Fix-beacon-configuration-for-addition-removal-.patch @@ -0,0 +1,544 @@ @@ -4440,7 +4440,7 @@ index 0000000..360dfbf + if ((avp->chanctx == sc->cur_chan) && diff --git a/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch b/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch deleted file mode 100644 -index 5bf53b9..0000000 +index 5bf53b918c4936c09f65ea8a02f9ac7e93cf686a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch +++ /dev/null @@ -1,45 +0,0 @@ @@ -4491,7 +4491,7 @@ index 5bf53b9..0000000 - } diff --git a/package/kernel/mac80211/patches/318-brcmfmac-slightly-simplify-building-interface-combin.patch b/package/kernel/mac80211/patches/318-brcmfmac-slightly-simplify-building-interface-combin.patch new file mode 100644 -index 0000000..d946ecc +index 0000000000000000000000000000000000000000..d946ecce19bf4e21355cc2563a58a02575d45f77 --- /dev/null +++ b/package/kernel/mac80211/patches/318-brcmfmac-slightly-simplify-building-interface-combin.patch @@ -0,0 +1,108 @@ @@ -4605,7 +4605,7 @@ index 0000000..d946ecc + return 0; diff --git a/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch b/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch deleted file mode 100644 -index 655dc4b..0000000 +index 655dc4bfa934ca34ac108e54a93626e7d73eeb6e..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch +++ /dev/null @@ -1,35 +0,0 @@ @@ -4646,7 +4646,7 @@ index 655dc4b..0000000 - if (err) diff --git a/package/kernel/mac80211/patches/319-0001-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch b/package/kernel/mac80211/patches/319-0001-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch new file mode 100644 -index 0000000..073d012 +index 0000000000000000000000000000000000000000..073d012dea37ebfc34ffac98797c5eebc48a6c6d --- /dev/null +++ b/package/kernel/mac80211/patches/319-0001-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch @@ -0,0 +1,154 @@ @@ -4806,7 +4806,7 @@ index 0000000..073d012 + memset(p2p, 0, sizeof(*p2p)); diff --git a/package/kernel/mac80211/patches/319-0002-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch b/package/kernel/mac80211/patches/319-0002-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch new file mode 100644 -index 0000000..6d3f3c6 +index 0000000000000000000000000000000000000000..6d3f3c640cc5667adbbf828eab28995e1fc5d88c --- /dev/null +++ b/package/kernel/mac80211/patches/319-0002-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch @@ -0,0 +1,40 @@ @@ -4852,7 +4852,7 @@ index 0000000..6d3f3c6 + enum brcmf_netif_stop_reason reason, bool state); diff --git a/package/kernel/mac80211/patches/319-0003-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch b/package/kernel/mac80211/patches/319-0003-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch new file mode 100644 -index 0000000..eeda766 +index 0000000000000000000000000000000000000000..eeda76661c30388ede4fd96a340af84e7f27d3b2 --- /dev/null +++ b/package/kernel/mac80211/patches/319-0003-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch @@ -0,0 +1,33 @@ @@ -4891,7 +4891,7 @@ index 0000000..eeda766 + diff --git a/package/kernel/mac80211/patches/319-0004-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch b/package/kernel/mac80211/patches/319-0004-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch new file mode 100644 -index 0000000..3819248 +index 0000000000000000000000000000000000000000..3819248b0fe94da017e99fba61931703036ad15c --- /dev/null +++ b/package/kernel/mac80211/patches/319-0004-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch @@ -0,0 +1,27 @@ @@ -4924,7 +4924,7 @@ index 0000000..3819248 + } diff --git a/package/kernel/mac80211/patches/319-0005-brcmfmac-delete-interface-directly-in-code-that-sent.patch b/package/kernel/mac80211/patches/319-0005-brcmfmac-delete-interface-directly-in-code-that-sent.patch new file mode 100644 -index 0000000..12d7eb4 +index 0000000000000000000000000000000000000000..12d7eb48877d8f9d9e2eb64c7cfd887c3d1634ae --- /dev/null +++ b/package/kernel/mac80211/patches/319-0005-brcmfmac-delete-interface-directly-in-code-that-sent.patch @@ -0,0 +1,75 @@ @@ -5005,7 +5005,7 @@ index 0000000..12d7eb4 + if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) diff --git a/package/kernel/mac80211/patches/319-0006-brcmfmac-support-removing-AP-interfaces-with-interfa.patch b/package/kernel/mac80211/patches/319-0006-brcmfmac-support-removing-AP-interfaces-with-interfa.patch new file mode 100644 -index 0000000..2f7165e +index 0000000000000000000000000000000000000000..2f7165eade7c6ffba2b1ed23e71b66e54d6a430b --- /dev/null +++ b/package/kernel/mac80211/patches/319-0006-brcmfmac-support-removing-AP-interfaces-with-interfa.patch @@ -0,0 +1,84 @@ @@ -5095,7 +5095,7 @@ index 0000000..2f7165e + case NL80211_IFTYPE_P2P_DEVICE: diff --git a/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch b/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch deleted file mode 100644 -index b646ab3..0000000 +index b646ab36dd204205735338c394a71f3bb58bd46a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch +++ /dev/null @@ -1,186 +0,0 @@ @@ -5287,7 +5287,7 @@ index b646ab3..0000000 - int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr, diff --git a/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch b/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch new file mode 100644 -index 0000000..f8b8f86 +index 0000000000000000000000000000000000000000..f8b8f86e03ba0786ef410db31d6de2ab691430bd --- /dev/null +++ b/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch @@ -0,0 +1,871 @@ @@ -6164,7 +6164,7 @@ index 0000000..f8b8f86 + diff --git a/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch b/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch deleted file mode 100644 -index 2eeed22..0000000 +index 2eeed22af0adb5e8386f5f5e75af725bbf71ec7b..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch +++ /dev/null @@ -1,159 +0,0 @@ @@ -6329,7 +6329,7 @@ index 2eeed22..0000000 - purge: diff --git a/package/kernel/mac80211/patches/321-ath9k_hw-reset-AHB-WMAC-interface-on-AR91xx.patch b/package/kernel/mac80211/patches/321-ath9k_hw-reset-AHB-WMAC-interface-on-AR91xx.patch new file mode 100644 -index 0000000..9caa76d +index 0000000000000000000000000000000000000000..9caa76dc5d40a2fe2ce332e549bfba762a1431d5 --- /dev/null +++ b/package/kernel/mac80211/patches/321-ath9k_hw-reset-AHB-WMAC-interface-on-AR91xx.patch @@ -0,0 +1,25 @@ @@ -6360,7 +6360,7 @@ index 0000000..9caa76d + } diff --git a/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch b/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch deleted file mode 100644 -index c4155a1..0000000 +index c4155a118101fb910100de80f4ac7f6da1787a1c..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch +++ /dev/null @@ -1,155 +0,0 @@ @@ -6521,7 +6521,7 @@ index c4155a1..0000000 - rcu_read_lock(); diff --git a/package/kernel/mac80211/patches/322-ath9k_hw-issue-external-reset-for-QCA9550.patch b/package/kernel/mac80211/patches/322-ath9k_hw-issue-external-reset-for-QCA9550.patch new file mode 100644 -index 0000000..5d4e849 +index 0000000000000000000000000000000000000000..5d4e849b7fd3e0cf1510e5759c150571864b3c89 --- /dev/null +++ b/package/kernel/mac80211/patches/322-ath9k_hw-issue-external-reset-for-QCA9550.patch @@ -0,0 +1,125 @@ @@ -6652,7 +6652,7 @@ index 0000000..5d4e849 + REGWRITE_BUFFER_FLUSH(ah); diff --git a/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch b/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch deleted file mode 100644 -index e7bfb9c..0000000 +index e7bfb9c83dd406e41e523195fabd0a4611dc86b4..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch +++ /dev/null @@ -1,317 +0,0 @@ @@ -6975,7 +6975,7 @@ index e7bfb9c..0000000 - * more room than we already have in 'extra_head' diff --git a/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch b/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch deleted file mode 100644 -index 9277b2c..0000000 +index 9277b2cabcdf6a02fa285b7eef2391b7f575869a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch +++ /dev/null @@ -1,64 +0,0 @@ @@ -7045,7 +7045,7 @@ index 9277b2c..0000000 - case NL80211_CHAN_WIDTH_160: diff --git a/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch b/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch deleted file mode 100644 -index d7018da..0000000 +index d7018dab3d230ab2e342824ff5067d0a24b586a1..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch +++ /dev/null @@ -1,51 +0,0 @@ @@ -7102,7 +7102,7 @@ index d7018da..0000000 - if (val & DMP_DESC_ADDRSIZE_GT32) diff --git a/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch b/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch deleted file mode 100644 -index 045ab49..0000000 +index 045ab4953bb9a43044435baa8e242b3f4794952a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch +++ /dev/null @@ -1,28 +0,0 @@ @@ -7136,7 +7136,7 @@ index 045ab49..0000000 - /* try to obtain register address info */ diff --git a/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch b/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch deleted file mode 100644 -index 7b7ba4f..0000000 +index 7b7ba4f743b244c0d766efbce7045e00e13e27ed..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch +++ /dev/null @@ -1,43 +0,0 @@ @@ -7185,7 +7185,7 @@ index 7b7ba4f..0000000 - u32 rambase; diff --git a/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch b/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch deleted file mode 100644 -index 2af6fd9..0000000 +index 2af6fd93bc06142b459144caf49489d51f7f6304..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch +++ /dev/null @@ -1,148 +0,0 @@ @@ -7339,7 +7339,7 @@ index 2af6fd9..0000000 - goto fail; diff --git a/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch b/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch deleted file mode 100644 -index 35887fc..0000000 +index 35887fcb59219270e0aedd6c9466956f9ba318f4..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch +++ /dev/null @@ -1,38 +0,0 @@ @@ -7383,7 +7383,7 @@ index 35887fc..0000000 - BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID), diff --git a/package/kernel/mac80211/patches/323-ath9k-Fix-programming-of-minCCA-power-threshold.patch b/package/kernel/mac80211/patches/323-ath9k-Fix-programming-of-minCCA-power-threshold.patch new file mode 100644 -index 0000000..59ac29b +index 0000000000000000000000000000000000000000..59ac29b1cfd6fa5d6f6cbab595ca0da1508fd077 --- /dev/null +++ b/package/kernel/mac80211/patches/323-ath9k-Fix-programming-of-minCCA-power-threshold.patch @@ -0,0 +1,26 @@ @@ -7415,7 +7415,7 @@ index 0000000..59ac29b + ar9003_hw_thermo_cal_apply(ah); diff --git a/package/kernel/mac80211/patches/324-ath9k_hw-fix-spectral-scan-on-AR9285-and-newer.patch b/package/kernel/mac80211/patches/324-ath9k_hw-fix-spectral-scan-on-AR9285-and-newer.patch new file mode 100644 -index 0000000..b6f4868 +index 0000000000000000000000000000000000000000..b6f48680b7b1e2522c53c51834a8ec32638a3dec --- /dev/null +++ b/package/kernel/mac80211/patches/324-ath9k_hw-fix-spectral-scan-on-AR9285-and-newer.patch @@ -0,0 +1,86 @@ @@ -7507,7 +7507,7 @@ index 0000000..b6f4868 + #define AR_PHY_SEARCH_START_DELAY 0x9918 diff --git a/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch b/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch deleted file mode 100644 -index 6ce60f1..0000000 +index 6ce60f19608abcc89a27c6cebfbb90806b58a503..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch +++ /dev/null @@ -1,32 +0,0 @@ @@ -7545,7 +7545,7 @@ index 6ce60f1..0000000 - return COMMENT; diff --git a/package/kernel/mac80211/patches/325-ath9k_hw-fix-duplicate-and-partially-wrong-definitio.patch b/package/kernel/mac80211/patches/325-ath9k_hw-fix-duplicate-and-partially-wrong-definitio.patch new file mode 100644 -index 0000000..6685f33 +index 0000000000000000000000000000000000000000..6685f33989dd9c872b817b32bcd5b1ce72f13089 --- /dev/null +++ b/package/kernel/mac80211/patches/325-ath9k_hw-fix-duplicate-and-partially-wrong-definitio.patch @@ -0,0 +1,57 @@ @@ -7608,7 +7608,7 @@ index 0000000..6685f33 + (AR_SREV_9462(ah) ? 0x16290 : 0x16284)) diff --git a/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch b/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch deleted file mode 100644 -index 012dea1..0000000 +index 012dea1e3a995d0118faea99f994da117e16293d..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch +++ /dev/null @@ -1,41 +0,0 @@ @@ -7655,7 +7655,7 @@ index 012dea1..0000000 - diff --git a/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch b/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch deleted file mode 100644 -index 71f7a40..0000000 +index 71f7a4043304e4120bfb1fdfa3744a2ebd53ac54..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch +++ /dev/null @@ -1,87 +0,0 @@ @@ -7748,7 +7748,7 @@ index 71f7a40..0000000 - REG_READ(ah, AR_PHY_AGC_CONTROL)); diff --git a/package/kernel/mac80211/patches/326-ath9k_hw-simplify-ar9003_hw_per_calibration.patch b/package/kernel/mac80211/patches/326-ath9k_hw-simplify-ar9003_hw_per_calibration.patch new file mode 100644 -index 0000000..999d993 +index 0000000000000000000000000000000000000000..999d9934cd47c41a53e296915139818ba10f9643 --- /dev/null +++ b/package/kernel/mac80211/patches/326-ath9k_hw-simplify-ar9003_hw_per_calibration.patch @@ -0,0 +1,88 @@ @@ -7842,7 +7842,7 @@ index 0000000..999d993 + static int ar9003_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan, diff --git a/package/kernel/mac80211/patches/327-ath9k_hw-get-rid-of-some-duplicate-code-in-calibrati.patch b/package/kernel/mac80211/patches/327-ath9k_hw-get-rid-of-some-duplicate-code-in-calibrati.patch new file mode 100644 -index 0000000..b7f3823 +index 0000000000000000000000000000000000000000..b7f3823ee625a7e77b84c4e293dbf6ac81fc3db1 --- /dev/null +++ b/package/kernel/mac80211/patches/327-ath9k_hw-get-rid-of-some-duplicate-code-in-calibrati.patch @@ -0,0 +1,94 @@ @@ -7942,7 +7942,7 @@ index 0000000..b7f3823 + } diff --git a/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch b/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch deleted file mode 100644 -index f7f9df9..0000000 +index f7f9df946a462b5ede16dc61f49f2731ae444af6..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch +++ /dev/null @@ -1,54 +0,0 @@ @@ -8002,7 +8002,7 @@ index f7f9df9..0000000 - hash_idx = mesh_table_hash(addr, sdata, tbl); diff --git a/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch new file mode 100644 -index 0000000..cff32ad +index 0000000000000000000000000000000000000000..cff32ad47cb0b905d9cfa4eb021258b644b2a47a --- /dev/null +++ b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch @@ -0,0 +1,97 @@ @@ -8105,7 +8105,7 @@ index 0000000..cff32ad + struct ath9k_cal_list *cal_list; diff --git a/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch b/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch deleted file mode 100644 -index 740993c..0000000 +index 740993c9e0284e5d03a9036ac87fd7548b22ab3b..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch +++ /dev/null @@ -1,104 +0,0 @@ @@ -8215,7 +8215,7 @@ index 740993c..0000000 - mesh_path_del(mpath->sdata, mpath->dst); diff --git a/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch b/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch deleted file mode 100644 -index 0c36b1d..0000000 +index 0c36b1d5687447021eaa560d08b16580351b4a20..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch +++ /dev/null @@ -1,143 +0,0 @@ @@ -8364,7 +8364,7 @@ index 0c36b1d..0000000 - diff --git a/package/kernel/mac80211/patches/329-mac80211-fix-check-for-buffered-powersave-frames-wit.patch b/package/kernel/mac80211/patches/329-mac80211-fix-check-for-buffered-powersave-frames-wit.patch new file mode 100644 -index 0000000..38e541c +index 0000000000000000000000000000000000000000..38e541c7150aaf9b32eed89f8edfdf989d4677f7 --- /dev/null +++ b/package/kernel/mac80211/patches/329-mac80211-fix-check-for-buffered-powersave-frames-wit.patch @@ -0,0 +1,21 @@ @@ -8391,7 +8391,7 @@ index 0000000..38e541c + clear_bit(tid, &sta->txq_buffered_tids); diff --git a/package/kernel/mac80211/patches/330-ath10k-fix-rx-status-reporting-for-A-MSDU-subframes.patch b/package/kernel/mac80211/patches/330-ath10k-fix-rx-status-reporting-for-A-MSDU-subframes.patch new file mode 100644 -index 0000000..a6031b9 +index 0000000000000000000000000000000000000000..a6031b9c265d87656f04a7f7a639233949054818 --- /dev/null +++ b/package/kernel/mac80211/patches/330-ath10k-fix-rx-status-reporting-for-A-MSDU-subframes.patch @@ -0,0 +1,36 @@ @@ -8433,7 +8433,7 @@ index 0000000..a6031b9 + } diff --git a/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch b/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch deleted file mode 100644 -index 4dc6d66..0000000 +index 4dc6d663ed7af432b5d26338ef74732abe6aa31c..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch +++ /dev/null @@ -1,51 +0,0 @@ @@ -8490,7 +8490,7 @@ index 4dc6d66..0000000 - } diff --git a/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch b/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch deleted file mode 100644 -index 1fd016f..0000000 +index 1fd016f7f6bc9ad7bd4265e16a439b4de33b8f9c..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch +++ /dev/null @@ -1,307 +0,0 @@ @@ -8803,7 +8803,7 @@ index 1fd016f..0000000 - #else diff --git a/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch b/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch deleted file mode 100644 -index e414f23..0000000 +index e414f23784163abfeba59d9e523e3684643c038a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch +++ /dev/null @@ -1,22 +0,0 @@ @@ -8831,7 +8831,7 @@ index e414f23..0000000 - if (has_80211_header) { diff --git a/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch b/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch deleted file mode 100644 -index 6e2d0cf..0000000 +index 6e2d0cf5b0783860cb39264e33ecdef622fcc548..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch +++ /dev/null @@ -1,132 +0,0 @@ @@ -8969,7 +8969,7 @@ index 6e2d0cf..0000000 - diff --git a/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch b/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch deleted file mode 100644 -index f8f4f09..0000000 +index f8f4f0999dd2185090fdffef1d80629f15a67dd2..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch +++ /dev/null @@ -1,36 +0,0 @@ @@ -9011,7 +9011,7 @@ index f8f4f09..0000000 - diff --git a/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch b/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch deleted file mode 100644 -index acaacf7..0000000 +index acaacf7cacc3ecf380dd69794aaa6b07b5403708..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch +++ /dev/null @@ -1,61 +0,0 @@ @@ -9078,7 +9078,7 @@ index acaacf7..0000000 - } diff --git a/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch b/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch deleted file mode 100644 -index 32a2ad6..0000000 +index 32a2ad6f0bcdafc499f257b6f925aaf0499e24c0..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch +++ /dev/null @@ -1,31 +0,0 @@ @@ -9115,7 +9115,7 @@ index 32a2ad6..0000000 - static void diff --git a/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch b/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch deleted file mode 100644 -index 229351b..0000000 +index 229351ba56802ef44fae5fe5f88a3ffbb0ada098..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch +++ /dev/null @@ -1,26 +0,0 @@ @@ -9147,7 +9147,7 @@ index 229351b..0000000 - ratetbl->rate[offset].count = ratetbl->rate[offset].count_rts; diff --git a/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch b/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch deleted file mode 100644 -index 56cd94a..0000000 +index 56cd94aa152169fa4e98cd16dbf8a251dca4ca8a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch +++ /dev/null @@ -1,35 +0,0 @@ @@ -9188,7 +9188,7 @@ index 56cd94a..0000000 - } diff --git a/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch b/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch deleted file mode 100644 -index 15d6cd0..0000000 +index 15d6cd03eae1c5b2380cb718238762cbf5f5a5b6..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch +++ /dev/null @@ -1,21 +0,0 @@ @@ -9215,7 +9215,7 @@ index 15d6cd0..0000000 - */ diff --git a/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch b/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch deleted file mode 100644 -index de1b386..0000000 +index de1b38625c3845be51df0f34c2b82290651ca4be..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch +++ /dev/null @@ -1,36 +0,0 @@ @@ -9257,7 +9257,7 @@ index de1b386..0000000 - diff --git a/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch b/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch deleted file mode 100644 -index ac1f251..0000000 +index ac1f2517f29973c74cdd32301b32d1be93fcefb1..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch +++ /dev/null @@ -1,65 +0,0 @@ @@ -9328,7 +9328,7 @@ index ac1f251..0000000 - if (rate * 5 != sband->bitrates[i].bitrate) diff --git a/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch b/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch deleted file mode 100644 -index d7452c2..0000000 +index d7452c29c1fad9ee170199c33b260161b603032a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch +++ /dev/null @@ -1,23 +0,0 @@ @@ -9357,7 +9357,7 @@ index d7452c2..0000000 - local->hw.max_rate_tries); diff --git a/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch b/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch deleted file mode 100644 -index 55ff817..0000000 +index 55ff817009294fde4c61548f95a49ca506d15b4d..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch +++ /dev/null @@ -1,77 +0,0 @@ @@ -9440,7 +9440,7 @@ index 55ff817..0000000 - sample_dur >= minstrel_get_duration(mi->max_prob_rate))) { diff --git a/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch b/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch deleted file mode 100644 -index e3427de..0000000 +index e3427de732787befec7f0f738efb3cc85a00aa0d..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch +++ /dev/null @@ -1,99 +0,0 @@ @@ -9545,7 +9545,7 @@ index e3427de..0000000 - else diff --git a/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch b/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch deleted file mode 100644 -index 9c336f7..0000000 +index 9c336f774fd79a2306dae746d3622db22eee76eb..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch +++ /dev/null @@ -1,127 +0,0 @@ @@ -9678,7 +9678,7 @@ index 9c336f7..0000000 - struct completion vif_disabled; diff --git a/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch b/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch deleted file mode 100644 -index ee3d9f3..0000000 +index ee3d9f37a851cb1d31a53e341614bd7166c2e581..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch +++ /dev/null @@ -1,29 +0,0 @@ @@ -9713,7 +9713,7 @@ index ee3d9f3..0000000 - } diff --git a/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch b/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch deleted file mode 100644 -index c52cac8..0000000 +index c52cac87b979e6da07d24f2e7e119261dceea2ce..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch +++ /dev/null @@ -1,214 +0,0 @@ @@ -9933,7 +9933,7 @@ index c52cac8..0000000 - __le32 ie_length; /* byte length of Information Elements */ diff --git a/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch b/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch deleted file mode 100644 -index 3e2e350..0000000 +index 3e2e3503b629dbdd6abba44a9c9b24e4a5aea792..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch +++ /dev/null @@ -1,283 +0,0 @@ @@ -10222,7 +10222,7 @@ index 3e2e350..0000000 - diff --git a/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch b/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch deleted file mode 100644 -index 888ad5b..0000000 +index 888ad5b05059f1d6712303671a1052f1cbdcf30c..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch +++ /dev/null @@ -1,333 +0,0 @@ @@ -10561,7 +10561,7 @@ index 888ad5b..0000000 - struct brcmf_skb_reorder_data { diff --git a/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch b/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch deleted file mode 100644 -index 68de8ed..0000000 +index 68de8ed2a263a45c4d3e7c4d568801a6925b1a30..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch +++ /dev/null @@ -1,38 +0,0 @@ @@ -10605,7 +10605,7 @@ index 68de8ed..0000000 - break; diff --git a/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch b/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch deleted file mode 100644 -index 3de0f64..0000000 +index 3de0f64d560d8a64923f5227e95cbfa2cbfc72df..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch +++ /dev/null @@ -1,73 +0,0 @@ @@ -10684,7 +10684,7 @@ index 3de0f64..0000000 - goto fail; diff --git a/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch b/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch deleted file mode 100644 -index ca03ffe..0000000 +index ca03ffe4b09a5b565b9da2ce4eb13949bb3623b4..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch +++ /dev/null @@ -1,58 +0,0 @@ @@ -10748,7 +10748,7 @@ index ca03ffe..0000000 - } diff --git a/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch b/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch deleted file mode 100644 -index e4a8f30..0000000 +index e4a8f305cf5a8d9029ad5619ef8bcbc10a425ddd..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch +++ /dev/null @@ -1,34 +0,0 @@ @@ -10788,7 +10788,7 @@ index e4a8f30..0000000 - diff --git a/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch b/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch deleted file mode 100644 -index f99f6db..0000000 +index f99f6dbf07660777a50fda006c049027ef88b16d..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch +++ /dev/null @@ -1,221 +0,0 @@ @@ -11015,7 +11015,7 @@ index f99f6db..0000000 - if (err) diff --git a/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch b/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch deleted file mode 100644 -index 4adfc2d..0000000 +index 4adfc2dc644ab901dae25abcbd2e3c4845802bb5..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch +++ /dev/null @@ -1,30 +0,0 @@ @@ -11051,7 +11051,7 @@ index 4adfc2d..0000000 - #define BRCMF_RXREORDER_FLOWID_OFFSET 0 diff --git a/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch b/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch deleted file mode 100644 -index bd62781..0000000 +index bd62781188c37c339ab5eafb8434b6a5d07677bd..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch +++ /dev/null @@ -1,135 +0,0 @@ @@ -11192,7 +11192,7 @@ index bd62781..0000000 - #endif /* BRCMFMAC_CORE_H */ diff --git a/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch b/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch deleted file mode 100644 -index 577ca8e..0000000 +index 577ca8ed2837b3c480be022067e7b8389f13af01..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch +++ /dev/null @@ -1,260 +0,0 @@ @@ -11458,7 +11458,7 @@ index 577ca8e..0000000 - #endif /* FWIL_TYPES_H_ */ diff --git a/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch b/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch deleted file mode 100644 -index 2685238..0000000 +index 2685238925444a4d76cfb14d5ec85e69b9b686f1..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch +++ /dev/null @@ -1,385 +0,0 @@ @@ -11849,7 +11849,7 @@ index 2685238..0000000 - #endif /* CONFIG_OF */ diff --git a/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch b/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch deleted file mode 100644 -index 4e789cf..0000000 +index 4e789cfc5a6cfc82c584bb59bd7dd4a7a058377b..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch +++ /dev/null @@ -1,69 +0,0 @@ @@ -11924,7 +11924,7 @@ index 4e789cf..0000000 - * Quirks: diff --git a/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch b/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch deleted file mode 100644 -index 37b6855..0000000 +index 37b68552cc8ce99d021930f5fc78692a7ba92f06..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch +++ /dev/null @@ -1,734 +0,0 @@ @@ -12664,7 +12664,7 @@ index 37b6855..0000000 -+#endif /* _LINUX_BRCMFMAC_PLATFORM_H */ diff --git a/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch b/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch deleted file mode 100644 -index 34341d7..0000000 +index 34341d7f1866bde09e839f128d14a2b40e54453f..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch +++ /dev/null @@ -1,607 +0,0 @@ @@ -13277,7 +13277,7 @@ index 34341d7..0000000 - if (ret) diff --git a/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch b/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch deleted file mode 100644 -index eb680fc..0000000 +index eb680fccfc4695e3c676ed39593e57ffd60d908f..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch +++ /dev/null @@ -1,227 +0,0 @@ @@ -13510,7 +13510,7 @@ index eb680fc..0000000 - brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, diff --git a/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch b/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch deleted file mode 100644 -index c20d40c..0000000 +index c20d40c049724d71cf65170872be9e3a0c3ff21a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch +++ /dev/null @@ -1,509 +0,0 @@ @@ -14025,7 +14025,7 @@ index c20d40c..0000000 - #define DOT11_DEFAULT_FRAG_LEN 2346 diff --git a/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch b/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch deleted file mode 100644 -index 39f4383..0000000 +index 39f438321e833984ef54d3f653f95c01ed041c47..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch +++ /dev/null @@ -1,54 +0,0 @@ @@ -14085,7 +14085,7 @@ index 39f4383..0000000 - diff --git a/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch b/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch deleted file mode 100644 -index 3c9ed42..0000000 +index 3c9ed425da0cb5140149f2c220d029e792ff41b7..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch +++ /dev/null @@ -1,21 +0,0 @@ @@ -14112,7 +14112,7 @@ index 3c9ed42..0000000 - write, fn, addr, regsz); diff --git a/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch b/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch deleted file mode 100644 -index d1deb6e..0000000 +index d1deb6ee5ce73cb1a6ecc9775360c422113cd0b4..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch +++ /dev/null @@ -1,24 +0,0 @@ @@ -14142,7 +14142,7 @@ index d1deb6e..0000000 - diff --git a/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch b/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch deleted file mode 100644 -index d399b26..0000000 +index d399b264ea9d2ac0d1ba82d725707720b4c0693e..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch +++ /dev/null @@ -1,26 +0,0 @@ @@ -14174,7 +14174,7 @@ index d399b26..0000000 - sdio_claim_host(bus->sdiodev->func[1]); diff --git a/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch b/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch deleted file mode 100644 -index 0acb4fa..0000000 +index 0acb4faaf1acb27dd39d11bef81be070c556dcf0..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch +++ /dev/null @@ -1,27 +0,0 @@ @@ -14207,7 +14207,7 @@ index 0acb4fa..0000000 - brcmf_dbg(EVENT, "enable event %s\n", diff --git a/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch b/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch deleted file mode 100644 -index 8d30678..0000000 +index 8d3067890c2fe87f88547d151d3da6d7facd8ea0..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch +++ /dev/null @@ -1,27 +0,0 @@ @@ -14240,7 +14240,7 @@ index 8d30678..0000000 - brcmf_bus_wowl_config(cfg->pub->bus_if, true); diff --git a/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch b/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch deleted file mode 100644 -index f293401..0000000 +index f293401ca82d37e367600acf2676b18f6fad92ba..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch +++ /dev/null @@ -1,114 +0,0 @@ @@ -14360,7 +14360,7 @@ index f293401..0000000 - while (pad != *new_length) { diff --git a/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch b/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch deleted file mode 100644 -index ed0c83f..0000000 +index ed0c83f9bbc9a2ce4741cfbe5a5cd7fde6938c7b..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch +++ /dev/null @@ -1,29 +0,0 @@ @@ -14395,7 +14395,7 @@ index ed0c83f..0000000 - (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status) || diff --git a/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch b/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch deleted file mode 100644 -index 4d26404..0000000 +index 4d26404f51951086da093df1073a2bfd09d14349..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch +++ /dev/null @@ -1,297 +0,0 @@ @@ -14698,7 +14698,7 @@ index 4d26404..0000000 - brcmu_pkt_buf_free_skb(skb); diff --git a/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch b/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch deleted file mode 100644 -index 33b263d..0000000 +index 33b263df3aefc1b00e99860b4b9450a6ff23ad83..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch +++ /dev/null @@ -1,585 +0,0 @@ @@ -15289,7 +15289,7 @@ index 33b263d..0000000 - #endif /* BRCMFMAC_PROTO_H */ diff --git a/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch b/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch deleted file mode 100644 -index a43feff..0000000 +index a43feffe1792c44e207908c21e314bfcf0378cf1..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch +++ /dev/null @@ -1,139 +0,0 @@ @@ -15434,7 +15434,7 @@ index a43feff..0000000 - diff --git a/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch b/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch deleted file mode 100644 -index 08ea235..0000000 +index 08ea235fddc7caf06eb4b196c51765cd4adbee2f..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch +++ /dev/null @@ -1,88 +0,0 @@ @@ -15528,7 +15528,7 @@ index 08ea235..0000000 - brcmu_pkt_buf_free_skb(skb); diff --git a/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch b/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch deleted file mode 100644 -index c602f22..0000000 +index c602f2272a4a322d9e5246c517eecfc3a00e1db2..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch +++ /dev/null @@ -1,119 +0,0 @@ @@ -15653,7 +15653,7 @@ index c602f22..0000000 - void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); diff --git a/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch b/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch deleted file mode 100644 -index a79c9a2..0000000 +index a79c9a2e93732d8c4c15af55387e378afd72001a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch +++ /dev/null @@ -1,244 +0,0 @@ @@ -15903,7 +15903,7 @@ index a79c9a2..0000000 - diff --git a/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch b/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch deleted file mode 100644 -index 2c536d1..0000000 +index 2c536d178d6746aca311d6ce16421a609061a3ad..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch +++ /dev/null @@ -1,94 +0,0 @@ @@ -16003,7 +16003,7 @@ index 2c536d1..0000000 - .crit_proto_start = brcmf_cfg80211_crit_proto_start, diff --git a/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch b/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch deleted file mode 100644 -index 1b119b2..0000000 +index 1b119b2c8599e26de399c7d0174b5ef0be02067d..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch +++ /dev/null @@ -1,59 +0,0 @@ @@ -16068,7 +16068,7 @@ index 1b119b2..0000000 - } diff --git a/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch b/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch deleted file mode 100644 -index a2e18a5..0000000 +index a2e18a5fe994ed40619f5f12e936765ffeec2314..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch +++ /dev/null @@ -1,114 +0,0 @@ @@ -16188,7 +16188,7 @@ index a2e18a5..0000000 - diff --git a/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch b/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch deleted file mode 100644 -index 167e434..0000000 +index 167e4347d5ff00cf87cf352058723bd58e1468ce..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch +++ /dev/null @@ -1,60 +0,0 @@ @@ -16254,7 +16254,7 @@ index 167e434..0000000 - diff --git a/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch b/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch deleted file mode 100644 -index 28ef3a6..0000000 +index 28ef3a65fd6b28749308521bceb6d150fc42688d..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch +++ /dev/null @@ -1,103 +0,0 @@ @@ -16363,7 +16363,7 @@ index 28ef3a6..0000000 - brcmf_cfg80211_arm_vif_event(cfg, vif); diff --git a/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch b/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch deleted file mode 100644 -index 09547d8..0000000 +index 09547d8d3b5b021d920963a6280fe80a0a561a59..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch +++ /dev/null @@ -1,37 +0,0 @@ @@ -16406,7 +16406,7 @@ index 09547d8..0000000 - #define WL_BSS_INFO_MAX 2048 diff --git a/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch b/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch deleted file mode 100644 -index 461e3db..0000000 +index 461e3dba5397f7b48f00ec984d4edfd108dbbbb6..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch +++ /dev/null @@ -1,108 +0,0 @@ @@ -16520,7 +16520,7 @@ index 461e3db..0000000 - return 0; diff --git a/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch b/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch deleted file mode 100644 -index e991f32..0000000 +index e991f32327d5fdb7a796ab0f8f3059487b6ebbe1..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch +++ /dev/null @@ -1,160 +0,0 @@ @@ -16686,7 +16686,7 @@ index e991f32..0000000 - memset(p2p, 0, sizeof(*p2p)); diff --git a/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch b/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch deleted file mode 100644 -index ed65f4d..0000000 +index ed65f4dc885d936cd7776009b5b04a2376e16dc5..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch +++ /dev/null @@ -1,39 +0,0 @@ @@ -16731,7 +16731,7 @@ index ed65f4d..0000000 - enum brcmf_netif_stop_reason reason, bool state); diff --git a/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch b/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch deleted file mode 100644 -index ef35fab..0000000 +index ef35fab7d74b31ab2305ce881a4d45cba73337cc..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch +++ /dev/null @@ -1,33 +0,0 @@ @@ -16770,7 +16770,7 @@ index ef35fab..0000000 - diff --git a/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch b/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch deleted file mode 100644 -index ab9a634..0000000 +index ab9a63443738dd8979cf415cd06b62ddb1a8d2cf..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch +++ /dev/null @@ -1,27 +0,0 @@ @@ -16803,7 +16803,7 @@ index ab9a634..0000000 - } diff --git a/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch b/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch deleted file mode 100644 -index 6dd0c03..0000000 +index 6dd0c03e3dfe5c5ed3c310931040a14596de79f1..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch +++ /dev/null @@ -1,75 +0,0 @@ @@ -16884,7 +16884,7 @@ index 6dd0c03..0000000 - if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) diff --git a/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch b/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch deleted file mode 100644 -index 1929f0b..0000000 +index 1929f0b8126ed8659d642019648c4b86cc85ecb6..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch +++ /dev/null @@ -1,84 +0,0 @@ @@ -16974,7 +16974,7 @@ index 1929f0b..0000000 - case NL80211_IFTYPE_P2P_DEVICE: diff --git a/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch b/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch deleted file mode 100644 -index ae458e7..0000000 +index ae458e7a02608101799f072b4211a01d6d487f96..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch +++ /dev/null @@ -1,43 +0,0 @@ @@ -17023,7 +17023,7 @@ index ae458e7..0000000 - &join_params, sizeof(join_params)); diff --git a/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch b/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch deleted file mode 100644 -index fcafa79..0000000 +index fcafa797ef02fa53c05fb5a1dde8f550f02bf9d8..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch +++ /dev/null @@ -1,53 +0,0 @@ @@ -17082,7 +17082,7 @@ index fcafa79..0000000 - } diff --git a/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch b/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch deleted file mode 100644 -index a24c07f..0000000 +index a24c07f9731916f4bd3ff9bd3cb787d5982a1345..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch +++ /dev/null @@ -1,42 +0,0 @@ @@ -17130,7 +17130,7 @@ index a24c07f..0000000 - brcmf_err("intr register failed:%d\n", err); diff --git a/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch b/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch deleted file mode 100644 -index ba9a349..0000000 +index ba9a349f0fd1874c5b038e4cc4d7f4cf2097ae47..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch +++ /dev/null @@ -1,32 +0,0 @@ @@ -17168,7 +17168,7 @@ index ba9a349..0000000 - memcpy(skb->data, glom_skb->data, skb->len); diff --git a/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch b/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch deleted file mode 100644 -index 540b7f0..0000000 +index 540b7f08bf7c6b9c78f5b2ccfdae2a96dbaa4e6f..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch +++ /dev/null @@ -1,34 +0,0 @@ @@ -17208,7 +17208,7 @@ index 540b7f0..0000000 - diff --git a/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch b/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch deleted file mode 100644 -index b98b68a..0000000 +index b98b68a88a23b85b69092979ac92ebf1e2b1a5d2..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch +++ /dev/null @@ -1,111 +0,0 @@ @@ -17325,7 +17325,7 @@ index b98b68a..0000000 - int brcmf_p2p_scan_prep(struct wiphy *wiphy, diff --git a/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch b/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch deleted file mode 100644 -index 30ca258..0000000 +index 30ca25897d06fb2b26866255721377f5dbccfed0..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch +++ /dev/null @@ -1,175 +0,0 @@ @@ -17506,7 +17506,7 @@ index 30ca258..0000000 - }; diff --git a/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch b/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch deleted file mode 100644 -index 1a7947b..0000000 +index 1a7947b39a5eca626d2c79fecb627c52868f713b..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch +++ /dev/null @@ -1,29 +0,0 @@ @@ -17541,7 +17541,7 @@ index 1a7947b..0000000 - { diff --git a/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch b/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch deleted file mode 100644 -index 24cd92a..0000000 +index 24cd92a8bebfdffbb0e0d19b53a7c1cae4738ec1..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch +++ /dev/null @@ -1,51 +0,0 @@ @@ -17598,7 +17598,7 @@ index 24cd92a..0000000 - #define BRCM_USB_43242_LG_DEVICE_ID 0x3101 diff --git a/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch b/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch deleted file mode 100644 -index b58a266..0000000 +index b58a266a2542d44cb626ad4eef93dc56130d5900..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch +++ /dev/null @@ -1,51 +0,0 @@ @@ -17655,7 +17655,7 @@ index b58a266..0000000 - if ((npmk > 0) && (i < npmk)) { diff --git a/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch b/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch deleted file mode 100644 -index 760b6da..0000000 +index 760b6daf25ef57d3b777373b9695a909ec42b1d2..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch +++ /dev/null @@ -1,34 +0,0 @@ @@ -17695,7 +17695,7 @@ index 760b6da..0000000 - memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len); diff --git a/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch b/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch deleted file mode 100644 -index 1285b30..0000000 +index 1285b3096075e85a4c7c99592c73000244f75216..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch +++ /dev/null @@ -1,55 +0,0 @@ @@ -17756,7 +17756,7 @@ index 1285b30..0000000 - #define SDIO_DEVICE_ID_BROADCOM_4345 0x4345 diff --git a/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch b/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch deleted file mode 100644 -index 1d5667e..0000000 +index 1d5667ee6ed705db4dab6175207a9b0284167181..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch +++ /dev/null @@ -1,56 +0,0 @@ @@ -17818,7 +17818,7 @@ index 1d5667e..0000000 - wr_val, &err); diff --git a/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch b/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch deleted file mode 100644 -index 1620e00..0000000 +index 1620e0022bbe0093c658948ca0b1c70677f61984..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch +++ /dev/null @@ -1,84 +0,0 @@ @@ -17908,7 +17908,7 @@ index 1620e00..0000000 - if (err < 0) diff --git a/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch b/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch deleted file mode 100644 -index 9461164..0000000 +index 9461164523fcc05daa4873274eb7378777612338..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch +++ /dev/null @@ -1,32 +0,0 @@ @@ -17946,7 +17946,7 @@ index 9461164..0000000 - if (buf) { diff --git a/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch b/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch deleted file mode 100644 -index 2ececdf..0000000 +index 2ececdf1972d3e2769f4730bb846866d247d681f..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch +++ /dev/null @@ -1,39 +0,0 @@ @@ -17991,7 +17991,7 @@ index 2ececdf..0000000 - } diff --git a/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch b/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch deleted file mode 100644 -index 529cc8d..0000000 +index 529cc8df02771a6680f59382278f3d273f512457..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch +++ /dev/null @@ -1,28 +0,0 @@ @@ -18025,7 +18025,7 @@ index 529cc8d..0000000 - brcmf_dbg(SDIO, "addr:0x%08x\n", addr); diff --git a/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch b/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch deleted file mode 100644 -index 67af30e..0000000 +index 67af30e4fd0684d57453e43b2751ac7e853066b5..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch +++ /dev/null @@ -1,107 +0,0 @@ @@ -18138,7 +18138,7 @@ index 67af30e..0000000 - struct brcmf_fws_mac_descriptor *fws_desc; diff --git a/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch b/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch deleted file mode 100644 -index 5a08479..0000000 +index 5a0847932964cbbfec126aacc82cada1624d63f7..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch +++ /dev/null @@ -1,31 +0,0 @@ @@ -18175,7 +18175,7 @@ index 5a08479..0000000 - drvr->iflist[0] = NULL; diff --git a/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch b/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch deleted file mode 100644 -index 0b3a23e..0000000 +index 0b3a23edc0839974750b3af21298b3fa20d7fc1b..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch +++ /dev/null @@ -1,37 +0,0 @@ @@ -18218,7 +18218,7 @@ index 0b3a23e..0000000 - break; diff --git a/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch b/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch deleted file mode 100644 -index a47cb32..0000000 +index a47cb3266fe936dc8d1b30fae76cb54c8811e3e4..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch +++ /dev/null @@ -1,44 +0,0 @@ @@ -18268,7 +18268,7 @@ index a47cb32..0000000 - brcmf_bus_wowl_config(cfg->pub->bus_if, true); diff --git a/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch b/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch deleted file mode 100644 -index a652ae6..0000000 +index a652ae60b850540fb4f8996d912b0e8b6af06a9a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch +++ /dev/null @@ -1,39 +0,0 @@ @@ -18313,7 +18313,7 @@ index a652ae6..0000000 - diff --git a/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch b/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch deleted file mode 100644 -index a6fae37..0000000 +index a6fae378038dff7b672b82a21c0ed59f663473df..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch +++ /dev/null @@ -1,41 +0,0 @@ @@ -18360,7 +18360,7 @@ index a6fae37..0000000 - static s32 diff --git a/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch b/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch deleted file mode 100644 -index 47af73a..0000000 +index 47af73ad29115ab80fe22cde35c127b86db8b8f5..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch +++ /dev/null @@ -1,60 +0,0 @@ @@ -18426,7 +18426,7 @@ index 47af73a..0000000 - if (rc < 0) diff --git a/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch b/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch deleted file mode 100644 -index ca4863a..0000000 +index ca4863a19500ccc0d1f7f21b6ef032c48097aeba..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch +++ /dev/null @@ -1,38 +0,0 @@ @@ -18470,7 +18470,7 @@ index ca4863a..0000000 - } diff --git a/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch b/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch deleted file mode 100644 -index 6976359..0000000 +index 697635941b6eb28bc99c89e589b4a530107d2fa3..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch +++ /dev/null @@ -1,58 +0,0 @@ @@ -18533,7 +18533,7 @@ index 6976359..0000000 - } - diff --git a/package/kernel/mac80211/patches/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/402-ath_regd_optional.patch -index 7351353..4634283 100644 +index 735135307631290037afa6a00bab73a50fea78ba..463428371b4c96ee63b6eba1477023ff739c6129 100644 --- a/package/kernel/mac80211/patches/402-ath_regd_optional.patch +++ b/package/kernel/mac80211/patches/402-ath_regd_optional.patch @@ -8,7 +8,7 @@ @@ -18573,7 +18573,7 @@ index 7351353..4634283 100644 WLAN_VENDOR_ATH= ATH_DEBUG= diff --git a/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch b/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch -index 1a62484..f2f52f9 100644 +index 1a624849546ca40db86f27a5edc3ffe860b2280d..f2f52f93afcd9501df5170dad99905c5baef06bc 100644 --- a/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch +++ b/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch @@ -1,6 +1,6 @@ @@ -18585,7 +18585,7 @@ index 1a62484..f2f52f9 100644 { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO) }, diff --git a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch -index a7f9d9f..f21eed1 100644 +index a7f9d9f8b9706b0c2d359e09e3d3ef396764b3d3..f21eed18c3f1ff0ec43f42632bda1fd4c1236faf 100644 --- a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch +++ b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch @@ -1,6 +1,6 @@ @@ -18606,7 +18606,7 @@ index a7f9d9f..f21eed1 100644 ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy); diff --git a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch -index 5892c3e..1825d77 100644 +index 5892c3e17a65ae7eea33fd44906a6eb8cb511c70..1825d77b7f83e4a5cf5922ba6fd314a4c8704759 100644 --- a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch +++ b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch @@ -1,6 +1,6 @@ @@ -18618,7 +18618,7 @@ index 5892c3e..1825d77 100644 int error; diff --git a/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch b/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch -index 6766111..15b8d7b 100644 +index 6766111dfd3e43b2251a0248f256e97f8d5cbffa..15b8d7b86b137b9c5ba46ae5a7afc7ac5f455aaf 100644 --- a/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch +++ b/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch @@ -8,4 +8,4 @@ @@ -18628,7 +18628,7 @@ index 6766111..15b8d7b 100644 - #define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE) + #define ATH_TXMAXTRY 13 diff --git a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch -index 5ecf528..c98072b 100644 +index 5ecf528e598aff996c21b128d7fdcfecc6fa564f..c98072bac9cba922eac5031dede34116485ac435 100644 --- a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch +++ b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch @@ -1,6 +1,6 @@ @@ -18658,7 +18658,7 @@ index 5ecf528..c98072b 100644 - switch (chandef->width) { diff --git a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch -index c84d1bc..167eeff 100644 +index c84d1bc8290e673d8366e3fcf9b97e84e634726a..167eeff2d2acfd98de87a8275bd56ef1c22928cd 100644 --- a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch +++ b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch @@ -20,7 +20,7 @@ @@ -18671,7 +18671,7 @@ index c84d1bc..167eeff 100644 #endif diff --git a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch -index e151a12..c40598d 100644 +index e151a12967ccf90d2de7cfde5728803b1069591c..c40598dde63b7c91cef9040e9927274cfd0c358a 100644 --- a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch +++ b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch @@ -1,6 +1,6 @@ @@ -18793,7 +18793,7 @@ index e151a12..c40598d 100644 return result; } diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch -index 5a5e464..0b25749 100644 +index 5a5e4643f5287e1426dd63a662b1f9b75cf22c80..0b257496082bab62ac43daf232f83628888e04ed 100644 --- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch +++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch @@ -1,16 +1,16 @@ @@ -18987,7 +18987,7 @@ index 5a5e464..0b25749 100644 debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, sc, &fops_chanbw); diff --git a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch -index 7c10ea6..f656697 100644 +index 7c10ea6b0d042db76b703e12356f53bea36e90de..f656697a077a417c7993bd41880f65b7b261fc99 100644 --- a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch +++ b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch @@ -1,6 +1,6 @@ @@ -19038,7 +19038,7 @@ index 7c10ea6..f656697 100644 - void ath_fill_led_pin(struct ath_softc *sc) diff --git a/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch b/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch -index 6d62a2b..50d8a7a 100644 +index 6d62a2b1c2cdb716c9e207e219cad96075b82bac..50d8a7abae686b6b25ad561c71176b5661dbc437 100644 --- a/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch +++ b/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch @@ -1,6 +1,6 @@ @@ -19059,7 +19059,7 @@ index 6d62a2b..50d8a7a 100644 ah->disable_2ghz = pdata->disable_2ghz; ah->disable_5ghz = pdata->disable_5ghz; diff --git a/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch b/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch -index 3c5e9f5..c2d2781 100644 +index 3c5e9f5fcda6cc16bcdbfe1a757f8a5c352eed15..c2d27815592ba1e09251e1c581e634c985750c5e 100644 --- a/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch +++ b/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch @@ -1,6 +1,6 @@ @@ -19080,7 +19080,7 @@ index 3c5e9f5..c2d2781 100644 if (i == 0) { diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch -index e83c6bf..4615643 100644 +index e83c6bfbf90d18577398c50fca1fa46b46e7822c..461564350feb43410e5c702a8a67514cdfaa3961 100644 --- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch @@ -1,6 +1,6 @@ @@ -19146,7 +19146,7 @@ index e83c6bf..4615643 100644 ath9k_hw_apply_gpio_override(ah); diff --git a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch -index d7bb5a1..656ed43 100644 +index d7bb5a12ce6f4135cdb7eaa951321cec48d221b8..656ed439b9b8aebd554e91f9963c2f6521651960 100644 --- a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch +++ b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch @@ -1,6 +1,6 @@ @@ -19242,7 +19242,7 @@ index d7bb5a1..656ed43 100644 #define AR_PHY_RFBUS_GRANT_EN 0x00000001 diff --git a/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch b/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch -index 8768c5d..b9c962e 100644 +index 8768c5d89a7b38d0e0a3c07dc94bf52edb480732..b9c962e1b5d13338ab4f7ddf6f370dbffeda299a 100644 --- a/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch +++ b/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch @@ -20,9 +20,9 @@ @@ -19285,7 +19285,7 @@ index 8768c5d..b9c962e 100644 } diff --git a/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch b/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch -index 3d24ccd..b639f97 100644 +index 3d24ccda1f83daee789973c101bd650df4c1694b..b639f972d83b8966812b98c7b99f546b187001fc 100644 --- a/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch +++ b/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch @@ -1,6 +1,6 @@ @@ -19325,7 +19325,7 @@ index 3d24ccd..b639f97 100644 diff --git a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch new file mode 100644 -index 0000000..ced72c6 +index 0000000000000000000000000000000000000000..ced72c6c69fe30ebbc1c416c5e60d95dc985d6db --- /dev/null +++ b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch @@ -0,0 +1,39 @@ @@ -19370,7 +19370,7 @@ index 0000000..ced72c6 + #endif /* _LINUX_ATH9K_PLATFORM_H */ diff --git a/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch b/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch new file mode 100644 -index 0000000..5d84cf0 +index 0000000000000000000000000000000000000000..5d84cf0c423a6138b0a48305006202f00e4bbdef --- /dev/null +++ b/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch @@ -0,0 +1,29 @@ @@ -19405,7 +19405,7 @@ index 0000000..5d84cf0 + } diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch new file mode 100644 -index 0000000..de7c0ac +index 0000000000000000000000000000000000000000..de7c0ac8f034402d6cae563ee3a6b1aafa184ab0 --- /dev/null +++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch @@ -0,0 +1,234 @@ @@ -19645,7 +19645,7 @@ index 0000000..de7c0ac + /*******************/ diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch new file mode 100644 -index 0000000..b9d1883 +index 0000000000000000000000000000000000000000..b9d18834393dca078e444950c77642095a83f401 --- /dev/null +++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch @@ -0,0 +1,149 @@ @@ -19799,7 +19799,7 @@ index 0000000..b9d1883 + + #endif /* _LINUX_ATH9K_PLATFORM_H */ diff --git a/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch b/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch -index 8245909..db70a33 100644 +index 82459091fe47c8b2fb17c88ed9cef1c1b9502280..db70a334bde149dd28461161f69b4f36623a9db4 100644 --- a/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch +++ b/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch @@ -24,7 +24,7 @@ Changes since v1: @@ -19821,7 +19821,7 @@ index 8245909..db70a33 100644 return retval; diff --git a/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch b/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch -index 7abfcd1..a3b62bc 100644 +index 7abfcd16f2e68354cb990b85d75c792fe9468fcb..a3b62bcc14d62f0930e264fc61c7d7668964db88 100644 --- a/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch +++ b/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch @@ -239,7 +239,7 @@ Changes since v1: --- @@ -19843,7 +19843,7 @@ index 7abfcd1..a3b62bc 100644 offset = MAC_IVEIV_ENTRY(key->hw_key_idx); diff --git a/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch b/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch -index 02b2acf..f41a160 100644 +index 02b2acfeee4c40af3f4739362d12ca0ce7f5e587..f41a160d3f953fca0695d8dadfca589f810a24e6 100644 --- a/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch +++ b/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch @@ -41,7 +41,7 @@ Signed-off-by: Gabor Juhos @@ -19856,7 +19856,7 @@ index 02b2acf..f41a160 100644 __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); diff --git a/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch b/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch -index e909272..5099c64 100644 +index e90927271090fafef5f2e1b33be1a43f2a0eeba8..5099c64492e4f1c6f96657d4c738f094a919d7fc 100644 --- a/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch +++ b/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos @@ -19869,7 +19869,7 @@ index e909272..5099c64 100644 __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); diff --git a/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch b/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch -index 7fe38e0..a2e7015 100644 +index 7fe38e0958a170f6f127fedc3764a0df87163180..a2e701527b99a4e9f1f8beb3a0fffd48d07c0bef 100644 --- a/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos @@ -19882,7 +19882,7 @@ index 7fe38e0..a2e7015 100644 case RT3572: case RT3593: diff --git a/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch b/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch -index 253a0c0..89bd0ac 100644 +index 253a0c0c1e67def822917c469a41bea3b2d0c862..89bd0acb87a0599962efd1d82a61512d45890b4c 100644 --- a/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch +++ b/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch @@ -98,7 +98,7 @@ Signed-off-by: Gabor Juhos @@ -19895,7 +19895,7 @@ index 253a0c0..89bd0ac 100644 break; diff --git a/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch b/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch -index f15c22b..b7efc9f 100644 +index f15c22b30f8e517e10f71c64082e8bea3a2b1d63..b7efc9f31bed7a4afd9a52d9f05b2aa4ca46e320 100644 --- a/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch +++ b/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch @@ -18,7 +18,7 @@ Signed-off-by: Gabor Juhos @@ -19908,7 +19908,7 @@ index f15c22b..b7efc9f 100644 case RF3070: case RF3290: diff --git a/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch b/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch -index 6ce224a..220e35f 100644 +index 6ce224aba27242f5e55030a396ea044d16528653..220e35fe4c201bed6678fb4a8e293563c41c1240 100644 --- a/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch +++ b/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch @@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos @@ -19921,7 +19921,7 @@ index 6ce224a..220e35f 100644 __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); diff --git a/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch b/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch -index 25753af..2ffa5a4 100644 +index 25753af81b2bf911fec969118e81c90a6c95e975..2ffa5a4162f65c0451e2462842c5801fade1c25d 100644 --- a/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch +++ b/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch @@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos @@ -19934,7 +19934,7 @@ index 25753af..2ffa5a4 100644 return retval; diff --git a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch -index 7a183a4..daa5dc6 100644 +index 7a183a404bae73cdcc120b41e83910ab579974ea..daa5dc61f9db18ba73cc19ea908587bb868bf292 100644 --- a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch +++ b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch @@ -22,10 +22,10 @@ @@ -19951,7 +19951,7 @@ index 7a183a4..daa5dc6 100644 #include diff --git a/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch -index bc056cd..8ae5da3 100644 +index bc056cd7357f57570168e5c1a4dbd4b9acd9a3c3..8ae5da38797df39f8bc13e3eace5f2f9496cde9c 100644 --- a/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch +++ b/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch @@ -1,6 +1,6 @@ @@ -19990,7 +19990,7 @@ index bc056cd..8ae5da3 100644 */ kfree(rt2x00dev->drv_data); diff --git a/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch -index d923e05..a2e1faf 100644 +index d923e05c770f2f325d7b47a9a5c9bcdf63cbbbdc..a2e1faf9c3793b51f912c743a38f7a9afd3bd0a0 100644 --- a/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch +++ b/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch @@ -37,7 +37,7 @@ @@ -20003,7 +20003,7 @@ index d923e05..a2e1faf 100644 #define SUPPORT_BAND_2GHZ 0x00000001 #define SUPPORT_BAND_5GHZ 0x00000002 diff --git a/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch -index a645ba1..6704ff8 100644 +index a645ba176e4ab17046945a87bb97359602b675c6..6704ff835c186b575b79c62ad6d83021fee3ee8a 100644 --- a/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch +++ b/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch @@ -31,7 +31,7 @@ @@ -20016,7 +20016,7 @@ index a645ba1..6704ff8 100644 u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev, struct ieee80211_vif *vif); diff --git a/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch b/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch -index c69d330..9f10fe3 100644 +index c69d33025d91dfb49ec411cbe2fc506ba67d03ff..9f10fe35c3a5c599bf3fb897583481a0971ef475 100644 --- a/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch +++ b/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch @@ -200,7 +200,7 @@ @@ -20029,7 +20029,7 @@ index c69d330..9f10fe3 100644 CAPABILITY_BT_COEXIST, CAPABILITY_VCO_RECALIBRATION, diff --git a/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch b/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch -index b44fe90..860fdc0 100644 +index b44fe900d53f87580ab8c0e502bc7f94958e6109..860fdc07ede072fce1cd65b177115dfd4dc30c03 100644 --- a/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch +++ b/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch @@ -28,7 +28,7 @@ @@ -20078,7 +20078,7 @@ index b44fe90..860fdc0 100644 struct ieee80211_sta_ht_cap ht; diff --git a/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch b/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch -index 8e3bd2a..e7b2a8c 100644 +index 8e3bd2a3622c1954a01ed548c71e436be9e92d8e..e7b2a8ca896118d5733e81a44ffb3a37502aeb42 100644 --- a/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch +++ b/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch @@ -8,7 +8,7 @@ @@ -20091,7 +20091,7 @@ index 8e3bd2a..e7b2a8c 100644 int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev) { diff --git a/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch b/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch -index faa5879..44bd8a1 100644 +index faa5879de68b0ec27d0099b51e296cfd7ccf7416..44bd8a194b23f9ef807fb66e99f6695998fc844c 100644 --- a/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch +++ b/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch @@ -240,7 +240,7 @@ @@ -20131,7 +20131,7 @@ index faa5879..44bd8a1 100644 #define RT3593 0x3593 #define RT3883 0x3883 /* WSOC */ diff --git a/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch b/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch -index 55452b9..dba6033 100644 +index 55452b9ebde82e716e9fbf557db07abdde07dce5..dba6033edb83aaec0943a523dc1bf2c8f3ba5b31 100644 --- a/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch +++ b/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch @@ -1,6 +1,6 @@ @@ -20143,7 +20143,7 @@ index 55452b9..dba6033 100644 if_limit = &rt2x00dev->if_limits_ap; if_limit->max = rt2x00dev->ops->max_ap_intf; diff --git a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch -index fd885cc..02f3053 100644 +index fd885cc002461dbdb4b21f3bc4c5ae97c6609ad3..02f3053b2f34305e5db0a953aee3378fc17f351f 100644 --- a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch +++ b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch @@ -1,6 +1,6 @@ @@ -20155,7 +20155,7 @@ index fd885cc..02f3053 100644 } diff --git a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch -index b67a95f..ad30608 100644 +index b67a95f948b79b4430799beadbcb98fc6f05e0da..ad306083da6cddff80b36241689cfeb3ba77d072 100644 --- a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch +++ b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch @@ -1,6 +1,6 @@ @@ -20168,7 +20168,7 @@ index b67a95f..ad30608 100644 diff --git a/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch b/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch deleted file mode 100644 -index 74cd448..0000000 +index 74cd4489f15fb1b18a2157441011a4ff68bb60f8..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch +++ /dev/null @@ -1,17 +0,0 @@ @@ -20190,7 +20190,7 @@ index 74cd448..0000000 - #endif - #ifdef CPTCFG_B43_SSB diff --git a/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch b/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch -index 06c731f..f8f555f 100644 +index 06c731fce677f7ea4a29652916c678f6de4dfc7d..f8f555f3e6ec510c333a97e76f47cca92e96a774 100644 --- a/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch +++ b/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch @@ -9,7 +9,7 @@ @@ -20258,7 +20258,7 @@ index 06c731f..f8f555f 100644 diff --git a/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch b/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch deleted file mode 100644 -index e265354..0000000 +index e2653542def01a708c6b3399a78484a322919a57..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch +++ /dev/null @@ -1,26 +0,0 @@ @@ -20290,7 +20290,7 @@ index e265354..0000000 - diff --git a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch new file mode 100644 -index 0000000..ae571c9 +index 0000000000000000000000000000000000000000..ae571c99ab151245355d0080a6475bcabbb9a2fb --- /dev/null +++ b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch @@ -0,0 +1,97 @@ @@ -20393,7 +20393,7 @@ index 0000000..ae571c9 + int brcmf_fw_get_firmwares(struct device *dev, u16 flags, diff --git a/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch deleted file mode 100644 -index f7f44f5..0000000 +index f7f44f513f5e80f18f26c49073f916a435c6c534..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch +++ /dev/null @@ -1,97 +0,0 @@ @@ -20496,7 +20496,7 @@ index f7f44f5..0000000 - int brcmf_fw_get_firmwares(struct device *dev, u16 flags, diff --git a/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch new file mode 100644 -index 0000000..8721155 +index 0000000000000000000000000000000000000000..87211550f77d6e06bef8f7124940ba30ac4222ef --- /dev/null +++ b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch @@ -0,0 +1,50 @@ @@ -20552,7 +20552,7 @@ index 0000000..8721155 + if (err) { diff --git a/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch new file mode 100644 -index 0000000..f301fe1 +index 0000000000000000000000000000000000000000..f301fe1e4e7daa2cabd73aaf869327e2a0fb7d22 --- /dev/null +++ b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch @@ -0,0 +1,27 @@ @@ -20585,7 +20585,7 @@ index 0000000..f301fe1 + diff --git a/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch deleted file mode 100644 -index 1e440c0..0000000 +index 1e440c02f33ffa7389837442fde8bdcb21002d61..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch +++ /dev/null @@ -1,50 +0,0 @@ @@ -20640,7 +20640,7 @@ index 1e440c0..0000000 - err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type); - if (err) { diff --git a/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch b/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch -index f2e21ea..be210f2 100644 +index f2e21ea49feafaf060846d95746ea6132819536f..be210f2d4bfc22a20b7473012000338e22622bd9 100644 --- a/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch +++ b/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch @@ -1184,7 +1184,7 @@ @@ -20662,7 +20662,7 @@ index f2e21ea..be210f2 100644 case RF5390: case RF5392: diff --git a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch -index 8c6d720..e842d61 100644 +index 8c6d720a73cf73e007eeede2829ec9019d5a2d40..e842d612b7b55caaa557c20836ca84e3cd21f906 100644 --- a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch +++ b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch @@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann @@ -20675,7 +20675,7 @@ index 8c6d720..e842d61 100644 queue_work(ar->workqueue, &ar->register_work); diff --git a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch -index 281b447..a501b99 100644 +index 281b4475ada3f4388292d930a9fd252b234ec0c5..a501b998d0f279eeac266df9a4cd03e5cb731f98 100644 --- a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch +++ b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch @@ -1,6 +1,6 @@ @@ -20702,7 +20702,7 @@ index 281b447..a501b99 100644 + ARRAY_SIZE(ath10k_tpt_blink)); diff --git a/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch b/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch new file mode 100644 -index 0000000..596ef98 +index 0000000000000000000000000000000000000000..596ef9863902ecbbd3cdb394c7ffde3ba509414f --- /dev/null +++ b/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch @@ -0,0 +1,51 @@ @@ -20758,7 +20758,7 @@ index 0000000..596ef98 + + ret = ath10k_core_fetch_board_file(ar); diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile -index e49dd48..bd851e6 100644 +index e49dd486d2c952f3bc985a02bb131fdc7a03ce4a..bd851e61910c9a57ca45a570855ca22329c9ae4b 100644 --- a/package/kernel/mt76/Makefile +++ b/package/kernel/mt76/Makefile @@ -1,7 +1,7 @@ @@ -20817,7 +20817,7 @@ index e49dd48..bd851e6 100644 $(PKG_BUILD_DIR)/firmware/mt7662.bin \ $(1)/lib/firmware diff --git a/package/network/services/hostapd/Config.in b/package/network/services/hostapd/Config.in -index aee2a15..645888e 100644 +index aee2a15fd314479ba4d5e29a8bb4ec5855a78342..645888e74510c5c42c21a7208ee0dcc884fb0e2a 100644 --- a/package/network/services/hostapd/Config.in +++ b/package/network/services/hostapd/Config.in @@ -10,11 +10,10 @@ config WPA_SUPPLICANT_NO_TIMESTAMP_CHECK @@ -20834,7 +20834,7 @@ index aee2a15..645888e 100644 config WPA_SUPPLICANT_OPENSSL bool "openssl" diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile -index 8e706dc..5caf3e3 100644 +index 8e706dc5a3dac630076e32eafbffbee2ba7e2976..5caf3e33786890b9c06a21365356fb39a7b4341d 100644 --- a/package/network/services/hostapd/Makefile +++ b/package/network/services/hostapd/Makefile @@ -7,18 +7,18 @@ @@ -20964,7 +20964,7 @@ index 8e706dc..5caf3e3 100644 -$(eval $(call BuildPackage,hostapd-common-old)) $(eval $(call BuildPackage,eapol-test)) diff --git a/package/network/services/hostapd/files/hostapd-full.config b/package/network/services/hostapd/files/hostapd-full.config -index f1b2655..e388109 100644 +index f1b2655cfcb7f8cbc61399eb3ffb886770b55a3f..e388109fbb6bac4b965e5fced6e2cc189f883255 100644 --- a/package/network/services/hostapd/files/hostapd-full.config +++ b/package/network/services/hostapd/files/hostapd-full.config @@ -10,7 +10,7 @@ @@ -20987,7 +20987,7 @@ index f1b2655..e388109 100644 CONFIG_EAP_MD5=y diff --git a/package/network/services/hostapd/files/hostapd-mini.config b/package/network/services/hostapd/files/hostapd-mini.config -index 118d97c..8baff18 100644 +index 118d97cb3a21c195bc903fde2d4f885699b2425b..8baff18fe47a0322b2c6b3312581635ccf518143 100644 --- a/package/network/services/hostapd/files/hostapd-mini.config +++ b/package/network/services/hostapd/files/hostapd-mini.config @@ -10,7 +10,7 @@ @@ -21001,7 +21001,7 @@ index 118d97c..8baff18 100644 CONFIG_DRIVER_WIRED=y diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh deleted file mode 100644 -index 7aec7ad..0000000 +index 7aec7ad8a40ae843453e2c3e8f812a93c9635320..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/files/hostapd.sh +++ /dev/null @@ -1,394 +0,0 @@ @@ -21400,7 +21400,7 @@ index 7aec7ad..0000000 -} - diff --git a/package/network/services/hostapd/files/netifd.sh b/package/network/services/hostapd/files/netifd.sh -index 23d2e7e..e6b0b0d 100644 +index 23d2e7e83ebe5ca744f40e300fdbfb1014c555c5..e6b0b0d769c6301f05696d4ca963241c3ac11620 100644 --- a/package/network/services/hostapd/files/netifd.sh +++ b/package/network/services/hostapd/files/netifd.sh @@ -1,3 +1,5 @@ @@ -21641,7 +21641,7 @@ index 23d2e7e..e6b0b0d 100644 esac append network_data "eap=$(echo $eap_type | tr 'a-z' 'A-Z')" "$N$T" diff --git a/package/network/services/hostapd/files/wpa_supplicant-full.config b/package/network/services/hostapd/files/wpa_supplicant-full.config -index a9d04ab..18c3f9a 100644 +index a9d04ab1752bf8cd8a51d5d4a7cb0431463add57..18c3f9a5c142b2eda67ec3136c73114555c4d131 100644 --- a/package/network/services/hostapd/files/wpa_supplicant-full.config +++ b/package/network/services/hostapd/files/wpa_supplicant-full.config @@ -41,7 +41,7 @@ @@ -21674,7 +21674,7 @@ index a9d04ab..18c3f9a 100644 #CONFIG_DEBUG_FILE=y diff --git a/package/network/services/hostapd/files/wpa_supplicant-mesh.config b/package/network/services/hostapd/files/wpa_supplicant-mesh.config deleted file mode 100644 -index 36e2908..0000000 +index 36e29088c41ab819830e85f2fdadbcf700dc4071..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/files/wpa_supplicant-mesh.config +++ /dev/null @@ -1,407 +0,0 @@ @@ -22086,7 +22086,7 @@ index 36e2908..0000000 -CONFIG_SAE=y -CONFIG_AP=y diff --git a/package/network/services/hostapd/files/wpa_supplicant-mini.config b/package/network/services/hostapd/files/wpa_supplicant-mini.config -index a8d334d..c272153 100644 +index a8d334d942e0618eb1224d093bb5047b1b40577a..c272153b3a9ee52e3dd6370c533fd0d06fac9e20 100644 --- a/package/network/services/hostapd/files/wpa_supplicant-mini.config +++ b/package/network/services/hostapd/files/wpa_supplicant-mini.config @@ -41,7 +41,7 @@ @@ -22099,7 +22099,7 @@ index a8d334d..c272153 100644 # Driver interface for Agere driver #CONFIG_DRIVER_HERMES=y diff --git a/package/network/services/hostapd/files/wpa_supplicant-p2p.config b/package/network/services/hostapd/files/wpa_supplicant-p2p.config -index 1c307d0..563dace 100644 +index 1c307d0e697b99036cafaed8b923cea0523114c2..563dace352f36e471374d40e37deee171d69094f 100644 --- a/package/network/services/hostapd/files/wpa_supplicant-p2p.config +++ b/package/network/services/hostapd/files/wpa_supplicant-p2p.config @@ -41,7 +41,7 @@ @@ -22113,7 +22113,7 @@ index 1c307d0..563dace 100644 #CONFIG_DRIVER_HERMES=y diff --git a/package/network/services/hostapd/files/wpa_supplicant.sh b/package/network/services/hostapd/files/wpa_supplicant.sh deleted file mode 100644 -index b678484..0000000 +index b6784843e8ea99763796d9bfe772b004468e7304..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/files/wpa_supplicant.sh +++ /dev/null @@ -1,194 +0,0 @@ @@ -22313,7 +22313,7 @@ index b678484..0000000 -} diff --git a/package/network/services/hostapd/patches/001-4addr-fix-reconnecting-client-on-connection-lost.patch b/package/network/services/hostapd/patches/001-4addr-fix-reconnecting-client-on-connection-lost.patch new file mode 100644 -index 0000000..5c8b662 +index 0000000000000000000000000000000000000000..5c8b6622c9a257bee024de6c9db9e3da38312b6f --- /dev/null +++ b/package/network/services/hostapd/patches/001-4addr-fix-reconnecting-client-on-connection-lost.patch @@ -0,0 +1,25 @@ @@ -22344,7 +22344,7 @@ index 0000000..5c8b662 + /* diff --git a/package/network/services/hostapd/patches/001-P2P-Validate-SSID-element-length-before-copying-it-C.patch b/package/network/services/hostapd/patches/001-P2P-Validate-SSID-element-length-before-copying-it-C.patch deleted file mode 100644 -index e408fbe..0000000 +index e408fbe3839e07637f526a99cd83e9e7558bc4d2..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/001-P2P-Validate-SSID-element-length-before-copying-it-C.patch +++ /dev/null @@ -1,37 +0,0 @@ @@ -22387,7 +22387,7 @@ index e408fbe..0000000 - != 0)) { diff --git a/package/network/services/hostapd/patches/002-AP-WMM-Fix-integer-underflow-in-WMM-Action-frame-par.patch b/package/network/services/hostapd/patches/002-AP-WMM-Fix-integer-underflow-in-WMM-Action-frame-par.patch deleted file mode 100644 -index bc4d60f..0000000 +index bc4d60fcc18c165e11e3a322bc064b6b18eaffed..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/002-AP-WMM-Fix-integer-underflow-in-WMM-Action-frame-par.patch +++ /dev/null @@ -1,36 +0,0 @@ @@ -22429,7 +22429,7 @@ index bc4d60f..0000000 - hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211, diff --git a/package/network/services/hostapd/patches/002-mesh-Set-correct-secondary-channel-offset-if-HT40-is.patch b/package/network/services/hostapd/patches/002-mesh-Set-correct-secondary-channel-offset-if-HT40-is.patch new file mode 100644 -index 0000000..2439220 +index 0000000000000000000000000000000000000000..243922002a856c1910bdccdaee62304d78f27868 --- /dev/null +++ b/package/network/services/hostapd/patches/002-mesh-Set-correct-secondary-channel-offset-if-HT40-is.patch @@ -0,0 +1,61 @@ @@ -22496,7 +22496,7 @@ index 0000000..2439220 + diff --git a/package/network/services/hostapd/patches/003-WPS-Fix-HTTP-chunked-transfer-encoding-parser.patch b/package/network/services/hostapd/patches/003-WPS-Fix-HTTP-chunked-transfer-encoding-parser.patch deleted file mode 100644 -index 36b4ca2..0000000 +index 36b4ca2946990108d1d294cb15540a6bc3207e99..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/003-WPS-Fix-HTTP-chunked-transfer-encoding-parser.patch +++ /dev/null @@ -1,49 +0,0 @@ @@ -22551,7 +22551,7 @@ index 36b4ca2..0000000 - diff --git a/package/network/services/hostapd/patches/004-EAP-pwd-peer-Fix-payload-length-validation-for-Commi.patch b/package/network/services/hostapd/patches/004-EAP-pwd-peer-Fix-payload-length-validation-for-Commi.patch deleted file mode 100644 -index 91627fb..0000000 +index 91627fb7b7f6bf43b085290cbd135bba18325295..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/004-EAP-pwd-peer-Fix-payload-length-validation-for-Commi.patch +++ /dev/null @@ -1,73 +0,0 @@ @@ -22630,7 +22630,7 @@ index 91627fb..0000000 - diff --git a/package/network/services/hostapd/patches/005-EAP-pwd-server-Fix-payload-length-validation-for-Com.patch b/package/network/services/hostapd/patches/005-EAP-pwd-server-Fix-payload-length-validation-for-Com.patch deleted file mode 100644 -index 5dca20b..0000000 +index 5dca20b2771b855ac724ce0b0bf4bee2e377f7bf..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/005-EAP-pwd-server-Fix-payload-length-validation-for-Com.patch +++ /dev/null @@ -1,66 +0,0 @@ @@ -22702,7 +22702,7 @@ index 5dca20b..0000000 - diff --git a/package/network/services/hostapd/patches/006-EAP-pwd-peer-Fix-Total-Length-parsing-for-fragment-r.patch b/package/network/services/hostapd/patches/006-EAP-pwd-peer-Fix-Total-Length-parsing-for-fragment-r.patch deleted file mode 100644 -index 4d2f9d8..0000000 +index 4d2f9d8aefebd43813ba55e5f1152cd2120323ca..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/006-EAP-pwd-peer-Fix-Total-Length-parsing-for-fragment-r.patch +++ /dev/null @@ -1,52 +0,0 @@ @@ -22760,7 +22760,7 @@ index 4d2f9d8..0000000 - diff --git a/package/network/services/hostapd/patches/007-EAP-pwd-server-Fix-Total-Length-parsing-for-fragment.patch b/package/network/services/hostapd/patches/007-EAP-pwd-server-Fix-Total-Length-parsing-for-fragment.patch deleted file mode 100644 -index 7edef09..0000000 +index 7edef099eb59e2dc92fed9ca10fd0479a965c51c..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/007-EAP-pwd-server-Fix-Total-Length-parsing-for-fragment.patch +++ /dev/null @@ -1,50 +0,0 @@ @@ -22816,7 +22816,7 @@ index 7edef09..0000000 - diff --git a/package/network/services/hostapd/patches/008-EAP-pwd-peer-Fix-asymmetric-fragmentation-behavior.patch b/package/network/services/hostapd/patches/008-EAP-pwd-peer-Fix-asymmetric-fragmentation-behavior.patch deleted file mode 100644 -index a601323..0000000 +index a601323f14da8a98f08c6ee02367ac74890059f3..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/008-EAP-pwd-peer-Fix-asymmetric-fragmentation-behavior.patch +++ /dev/null @@ -1,32 +0,0 @@ @@ -22854,7 +22854,7 @@ index a601323..0000000 - diff --git a/package/network/services/hostapd/patches/009-NFC-Fix-payload-length-validation-in-NDEF-record-par.patch b/package/network/services/hostapd/patches/009-NFC-Fix-payload-length-validation-in-NDEF-record-par.patch deleted file mode 100644 -index dd34624..0000000 +index dd3462465ea4ff460c5be5a10379da9b72973007..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/009-NFC-Fix-payload-length-validation-in-NDEF-record-par.patch +++ /dev/null @@ -1,61 +0,0 @@ @@ -22921,7 +22921,7 @@ index dd34624..0000000 - diff --git a/package/network/services/hostapd/patches/010-WNM-Ignore-Key-Data-in-WNM-Sleep-Mode-Response-frame.patch b/package/network/services/hostapd/patches/010-WNM-Ignore-Key-Data-in-WNM-Sleep-Mode-Response-frame.patch deleted file mode 100644 -index 00e5b7c..0000000 +index 00e5b7c771df4c8aeec39aafc2b893297667038d..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/010-WNM-Ignore-Key-Data-in-WNM-Sleep-Mode-Response-frame.patch +++ /dev/null @@ -1,32 +0,0 @@ @@ -22959,7 +22959,7 @@ index 00e5b7c..0000000 - wpa_printf(MSG_DEBUG, "WNM: Invalid Key Data element " diff --git a/package/network/services/hostapd/patches/011-EAP-pwd-peer-Fix-last-fragment-length-validation.patch b/package/network/services/hostapd/patches/011-EAP-pwd-peer-Fix-last-fragment-length-validation.patch deleted file mode 100644 -index 82c2639..0000000 +index 82c26398b69d4c7b32c4851fdba43630af172c28..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/011-EAP-pwd-peer-Fix-last-fragment-length-validation.patch +++ /dev/null @@ -1,54 +0,0 @@ @@ -23019,7 +23019,7 @@ index 82c2639..0000000 - diff --git a/package/network/services/hostapd/patches/012-EAP-pwd-server-Fix-last-fragment-length-validation.patch b/package/network/services/hostapd/patches/012-EAP-pwd-server-Fix-last-fragment-length-validation.patch deleted file mode 100644 -index bfc4c74..0000000 +index bfc4c74e95cad7dae1afe5a315b9e4ff5ab5b920..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/012-EAP-pwd-server-Fix-last-fragment-length-validation.patch +++ /dev/null @@ -1,51 +0,0 @@ @@ -23076,7 +23076,7 @@ index bfc4c74..0000000 - diff --git a/package/network/services/hostapd/patches/013-EAP-pwd-peer-Fix-error-path-for-unexpected-Confirm-m.patch b/package/network/services/hostapd/patches/013-EAP-pwd-peer-Fix-error-path-for-unexpected-Confirm-m.patch deleted file mode 100644 -index 3088f6a..0000000 +index 3088f6a6dcda38dd4d579f020607237780324dc4..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/013-EAP-pwd-peer-Fix-error-path-for-unexpected-Confirm-m.patch +++ /dev/null @@ -1,34 +0,0 @@ @@ -23116,7 +23116,7 @@ index 3088f6a..0000000 - diff --git a/package/network/services/hostapd/patches/014-nl80211-Try-running-without-mgmt-frame-subscription-.patch b/package/network/services/hostapd/patches/014-nl80211-Try-running-without-mgmt-frame-subscription-.patch deleted file mode 100644 -index 25ba87d..0000000 +index 25ba87d8d140ee614253c1ef75921313130c88b2..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/014-nl80211-Try-running-without-mgmt-frame-subscription-.patch +++ /dev/null @@ -1,48 +0,0 @@ @@ -23170,7 +23170,7 @@ index 25ba87d..0000000 - nl80211_create_monitor_interface(drv) && diff --git a/package/network/services/hostapd/patches/100-mesh_mode_fix.patch b/package/network/services/hostapd/patches/100-mesh_mode_fix.patch new file mode 100644 -index 0000000..ceb4c53 +index 0000000000000000000000000000000000000000..ceb4c53afacfb1dd5430a487147e73b3de4f7239 --- /dev/null +++ b/package/network/services/hostapd/patches/100-mesh_mode_fix.patch @@ -0,0 +1,12 @@ @@ -23188,7 +23188,7 @@ index 0000000..ceb4c53 + nlmode = NL80211_IFTYPE_STATION; diff --git a/package/network/services/hostapd/patches/110-bool_fix.patch b/package/network/services/hostapd/patches/110-bool_fix.patch deleted file mode 100644 -index 865c014..0000000 +index 865c014ee311d3d9ae73575d211d8c8904b0e237..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/110-bool_fix.patch +++ /dev/null @@ -1,14 +0,0 @@ @@ -23208,7 +23208,7 @@ index 865c014..0000000 - diff --git a/package/network/services/hostapd/patches/110-fix_parse_das_client.patch b/package/network/services/hostapd/patches/110-fix_parse_das_client.patch new file mode 100644 -index 0000000..67fb899 +index 0000000000000000000000000000000000000000..67fb899f30a6f9dbd04b89da28a3ed9fd6263fa6 --- /dev/null +++ b/package/network/services/hostapd/patches/110-fix_parse_das_client.patch @@ -0,0 +1,10 @@ @@ -23223,7 +23223,7 @@ index 0000000..67fb899 + + if (hostapd_parse_ip_addr(val, &bss->radius_das_client_addr)) diff --git a/package/network/services/hostapd/patches/120-daemonize_fix.patch b/package/network/services/hostapd/patches/120-daemonize_fix.patch -index 032e207..0389406 100644 +index 032e2072a35770628f96831ab3b6c4bbebdb7cf2..0389406a98a11a9eb4d5df64a30896e57dea103b 100644 --- a/package/network/services/hostapd/patches/120-daemonize_fix.patch +++ b/package/network/services/hostapd/patches/120-daemonize_fix.patch @@ -8,7 +8,7 @@ @@ -23252,7 +23252,7 @@ index 032e207..0389406 100644 -int os_daemonize(const char *pid_file) -{ diff --git a/package/network/services/hostapd/patches/130-no_eapol_fix.patch b/package/network/services/hostapd/patches/130-no_eapol_fix.patch -index d23b47b..5aee3d0 100644 +index d23b47b03c7b652cd7fa7b5ca3937633638aac25..5aee3d07f16b1f5665fab1b2a31794c32e18cbac 100644 --- a/package/network/services/hostapd/patches/130-no_eapol_fix.patch +++ b/package/network/services/hostapd/patches/130-no_eapol_fix.patch @@ -1,6 +1,6 @@ @@ -23264,7 +23264,7 @@ index d23b47b..5aee3d0 100644 void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s) { diff --git a/package/network/services/hostapd/patches/140-disable_bridge_packet_workaround.patch b/package/network/services/hostapd/patches/140-disable_bridge_packet_workaround.patch -index 6337d8d..fdd5da9 100644 +index 6337d8d737bfa3c327d46b8843cbbe72efe4c14d..fdd5da9bf5e99cad1a998f80f435ac26097274cd 100644 --- a/package/network/services/hostapd/patches/140-disable_bridge_packet_workaround.patch +++ b/package/network/services/hostapd/patches/140-disable_bridge_packet_workaround.patch @@ -1,6 +1,6 @@ @@ -23284,7 +23284,7 @@ index 6337d8d..fdd5da9 100644 - * The Linux packet socket behavior has changed over the years and there diff --git a/package/network/services/hostapd/patches/150-nl80211-Report-disassociated-STA-lost-peer-for-the-c.patch b/package/network/services/hostapd/patches/150-nl80211-Report-disassociated-STA-lost-peer-for-the-c.patch deleted file mode 100644 -index 66c682f..0000000 +index 66c682fbd39c4cad25590534236da3261743ab70..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/150-nl80211-Report-disassociated-STA-lost-peer-for-the-c.patch +++ /dev/null @@ -1,67 +0,0 @@ @@ -23356,7 +23356,7 @@ index 66c682f..0000000 - case NL80211_CMD_SET_REKEY_OFFLOAD: - nl80211_rekey_offload_event(drv, tb); diff --git a/package/network/services/hostapd/patches/200-multicall.patch b/package/network/services/hostapd/patches/200-multicall.patch -index de4a3a8..40bd733 100644 +index de4a3a8e7f1ac310bdbf49b84a212b2c2d024c70..40bd7336ec225df892858b2d4a45cd6a3f0debb1 100644 --- a/package/network/services/hostapd/patches/200-multicall.patch +++ b/package/network/services/hostapd/patches/200-multicall.patch @@ -1,15 +1,25 @@ @@ -23718,7 +23718,7 @@ index de4a3a8..40bd733 100644 os_memset(&eapol_test, 0, sizeof(eapol_test)); diff --git a/package/network/services/hostapd/patches/300-noscan.patch b/package/network/services/hostapd/patches/300-noscan.patch -index 57d8fe2..21d6316 100644 +index 57d8fe27bf681638237e0e8452ec7fbdebe6d036..21d631603b1f4e0af8dc11c3a249fc7d247021f3 100644 --- a/package/network/services/hostapd/patches/300-noscan.patch +++ b/package/network/services/hostapd/patches/300-noscan.patch @@ -1,6 +1,6 @@ @@ -23778,7 +23778,7 @@ index 57d8fe2..21d6316 100644 return; diff --git a/package/network/services/hostapd/patches/310-rescan_immediately.patch b/package/network/services/hostapd/patches/310-rescan_immediately.patch -index 7be8c32..3f46cc4 100644 +index 7be8c32e3b17a183238177a5cb9601449382d224..3f46cc4ac1d2ea3a3450b1c70375bc7c37a1ec41 100644 --- a/package/network/services/hostapd/patches/310-rescan_immediately.patch +++ b/package/network/services/hostapd/patches/310-rescan_immediately.patch @@ -1,6 +1,6 @@ @@ -23796,7 +23796,7 @@ index 7be8c32..3f46cc4 100644 - wpa_s->sched_scanning = 0; + wpa_s->p2pdev = wpa_s->parent; diff --git a/package/network/services/hostapd/patches/320-optional_rfkill.patch b/package/network/services/hostapd/patches/320-optional_rfkill.patch -index 75b4b07..cf2a2c1 100644 +index 75b4b07f82115e226fd2f29f2ed19682ed1346f3..cf2a2c108b0c58597c4a10ccd9c7be242a6ae649 100644 --- a/package/network/services/hostapd/patches/320-optional_rfkill.patch +++ b/package/network/services/hostapd/patches/320-optional_rfkill.patch @@ -1,14 +1,14 @@ @@ -23844,7 +23844,7 @@ index 75b4b07..cf2a2c1 100644 +++ b/src/drivers/rfkill.h @@ -18,8 +18,24 @@ struct rfkill_config { diff --git a/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch b/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch -index dd90877..ca46012 100644 +index dd90877e90a2af68aa811e137fc7ccc89b01eff4..ca4601247b9c093a986e543d188726380301263e 100644 --- a/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch +++ b/package/network/services/hostapd/patches/330-nl80211_fix_set_freq.patch @@ -1,6 +1,6 @@ @@ -23856,7 +23856,7 @@ index dd90877..ca46012 100644 freq->bandwidth, freq->center_freq1, freq->center_freq2); diff --git a/package/network/services/hostapd/patches/340-reload_freq_change.patch b/package/network/services/hostapd/patches/340-reload_freq_change.patch -index 91b6196..086ade9 100644 +index 91b61964ddf618b245da12dfa11ade4747d66e56..086ade9cedec664ee566764f8f09bd2fd730ba53 100644 --- a/package/network/services/hostapd/patches/340-reload_freq_change.patch +++ b/package/network/services/hostapd/patches/340-reload_freq_change.patch @@ -1,6 +1,6 @@ @@ -23877,7 +23877,7 @@ index 91b6196..086ade9 100644 iface->conf = newconf; diff --git a/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch b/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch -index a14fa03..247f154 100644 +index a14fa03527525c03c07875db44fffdba557b0593..247f154e3059aaf25df321b496ff255b50b8ddf4 100644 --- a/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch +++ b/package/network/services/hostapd/patches/350-nl80211_del_beacon_bss.patch @@ -1,6 +1,6 @@ @@ -23934,7 +23934,7 @@ index a14fa03..247f154 100644 if (!is_ap_interface(drv->nlmode)) return -1; diff --git a/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch b/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch -index 06b005e..1e405cb 100644 +index 06b005ea3ac8e3a43d610c2719b4d53a6ceacd73..1e405cbf0edcda8604080f9c00f0eeb35c106218 100644 --- a/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch +++ b/package/network/services/hostapd/patches/360-ctrl_iface_reload.patch @@ -1,22 +1,22 @@ @@ -23994,7 +23994,7 @@ index 06b005e..1e405cb 100644 + + diff --git a/package/network/services/hostapd/patches/370-ap_sta_support.patch b/package/network/services/hostapd/patches/370-ap_sta_support.patch -index ea235e6..a77d4c9 100644 +index ea235e67780366b28dd8e811367d7cb45f2397de..a77d4c92e6d7fa7711338c82aba27b7e44248afe 100644 --- a/package/network/services/hostapd/patches/370-ap_sta_support.patch +++ b/package/network/services/hostapd/patches/370-ap_sta_support.patch @@ -1,6 +1,6 @@ @@ -24158,7 +24158,7 @@ index ea235e6..a77d4c9 100644 + /* Five octets of HT Operation Information */ + u8 ht_param; diff --git a/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch b/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch -index 3a41b82..9e815e9 100644 +index 3a41b8219ea83136b76ad59b0bf79b566d1e7b35..9e815e96a13b2978f4a75e0131e420150dbc7d00 100644 --- a/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch +++ b/package/network/services/hostapd/patches/380-disable_ctrl_iface_mib.patch @@ -1,18 +1,18 @@ @@ -24342,7 +24342,7 @@ index 3a41b82..9e815e9 100644 diff --git a/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch b/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch -index 1065a7f..c9e7bf4 100644 +index 1065a7f125bd0dce8fbd5090afc71f73d2295f16..c9e7bf4209fcde62dd965cd12754e6876067ed01 100644 --- a/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch +++ b/package/network/services/hostapd/patches/390-wpa_ie_cap_workaround.patch @@ -1,6 +1,6 @@ @@ -24363,7 +24363,7 @@ index 1065a7f..c9e7bf4 100644 return -1; diff --git a/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch b/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch -index 083af5b..f5872cd 100644 +index 083af5b4508e968af5628ad959283dcef24ba41a..f5872cd5979e48aa0f918635af0852f2c1acb027 100644 --- a/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch +++ b/package/network/services/hostapd/patches/400-wps_single_auth_enc_type.patch @@ -1,25 +1,22 @@ @@ -24411,7 +24411,7 @@ index 083af5b..f5872cd 100644 + wps->encr_types_rsn |= WPS_ENCR_TKIP; + } diff --git a/package/network/services/hostapd/patches/410-limit_debug_messages.patch b/package/network/services/hostapd/patches/410-limit_debug_messages.patch -index da88732..a48b696 100644 +index da887321c6e96fb42f58e613c77f6501279df2b6..a48b6962ee3e420f4abc79e772b9bcb049559dee 100644 --- a/package/network/services/hostapd/patches/410-limit_debug_messages.patch +++ b/package/network/services/hostapd/patches/410-limit_debug_messages.patch @@ -64,7 +64,7 @@ @@ -24451,7 +24451,7 @@ index da88732..a48b696 100644 * events that do not need to be sent to syslog. */ diff --git a/package/network/services/hostapd/patches/420-indicate-features.patch b/package/network/services/hostapd/patches/420-indicate-features.patch -index 64c92df..335e71e 100644 +index 64c92df6bb58d07fb7f1d004b4ddc371e212291d..335e71eb519851305f813b4aa95ca5239b7e46f9 100644 --- a/package/network/services/hostapd/patches/420-indicate-features.patch +++ b/package/network/services/hostapd/patches/420-indicate-features.patch @@ -8,16 +8,16 @@ @@ -24502,7 +24502,7 @@ index 64c92df..335e71e 100644 #endif /* CONFIG_DBUS */ case 'v': diff --git a/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch b/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch -index 85d2e16..d07b747 100644 +index 85d2e1603bfb56eb8f9b62c8ea602020c3170883..d07b747c3d299dd1561251fcfd5a89a41214edb5 100644 --- a/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch +++ b/package/network/services/hostapd/patches/430-hostapd_cli_ifdef.patch @@ -1,6 +1,6 @@ @@ -24559,7 +24559,7 @@ index 85d2e16..d07b747 100644 { "wps_config", hostapd_cli_cmd_wps_config }, { "wps_get_status", hostapd_cli_cmd_wps_get_status }, diff --git a/package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch b/package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch -index 874ff4b..256f6b5 100644 +index 874ff4bccc0b152ce5a2f2b9e3a0ba1097128126..256f6b5977323b00215927a0051738eda376eef7 100644 --- a/package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch +++ b/package/network/services/hostapd/patches/431-wpa_cli_ifdef.patch @@ -1,13 +1,12 @@ @@ -24582,7 +24582,7 @@ index 874ff4b..256f6b5 100644 - "Copyright (c) 2004-2015, Jouni Malinen and contributors"; diff --git a/package/network/services/hostapd/patches/432-missing-typedef.patch b/package/network/services/hostapd/patches/432-missing-typedef.patch new file mode 100644 -index 0000000..7a100f1 +index 0000000000000000000000000000000000000000..7a100f1a0d25e4e1e63524025dcd36d532122843 --- /dev/null +++ b/package/network/services/hostapd/patches/432-missing-typedef.patch @@ -0,0 +1,10 @@ @@ -24598,7 +24598,7 @@ index 0000000..7a100f1 + #endif /* __user */ diff --git a/package/network/services/hostapd/patches/440-max_num_sta_probe.patch b/package/network/services/hostapd/patches/440-max_num_sta_probe.patch deleted file mode 100644 -index 74aef26..0000000 +index 74aef26d64fb82fad3826b64024e9500f2353542..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/440-max_num_sta_probe.patch +++ /dev/null @@ -1,13 +0,0 @@ @@ -24616,7 +24616,7 @@ index 74aef26..0000000 - if (hapd->conf->interworking && - elems.interworking && elems.interworking_len >= 1) { diff --git a/package/network/services/hostapd/patches/450-scan_wait.patch b/package/network/services/hostapd/patches/450-scan_wait.patch -index 87ebd45..78cf306 100644 +index 87ebd4552f4d22dfcb2c3bd9947e6c2f16e9e115..78cf3064fa6fbf5abf89d5c7388e8a99e8ba988e 100644 --- a/package/network/services/hostapd/patches/450-scan_wait.patch +++ b/package/network/services/hostapd/patches/450-scan_wait.patch @@ -1,6 +1,6 @@ @@ -24687,7 +24687,7 @@ index 87ebd45..78cf306 100644 int ret = 1; size_t i, j; diff --git a/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch b/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch -index 217e701..6a5866e 100644 +index 217e7015010848fd441003776afcbae04038d02d..6a5866e17c0305e92c9ca20f7b09768d60dfafab 100644 --- a/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch +++ b/package/network/services/hostapd/patches/460-wpa_supplicant-add-new-config-params-to-be-used-with.patch @@ -18,15 +18,15 @@ Signed-hostap: Antonio Quartulli @@ -24822,7 +24822,7 @@ index 217e701..6a5866e 100644 + i++; + } diff --git a/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch b/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch -index 730cc31..459bdb9 100644 +index 730cc316503965639f87111b43be49ea3ee66f79..459bdb944ae2d5f6820594b261ccfc77b52ab5d3 100644 --- a/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch +++ b/package/network/services/hostapd/patches/461-driver_nl80211-use-new-parameters-during-ibss-join.patch @@ -10,7 +10,7 @@ Signed-hostap: Antonio Quartulli @@ -24844,7 +24844,7 @@ index 730cc31..459bdb9 100644 goto fail; diff --git a/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch b/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch -index 30bb2dc..80fe49c 100644 +index 30bb2dc14c44d7ee85df46b9f203f8ca2e26557d..80fe49ccb20f0e9caf5e690fe18f3c31fe351a8e 100644 --- a/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch +++ b/package/network/services/hostapd/patches/462-wpa_s-support-htmode-param.patch @@ -16,9 +16,9 @@ Signed-off-by: Antonio Quartulli @@ -24909,7 +24909,7 @@ index 30bb2dc..80fe49c 100644 params.mcast_rate = ssid->mcast_rate; diff --git a/package/network/services/hostapd/patches/470-survey_data_fallback.patch b/package/network/services/hostapd/patches/470-survey_data_fallback.patch new file mode 100644 -index 0000000..4e40a87 +index 0000000000000000000000000000000000000000..4e40a87558949483954950f72d30ac30a17877e9 --- /dev/null +++ b/package/network/services/hostapd/patches/470-survey_data_fallback.patch @@ -0,0 +1,45 @@ @@ -24960,7 +24960,7 @@ index 0000000..4e40a87 + return 1; diff --git a/package/network/services/hostapd/patches/470-wait-for-nullfunc-longer.patch b/package/network/services/hostapd/patches/470-wait-for-nullfunc-longer.patch deleted file mode 100644 -index e6bbddd..0000000 +index e6bbdddc50cc293f4feb0d91abbca597e02902dc..0000000000000000000000000000000000000000 --- a/package/network/services/hostapd/patches/470-wait-for-nullfunc-longer.patch +++ /dev/null @@ -1,11 +0,0 @@ @@ -24976,7 +24976,7 @@ index e6bbddd..0000000 - /* Number of seconds to keep STA entry with Authenticated flag after it has - * been disassociated. */ diff --git a/package/network/services/hostapd/patches/600-ubus_support.patch b/package/network/services/hostapd/patches/600-ubus_support.patch -index df2eac8..feacdf2 100644 +index df2eac873c306728b05c8b96e2a464592944d181..feacdf2c08b07d5eba7c99efe629e64dd93f2c00 100644 --- a/package/network/services/hostapd/patches/600-ubus_support.patch +++ b/package/network/services/hostapd/patches/600-ubus_support.patch @@ -1,6 +1,6 @@ @@ -25274,7 +25274,7 @@ index df2eac8..feacdf2 100644 + if (hostapd_ubus_handle_event(hapd, &req)) { + wpa_printf(MSG_DEBUG, "Station " MACSTR " assoc rejected by ubus handler.\n", diff --git a/package/network/utils/iw/Makefile b/package/network/utils/iw/Makefile -index ad82081..d17cbca 100644 +index ad82081570395bfba8d60428996194d834f73321..d17cbca0df391a287fb9d80a3d9c1ca1355c1774 100644 --- a/package/network/utils/iw/Makefile +++ b/package/network/utils/iw/Makefile @@ -12,10 +12,10 @@ PKG_VERSION:=4.3 @@ -25291,7 +25291,7 @@ index ad82081..d17cbca 100644 include $(INCLUDE_DIR)/package.mk diff --git a/package/network/utils/iw/patches/001-nl80211_h_sync.patch b/package/network/utils/iw/patches/001-nl80211_h_sync.patch -index 7de2258..e5ea8f7 100644 +index 7de225859b71c2bb7627503b676aa7f2a122ccd9..e5ea8f7c8ad8eeb73f793ad6c536bb31d76d6868 100644 --- a/package/network/utils/iw/patches/001-nl80211_h_sync.patch +++ b/package/network/utils/iw/patches/001-nl80211_h_sync.patch @@ -8,7 +8,17 @@ @@ -25629,7 +25629,7 @@ index 7de2258..e5ea8f7 100644 ++ #endif /* __LINUX_NL80211_H */ diff --git a/package/network/utils/iw/patches/300-display_interface_TX_power.patch b/package/network/utils/iw/patches/300-display_interface_TX_power.patch -index 574c490..2cdf360 100644 +index 574c490318d03d09f6c6762be892b0814718dbbe..2cdf360cc57a512680e7f9f0b2450055c2c81d35 100644 --- a/package/network/utils/iw/patches/300-display_interface_TX_power.patch +++ b/package/network/utils/iw/patches/300-display_interface_TX_power.patch @@ -12,11 +12,9 @@ Signed-off-by: Johannes Berg @@ -25646,7 +25646,7 @@ index 574c490..2cdf360 100644 } diff --git a/package/network/utils/iw/patches/301-ibss_add_VHT80.patch b/package/network/utils/iw/patches/301-ibss_add_VHT80.patch -index 709fbb2..0627bcc 100644 +index 709fbb29146b3fe80f7af240d04dec8f5e96795a..0627bccb468cd31f8357a4b0fe3f3bee879230c6 100644 --- a/package/network/utils/iw/patches/301-ibss_add_VHT80.patch +++ b/package/network/utils/iw/patches/301-ibss_add_VHT80.patch @@ -14,8 +14,6 @@ Signed-off-by: Johannes Berg @@ -25686,7 +25686,7 @@ index 709fbb2..0627bcc 100644 chanmode_selected->width); NLA_PUT_U32(msg, NL80211_ATTR_CENTER_FREQ1, diff --git a/package/network/utils/iw/patches/302-ibss_use_MHz_instead_MHZ.patch b/package/network/utils/iw/patches/302-ibss_use_MHz_instead_MHZ.patch -index fc44427..f96d5ea 100644 +index fc4442792d4e55d14cfd85823202755b3c4678c0..f96d5eafdac4942f5e418dfba15242c83659d572 100644 --- a/package/network/utils/iw/patches/302-ibss_use_MHz_instead_MHZ.patch +++ b/package/network/utils/iw/patches/302-ibss_use_MHz_instead_MHZ.patch @@ -7,11 +7,9 @@ Signed-off-by: Johannes Berg @@ -25703,7 +25703,7 @@ index fc44427..f96d5ea 100644 .freq1_diff = 0, .chantype = NL80211_CHAN_NO_HT }, diff --git a/package/network/utils/iw/patches/303-mesh_add_VHT80.patch b/package/network/utils/iw/patches/303-mesh_add_VHT80.patch -index fe8dc21..956b050 100644 +index fe8dc21a19db12b056efcaa79b30987d0c1f8e10..956b0505e662b29c24cbdf18c17b1d5c6ed106f8 100644 --- a/package/network/utils/iw/patches/303-mesh_add_VHT80.patch +++ b/package/network/utils/iw/patches/303-mesh_add_VHT80.patch @@ -15,8 +15,6 @@ Signed-off-by: Sven Eckelmann @@ -25787,7 +25787,7 @@ index fe8dc21..956b050 100644 printf("\n\n"); } diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c -index d382453..20bb06e 100644 +index d382453b1918502240738b33c10cb08b113c7026..20bb06e4867a78aae60485d0c6c7a38e82c2997c 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.c @@ -39,6 +39,18 @@ __init void ap9x_pci_setup_wmac_led_pin(unsigned wmac, int pin) @@ -25831,7 +25831,7 @@ index d382453..20bb06e 100644 { switch (PCI_SLOT(dev->devfn)) { diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h -index ad288cb..d7c0185 100644 +index ad288cbdf90e1a93f914ee7c4d5edbc10a2dbdd1..d7c018565ea9248fd69cd9ec37083c4d5887a6ca 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h +++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-ap9x-pci.h @@ -12,6 +12,7 @@ @@ -25866,7 +25866,7 @@ index ad288cb..d7c0185 100644 { return NULL; diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h -index 30ce216..2c19f3b 100644 +index 30ce2165cb4fbd8513ef045930f6a4a5dbb59a3a..2c19f3b494582144806e175783efbc2e124ca873 100644 --- a/target/linux/generic/files/include/linux/ath9k_platform.h +++ b/target/linux/generic/files/include/linux/ath9k_platform.h @@ -31,6 +31,10 @@ struct ath9k_platform_data { diff --git a/patches/openwrt/0008-iwinfo-update-NanoStation-Loco-txpower-offsets.patch b/patches/openwrt/0008-iwinfo-update-NanoStation-Loco-txpower-offsets.patch index b45cf4e7..31275cc2 100644 --- a/patches/openwrt/0008-iwinfo-update-NanoStation-Loco-txpower-offsets.patch +++ b/patches/openwrt/0008-iwinfo-update-NanoStation-Loco-txpower-offsets.patch @@ -4,7 +4,7 @@ Subject: iwinfo: update NanoStation (Loco) txpower offsets diff --git a/package/network/utils/iwinfo/patches/001-update_nanostation_offsets.patch b/package/network/utils/iwinfo/patches/001-update_nanostation_offsets.patch new file mode 100644 -index 0000000..1e13570 +index 0000000000000000000000000000000000000000..1e13570fc2b585a8e33275116370f5438c899633 --- /dev/null +++ b/package/network/utils/iwinfo/patches/001-update_nanostation_offsets.patch @@ -0,0 +1,14 @@ diff --git a/patches/openwrt/0009-hostapd-prevent-channel-switch-for-5GHz.patch b/patches/openwrt/0009-hostapd-prevent-channel-switch-for-5GHz.patch index 712393b7..3eda369d 100644 --- a/patches/openwrt/0009-hostapd-prevent-channel-switch-for-5GHz.patch +++ b/patches/openwrt/0009-hostapd-prevent-channel-switch-for-5GHz.patch @@ -10,7 +10,7 @@ As a temporary fix, disable this channel switch function. diff --git a/package/network/services/hostapd/patches/900-no_channel_switch.patch b/package/network/services/hostapd/patches/900-no_channel_switch.patch new file mode 100644 -index 0000000..c614515 +index 0000000000000000000000000000000000000000..c6145156928ffa5a5195ca145b0655bb88c92091 --- /dev/null +++ b/package/network/services/hostapd/patches/900-no_channel_switch.patch @@ -0,0 +1,68 @@ diff --git a/patches/openwrt/0010-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch b/patches/openwrt/0010-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch index c1eaeefe..c9ba80f9 100644 --- a/patches/openwrt/0010-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch +++ b/patches/openwrt/0010-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch @@ -12,7 +12,7 @@ crash. diff --git a/target/linux/generic/patches-3.18/672-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch b/target/linux/generic/patches-3.18/672-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch new file mode 100644 -index 0000000..6e4b3da +index 0000000000000000000000000000000000000000..6e4b3da3ad820e789f57df71b33ccfc5eaead01e --- /dev/null +++ b/target/linux/generic/patches-3.18/672-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch @@ -0,0 +1,39 @@ diff --git a/patches/openwrt/0011-lua-fix-installation-of-headers-for-host-build.patch b/patches/openwrt/0011-lua-fix-installation-of-headers-for-host-build.patch index ab49ad65..c0045af3 100644 --- a/patches/openwrt/0011-lua-fix-installation-of-headers-for-host-build.patch +++ b/patches/openwrt/0011-lua-fix-installation-of-headers-for-host-build.patch @@ -3,7 +3,7 @@ Date: Tue, 29 Dec 2015 22:48:52 +0100 Subject: lua: fix installation of headers for host build diff --git a/package/utils/lua/Makefile b/package/utils/lua/Makefile -index 72d5631..c37d99b 100644 +index 72d56316b45dc484888d219aebd98e651edbe415..c37d99b485d58d955b86a033ea776adb54cfa414 100644 --- a/package/utils/lua/Makefile +++ b/package/utils/lua/Makefile @@ -140,6 +140,7 @@ define Host/Install diff --git a/patches/openwrt/0012-kernel-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-processes.patch b/patches/openwrt/0012-kernel-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-processes.patch index 72ad4f7d..b6397256 100644 --- a/patches/openwrt/0012-kernel-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-processes.patch +++ b/patches/openwrt/0012-kernel-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-processes.patch @@ -4,7 +4,7 @@ Subject: kernel: fs, seq_file: fallback to vmalloc instead of oom kill processes diff --git a/target/linux/generic/patches-3.18/089-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-.patch b/target/linux/generic/patches-3.18/089-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-.patch new file mode 100644 -index 0000000..cad56f4 +index 0000000000000000000000000000000000000000..cad56f4275287b73dd5e769ea34daee064ee8d69 --- /dev/null +++ b/target/linux/generic/patches-3.18/089-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-.patch @@ -0,0 +1,53 @@ diff --git a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch index f99e0f35..65f5ef3e 100644 --- a/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch +++ b/patches/openwrt/0013-fix-UBNT-XM-model-detection.patch @@ -5,7 +5,7 @@ Subject: fix UBNT XM model detection Signed-off-by: Neal Oakey diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index a9dca58..0aa1c86 100755 +index a9dca58847fe1fb62a69c5845fda3206407c6727..0aa1c865cbdeb0624147d4117d289a640d20a5ef 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -64,6 +64,40 @@ wndr3700_board_detect() { diff --git a/patches/openwrt/0014-base-files-implemented-basic-GPIO-control.patch b/patches/openwrt/0014-base-files-implemented-basic-GPIO-control.patch index c3f6c8d5..c67eb824 100644 --- a/patches/openwrt/0014-base-files-implemented-basic-GPIO-control.patch +++ b/patches/openwrt/0014-base-files-implemented-basic-GPIO-control.patch @@ -12,7 +12,7 @@ Backport of r46271 diff --git a/package/base-files/files/etc/init.d/gpio_switch b/package/base-files/files/etc/init.d/gpio_switch new file mode 100755 -index 0000000..1f1b44b +index 0000000000000000000000000000000000000000..1f1b44b2129ce2315943f6a10508eefb66412c48 --- /dev/null +++ b/package/base-files/files/etc/init.d/gpio_switch @@ -0,0 +1,42 @@ @@ -59,7 +59,7 @@ index 0000000..1f1b44b + } +} diff --git a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-files/files/lib/functions/uci-defaults.sh -index 5a8809d..6577ecd 100644 +index 5a8809d68c89ac0431919f15dad5f5c33351bbf2..6577ecdcde0c856b3e6dd1b9337f23cb782ef2be 100644 --- a/package/base-files/files/lib/functions/uci-defaults.sh +++ b/package/base-files/files/lib/functions/uci-defaults.sh @@ -2,6 +2,7 @@ @@ -102,7 +102,7 @@ index 5a8809d..6577ecd 100644 set network.loopback='interface' diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches new file mode 100644 -index 0000000..81d3982 +index 0000000000000000000000000000000000000000..81d3982ed8bf98e01ce2e161017f088a1d0f60dc --- /dev/null +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches @@ -0,0 +1,25 @@ diff --git a/patches/openwrt/0015-ar71xx-assign-proper-GPIO-pin-for-Ubiquiti-Nanostation-models.patch b/patches/openwrt/0015-ar71xx-assign-proper-GPIO-pin-for-Ubiquiti-Nanostation-models.patch index 523d5b6d..3bd8de4b 100644 --- a/patches/openwrt/0015-ar71xx-assign-proper-GPIO-pin-for-Ubiquiti-Nanostation-models.patch +++ b/patches/openwrt/0015-ar71xx-assign-proper-GPIO-pin-for-Ubiquiti-Nanostation-models.patch @@ -14,7 +14,7 @@ Signed-off-by: Lars Kruse Backport of r46922 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches -index 81d3982..b41f275 100644 +index 81d3982ed8bf98e01ce2e161017f088a1d0f60dc..b41f27554b1e3eac19c22af59731771631a1135b 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches @@ -10,10 +10,10 @@ board=$(ar71xx_board_name) diff --git a/patches/openwrt/0016-netifd-update-to-latest-version.patch b/patches/openwrt/0016-netifd-update-to-latest-version.patch index bbcb5fd8..31472cda 100644 --- a/patches/openwrt/0016-netifd-update-to-latest-version.patch +++ b/patches/openwrt/0016-netifd-update-to-latest-version.patch @@ -3,7 +3,7 @@ Date: Fri, 29 Jul 2016 21:28:24 +0200 Subject: netifd: update to latest version diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile -index 619024b..dc83ca6 100644 +index 619024bd708541dfb3bda28a963fc87a5d301a0d..dc83ca612bcd4c441e8fa0db77c98c8a1b97ad13 100644 --- a/package/network/config/netifd/Makefile +++ b/package/network/config/netifd/Makefile @@ -1,15 +1,15 @@ @@ -26,7 +26,7 @@ index 619024b..dc83ca6 100644 # CMAKE_INSTALL:=1 diff --git a/package/network/config/netifd/files/etc/init.d/network b/package/network/config/netifd/files/etc/init.d/network -index 542fc08..bdadbbc 100755 +index 542fc08958e001c2bfce7668ecd7d1c52a649e4e..bdadbbce6db6f9383a0e2c7fab25e7f5d8823091 100755 --- a/package/network/config/netifd/files/etc/init.d/network +++ b/package/network/config/netifd/files/etc/init.d/network @@ -21,7 +21,6 @@ start_service() { @@ -38,7 +38,7 @@ index 542fc08..bdadbbc 100755 procd_close_instance } diff --git a/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh b/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh -index 0e88af9..1d3a209 100755 +index 0e88af9e96ad85e7c51ff0b497ce71342d2d1568..1d3a2091060aac6b89d8d10f915b11b251011a85 100755 --- a/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh +++ b/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh @@ -12,6 +12,7 @@ proto_dhcp_init_config() { @@ -82,7 +82,7 @@ index 0e88af9..1d3a209 100755 proto_dhcp_renew() { diff --git a/package/network/config/netifd/files/sbin/ifup b/package/network/config/netifd/files/sbin/ifup -index af3aaa8..5515b91 100755 +index af3aaa8453ce93f52c2b89e743f43f9c509ad696..5515b91f76df2b5c36d46ac4b86dfc9bdcd78b1d 100755 --- a/package/network/config/netifd/files/sbin/ifup +++ b/package/network/config/netifd/files/sbin/ifup @@ -67,12 +67,10 @@ if [ -n "$setup_wifi" ] && grep -sq config /etc/config/wireless; then diff --git a/patches/openwrt/0017-x86-fix-platform_export_bootpart-for-Xen-virtual-disks.patch b/patches/openwrt/0017-x86-fix-platform_export_bootpart-for-Xen-virtual-disks.patch index 4e0ce138..20ab565d 100644 --- a/patches/openwrt/0017-x86-fix-platform_export_bootpart-for-Xen-virtual-disks.patch +++ b/patches/openwrt/0017-x86-fix-platform_export_bootpart-for-Xen-virtual-disks.patch @@ -11,7 +11,7 @@ Signed-off-by: Alexander Dahl Suggested-by: Matthias Schiffer diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh -index 73ab5ef..adc119c 100644 +index 73ab5ef0794c942495d18865fa2c2498b84e63e6..adc119c897ed840aef17c2041a48244d0922564e 100644 --- a/target/linux/x86/base-files/lib/upgrade/platform.sh +++ b/target/linux/x86/base-files/lib/upgrade/platform.sh @@ -17,7 +17,7 @@ platform_export_bootpart() { diff --git a/patches/openwrt/0018-Support-LibreSSL-as-provider-of-openssl.patch b/patches/openwrt/0018-Support-LibreSSL-as-provider-of-openssl.patch index cf627622..566ec6c2 100644 --- a/patches/openwrt/0018-Support-LibreSSL-as-provider-of-openssl.patch +++ b/patches/openwrt/0018-Support-LibreSSL-as-provider-of-openssl.patch @@ -13,7 +13,7 @@ Signed-off-by: Marek Behun Backport of r48267 diff --git a/include/prereq-build.mk b/include/prereq-build.mk -index 32c4ada..f36d57c 100644 +index 32c4adabb748c4026d507d40769b3201e2ac5599..f36d57ce06c46be7ac33f3034ad08a3ce603089d 100644 --- a/include/prereq-build.mk +++ b/include/prereq-build.mk @@ -151,7 +151,7 @@ $(eval $(call SetupHostCommand,file,Please install the 'file' package, \ diff --git a/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch b/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch index 5584a904..358b3da7 100644 --- a/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch +++ b/patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch @@ -10,7 +10,7 @@ Signed-off-by: Matthias Schiffer Backport of r49105 diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 762cd76..024e493 100755 +index 762cd760ceb9ff3917903dfd26a5a7a42175abfe..024e4930949c927efd36c3ac67cd351dcaa4bf7b 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -66,6 +66,10 @@ tplink_get_image_hwid() { diff --git a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch index 9ea96a61..55ad0059 100644 --- a/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch +++ b/patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch @@ -11,7 +11,7 @@ Signed-off-by: Matthias Schiffer Backport of r49106 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 0aa1c86..96a37b4 100755 +index 0aa1c865cbdeb0624147d4117d289a640d20a5ef..96a37b4bec019d06c9283afc44b7961d150c05fb 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -133,7 +133,7 @@ tplink_board_detect() { diff --git a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch index 7f4173eb..e06c7335 100644 --- a/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch +++ b/patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch @@ -12,7 +12,7 @@ Signed-off-by: Matthias Schiffer Backport of r49107 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 96a37b4..6c10617 100755 +index 96a37b4bec019d06c9283afc44b7961d150c05fb..6c106179bfa0c01308a03678aef1b7cf4caaf05b 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -162,6 +162,10 @@ tplink_board_detect() { diff --git a/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch b/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch index 4793bbac..455078eb 100644 --- a/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch +++ b/patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch @@ -11,7 +11,7 @@ Signed off by: Norbert Wegener Backport of r47849 diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index a8073f2..0783381 100644 +index a8073f2ecadce8404dde77278302202fe494cd75..0783381baeddef2064df8faff89c49c2bed6a28b 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -476,6 +476,15 @@ define Device/tl-wr710n-v2 diff --git a/patches/openwrt/0023-xtables-addons-build-fix-configure-compatiblity-with-POSIX-shells.patch b/patches/openwrt/0023-xtables-addons-build-fix-configure-compatiblity-with-POSIX-shells.patch index fa4b76a5..df64e7c3 100644 --- a/patches/openwrt/0023-xtables-addons-build-fix-configure-compatiblity-with-POSIX-shells.patch +++ b/patches/openwrt/0023-xtables-addons-build-fix-configure-compatiblity-with-POSIX-shells.patch @@ -4,7 +4,7 @@ Subject: xtables-addons: build: fix configure compatiblity with POSIX shells diff --git a/package/network/utils/xtables-addons/patches/001-build-fix-configure-compatiblity-with-POSIX-shells.patch b/package/network/utils/xtables-addons/patches/001-build-fix-configure-compatiblity-with-POSIX-shells.patch new file mode 100644 -index 0000000..e0b11b5 +index 0000000000000000000000000000000000000000..e0b11b5459e5e4cd49c80b76ed945eb96aa96e8d --- /dev/null +++ b/package/network/utils/xtables-addons/patches/001-build-fix-configure-compatiblity-with-POSIX-shells.patch @@ -0,0 +1,51 @@ @@ -60,7 +60,7 @@ index 0000000..e0b11b5 +2.8.0 + diff --git a/package/network/utils/xtables-addons/patches/002-fix-kernel-version-detection.patch b/package/network/utils/xtables-addons/patches/002-fix-kernel-version-detection.patch -index d3b7caa..6a7a099 100644 +index d3b7caa634ba0cc33b01bbf795f1f70995cb3dc6..6a7a099fcc3aad162fc2aaba70dac54882c2b464 100644 --- a/package/network/utils/xtables-addons/patches/002-fix-kernel-version-detection.patch +++ b/package/network/utils/xtables-addons/patches/002-fix-kernel-version-detection.patch @@ -1,1954 +1,11 @@ diff --git a/patches/openwrt/0024-tools-add-tar-host-build-required-for-sort-name-which-was-only-added-in-the-latest-version.patch b/patches/openwrt/0024-tools-add-tar-host-build-required-for-sort-name-which-was-only-added-in-the-latest-version.patch index 52fb08db..b62bb8fb 100644 --- a/patches/openwrt/0024-tools-add-tar-host-build-required-for-sort-name-which-was-only-added-in-the-latest-version.patch +++ b/patches/openwrt/0024-tools-add-tar-host-build-required-for-sort-name-which-was-only-added-in-the-latest-version.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau Backport of r46876 diff --git a/tools/Makefile b/tools/Makefile -index c6cded8..98ce8c5 100644 +index c6cded8eccd81c422f99e7ee50754c4bc66decc7..98ce8c5f1577981136b277a800a3edd5edd4941e 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -81,6 +81,9 @@ endif @@ -22,7 +22,7 @@ index c6cded8..98ce8c5 100644 diff --git a/tools/tar/Makefile b/tools/tar/Makefile new file mode 100644 -index 0000000..975e783 +index 0000000000000000000000000000000000000000..975e7835ef09131326ef10a7951c3866d6050801 --- /dev/null +++ b/tools/tar/Makefile @@ -0,0 +1,30 @@ @@ -58,7 +58,7 @@ index 0000000..975e783 +$(eval $(call HostBuild)) diff --git a/tools/tar/patches/100-fix_xattr_disable.patch b/tools/tar/patches/100-fix_xattr_disable.patch new file mode 100644 -index 0000000..5735bd2 +index 0000000000000000000000000000000000000000..5735bd2364a4f324b54a3a49826921ead905d06f --- /dev/null +++ b/tools/tar/patches/100-fix_xattr_disable.patch @@ -0,0 +1,17 @@ diff --git a/patches/openwrt/0025-tools-compile-flock-before-everything-else.patch b/patches/openwrt/0025-tools-compile-flock-before-everything-else.patch index c9291166..5cfd010a 100644 --- a/patches/openwrt/0025-tools-compile-flock-before-everything-else.patch +++ b/patches/openwrt/0025-tools-compile-flock-before-everything-else.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau Backport of r48413 diff --git a/tools/Makefile b/tools/Makefile -index 98ce8c5..3402c08 100644 +index 98ce8c5f1577981136b277a800a3edd5edd4941e..3402c08d5c6729a510446a3e9cf586f2d8e15be4 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -26,7 +26,7 @@ endif diff --git a/patches/openwrt/0026-rules.mk-make-the-locked-template-available-even-if-flock-has-not-been-built-yet-fall-back-to-unlocked-shell-command.patch b/patches/openwrt/0026-rules.mk-make-the-locked-template-available-even-if-flock-has-not-been-built-yet-fall-back-to-unlocked-shell-command.patch index 5e851cdf..e1146500 100644 --- a/patches/openwrt/0026-rules.mk-make-the-locked-template-available-even-if-flock-has-not-been-built-yet-fall-back-to-unlocked-shell-command.patch +++ b/patches/openwrt/0026-rules.mk-make-the-locked-template-available-even-if-flock-has-not-been-built-yet-fall-back-to-unlocked-shell-command.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau Backport of r48414 diff --git a/rules.mk b/rules.mk -index 9d0134d..ece5026 100644 +index 9d0134d2b26a52b74d30546cc3d51f7e71d1bc75..ece502609bd08af21be782a706f0bf6599895568 100644 --- a/rules.mk +++ b/rules.mk @@ -310,12 +310,16 @@ endef diff --git a/patches/openwrt/0027-build-add-locking-for-downloads-fixes-race-conditions-with-multiple-variants.patch b/patches/openwrt/0027-build-add-locking-for-downloads-fixes-race-conditions-with-multiple-variants.patch index ffa18527..47fef848 100644 --- a/patches/openwrt/0027-build-add-locking-for-downloads-fixes-race-conditions-with-multiple-variants.patch +++ b/patches/openwrt/0027-build-add-locking-for-downloads-fixes-race-conditions-with-multiple-variants.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau Backport of r48416 diff --git a/include/download.mk b/include/download.mk -index e518cce..9176b11 100644 +index e518cce4b2793152b7f4ef92509f2be07fb5cd62..9176b11c836123a37533c3d6cbaa2650a4f7c73d 100644 --- a/include/download.mk +++ b/include/download.mk @@ -182,6 +182,6 @@ define Download diff --git a/patches/openwrt/0028-download.mk-fix-packed-checkout-mirroring-support.patch b/patches/openwrt/0028-download.mk-fix-packed-checkout-mirroring-support.patch index 5c0572c1..6dbe8b68 100644 --- a/patches/openwrt/0028-download.mk-fix-packed-checkout-mirroring-support.patch +++ b/patches/openwrt/0028-download.mk-fix-packed-checkout-mirroring-support.patch @@ -12,7 +12,7 @@ Signed-off-by: Jo-Philipp Wich Backport of r48733 diff --git a/include/download.mk b/include/download.mk -index 9176b11..130bbc5 100644 +index 9176b11c836123a37533c3d6cbaa2650a4f7c73d..130bbc57ba89b4ad0b8e8600f45bf553ad6ecfa1 100644 --- a/include/download.mk +++ b/include/download.mk @@ -48,7 +48,7 @@ define DownloadMethod/default diff --git a/patches/openwrt/0029-kernel-backport-spi-nor-driver-from-4.4.9.patch b/patches/openwrt/0029-kernel-backport-spi-nor-driver-from-4.4.9.patch index c15073e9..382df737 100644 --- a/patches/openwrt/0029-kernel-backport-spi-nor-driver-from-4.4.9.patch +++ b/patches/openwrt/0029-kernel-backport-spi-nor-driver-from-4.4.9.patch @@ -3,7 +3,7 @@ Date: Sat, 7 May 2016 00:07:51 +0200 Subject: kernel: backport spi-nor driver from 4.4.9 diff --git a/target/linux/ar71xx/patches-3.18/407-mtd-m25p80-allow-to-pass-probe-types-via-platform-data.patch b/target/linux/ar71xx/patches-3.18/407-mtd-m25p80-allow-to-pass-probe-types-via-platform-data.patch -index 568f516..6a91320 100644 +index 568f5161b1e4639c005577ea46c2e0411f95ec7c..6a9132032ff1cefae213464d3212ef0d4e4b8011 100644 --- a/target/linux/ar71xx/patches-3.18/407-mtd-m25p80-allow-to-pass-probe-types-via-platform-data.patch +++ b/target/linux/ar71xx/patches-3.18/407-mtd-m25p80-allow-to-pass-probe-types-via-platform-data.patch @@ -1,11 +1,11 @@ @@ -22,7 +22,7 @@ index 568f516..6a91320 100644 + &ppdata, data ? data->parts : NULL, diff --git a/target/linux/ar71xx/patches-3.18/412-mtd-m25p80-zero-partition-parser-data.patch b/target/linux/ar71xx/patches-3.18/412-mtd-m25p80-zero-partition-parser-data.patch -index d51694d..175acf6 100644 +index d51694d9fd2d6fa5a519ce27108c964b1b6f32f8..175acf630e0d0437936066b51ea086cf39740b30 100644 --- a/target/linux/ar71xx/patches-3.18/412-mtd-m25p80-zero-partition-parser-data.patch +++ b/target/linux/ar71xx/patches-3.18/412-mtd-m25p80-zero-partition-parser-data.patch @@ -1,10 +1,10 @@ @@ -39,7 +39,7 @@ index d51694d..175acf6 100644 - return mtd_device_parse_register(&flash->mtd, + return mtd_device_parse_register(&nor->mtd, diff --git a/target/linux/ar71xx/patches-3.18/462-mtd-m25p80-set-spi-transfer-type.patch b/target/linux/ar71xx/patches-3.18/462-mtd-m25p80-set-spi-transfer-type.patch -index 3320e5b..11bf9ff 100644 +index 3320e5b845bdf2843f32e52b5b620ce880fd4e96..11bf9ff71b609b03239179bcd8977c2202f5c8cf 100644 --- a/target/linux/ar71xx/patches-3.18/462-mtd-m25p80-set-spi-transfer-type.patch +++ b/target/linux/ar71xx/patches-3.18/462-mtd-m25p80-set-spi-transfer-type.patch @@ -1,6 +1,6 @@ @@ -51,7 +51,7 @@ index 3320e5b..11bf9ff 100644 m25p_addr2cmd(nor, from, flash->command); diff --git a/target/linux/ar71xx/patches-3.18/464-spi-ath79-fix-fast-flash-read.patch b/target/linux/ar71xx/patches-3.18/464-spi-ath79-fix-fast-flash-read.patch -index e48665d..758d231 100644 +index e48665d6a09fdcc77d027274016c24fe78e8d95a..758d23181d49eff6afeb35b1fbbd8f36efa2cfca 100644 --- a/target/linux/ar71xx/patches-3.18/464-spi-ath79-fix-fast-flash-read.patch +++ b/target/linux/ar71xx/patches-3.18/464-spi-ath79-fix-fast-flash-read.patch @@ -1,6 +1,6 @@ @@ -72,7 +72,7 @@ index e48665d..758d231 100644 u32 speed_hz; enum spi_transfer_type type; diff --git a/target/linux/brcm63xx/patches-3.18/202-MTD-DEVICES-m25p80-use-parsers-if-provided-in-flash-.patch b/target/linux/brcm63xx/patches-3.18/202-MTD-DEVICES-m25p80-use-parsers-if-provided-in-flash-.patch -index b949694..be62e67 100644 +index b94969406deed4d6b8d51789235cd3e63e432c7c..be62e6789c883a5854a7bc9fae6dcc882090800f 100644 --- a/target/linux/brcm63xx/patches-3.18/202-MTD-DEVICES-m25p80-use-parsers-if-provided-in-flash-.patch +++ b/target/linux/brcm63xx/patches-3.18/202-MTD-DEVICES-m25p80-use-parsers-if-provided-in-flash-.patch @@ -11,12 +11,12 @@ Signed-off-by: Jonas Gorski @@ -92,7 +92,7 @@ index b949694..be62e67 100644 data ? data->parts : NULL, data ? data->nr_parts : 0); diff --git a/target/linux/brcm63xx/patches-3.18/203-MTD-DEVICES-m25p80-add-support-for-limiting-reads.patch b/target/linux/brcm63xx/patches-3.18/203-MTD-DEVICES-m25p80-add-support-for-limiting-reads.patch -index 740fb2d..3877442 100644 +index 740fb2dafc4ece9e0c88630a1ad2b800f763ed59..3877442d21eb8f6a9fdacc415c60be78d61b3c5f 100644 --- a/target/linux/brcm63xx/patches-3.18/203-MTD-DEVICES-m25p80-add-support-for-limiting-reads.patch +++ b/target/linux/brcm63xx/patches-3.18/203-MTD-DEVICES-m25p80-add-support-for-limiting-reads.patch @@ -11,15 +11,15 @@ Signed-off-by: Jonas Gorski @@ -133,7 +133,7 @@ index 740fb2d..3877442 100644 flash_name = spi->modalias; diff --git a/target/linux/brcm63xx/patches-3.18/414-MTD-m25p80-allow-passing-pp_data.patch b/target/linux/brcm63xx/patches-3.18/414-MTD-m25p80-allow-passing-pp_data.patch -index b7bf57f..e421e9a 100644 +index b7bf57f697961a06d1ccef93ce4474f34f5e03e4..e421e9adbefb45fa837f686e253636781842fa7e 100644 --- a/target/linux/brcm63xx/patches-3.18/414-MTD-m25p80-allow-passing-pp_data.patch +++ b/target/linux/brcm63xx/patches-3.18/414-MTD-m25p80-allow-passing-pp_data.patch @@ -10,7 +10,7 @@ Subject: [PATCH 64/79] MTD: m25p80: allow passing pp_data @@ -147,7 +147,7 @@ index b7bf57f..e421e9a 100644 diff --git a/target/linux/generic/patches-3.18/043-mtd_GD25Q128B_support_backport_from_3.19.patch b/target/linux/generic/patches-3.18/043-mtd_GD25Q128B_support_backport_from_3.19.patch deleted file mode 100644 -index 4d0403b..0000000 +index 4d0403bfd8a4a076cc9e91349463593adb79047c..0000000000000000000000000000000000000000 --- a/target/linux/generic/patches-3.18/043-mtd_GD25Q128B_support_backport_from_3.19.patch +++ /dev/null @@ -1,10 +0,0 @@ @@ -163,7 +163,7 @@ index 4d0403b..0000000 - { "160s33b", INFO(0x898911, 0, 64 * 1024, 32, 0) }, diff --git a/target/linux/generic/patches-3.18/093-m25p80_spi-nor_update_to_4.4.9.patch b/target/linux/generic/patches-3.18/093-m25p80_spi-nor_update_to_4.4.9.patch new file mode 100644 -index 0000000..5f74d3a +index 0000000000000000000000000000000000000000..5f74d3a07ba62c9e1da0a0b2aef8abe309efdbb9 --- /dev/null +++ b/target/linux/generic/patches-3.18/093-m25p80_spi-nor_update_to_4.4.9.patch @@ -0,0 +1,1579 @@ @@ -1747,7 +1747,7 @@ index 0000000..5f74d3a + }; + diff --git a/target/linux/generic/patches-3.18/462-m25p80-mx-disable-software-protection.patch b/target/linux/generic/patches-3.18/462-m25p80-mx-disable-software-protection.patch -index fef483a..eb99609 100644 +index fef483a67d0f7c3f25a105f5f1d0faef4dfd1a38..eb99609fe29b136a2283ef347af6b1db97ad4978 100644 --- a/target/linux/generic/patches-3.18/462-m25p80-mx-disable-software-protection.patch +++ b/target/linux/generic/patches-3.18/462-m25p80-mx-disable-software-protection.patch @@ -1,10 +1,14 @@ @@ -1772,7 +1772,7 @@ index fef483a..eb99609 100644 write_sr(nor, 0); diff --git a/target/linux/generic/patches-3.18/472-mtd-m25p80-add-support-for-Winbond-W25X05-flash.patch b/target/linux/generic/patches-3.18/472-mtd-m25p80-add-support-for-Winbond-W25X05-flash.patch deleted file mode 100644 -index dca6895..0000000 +index dca6895c1448a302f829bcfdde4842f0a000061d..0000000000000000000000000000000000000000 --- a/target/linux/generic/patches-3.18/472-mtd-m25p80-add-support-for-Winbond-W25X05-flash.patch +++ /dev/null @@ -1,20 +0,0 @@ @@ -1798,7 +1798,7 @@ index dca6895..0000000 - { "w25x40", INFO(0xef3013, 0, 64 * 1024, 8, SECT_4K) }, diff --git a/target/linux/generic/patches-3.18/473-mtd-spi-nor-add-support-for-the-Macronix-MX25L512E-S.patch b/target/linux/generic/patches-3.18/473-mtd-spi-nor-add-support-for-the-Macronix-MX25L512E-S.patch deleted file mode 100644 -index 9ba7a4a..0000000 +index 9ba7a4ab2f701440e78da0f9a2e2845f68652267..0000000000000000000000000000000000000000 --- a/target/linux/generic/patches-3.18/473-mtd-spi-nor-add-support-for-the-Macronix-MX25L512E-S.patch +++ /dev/null @@ -1,21 +0,0 @@ @@ -1825,7 +1825,7 @@ index 9ba7a4a..0000000 - { "mx25l8005", INFO(0xc22014, 0, 64 * 1024, 16, 0) }, diff --git a/target/linux/generic/patches-3.18/474-mtd-spi-nor-add-support-for-the-ISSI-SI25CD512-SPI-f.patch b/target/linux/generic/patches-3.18/474-mtd-spi-nor-add-support-for-the-ISSI-SI25CD512-SPI-f.patch deleted file mode 100644 -index b06ac73..0000000 +index b06ac73fae3fac808067b8643ac939adc56d35cb..0000000000000000000000000000000000000000 --- a/target/linux/generic/patches-3.18/474-mtd-spi-nor-add-support-for-the-ISSI-SI25CD512-SPI-f.patch +++ /dev/null @@ -1,22 +0,0 @@ @@ -1853,7 +1853,7 @@ index b06ac73..0000000 - { "mx25l2005a", INFO(0xc22012, 0, 64 * 1024, 4, SECT_4K) }, diff --git a/target/linux/lantiq/patches-3.18/0022-MTD-m25p80-allow-loading-mtd-name-from-OF.patch b/target/linux/lantiq/patches-3.18/0022-MTD-m25p80-allow-loading-mtd-name-from-OF.patch deleted file mode 100644 -index 203eb94..0000000 +index 203eb9495efe583abc1e7adc21f9c6d0e61e4e29..0000000000000000000000000000000000000000 --- a/target/linux/lantiq/patches-3.18/0022-MTD-m25p80-allow-loading-mtd-name-from-OF.patch +++ /dev/null @@ -1,44 +0,0 @@ @@ -1902,7 +1902,7 @@ index 203eb94..0000000 - /* For some (historical?) reason many platforms provide two different - * names in flash_platform_data: "name" and "type". Quite often name is diff --git a/target/linux/mpc85xx/files/arch/powerpc/boot/dts/tl-wdr4900-v1.dts b/target/linux/mpc85xx/files/arch/powerpc/boot/dts/tl-wdr4900-v1.dts -index 2beb39c..21f823d 100644 +index 2beb39cf1f2b22d99207b2298bd550a71c8d7666..21f823d57ca1b7b072e060dd0460ffd4b251ec77 100644 --- a/target/linux/mpc85xx/files/arch/powerpc/boot/dts/tl-wdr4900-v1.dts +++ b/target/linux/mpc85xx/files/arch/powerpc/boot/dts/tl-wdr4900-v1.dts @@ -37,7 +37,7 @@ @@ -1915,7 +1915,7 @@ index 2beb39c..21f823d 100644 spi-max-frequency = <25000000>; diff --git a/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch b/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch -index 1716e1c..8dc181a 100644 +index 1716e1cc499ede404c509a40370ff6fdeec0f1dc..8dc181afb84e4932b73b4a7a45daadb0da78ca20 100644 --- a/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch +++ b/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch @@ -1,33 +1,18 @@ diff --git a/patches/openwrt/0030-kernel-mtd-spi-nor-wait-until-status-register-writes-are-ready.patch b/patches/openwrt/0030-kernel-mtd-spi-nor-wait-until-status-register-writes-are-ready.patch index f90f9c61..4bab4beb 100644 --- a/patches/openwrt/0030-kernel-mtd-spi-nor-wait-until-status-register-writes-are-ready.patch +++ b/patches/openwrt/0030-kernel-mtd-spi-nor-wait-until-status-register-writes-are-ready.patch @@ -4,7 +4,7 @@ Subject: kernel: mtd: spi-nor: wait until status register writes are ready diff --git a/target/linux/generic/patches-3.18/094-0001-mtd-spi-nor-wait-until-lock-unlock-operations-are-re.patch b/target/linux/generic/patches-3.18/094-0001-mtd-spi-nor-wait-until-lock-unlock-operations-are-re.patch new file mode 100644 -index 0000000..2c2e5f3 +index 0000000000000000000000000000000000000000..2c2e5f32259416f0cc7f342e420ffbd32c139d97 --- /dev/null +++ b/target/linux/generic/patches-3.18/094-0001-mtd-spi-nor-wait-until-lock-unlock-operations-are-re.patch @@ -0,0 +1,66 @@ @@ -76,7 +76,7 @@ index 0000000..2c2e5f3 + /* diff --git a/target/linux/generic/patches-3.18/094-0002-mtd-spi-nor-wait-for-SR_WIP-to-clear-on-initial-unlo.patch b/target/linux/generic/patches-3.18/094-0002-mtd-spi-nor-wait-for-SR_WIP-to-clear-on-initial-unlo.patch new file mode 100644 -index 0000000..a0573d5 +index 0000000000000000000000000000000000000000..a0573d5aea939c965cb44b2e72a2b7d498b0a5cd --- /dev/null +++ b/target/linux/generic/patches-3.18/094-0002-mtd-spi-nor-wait-for-SR_WIP-to-clear-on-initial-unlo.patch @@ -0,0 +1,33 @@ diff --git a/patches/openwrt/0031-kernel-mtd-spi-nor-unlock-Winbond-flashs.patch b/patches/openwrt/0031-kernel-mtd-spi-nor-unlock-Winbond-flashs.patch index 655f9ab1..0a6bd961 100644 --- a/patches/openwrt/0031-kernel-mtd-spi-nor-unlock-Winbond-flashs.patch +++ b/patches/openwrt/0031-kernel-mtd-spi-nor-unlock-Winbond-flashs.patch @@ -4,7 +4,7 @@ Subject: kernel: mtd: spi-nor: unlock Winbond flashs diff --git a/target/linux/generic/patches-3.18/463-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch b/target/linux/generic/patches-3.18/463-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch new file mode 100644 -index 0000000..4682b7a +index 0000000000000000000000000000000000000000..4682b7a77b160a0814012d26f0edf1a7bfaf5312 --- /dev/null +++ b/target/linux/generic/patches-3.18/463-Revert-mtd-spi-nor-fix-Spansion-regressions-aliased-.patch @@ -0,0 +1,46 @@ diff --git a/patches/openwrt/0032-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch b/patches/openwrt/0032-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch index f7c393a3..6e0670cc 100644 --- a/patches/openwrt/0032-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch +++ b/patches/openwrt/0032-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch @@ -11,7 +11,7 @@ Signed-off-by: Miaoqing Pan Backport of OpenWrt r46971 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c -index ff94e2e..31d2438 100644 +index ff94e2ec3733b9473c4c3191cb47bd4ba8ac784d..31d24388d274b92e01642ad6d7f59d22f80dc2a6 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c @@ -633,7 +633,6 @@ static int __init ath79_setup_phy_if_mode(unsigned int id, diff --git a/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch b/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch index 5d05b286..32d9654f 100644 --- a/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch +++ b/patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau Backport of OpenWrt r47363 diff --git a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch -index 0da8142..2bb4286 100644 +index 0da81426ca7b1b1db46e869745f0ed00496bef78..2bb4286e5d805ff3c47486a1f091d2b5e6d78373 100644 --- a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch +++ b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch @@ -529,7 +529,7 @@ diff --git a/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch b/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch index 6ca69dda..8e63c9d8 100644 --- a/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch +++ b/patches/openwrt/0034-ar71xx-update-QCA956x-support.patch @@ -12,7 +12,7 @@ Signed-off-by: Roman Yeryomin Backport of OpenWrt r47981 diff --git a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch -index 2bb4286..61b8976 100644 +index 2bb4286e5d805ff3c47486a1f091d2b5e6d78373..61b897690a03fd46d2ea95451a09598b272266f9 100644 --- a/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch +++ b/target/linux/ar71xx/patches-3.18/735-MIPS-ath79-add-support-for-QCA956x-SoC.patch @@ -105,7 +105,7 @@ @@ -380,7 +380,7 @@ index 2bb4286..61b8976 100644 + extern void __iomem *ath79_ddr_base; diff --git a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch -index a36b8c3..44c9c62 100644 +index a36b8c319f7d08fe5daab867a10edca4dfcd4706..44c9c6281e683792af37b6f9b32357b2a4ec2fd4 100644 --- a/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch +++ b/target/linux/ar71xx/patches-3.18/739-MIPS-ath79-add-gpio-func-register-for-QCA955x-SoC.patch @@ -9,8 +9,8 @@ diff --git a/patches/openwrt/0035-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch b/patches/openwrt/0035-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch index 13161242..3b79882d 100644 --- a/patches/openwrt/0035-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch +++ b/patches/openwrt/0035-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau Backport of OpenWrt r48650 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c -index 31d2438..2efb9c7 100644 +index 31d24388d274b92e01642ad6d7f59d22f80dc2a6..2efb9c70ff31f5c11bcdff6c6326743e4d5b5a11 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c @@ -198,7 +198,6 @@ void __init ath79_register_mdio(unsigned int id, u32 phy_mask) diff --git a/patches/openwrt/0036-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch b/patches/openwrt/0036-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch index 7594cf2f..a0aaccb7 100644 --- a/patches/openwrt/0036-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch +++ b/patches/openwrt/0036-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch @@ -7,7 +7,7 @@ Signed-off-by: Felix Fietkau Backport of OpenWrt r48651 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c -index 2efb9c7..12a376e 100644 +index 2efb9c70ff31f5c11bcdff6c6326743e4d5b5a11..12a376e1322ae14dd714297ed5f8319ae09eeb64 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c @@ -183,7 +183,8 @@ void __init ath79_register_mdio(unsigned int id, u32 phy_mask) diff --git a/patches/openwrt/0037-ar71xx-fix-qca956x-ethernet-initialization.patch b/patches/openwrt/0037-ar71xx-fix-qca956x-ethernet-initialization.patch index 6cc5e950..28481f4b 100644 --- a/patches/openwrt/0037-ar71xx-fix-qca956x-ethernet-initialization.patch +++ b/patches/openwrt/0037-ar71xx-fix-qca956x-ethernet-initialization.patch @@ -10,7 +10,7 @@ Signed-off-by: Weijie Gao Backport of OpenWrt r48937 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c -index 12a376e..b43c80a 100644 +index 12a376e1322ae14dd714297ed5f8319ae09eeb64..b43c80a3762ddebe46d8443660714922165a2287 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/dev-eth.c @@ -271,6 +271,7 @@ void __init ath79_register_mdio(unsigned int id, u32 phy_mask) diff --git a/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch index 79318eca..3e83f2be 100644 --- a/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch +++ b/patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch @@ -8,7 +8,7 @@ Signed-off-by: P.Wassi Backport of OpenWrt r48711 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 486879f..3adc449 100644 +index 486879f512cd28f1b80e828809359b55956fbcc3..3adc449b23e9c590d57cdd914b6c8d990a50e0b0 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -309,7 +309,8 @@ get_status_led() { @@ -22,7 +22,7 @@ index 486879f..3adc449 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 032c671..a79376a 100755 +index 032c671341fd526c7e4e32cb9cba42217165cf5c..a79376a8cff56b144268130a24a930ff2bee95cd 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -369,6 +369,7 @@ tl-wa901nd-v3 |\ @@ -34,7 +34,7 @@ index 032c671..a79376a 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 6c10617..ecf584d 100755 +index 6c106179bfa0c01308a03678aef1b7cf4caaf05b..ecf584d30ecae7a0e2601bed38c6cfad42cab124 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -902,6 +902,9 @@ ar71xx_board_detect() { @@ -48,7 +48,7 @@ index 6c10617..ecf584d 100755 name="uap-pro" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 024e493..fff1c3c 100755 +index 024e4930949c927efd36c3ac67cd351dcaa4bf7b..fff1c3c912cee678ea88e225958b28ceb4c4b742 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -252,6 +252,7 @@ platform_check_image() { @@ -60,7 +60,7 @@ index 024e493..fff1c3c 100755 carambola2 | \ weio ) diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index e0d52d9..a068cc5 100644 +index e0d52d9fcbad980f7220dd1f93388359e52dc8f9..a068cc5768aed6f29a67de27d24f00dc57e0695a 100644 --- a/target/linux/ar71xx/config-3.18 +++ b/target/linux/ar71xx/config-3.18 @@ -141,6 +141,7 @@ CONFIG_ATH79_MACH_TL_WR941ND=y @@ -82,7 +82,7 @@ index e0d52d9..a068cc5 100644 CONFIG_SPI_ATH79=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c new file mode 100644 -index 0000000..3617ca7 +index 0000000000000000000000000000000000000000..3617ca7d5fc0fff00fce9741b5d9169fac8c83c8 --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c @@ -0,0 +1,109 @@ @@ -196,7 +196,7 @@ index 0000000..3617ca7 +MIPS_MACHINE(ATH79_MACH_UBNT_UNIFIAC, "UBNT-UF-AC", "Ubiquiti UniFi-AC", + ubnt_unifiac_setup); diff --git a/target/linux/ar71xx/generic/profiles/ubnt.mk b/target/linux/ar71xx/generic/profiles/ubnt.mk -index d8e24d0..94eff18 100644 +index d8e24d0032d75231d27be8207fe55294fd108282..94eff18318264de85ea459e94280c88726404888 100644 --- a/target/linux/ar71xx/generic/profiles/ubnt.mk +++ b/target/linux/ar71xx/generic/profiles/ubnt.mk @@ -38,6 +38,17 @@ endef @@ -218,7 +218,7 @@ index d8e24d0..94eff18 100644 NAME:=Ubiquiti UniFiAP Outdoor PACKAGES:= diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 0783381..aaaf89a 100644 +index 0783381baeddef2064df8faff89c49c2bed6a28b..aaaf89ac1a369431cf9bc15c13e774ba6826bbf3 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -740,6 +740,16 @@ define Device/oolite @@ -239,7 +239,7 @@ index 0783381..aaaf89a 100644 # $(1): rootfs type. diff --git a/target/linux/ar71xx/mikrotik/config-default b/target/linux/ar71xx/mikrotik/config-default -index b8a7bf1..2b1fe24 100644 +index b8a7bf13f2582b0b458d17f5e4b266a6e110faa1..2b1fe2491c7a00449453efdc4969015ec1b28291 100644 --- a/target/linux/ar71xx/mikrotik/config-default +++ b/target/linux/ar71xx/mikrotik/config-default @@ -97,6 +97,7 @@ CONFIG_ATH79_MACH_RBSXTLITE=y @@ -251,7 +251,7 @@ index b8a7bf1..2b1fe24 100644 # CONFIG_ATH79_MACH_WLAE_AG300N is not set # CONFIG_ATH79_MACH_WLR8100 is not set diff --git a/target/linux/ar71xx/nand/config-default b/target/linux/ar71xx/nand/config-default -index 626d676..f62cf1a 100644 +index 626d676c621b90feb31a88e7b8c2daa587a8f603..f62cf1a4399718b2f4e94a974d26ddaf8d46a8ec 100644 --- a/target/linux/ar71xx/nand/config-default +++ b/target/linux/ar71xx/nand/config-default @@ -59,6 +59,7 @@ @@ -263,7 +263,7 @@ index 626d676..f62cf1a 100644 # CONFIG_ATH79_MACH_WLAE_AG300N is not set # CONFIG_ATH79_MACH_WNDAP360 is not set diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index 76aeb94..27dc73f 100644 +index 76aeb94412e6f44b9a81fc44858e9c4540a08845..27dc73ffa239979a799bbede72440907e9d0e187 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ diff --git a/patches/openwrt/0039-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch b/patches/openwrt/0039-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch index bae7f32e..66b1a52a 100644 --- a/patches/openwrt/0039-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch +++ b/patches/openwrt/0039-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch @@ -8,7 +8,7 @@ Signed-off-by: Paul Wassi Backport of OpenWrt r49277 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c -index 3617ca7..072cf12 100644 +index 3617ca7d5fc0fff00fce9741b5d9169fac8c83c8..072cf12a31a0921a8e9b90689864f5d981cd2c32 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c @@ -84,6 +84,7 @@ static void __init ubnt_unifiac_setup(void) diff --git a/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch index ed85b252..e867717e 100644 --- a/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch +++ b/patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch @@ -10,7 +10,7 @@ Signed-off-by: P.Wassi Backport of LEDE c855e70491fbd5d432915c4cbeb3b80f3a117e30 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 3adc449..924c116 100644 +index 3adc449b23e9c590d57cdd914b6c8d990a50e0b0..924c1163e26eb84b71e4734b95221104674bfe3e 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -310,7 +310,7 @@ get_status_led() { @@ -23,7 +23,7 @@ index 3adc449..924c116 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index ab7d93c..7777734 100644 +index ab7d93c693f8422bbb518c6accd4ffed169398cd..7777734ae3899840c1c47e7b24373b4bceee0adc 100644 --- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -81,7 +81,7 @@ case "$FIRMWARE" in @@ -36,7 +36,7 @@ index ab7d93c..7777734 100644 ;; esac diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index a79376a..2007042 100755 +index a79376a8cff56b144268130a24a930ff2bee95cd..20070426fd033e4ff2e904f9247deed9eb48c3c3 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -369,7 +369,7 @@ tl-wa901nd-v3 |\ @@ -49,7 +49,7 @@ index a79376a..2007042 100755 mynet-rext |\ wp543) diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index ecf584d..6bc0b86 100755 +index ecf584d30ecae7a0e2601bed38c6cfad42cab124..6bc0b868423ef68fb83147c13b00163b29cf2aec 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -902,8 +902,8 @@ ar71xx_board_detect() { @@ -64,7 +64,7 @@ index ecf584d..6bc0b86 100755 *"UniFi AP Pro") name="uap-pro" diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index fff1c3c..90f961f 100755 +index fff1c3c912cee678ea88e225958b28ceb4c4b742..90f961f3f0aaf3c76a0a8022258fbf5404165ca8 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -252,7 +252,7 @@ platform_check_image() { @@ -77,7 +77,7 @@ index fff1c3c..90f961f 100755 carambola2 | \ weio ) diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c -index 072cf12..31cbe30 100644 +index 072cf12a31a0921a8e9b90689864f5d981cd2c32..31cbe30d3ff9b323cb336c62d6fe0d7a0c67ba42 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c @@ -73,7 +73,7 @@ static struct gpio_keys_button ubnt_unifiac_gpio_keys[] __initdata = { @@ -117,7 +117,7 @@ index 072cf12..31cbe30 100644 +MIPS_MACHINE(ATH79_MACH_UBNT_UNIFIAC_LITE, "UBNT-UF-AC-LITE", "Ubiquiti UniFi-AC-LITE", + ubnt_unifiac_lite_setup); diff --git a/target/linux/ar71xx/generic/profiles/ubnt.mk b/target/linux/ar71xx/generic/profiles/ubnt.mk -index 94eff18..eac0240 100644 +index 94eff18318264de85ea459e94280c88726404888..eac02406bbbffebbcb20962929fb8254edba520e 100644 --- a/target/linux/ar71xx/generic/profiles/ubnt.mk +++ b/target/linux/ar71xx/generic/profiles/ubnt.mk @@ -38,16 +38,16 @@ endef @@ -143,7 +143,7 @@ index 94eff18..eac0240 100644 define Profile/UBNTUNIFIOUTDOOR NAME:=Ubiquiti UniFiAP Outdoor diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index aaaf89a..42ffc69 100644 +index aaaf89ac1a369431cf9bc15c13e774ba6826bbf3..42ffc69ca3f9b1cffa542fc2d06ead2ef224d6b2 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -741,14 +741,19 @@ endef @@ -170,7 +170,7 @@ index aaaf89a..42ffc69 100644 rootfs_type=$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1))) diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index 27dc73f..9a28f58 100644 +index 27dc73ffa239979a799bbede72440907e9d0e187..9a28f58f67d5f98fcd4aa83dc09698705e2dfa3e 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -165,7 +165,7 @@ diff --git a/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch index ad505e3c..2e2e7900 100644 --- a/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch +++ b/patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch @@ -8,7 +8,7 @@ Signed-off-by: P.Wassi Backport of LEDE 8307c2fe686ded345c80318359d5b6679e581fa2 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 924c116..cb92349 100644 +index 924c1163e26eb84b71e4734b95221104674bfe3e..cb92349cab833179a87a195b94e2539cc5ce3e79 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -310,7 +310,8 @@ get_status_led() { @@ -22,7 +22,7 @@ index 924c116..cb92349 100644 ;; unifi-outdoor-plus) diff --git a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata -index 7777734..5eb20bb 100644 +index 7777734ae3899840c1c47e7b24373b4bceee0adc..5eb20bb26521258599898125d42f6b73b9c81f94 100644 --- a/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata +++ b/target/linux/ar71xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata @@ -81,7 +81,8 @@ case "$FIRMWARE" in @@ -36,7 +36,7 @@ index 7777734..5eb20bb 100644 ;; esac diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 2007042..b59844e 100755 +index 20070426fd033e4ff2e904f9247deed9eb48c3c3..b59844eac49a1269edb88890d89b0b4d8a7121d0 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -401,6 +401,13 @@ wpj344) @@ -54,7 +54,7 @@ index 2007042..b59844e 100755 ucidef_set_interfaces_lan_wan "eth0" "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 6bc0b86..aded7ad 100755 +index 6bc0b868423ef68fb83147c13b00163b29cf2aec..aded7ad117ffa1c1347c6f457c210d60b8e4df58 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -905,6 +905,9 @@ ar71xx_board_detect() { @@ -68,7 +68,7 @@ index 6bc0b86..aded7ad 100755 name="uap-pro" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 90f961f..0228f14 100755 +index 90f961f3f0aaf3c76a0a8022258fbf5404165ca8..0228f14774d5873a52f19b60ed84389c7be86e51 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -253,6 +253,7 @@ platform_check_image() { @@ -80,7 +80,7 @@ index 90f961f..0228f14 100755 carambola2 | \ weio ) diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c -index 31cbe30..9194bc1 100644 +index 31cbe30d3ff9b323cb336c62d6fe0d7a0c67ba42..9194bc1c0799d83fca3f6fe76b2602d72e5f4ef8 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-ubnt-unifiac.c @@ -21,6 +21,7 @@ @@ -171,7 +171,7 @@ index 31cbe30..9194bc1 100644 +MIPS_MACHINE(ATH79_MACH_UBNT_UNIFIAC_PRO, "UBNT-UF-AC-PRO", "Ubiquiti UniFi-AC-PRO", + ubnt_unifiac_pro_setup); diff --git a/target/linux/ar71xx/generic/profiles/ubnt.mk b/target/linux/ar71xx/generic/profiles/ubnt.mk -index eac0240..69b8398 100644 +index eac02406bbbffebbcb20962929fb8254edba520e..69b83985bd6623c0d6732399d3e2cc8c0af9f9f1 100644 --- a/target/linux/ar71xx/generic/profiles/ubnt.mk +++ b/target/linux/ar71xx/generic/profiles/ubnt.mk @@ -49,6 +49,17 @@ endef @@ -193,7 +193,7 @@ index eac0240..69b8398 100644 NAME:=Ubiquiti UniFiAP Outdoor PACKAGES:= diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 42ffc69..7c648f2 100644 +index 42ffc69ca3f9b1cffa542fc2d06ead2ef224d6b2..7c648f26e10c49000b848e9b300701b388410c04 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -753,7 +753,13 @@ define Device/ubnt-unifiac-lite @@ -212,7 +212,7 @@ index 42ffc69..7c648f2 100644 rootfs_type=$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1))) diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index 9a28f58..debde6e 100644 +index 9a28f58f67d5f98fcd4aa83dc09698705e2dfa3e..debde6e6a552e71b551d8c01ba06af03013407bf 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ diff --git a/patches/openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch b/patches/openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch index 690d3ebb..662d8960 100644 --- a/patches/openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch +++ b/patches/openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch @@ -4,7 +4,7 @@ Subject: libjson-c: Add support for custom format strings for doubles diff --git a/package/libs/libjson-c/patches/002-custom-format-string.patch b/package/libs/libjson-c/patches/002-custom-format-string.patch new file mode 100644 -index 0000000..2f454c5 +index 0000000000000000000000000000000000000000..2f454c560ff78c1edd4654b9651f0e6299bd5e6f --- /dev/null +++ b/package/libs/libjson-c/patches/002-custom-format-string.patch @@ -0,0 +1,98 @@ diff --git a/patches/openwrt/0043-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch b/patches/openwrt/0043-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch index 61ec3d62..61457f9d 100644 --- a/patches/openwrt/0043-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch +++ b/patches/openwrt/0043-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch @@ -6,7 +6,7 @@ Patch-by: Stefan Rompf diff --git a/package/kernel/mac80211/patches/931-ubnt-uap-plus-hsr.patch b/package/kernel/mac80211/patches/931-ubnt-uap-plus-hsr.patch new file mode 100644 -index 0000000..8e09fee +index 0000000000000000000000000000000000000000..8e09fee938951ab3636d23b5fe4dee3ab0e11c7a --- /dev/null +++ b/package/kernel/mac80211/patches/931-ubnt-uap-plus-hsr.patch @@ -0,0 +1,349 @@ @@ -360,7 +360,7 @@ index 0000000..8e09fee + + #endif /* _LINUX_ATH9K_PLATFORM_H */ diff --git a/target/linux/ar71xx/patches-3.18/608-MIPS-ath79-ubnt-xm-add-more-boards.patch b/target/linux/ar71xx/patches-3.18/608-MIPS-ath79-ubnt-xm-add-more-boards.patch -index 7803513..d865ed2 100644 +index 78035131db93f3e465585d7e96bfae9e88783d28..d865ed29ac268b6b49644c0841be6dfeace75038 100644 --- a/target/linux/ar71xx/patches-3.18/608-MIPS-ath79-ubnt-xm-add-more-boards.patch +++ b/target/linux/ar71xx/patches-3.18/608-MIPS-ath79-ubnt-xm-add-more-boards.patch @@ -254,6 +254,7 @@ @@ -373,7 +373,7 @@ index 7803513..d865ed2 100644 + ath79_register_leds_gpio(-1, ARRAY_SIZE(ubnt_unifi_outdoor_plus_leds_gpio), diff --git a/target/linux/generic/patches-3.18/150-ath9k_ubnt_hsr_filter.patch b/target/linux/generic/patches-3.18/150-ath9k_ubnt_hsr_filter.patch new file mode 100644 -index 0000000..b8844f1 +index 0000000000000000000000000000000000000000..b8844f1341f9a8a478730ef6ac440833b84b3e98 --- /dev/null +++ b/target/linux/generic/patches-3.18/150-ath9k_ubnt_hsr_filter.patch @@ -0,0 +1,16 @@ diff --git a/patches/openwrt/0044-ar71xx-Send-power-to-USB-port-on-WNR2200.patch b/patches/openwrt/0044-ar71xx-Send-power-to-USB-port-on-WNR2200.patch index 42906fc8..dfccf180 100644 --- a/patches/openwrt/0044-ar71xx-Send-power-to-USB-port-on-WNR2200.patch +++ b/patches/openwrt/0044-ar71xx-Send-power-to-USB-port-on-WNR2200.patch @@ -14,7 +14,7 @@ Signed-off-by: Riley Baird Backport of r47236 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c -index 0087cac..5d23f21 100644 +index 0087cac62087786d45bd5c8b68b2ec2ce3b5715e..5d23f21763cd9f4ddafc97f79ff47e819a18f2a6 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c @@ -36,7 +36,7 @@ diff --git a/patches/openwrt/0045-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch b/patches/openwrt/0045-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch index b2fb55c1..7c285574 100644 --- a/patches/openwrt/0045-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch +++ b/patches/openwrt/0045-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch @@ -11,7 +11,7 @@ Signed-off-by: Michal Cieslakiewicz Backport of r49100 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c -index 5d23f21..37ffc4c 100644 +index 5d23f21763cd9f4ddafc97f79ff47e819a18f2a6..37ffc4c56be33be96c43078117d7b123679378b3 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c @@ -12,6 +12,7 @@ diff --git a/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch b/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch index dbdb42c9..bbaf0fd6 100644 --- a/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch +++ b/patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch @@ -10,7 +10,7 @@ Signed-off-by: Michal Cieslakiewicz Backport of r49101 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index f4d5234..b867796 100644 +index f4d523418c8d59e3c96dbe3d68eedd8d85e33546..b8677960249c1e05703570fdf2be4197bde5cac5 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -600,6 +600,21 @@ wnr2000-v4) @@ -36,7 +36,7 @@ index f4d5234..b867796 100644 ucidef_set_led_netdev "wan-amber" "WAN (amber)" "netgear:amber:wan" "eth0" ucidef_set_led_wlan "wlan" "WLAN" "netgear:blue:wlan" "phy0tpt" diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c -index 37ffc4c..258d254 100644 +index 37ffc4c56be33be96c43078117d7b123679378b3..258d254cf4abfc01a4d859f3f464b2a25aeec165 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-wnr2200.c @@ -15,6 +15,8 @@ diff --git a/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch index 0896c8b2..78153021 100644 --- a/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch +++ b/patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch @@ -9,7 +9,7 @@ https://raw.githubusercontent.com/domino-team/OpenWrt-patches/master/AR150%2C%20 (and fixed indentation in target/linux/ar71xx/base-files/lib/ar71xx.sh) diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index b867796..d81358d 100644 +index b8677960249c1e05703570fdf2be4197bde5cac5..d81358d6bf9103ffeb2929b06d3ab01efffe931c 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -188,6 +188,10 @@ dlan-pro-1200-ac) @@ -24,7 +24,7 @@ index b867796..d81358d 100644 ucidef_set_led_netdev "lan" "LAN" "gl-connect:green:lan" "eth1" ucidef_set_led_wlan "wlan" "WLAN" "gl-connect:red:wlan" "phy0tpt" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index b59844e..ac3deb8 100755 +index b59844eac49a1269edb88890d89b0b4d8a7121d0..ac3deb8aa2ed4717e2bd682cb4ffd7d32c50134f 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -383,6 +383,7 @@ dir-505-a1) @@ -36,7 +36,7 @@ index b59844e..ac3deb8 100755 jwap003 |\ pb42 |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index aded7ad..f242980 100755 +index aded7ad117ffa1c1347c6f457c210d60b8e4df58..f242980b3e401f2e9de2b8abe7e984b24a71db5a 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -503,6 +503,9 @@ ar71xx_board_detect() { @@ -50,7 +50,7 @@ index aded7ad..f242980 100755 name="epg5000" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 0228f14..d816f21 100755 +index 0228f14774d5873a52f19b60ed84389c7be86e51..d816f211891d6a259930f2781574504ea62b4e16 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -216,6 +216,7 @@ platform_check_image() { @@ -62,7 +62,7 @@ index 0228f14..d816f21 100755 esr1750 | \ esr900 | \ diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index a068cc5..d4d9273 100644 +index a068cc5768aed6f29a67de27d24f00dc57e0695a..d4d92738d0ab010e1d43ebed0baef34fd9bc3f9d 100644 --- a/target/linux/ar71xx/config-3.18 +++ b/target/linux/ar71xx/config-3.18 @@ -70,6 +70,7 @@ CONFIG_ATH79_MACH_ESR1750=y @@ -75,7 +75,7 @@ index a068cc5..d4d9273 100644 CONFIG_ATH79_MACH_GS_OOLITE=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-ar150.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-ar150.c new file mode 100644 -index 0000000..310182c +index 0000000000000000000000000000000000000000..310182cc8e9c22e2bfcb168996d4f01d117dc103 --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-gl-ar150.c @@ -0,0 +1,125 @@ @@ -206,7 +206,7 @@ index 0000000..310182c +MIPS_MACHINE(ATH79_MACH_GL_AR150, "GL-AR150", "GL AR150",gl_ar150_setup); diff --git a/target/linux/ar71xx/generic/profiles/gl-connect.mk b/target/linux/ar71xx/generic/profiles/gl-connect.mk deleted file mode 100644 -index e9377db..0000000 +index e9377dbbfa042f790f15817313c24b2700617f37..0000000000000000000000000000000000000000 --- a/target/linux/ar71xx/generic/profiles/gl-connect.mk +++ /dev/null @@ -1,17 +0,0 @@ @@ -229,7 +229,7 @@ index e9377db..0000000 -$(eval $(call Profile,GLINET)) diff --git a/target/linux/ar71xx/generic/profiles/gli.mk b/target/linux/ar71xx/generic/profiles/gli.mk new file mode 100644 -index 0000000..a6ad661 +index 0000000000000000000000000000000000000000..a6ad661666a168a591319e74ef211277f8617fca --- /dev/null +++ b/target/linux/ar71xx/generic/profiles/gli.mk @@ -0,0 +1,27 @@ @@ -261,7 +261,7 @@ index 0000000..a6ad661 + +$(eval $(call Profile,GL-AR150)) diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 7c648f2..05eea0b 100644 +index 7c648f26e10c49000b848e9b300701b388410c04..05eea0b16c362ba5f70c9f435dbe312087b319c2 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -144,6 +144,14 @@ define Device/weio @@ -281,7 +281,7 @@ index 7c648f2..05eea0b 100644 NETGEAR_KERNEL_MAGIC = 0x33373030 diff --git a/target/linux/ar71xx/patches-3.18/911-MIPS-ath79-add-gl_ar150.patch b/target/linux/ar71xx/patches-3.18/911-MIPS-ath79-add-gl_ar150.patch new file mode 100644 -index 0000000..31db581 +index 0000000000000000000000000000000000000000..31db5816caf5dc8076ceec349884cf9a47b2fc68 --- /dev/null +++ b/target/linux/ar71xx/patches-3.18/911-MIPS-ath79-add-gl_ar150.patch @@ -0,0 +1,39 @@ diff --git a/patches/openwrt/0048-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch b/patches/openwrt/0048-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch index 6cdf13ab..5efb7e70 100644 --- a/patches/openwrt/0048-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch +++ b/patches/openwrt/0048-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch @@ -21,7 +21,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 6fb212f2933bbbdf2935124205717c9d0ca72b32 diff --git a/include/host-build.mk b/include/host-build.mk -index e2b5f2f..44401b8 100644 +index e2b5f2f8d1882207e11697df3df1302076adfaa3..44401b866a4d637648bb093470a5e66b4a3e38fc 100644 --- a/include/host-build.mk +++ b/include/host-build.mk @@ -10,7 +10,7 @@ HOST_INSTALL_DIR ?= $(HOST_BUILD_DIR)/host-install @@ -34,7 +34,7 @@ index e2b5f2f..44401b8 100644 HOST_MAKE_J:=-j$(CONFIG_PKG_BUILD_JOBS) endif diff --git a/include/package.mk b/include/package.mk -index c69d928..a99cdc6 100644 +index c69d92819779dd0ee92381620accd73ef2b80de6..a99cdc6990280d7ef83223861cd9f224c6eebc33 100644 --- a/include/package.mk +++ b/include/package.mk @@ -23,7 +23,7 @@ PKG_RELRO_PARTIAL ?= 1 diff --git a/patches/openwrt/0049-tools-cmake-fix-parallel-build-with-Make-4.2.patch b/patches/openwrt/0049-tools-cmake-fix-parallel-build-with-Make-4.2.patch index 16709ae6..a8535ea0 100644 --- a/patches/openwrt/0049-tools-cmake-fix-parallel-build-with-Make-4.2.patch +++ b/patches/openwrt/0049-tools-cmake-fix-parallel-build-with-Make-4.2.patch @@ -11,7 +11,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 96db10752483cb07f822686482b44be6c21fbb5f diff --git a/tools/cmake/Makefile b/tools/cmake/Makefile -index 08e2b02..6c211de 100644 +index 08e2b028150dd4f496e3a8ebccf27bd49b6937c2..6c211def540a6a41012349d5979b919481e1bcec 100644 --- a/tools/cmake/Makefile +++ b/tools/cmake/Makefile @@ -18,10 +18,11 @@ HOST_CONFIGURE_PARALLEL:=1 diff --git a/patches/openwrt/0050-linux-make-IPv6-builtin-if-selected-saves-30KB.patch b/patches/openwrt/0050-linux-make-IPv6-builtin-if-selected-saves-30KB.patch index 63a5ddb6..19ba4f32 100644 --- a/patches/openwrt/0050-linux-make-IPv6-builtin-if-selected-saves-30KB.patch +++ b/patches/openwrt/0050-linux-make-IPv6-builtin-if-selected-saves-30KB.patch @@ -10,7 +10,7 @@ kmod-ipv6 is added to the PROVIDES of the kernel package, so we don't have to adjust all packages depending on kmod-ipv6. diff --git a/config/Config-build.in b/config/Config-build.in -index 4674d84..cd50290 100644 +index 4674d8403539a3b209d709342ab71a6e6ff79de2..cd50290f812f73bc6886a789a456956fa4fb1e42 100644 --- a/config/Config-build.in +++ b/config/Config-build.in @@ -83,7 +83,7 @@ menu "Global build settings" @@ -23,7 +23,7 @@ index 4674d84..cd50290 100644 config PKG_BUILD_PARALLEL bool diff --git a/package/kernel/linux/Makefile b/package/kernel/linux/Makefile -index 45ca9fa..b06c49a 100644 +index 45ca9faa923eb1a1db97d94d0406a46223c59a8f..b06c49a92fd396e8edcb0ca7a7a94b74b05a87e0 100644 --- a/package/kernel/linux/Makefile +++ b/package/kernel/linux/Makefile @@ -49,6 +49,7 @@ define Package/kernel @@ -35,7 +35,7 @@ index 45ca9fa..b06c49a 100644 define Package/kernel/install diff --git a/package/kernel/linux/modules/netsupport.mk b/package/kernel/linux/modules/netsupport.mk -index cea8e47..8a2760d 100644 +index cea8e47a65b5283640a17ed6c311bd87c70373b2..8a2760d8a4a429f206eba41a8c83432e5b6ddab7 100644 --- a/package/kernel/linux/modules/netsupport.mk +++ b/package/kernel/linux/modules/netsupport.mk @@ -439,7 +439,7 @@ $(eval $(call KernelPackage,iptunnel4)) @@ -130,7 +130,7 @@ index cea8e47..8a2760d 100644 define KernelPackage/sctp/description diff --git a/package/network/services/dnsmasq/Makefile b/package/network/services/dnsmasq/Makefile -index 19a8df9..8fd51fe 100644 +index 19a8df9009da7fee967b84f65248470db3b34150..8fd51fe8748082b072710b718300a706832b25be 100644 --- a/package/network/services/dnsmasq/Makefile +++ b/package/network/services/dnsmasq/Makefile @@ -52,7 +52,6 @@ define Package/dnsmasq-full diff --git a/patches/openwrt/0051-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch b/patches/openwrt/0051-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch index 4fc1edd5..14c058b2 100644 --- a/patches/openwrt/0051-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch +++ b/patches/openwrt/0051-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch @@ -7,7 +7,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 3ee6c17cd14ec1fed0b0491542c499c03fc6d211 diff --git a/include/package-ipkg.mk b/include/package-ipkg.mk -index eb4c874..1830d64 100644 +index eb4c874047e8a9e24a4d77b13f7ba66e1221cbb5..1830d644c36fa3dad342d3283529a18b8d70a377 100644 --- a/include/package-ipkg.mk +++ b/include/package-ipkg.mk @@ -154,7 +154,7 @@ Package: $(1) diff --git a/patches/openwrt/0052-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch b/patches/openwrt/0052-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch index b44a0ef2..cc03f5fb 100644 --- a/patches/openwrt/0052-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch +++ b/patches/openwrt/0052-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch @@ -13,7 +13,7 @@ The packages kmod-crypto-{core,arc4} are added to kernel PROVIDES to satisfy dependencies of CC packages. diff --git a/package/kernel/linux/Makefile b/package/kernel/linux/Makefile -index b06c49a..19bcbd5 100644 +index b06c49a92fd396e8edcb0ca7a7a94b74b05a87e0..19bcbd582ba06cb8cdb9ee869c50a67dbfd470bb 100644 --- a/package/kernel/linux/Makefile +++ b/package/kernel/linux/Makefile @@ -49,7 +49,7 @@ define Package/kernel @@ -26,7 +26,7 @@ index b06c49a..19bcbd5 100644 define Package/kernel/install diff --git a/package/kernel/linux/modules/crypto.mk b/package/kernel/linux/modules/crypto.mk -index c8e0fbb..926dab0 100644 +index c8e0fbb04397c9b1fa7ebde3579f663b5d756e1b..926dab0e3379efbc92aeac865b02673928c18644 100644 --- a/package/kernel/linux/modules/crypto.mk +++ b/package/kernel/linux/modules/crypto.mk @@ -15,24 +15,9 @@ crypto_confvar=CONFIG_CRYPTO_$(word 1,$(subst =,$(space),$(1))) @@ -74,7 +74,7 @@ index c8e0fbb..926dab0 100644 TITLE:=Combined mode wrapper for IPsec DEPENDS:=+kmod-crypto-manager diff --git a/package/kernel/linux/modules/fs.mk b/package/kernel/linux/modules/fs.mk -index fa18237..cc87a45 100644 +index fa182375ea8b0224753141620bd168328194ddf4..cc87a45961d04d93badce575530495f994deee86 100644 --- a/package/kernel/linux/modules/fs.mk +++ b/package/kernel/linux/modules/fs.mk @@ -91,7 +91,6 @@ define KernelPackage/fs-cifs @@ -86,7 +86,7 @@ index fa18237..cc87a45 100644 +kmod-crypto-md5 \ +kmod-crypto-md4 \ diff --git a/package/kernel/linux/modules/netsupport.mk b/package/kernel/linux/modules/netsupport.mk -index 8a2760d..ab76946 100644 +index 8a2760d8a4a429f206eba41a8c83432e5b6ddab7..ab76946d2ab30e748ea5bc69c24051dbfc411036 100644 --- a/package/kernel/linux/modules/netsupport.mk +++ b/package/kernel/linux/modules/netsupport.mk @@ -714,7 +714,7 @@ $(eval $(call KernelPackage,ipoa)) @@ -108,7 +108,7 @@ index 8a2760d..ab76946 100644 define KernelPackage/rxrpc/description diff --git a/target/linux/generic/config-3.18 b/target/linux/generic/config-3.18 -index 6038692..a0dc3c9 100644 +index 6038692b7e81334e4864d30453f734f4fe829aa0..a0dc3c9b607abe32c1ca021b7fad293a8f742ec1 100644 --- a/target/linux/generic/config-3.18 +++ b/target/linux/generic/config-3.18 @@ -700,9 +700,10 @@ CONFIG_CRYPTO_ALGAPI=y @@ -125,7 +125,7 @@ index 6038692..a0dc3c9 100644 # CONFIG_CRYPTO_CAMELLIA is not set # CONFIG_CRYPTO_CAST5 is not set diff --git a/target/linux/omap/config-3.18 b/target/linux/omap/config-3.18 -index a06a350..d5003c2 100644 +index a06a350a37c035c66ec8d6242f28379e7992685e..d5003c275b2b2a167d4614f5e33269941a02173e 100644 --- a/target/linux/omap/config-3.18 +++ b/target/linux/omap/config-3.18 @@ -114,9 +114,6 @@ CONFIG_CPU_V7=y @@ -139,7 +139,7 @@ index a06a350..d5003c2 100644 CONFIG_CRYPTO_CRC32C=y CONFIG_CRYPTO_CTR=m diff --git a/target/linux/sunxi/config-3.18 b/target/linux/sunxi/config-3.18 -index ddc3f7a..57651bb 100644 +index ddc3f7acb82064fb3be16f5111b0c4344b01c362..57651bbd65ebc61b14d45aefaaf20e5b8d59e27a 100644 --- a/target/linux/sunxi/config-3.18 +++ b/target/linux/sunxi/config-3.18 @@ -110,9 +110,6 @@ CONFIG_CPU_TLB_V7=y diff --git a/patches/openwrt/0053-x86-stop-relying-on-hexdump-for-image-build-signature.patch b/patches/openwrt/0053-x86-stop-relying-on-hexdump-for-image-build-signature.patch index e2972eb2..6a2790e2 100644 --- a/patches/openwrt/0053-x86-stop-relying-on-hexdump-for-image-build-signature.patch +++ b/patches/openwrt/0053-x86-stop-relying-on-hexdump-for-image-build-signature.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau Backport of LEDE d5ee23ee275fcd6550b0051de59706cc928cdac8 diff --git a/target/linux/x86/image/Makefile b/target/linux/x86/image/Makefile -index e7e02f1..6f64eba 100644 +index e7e02f15fbb3d1638b26982e7ddff305464e6851..6f64eba398e34093308b766839e69780512a4ca8 100644 --- a/target/linux/x86/image/Makefile +++ b/target/linux/x86/image/Makefile @@ -40,7 +40,7 @@ ifneq ($(GRUB_TERMINALS),) diff --git a/patches/openwrt/0054-mt76-fix-build-with-kernel-3.18.patch b/patches/openwrt/0054-mt76-fix-build-with-kernel-3.18.patch index c07bc683..44683c01 100644 --- a/patches/openwrt/0054-mt76-fix-build-with-kernel-3.18.patch +++ b/patches/openwrt/0054-mt76-fix-build-with-kernel-3.18.patch @@ -4,7 +4,7 @@ Subject: mt76: fix build with kernel 3.18 diff --git a/package/kernel/mac80211/patches/945-netdev_alloc_frag.patch b/package/kernel/mac80211/patches/945-netdev_alloc_frag.patch new file mode 100644 -index 0000000..ea389cd +index 0000000000000000000000000000000000000000..ea389cd85cb15c7ecb20a1e0c934fcf8b58c0eda --- /dev/null +++ b/package/kernel/mac80211/patches/945-netdev_alloc_frag.patch @@ -0,0 +1,11 @@ @@ -20,7 +20,7 @@ index 0000000..ea389cd + + /* diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile -index bd851e6..989ba0c 100644 +index bd851e61910c9a57ca45a570855ca22329c9ae4b..989ba0c2e8d10f6e7bb8fbd31e7181efff19be7c 100644 --- a/package/kernel/mt76/Makefile +++ b/package/kernel/mt76/Makefile @@ -24,7 +24,7 @@ include $(INCLUDE_DIR)/package.mk diff --git a/patches/openwrt/0055-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch b/patches/openwrt/0055-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch index 8f2dd5e3..d8b87074 100644 --- a/patches/openwrt/0055-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch +++ b/patches/openwrt/0055-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch @@ -9,7 +9,7 @@ Signed-off-by: Johannes Wienke Backport of OpenWrt r48715 diff --git a/target/linux/ramips/dts/DIR-860L-B1.dts b/target/linux/ramips/dts/DIR-860L-B1.dts -index 23ec114..2582b3d 100644 +index 23ec1140bc89fa06aa2920bc43efc8bb7465fb42..2582b3d4182d3a0fcee6e6ea6f97ab8007edf3a2 100644 --- a/target/linux/ramips/dts/DIR-860L-B1.dts +++ b/target/linux/ramips/dts/DIR-860L-B1.dts @@ -97,6 +97,26 @@ diff --git a/patches/openwrt/0056-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch b/patches/openwrt/0056-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch index cd023dce..5de381df 100644 --- a/patches/openwrt/0056-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch +++ b/patches/openwrt/0056-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch @@ -5,7 +5,7 @@ Subject: ramips: add button support and make LEDs known to userspace for DIR-860 Signed-off-by: Matthias Schiffer diff --git a/target/linux/ramips/base-files/etc/board.d/01_leds b/target/linux/ramips/base-files/etc/board.d/01_leds -index 5327d00..5fb28a5 100755 +index 5327d006299ed94c645542f687e20962c83e842d..5fb28a52f7632bf09e7f62ff77dcd7254a2ebcc2 100755 --- a/target/linux/ramips/base-files/etc/board.d/01_leds +++ b/target/linux/ramips/base-files/etc/board.d/01_leds @@ -114,6 +114,9 @@ case $board in @@ -19,7 +19,7 @@ index 5327d00..5fb28a5 100755 ucidef_set_led_default "power_r" "POWER (red)" "ex2700:red:power" "0" set_wifi_led "ex2700:green:router" diff --git a/target/linux/ramips/base-files/etc/diag.sh b/target/linux/ramips/base-files/etc/diag.sh -index 6474ebd..37360a4 100644 +index 6474ebdde354b51648fcafd426e3256f0b6fe8b4..37360a417cb24eaedef24766510db7146c92e3cb 100644 --- a/target/linux/ramips/base-files/etc/diag.sh +++ b/target/linux/ramips/base-files/etc/diag.sh @@ -54,6 +54,9 @@ get_status_led() { @@ -33,7 +33,7 @@ index 6474ebd..37360a4 100644 status_led="d-link:blue:power" ;; diff --git a/target/linux/ramips/dts/DIR-860L-B1.dts b/target/linux/ramips/dts/DIR-860L-B1.dts -index 2582b3d..c0bcc86 100644 +index 2582b3d4182d3a0fcee6e6ea6f97ab8007edf3a2..c0bcc86216cf4bd343b688aa7e717b5c45775c50 100644 --- a/target/linux/ramips/dts/DIR-860L-B1.dts +++ b/target/linux/ramips/dts/DIR-860L-B1.dts @@ -124,5 +124,17 @@ diff --git a/patches/openwrt/0057-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch b/patches/openwrt/0057-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch index c6b941f5..12d1f6dd 100644 --- a/patches/openwrt/0057-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch +++ b/patches/openwrt/0057-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch @@ -5,7 +5,7 @@ Subject: ramips: set correct LAN/WAN MAC addresses on DIR-860L B1 Signed-off-by: Matthias Schiffer diff --git a/target/linux/ramips/base-files/etc/board.d/02_network b/target/linux/ramips/base-files/etc/board.d/02_network -index a78912d..4e6e507 100755 +index a78912dbc9b5ecdc8a9fb0c583c1e47fdb579015..4e6e507625adf8c706e2311ee121769cadb2aeaf 100755 --- a/target/linux/ramips/base-files/etc/board.d/02_network +++ b/target/linux/ramips/base-files/etc/board.d/02_network @@ -346,6 +346,11 @@ ramips_setup_macs() diff --git a/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch index a9d03330..e9538105 100644 --- a/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch +++ b/patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch @@ -14,7 +14,7 @@ Signed-off-by: Cezary Jackiewicz Backport of LEDE 0b45bec22c59cc6e6b2fa71dc9a88386c5587132 diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index cb92349..2c5d6af 100644 +index cb92349cab833179a87a195b94e2539cc5ce3e79..2c5d6af8f4e2c5ce71adc0b63d32b8506e01b6a2 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -280,6 +280,7 @@ get_status_led() { @@ -26,7 +26,7 @@ index cb92349..2c5d6af 100644 tl-wr941nd-v5) status_led="tp-link:green:system" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index d81358d..14aa7bc 100644 +index d81358d6bf9103ffeb2929b06d3ab01efffe931c..14aa7bc5e56c0d7be435ba3a1803416075eccb58 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -523,6 +523,16 @@ tl-wr842n-v2) @@ -47,7 +47,7 @@ index d81358d..14aa7bc 100644 tl-wa901nd-v3) ucidef_set_led_netdev "lan" "LAN" "tp-link:green:lan" "eth0" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index ac3deb8..ca9c577 100755 +index ac3deb8aa2ed4717e2bd682cb4ffd7d32c50134f..ca9c5771d72681557f4139c0e58f4d7a656bd741 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -449,6 +449,7 @@ tl-wr741nd-v4 |\ @@ -59,7 +59,7 @@ index ac3deb8..ca9c577 100755 whr-hp-g300n |\ whr-hp-gn |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index f242980..fcd0bc3 100755 +index f242980b3e401f2e9de2b8abe7e984b24a71db5a..fcd0bc35227de9b6a02c10c1bebf2413bdc555bf 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -869,6 +869,9 @@ ar71xx_board_detect() { @@ -73,7 +73,7 @@ index f242980..fcd0bc3 100755 name="tl-wr941nd" ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index d816f21..53284df 100755 +index d816f211891d6a259930f2781574504ea62b4e16..53284df5e2da19d8012361e9560244af898d3c2c 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -367,6 +367,7 @@ platform_check_image() { @@ -85,7 +85,7 @@ index d816f21..53284df 100755 tl-wr941nd-v5 | \ tl-wr941nd-v6 | \ diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c -index 004f719..ebaed15 100644 +index 004f71961396cd33cfd381aca386706104a7b757..ebaed15a49113133f59f069325898a00f5612fef 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr841n-v9.c @@ -1,9 +1,16 @@ @@ -217,7 +217,7 @@ index 004f719..ebaed15 100644 +MIPS_MACHINE(ATH79_MACH_TL_WR842N_V3, "TL-WR842N-v3", "TP-LINK TL-WR842N/ND v3", + tl_wr842n_v3_setup); diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 05eea0b..d66bd25 100644 +index 05eea0b16c362ba5f70c9f435dbe312087b319c2..d66bd25fe01544224a69e3f35f020f2e4130c8b3 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -607,6 +607,13 @@ define Device/tl-wr842n-v2 @@ -244,7 +244,7 @@ index 05eea0b..d66bd25 100644 define Device/tl-wr941nd-v5 $(Device/tplink-4mlzma) diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index debde6e..d4b417b 100644 +index debde6e6a552e71b551d8c01ba06af03013407bf..d4b417bfb78606ddb84076ad8c927952e65118c2 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ diff --git a/patches/openwrt/0059-x86-generic-enable-CONFIG_SATA_VIA.patch b/patches/openwrt/0059-x86-generic-enable-CONFIG_SATA_VIA.patch index d8c0a016..2498e273 100644 --- a/patches/openwrt/0059-x86-generic-enable-CONFIG_SATA_VIA.patch +++ b/patches/openwrt/0059-x86-generic-enable-CONFIG_SATA_VIA.patch @@ -5,7 +5,7 @@ Subject: x86/generic: enable CONFIG_SATA_VIA This enables support for VIA SATA. diff --git a/target/linux/x86/generic/config-default b/target/linux/x86/generic/config-default -index 9e963bf..4fc5131 100644 +index 9e963bf725b222dc94792dc8760f6f747cfffb78..4fc513154bd566319d77e6e42622ef362baeb094 100644 --- a/target/linux/x86/generic/config-default +++ b/target/linux/x86/generic/config-default @@ -174,6 +174,7 @@ CONFIG_PNP_DEBUG_MESSAGES=y diff --git a/patches/openwrt/0060-libpcap-fix-dependency-of-install-shared-so-make-target.patch b/patches/openwrt/0060-libpcap-fix-dependency-of-install-shared-so-make-target.patch index 2a5cb54f..dca302d7 100644 --- a/patches/openwrt/0060-libpcap-fix-dependency-of-install-shared-so-make-target.patch +++ b/patches/openwrt/0060-libpcap-fix-dependency-of-install-shared-so-make-target.patch @@ -16,7 +16,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE b82c8ddf8c15e91d6eecfd6d237606a4ce1f756f diff --git a/package/libs/libpcap/patches/100-debian_shared_lib.patch b/package/libs/libpcap/patches/100-debian_shared_lib.patch -index b294e51..f8df7f3 100644 +index b294e51576f9b9f363fa0143bd0945f03f9d13cd..f8df7f3636cb62845930843a4b208fe4e91a54f2 100644 --- a/package/libs/libpcap/patches/100-debian_shared_lib.patch +++ b/package/libs/libpcap/patches/100-debian_shared_lib.patch @@ -97,7 +97,7 @@ build a shared library. diff --git a/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch b/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch index 415254f0..7b331209 100644 --- a/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch +++ b/patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch @@ -9,7 +9,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 500a67a167a256002f8ab05171f49dfb86b03260 diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index fcd0bc3..20250e9 100755 +index fcd0bc35227de9b6a02c10c1bebf2413bdc555bf..20250e96fdcc1783f9b6818c340425206c67016f 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -107,6 +107,15 @@ cybertan_get_hw_magic() { diff --git a/patches/openwrt/0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch b/patches/openwrt/0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch index c0b48b3b..c89e8f53 100644 --- a/patches/openwrt/0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch +++ b/patches/openwrt/0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch @@ -12,7 +12,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE adbbfb7ff900c489e6be34b2ec2834172dff7943 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 14aa7bc..3d240fb 100644 +index 14aa7bc5e56c0d7be435ba3a1803416075eccb58..3d240fb076bf40b07e7f0b5974d7b5fd4435a044 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -139,10 +139,6 @@ dhp-1565-a1) diff --git a/patches/openwrt/0063-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch b/patches/openwrt/0063-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch index c5c278bc..7e4bc678 100644 --- a/patches/openwrt/0063-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch +++ b/patches/openwrt/0063-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch @@ -10,7 +10,7 @@ Signed-off-by: Alexander Couzens Backport of LEDE 94e23bf7409d6cc4c9efb55ed32aba8e5a497966 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c -index 8bf5c0f..5cb052a 100644 +index 8bf5c0f6226cbba10da10af4798b67b76db94e2b..5cb052a84aee451b9fbd449910acfde80dcf8aa7 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c @@ -30,6 +30,9 @@ diff --git a/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch b/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch index e19937f9..311a7ca7 100644 --- a/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch +++ b/patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch @@ -10,7 +10,7 @@ Signed-off-by: Alexander Couzens Backport of LEDE c5ff273d85f69981e5b126eeaed3dee5b4061fb4 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches -index b41f275..0f7a415 100644 +index b41f27554b1e3eac19c22af59731771631a1135b..0f7a41589384755ff596d4355ad9fbf1e1087d91 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches @@ -15,6 +15,7 @@ nanostation-m) @@ -22,7 +22,7 @@ index b41f275..0f7a415 100644 ucidef_set_gpio_switch "poe_passthrough" "PoE Passthrough" "20" ;; diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 3d240fb..f1266d8 100644 +index 3d240fb076bf40b07e7f0b5974d7b5fd4435a044..f1266d88f1b6a441e58b0a008ca915a4b5958928 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -78,6 +78,7 @@ carambola2) @@ -34,7 +34,7 @@ index 3d240fb..f1266d8 100644 ucidef_set_led_switch "lan0" "LAN0" "tp-link:green:lan0" "switch0" "0x20" ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index ca9c577..6c3ecf5 100755 +index ca9c5771d72681557f4139c0e58f4d7a656bd741..6c3ecf54dccd111231d93e539346f7839252794c 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -72,6 +72,7 @@ bsb) @@ -46,7 +46,7 @@ index ca9c577..6c3ecf5 100755 ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2" ucidef_add_switch "switch0" "1" "1" diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 20250e9..0d8ccd2 100755 +index 20250e96fdcc1783f9b6818c340425206c67016f..0d8ccd21c3f552b7ae7aff6905a08ff6a4fdadf7 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -447,7 +447,11 @@ ar71xx_board_detect() { @@ -63,7 +63,7 @@ index 20250e9..0d8ccd2 100755 tplink_pharos_board_detect ;; diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 53284df..4003b21 100755 +index 53284df5e2da19d8012361e9560244af898d3c2c..4003b21df26917a521ed96db82a970a82cdbc2cb 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -265,6 +265,7 @@ platform_check_image() { @@ -75,7 +75,7 @@ index 53284df..4003b21 100755 tplink_pharos_check_image "$1" && return 0 return 1 diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c -index 5cb052a..74daf43 100644 +index 5cb052a84aee451b9fbd449910acfde80dcf8aa7..74daf434e611d1f9d05f7d7516ae918d334b32b7 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c @@ -78,12 +78,8 @@ static struct gpio_keys_button cpe510_gpio_keys[] __initdata = { @@ -126,7 +126,7 @@ index 5cb052a..74daf43 100644 +MIPS_MACHINE(ATH79_MACH_CPE510, "CPE510", "TP-LINK CPE510/520", cpe510_setup); diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index d66bd25..75083f9 100644 +index d66bd25fe01544224a69e3f35f020f2e4130c8b3..75083f9b698ba8a438256209a34369eb626a3b3d 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -2111,7 +2111,8 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR10 @@ -148,7 +148,7 @@ index d66bd25..75083f9 100644 $(eval $(call MultiProfile,UBNT,UBNTAIRROUTER UBNTRS UBNTRSPRO UBNTLSSR71 UBNTBULLETM UBNTROCKETM UBNTROCKETMXW UBNTNANOM UBNTNANOMXW UBNTLOCOXW UBNTUNIFI UBNTUNIFIOUTDOOR UBNTUNIFIOUTDOORPLUS UAPPRO UBNTAIRGW)) $(eval $(call MultiProfile,WNR612V2,REALWNR612V2 N150R)) diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index d4b417b..c83ac2e 100644 +index d4b417bfb78606ddb84076ad8c927952e65118c2..c83ac2e89324deda3135aab84e8c4f4112ea728d 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ diff --git a/patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch b/patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch index 0c33a4d3..676f5159 100644 --- a/patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch +++ b/patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch @@ -7,7 +7,7 @@ Signed-off-by: Ash Benz Backport of LEDE 955c341d3bec0eb4971a03924e99156367255d7b diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c -index 77a894b..2e204aa 100644 +index 77a894b237281f6211dd1123ead4b5b0f2f58370..2e204aa2335e55515a60a1f5c08ca1b499eb9287 100644 --- a/tools/firmware-utils/src/tplink-safeloader.c +++ b/tools/firmware-utils/src/tplink-safeloader.c @@ -105,6 +105,8 @@ static const uint8_t md5_salt[16] = { diff --git a/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch b/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch index fe68cd6a..d16e2cd6 100644 --- a/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch +++ b/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch @@ -12,7 +12,7 @@ Signed-off-by: Alexander Couzens Backport of LEDE 824147960569f2c1cd22140c9074c62c3df911a5 diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 75083f9..bb2bb94 100644 +index 75083f9b698ba8a438256209a34369eb626a3b3d..bb2bb94e04ee8f59db62907ace49952061b411dc 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -2111,7 +2111,7 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR10 @@ -25,7 +25,7 @@ index 75083f9..bb2bb94 100644 $(eval $(call SingleProfile,UAPPRO,64k,UAPPRO,ubnt-uap-pro,UAP-PRO,ttyS0,115200,BZ,BZ,ar934x)) diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c -index 2e204aa..4938f74 100644 +index 2e204aa2335e55515a60a1f5c08ca1b499eb9287..4938f74eecd122265072390e1c6b8cadb09844d0 100644 --- a/tools/firmware-utils/src/tplink-safeloader.c +++ b/tools/firmware-utils/src/tplink-safeloader.c @@ -163,6 +163,15 @@ static const struct flash_partition_entry c2600_partitions[] = { diff --git a/patches/openwrt/0067-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch b/patches/openwrt/0067-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch index 1dbc25cc..35824a1f 100644 --- a/patches/openwrt/0067-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch +++ b/patches/openwrt/0067-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch @@ -9,7 +9,7 @@ The patches 600-allow-blank-root-password.patch and allowing password-less root login. diff --git a/package/network/services/dropbear/Config.in b/package/network/services/dropbear/Config.in -index e2a7610..7c2edd7 100644 +index e2a761034fa64225439db4a18030dee75fb0775c..7c2edd79f23708f9ef01c6a62a54073b0c7a33ed 100644 --- a/package/network/services/dropbear/Config.in +++ b/package/network/services/dropbear/Config.in @@ -1,6 +1,15 @@ @@ -60,7 +60,7 @@ index e2a7610..7c2edd7 100644 endmenu diff --git a/package/network/services/dropbear/Makefile b/package/network/services/dropbear/Makefile -index 35958d3..36bcb4a 100644 +index 35958d332cd0c9796ba50c433b13a3e24cd4441c..36bcb4ab7b6c57460cd15da1bcc130af62e32bc6 100644 --- a/package/network/services/dropbear/Makefile +++ b/package/network/services/dropbear/Makefile @@ -1,5 +1,5 @@ @@ -170,7 +170,7 @@ index 35958d3..36bcb4a 100644 define Package/dropbearconvert/install diff --git a/package/network/services/dropbear/files/dropbear.init b/package/network/services/dropbear/files/dropbear.init -index 6de0142..1653efb 100755 +index 6de0142728dfa127652ecceef1d25080069d800a..1653efbdb38b1037c3630595b903c839887a4e52 100755 --- a/package/network/services/dropbear/files/dropbear.init +++ b/package/network/services/dropbear/files/dropbear.init @@ -37,7 +37,6 @@ validate_section_dropbear() @@ -251,7 +251,7 @@ index 6de0142..1653efb 100755 } diff --git a/package/network/services/dropbear/patches/100-pubkey_path.patch b/package/network/services/dropbear/patches/100-pubkey_path.patch -index 456874b..41fdc1a 100644 +index 456874b730272f157bd3f4b2e9f65e14eda49b0b..41fdc1adab96cf9efffa8593000336c504fdf6fb 100644 --- a/package/network/services/dropbear/patches/100-pubkey_path.patch +++ b/package/network/services/dropbear/patches/100-pubkey_path.patch @@ -1,6 +1,6 @@ @@ -272,7 +272,7 @@ index 456874b..41fdc1a 100644 } diff --git a/package/network/services/dropbear/patches/110-change_user.patch b/package/network/services/dropbear/patches/110-change_user.patch -index 7982af6..4b5c1cb 100644 +index 7982af631539e351d3d46f50541115f9311612db..4b5c1cb51bb16a7229c03b6298796769e5752f6b 100644 --- a/package/network/services/dropbear/patches/110-change_user.patch +++ b/package/network/services/dropbear/patches/110-change_user.patch @@ -1,6 +1,6 @@ @@ -284,7 +284,7 @@ index 7982af6..4b5c1cb 100644 if (getuid() == 0) { diff --git a/package/network/services/dropbear/patches/120-openwrt_options.patch b/package/network/services/dropbear/patches/120-openwrt_options.patch -index 48dae73..f16aaf0 100644 +index 48dae73b1f7bcb052172f0a8d22d06203c80f993..f16aaf001eee11811be81fa1db399cf117e66595 100644 --- a/package/network/services/dropbear/patches/120-openwrt_options.patch +++ b/package/network/services/dropbear/patches/120-openwrt_options.patch @@ -18,7 +18,28 @@ @@ -346,7 +346,7 @@ index 48dae73..f16aaf0 100644 * SSH_ASKPASS instead. Comment out this var to remove this functionality.*/ diff --git a/package/network/services/dropbear/patches/130-ssh_ignore_o_and_x_args.patch b/package/network/services/dropbear/patches/130-ssh_ignore_o_and_x_args.patch deleted file mode 100644 -index edb2909..0000000 +index edb29093aece5423554ccd406e34b41466c25511..0000000000000000000000000000000000000000 --- a/package/network/services/dropbear/patches/130-ssh_ignore_o_and_x_args.patch +++ /dev/null @@ -1,21 +0,0 @@ @@ -373,7 +373,7 @@ index edb2909..0000000 - default: diff --git a/package/network/services/dropbear/patches/130-ssh_ignore_x_args.patch b/package/network/services/dropbear/patches/130-ssh_ignore_x_args.patch new file mode 100644 -index 0000000..ab09c2f +index 0000000000000000000000000000000000000000..ab09c2f3dc3a253fd18acae8d7d3b4b0f668e3dd --- /dev/null +++ b/package/network/services/dropbear/patches/130-ssh_ignore_x_args.patch @@ -0,0 +1,11 @@ @@ -389,7 +389,7 @@ index 0000000..ab09c2f + case 'e': + #ifndef ENABLE_USER_ALGO_LIST diff --git a/package/network/services/dropbear/patches/140-disable_assert.patch b/package/network/services/dropbear/patches/140-disable_assert.patch -index 0717228..78b54ac 100644 +index 0717228ef3de0576967b3824ca9709f95a326f61..78b54acfa0f52a4abbae497ed57a04cca7368c41 100644 --- a/package/network/services/dropbear/patches/140-disable_assert.patch +++ b/package/network/services/dropbear/patches/140-disable_assert.patch @@ -1,6 +1,6 @@ @@ -401,7 +401,7 @@ index 0717228..78b54ac 100644 /* Dropbear assertion */ diff --git a/package/network/services/dropbear/patches/150-dbconvert_standalone.patch b/package/network/services/dropbear/patches/150-dbconvert_standalone.patch -index 367dc2c..ccc2cb7 100644 +index 367dc2c68122f382273464fc7bf570fde18386ab..ccc2cb792598de77b4db6aa7b7b46e8eb7bf93a5 100644 --- a/package/network/services/dropbear/patches/150-dbconvert_standalone.patch +++ b/package/network/services/dropbear/patches/150-dbconvert_standalone.patch @@ -1,8 +1,8 @@ @@ -416,7 +416,7 @@ index 367dc2c..ccc2cb7 100644 +#if !defined(DROPBEAR_CLIENT) && !defined(DROPBEAR_SERVER) +#define DROPBEAR_SERVER diff --git a/package/network/services/dropbear/patches/500-set-default-path.patch b/package/network/services/dropbear/patches/500-set-default-path.patch -index e2add94..da6b9ae 100644 +index e2add9415fd4e7884a007ce7337ee8026bcc62a7..da6b9ae0ce0ae6a270f8c7bc6152cf09efbee15d 100644 --- a/package/network/services/dropbear/patches/500-set-default-path.patch +++ b/package/network/services/dropbear/patches/500-set-default-path.patch @@ -1,11 +1,12 @@ diff --git a/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch b/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch index 2b3aa8de..9c0ad5ab 100644 --- a/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch +++ b/patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch @@ -7,7 +7,7 @@ Signed-off-by: Tiziano Bacocco Backport of OpenWrt r48705 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 6c3ecf5..027a671 100755 +index 6c3ecf54dccd111231d93e539346f7839252794c..027a671215e5acd70cee06620c6648506ad6be47 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -377,6 +377,7 @@ wp543) @@ -19,7 +19,7 @@ index 6c3ecf5..027a671 100755 ucidef_set_interface_lan "eth1" ;; diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 0d8ccd2..5928439 100755 +index 0d8ccd21c3f552b7ae7aff6905a08ff6a4fdadf7..5928439f3ae253fc15eeb2ac30451ff467411e88 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -838,6 +838,9 @@ ar71xx_board_detect() { @@ -33,7 +33,7 @@ index 0d8ccd2..5928439 100755 name="tl-wa901nd" ;; diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index d4d9273..d7cbe2e 100644 +index d4d92738d0ab010e1d43ebed0baef34fd9bc3f9d..d7cbe2e79af31a0ff88d946323e237f3215620a0 100644 --- a/target/linux/ar71xx/config-3.18 +++ b/target/linux/ar71xx/config-3.18 @@ -120,6 +120,7 @@ CONFIG_ATH79_MACH_TL_MR3020=y @@ -46,7 +46,7 @@ index d4d9273..d7cbe2e 100644 CONFIG_ATH79_MACH_TL_WA901ND_V2=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c new file mode 100644 -index 0000000..39cdb10 +index 0000000000000000000000000000000000000000..39cdb10ee340650bc69e4f6054b06a4ae7421e57 --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c @@ -0,0 +1,136 @@ @@ -187,7 +187,7 @@ index 0000000..39cdb10 +MIPS_MACHINE(ATH79_MACH_TL_WA801ND_V3, "TL-WA801ND-v3", "TP-LINK TL-WA801ND v3", + tl_wa801n_v3_setup); diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index bb2bb94..868a502 100644 +index bb2bb94e04ee8f59db62907ace49952061b411dc..868a5021acb49878359497c90509de07faa3ca49 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -691,6 +691,13 @@ define Device/tl-wa801nd-v2 @@ -214,7 +214,7 @@ index bb2bb94..868a502 100644 define Device/tl-wa901nd-v3 $(Device/tplink-4mlzma) diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index c83ac2e..d23f0cf 100644 +index c83ac2e89324deda3135aab84e8c4f4112ea728d..d23f0cf33e50da891e7135861f1defda047ff2c8 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ @@ -537,7 +537,7 @@ index c83ac2e..d23f0cf 100644 +obj-$(CONFIG_ATH79_MACH_TL_WA901ND_V2) += mach-tl-wa901nd-v2.o +obj-$(CONFIG_ATH79_MACH_TL_WDR3500) += mach-tl-wdr3500.o diff --git a/tools/firmware-utils/src/mktplinkfw.c b/tools/firmware-utils/src/mktplinkfw.c -index 6df869d..9785a3f 100644 +index 6df869d59a6138d4c0dd1fbec5337a71c31eccd3..9785a3f232ed4457e77aee249c0da86b4e99c532 100644 --- a/tools/firmware-utils/src/mktplinkfw.c +++ b/tools/firmware-utils/src/mktplinkfw.c @@ -50,6 +50,7 @@ diff --git a/patches/openwrt/0069-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch b/patches/openwrt/0069-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch index 9211d22b..9c91219c 100644 --- a/patches/openwrt/0069-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch +++ b/patches/openwrt/0069-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch @@ -3,7 +3,7 @@ Date: Sun, 28 Aug 2016 20:20:35 +0200 Subject: firmware-utils: mktplinkfw: backport from LEDE a4fc62bc0ea4010ddbfbd738453c9db70988a57c diff --git a/tools/firmware-utils/Makefile b/tools/firmware-utils/Makefile -index 0397845..aee8e87 100644 +index 03978456636ad50fc8128c0a5a51845135301a3d..aee8e87a1c0839f3220686e97cd8458516fc17cf 100644 --- a/tools/firmware-utils/Makefile +++ b/tools/firmware-utils/Makefile @@ -40,7 +40,7 @@ define Host/Compile @@ -16,7 +16,7 @@ index 0397845..aee8e87 100644 $(call cc,tplink-safeloader md5, -Wall) $(call cc,pc1crypt) diff --git a/tools/firmware-utils/src/mktplinkfw.c b/tools/firmware-utils/src/mktplinkfw.c -index 9785a3f..34e6546 100644 +index 9785a3f232ed4457e77aee249c0da86b4e99c532..34e6546a2d7db72748146ef233830c2e8de9ce97 100644 --- a/tools/firmware-utils/src/mktplinkfw.c +++ b/tools/firmware-utils/src/mktplinkfw.c @@ -28,53 +28,10 @@ diff --git a/patches/openwrt/0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch b/patches/openwrt/0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch index cef1e8a2..3e9dd981 100644 --- a/patches/openwrt/0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch +++ b/patches/openwrt/0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch @@ -6,7 +6,7 @@ Generate flashable images for the Archer C7 v2 with current stock firmware again. diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 868a502..95f6d46 100644 +index 868a5021acb49878359497c90509de07faa3ca49..95f6d46d15b43faabb0bbf9301476d3ea5bee470 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -58,13 +58,14 @@ define Build/mktplinkfw diff --git a/patches/openwrt/0071-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch b/patches/openwrt/0071-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch index 2824a307..46e178b7 100644 --- a/patches/openwrt/0071-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch +++ b/patches/openwrt/0071-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch @@ -3,7 +3,7 @@ Date: Fri, 9 Sep 2016 01:54:44 +0200 Subject: ath10k-firmware: add ath10k-firmware-qca988x-11s diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile -index 624da6a..3a4f0c5 100644 +index 624da6a1ed43ea37bbb3409b3dbe4b3af01263b5..3a4f0c59eb89a32f78f0104d2420b921d6660ddc 100644 --- a/package/firmware/ath10k-firmware/Makefile +++ b/package/firmware/ath10k-firmware/Makefile @@ -8,7 +8,7 @@ diff --git a/patches/openwrt/0072-ath9k-revert-temperature-compensation-support-patch-FS-111.patch b/patches/openwrt/0072-ath9k-revert-temperature-compensation-support-patch-FS-111.patch index 803db695..9a6fb9b6 100644 --- a/patches/openwrt/0072-ath9k-revert-temperature-compensation-support-patch-FS-111.patch +++ b/patches/openwrt/0072-ath9k-revert-temperature-compensation-support-patch-FS-111.patch @@ -8,7 +8,7 @@ Backport of LEDE 3e4d0e3e77dcf9b2116e5ed53f30e2bf53b1c6b7 diff --git a/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch deleted file mode 100644 -index cff32ad..0000000 +index cff32ad47cb0b905d9cfa4eb021258b644b2a47a..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch +++ /dev/null @@ -1,97 +0,0 @@ @@ -110,7 +110,7 @@ index cff32ad..0000000 - struct ath9k_cal_list adcdc_caldata; - struct ath9k_cal_list *cal_list; diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch -index 4615643..6edef09 100644 +index 461564350feb43410e5c702a8a67514cdfaa3961..6edef0975431165285a7b937442b5d89b362c807 100644 --- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch +++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch @@ -84,7 +84,7 @@ diff --git a/patches/openwrt/0073-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch b/patches/openwrt/0073-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch index f55441e7..28f9e7c8 100644 --- a/patches/openwrt/0073-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch +++ b/patches/openwrt/0073-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch @@ -8,7 +8,7 @@ Backport of LEDE 04a69843198f2252992812e35ac05016db4a1a94 diff --git a/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch b/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch deleted file mode 100644 -index f8b8f86..0000000 +index f8b8f86e03ba0786ef410db31d6de2ab691430bd..0000000000000000000000000000000000000000 --- a/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch +++ /dev/null @@ -1,871 +0,0 @@ diff --git a/patches/openwrt/0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch b/patches/openwrt/0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch index 46d945a1..0632a054 100644 --- a/patches/openwrt/0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch +++ b/patches/openwrt/0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch @@ -16,7 +16,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 83f7ec31f8f9641ef842212c45db61b72682debf diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 95f6d46..9ac1d60 100644 +index 95f6d46d15b43faabb0bbf9301476d3ea5bee470..9ac1d60078cf108276d6f29c42bdb738fab6ad9d 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -736,6 +736,7 @@ define Device/tl-wa901nd-v4 diff --git a/patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch b/patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch index 91eb2316..131141ce 100644 --- a/patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch +++ b/patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch @@ -7,7 +7,7 @@ Fixes f98117a "CC: ar71xx: backport LED fix for TL-WR841N-v11". Signed-off-by: Matthias Schiffer diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index f1266d8..87d6fcc 100644 +index f1266d88f1b6a441e58b0a008ca915a4b5958928..87d6fcc4d74571ca98acc53ae76ea6f305d8c8c6 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -500,7 +500,7 @@ tl-wa830re-v2) diff --git a/patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch b/patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch index 51b1e001..deb51586 100644 --- a/patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch +++ b/patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch @@ -11,7 +11,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 9cac5e8be014b89326880ae5d7b885013614e0ca diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 9ac1d60..6346eb9 100644 +index 9ac1d60078cf108276d6f29c42bdb738fab6ad9d..6346eb9ffa6c9bbeb1eaa5de229cf69ce12c1f83 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -602,6 +602,9 @@ define Device/tl-wr841n-v11 diff --git a/patches/openwrt/0077-x86-64-add-pata-drivers.patch b/patches/openwrt/0077-x86-64-add-pata-drivers.patch index 15faeea6..df197b0e 100644 --- a/patches/openwrt/0077-x86-64-add-pata-drivers.patch +++ b/patches/openwrt/0077-x86-64-add-pata-drivers.patch @@ -3,7 +3,7 @@ Date: Wed, 9 Nov 2016 04:39:16 +0100 Subject: x86-64: add pata drivers diff --git a/target/linux/x86/64/config-default b/target/linux/x86/64/config-default -index 1caad74..1fda585 100644 +index 1caad741a623e9481907dff59c37de8c173bb7d7..1fda58562c6821e8524d00617ed040d11ee731d7 100644 --- a/target/linux/x86/64/config-default +++ b/target/linux/x86/64/config-default @@ -131,6 +131,14 @@ CONFIG_PARAVIRT_CLOCK=y diff --git a/patches/openwrt/0078-x86-add-mmc-drivers-to-generic-64.patch b/patches/openwrt/0078-x86-add-mmc-drivers-to-generic-64.patch index 1a9ccd7b..deee9aa4 100644 --- a/patches/openwrt/0078-x86-add-mmc-drivers-to-generic-64.patch +++ b/patches/openwrt/0078-x86-add-mmc-drivers-to-generic-64.patch @@ -3,7 +3,7 @@ Date: Wed, 9 Nov 2016 04:39:59 +0100 Subject: x86: add mmc drivers to generic+64 diff --git a/target/linux/x86/64/config-default b/target/linux/x86/64/config-default -index 1fda585..9d2cfdb 100644 +index 1fda58562c6821e8524d00617ed040d11ee731d7..9d2cfdbd9f7c2006b543599d398f2d5966f6333e 100644 --- a/target/linux/x86/64/config-default +++ b/target/linux/x86/64/config-default @@ -117,6 +117,14 @@ CONFIG_LPC_ICH=y @@ -22,7 +22,7 @@ index 1fda585..9d2cfdb 100644 # CONFIG_MPSC is not set CONFIG_MUTEX_SPIN_ON_OWNER=y diff --git a/target/linux/x86/generic/config-default b/target/linux/x86/generic/config-default -index 4fc5131..1d72811 100644 +index 4fc513154bd566319d77e6e42622ef362baeb094..1d72811f4b67225043513dec9173a79969c49313 100644 --- a/target/linux/x86/generic/config-default +++ b/target/linux/x86/generic/config-default @@ -136,6 +136,14 @@ CONFIG_ISO9660_FS=y diff --git a/patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch b/patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch index a3fa2b6d..86ecfcb7 100644 --- a/patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch +++ b/patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch @@ -8,7 +8,7 @@ Backport of LEDE a250556d27556ec94a8d800fd27be40c2de8139c diff --git a/package/kernel/mac80211/patches/331-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-succ.patch b/package/kernel/mac80211/patches/331-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-succ.patch new file mode 100644 -index 0000000..627b401 +index 0000000000000000000000000000000000000000..627b401300ad9fc0d5527ce9e7325c87b33e6313 --- /dev/null +++ b/package/kernel/mac80211/patches/331-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-succ.patch @@ -0,0 +1,29 @@ diff --git a/patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch b/patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch index 75b81e4a..f0c1cff0 100644 --- a/patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch +++ b/patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch @@ -12,7 +12,7 @@ Signed-off-by: Matthias Schiffer Backport of LEDE 5247ac2f805e39afe2e6e30980e439ea8b8ae7f8 diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 87d6fcc..2a0f996 100644 +index 87d6fcc4d74571ca98acc53ae76ea6f305d8c8c6..2a0f9969cd22543de6e54a484052a27414c5d093 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -18,14 +18,14 @@ alfa-nx) @@ -87,7 +87,7 @@ index 87d6fcc..2a0f996 100644 ucidef_set_led_rssi "signal2" "SIGNAL2" "alfa:orange:signal2" "wlan0" "26" "100" "-25" "13" ucidef_set_led_rssi "signal3" "SIGNAL3" "alfa:green:signal3" "wlan0" "51" "100" "-50" "13" diff --git a/target/linux/ramips/base-files/etc/board.d/01_leds b/target/linux/ramips/base-files/etc/board.d/01_leds -index 5fb28a5..2b0341d 100755 +index 5fb28a52f7632bf09e7f62ff77dcd7254a2ebcc2..2b0341d3991e03e1f95376992b840ad10c41cdf4 100755 --- a/target/linux/ramips/base-files/etc/board.d/01_leds +++ b/target/linux/ramips/base-files/etc/board.d/01_leds @@ -40,7 +40,7 @@ case $board in diff --git a/patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch b/patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch index f2967b1a..83b71e7d 100644 --- a/patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch +++ b/patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch @@ -12,7 +12,7 @@ Bug-gluon: https://github.com/freifunk-gluon/gluon/issues/911 diff --git a/target/linux/ar71xx/patches-3.18/735-net-phy-at803x-fix-at8033-sgmii-mode.patch b/target/linux/ar71xx/patches-3.18/735-net-phy-at803x-fix-at8033-sgmii-mode.patch new file mode 100644 -index 0000000..4a8f532 +index 0000000000000000000000000000000000000000..4a8f532aa36f729339e01ebadd6ea3cb292d7ac9 --- /dev/null +++ b/target/linux/ar71xx/patches-3.18/735-net-phy-at803x-fix-at8033-sgmii-mode.patch @@ -0,0 +1,96 @@ diff --git a/patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch b/patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch index ffb357d0..7086cdff 100644 --- a/patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch +++ b/patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch @@ -5,7 +5,7 @@ Subject: ar71xx: fix LEDs and sysupgrade support for TL-WA801ND v3 Signed-off-by: Matthias Schiffer diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 2c5d6af..6b0caa6 100644 +index 2c5d6af8f4e2c5ce71adc0b63d32b8506e01b6a2..6b0caa676e6fc23be94c5eae77ae72e76f07fec3 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -274,6 +274,7 @@ get_status_led() { @@ -17,7 +17,7 @@ index 2c5d6af..6b0caa6 100644 tl-wr841n-v7 | \ tl-wr841n-v8 | \ diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 2a0f996..849755f 100644 +index 2a0f9969cd22543de6e54a484052a27414c5d093..849755fb752c62a6fabf0ec609381b5d22991f1a 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -536,6 +536,11 @@ tl-wa901nd-v3) @@ -33,7 +33,7 @@ index 2a0f996..849755f 100644 tl-wr1041n-v2) ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index 4003b21..ee2e596 100755 +index 4003b21df26917a521ed96db82a970a82cdbc2cb..ee2e596e1f5e462e544a919ca8ebca525e43cec9 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -349,6 +349,7 @@ platform_check_image() { @@ -45,7 +45,7 @@ index 4003b21..ee2e596 100755 tl-wa901nd-v2 | \ tl-wa901nd-v3 | \ diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c -index 39cdb10..054c14e 100644 +index 39cdb10ee340650bc69e4f6054b06a4ae7421e57..054c14ee73faf629e1faf1efb19e804734602981 100644 --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wa801nd-v3.c @@ -24,7 +24,7 @@ diff --git a/patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch b/patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch index ca7ef944..9c743dfa 100644 --- a/patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch +++ b/patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch @@ -8,7 +8,7 @@ for each model explicitly. Signed-off-by: Matthias Schiffer diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 5928439..4a9a730 100755 +index 5928439f3ae253fc15eeb2ac30451ff467411e88..4a9a730caa3b7fa6321192812f407caf736f65a9 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -329,24 +329,10 @@ tplink_pharos_get_model_string() { diff --git a/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch b/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch index 2949e2ee..68fe1fc7 100644 --- a/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch +++ b/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch @@ -8,7 +8,7 @@ never actually used and have been removed from the stock firmwares. Signed-off-by: Matthias Schiffer diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c -index 4938f74..4a38dff 100644 +index 4938f74eecd122265072390e1c6b8cadb09844d0..4a38dff10003825a3b72595d57f0e62ef233e9bc 100644 --- a/tools/firmware-utils/src/tplink-safeloader.c +++ b/tools/firmware-utils/src/tplink-safeloader.c @@ -169,8 +169,13 @@ static const char cpe210_support_list[] = diff --git a/patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch b/patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch index 7612be88..0711f78d 100644 --- a/patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch +++ b/patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch @@ -5,7 +5,7 @@ Subject: ar71xx-generic: add Support for TP-LINK TL-WR940N v4 Signed-off-by: David Lutz diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh -index 6b0caa6..67043d4 100644 +index 6b0caa676e6fc23be94c5eae77ae72e76f07fec3..67043d432cf7a469bf1ded14bc354274ab16e3e6 100644 --- a/target/linux/ar71xx/base-files/etc/diag.sh +++ b/target/linux/ar71xx/base-files/etc/diag.sh @@ -296,6 +296,7 @@ get_status_led() { @@ -17,7 +17,7 @@ index 6b0caa6..67043d4 100644 status_led="tp-link:blue:system" ;; diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds -index 849755f..e47cbb0 100644 +index 849755fb752c62a6fabf0ec609381b5d22991f1a..e47cbb0b01ef4a335c059a74af66d9f8999b3b3d 100644 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds @@ -486,6 +486,7 @@ tl-wr941nd-v5) @@ -29,7 +29,7 @@ index 849755f..e47cbb0 100644 ucidef_set_led_netdev "wan" "WAN" "tp-link:blue:wan" "eth0" ucidef_set_led_switch "lan1" "LAN1" "tp-link:blue:lan1" "switch0" "0x10" diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network -index 027a671..878623c 100755 +index 027a671215e5acd70cee06620c6648506ad6be47..878623ce3fd8b7c585da73c7bd72794a144096a3 100755 --- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network @@ -229,6 +229,7 @@ tl-wr841n-v8 |\ @@ -41,7 +41,7 @@ index 027a671..878623c 100755 wnr2000-v4 |\ wnr2200 |\ diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh -index 4a9a730..6df0d8a 100755 +index 4a9a730caa3b7fa6321192812f407caf736f65a9..6df0d8a8d0d52c103b9ded2170af19a9a6b5f8bb 100755 --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh @@ -235,6 +235,9 @@ tplink_board_detect() { @@ -65,7 +65,7 @@ index 4a9a730..6df0d8a 100755 name="tl-wr703n" ;; diff --git a/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx b/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx -index f552453..e5e4abd 100644 +index f552453e43363c5ab687116eee1889af8171dbb6..e5e4abd547f38ecda4a0cb67858df8f5d3477d59 100644 --- a/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx +++ b/target/linux/ar71xx/base-files/lib/preinit/05_set_preinit_iface_ar71xx @@ -36,6 +36,7 @@ set_preinit_iface() { @@ -77,7 +77,7 @@ index f552453..e5e4abd 100644 wnr2200 |\ wnr612-v2 |\ diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh -index ee2e596..76c252c 100755 +index ee2e596e1f5e462e544a919ca8ebca525e43cec9..76c252ccb14db970aac63ea1d2eaddca3d867867 100755 --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh @@ -373,6 +373,7 @@ platform_check_image() { @@ -89,7 +89,7 @@ index ee2e596..76c252c 100755 tl-wr1043nd | \ tl-wr1043nd-v2 | \ diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 -index d7cbe2e..0503626 100644 +index d7cbe2e79af31a0ff88d946323e237f3215620a0..050362614a464b56d3740a7954686fe4e5b37803 100644 --- a/target/linux/ar71xx/config-3.18 +++ b/target/linux/ar71xx/config-3.18 @@ -141,6 +141,7 @@ CONFIG_ATH79_MACH_TL_WR841N_V8=y @@ -102,7 +102,7 @@ index d7cbe2e..0503626 100644 CONFIG_ATH79_MACH_UBNT_UNIFIAC=y diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr940n-v4.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr940n-v4.c new file mode 100644 -index 0000000..d693b94 +index 0000000000000000000000000000000000000000..d693b947c843d2a74cd252503fa8bf68b20da4ab --- /dev/null +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr940n-v4.c @@ -0,0 +1,149 @@ @@ -256,7 +256,7 @@ index 0000000..d693b94 +MIPS_MACHINE(ATH79_MACH_TL_WR940N_V4, "TL-WR940N-v4", "TP-LINK TL-WR940N v4", + tl_wr940n_v4_setup); diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 6346eb9..b35c713 100644 +index 6346eb9ffa6c9bbeb1eaa5de229cf69ce12c1f83..b35c713f3c92c3d02f26f4bf535aeec34fd71b12 100644 --- a/target/linux/ar71xx/image/Makefile +++ b/target/linux/ar71xx/image/Makefile @@ -650,6 +650,16 @@ define Device/tl-wr941nd-v6 @@ -286,7 +286,7 @@ index 6346eb9..b35c713 100644 define Device/tl-wr1041n-v2 $(Device/tplink-4mlzma) diff --git a/target/linux/ar71xx/mikrotik/config-default b/target/linux/ar71xx/mikrotik/config-default -index 2b1fe24..75155b2 100644 +index 2b1fe2491c7a00449453efdc4969015ec1b28291..75155b22489a60748b3b1357a1d9c549092255ba 100644 --- a/target/linux/ar71xx/mikrotik/config-default +++ b/target/linux/ar71xx/mikrotik/config-default @@ -94,6 +94,7 @@ CONFIG_ATH79_MACH_RBSXTLITE=y @@ -298,7 +298,7 @@ index 2b1fe24..75155b2 100644 # CONFIG_ATH79_MACH_UBNT is not set # CONFIG_ATH79_MACH_UBNT_XM is not set diff --git a/target/linux/ar71xx/nand/config-default b/target/linux/ar71xx/nand/config-default -index f62cf1a..802d6e0 100644 +index f62cf1a4399718b2f4e94a974d26ddaf8d46a8ec..802d6e0502b51a4ecf2259c20e9b6667cd255680 100644 --- a/target/linux/ar71xx/nand/config-default +++ b/target/linux/ar71xx/nand/config-default @@ -57,6 +57,7 @@ @@ -310,7 +310,7 @@ index f62cf1a..802d6e0 100644 # CONFIG_ATH79_MACH_UBNT_XM is not set # CONFIG_ATH79_MACH_UBNT_UNIFIAC is not set diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch -index d23f0cf..b751746 100644 +index d23f0cf33e50da891e7135861f1defda047ff2c8..b7517464742679b66c3bd916b9b2a2fcc34b65e1 100644 --- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch @@ -1,6 +1,6 @@ diff --git a/patches/packages/luci/0001-fvalue.html-add-label-that-can-be-styled.patch b/patches/packages/luci/0001-fvalue.html-add-label-that-can-be-styled.patch index 8a01351f..49884984 100644 --- a/patches/packages/luci/0001-fvalue.html-add-label-that-can-be-styled.patch +++ b/patches/packages/luci/0001-fvalue.html-add-label-that-can-be-styled.patch @@ -3,7 +3,7 @@ Date: Sat, 9 Aug 2014 09:33:21 +0200 Subject: fvalue.html: add label that can be styled diff --git a/modules/luci-base/luasrc/view/cbi/fvalue.htm b/modules/luci-base/luasrc/view/cbi/fvalue.htm -index a1e0808..a324ab2 100644 +index a1e0808e8d3e8bf1845d4838b244ed6bb0b605f2..a324ab258a86b080f9bf285aa62ee4db43468a81 100644 --- a/modules/luci-base/luasrc/view/cbi/fvalue.htm +++ b/modules/luci-base/luasrc/view/cbi/fvalue.htm @@ -6,4 +6,5 @@ diff --git a/patches/packages/luci/0002-modules-base-dispatcher-set-default-language-if-none-provided-by-the-browser-matches.patch b/patches/packages/luci/0002-modules-base-dispatcher-set-default-language-if-none-provided-by-the-browser-matches.patch index 2a64ef95..d1ad5944 100644 --- a/patches/packages/luci/0002-modules-base-dispatcher-set-default-language-if-none-provided-by-the-browser-matches.patch +++ b/patches/packages/luci/0002-modules-base-dispatcher-set-default-language-if-none-provided-by-the-browser-matches.patch @@ -3,7 +3,7 @@ Date: Thu, 19 Mar 2015 18:44:52 +0100 Subject: modules/base: dispatcher: set default language if none provided by the browser matches diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua -index 2526950..be2fc34 100644 +index 25269501068dd26efe5b85706b555996d63b0f6d..be2fc3453f528853519649e4b64ecb3fd14d80be 100644 --- a/modules/luci-base/luasrc/dispatcher.lua +++ b/modules/luci-base/luasrc/dispatcher.lua @@ -182,6 +182,7 @@ function dispatch(request) diff --git a/patches/packages/luci/0003-luci-lib-jsonc-Ignore-non-string-or-number-keys-in-tables.patch b/patches/packages/luci/0003-luci-lib-jsonc-Ignore-non-string-or-number-keys-in-tables.patch index 584a2fab..c1fc1438 100644 --- a/patches/packages/luci/0003-luci-lib-jsonc-Ignore-non-string-or-number-keys-in-tables.patch +++ b/patches/packages/luci/0003-luci-lib-jsonc-Ignore-non-string-or-number-keys-in-tables.patch @@ -15,7 +15,7 @@ representation altogether. Signed-off-by: Jan-Philipp Litza diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c -index 49cb21f..827fde8 100644 +index 49cb21f5bcb2817792d0eef8dc5cd567bc6d86bc..827fde8843082e956b0c89b5855feeabd790e880 100644 --- a/libs/luci-lib-jsonc/src/jsonc.c +++ b/libs/luci-lib-jsonc/src/jsonc.c @@ -286,8 +286,9 @@ static struct json_object * _lua_to_json(lua_State *L, int index) diff --git a/patches/packages/luci/0004-luci-lib-jsonc-allow-encoding-empty-lists.patch b/patches/packages/luci/0004-luci-lib-jsonc-allow-encoding-empty-lists.patch index 8d6b6842..55184774 100644 --- a/patches/packages/luci/0004-luci-lib-jsonc-allow-encoding-empty-lists.patch +++ b/patches/packages/luci/0004-luci-lib-jsonc-allow-encoding-empty-lists.patch @@ -15,7 +15,7 @@ function) can be used to force encoding as an object: Signed-off-by: Jan-Philipp Litza diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c -index 827fde8..971fb12 100644 +index 827fde8843082e956b0c89b5855feeabd790e880..971fb122f7655b379e717ef78a5417032ead9a57 100644 --- a/libs/luci-lib-jsonc/src/jsonc.c +++ b/libs/luci-lib-jsonc/src/jsonc.c @@ -222,7 +222,7 @@ static int _lua_test_array(lua_State *L, int index) diff --git a/patches/packages/luci/0005-luci-lib-jsonc-Fix-memory-leak-in-stringify.patch b/patches/packages/luci/0005-luci-lib-jsonc-Fix-memory-leak-in-stringify.patch index 4e21055a..473a1f9e 100644 --- a/patches/packages/luci/0005-luci-lib-jsonc-Fix-memory-leak-in-stringify.patch +++ b/patches/packages/luci/0005-luci-lib-jsonc-Fix-memory-leak-in-stringify.patch @@ -3,7 +3,7 @@ Date: Mon, 31 Aug 2015 19:52:36 +0200 Subject: luci-lib-jsonc: Fix memory leak in stringify() diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c -index 971fb12..b857c97 100644 +index 971fb122f7655b379e717ef78a5417032ead9a57..b857c979e93bec395bca164a4f144c7c69005bec 100644 --- a/libs/luci-lib-jsonc/src/jsonc.c +++ b/libs/luci-lib-jsonc/src/jsonc.c @@ -106,6 +106,7 @@ static int json_stringify(lua_State *L) diff --git a/patches/packages/luci/0006-luci-lib-jsonc-Add-ltn12-compatible-sink-factory.patch b/patches/packages/luci/0006-luci-lib-jsonc-Add-ltn12-compatible-sink-factory.patch index 34c51c17..86ccc9cb 100644 --- a/patches/packages/luci/0006-luci-lib-jsonc-Add-ltn12-compatible-sink-factory.patch +++ b/patches/packages/luci/0006-luci-lib-jsonc-Add-ltn12-compatible-sink-factory.patch @@ -15,7 +15,7 @@ from stdin), the following code will now do: Signed-off-by: Jan-Philipp Litza diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c -index b857c97..ef11101 100644 +index b857c979e93bec395bca164a4f144c7c69005bec..ef1110166055a78bf32cf1a6fbbd3e356b2bce3f 100644 --- a/libs/luci-lib-jsonc/src/jsonc.c +++ b/libs/luci-lib-jsonc/src/jsonc.c @@ -328,6 +328,76 @@ static int json_parse_set(lua_State *L) @@ -104,7 +104,7 @@ index b857c97..ef11101 100644 { "__gc", json_gc }, diff --git a/libs/luci-lib-jsonc/src/jsonc.luadoc b/libs/luci-lib-jsonc/src/jsonc.luadoc -index 2ee9ceb..720b17d 100644 +index 2ee9cebdc889242595f5281228783df15b9b8dcd..720b17d1eb76d8eb9a8b47939ac724891cfb3886 100644 --- a/libs/luci-lib-jsonc/src/jsonc.luadoc +++ b/libs/luci-lib-jsonc/src/jsonc.luadoc @@ -121,10 +121,22 @@ parser:set({ "some", "data" })` diff --git a/patches/packages/luci/0007-model.uci-add-add_to_set-remove_from_set.patch b/patches/packages/luci/0007-model.uci-add-add_to_set-remove_from_set.patch index 6c998311..37abb91c 100644 --- a/patches/packages/luci/0007-model.uci-add-add_to_set-remove_from_set.patch +++ b/patches/packages/luci/0007-model.uci-add-add_to_set-remove_from_set.patch @@ -13,7 +13,7 @@ i.e. duplicated values will be removed. Also, order is not preserved. Signed-off-by: Nils Schneider diff --git a/modules/luci-base/luasrc/model/uci.lua b/modules/luci-base/luasrc/model/uci.lua -index 1659137..d35b9d7 100644 +index 1659137742940ea0621e2b57e98232f393dc7efa..d35b9d70e27913c9da302c6975a97888774de535 100644 --- a/modules/luci-base/luasrc/model/uci.lua +++ b/modules/luci-base/luasrc/model/uci.lua @@ -9,7 +9,7 @@ local table = require "table" @@ -67,7 +67,7 @@ index 1659137..d35b9d7 100644 function Cursor._affected(self, configlist) configlist = type(configlist) == "table" and configlist or {configlist} diff --git a/modules/luci-base/luasrc/model/uci.luadoc b/modules/luci-base/luasrc/model/uci.luadoc -index 1c20866..281bdb2 100644 +index 1c208669d17f24d2d1de99bbbf1cefe878649014..281bdb2953ee1888ee41d8d0fb1cc40e9345b3e0 100644 --- a/modules/luci-base/luasrc/model/uci.luadoc +++ b/modules/luci-base/luasrc/model/uci.luadoc @@ -116,6 +116,30 @@ Set given values as list. diff --git a/patches/packages/luci/0008-Move-rpcd-dependency-from-luci-base-to-luci-mode-rpc.patch b/patches/packages/luci/0008-Move-rpcd-dependency-from-luci-base-to-luci-mode-rpc.patch index ceacdf5a..6376d6a2 100644 --- a/patches/packages/luci/0008-Move-rpcd-dependency-from-luci-base-to-luci-mode-rpc.patch +++ b/patches/packages/luci/0008-Move-rpcd-dependency-from-luci-base-to-luci-mode-rpc.patch @@ -6,7 +6,7 @@ LuCI's authentication won't work without rpcd, but we aren't using the authentication anyways. Users who need it can just install rpcd explicitly. diff --git a/modules/luci-base/Makefile b/modules/luci-base/Makefile -index 54506b0..4457034 100644 +index 54506b023a728e071b8fb4983ef614897363c0ec..4457034ada02972908a68f7c9c54352e7ac3c054 100644 --- a/modules/luci-base/Makefile +++ b/modules/luci-base/Makefile @@ -12,7 +12,7 @@ LUCI_TYPE:=mod @@ -19,7 +19,7 @@ index 54506b0..4457034 100644 PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2 PKG_SOURCE_URL:=https://luasrcdiet.googlecode.com/files diff --git a/modules/luci-mod-rpc/Makefile b/modules/luci-mod-rpc/Makefile -index e64c86c..5f64a14 100644 +index e64c86c6283a5a7d1181816e9f148d78d15c7dd8..5f64a14d48ef1f74435e151bc03a2377239be1f8 100644 --- a/modules/luci-mod-rpc/Makefile +++ b/modules/luci-mod-rpc/Makefile @@ -7,7 +7,7 @@ diff --git a/patches/packages/openwrt/0001-node-add-python-host-to-HOST_BUILD_DEPENDS-as-well.patch b/patches/packages/openwrt/0001-node-add-python-host-to-HOST_BUILD_DEPENDS-as-well.patch index f0c746aa..63929b27 100644 --- a/patches/packages/openwrt/0001-node-add-python-host-to-HOST_BUILD_DEPENDS-as-well.patch +++ b/patches/packages/openwrt/0001-node-add-python-host-to-HOST_BUILD_DEPENDS-as-well.patch @@ -5,7 +5,7 @@ Subject: node: add python/host to HOST_BUILD_DEPENDS as well Signed-off-by: Matthias Schiffer diff --git a/lang/node/Makefile b/lang/node/Makefile -index 65a5390..243c8a5 100644 +index 65a53900c7a907f41380469571fb5bd22028f62e..243c8a5b69ae6bd12b84493de3b26992167f2c17 100644 --- a/lang/node/Makefile +++ b/lang/node/Makefile @@ -14,6 +14,7 @@ PKG_RELEASE:=1 diff --git a/patches/packages/openwrt/0002-lua-cjson-add-host-build-support.patch b/patches/packages/openwrt/0002-lua-cjson-add-host-build-support.patch index 08fba881..b3f650cd 100644 --- a/patches/packages/openwrt/0002-lua-cjson-add-host-build-support.patch +++ b/patches/packages/openwrt/0002-lua-cjson-add-host-build-support.patch @@ -3,7 +3,7 @@ Date: Wed, 30 Dec 2015 01:00:49 +0100 Subject: lua-cjson: add host build support diff --git a/lang/lua-cjson/Makefile b/lang/lua-cjson/Makefile -index fbdcf17..1adfeb3 100644 +index fbdcf17d1f0be7afeb512705137e438f47687850..1adfeb3b537f8b38d81148d4a8266485d7a05ab4 100644 --- a/lang/lua-cjson/Makefile +++ b/lang/lua-cjson/Makefile @@ -20,6 +20,7 @@ PKG_MD5SUM:=24f270663e9f6ca8ba2a02cef19f7963 diff --git a/patches/packages/openwrt/0003-libuecc-update-to-v7.patch b/patches/packages/openwrt/0003-libuecc-update-to-v7.patch index 379e0a27..a2ee9a48 100644 --- a/patches/packages/openwrt/0003-libuecc-update-to-v7.patch +++ b/patches/packages/openwrt/0003-libuecc-update-to-v7.patch @@ -5,7 +5,7 @@ Subject: libuecc: update to v7 Signed-off-by: Matthias Schiffer diff --git a/libs/libuecc/Makefile b/libs/libuecc/Makefile -index 63b6ebe..c1ba53f 100644 +index 63b6ebe217fc2ff105a1a223807c610c31158eb8..c1ba53f854b5f0e29728f0a4d2e8f682ff8357a3 100644 --- a/libs/libuecc/Makefile +++ b/libs/libuecc/Makefile @@ -1,5 +1,5 @@ diff --git a/patches/packages/openwrt/0004-fastd-update-to-v18.patch b/patches/packages/openwrt/0004-fastd-update-to-v18.patch index fd947214..afe458e5 100644 --- a/patches/packages/openwrt/0004-fastd-update-to-v18.patch +++ b/patches/packages/openwrt/0004-fastd-update-to-v18.patch @@ -5,7 +5,7 @@ Subject: fastd: update to v18 Signed-off-by: Matthias Schiffer diff --git a/net/fastd/Config.in b/net/fastd/Config.in -index 5820b97..3350eb3 100644 +index 5820b9796562cd11826f8bbefbb02806fe516c61..3350eb3099a26c870d70373c0712a8b59881ee5c 100644 --- a/net/fastd/Config.in +++ b/net/fastd/Config.in @@ -74,6 +74,12 @@ config FASTD_ENABLE_MAC_UHASH @@ -22,7 +22,7 @@ index 5820b97..3350eb3 100644 bool "Include support for setting user/group related options on the command line" depends on PACKAGE_fastd diff --git a/net/fastd/Makefile b/net/fastd/Makefile -index 027f549..5c550d8 100644 +index 027f5491d2f6b066affe08e846b1967900c391e1..5c550d8a5f4669d4f018dde23b622376bc8d0b06 100644 --- a/net/fastd/Makefile +++ b/net/fastd/Makefile @@ -8,13 +8,13 @@ diff --git a/patches/packages/openwrt/0005-node-update-to-v0.12.14.patch b/patches/packages/openwrt/0005-node-update-to-v0.12.14.patch index be6b8a15..dd52f71a 100644 --- a/patches/packages/openwrt/0005-node-update-to-v0.12.14.patch +++ b/patches/packages/openwrt/0005-node-update-to-v0.12.14.patch @@ -7,7 +7,7 @@ While we're at it, also enable parallel builds. Signed-off-by: Matthias Schiffer diff --git a/lang/node/Makefile b/lang/node/Makefile -index 243c8a5..ed35e17 100644 +index 243c8a5b69ae6bd12b84493de3b26992167f2c17..ed35e1729bb01bcbb89e43f975940e675d774cde 100644 --- a/lang/node/Makefile +++ b/lang/node/Makefile @@ -8,17 +8,21 @@ diff --git a/patches/packages/openwrt/0006-node-fix-undefined-behaviour-leading-to-broken-code-with-GCC-6.patch b/patches/packages/openwrt/0006-node-fix-undefined-behaviour-leading-to-broken-code-with-GCC-6.patch index ae5162e2..b183cf19 100644 --- a/patches/packages/openwrt/0006-node-fix-undefined-behaviour-leading-to-broken-code-with-GCC-6.patch +++ b/patches/packages/openwrt/0006-node-fix-undefined-behaviour-leading-to-broken-code-with-GCC-6.patch @@ -10,7 +10,7 @@ Signed-off-by: Matthias Schiffer diff --git a/lang/node/patches/004-gcc6-undefined-behaviour.patch b/lang/node/patches/004-gcc6-undefined-behaviour.patch new file mode 100644 -index 0000000..dbbbcf0 +index 0000000000000000000000000000000000000000..dbbbcf0c54bb62f643521411668772531d42b89a --- /dev/null +++ b/lang/node/patches/004-gcc6-undefined-behaviour.patch @@ -0,0 +1,64 @@ diff --git a/patches/packages/openwrt/0007-libuecc-use-shared-instead-of-static-library.patch b/patches/packages/openwrt/0007-libuecc-use-shared-instead-of-static-library.patch index 27ec355a..a2354f60 100644 --- a/patches/packages/openwrt/0007-libuecc-use-shared-instead-of-static-library.patch +++ b/patches/packages/openwrt/0007-libuecc-use-shared-instead-of-static-library.patch @@ -5,7 +5,7 @@ Subject: libuecc: use shared instead of static library Signed-off-by: Matthias Schiffer diff --git a/libs/libuecc/Makefile b/libs/libuecc/Makefile -index c1ba53f..8111062 100644 +index c1ba53f854b5f0e29728f0a4d2e8f682ff8357a3..81110624212291d86631a7b56232208459b004da 100644 --- a/libs/libuecc/Makefile +++ b/libs/libuecc/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk @@ -36,7 +36,7 @@ index c1ba53f..8111062 100644 $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/libuecc.pc $(1)/usr/lib/pkgconfig/ endef diff --git a/net/fastd/Makefile b/net/fastd/Makefile -index 5c550d8..aeaa1df 100644 +index 5c550d8a5f4669d4f018dde23b622376bc8d0b06..aeaa1dfcf682a5c2b048d636b549953035fdbf0d 100644 --- a/net/fastd/Makefile +++ b/net/fastd/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk diff --git a/patches/packages/routing/0001-alfred-adjust-intervals.patch b/patches/packages/routing/0001-alfred-adjust-intervals.patch index d44b32a7..872ced43 100644 --- a/patches/packages/routing/0001-alfred-adjust-intervals.patch +++ b/patches/packages/routing/0001-alfred-adjust-intervals.patch @@ -4,7 +4,7 @@ Subject: alfred: adjust intervals diff --git a/alfred/patches/0001-alfred-adjust-intervals.patch b/alfred/patches/0001-alfred-adjust-intervals.patch new file mode 100644 -index 0000000..a5860db +index 0000000000000000000000000000000000000000..a5860db77332e4262b42e632e50f7f739b23cbfd --- /dev/null +++ b/alfred/patches/0001-alfred-adjust-intervals.patch @@ -0,0 +1,15 @@ diff --git a/patches/packages/routing/0002-batman-adv-introduce-no_rebroadcast-option.patch b/patches/packages/routing/0002-batman-adv-introduce-no_rebroadcast-option.patch index 53d60524..c507a419 100644 --- a/patches/packages/routing/0002-batman-adv-introduce-no_rebroadcast-option.patch +++ b/patches/packages/routing/0002-batman-adv-introduce-no_rebroadcast-option.patch @@ -3,7 +3,7 @@ Date: Thu, 2 Apr 2015 20:24:14 +0200 Subject: batman-adv: introduce 'no_rebroadcast' option diff --git a/batman-adv/files/lib/netifd/proto/batadv.sh b/batman-adv/files/lib/netifd/proto/batadv.sh -index 1e0c9d0..d0ab238 100644 +index 1e0c9d0fe24d44c7f7cc9bddaf8065c60f680862..d0ab238d2652c05a08c5f4bede428a36cdedf345 100644 --- a/batman-adv/files/lib/netifd/proto/batadv.sh +++ b/batman-adv/files/lib/netifd/proto/batadv.sh @@ -7,19 +7,22 @@ init_proto "$@" @@ -33,7 +33,7 @@ index 1e0c9d0..d0ab238 100644 } diff --git a/batman-adv/patches/1001-batman-adv-introduce-no_rebroadcast-option.patch b/batman-adv/patches/1001-batman-adv-introduce-no_rebroadcast-option.patch new file mode 100644 -index 0000000..2d274d1 +index 0000000000000000000000000000000000000000..2d274d1241d9805b8a226aaceb5aae14235f3ca4 --- /dev/null +++ b/batman-adv/patches/1001-batman-adv-introduce-no_rebroadcast-option.patch @@ -0,0 +1,189 @@ diff --git a/patches/packages/routing/0003-batman-adv-decrease-maximum-fragment-size.patch b/patches/packages/routing/0003-batman-adv-decrease-maximum-fragment-size.patch index 49f43017..aa600b82 100644 --- a/patches/packages/routing/0003-batman-adv-decrease-maximum-fragment-size.patch +++ b/patches/packages/routing/0003-batman-adv-decrease-maximum-fragment-size.patch @@ -4,7 +4,7 @@ Subject: batman-adv: decrease maximum fragment size diff --git a/batman-adv/patches/1002-batman-adv-decrease-maximum-fragment-size.patch b/batman-adv/patches/1002-batman-adv-decrease-maximum-fragment-size.patch new file mode 100644 -index 0000000..1a0b561 +index 0000000000000000000000000000000000000000..1a0b561d73cdd06117b8327945ed78ffe8951c52 --- /dev/null +++ b/batman-adv/patches/1002-batman-adv-decrease-maximum-fragment-size.patch @@ -0,0 +1,28 @@ From 689de50c275fd8133fc3664d1e77731498d32fae Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 20 Dec 2016 06:20:46 +0100 Subject: [PATCH 092/126] build: ensure that target-specific default packages are built --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 98faefbc..26829692 100644 --- a/Makefile +++ b/Makefile @@ -280,7 +280,7 @@ config: FORCE ) \ cat $(GLUONDIR)/targets/$(GLUON_TARGET)/config 2>/dev/null; \ echo 'CONFIG_BUILD_SUFFIX="gluon-$(GLUON_TARGET)"'; \ - echo '$(patsubst %,CONFIG_PACKAGE_%=m,$(sort $(filter-out -%,$(GLUON_DEFAULT_PACKAGES) $(GLUON_SITE_PACKAGES) $(PROFILE_PACKAGES))))' \ + echo '$(patsubst %,CONFIG_PACKAGE_%=m,$(sort $(filter-out -%,$(DEFAULT_PACKAGES) $(GLUON_DEFAULT_PACKAGES) $(GLUON_SITE_PACKAGES) $(PROFILE_PACKAGES))))' \ | sed -e 's/ /\n/g'; \ echo '$(patsubst %,CONFIG_LUCI_LANG_%=y,$(GLUON_LANGS))' \ | sed -e 's/ /\n/g'; \ From 1f080744387a90dd325bdac9ef32875ba9f96bf3 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 20 Dec 2016 01:19:32 +0100 Subject: [PATCH 093/126] x86: generalize partition discovery for sysupgrade Backport a few patches to allow sysupgrades on mmcblk and similar block devices. --- ...eserve-partition-table-on-sysupgrade.patch | 135 +++++++++++++ ...6-make-sysupgrade-work-without-partx.patch | 74 +++++++ ...-search-PARTUUID-in-any-block-device.patch | 22 +++ ...e-partition-discovery-for-sysupgrade.patch | 182 ++++++++++++++++++ 4 files changed, 413 insertions(+) create mode 100644 patches/openwrt/0086-x86-preserve-partition-table-on-sysupgrade.patch create mode 100644 patches/openwrt/0087-x86-make-sysupgrade-work-without-partx.patch create mode 100644 patches/openwrt/0088-x86-search-PARTUUID-in-any-block-device.patch create mode 100644 patches/openwrt/0089-x86-generalize-partition-discovery-for-sysupgrade.patch diff --git a/patches/openwrt/0086-x86-preserve-partition-table-on-sysupgrade.patch b/patches/openwrt/0086-x86-preserve-partition-table-on-sysupgrade.patch new file mode 100644 index 00000000..8b50fcaa --- /dev/null +++ b/patches/openwrt/0086-x86-preserve-partition-table-on-sysupgrade.patch @@ -0,0 +1,135 @@ +From: Jo-Philipp Wich +Date: Tue, 9 Feb 2016 12:33:17 +0000 +Subject: x86: preserve partition table on sysupgrade + +With this patch sysupgrade will write directly to the partitions +instead of to the main disk. The UUID is copied from the image +to the MBR as well. This prevents the mbr from being completely +overwritten and losing the partition table. The -p option has +been added to maintain the original behavior and overwite the +entire disk with the new image. Tests have been added to ensure +that the image partitions match up with the active partitions. + +Signed-off-by: Rob Mosher + +Backport of OpenWrt r48682 + +diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh +index 761b4c17957e2cf63b88025520b6fba59c890255..dc865544f65c16399dcced55b8b09c671b31b5d1 100644 +--- a/package/base-files/files/lib/upgrade/common.sh ++++ b/package/base-files/files/lib/upgrade/common.sh +@@ -67,6 +67,7 @@ run_ramfs() { # [...] + install_bin /usr/sbin/ubirsvol + install_bin /usr/sbin/ubirmvol + install_bin /usr/sbin/ubimkvol ++ install_bin /usr/sbin/partx + for file in $RAMFS_COPY_BIN; do + install_bin ${file//:/ } + done +diff --git a/package/base-files/files/sbin/sysupgrade b/package/base-files/files/sbin/sysupgrade +index ef83c4b00f1a88ae5d68fc70adf51a6af3dc109c..759c841e131a415c8009995c372cce1f55fb78a0 100755 +--- a/package/base-files/files/sbin/sysupgrade ++++ b/package/base-files/files/sbin/sysupgrade +@@ -10,6 +10,7 @@ export INTERACTIVE=0 + export VERBOSE=1 + export SAVE_CONFIG=1 + export SAVE_OVERLAY=0 ++export SAVE_PARTITIONS=1 + export DELAY= + export CONF_IMAGE= + export CONF_BACKUP_LIST=0 +@@ -29,6 +30,7 @@ while [ -n "$1" ]; do + -q) export VERBOSE="$(($VERBOSE - 1))";; + -n) export SAVE_CONFIG=0;; + -c) export SAVE_OVERLAY=1;; ++ -p) export SAVE_PARTITIONS=0;; + -b|--create-backup) export CONF_BACKUP="$2" NEED_IMAGE=1; shift;; + -r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; shift;; + -l|--list-backup) export CONF_BACKUP_LIST=1; break;; +@@ -62,6 +64,7 @@ upgrade-option: + -i interactive mode + -c attempt to preserve all changed files in /etc/ + -n do not save configuration over reflash ++ -p do not attempt to restore the partition table after flash. + -T | --test + Verify image and config .tar.gz but do not actually flash. + -F | --force +diff --git a/target/linux/x86/Makefile b/target/linux/x86/Makefile +index ba733c02480b248aa95331da2bcd8fee3e25f812..29a232296a02b253344927a61eecb40503473d59 100644 +--- a/target/linux/x86/Makefile ++++ b/target/linux/x86/Makefile +@@ -13,6 +13,8 @@ FEATURES:=squashfs ext4 vdi vmdk pcmcia targz + SUBTARGETS=generic xen_domu ep80579 geode kvm_guest rdc 64 + MAINTAINER:=Felix Fietkau + ++DEFAULT_PACKAGES += partx-utils ++ + KERNEL_PATCHVER:=3.18 + + KERNELNAME:=bzImage +diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh +index adc119c897ed840aef17c2041a48244d0922564e..c21f1a7e5feba553110f138c14977daaa472da70 100644 +--- a/target/linux/x86/base-files/lib/upgrade/platform.sh ++++ b/target/linux/x86/base-files/lib/upgrade/platform.sh +@@ -55,12 +55,59 @@ platform_copy_config() { + fi + } + ++get_partitions() { # ++ local disk="$1" ++ local filename="$2" ++ ++ if [ -b "$disk" -o -f "$disk" ]; then ++ echo "Reading partition table from $filename..." ++ partx -r "$disk" -gbo NR,START,SECTORS > "/tmp/partx.$filename" ++ fi ++} ++ + platform_do_upgrade() { + platform_export_bootpart ++ disk="${BOOTPART%[0-9]}" + +- if [ -b "${BOOTPART%[0-9]}" ]; then ++ if [ -b "$disk" ]; then + sync +- get_image "$@" | dd of="${BOOTPART%[0-9]}" bs=4096 conv=fsync ++ if [ "$SAVE_PARTITIONS" = "1" ]; then ++ get_partitions "$disk" bootdisk ++ ++ ++ #get block size ++ sectors="$(partx -r $disk -gbo SECTORS --nr 1:1)" ++ size="$(partx -r $disk -gbo SIZE --nr 1:1)" ++ ibs="$(($size / $sectors))" ++ ++ #extract the boot sector from the image ++ get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b ++ ++ get_partitions /tmp/image.bs image ++ ++ #compare tables ++ diff="$(grep -F -x -v -f /tmp/partx.bootdisk /tmp/partx.image)" ++ if [ -n "$diff" ]; then ++ echo "Partition layout is changed. Full image will be written." ++ ask_bool 0 "Abort" && exit ++ ++ get_image "$@" | dd of="$disk" bs=4096 conv=fsync ++ return 0 ++ fi ++ ++ #iterate over each partition from the image and write it to the boot disk ++ while read part start size; do ++ echo "Writing image to $disk$part..." ++ get_image "$@" | dd of="$disk$part" ibs="$ibs" obs=1M skip="$start" count="$size" conv=fsync ++ done < /tmp/partx.image ++ ++ #copy partition uuid ++ echo "Writing new UUID to $disk$part..." ++ get_image "$@" | dd of="$disk" bs=1 skip=440 count=4 seek=440 conv=fsync ++ else ++ get_image "$@" | dd of="$disk" bs=4096 conv=fsync ++ fi ++ + sleep 1 + fi + } diff --git a/patches/openwrt/0087-x86-make-sysupgrade-work-without-partx.patch b/patches/openwrt/0087-x86-make-sysupgrade-work-without-partx.patch new file mode 100644 index 00000000..852c088d --- /dev/null +++ b/patches/openwrt/0087-x86-make-sysupgrade-work-without-partx.patch @@ -0,0 +1,74 @@ +From: Jo-Philipp Wich +Date: Wed, 30 Mar 2016 03:10:51 +0200 +Subject: x86: make sysupgrade work without partx + +Signed-off-by: Jo-Philipp Wich + +Backport of LEDE 9f422eba7c1a297a96a03b1cce05fa3cb9d71a4a + +diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh +index c21f1a7e5feba553110f138c14977daaa472da70..f12deebf6484df6f3f69e453ad67688a76d57972 100644 +--- a/target/linux/x86/base-files/lib/upgrade/platform.sh ++++ b/target/linux/x86/base-files/lib/upgrade/platform.sh +@@ -61,7 +61,27 @@ get_partitions() { # + + if [ -b "$disk" -o -f "$disk" ]; then + echo "Reading partition table from $filename..." +- partx -r "$disk" -gbo NR,START,SECTORS > "/tmp/partx.$filename" ++ ++ local magic="$(hexdump -v -n 2 -s 0x1FE -e '1/2 "0x%04X"' "$disk")" ++ if [ "$magic" != 0xAA55 ]; then ++ echo "Invalid partition table on $disk" ++ exit ++ fi ++ ++ rm -f "/tmp/partmap.$filename" ++ ++ local part ++ for part in 1 2 3 4; do ++ set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk") ++ ++ local type="$(($1 % 256))" ++ local lba="$(($2))" ++ local num="$(($3))" ++ ++ [ $type -gt 0 ] || continue ++ ++ printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename" ++ done + fi + } + +@@ -76,9 +96,11 @@ platform_do_upgrade() { + + + #get block size +- sectors="$(partx -r $disk -gbo SECTORS --nr 1:1)" +- size="$(partx -r $disk -gbo SIZE --nr 1:1)" +- ibs="$(($size / $sectors))" ++ if [ -f "/sys/block/${disk##*/}/queue/physical_block_size" ]; then ++ ibs="$(cat "/sys/block/${disk##*/}/queue/physical_block_size")" ++ else ++ ibs=512 ++ fi + + #extract the boot sector from the image + get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b +@@ -86,7 +108,7 @@ platform_do_upgrade() { + get_partitions /tmp/image.bs image + + #compare tables +- diff="$(grep -F -x -v -f /tmp/partx.bootdisk /tmp/partx.image)" ++ diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)" + if [ -n "$diff" ]; then + echo "Partition layout is changed. Full image will be written." + ask_bool 0 "Abort" && exit +@@ -99,7 +121,7 @@ platform_do_upgrade() { + while read part start size; do + echo "Writing image to $disk$part..." + get_image "$@" | dd of="$disk$part" ibs="$ibs" obs=1M skip="$start" count="$size" conv=fsync +- done < /tmp/partx.image ++ done < /tmp/partmap.image + + #copy partition uuid + echo "Writing new UUID to $disk$part..." diff --git a/patches/openwrt/0088-x86-search-PARTUUID-in-any-block-device.patch b/patches/openwrt/0088-x86-search-PARTUUID-in-any-block-device.patch new file mode 100644 index 00000000..19f3652c --- /dev/null +++ b/patches/openwrt/0088-x86-search-PARTUUID-in-any-block-device.patch @@ -0,0 +1,22 @@ +From: Jo-Philipp Wich +Date: Wed, 30 Mar 2016 03:19:23 +0200 +Subject: x86: search PARTUUID in any block device + +Signed-off-by: Jo-Philipp Wich + +Backport of LEDE 924fb794bde41eca8289c6cf10322bf6683b4a80 + +diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh +index f12deebf6484df6f3f69e453ad67688a76d57972..29eac77dfb0ae52f241696f3f62dce7d16106b20 100644 +--- a/target/linux/x86/base-files/lib/upgrade/platform.sh ++++ b/target/linux/x86/base-files/lib/upgrade/platform.sh +@@ -17,7 +17,8 @@ platform_export_bootpart() { + PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02) + uuid="${disk#PARTUUID=}" + uuid="${uuid%-02}" +- for disk in /dev/[hsv]d[a-z] /dev/xvd[a-z]; do ++ for disk in /dev/*; do ++ [ -b "$disk" ] || continue + set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "') + if [ "$4$3$2$1" = "$uuid" ]; then + export BOOTPART="${disk}1" diff --git a/patches/openwrt/0089-x86-generalize-partition-discovery-for-sysupgrade.patch b/patches/openwrt/0089-x86-generalize-partition-discovery-for-sysupgrade.patch new file mode 100644 index 00000000..3c973aea --- /dev/null +++ b/patches/openwrt/0089-x86-generalize-partition-discovery-for-sysupgrade.patch @@ -0,0 +1,182 @@ +From: Jo-Philipp Wich +Date: Tue, 24 May 2016 12:07:02 +0200 +Subject: x86: generalize partition discovery for sysupgrade + +Generalize the partition discovery in sysupgrade in order to fix sysupgrade +and config backup/recovery on MMC block devices which use a different naming +scheme compared to mtdblock or sd* devices. + +The change also adds the find applet to the ramdisk utilities so that upgrade +code can rely on it. + +The commit is based on the initial submission by Russell Senior at +http://patchwork.ozlabs.org/patch/625440/ . + +Signed-off-by: Russell Senior +Signed-off-by: Jo-Philipp Wich + +Backport of LEDE 1012701014bd944197031a3c0023527861b521b4 + +diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh +index dc865544f65c16399dcced55b8b09c671b31b5d1..14684959dd46d04b1c4b72213dbe06943ae64686 100644 +--- a/package/base-files/files/lib/upgrade/common.sh ++++ b/package/base-files/files/lib/upgrade/common.sh +@@ -53,7 +53,7 @@ run_ramfs() { # [...] + /bin/dd /bin/vi /bin/ls /bin/cat /usr/bin/awk /usr/bin/hexdump \ + /bin/sleep /bin/zcat /usr/bin/bzcat /usr/bin/printf /usr/bin/wc \ + /bin/cut /usr/bin/printf /bin/sync /bin/mkdir /bin/rmdir \ +- /bin/rm /usr/bin/basename /bin/kill /bin/chmod ++ /bin/rm /usr/bin/basename /bin/kill /bin/chmod /usr/bin/find + + install_bin /sbin/mtd + install_bin /sbin/mount_root +diff --git a/target/linux/x86/base-files/lib/preinit/79_move_config b/target/linux/x86/base-files/lib/preinit/79_move_config +index 1d4873d78b480cb3f11e04e6246559417b431a8a..5ac81cb90d1c15782a9c4f271720cfa66d6d03a9 100644 +--- a/target/linux/x86/base-files/lib/preinit/79_move_config ++++ b/target/linux/x86/base-files/lib/preinit/79_move_config +@@ -2,10 +2,12 @@ + # Copyright (C) 2012-2015 OpenWrt.org + + move_config() { ++ local partdev ++ + . /lib/upgrade/platform.sh + +- if platform_export_bootpart; then +- mount -t ext4 -o rw,noatime "$BOOTPART" /mnt ++ if platform_export_bootdevice && platform_export_partdevice partdev 1; then ++ mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt + mv -f /mnt/sysupgrade.tgz / + umount /mnt + fi +diff --git a/target/linux/x86/base-files/lib/upgrade/platform.sh b/target/linux/x86/base-files/lib/upgrade/platform.sh +index 29eac77dfb0ae52f241696f3f62dce7d16106b20..c8bc3f7f608fc82ee3afc049b64af3a740fd2c37 100644 +--- a/target/linux/x86/base-files/lib/upgrade/platform.sh ++++ b/target/linux/x86/base-files/lib/upgrade/platform.sh +@@ -1,5 +1,21 @@ +-platform_export_bootpart() { +- local cmdline uuid disk ++platform_export_partdevice() { ++ local var="$1" offset="$2" ++ local uevent MAJOR MINOR DEVNAME DEVTYPE ++ ++ for uevent in /sys/class/block/*/uevent; do ++ . "$uevent" ++ if [ $BOOTDEV_MAJOR = $MAJOR -a $(($BOOTDEV_MINOR + $offset)) = $MINOR -a -b "/dev/$DEVNAME" ]; then ++ export "$var=$DEVNAME" ++ return 0 ++ fi ++ done ++ ++ return 1 ++} ++ ++platform_export_bootdevice() { ++ local cmdline uuid disk uevent ++ local MAJOR MINOR DEVNAME DEVTYPE + + if read cmdline < /proc/cmdline; then + case "$cmdline" in +@@ -17,20 +33,27 @@ platform_export_bootpart() { + PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02) + uuid="${disk#PARTUUID=}" + uuid="${uuid%-02}" +- for disk in /dev/*; do +- [ -b "$disk" ] || continue ++ for disk in $(find /dev -type b); do + set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "') + if [ "$4$3$2$1" = "$uuid" ]; then +- export BOOTPART="${disk}1" +- return 0 ++ uevent="/sys/class/block/${disk##*/}/uevent" ++ break + fi + done + ;; + /dev/*) +- export BOOTPART="${disk%[0-9]}1" +- return 0 ++ uevent="/sys/class/block/${disk##*/}/uevent" + ;; + esac ++ ++ if [ -e "$uevent" ]; then ++ . "$uevent" ++ ++ export BOOTDEV_MAJOR=$MAJOR ++ export BOOTDEV_MINOR=$MINOR ++ ++ return 0 ++ fi + fi + + return 1 +@@ -49,8 +72,10 @@ platform_check_image() { + } + + platform_copy_config() { +- if [ -b "$BOOTPART" ]; then +- mount -t ext4 -o rw,noatime "$BOOTPART" /mnt ++ local partdev ++ ++ if platform_export_partdevice partdev 1; then ++ mount -t ext4 -o rw,noatime "/dev/$partdev" /mnt + cp -af "$CONF_TAR" /mnt/ + umount /mnt + fi +@@ -87,18 +112,16 @@ get_partitions() { # + } + + platform_do_upgrade() { +- platform_export_bootpart +- disk="${BOOTPART%[0-9]}" ++ local diskdev partdev ibs diff + +- if [ -b "$disk" ]; then ++ if platform_export_bootdevice && platform_export_partdevice diskdev 0; then + sync + if [ "$SAVE_PARTITIONS" = "1" ]; then +- get_partitions "$disk" bootdisk +- ++ get_partitions "/dev/$diskdev" bootdisk + + #get block size +- if [ -f "/sys/block/${disk##*/}/queue/physical_block_size" ]; then +- ibs="$(cat "/sys/block/${disk##*/}/queue/physical_block_size")" ++ if [ -f "/sys/block/$diskdev/queue/physical_block_size" ]; then ++ ibs="$(cat "/sys/block/$diskdev/queue/physical_block_size")" + else + ibs=512 + fi +@@ -114,21 +137,25 @@ platform_do_upgrade() { + echo "Partition layout is changed. Full image will be written." + ask_bool 0 "Abort" && exit + +- get_image "$@" | dd of="$disk" bs=4096 conv=fsync ++ get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync + return 0 + fi + + #iterate over each partition from the image and write it to the boot disk + while read part start size; do +- echo "Writing image to $disk$part..." +- get_image "$@" | dd of="$disk$part" ibs="$ibs" obs=1M skip="$start" count="$size" conv=fsync ++ if platform_export_partdevice partdev $part; then ++ echo "Writing image to /dev/$partdev..." ++ get_image "$@" | dd of="/dev/$partdev" ibs="$ibs" obs=1M skip="$start" count="$size" conv=fsync ++ else ++ echo "Unable to find partition $part device, skipped." ++ fi + done < /tmp/partmap.image + + #copy partition uuid +- echo "Writing new UUID to $disk$part..." +- get_image "$@" | dd of="$disk" bs=1 skip=440 count=4 seek=440 conv=fsync ++ echo "Writing new UUID to /dev/$diskdev..." ++ get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync + else +- get_image "$@" | dd of="$disk" bs=4096 conv=fsync ++ get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync + fi + + sleep 1 From 0abe350782424902075e9e15d07c15ddffcccbb3 Mon Sep 17 00:00:00 2001 From: Christof Schulze Date: Wed, 21 Dec 2016 19:25:19 +0100 Subject: [PATCH 094/126] gluon-core: replace blanks by tabs in gluon.util --- .../luasrc/usr/lib/lua/gluon/util.lua | 185 +++++++++--------- 1 file changed, 92 insertions(+), 93 deletions(-) diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua index 0ae50b4d..7afee87f 100644 --- a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua +++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua @@ -1,25 +1,25 @@ -- Writes all lines from the file input to the file output except those starting with prefix -- Doesn't close the output file, but returns the file object local function do_filter_prefix(input, output, prefix) - local f = io.open(output, 'w+') - local l = prefix:len() + local f = io.open(output, 'w+') + local l = prefix:len() - for line in io.lines(input) do - if line:sub(1, l) ~= prefix then - f:write(line, '\n') - end - end + for line in io.lines(input) do + if line:sub(1, l) ~= prefix then + f:write(line, '\n') + end + end - return f + return f end local function escape_args(ret, arg0, ...) - if not arg0 then - return ret - end + if not arg0 then + return ret + end - return escape_args(ret .. "'" .. string.gsub(arg0, "'", "'\\''") .. "' ", ...) + return escape_args(ret .. "'" .. string.gsub(arg0, "'", "'\\''") .. "' ", ...) end @@ -38,79 +38,78 @@ local uci = require('luci.model.uci').cursor() local lutil = require 'luci.util' local fs = require 'nixio.fs' - module 'gluon.util' function exec(...) - return os.execute(escape_args('', 'exec', ...)) + return os.execute(escape_args('', 'exec', ...)) end -- Removes all lines starting with a prefix from a file, optionally adding a new one function replace_prefix(file, prefix, add) - local tmp = file .. '.tmp' - local f = do_filter_prefix(file, tmp, prefix) - if add then - f:write(add) - end - f:close() - os.rename(tmp, file) + local tmp = file .. '.tmp' + local f = do_filter_prefix(file, tmp, prefix) + if add then + f:write(add) + end + f:close() + os.rename(tmp, file) end function readline(fd) - local line = fd:read('*l') - fd:close() - return line + local line = fd:read('*l') + fd:close() + return line end function lock(file) - exec('lock', file) + exec('lock', file) end function unlock(file) - exec('lock', '-u', file) + exec('lock', '-u', file) end function node_id() - return string.gsub(sysconfig.primary_mac, ':', '') + return string.gsub(sysconfig.primary_mac, ':', '') end local function find_phy_by_path(path) - for phy in fs.glob('/sys/devices/' .. path .. '/ieee80211/phy*') do - return phy:match('([^/]+)$') - end + for phy in fs.glob('/sys/devices/' .. path .. '/ieee80211/phy*') do + return phy:match('([^/]+)$') + end end local function find_phy_by_macaddr(macaddr) - local addr = macaddr:lower() - for file in fs.glob('/sys/class/ieee80211/*/macaddress') do - if lutil.trim(fs.readfile(file)) == addr then - return file:match('([^/]+)/macaddress$') - end - end + local addr = macaddr:lower() + for file in fs.glob('/sys/class/ieee80211/*/macaddress') do + if lutil.trim(fs.readfile(file)) == addr then + return file:match('([^/]+)/macaddress$') + end + end end local function find_phy(radio) - local config = uci:get_all('wireless', radio) + local config = uci:get_all('wireless', radio) - if not config or config.type ~= 'mac80211' then - return nil - elseif config.path then - return find_phy_by_path(config.path) - elseif config.macaddr then - return find_phy_by_macaddr(config.macaddr) - else - return nil - end + if not config or config.type ~= 'mac80211' then + return nil + elseif config.path then + return find_phy_by_path(config.path) + elseif config.macaddr then + return find_phy_by_macaddr(config.macaddr) + else + return nil + end end local function get_addresses(radio) - local phy = find_phy(radio) - if not phy then - return function() end - end + local phy = find_phy(radio) + if not phy then + return function() end + end - return io.lines('/sys/class/ieee80211/' .. phy .. '/addresses') + return io.lines('/sys/class/ieee80211/' .. phy .. '/addresses') end -- Generates a (hopefully) unique MAC address @@ -126,70 +125,70 @@ end -- 6: ibss1 -- 7: wan_radio1 (private WLAN); mesh VPN function generate_mac(i) - if i > 7 or i < 0 then return nil end -- max allowed id (0b111) + if i > 7 or i < 0 then return nil end -- max allowed id (0b111) - local hashed = string.sub(hash.md5(sysconfig.primary_mac), 0, 12) - local m1, m2, m3, m4, m5, m6 = string.match(hashed, '(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)') + local hashed = string.sub(hash.md5(sysconfig.primary_mac), 0, 12) + local m1, m2, m3, m4, m5, m6 = string.match(hashed, '(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)(%x%x)') - m1 = tonumber(m1, 16) - m6 = tonumber(m6, 16) + m1 = tonumber(m1, 16) + m6 = tonumber(m6, 16) - m1 = nixio.bit.bor(m1, 0x02) -- set locally administered bit - m1 = nixio.bit.band(m1, 0xFE) -- unset the multicast bit + m1 = nixio.bit.bor(m1, 0x02) -- set locally administered bit + m1 = nixio.bit.band(m1, 0xFE) -- unset the multicast bit - -- It's necessary that the first 45 bits of the MAC address don't - -- vary on a single hardware interface, since some chips are using - -- a hardware MAC filter. (e.g 'rt305x') + -- It's necessary that the first 45 bits of the MAC address don't + -- vary on a single hardware interface, since some chips are using + -- a hardware MAC filter. (e.g 'rt305x') - m6 = nixio.bit.band(m6, 0xF8) -- zero the last three bits (space needed for counting) - m6 = m6 + i -- add virtual interface id + m6 = nixio.bit.band(m6, 0xF8) -- zero the last three bits (space needed for counting) + m6 = m6 + i -- add virtual interface id - return string.format('%02x:%s:%s:%s:%s:%02x', m1, m2, m3, m4, m5, m6) + return string.format('%02x:%s:%s:%s:%s:%02x', m1, m2, m3, m4, m5, m6) end local function get_wlan_mac_from_driver(radio, vif) - local primary = sysconfig.primary_mac:lower() + local primary = sysconfig.primary_mac:lower() - local i = 1 - for addr in get_addresses(radio) do - if addr:lower() ~= primary then - if i == vif then - return addr - end + local i = 1 + for addr in get_addresses(radio) do + if addr:lower() ~= primary then + if i == vif then + return addr + end - i = i + 1 - end - end + i = i + 1 + end + end end function get_wlan_mac(radio, index, vif) - local addr = get_wlan_mac_from_driver(radio, vif) - if addr then - return addr - end + local addr = get_wlan_mac_from_driver(radio, vif) + if addr then + return addr + end - return generate_mac(4*(index-1) + (vif-1)) + return generate_mac(4*(index-1) + (vif-1)) end -- Iterate over all radios defined in UCI calling -- f(radio, index, site.wifiX) for each radio found while passing -- site.wifi24 for 2.4 GHz devices and site.wifi5 for 5 GHz ones. function iterate_radios(f) - local radios = {} + local radios = {} - uci:foreach('wireless', 'wifi-device', - function(s) - table.insert(radios, s['.name']) - end - ) + uci:foreach('wireless', 'wifi-device', + function(s) + table.insert(radios, s['.name']) + end + ) - for index, radio in ipairs(radios) do - local hwmode = uci:get('wireless', radio, 'hwmode') + for index, radio in ipairs(radios) do + local hwmode = uci:get('wireless', radio, 'hwmode') - if hwmode == '11g' or hwmode == '11ng' then - f(radio, index, site.wifi24) - elseif hwmode == '11a' or hwmode == '11na' then - f(radio, index, site.wifi5) - end - end + if hwmode == '11g' or hwmode == '11ng' then + f(radio, index, site.wifi24) + elseif hwmode == '11a' or hwmode == '11na' then + f(radio, index, site.wifi5) + end + end end From e41e5cb8d9aa96de8a3ac1cdd656ce7821c35eda Mon Sep 17 00:00:00 2001 From: Christof Schulze Date: Wed, 21 Dec 2016 20:25:21 +0100 Subject: [PATCH 095/126] gluon-core: add get_mesh_devices(uconn) to gluon.util which will return all devices being up and having proto = gluon_mesh --- package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua index 7afee87f..f07f0ab1 100644 --- a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua +++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua @@ -73,6 +73,16 @@ function node_id() return string.gsub(sysconfig.primary_mac, ':', '') end +function get_mesh_devices(uconn) + local dump = uconn:call("network.interface", "dump", {}) + local devices = {} + for _, interface in ipairs(dump.interface) do + if ( (interface.proto == "gluon_mesh") and interface.up ) then + table.insert(devices, interface.device) + end + end + return devices +end local function find_phy_by_path(path) for phy in fs.glob('/sys/devices/' .. path .. '/ieee80211/phy*') do From bee999dd9020c8b2c164c711b84af933f4cab8e5 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 21 Dec 2016 19:59:49 +0100 Subject: [PATCH 096/126] ar71xx-generic: backport support for TP-LINK TL-WR1043ND v4 Fixes #961 --- docs/index.rst | 2 +- ...cf518d5e2b7d6526fd7a87a88a268030694a.patch | 555 ++++++++++++++++++ ...oader.c-Add-support-for-Archer-C2600.patch | 188 ------ ...1xx-split-CPE210-from-CPE510-profile.patch | 26 + ...der-split-CPE210-from-CPE510-profile.patch | 102 ---- ...dd-Support-for-TP-LINK-TL-WR940N-v4.patch} | 0 ...r-update-support-list-for-CPE210-510.patch | 45 -- ...serve-partition-table-on-sysupgrade.patch} | 0 ...-make-sysupgrade-work-without-partx.patch} | 0 ...search-PARTUUID-in-any-block-device.patch} | 0 ...-partition-discovery-for-sysupgrade.patch} | 0 ...-to-more-generic-mktplinkfw-combined.patch | 39 ++ ...ort-for-TL-WR1043ND-v4-to-mktplinkfw.patch | 36 ++ ...-add-support-for-TP-LINK-WR1043ND-v4.patch | 464 +++++++++++++++ targets/ar71xx-generic/profiles.mk | 1 + 15 files changed, 1122 insertions(+), 336 deletions(-) create mode 100644 patches/openwrt/0065-firmware-utils-backport-tplink-safeloader-from-LEDE-05abcf518d5e2b7d6526fd7a87a88a268030694a.patch delete mode 100644 patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch create mode 100644 patches/openwrt/0066-ar71xx-split-CPE210-from-CPE510-profile.patch delete mode 100644 patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch rename patches/openwrt/{0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch => 0084-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch} (100%) delete mode 100644 patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch rename patches/openwrt/{0086-x86-preserve-partition-table-on-sysupgrade.patch => 0085-x86-preserve-partition-table-on-sysupgrade.patch} (100%) rename patches/openwrt/{0087-x86-make-sysupgrade-work-without-partx.patch => 0086-x86-make-sysupgrade-work-without-partx.patch} (100%) rename patches/openwrt/{0088-x86-search-PARTUUID-in-any-block-device.patch => 0087-x86-search-PARTUUID-in-any-block-device.patch} (100%) rename patches/openwrt/{0089-x86-generalize-partition-discovery-for-sysupgrade.patch => 0088-x86-generalize-partition-discovery-for-sysupgrade.patch} (100%) create mode 100644 patches/openwrt/0089-ar71xx-rename-mktplinkfw-initramfs-to-more-generic-mktplinkfw-combined.patch create mode 100644 patches/openwrt/0090-firmware-utils-add-support-for-TL-WR1043ND-v4-to-mktplinkfw.patch create mode 100644 patches/openwrt/0091-ar71xx-add-support-for-TP-LINK-WR1043ND-v4.patch diff --git a/docs/index.rst b/docs/index.rst index 9a6ffcb7..e9517511 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -190,7 +190,7 @@ ar71xx-generic - TL-WR843N/ND (v1) - TL-WR940N (v1, v2, v3, v4) - TL-WR941ND (v2, v3, v4, v5, v6) - - TL-WR1043N/ND (v1, v2, v3) + - TL-WR1043N/ND (v1, v2, v3, v4) - TL-WR2543N/ND (v1) * Ubiquiti diff --git a/patches/openwrt/0065-firmware-utils-backport-tplink-safeloader-from-LEDE-05abcf518d5e2b7d6526fd7a87a88a268030694a.patch b/patches/openwrt/0065-firmware-utils-backport-tplink-safeloader-from-LEDE-05abcf518d5e2b7d6526fd7a87a88a268030694a.patch new file mode 100644 index 00000000..4e286d5e --- /dev/null +++ b/patches/openwrt/0065-firmware-utils-backport-tplink-safeloader-from-LEDE-05abcf518d5e2b7d6526fd7a87a88a268030694a.patch @@ -0,0 +1,555 @@ +From: Matthias Schiffer +Date: Wed, 21 Dec 2016 19:22:56 +0100 +Subject: firmware-utils: backport tplink-safeloader from LEDE 05abcf518d5e2b7d6526fd7a87a88a268030694a + +Signed-off-by: Matthias Schiffer + +diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c +index 77a894b237281f6211dd1123ead4b5b0f2f58370..016c118787f3b5332b76f65c85930065a569d6b8 100644 +--- a/tools/firmware-utils/src/tplink-safeloader.c ++++ b/tools/firmware-utils/src/tplink-safeloader.c +@@ -53,6 +53,8 @@ + #define ALIGN(x,a) ({ typeof(a) __a = (a); (((x) + __a - 1) & ~(__a - 1)); }) + + ++#define MAX_PARTITIONS 32 ++ + /** An image partition table entry */ + struct image_partition_entry { + const char *name; +@@ -67,6 +69,16 @@ struct flash_partition_entry { + uint32_t size; + }; + ++/** Firmware layout description */ ++struct device_info { ++ const char *id; ++ const char *vendor; ++ const char *support_list; ++ char support_trail; ++ const struct flash_partition_entry partitions[MAX_PARTITIONS+1]; ++ const char *first_sysupgrade_partition; ++ const char *last_sysupgrade_partition; ++}; + + /** The content of the soft-version structure */ + struct __attribute__((__packed__)) soft_version { +@@ -102,45 +114,225 @@ static const uint8_t md5_salt[16] = { + }; + + +-/** Vendor information for CPE210/220/510/520 */ +-static const char cpe510_vendor[] = "CPE510(TP-LINK|UN|N300-5):1.0\r\n"; +- +- +-/** +- The flash partition table for CPE210/220/510/520; +- it is the same as the one used by the stock images. +-*/ +-static const struct flash_partition_entry cpe510_partitions[] = { +- {"fs-uboot", 0x00000, 0x20000}, +- {"partition-table", 0x20000, 0x02000}, +- {"default-mac", 0x30000, 0x00020}, +- {"product-info", 0x31100, 0x00100}, +- {"signature", 0x32000, 0x00400}, +- {"os-image", 0x40000, 0x170000}, +- {"soft-version", 0x1b0000, 0x00100}, +- {"support-list", 0x1b1000, 0x00400}, +- {"file-system", 0x1c0000, 0x600000}, +- {"user-config", 0x7c0000, 0x10000}, +- {"default-config", 0x7d0000, 0x10000}, +- {"log", 0x7e0000, 0x10000}, +- {"radio", 0x7f0000, 0x10000}, +- {NULL, 0, 0} ++/** Firmware layout table */ ++static struct device_info boards[] = { ++ /** Firmware layout for the CPE210/220 */ ++ { ++ .id = "CPE210", ++ .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n", ++ .support_list = ++ "SupportList:\r\n" ++ "CPE210(TP-LINK|UN|N300-2):1.0\r\n" ++ "CPE210(TP-LINK|UN|N300-2):1.1\r\n" ++ "CPE210(TP-LINK|US|N300-2):1.1\r\n" ++ "CPE210(TP-LINK|EU|N300-2):1.1\r\n" ++ "CPE220(TP-LINK|UN|N300-2):1.1\r\n" ++ "CPE220(TP-LINK|US|N300-2):1.1\r\n" ++ "CPE220(TP-LINK|EU|N300-2):1.1\r\n", ++ .support_trail = '\xff', ++ ++ .partitions = { ++ {"fs-uboot", 0x00000, 0x20000}, ++ {"partition-table", 0x20000, 0x02000}, ++ {"default-mac", 0x30000, 0x00020}, ++ {"product-info", 0x31100, 0x00100}, ++ {"signature", 0x32000, 0x00400}, ++ {"os-image", 0x40000, 0x170000}, ++ {"soft-version", 0x1b0000, 0x00100}, ++ {"support-list", 0x1b1000, 0x00400}, ++ {"file-system", 0x1c0000, 0x600000}, ++ {"user-config", 0x7c0000, 0x10000}, ++ {"default-config", 0x7d0000, 0x10000}, ++ {"log", 0x7e0000, 0x10000}, ++ {"radio", 0x7f0000, 0x10000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "file-system", ++ }, ++ ++ /** Firmware layout for the CPE510/520 */ ++ { ++ .id = "CPE510", ++ .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n", ++ .support_list = ++ "SupportList:\r\n" ++ "CPE510(TP-LINK|UN|N300-5):1.0\r\n" ++ "CPE510(TP-LINK|UN|N300-5):1.1\r\n" ++ "CPE510(TP-LINK|UN|N300-5):1.1\r\n" ++ "CPE510(TP-LINK|US|N300-5):1.1\r\n" ++ "CPE510(TP-LINK|EU|N300-5):1.1\r\n" ++ "CPE520(TP-LINK|UN|N300-5):1.1\r\n" ++ "CPE520(TP-LINK|US|N300-5):1.1\r\n" ++ "CPE520(TP-LINK|EU|N300-5):1.1\r\n", ++ .support_trail = '\xff', ++ ++ .partitions = { ++ {"fs-uboot", 0x00000, 0x20000}, ++ {"partition-table", 0x20000, 0x02000}, ++ {"default-mac", 0x30000, 0x00020}, ++ {"product-info", 0x31100, 0x00100}, ++ {"signature", 0x32000, 0x00400}, ++ {"os-image", 0x40000, 0x170000}, ++ {"soft-version", 0x1b0000, 0x00100}, ++ {"support-list", 0x1b1000, 0x00400}, ++ {"file-system", 0x1c0000, 0x600000}, ++ {"user-config", 0x7c0000, 0x10000}, ++ {"default-config", 0x7d0000, 0x10000}, ++ {"log", 0x7e0000, 0x10000}, ++ {"radio", 0x7f0000, 0x10000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "file-system", ++ }, ++ ++ /** Firmware layout for the C2600 */ ++ { ++ .id = "C2600", ++ .vendor = "", ++ .support_list = ++ "SupportList:\r\n" ++ "{product_name:Archer C2600,product_ver:1.0.0,special_id:00000000}\r\n", ++ .support_trail = '\x00', ++ ++ .partitions = { ++ {"SBL1", 0x00000, 0x20000}, ++ {"MIBIB", 0x20000, 0x20000}, ++ {"SBL2", 0x40000, 0x20000}, ++ {"SBL3", 0x60000, 0x30000}, ++ {"DDRCONFIG", 0x90000, 0x10000}, ++ {"SSD", 0xa0000, 0x10000}, ++ {"TZ", 0xb0000, 0x30000}, ++ {"RPM", 0xe0000, 0x20000}, ++ {"fs-uboot", 0x100000, 0x70000}, ++ {"uboot-env", 0x170000, 0x40000}, ++ {"radio", 0x1b0000, 0x40000}, ++ {"os-image", 0x1f0000, 0x200000}, ++ {"file-system", 0x3f0000, 0x1b00000}, ++ {"default-mac", 0x1ef0000, 0x00200}, ++ {"pin", 0x1ef0200, 0x00200}, ++ {"product-info", 0x1ef0400, 0x0fc00}, ++ {"partition-table", 0x1f00000, 0x10000}, ++ {"soft-version", 0x1f10000, 0x10000}, ++ {"support-list", 0x1f20000, 0x10000}, ++ {"profile", 0x1f30000, 0x10000}, ++ {"default-config", 0x1f40000, 0x10000}, ++ {"user-config", 0x1f50000, 0x40000}, ++ {"qos-db", 0x1f90000, 0x40000}, ++ {"usb-config", 0x1fd0000, 0x10000}, ++ {"log", 0x1fe0000, 0x20000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "file-system" ++ }, ++ ++ /** Firmware layout for the C9 */ ++ { ++ .id = "ARCHERC9", ++ .vendor = "", ++ .support_list = ++ "SupportList:\n" ++ "{product_name:ArcherC9," ++ "product_ver:1.0.0," ++ "special_id:00000000}\n", ++ .support_trail = '\x00', ++ ++ .partitions = { ++ {"fs-uboot", 0x00000, 0x40000}, ++ {"os-image", 0x40000, 0x200000}, ++ {"file-system", 0x240000, 0xc00000}, ++ {"default-mac", 0xe40000, 0x00200}, ++ {"pin", 0xe40200, 0x00200}, ++ {"product-info", 0xe40400, 0x00200}, ++ {"partition-table", 0xe50000, 0x10000}, ++ {"soft-version", 0xe60000, 0x00200}, ++ {"support-list", 0xe61000, 0x0f000}, ++ {"profile", 0xe70000, 0x10000}, ++ {"default-config", 0xe80000, 0x10000}, ++ {"user-config", 0xe90000, 0x50000}, ++ {"log", 0xee0000, 0x100000}, ++ {"radio_bk", 0xfe0000, 0x10000}, ++ {"radio", 0xff0000, 0x10000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "file-system" ++ }, ++ ++ /** Firmware layout for the EAP120 */ ++ { ++ .id = "EAP120", ++ .vendor = "EAP120(TP-LINK|UN|N300-2):1.0\r\n", ++ .support_list = ++ "SupportList:\r\n" ++ "EAP120(TP-LINK|UN|N300-2):1.0\r\n", ++ .support_trail = '\xff', ++ ++ .partitions = { ++ {"fs-uboot", 0x00000, 0x20000}, ++ {"partition-table", 0x20000, 0x02000}, ++ {"default-mac", 0x30000, 0x00020}, ++ {"support-list", 0x31000, 0x00100}, ++ {"product-info", 0x31100, 0x00100}, ++ {"soft-version", 0x32000, 0x00100}, ++ {"os-image", 0x40000, 0x180000}, ++ {"file-system", 0x1c0000, 0x600000}, ++ {"user-config", 0x7c0000, 0x10000}, ++ {"backup-config", 0x7d0000, 0x10000}, ++ {"log", 0x7e0000, 0x10000}, ++ {"radio", 0x7f0000, 0x10000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "file-system" ++ }, ++ ++ /** Firmware layout for the TL-WR1043 v4 */ ++ { ++ .id = "TLWR1043NDV4", ++ .vendor = "", ++ .support_list = ++ "SupportList:\n" ++ "{product_name:TL-WR1043ND,product_ver:4.0.0,special_id:45550000}\n", ++ .support_trail = '\x00', ++ ++ /** ++ We use a bigger os-image partition than the stock images (and thus ++ smaller file-system), as our kernel doesn't fit in the stock firmware's ++ 1MB os-image. ++ */ ++ .partitions = { ++ {"fs-uboot", 0x00000, 0x20000}, ++ {"os-image", 0x20000, 0x180000}, ++ {"file-system", 0x1a0000, 0xdb0000}, ++ {"default-mac", 0xf50000, 0x00200}, ++ {"pin", 0xf50200, 0x00200}, ++ {"product-info", 0xf50400, 0x0fc00}, ++ {"soft-version", 0xf60000, 0x0b000}, ++ {"support-list", 0xf6b000, 0x04000}, ++ {"profile", 0xf70000, 0x04000}, ++ {"default-config", 0xf74000, 0x0b000}, ++ {"user-config", 0xf80000, 0x40000}, ++ {"partition-table", 0xfc0000, 0x10000}, ++ {"log", 0xfd0000, 0x20000}, ++ {"radio", 0xff0000, 0x10000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "file-system" ++ }, ++ ++ {} + }; + +-/** +- The support list for CPE210/220/510/520 +-*/ +-static const char cpe510_support_list[] = +- "SupportList:\r\n" +- "CPE510(TP-LINK|UN|N300-5):1.0\r\n" +- "CPE510(TP-LINK|UN|N300-5):1.1\r\n" +- "CPE520(TP-LINK|UN|N300-5):1.0\r\n" +- "CPE520(TP-LINK|UN|N300-5):1.1\r\n" +- "CPE210(TP-LINK|UN|N300-2):1.0\r\n" +- "CPE210(TP-LINK|UN|N300-2):1.1\r\n" +- "CPE220(TP-LINK|UN|N300-2):1.0\r\n" +- "CPE220(TP-LINK|UN|N300-2):1.1\r\n"; +- + #define error(_ret, _errno, _str, ...) \ + do { \ + fprintf(stderr, _str ": %s\n", ## __VA_ARGS__, \ +@@ -240,14 +432,14 @@ static struct image_partition_entry make_soft_version(uint32_t rev) { + } + + /** Generates the support-list partition */ +-static struct image_partition_entry make_support_list(const char *support_list) { +- size_t len = strlen(support_list); ++static struct image_partition_entry make_support_list(const struct device_info *info) { ++ size_t len = strlen(info->support_list); + struct image_partition_entry entry = alloc_image_partition("support-list", len + 9); + + put32(entry.data, len); + memset(entry.data+4, 0, 4); +- memcpy(entry.data+8, support_list, len); +- entry.data[len+8] = '\xff'; ++ memcpy(entry.data+8, info->support_list, len); ++ entry.data[len+8] = info->support_trail; + + return entry; + } +@@ -313,12 +505,22 @@ static struct image_partition_entry read_file(const char *part_name, const char + + I think partition-table must be the first partition in the firmware image. + */ +-static void put_partitions(uint8_t *buffer, const struct image_partition_entry *parts) { +- size_t i; ++static void put_partitions(uint8_t *buffer, const struct flash_partition_entry *flash_parts, const struct image_partition_entry *parts) { ++ size_t i, j; + char *image_pt = (char *)buffer, *end = image_pt + 0x800; + + size_t base = 0x800; + for (i = 0; parts[i].name; i++) { ++ for (j = 0; flash_parts[j].name; j++) { ++ if (!strcmp(flash_parts[j].name, parts[i].name)) { ++ if (parts[i].size > flash_parts[j].size) ++ error(1, 0, "%s partition too big (more than %u bytes)", flash_parts[j].name, (unsigned)flash_parts[j].size); ++ break; ++ } ++ } ++ ++ assert(flash_parts[j].name); ++ + memcpy(buffer + base, parts[i].data, parts[i].size); + + size_t len = end-image_pt; +@@ -331,10 +533,6 @@ static void put_partitions(uint8_t *buffer, const struct image_partition_entry * + + base += parts[i].size; + } +- +- image_pt++; +- +- memset(image_pt, 0xff, end-image_pt); + } + + /** Generates and writes the image MD5 checksum */ +@@ -363,7 +561,7 @@ static void put_md5(uint8_t *md5, uint8_t *buffer, unsigned int len) { + 1014-1813 Image partition table (2048 bytes, padded with 0xff) + 1814-xxxx Firmware partitions + */ +-static void * generate_factory_image(const char *vendor, const struct image_partition_entry *parts, size_t *len) { ++static void * generate_factory_image(const struct device_info *info, const struct image_partition_entry *parts, size_t *len) { + *len = 0x1814; + + size_t i; +@@ -374,14 +572,16 @@ static void * generate_factory_image(const char *vendor, const struct image_part + if (!image) + error(1, errno, "malloc"); + ++ memset(image, 0xff, *len); + put32(image, *len); + +- size_t vendor_len = strlen(vendor); +- put32(image+0x14, vendor_len); +- memcpy(image+0x18, vendor, vendor_len); +- memset(image+0x18+vendor_len, 0xff, 4092-vendor_len); ++ if (info->vendor) { ++ size_t vendor_len = strlen(info->vendor); ++ put32(image+0x14, vendor_len); ++ memcpy(image+0x18, info->vendor, vendor_len); ++ } + +- put_partitions(image + 0x1014, parts); ++ put_partitions(image + 0x1014, info->partitions, parts); + put_md5(image+0x04, image+0x14, *len-0x14); + + return image; +@@ -394,33 +594,39 @@ static void * generate_factory_image(const char *vendor, const struct image_part + should be generalized when TP-LINK starts building its safeloader into hardware with + different flash layouts. + */ +-static void * generate_sysupgrade_image(const struct flash_partition_entry *flash_parts, const struct image_partition_entry *image_parts, size_t *len) { +- const struct flash_partition_entry *flash_os_image = &flash_parts[5]; +- const struct flash_partition_entry *flash_soft_version = &flash_parts[6]; +- const struct flash_partition_entry *flash_support_list = &flash_parts[7]; +- const struct flash_partition_entry *flash_file_system = &flash_parts[8]; +- +- const struct image_partition_entry *image_os_image = &image_parts[3]; +- const struct image_partition_entry *image_soft_version = &image_parts[1]; +- const struct image_partition_entry *image_support_list = &image_parts[2]; +- const struct image_partition_entry *image_file_system = &image_parts[4]; +- +- assert(strcmp(flash_os_image->name, "os-image") == 0); +- assert(strcmp(flash_soft_version->name, "soft-version") == 0); +- assert(strcmp(flash_support_list->name, "support-list") == 0); +- assert(strcmp(flash_file_system->name, "file-system") == 0); +- +- assert(strcmp(image_os_image->name, "os-image") == 0); +- assert(strcmp(image_soft_version->name, "soft-version") == 0); +- assert(strcmp(image_support_list->name, "support-list") == 0); +- assert(strcmp(image_file_system->name, "file-system") == 0); +- +- if (image_os_image->size > flash_os_image->size) +- error(1, 0, "kernel image too big (more than %u bytes)", (unsigned)flash_os_image->size); +- if (image_file_system->size > flash_file_system->size) +- error(1, 0, "rootfs image too big (more than %u bytes)", (unsigned)flash_file_system->size); +- +- *len = flash_file_system->base - flash_os_image->base + image_file_system->size; ++static void * generate_sysupgrade_image(const struct device_info *info, const struct image_partition_entry *image_parts, size_t *len) { ++ size_t i, j; ++ size_t flash_first_partition_index = 0; ++ size_t flash_last_partition_index = 0; ++ const struct flash_partition_entry *flash_first_partition = NULL; ++ const struct flash_partition_entry *flash_last_partition = NULL; ++ const struct image_partition_entry *image_last_partition = NULL; ++ ++ /** Find first and last partitions */ ++ for (i = 0; info->partitions[i].name; i++) { ++ if (!strcmp(info->partitions[i].name, info->first_sysupgrade_partition)) { ++ flash_first_partition = &info->partitions[i]; ++ flash_first_partition_index = i; ++ } else if (!strcmp(info->partitions[i].name, info->last_sysupgrade_partition)) { ++ flash_last_partition = &info->partitions[i]; ++ flash_last_partition_index = i; ++ } ++ } ++ ++ assert(flash_first_partition && flash_last_partition); ++ assert(flash_first_partition_index < flash_last_partition_index); ++ ++ /** Find last partition from image to calculate needed size */ ++ for (i = 0; image_parts[i].name; i++) { ++ if (!strcmp(image_parts[i].name, info->last_sysupgrade_partition)) { ++ image_last_partition = &image_parts[i]; ++ break; ++ } ++ } ++ ++ assert(image_last_partition); ++ ++ *len = flash_last_partition->base - flash_first_partition->base + image_last_partition->size; + + uint8_t *image = malloc(*len); + if (!image) +@@ -428,31 +634,44 @@ static void * generate_sysupgrade_image(const struct flash_partition_entry *flas + + memset(image, 0xff, *len); + +- memcpy(image, image_os_image->data, image_os_image->size); +- memcpy(image + flash_soft_version->base - flash_os_image->base, image_soft_version->data, image_soft_version->size); +- memcpy(image + flash_support_list->base - flash_os_image->base, image_support_list->data, image_support_list->size); +- memcpy(image + flash_file_system->base - flash_os_image->base, image_file_system->data, image_file_system->size); ++ for (i = flash_first_partition_index; i <= flash_last_partition_index; i++) { ++ for (j = 0; image_parts[j].name; j++) { ++ if (!strcmp(info->partitions[i].name, image_parts[j].name)) { ++ if (image_parts[j].size > info->partitions[i].size) ++ error(1, 0, "%s partition too big (more than %u bytes)", info->partitions[i].name, (unsigned)info->partitions[i].size); ++ memcpy(image + info->partitions[i].base - flash_first_partition->base, image_parts[j].data, image_parts[j].size); ++ break; ++ } ++ ++ assert(image_parts[j].name); ++ } ++ } + + return image; + } + +- +-/** Generates an image for CPE210/220/510/520 and writes it to a file */ +-static void do_cpe510(const char *output, const char *kernel_image, const char *rootfs_image, uint32_t rev, bool add_jffs2_eof, bool sysupgrade) { ++/** Generates an image according to a given layout and writes it to a file */ ++static void build_image(const char *output, ++ const char *kernel_image, ++ const char *rootfs_image, ++ uint32_t rev, ++ bool add_jffs2_eof, ++ bool sysupgrade, ++ const struct device_info *info) { + struct image_partition_entry parts[6] = {}; + +- parts[0] = make_partition_table(cpe510_partitions); ++ parts[0] = make_partition_table(info->partitions); + parts[1] = make_soft_version(rev); +- parts[2] = make_support_list(cpe510_support_list); ++ parts[2] = make_support_list(info); + parts[3] = read_file("os-image", kernel_image, false); + parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof); + + size_t len; + void *image; + if (sysupgrade) +- image = generate_sysupgrade_image(cpe510_partitions, parts, &len); ++ image = generate_sysupgrade_image(info, parts, &len); + else +- image = generate_factory_image(cpe510_vendor, parts, &len); ++ image = generate_factory_image(info, parts, &len); + + FILE *file = fopen(output, "wb"); + if (!file) +@@ -470,7 +689,6 @@ static void do_cpe510(const char *output, const char *kernel_image, const char * + free_image_partition(parts[i]); + } + +- + /** Usage output */ + static void usage(const char *argv0) { + fprintf(stderr, +@@ -490,10 +708,22 @@ static void usage(const char *argv0) { + }; + + ++static const struct device_info *find_board(const char *id) ++{ ++ struct device_info *board = NULL; ++ ++ for (board = boards; board->id != NULL; board++) ++ if (strcasecmp(id, board->id) == 0) ++ return board; ++ ++ return NULL; ++} ++ + int main(int argc, char *argv[]) { + const char *board = NULL, *kernel_image = NULL, *rootfs_image = NULL, *output = NULL; + bool add_jffs2_eof = false, sysupgrade = false; + unsigned rev = 0; ++ const struct device_info *info; + + while (true) { + int c; +@@ -550,10 +780,12 @@ int main(int argc, char *argv[]) { + if (!output) + error(1, 0, "no output filename has been specified"); + +- if (strcmp(board, "CPE510") == 0) +- do_cpe510(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade); +- else ++ info = find_board(board); ++ ++ if (info == NULL) + error(1, 0, "unsupported board %s", board); + ++ build_image(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade, info); ++ + return 0; + } diff --git a/patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch b/patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch deleted file mode 100644 index 676f5159..00000000 --- a/patches/openwrt/0065-fw-utils-tplink-safeloader.c-Add-support-for-Archer-C2600.patch +++ /dev/null @@ -1,188 +0,0 @@ -From: Matthias Schiffer -Date: Thu, 9 Jun 2016 05:02:18 +0200 -Subject: fw-utils/tplink-safeloader.c: Add support for Archer C2600 - -Signed-off-by: Ash Benz - -Backport of LEDE 955c341d3bec0eb4971a03924e99156367255d7b - -diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c -index 77a894b237281f6211dd1123ead4b5b0f2f58370..2e204aa2335e55515a60a1f5c08ca1b499eb9287 100644 ---- a/tools/firmware-utils/src/tplink-safeloader.c -+++ b/tools/firmware-utils/src/tplink-safeloader.c -@@ -105,6 +105,8 @@ static const uint8_t md5_salt[16] = { - /** Vendor information for CPE210/220/510/520 */ - static const char cpe510_vendor[] = "CPE510(TP-LINK|UN|N300-5):1.0\r\n"; - -+/** Vendor information for C2600 */ -+static const char c2600_vendor[] = ""; - - /** - The flash partition table for CPE210/220/510/520; -@@ -128,6 +130,39 @@ static const struct flash_partition_entry cpe510_partitions[] = { - }; - - /** -+ The flash partition table for C2600; -+ it is the same as the one used by the stock images. -+*/ -+static const struct flash_partition_entry c2600_partitions[] = { -+ {"SBL1", 0x00000, 0x20000}, -+ {"MIBIB", 0x20000, 0x20000}, -+ {"SBL2", 0x40000, 0x20000}, -+ {"SBL3", 0x60000, 0x30000}, -+ {"DDRCONFIG", 0x90000, 0x10000}, -+ {"SSD", 0xa0000, 0x10000}, -+ {"TZ", 0xb0000, 0x30000}, -+ {"RPM", 0xe0000, 0x20000}, -+ {"fs-uboot", 0x100000, 0x70000}, -+ {"uboot-env", 0x170000, 0x40000}, -+ {"radio", 0x1b0000, 0x40000}, -+ {"os-image", 0x1f0000, 0x200000}, -+ {"file-system", 0x3f0000, 0x1b00000}, -+ {"default-mac", 0x1ef0000, 0x00200}, -+ {"pin", 0x1ef0200, 0x00200}, -+ {"product-info", 0x1ef0400, 0x0fc00}, -+ {"partition-table", 0x1f00000, 0x10000}, -+ {"soft-version", 0x1f10000, 0x10000}, -+ {"support-list", 0x1f20000, 0x10000}, -+ {"profile", 0x1f30000, 0x10000}, -+ {"default-config", 0x1f40000, 0x10000}, -+ {"user-config", 0x1f50000, 0x40000}, -+ {"qos-db", 0x1f90000, 0x40000}, -+ {"usb-config", 0x1fd0000, 0x10000}, -+ {"log", 0x1fe0000, 0x20000}, -+ {NULL, 0, 0} -+}; -+ -+/** - The support list for CPE210/220/510/520 - */ - static const char cpe510_support_list[] = -@@ -141,6 +176,13 @@ static const char cpe510_support_list[] = - "CPE220(TP-LINK|UN|N300-2):1.0\r\n" - "CPE220(TP-LINK|UN|N300-2):1.1\r\n"; - -+/** -+ The support list for C2600 -+*/ -+static const char c2600_support_list[] = -+ "SupportList:\r\n" -+ "{product_name:Archer C2600,product_ver:1.0.0,special_id:00000000}\r\n"; -+ - #define error(_ret, _errno, _str, ...) \ - do { \ - fprintf(stderr, _str ": %s\n", ## __VA_ARGS__, \ -@@ -240,14 +282,14 @@ static struct image_partition_entry make_soft_version(uint32_t rev) { - } - - /** Generates the support-list partition */ --static struct image_partition_entry make_support_list(const char *support_list) { -+static struct image_partition_entry make_support_list(const char *support_list, bool trailzero) { - size_t len = strlen(support_list); - struct image_partition_entry entry = alloc_image_partition("support-list", len + 9); - - put32(entry.data, len); - memset(entry.data+4, 0, 4); - memcpy(entry.data+8, support_list, len); -- entry.data[len+8] = '\xff'; -+ entry.data[len+8] = trailzero ? '\x00' : '\xff'; - - return entry; - } -@@ -436,6 +478,37 @@ static void * generate_sysupgrade_image(const struct flash_partition_entry *flas - return image; - } - -+static void * generate_sysupgrade_image_c2600(const struct flash_partition_entry *flash_parts, const struct image_partition_entry *image_parts, size_t *len) { -+ const struct flash_partition_entry *flash_os_image = &flash_parts[11]; -+ const struct flash_partition_entry *flash_file_system = &flash_parts[12]; -+ -+ const struct image_partition_entry *image_os_image = &image_parts[3]; -+ const struct image_partition_entry *image_file_system = &image_parts[4]; -+ -+ assert(strcmp(flash_os_image->name, "os-image") == 0); -+ assert(strcmp(flash_file_system->name, "file-system") == 0); -+ -+ assert(strcmp(image_os_image->name, "os-image") == 0); -+ assert(strcmp(image_file_system->name, "file-system") == 0); -+ -+ if (image_os_image->size > flash_os_image->size) -+ error(1, 0, "kernel image too big (more than %u bytes)", (unsigned)flash_os_image->size); -+ if (image_file_system->size > flash_file_system->size) -+ error(1, 0, "rootfs image too big (more than %u bytes)", (unsigned)flash_file_system->size); -+ -+ *len = flash_file_system->base - flash_os_image->base + image_file_system->size; -+ -+ uint8_t *image = malloc(*len); -+ if (!image) -+ error(1, errno, "malloc"); -+ -+ memset(image, 0xff, *len); -+ -+ memcpy(image, image_os_image->data, image_os_image->size); -+ memcpy(image + flash_file_system->base - flash_os_image->base, image_file_system->data, image_file_system->size); -+ -+ return image; -+} - - /** Generates an image for CPE210/220/510/520 and writes it to a file */ - static void do_cpe510(const char *output, const char *kernel_image, const char *rootfs_image, uint32_t rev, bool add_jffs2_eof, bool sysupgrade) { -@@ -443,7 +516,7 @@ static void do_cpe510(const char *output, const char *kernel_image, const char * - - parts[0] = make_partition_table(cpe510_partitions); - parts[1] = make_soft_version(rev); -- parts[2] = make_support_list(cpe510_support_list); -+ parts[2] = make_support_list(cpe510_support_list,false); - parts[3] = read_file("os-image", kernel_image, false); - parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof); - -@@ -470,6 +543,39 @@ static void do_cpe510(const char *output, const char *kernel_image, const char * - free_image_partition(parts[i]); - } - -+/** Generates an image for C2600 and writes it to a file */ -+static void do_c2600(const char *output, const char *kernel_image, const char *rootfs_image, uint32_t rev, bool add_jffs2_eof, bool sysupgrade) { -+ struct image_partition_entry parts[6] = {}; -+ -+ parts[0] = make_partition_table(c2600_partitions); -+ parts[1] = make_soft_version(rev); -+ parts[2] = make_support_list(c2600_support_list,true); -+ parts[3] = read_file("os-image", kernel_image, false); -+ parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof); -+ -+ size_t len; -+ void *image; -+ if (sysupgrade) -+ image = generate_sysupgrade_image_c2600(c2600_partitions, parts, &len); -+ else -+ image = generate_factory_image(c2600_vendor, parts, &len); -+ -+ FILE *file = fopen(output, "wb"); -+ if (!file) -+ error(1, errno, "unable to open output file"); -+ -+ if (fwrite(image, len, 1, file) != 1) -+ error(1, 0, "unable to write output file"); -+ -+ fclose(file); -+ -+ free(image); -+ -+ size_t i; -+ for (i = 0; parts[i].name; i++) -+ free_image_partition(parts[i]); -+} -+ - - /** Usage output */ - static void usage(const char *argv0) { -@@ -552,6 +658,8 @@ int main(int argc, char *argv[]) { - - if (strcmp(board, "CPE510") == 0) - do_cpe510(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade); -+ else if (strcmp(board, "C2600") == 0) -+ do_c2600(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade); - else - error(1, 0, "unsupported board %s", board); - diff --git a/patches/openwrt/0066-ar71xx-split-CPE210-from-CPE510-profile.patch b/patches/openwrt/0066-ar71xx-split-CPE210-from-CPE510-profile.patch new file mode 100644 index 00000000..eb29bc8f --- /dev/null +++ b/patches/openwrt/0066-ar71xx-split-CPE210-from-CPE510-profile.patch @@ -0,0 +1,26 @@ +From: Matthias Schiffer +Date: Thu, 9 Jun 2016 05:03:35 +0200 +Subject: ar71xx: split CPE210 from CPE510 profile + +The CPE210 was still described for the OEM upgrade as compatible, +even the wireless configuration isn't compatible anymore between +both series (2ghz and 5ghz). +Update the CPE210 image profile to use the new profile. + +Signed-off-by: Alexander Couzens + +Backport of LEDE 824147960569f2c1cd22140c9074c62c3df911a5 + +diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile +index 75083f9b698ba8a438256209a34369eb626a3b3d..bb2bb94e04ee8f59db62907ace49952061b411dc 100644 +--- a/target/linux/ar71xx/image/Makefile ++++ b/target/linux/ar71xx/image/Makefile +@@ -2111,7 +2111,7 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR10 + $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V3,tl-wr1043nd-v3,TL-WR1043ND-v2,ttyS0,115200,0x10430003,1,8M)) + $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR2543,tl-wr2543-v1,TL-WR2543N,ttyS0,115200,0x25430001,1,8Mlzma,-v 3.13.99)) + +-$(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE210_220,cpe210-220,CPE210,ttyS0,115200,$$(cpe510_mtdlayout),CPE510)) ++$(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE210_220,cpe210-220,CPE210,ttyS0,115200,$$(cpe510_mtdlayout),CPE210)) + $(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE510_520,cpe510-520,CPE510,ttyS0,115200,$$(cpe510_mtdlayout),CPE510)) + + $(eval $(call SingleProfile,UAPPRO,64k,UAPPRO,ubnt-uap-pro,UAP-PRO,ttyS0,115200,BZ,BZ,ar934x)) diff --git a/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch b/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch deleted file mode 100644 index d16e2cd6..00000000 --- a/patches/openwrt/0066-tools-tplink-safeloader-split-CPE210-from-CPE510-profile.patch +++ /dev/null @@ -1,102 +0,0 @@ -From: Matthias Schiffer -Date: Thu, 9 Jun 2016 05:03:35 +0200 -Subject: tools/tplink-safeloader: split CPE210 from CPE510 profile - -The CPE210 was still described for the OEM upgrade as compatible, -even the wireless configuration isn't compatible anymore between -both series (2ghz and 5ghz). -Update the CPE210 image profile to use the new profile. - -Signed-off-by: Alexander Couzens - -Backport of LEDE 824147960569f2c1cd22140c9074c62c3df911a5 - -diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile -index 75083f9b698ba8a438256209a34369eb626a3b3d..bb2bb94e04ee8f59db62907ace49952061b411dc 100644 ---- a/target/linux/ar71xx/image/Makefile -+++ b/target/linux/ar71xx/image/Makefile -@@ -2111,7 +2111,7 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V2,tl-wr1043nd-v2,TL-WR10 - $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR1043V3,tl-wr1043nd-v3,TL-WR1043ND-v2,ttyS0,115200,0x10430003,1,8M)) - $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR2543,tl-wr2543-v1,TL-WR2543N,ttyS0,115200,0x25430001,1,8Mlzma,-v 3.13.99)) - --$(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE210_220,cpe210-220,CPE210,ttyS0,115200,$$(cpe510_mtdlayout),CPE510)) -+$(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE210_220,cpe210-220,CPE210,ttyS0,115200,$$(cpe510_mtdlayout),CPE210)) - $(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE510_520,cpe510-520,CPE510,ttyS0,115200,$$(cpe510_mtdlayout),CPE510)) - - $(eval $(call SingleProfile,UAPPRO,64k,UAPPRO,ubnt-uap-pro,UAP-PRO,ttyS0,115200,BZ,BZ,ar934x)) -diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c -index 2e204aa2335e55515a60a1f5c08ca1b499eb9287..4938f74eecd122265072390e1c6b8cadb09844d0 100644 ---- a/tools/firmware-utils/src/tplink-safeloader.c -+++ b/tools/firmware-utils/src/tplink-safeloader.c -@@ -163,6 +163,15 @@ static const struct flash_partition_entry c2600_partitions[] = { - }; - - /** -+ The support list for CPE210/220 -+*/ -+static const char cpe210_support_list[] = -+ "SupportList:\r\n" -+ "CPE210(TP-LINK|UN|N300-2):1.0\r\n" -+ "CPE210(TP-LINK|UN|N300-2):1.1\r\n" -+ "CPE220(TP-LINK|UN|N300-2):1.0\r\n" -+ "CPE220(TP-LINK|UN|N300-2):1.1\r\n"; -+/** - The support list for CPE210/220/510/520 - */ - static const char cpe510_support_list[] = -@@ -170,11 +179,7 @@ static const char cpe510_support_list[] = - "CPE510(TP-LINK|UN|N300-5):1.0\r\n" - "CPE510(TP-LINK|UN|N300-5):1.1\r\n" - "CPE520(TP-LINK|UN|N300-5):1.0\r\n" -- "CPE520(TP-LINK|UN|N300-5):1.1\r\n" -- "CPE210(TP-LINK|UN|N300-2):1.0\r\n" -- "CPE210(TP-LINK|UN|N300-2):1.1\r\n" -- "CPE220(TP-LINK|UN|N300-2):1.0\r\n" -- "CPE220(TP-LINK|UN|N300-2):1.1\r\n"; -+ "CPE520(TP-LINK|UN|N300-5):1.1\r\n"; - - /** - The support list for C2600 -@@ -511,12 +516,18 @@ static void * generate_sysupgrade_image_c2600(const struct flash_partition_entry - } - - /** Generates an image for CPE210/220/510/520 and writes it to a file */ --static void do_cpe510(const char *output, const char *kernel_image, const char *rootfs_image, uint32_t rev, bool add_jffs2_eof, bool sysupgrade) { -+static void do_cpe(const char *output, -+ const char *kernel_image, -+ const char *rootfs_image, -+ uint32_t rev, -+ bool add_jffs2_eof, -+ bool sysupgrade, -+ const char *support_list) { - struct image_partition_entry parts[6] = {}; - - parts[0] = make_partition_table(cpe510_partitions); - parts[1] = make_soft_version(rev); -- parts[2] = make_support_list(cpe510_support_list,false); -+ parts[2] = make_support_list(support_list, false); - parts[3] = read_file("os-image", kernel_image, false); - parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof); - -@@ -549,7 +560,7 @@ static void do_c2600(const char *output, const char *kernel_image, const char *r - - parts[0] = make_partition_table(c2600_partitions); - parts[1] = make_soft_version(rev); -- parts[2] = make_support_list(c2600_support_list,true); -+ parts[2] = make_support_list(c2600_support_list, true); - parts[3] = read_file("os-image", kernel_image, false); - parts[4] = read_file("file-system", rootfs_image, add_jffs2_eof); - -@@ -656,8 +667,10 @@ int main(int argc, char *argv[]) { - if (!output) - error(1, 0, "no output filename has been specified"); - -- if (strcmp(board, "CPE510") == 0) -- do_cpe510(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade); -+ if (strcmp(board, "CPE210") == 0) -+ do_cpe(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade, cpe210_support_list); -+ else if (strcmp(board, "CPE510") == 0) -+ do_cpe(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade, cpe510_support_list); - else if (strcmp(board, "C2600") == 0) - do_c2600(output, kernel_image, rootfs_image, rev, add_jffs2_eof, sysupgrade); - else diff --git a/patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch b/patches/openwrt/0084-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch similarity index 100% rename from patches/openwrt/0085-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch rename to patches/openwrt/0084-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch diff --git a/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch b/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch deleted file mode 100644 index 68fe1fc7..00000000 --- a/patches/openwrt/0084-firmware-utils-tplink-safeloader-update-support-list-for-CPE210-510.patch +++ /dev/null @@ -1,45 +0,0 @@ -From: Matthias Schiffer -Date: Sun, 11 Dec 2016 18:00:13 +0100 -Subject: firmware-utils: tplink-safeloader: update support list for CPE210/510/... - -Adds support for new EU and US variants, removes a few strings that were -never actually used and have been removed from the stock firmwares. - -Signed-off-by: Matthias Schiffer - -diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c -index 4938f74eecd122265072390e1c6b8cadb09844d0..4a38dff10003825a3b72595d57f0e62ef233e9bc 100644 ---- a/tools/firmware-utils/src/tplink-safeloader.c -+++ b/tools/firmware-utils/src/tplink-safeloader.c -@@ -169,8 +169,13 @@ static const char cpe210_support_list[] = - "SupportList:\r\n" - "CPE210(TP-LINK|UN|N300-2):1.0\r\n" - "CPE210(TP-LINK|UN|N300-2):1.1\r\n" -- "CPE220(TP-LINK|UN|N300-2):1.0\r\n" -- "CPE220(TP-LINK|UN|N300-2):1.1\r\n"; -+ "CPE210(TP-LINK|US|N300-2):1.1\r\n" -+ "CPE210(TP-LINK|EU|N300-2):1.1\r\n" -+ "CPE220(TP-LINK|UN|N300-2):1.1\r\n" -+ "CPE220(TP-LINK|US|N300-2):1.1\r\n" -+ "CPE220(TP-LINK|EU|N300-2):1.1\r\n" -+ ; -+ - /** - The support list for CPE210/220/510/520 - */ -@@ -178,8 +183,13 @@ static const char cpe510_support_list[] = - "SupportList:\r\n" - "CPE510(TP-LINK|UN|N300-5):1.0\r\n" - "CPE510(TP-LINK|UN|N300-5):1.1\r\n" -- "CPE520(TP-LINK|UN|N300-5):1.0\r\n" -- "CPE520(TP-LINK|UN|N300-5):1.1\r\n"; -+ "CPE510(TP-LINK|UN|N300-5):1.1\r\n" -+ "CPE510(TP-LINK|US|N300-5):1.1\r\n" -+ "CPE510(TP-LINK|EU|N300-5):1.1\r\n" -+ "CPE520(TP-LINK|UN|N300-5):1.1\r\n" -+ "CPE520(TP-LINK|US|N300-5):1.1\r\n" -+ "CPE520(TP-LINK|EU|N300-5):1.1\r\n" -+ ; - - /** - The support list for C2600 diff --git a/patches/openwrt/0086-x86-preserve-partition-table-on-sysupgrade.patch b/patches/openwrt/0085-x86-preserve-partition-table-on-sysupgrade.patch similarity index 100% rename from patches/openwrt/0086-x86-preserve-partition-table-on-sysupgrade.patch rename to patches/openwrt/0085-x86-preserve-partition-table-on-sysupgrade.patch diff --git a/patches/openwrt/0087-x86-make-sysupgrade-work-without-partx.patch b/patches/openwrt/0086-x86-make-sysupgrade-work-without-partx.patch similarity index 100% rename from patches/openwrt/0087-x86-make-sysupgrade-work-without-partx.patch rename to patches/openwrt/0086-x86-make-sysupgrade-work-without-partx.patch diff --git a/patches/openwrt/0088-x86-search-PARTUUID-in-any-block-device.patch b/patches/openwrt/0087-x86-search-PARTUUID-in-any-block-device.patch similarity index 100% rename from patches/openwrt/0088-x86-search-PARTUUID-in-any-block-device.patch rename to patches/openwrt/0087-x86-search-PARTUUID-in-any-block-device.patch diff --git a/patches/openwrt/0089-x86-generalize-partition-discovery-for-sysupgrade.patch b/patches/openwrt/0088-x86-generalize-partition-discovery-for-sysupgrade.patch similarity index 100% rename from patches/openwrt/0089-x86-generalize-partition-discovery-for-sysupgrade.patch rename to patches/openwrt/0088-x86-generalize-partition-discovery-for-sysupgrade.patch diff --git a/patches/openwrt/0089-ar71xx-rename-mktplinkfw-initramfs-to-more-generic-mktplinkfw-combined.patch b/patches/openwrt/0089-ar71xx-rename-mktplinkfw-initramfs-to-more-generic-mktplinkfw-combined.patch new file mode 100644 index 00000000..a12c1f98 --- /dev/null +++ b/patches/openwrt/0089-ar71xx-rename-mktplinkfw-initramfs-to-more-generic-mktplinkfw-combined.patch @@ -0,0 +1,39 @@ +From: Matthias Schiffer +Date: Fri, 9 Dec 2016 13:08:51 +0100 +Subject: ar71xx: rename mktplinkfw-initramfs to more generic mktplinkfw-combined + +Signed-off-by: Matthias Schiffer + +Backport of LEDE 0495181529e6069af03704f4b5ae71883a2cd6b6 + +diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile +index b35c713f3c92c3d02f26f4bf535aeec34fd71b12..638e97f088b5420cf4f2a3c706875677815240e1 100644 +--- a/target/linux/ar71xx/image/Makefile ++++ b/target/linux/ar71xx/image/Makefile +@@ -63,7 +63,7 @@ define Build/mktplinkfw + endef + + # -c combined image +-define Build/mktplinkfw-initramfs ++define Build/mktplinkfw-combined + $(STAGING_DIR_HOST)/bin/mktplinkfw \ + -H $(TPLINK_HWID) -W $(TPLINK_HWREV) -F $(TPLINK_FLASHLAYOUT) -N OpenWrt -V $(REVISION) $(1) \ + -k $@ \ +@@ -203,7 +203,7 @@ TARGET_DEVICES += wndr3700 wndr3700v2 wndr3800 wndr3800ch wndrmac wndrmacv2 + define Device/tplink + TPLINK_HWREV := 0x1 + KERNEL := kernel-bin | patch-cmdline | lzma +- KERNEL_INITRAMFS := kernel-bin | patch-cmdline | lzma | mktplinkfw-initramfs ++ KERNEL_INITRAMFS := kernel-bin | patch-cmdline | lzma | mktplinkfw-combined + IMAGES := sysupgrade.bin factory.bin + IMAGE/sysupgrade.bin := append-rootfs | mktplinkfw sysupgrade + IMAGE/factory.bin := append-rootfs | mktplinkfw factory +@@ -215,7 +215,7 @@ $(Device/tplink) + COMPILE := loader-$(1).gz + COMPILE/loader-$(1).gz := loader-okli-compile + KERNEL := copy-file $(KDIR)/vmlinux.bin.lzma | uImage lzma -M 0x4f4b4c49 | loader-okli $(1) +- KERNEL_INITRAMFS := copy-file $(KDIR)/vmlinux-initramfs.bin.lzma | loader-kernel | mktplinkfw-initramfs ++ KERNEL_INITRAMFS := copy-file $(KDIR)/vmlinux-initramfs.bin.lzma | loader-kernel | mktplinkfw-combined + endef + + define Device/tplink-4m diff --git a/patches/openwrt/0090-firmware-utils-add-support-for-TL-WR1043ND-v4-to-mktplinkfw.patch b/patches/openwrt/0090-firmware-utils-add-support-for-TL-WR1043ND-v4-to-mktplinkfw.patch new file mode 100644 index 00000000..752c0853 --- /dev/null +++ b/patches/openwrt/0090-firmware-utils-add-support-for-TL-WR1043ND-v4-to-mktplinkfw.patch @@ -0,0 +1,36 @@ +From: Matthias Schiffer +Date: Sat, 10 Dec 2016 20:45:50 +0100 +Subject: firmware-utils: add support for TL-WR1043ND v4 to mktplinkfw + +The TL-WR1043ND v4 uses a kernel image with a mktplinkfw header inside the +os-image partition of a tplink-safeloader image. + +Signed-off-by: Matthias Schiffer + +Backport of LEDE 51740990cd1d5375a566454e692b479986cba958 + +diff --git a/tools/firmware-utils/src/mktplinkfw.c b/tools/firmware-utils/src/mktplinkfw.c +index 34e6546a2d7db72748146ef233830c2e8de9ce97..fbf89609c22dd0fb50c4c8656141c8a8b9c29817 100644 +--- a/tools/firmware-utils/src/mktplinkfw.c ++++ b/tools/firmware-utils/src/mktplinkfw.c +@@ -178,6 +178,20 @@ static struct flash_layout layouts[] = { + .kernel_ep = 0xc0000000, + .rootfs_ofs = 0x2a0000, + }, { ++ /* ++ Some devices (e.g. TL-WR1043 v4) use a mktplinkfw kernel image ++ embedded in a tplink-safeloader image as os-image partition. ++ ++ We use a 1.5MB partition for the compressed kernel, which should ++ be sufficient, but not too wasteful (the flash of the TL-WR1043 v4 ++ has 16MB in total). ++ */ ++ .id = "16Msafeloader", ++ .fw_max_len = 0x180000, ++ .kernel_la = 0x80060000, ++ .kernel_ep = 0x80060000, ++ .rootfs_ofs = 0, ++ }, { + /* terminating entry */ + } + }; diff --git a/patches/openwrt/0091-ar71xx-add-support-for-TP-LINK-WR1043ND-v4.patch b/patches/openwrt/0091-ar71xx-add-support-for-TP-LINK-WR1043ND-v4.patch new file mode 100644 index 00000000..0b6eb685 --- /dev/null +++ b/patches/openwrt/0091-ar71xx-add-support-for-TP-LINK-WR1043ND-v4.patch @@ -0,0 +1,464 @@ +From: Ludwig Thomeczek +Date: Fri, 16 Dec 2016 12:50:34 +0100 +Subject: ar71xx: add support for TP-LINK WR1043ND v4 + +Signed-off-by: Ludwig Thomeczek + +diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh +index 67043d432cf7a469bf1ded14bc354274ab16e3e6..1b613dc6e8ee66f2d7ea32486c2b6ddd03bfba89 100644 +--- a/target/linux/ar71xx/base-files/etc/diag.sh ++++ b/target/linux/ar71xx/base-files/etc/diag.sh +@@ -272,6 +272,7 @@ get_status_led() { + tl-wr1041n-v2 | \ + tl-wr1043nd | \ + tl-wr1043nd-v2 | \ ++ tl-wr1043nd-v4 | \ + tl-wr741nd | \ + tl-wr741nd-v4 | \ + tl-wa801nd-v3 | \ +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +index e47cbb0b01ef4a335c059a74af66d9f8999b3b3d..fa38568fbc84aad4c85636c3894097c65e30eb9a 100644 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +@@ -553,6 +553,16 @@ tl-wr1043nd-v2) + ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" + ;; + ++tl-wr1043nd-v4) ++ ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1" ++ ucidef_set_led_wlan "wlan" "WLAN" "tp-link:green:wlan" "phy0tpt" ++ ucidef_set_led_switch "wan" "WAN" "tp-link:green:wan" "switch0" "0x20" ++ ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" ++ ucidef_set_led_switch "lan2" "LAN2" "tp-link:green:lan2" "switch0" "0x08" ++ ucidef_set_led_switch "lan3" "LAN3" "tp-link:green:lan3" "switch0" "0x04" ++ ucidef_set_led_switch "lan4" "LAN4" "tp-link:green:lan4" "switch0" "0x02" ++ ;; ++ + tl-wr2543n) + ucidef_set_led_usbdev "usb" "USB" "tp-link:green:usb" "1-1" + ;; +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +index 878623ce3fd8b7c585da73c7bd72794a144096a3..4389bc894f8dd08a9231b35bbb4fba0e9e57560b 100755 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +@@ -208,6 +208,15 @@ tl-wr1043nd) + ucidef_add_switch_vlan "switch0" "2" "0 5t" + ;; + ++tl-wr1043nd-v4) ++ ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2" ++ ucidef_add_switch "switch0" "1" "1" ++ ucidef_add_switch_vlan "switch0" "1" "0t 1 2 3 4" ++ ucidef_add_switch_vlan "switch0" "2" "0t 5" ++ mac=$(mtd_get_mac_binary config 0x1017c) ++ [ -n "$mac" ] && ucidef_set_interface_macaddr "wan" "$mac" ++ ;; ++ + tl-wr2543n) + ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2" + ucidef_add_switch "switch0" "1" "1" +diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh +index 6df0d8a8d0d52c103b9ded2170af19a9a6b5f8bb..5922527da4980fa3b51fdcec2bca96f5962d0f0b 100755 +--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh ++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh +@@ -776,6 +776,9 @@ ar71xx_board_detect() { + *"TL-WR1043ND v2") + name="tl-wr1043nd-v2" + ;; ++ *"TL-WR1043ND v4") ++ name="tl-wr1043nd-v4" ++ ;; + *TL-WR2543N*) + name="tl-wr2543n" + ;; +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +index 76c252ccb14db970aac63ea1d2eaddca3d867867..e61ebf7c2221fd56bb902f14d96cb25d174718ee 100755 +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +@@ -377,6 +377,7 @@ platform_check_image() { + tl-wr1041n-v2 | \ + tl-wr1043nd | \ + tl-wr1043nd-v2 | \ ++ tl-wr1043nd-v4 | \ + tl-wr2543n) + [ "$magic" != "0100" ] && { + echo "Invalid image type." +diff --git a/target/linux/ar71xx/config-3.18 b/target/linux/ar71xx/config-3.18 +index 050362614a464b56d3740a7954686fe4e5b37803..ad0574f9ab67e78cd1359f8b45de5de51521718c 100644 +--- a/target/linux/ar71xx/config-3.18 ++++ b/target/linux/ar71xx/config-3.18 +@@ -131,6 +131,7 @@ CONFIG_ATH79_MACH_TL_WDR4300=y + CONFIG_ATH79_MACH_TL_WR1041N_V2=y + CONFIG_ATH79_MACH_TL_WR1043ND=y + CONFIG_ATH79_MACH_TL_WR1043ND_V2=y ++CONFIG_ATH79_MACH_TL_WR1043ND_V4=y + CONFIG_ATH79_MACH_TL_WR2543N=y + CONFIG_ATH79_MACH_TL_WR703N=y + CONFIG_ATH79_MACH_TL_WR720N_V3=y +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr1043nd-v4.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr1043nd-v4.c +new file mode 100644 +index 0000000000000000000000000000000000000000..cb224f4611004aaaec6c3b2b737b3bb45c79d239 +--- /dev/null ++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-tl-wr1043nd-v4.c +@@ -0,0 +1,190 @@ ++/* ++ * TP-LINK WR1043 V4 support ++ * ++ * Copyright (C) 2015-2016 P. Wassi ++ * Copyright (C) 2016 Matthias Schiffer ++ * Copyright (C) 2016 Andreas Ziegler ++ * Copyright (C) 2016 Ludwig Thomeczek ++ * ++ * Derived from: mach-dir-869-a1.c ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License version 2 as published ++ * by the Free Software Foundation. ++ */ ++ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "common.h" ++#include "dev-ap9x-pci.h" ++#include "dev-eth.h" ++#include "dev-gpio-buttons.h" ++#include "dev-leds-gpio.h" ++#include "dev-m25p80.h" ++#include "dev-wmac.h" ++#include "dev-usb.h" ++#include "machtypes.h" ++#include "nvram.h" ++ ++#define TL_WR1043_V4_GPIO_BTN_RESET 2 ++#define TL_WR1043_V4_GPIO_BTN_RFKILL 5 ++ ++#define TL_WR1043_V4_GPIO_LED_WLAN 19 ++#define TL_WR1043_V4_GPIO_LED_USB 7 ++#define TL_WR1043_V4_GPIO_LED_WPS 1 ++#define TL_WR1043_V4_GPIO_LED_SYSTEM 6 ++ ++#define TL_WR1043_V4_GPIO_USB_POWER 8 ++ ++#define TL_WR1043_V4_GPIO_LED_WAN 15 ++#define TL_WR1043_V4_GPIO_LED_LAN1 9 ++#define TL_WR1043_V4_GPIO_LED_LAN2 14 ++#define TL_WR1043_V4_GPIO_LED_LAN3 21 ++#define TL_WR1043_V4_GPIO_LED_LAN4 20 ++ ++#define TL_WR1043_V4_KEYS_POLL_INTERVAL 20 /* msecs */ ++#define TL_WR1043_V4_KEYS_DEBOUNCE_INTERVAL (3 * TL_WR1043_V4_KEYS_POLL_INTERVAL) ++ ++#define TL_WR1043_V4_MAC_LOCATION 0x1ff80174 ++ ++#define TL_WR1043_V4_EEPROM_ADDR 0x1fff0000 ++#define TL_WR1043_V4_WMAC_CALDATA_OFFSET 0x1000 ++ ++static struct gpio_led tl_wr1043nd_v4_leds_gpio[] __initdata = { ++ { ++ .name = "tp-link:green:wps", ++ .gpio = TL_WR1043_V4_GPIO_LED_WPS, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:green:system", ++ .gpio = TL_WR1043_V4_GPIO_LED_SYSTEM, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:green:wlan", ++ .gpio = TL_WR1043_V4_GPIO_LED_WLAN, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:green:usb", ++ .gpio = TL_WR1043_V4_GPIO_LED_USB, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:green:wan", ++ .gpio = TL_WR1043_V4_GPIO_LED_WAN, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:green:lan1", ++ .gpio = TL_WR1043_V4_GPIO_LED_LAN1, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:green:lan2", ++ .gpio = TL_WR1043_V4_GPIO_LED_LAN2, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:green:lan3", ++ .gpio = TL_WR1043_V4_GPIO_LED_LAN3, ++ .active_low = 1, ++ }, ++ { ++ .name = "tp-link:green:lan4", ++ .gpio = TL_WR1043_V4_GPIO_LED_LAN4, ++ .active_low = 1, ++ }, ++}; ++ ++static struct gpio_keys_button tl_wr1043nd_v4_gpio_keys[] __initdata = { ++ { ++ .desc = "Reset button", ++ .type = EV_KEY, ++ .code = KEY_RESTART, ++ .debounce_interval = TL_WR1043_V4_KEYS_DEBOUNCE_INTERVAL, ++ .gpio = TL_WR1043_V4_GPIO_BTN_RESET, ++ .active_low = 1, ++ }, ++ { ++ .desc = "RFKILL button", ++ .type = EV_KEY, ++ .code = KEY_RFKILL, ++ .debounce_interval = TL_WR1043_V4_KEYS_DEBOUNCE_INTERVAL, ++ .gpio = TL_WR1043_V4_GPIO_BTN_RFKILL, ++ .active_low = 1, ++ }, ++}; ++ ++static struct ar8327_pad_cfg tl_wr1043nd_v4_ar8327_pad0_cfg = { ++ .mode = AR8327_PAD_MAC_SGMII, ++ .sgmii_delay_en = true, ++}; ++ ++static struct ar8327_platform_data tl_wr1043nd_v4_ar8327_data = { ++ .pad0_cfg = &tl_wr1043nd_v4_ar8327_pad0_cfg, ++ .port0_cfg = { ++ .force_link = 1, ++ .speed = AR8327_PORT_SPEED_1000, ++ .duplex = 1, ++ .txpause = 1, ++ .rxpause = 1, ++ }, ++}; ++ ++static struct mdio_board_info tl_wr1043nd_v4_mdio0_info[] = { ++ { ++ .bus_id = "ag71xx-mdio.0", ++ .phy_addr = 0, ++ .platform_data = &tl_wr1043nd_v4_ar8327_data, ++ }, ++}; ++ ++static void __init tl_wr1043nd_v4_setup(void) ++{ ++ u8 *mac = (u8 *) KSEG1ADDR(TL_WR1043_V4_MAC_LOCATION); ++ u8 *eeprom = (u8 *) KSEG1ADDR(TL_WR1043_V4_EEPROM_ADDR); ++ ++ ath79_register_m25p80(NULL); ++ ++ ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0); ++ ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_SGMII; ++ ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev; ++ ath79_eth0_data.phy_mask = BIT(0); ++ ++ mdiobus_register_board_info(tl_wr1043nd_v4_mdio0_info, ++ ARRAY_SIZE(tl_wr1043nd_v4_mdio0_info)); ++ ++ ath79_register_usb(); ++ ath79_register_mdio(0, 0); ++ ath79_register_eth(0); ++ ++ ath79_register_wmac(eeprom + TL_WR1043_V4_WMAC_CALDATA_OFFSET, mac); ++ ++ ath79_register_leds_gpio(-1, ARRAY_SIZE(tl_wr1043nd_v4_leds_gpio), ++ tl_wr1043nd_v4_leds_gpio); ++ ++ ath79_register_gpio_keys_polled(-1, TL_WR1043_V4_KEYS_POLL_INTERVAL, ++ ARRAY_SIZE(tl_wr1043nd_v4_gpio_keys), ++ tl_wr1043nd_v4_gpio_keys); ++ ++ gpio_request_one(TL_WR1043_V4_GPIO_USB_POWER, ++ GPIOF_OUT_INIT_HIGH | GPIOF_EXPORT_DIR_FIXED, ++ "USB power"); ++} ++ ++MIPS_MACHINE(ATH79_MACH_TL_WR1043ND_V4, "TL-WR1043ND-v4", ++ "TP-LINK TL-WR1043ND v4", tl_wr1043nd_v4_setup); +diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile +index 638e97f088b5420cf4f2a3c706875677815240e1..61e221255f6742f9594da168b11af7716d6a720e 100644 +--- a/target/linux/ar71xx/image/Makefile ++++ b/target/linux/ar71xx/image/Makefile +@@ -73,6 +73,18 @@ define Build/mktplinkfw-combined + @mv $@.new $@ + endef + ++define Build/tplink-safeloader ++ -$(STAGING_DIR_HOST)/bin/tplink-safeloader \ ++ -B $(TPLINK_BOARD_NAME) \ ++ -V $(REVISION) \ ++ -k $(word 1,$^) \ ++ -r $@ \ ++ -o $@.new \ ++ -j \ ++ $(wordlist 2,$(words $(1)),$(1)) \ ++ $(if $(findstring sysupgrade,$(word 1,$(1))),-S) && mv $@.new $@ || rm -f $@ ++endef ++ + define Build/loader-common + rm -rf $@.src + $(MAKE) -C lzma-loader \ +@@ -103,7 +115,7 @@ define Build/copy-file + cat "$(1)" > "$@" + endef + +-DEVICE_VARS += TPLINK_HWID TPLINK_HWREV TPLINK_FLASHLAYOUT ++DEVICE_VARS += TPLINK_HWID TPLINK_HWREV TPLINK_FLASHLAYOUT TPLINK_BOARD_NAME + + define Device/Default + BOARDNAME := +@@ -677,6 +689,22 @@ define Device/tl-wr1041n-v2 + endef + TARGET_DEVICES += tl-wr1041n-v2 + ++define Device/tl-wr1043nd-v4 ++ $(Device/tplink) ++ BOARDNAME := TL-WR1043ND-v4 ++ DEVICE_PROFILE := TLWR1043 ++ TPLINK_HWID := 0x10430004 ++ TPLINK_FLASHLAYOUT := 16Msafeloader ++ MTDPARTS := spi0.0:128k(u-boot)ro,1536k(kernel),14016k(rootfs),128k(product-info)ro,320k(config)ro,64k(partition-table)ro,128k(logs)ro,64k(ART)ro,15552k@0x20000(firmware) ++ IMAGE_SIZE := 15552k ++ TPLINK_BOARD_NAME := TLWR1043NDV4 ++ KERNEL := kernel-bin | patch-cmdline | lzma | mktplinkfw-combined ++ IMAGES := sysupgrade.bin factory.bin ++ IMAGE/sysupgrade.bin := append-rootfs | tplink-safeloader sysupgrade ++ IMAGE/factory.bin := append-rootfs | tplink-safeloader factory ++endef ++TARGET_DEVICES += tl-wr1043nd-v4 ++ + define Device/tl-wdr4900-v2 + $(Device/tplink-8mlzma) + BOARDNAME := TL-WDR4900-v2 +diff --git a/target/linux/ar71xx/mikrotik/config-default b/target/linux/ar71xx/mikrotik/config-default +index 75155b22489a60748b3b1357a1d9c549092255ba..06850dfd5ad9dc004e5e06605c642d0f934aad6f 100644 +--- a/target/linux/ar71xx/mikrotik/config-default ++++ b/target/linux/ar71xx/mikrotik/config-default +@@ -85,6 +85,7 @@ CONFIG_ATH79_MACH_RBSXTLITE=y + # CONFIG_ATH79_MACH_TL_WR1041N_V2 is not set + # CONFIG_ATH79_MACH_TL_WR1043ND is not set + # CONFIG_ATH79_MACH_TL_WR1043ND_V2 is not set ++# CONFIG_ATH79_MACH_TL_WR1043ND_V4 is not set + # CONFIG_ATH79_MACH_TL_WR2543N is not set + # CONFIG_ATH79_MACH_TL_WR703N is not set + # CONFIG_ATH79_MACH_TL_WR720N_V3 is not set +diff --git a/target/linux/ar71xx/nand/config-default b/target/linux/ar71xx/nand/config-default +index 802d6e0502b51a4ecf2259c20e9b6667cd255680..6d69cdcd1cc7f911fbb68dc265ef3fa4c7f5bd78 100644 +--- a/target/linux/ar71xx/nand/config-default ++++ b/target/linux/ar71xx/nand/config-default +@@ -49,6 +49,7 @@ + # CONFIG_ATH79_MACH_TL_WDR4300 is not set + # CONFIG_ATH79_MACH_TL_WR1041N_V2 is not set + # CONFIG_ATH79_MACH_TL_WR1043ND is not set ++# CONFIG_ATH79_MACH_TL_WR1043ND_V4 is not set + # CONFIG_ATH79_MACH_TL_WR2543N is not set + # CONFIG_ATH79_MACH_TL_WR703N is not set + # CONFIG_ATH79_MACH_TL_WR720N_V3 is not set +diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +index b7517464742679b66c3bd916b9b2a2fcc34b65e1..fb69cf3b9ee51e39c32a9e98de913c1a84bed56a 100644 +--- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch ++++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +@@ -1,6 +1,6 @@ + --- a/arch/mips/ath79/machtypes.h + +++ b/arch/mips/ath79/machtypes.h +-@@ -16,22 +16,206 @@ ++@@ -16,22 +16,207 @@ + + enum ath79_mach_type { + ATH79_MACH_GENERIC = 0, +@@ -138,6 +138,7 @@ + + ATH79_MACH_TL_WR1041N_V2, /* TP-LINK TL-WR1041N v2 */ + + ATH79_MACH_TL_WR1043ND, /* TP-LINK TL-WR1043ND */ + + ATH79_MACH_TL_WR1043ND_V2, /* TP-LINK TL-WR1043ND v2 */ +++ ATH79_MACH_TL_WR1043ND_V4, /* TP-LINK TL-WR1043ND v4 */ + + ATH79_MACH_TL_WR2543N, /* TP-LINK TL-WR2543N/ND */ + + ATH79_MACH_TL_WR703N, /* TP-LINK TL-WR703N */ + + ATH79_MACH_TL_WR710N, /* TP-LINK TL-WR710N */ +@@ -355,7 +356,7 @@ + config ATH79_MACH_PB44 + bool "Atheros PB44 reference board" + select SOC_AR71XX +-@@ -68,6 +178,976 @@ config ATH79_MACH_PB44 ++@@ -68,6 +178,988 @@ config ATH79_MACH_PB44 + Say 'Y' here if you want your kernel to support the + Atheros PB44 reference board. + +@@ -1270,6 +1271,18 @@ + + select ATH79_DEV_USB + + select ATH79_DEV_WMAC + + +++config ATH79_MACH_TL_WR1043ND_V4 +++ bool "TP-LINK TL-WR1043ND v4 support" +++ select SOC_QCA956X +++ select ATH79_DEV_AP9X_PCI if PCI +++ select ATH79_DEV_ETH +++ select ATH79_DEV_GPIO_BUTTONS +++ select ATH79_DEV_LEDS_GPIO +++ select ATH79_DEV_M25P80 +++ select ATH79_DEV_USB +++ select ATH79_DEV_WMAC +++ +++ + +config ATH79_MACH_TL_WR2543N + + bool "TP-LINK TL-WR2543N/ND support" + + select SOC_AR724X +@@ -1332,7 +1345,7 @@ + config ATH79_MACH_UBNT_XM + bool "Ubiquiti Networks XM/UniFi boards" + select SOC_AR724X +-@@ -83,6 +1163,117 @@ config ATH79_MACH_UBNT_XM ++@@ -83,6 +1175,117 @@ config ATH79_MACH_UBNT_XM + Say 'Y' here if you want your kernel to support the + Ubiquiti Networks XM (rev 1.0) board. + +@@ -1450,7 +1463,7 @@ + endmenu + + config SOC_AR71XX +-@@ -124,7 +1315,10 @@ config ATH79_DEV_DSA ++@@ -124,7 +1327,10 @@ config ATH79_DEV_DSA + config ATH79_DEV_ETH + def_bool n + +@@ -1462,7 +1475,7 @@ + def_bool n + + config ATH79_DEV_GPIO_BUTTONS +-@@ -154,6 +1348,11 @@ config ATH79_PCI_ATH9K_FIXUP ++@@ -154,6 +1360,11 @@ config ATH79_PCI_ATH9K_FIXUP + def_bool n + + config ATH79_ROUTERBOOT +@@ -1476,7 +1489,7 @@ + endif + --- a/arch/mips/ath79/Makefile + +++ b/arch/mips/ath79/Makefile +-@@ -38,9 +47,131 @@ obj-$(CONFIG_ATH79_ROUTERBOOT) += route ++@@ -38,9 +38,132 @@ obj-$(CONFIG_ATH79_ROUTERBOOT) += route + # + # Machines + # +@@ -1575,6 +1588,7 @@ + +obj-$(CONFIG_ATH79_MACH_TL_WR1041N_V2) += mach-tl-wr1041n-v2.o + +obj-$(CONFIG_ATH79_MACH_TL_WR1043ND) += mach-tl-wr1043nd.o + +obj-$(CONFIG_ATH79_MACH_TL_WR1043ND_V2) += mach-tl-wr1043nd-v2.o +++obj-$(CONFIG_ATH79_MACH_TL_WR1043ND_V4) += mach-tl-wr1043nd-v4.o + +obj-$(CONFIG_ATH79_MACH_TL_WR2543N) += mach-tl-wr2543n.o + +obj-$(CONFIG_ATH79_MACH_TL_WR703N) += mach-tl-wr703n.o + +obj-$(CONFIG_ATH79_MACH_TL_WR720N_V3) += mach-tl-wr720n-v3.o diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index 85c87dfe..9afad71f 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -113,6 +113,7 @@ $(eval $(call GluonProfile,TLWR1043)) $(eval $(call GluonModel,TLWR1043,tl-wr1043nd-v1,tp-link-tl-wr1043n-nd-v1)) $(eval $(call GluonModel,TLWR1043,tl-wr1043nd-v2,tp-link-tl-wr1043n-nd-v2)) $(eval $(call GluonModel,TLWR1043,tl-wr1043nd-v3,tp-link-tl-wr1043n-nd-v3)) +$(eval $(call GluonModel,TLWR1043,tl-wr1043nd-v4,tp-link-tl-wr1043n-nd-v4)) # TL-WDR3500/3600/4300 v1 $(eval $(call GluonProfile,TLWDR4300)) From 33817311eda3705585608e20b67c850bd1cbb949 Mon Sep 17 00:00:00 2001 From: Christof Schulze Date: Fri, 23 Dec 2016 00:32:30 +0100 Subject: [PATCH 097/126] modules: upgrade routing-feed to include babel 1.8 --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 0a9a16de..5688db34 100644 --- a/modules +++ b/modules @@ -12,7 +12,7 @@ PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git PACKAGES_GLUON_COMMIT=5280cd19070ccccc36a39dc48c7f51fe76bc4268 PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git -PACKAGES_ROUTING_COMMIT=899235a4a6370e86ad3674c38c3f95d23c8f3dc8 +PACKAGES_ROUTING_COMMIT=d848d49d2443448b147c564c2dd8f64433b5fb9c PACKAGES_LUCI_REPO=git://github.com/openwrt/luci.git PACKAGES_LUCI_COMMIT=70a4d43cc895b7d728b4fc201f2b6fd9f4b8aaec From aac86d48dfa304f69c55ff6890e4080da82bcaf0 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 23 Dec 2016 00:42:41 +0100 Subject: [PATCH 098/126] modules: update Gluon packages --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 5688db34..db6da19f 100644 --- a/modules +++ b/modules @@ -9,7 +9,7 @@ PACKAGES_OPENWRT_COMMIT=73776792f7d58e982be9e5819450d4875b273159 PACKAGES_OPENWRT_BRANCH=for-15.05 PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git -PACKAGES_GLUON_COMMIT=5280cd19070ccccc36a39dc48c7f51fe76bc4268 +PACKAGES_GLUON_COMMIT=5c25ed888f9f2e05652a994fc0212e34304d58fa PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git PACKAGES_ROUTING_COMMIT=d848d49d2443448b147c564c2dd8f64433b5fb9c From cd4753aaa5abfed9b033318c2534303b90516af4 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 23 Dec 2016 00:44:20 +0100 Subject: [PATCH 099/126] gluon-respondd: add /usr/lib/respondd to provider directories --- package/gluon-respondd/files/etc/init.d/gluon-respondd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/gluon-respondd/files/etc/init.d/gluon-respondd b/package/gluon-respondd/files/etc/init.d/gluon-respondd index bd47ebfa..5ec99101 100755 --- a/package/gluon-respondd/files/etc/init.d/gluon-respondd +++ b/package/gluon-respondd/files/etc/init.d/gluon-respondd @@ -19,7 +19,7 @@ start_service() { done procd_open_instance - procd_set_param command $DAEMON -g ff02::2:1001 -p 1001 -d /lib/gluon/respondd $devs + procd_set_param command $DAEMON -g ff02::2:1001 -p 1001 -d /usr/lib/respondd -d /lib/gluon/respondd $devs procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} procd_set_param stderr 1 procd_close_instance From d09351c97c02f9258afac43b80adda428f5f6b4e Mon Sep 17 00:00:00 2001 From: Christof Schulze Date: Mon, 2 Jan 2017 19:22:05 +0100 Subject: [PATCH 100/126] gluon-luci-portconfig: portconfig.lua: change spaces to tabs (#998) --- .../lua/luci/model/cbi/admin/portconfig.lua | 125 +++++++++--------- 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua b/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua index 2e40577a..c3be0e7a 100644 --- a/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua +++ b/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua @@ -7,7 +7,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 $Id$ ]]-- @@ -75,11 +75,11 @@ o.rmempty = false if dns then - s = f:section(SimpleSection, nil, nil) + s = f:section(SimpleSection, nil, nil) - o = s:option(DynamicList, "dns", translate("Static DNS servers")) - o:write(nil, uci:get("gluon-wan-dnsmasq", dns, "server")) - o.datatype = "ipaddr" + o = s:option(DynamicList, "dns", translate("Static DNS servers")) + o:write(nil, uci:get("gluon-wan-dnsmasq", dns, "server")) + o.datatype = "ipaddr" end s = f:section(SimpleSection, nil, nil) @@ -89,80 +89,79 @@ o.default = uci:get_bool("network", "mesh_wan", "auto") and o.enabled or o.disab o.rmempty = false if sysconfig.lan_ifname then - o = s:option(Flag, "mesh_lan", translate("Enable meshing on the LAN interface")) - o.default = uci:get_bool("network", "mesh_lan", "auto") and o.enabled or o.disabled - o.rmempty = false + o = s:option(Flag, "mesh_lan", translate("Enable meshing on the LAN interface")) + o.default = uci:get_bool("network", "mesh_lan", "auto") and o.enabled or o.disabled + o.rmempty = false end if uci:get('system', 'gpio_switch_poe_passthrough') then - s = f:section(SimpleSection, nil, nil) - o = s:option(Flag, "poe_passthrough", translate("Enable PoE passthrough")) - o.default = uci:get_bool("system", "gpio_switch_poe_passthrough", "value") and o.enabled or o.disabled - o.rmempty = false + s = f:section(SimpleSection, nil, nil) + o = s:option(Flag, "poe_passthrough", translate("Enable PoE passthrough")) + o.default = uci:get_bool("system", "gpio_switch_poe_passthrough", "value") and o.enabled or o.disabled + o.rmempty = false end - function f.handle(self, state, data) - if state == FORM_VALID then - uci:set("network", "wan", "proto", data.ipv4) - if data.ipv4 == "static" then - uci:set("network", "wan", "ipaddr", data.ipv4_addr:trim()) - uci:set("network", "wan", "netmask", data.ipv4_netmask:trim()) - uci:set("network", "wan", "gateway", data.ipv4_gateway:trim()) - else - uci:delete("network", "wan", "ipaddr") - uci:delete("network", "wan", "netmask") - uci:delete("network", "wan", "gateway") - end + if state == FORM_VALID then + uci:set("network", "wan", "proto", data.ipv4) + if data.ipv4 == "static" then + uci:set("network", "wan", "ipaddr", data.ipv4_addr:trim()) + uci:set("network", "wan", "netmask", data.ipv4_netmask:trim()) + uci:set("network", "wan", "gateway", data.ipv4_gateway:trim()) + else + uci:delete("network", "wan", "ipaddr") + uci:delete("network", "wan", "netmask") + uci:delete("network", "wan", "gateway") + end - uci:set("network", "wan6", "proto", data.ipv6) - if data.ipv6 == "static" then - uci:set("network", "wan6", "ip6addr", data.ipv6_addr:trim()) - uci:set("network", "wan6", "ip6gw", data.ipv6_gateway:trim()) - else - uci:delete("network", "wan6", "ip6addr") - uci:delete("network", "wan6", "ip6gw") - end + uci:set("network", "wan6", "proto", data.ipv6) + if data.ipv6 == "static" then + uci:set("network", "wan6", "ip6addr", data.ipv6_addr:trim()) + uci:set("network", "wan6", "ip6gw", data.ipv6_gateway:trim()) + else + uci:delete("network", "wan6", "ip6addr") + uci:delete("network", "wan6", "ip6gw") + end - uci:set("network", "mesh_wan", "auto", data.mesh_wan) + uci:set("network", "mesh_wan", "auto", data.mesh_wan) - if sysconfig.lan_ifname then - uci:set("network", "mesh_lan", "auto", data.mesh_lan) + if sysconfig.lan_ifname then + uci:set("network", "mesh_lan", "auto", data.mesh_lan) - local doit - if data.mesh_lan == '1' then - doit = uci.remove_from_set - else - doit = uci.add_to_set - end + local doit + if data.mesh_lan == '1' then + doit = uci.remove_from_set + else + doit = uci.add_to_set + end - for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do - doit(uci, "network", "client", "ifname", lanif) - end - end + for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do + doit(uci, "network", "client", "ifname", lanif) + end + end - uci:save("network") - uci:commit("network") + uci:save("network") + uci:commit("network") - if uci:get('system', 'gpio_switch_poe_passthrough') then - uci:set('system', 'gpio_switch_poe_passthrough', 'value', data.poe_passthrough) - uci:save('system') - uci:commit('system') - end + if uci:get('system', 'gpio_switch_poe_passthrough') then + uci:set('system', 'gpio_switch_poe_passthrough', 'value', data.poe_passthrough) + uci:save('system') + uci:commit('system') + end - if dns then - if #data.dns > 0 then - uci:set("gluon-wan-dnsmasq", dns, "server", data.dns) - else - uci:delete("gluon-wan-dnsmasq", dns, "server") - end + if dns then + if #data.dns > 0 then + uci:set("gluon-wan-dnsmasq", dns, "server", data.dns) + else + uci:delete("gluon-wan-dnsmasq", dns, "server") + end - uci:save("gluon-wan-dnsmasq") - uci:commit("gluon-wan-dnsmasq") - end - end + uci:save("gluon-wan-dnsmasq") + uci:commit("gluon-wan-dnsmasq") + end + end - return true + return true end return f From 99471f8d5ddfa903b226c843e8b58154990e8769 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Fri, 6 Jan 2017 12:02:32 +0100 Subject: [PATCH 101/126] ar71xx-generic: add support for TP-Link WBS210/510 (untested) Closes #844 --- .../luasrc/lib/gluon/upgrade/020-interfaces | 2 +- .../luasrc/lib/gluon/upgrade/320-setup-ifname | 2 +- ...d-support-for-TP-Link-WBS210-510-1.2.patch | 81 ++++++ ...x-add-support-for-TP-Link-WBS210-510.patch | 235 ++++++++++++++++++ targets/ar71xx-generic/profiles.mk | 5 + 5 files changed, 323 insertions(+), 2 deletions(-) create mode 100644 patches/openwrt/0092-firmware-utils-tplink-safeloader-add-support-for-TP-Link-WBS210-510-1.2.patch create mode 100644 patches/openwrt/0093-ar71xx-add-support-for-TP-Link-WBS210-510.patch diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces b/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces index 6e728134..7ce1af4d 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/020-interfaces @@ -16,7 +16,7 @@ if not (sysconfig.lan_ifname or sysconfig.wan_ifname) then local lan_ifname = uci:get('network', 'lan', 'ifname') local wan_ifname = uci:get('network', 'wan', 'ifname') - if platform.match('ar71xx', 'generic', {'cpe210', 'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) then + if platform.match('ar71xx', 'generic', {'cpe210', 'cpe510', 'wbs210', 'wbs510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) then lan_ifname, wan_ifname = wan_ifname, lan_ifname end diff --git a/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname b/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname index a2cf47af..822aaedc 100755 --- a/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname +++ b/package/gluon-setup-mode/luasrc/lib/gluon/upgrade/320-setup-ifname @@ -9,7 +9,7 @@ if sysconfig.setup_ifname then end if - platform.match('ar71xx', 'generic', {'cpe210', 'cpe510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) or + platform.match('ar71xx', 'generic', {'cpe210', 'cpe510', 'wbs210', 'wbs510', 'nanostation-m', 'nanostation-m-xw', 'unifi-outdoor-plus', 'uap-pro', 'unifiac-pro'}) or platform.match('ar71xx', 'mikrotik') then sysconfig.setup_ifname = sysconfig.config_ifname or sysconfig.wan_ifname or sysconfig.lan_ifname diff --git a/patches/openwrt/0092-firmware-utils-tplink-safeloader-add-support-for-TP-Link-WBS210-510-1.2.patch b/patches/openwrt/0092-firmware-utils-tplink-safeloader-add-support-for-TP-Link-WBS210-510-1.2.patch new file mode 100644 index 00000000..5c4506bf --- /dev/null +++ b/patches/openwrt/0092-firmware-utils-tplink-safeloader-add-support-for-TP-Link-WBS210-510-1.2.patch @@ -0,0 +1,81 @@ +From: Matthias Schiffer +Date: Thu, 5 Jan 2017 16:01:17 +0100 +Subject: firmware-utils: tplink-safeloader: add support for TP-Link WBS210/510 1.2 + +Signed-off-by: Matthias Schiffer + +Backport of LEDE 2ee3e8dd42272f4109830cd26a7fd6f1231ddae8 + +diff --git a/tools/firmware-utils/src/tplink-safeloader.c b/tools/firmware-utils/src/tplink-safeloader.c +index 016c118787f3b5332b76f65c85930065a569d6b8..240e5079d1afb2c892bfb0fc65817ffc8b208bf4 100644 +--- a/tools/firmware-utils/src/tplink-safeloader.c ++++ b/tools/firmware-utils/src/tplink-safeloader.c +@@ -189,6 +189,68 @@ static struct device_info boards[] = { + .last_sysupgrade_partition = "file-system", + }, + ++ { ++ .id = "WBS210", ++ .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n", ++ .support_list = ++ "SupportList:\r\n" ++ "WBS210(TP-LINK|UN|N300-2):1.20\r\n" ++ "WBS210(TP-LINK|US|N300-2):1.20\r\n" ++ "WBS210(TP-LINK|EU|N300-2):1.20\r\n", ++ .support_trail = '\xff', ++ ++ .partitions = { ++ {"fs-uboot", 0x00000, 0x20000}, ++ {"partition-table", 0x20000, 0x02000}, ++ {"default-mac", 0x30000, 0x00020}, ++ {"product-info", 0x31100, 0x00100}, ++ {"signature", 0x32000, 0x00400}, ++ {"os-image", 0x40000, 0x170000}, ++ {"soft-version", 0x1b0000, 0x00100}, ++ {"support-list", 0x1b1000, 0x00400}, ++ {"file-system", 0x1c0000, 0x600000}, ++ {"user-config", 0x7c0000, 0x10000}, ++ {"default-config", 0x7d0000, 0x10000}, ++ {"log", 0x7e0000, 0x10000}, ++ {"radio", 0x7f0000, 0x10000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "file-system", ++ }, ++ ++ { ++ .id = "WBS510", ++ .vendor = "CPE510(TP-LINK|UN|N300-5):1.0\r\n", ++ .support_list = ++ "SupportList:\r\n" ++ "WBS510(TP-LINK|UN|N300-5):1.20\r\n" ++ "WBS510(TP-LINK|US|N300-5):1.20\r\n" ++ "WBS510(TP-LINK|EU|N300-5):1.20\r\n", ++ .support_trail = '\xff', ++ ++ .partitions = { ++ {"fs-uboot", 0x00000, 0x20000}, ++ {"partition-table", 0x20000, 0x02000}, ++ {"default-mac", 0x30000, 0x00020}, ++ {"product-info", 0x31100, 0x00100}, ++ {"signature", 0x32000, 0x00400}, ++ {"os-image", 0x40000, 0x170000}, ++ {"soft-version", 0x1b0000, 0x00100}, ++ {"support-list", 0x1b1000, 0x00400}, ++ {"file-system", 0x1c0000, 0x600000}, ++ {"user-config", 0x7c0000, 0x10000}, ++ {"default-config", 0x7d0000, 0x10000}, ++ {"log", 0x7e0000, 0x10000}, ++ {"radio", 0x7f0000, 0x10000}, ++ {NULL, 0, 0} ++ }, ++ ++ .first_sysupgrade_partition = "os-image", ++ .last_sysupgrade_partition = "file-system", ++ }, ++ + /** Firmware layout for the C2600 */ + { + .id = "C2600", diff --git a/patches/openwrt/0093-ar71xx-add-support-for-TP-Link-WBS210-510.patch b/patches/openwrt/0093-ar71xx-add-support-for-TP-Link-WBS210-510.patch new file mode 100644 index 00000000..77e5b3db --- /dev/null +++ b/patches/openwrt/0093-ar71xx-add-support-for-TP-Link-WBS210-510.patch @@ -0,0 +1,235 @@ +From: Matthias Schiffer +Date: Thu, 5 Jan 2017 16:01:17 +0100 +Subject: ar71xx: add support for TP-Link WBS210/510 + +The devices are mostly identical to the CPE210/510, but use external +antennas. + +Signed-off-by: Matthias Schiffer + +Backport of LEDE 1fef80f29cf6bdfcb6cdbd913b9147797b8bc218 + +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches +index 0f7a41589384755ff596d4355ad9fbf1e1087d91..3b86067635e337a0c00a55d035d55382405ef1e7 100644 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_gpio-switches +@@ -16,7 +16,9 @@ nanostation-m-xw) + ucidef_set_gpio_switch "poe_passthrough" "PoE Passthrough" "2" + ;; + cpe210|\ +-cpe510) ++cpe510|\ ++wbs210|\ ++wbs510) + ucidef_set_gpio_switch "poe_passthrough" "PoE Passthrough" "20" + ;; + esac +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +index fa38568fbc84aad4c85636c3894097c65e30eb9a..d57d8ad5fd3edd8774d30245b3265317778cb140 100644 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/01_leds +@@ -79,7 +79,9 @@ carambola2) + ;; + + cpe210|\ +-cpe510) ++cpe510|\ ++wbs210|\ ++wbs510) + ucidef_set_led_switch "lan0" "LAN0" "tp-link:green:lan0" "switch0" "0x20" + ucidef_set_led_switch "lan1" "LAN1" "tp-link:green:lan1" "switch0" "0x10" + ucidef_set_rssimon "wlan0" "200000" "1" +diff --git a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +index 4389bc894f8dd08a9231b35bbb4fba0e9e57560b..f8c43ac0d6f2882444ed277df2f0b2c23721dade 100755 +--- a/target/linux/ar71xx/base-files/etc/uci-defaults/02_network ++++ b/target/linux/ar71xx/base-files/etc/uci-defaults/02_network +@@ -73,7 +73,9 @@ bsb) + ;; + + cpe210|\ +-cpe510) ++cpe510|\ ++wbs210|\ ++wbs510) + ucidef_set_interfaces_lan_wan "eth0.1" "eth0.2" + ucidef_add_switch "switch0" "1" "1" + ucidef_add_switch_vlan "switch0" "1" "0t 5" +diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh +index 5922527da4980fa3b51fdcec2bca96f5962d0f0b..33fdc751034d8cbdec344211f4e2b10afa0e9849 100755 +--- a/target/linux/ar71xx/base-files/lib/ar71xx.sh ++++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh +@@ -444,6 +444,14 @@ ar71xx_board_detect() { + name="cpe510" + tplink_pharos_board_detect + ;; ++ *WBS210) ++ name="wbs210" ++ tplink_pharos_board_detect ++ ;; ++ *WBS510) ++ name="wbs510" ++ tplink_pharos_board_detect ++ ;; + *"DB120 reference board") + name="db120" + ;; +diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +index e61ebf7c2221fd56bb902f14d96cb25d174718ee..a4e37e24cc57da5e90a86a1a5a99c6dfc829e65f 100755 +--- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh ++++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh +@@ -266,7 +266,9 @@ platform_check_image() { + ;; + + cpe210|\ +- cpe510) ++ cpe510|\ ++ wbs210|\ ++ wbs510) + tplink_pharos_check_image "$1" && return 0 + return 1 + ;; +diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c +index 74daf434e611d1f9d05f7d7516ae918d334b32b7..d2dbed1fe286c44d3188262e984253faaee7edba 100644 +--- a/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c ++++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-cpe510.c +@@ -30,6 +30,9 @@ + #define CPE510_GPIO_LED_L3 15 + #define CPE510_GPIO_LED_L4 16 + ++/* All LEDs/button except for link4 are the same for CPE and WBS series */ ++#define WBS510_GPIO_LED_L4 2 ++ + #define CPE510_GPIO_EXTERNAL_LNA0 18 + #define CPE510_GPIO_EXTERNAL_LNA1 19 + +@@ -67,6 +70,34 @@ static struct gpio_led cpe510_leds_gpio[] __initdata = { + }, + }; + ++static struct gpio_led wbs510_leds_gpio[] __initdata = { ++ { ++ .name = "tp-link:green:lan0", ++ .gpio = CPE510_GPIO_LED_LAN0, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:lan1", ++ .gpio = CPE510_GPIO_LED_LAN1, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:link1", ++ .gpio = CPE510_GPIO_LED_L1, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:link2", ++ .gpio = CPE510_GPIO_LED_L2, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:link3", ++ .gpio = CPE510_GPIO_LED_L3, ++ .active_low = 1, ++ }, { ++ .name = "tp-link:green:link4", ++ .gpio = WBS510_GPIO_LED_L4, ++ .active_low = 1, ++ }, ++}; ++ + static struct gpio_keys_button cpe510_gpio_keys[] __initdata = { + { + .desc = "Reset button", +@@ -85,9 +116,6 @@ static void __init cpe_setup(u8 *mac) + ath79_gpio_function_setup(AR934X_GPIO_FUNC_JTAG_DISABLE, + AR934X_GPIO_FUNC_CLK_OBS4_EN); + +- ath79_register_leds_gpio(-1, ARRAY_SIZE(cpe510_leds_gpio), +- cpe510_leds_gpio); +- + ath79_register_gpio_keys_polled(1, CPE510_KEYS_POLL_INTERVAL, + ARRAY_SIZE(cpe510_gpio_keys), + cpe510_gpio_keys); +@@ -109,6 +137,9 @@ static void __init cpe210_setup(void) + u8 *mac = (u8 *) KSEG1ADDR(0x1f830008); + u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); + ++ ath79_register_leds_gpio(-1, ARRAY_SIZE(cpe510_leds_gpio), ++ cpe510_leds_gpio); ++ + cpe_setup(mac); + + ath79_register_wmac(ee, mac); +@@ -119,6 +150,22 @@ static void __init cpe510_setup(void) + u8 *mac = (u8 *) KSEG1ADDR(0x1f830008); + u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); + ++ ath79_register_leds_gpio(-1, ARRAY_SIZE(cpe510_leds_gpio), ++ cpe510_leds_gpio); ++ ++ cpe_setup(mac); ++ ++ ath79_register_wmac(ee, mac); ++} ++ ++static void __init wbs_setup(void) ++{ ++ u8 *mac = (u8 *) KSEG1ADDR(0x1f830008); ++ u8 *ee = (u8 *) KSEG1ADDR(0x1fff1000); ++ ++ ath79_register_leds_gpio(-1, ARRAY_SIZE(wbs510_leds_gpio), ++ wbs510_leds_gpio); ++ + cpe_setup(mac); + + ath79_register_wmac(ee, mac); +@@ -129,3 +176,9 @@ MIPS_MACHINE(ATH79_MACH_CPE210, "CPE210", "TP-LINK CPE210/220", + + MIPS_MACHINE(ATH79_MACH_CPE510, "CPE510", "TP-LINK CPE510/520", + cpe510_setup); ++ ++MIPS_MACHINE(ATH79_MACH_WBS210, "WBS210", "TP-LINK WBS210", ++ wbs_setup); ++ ++MIPS_MACHINE(ATH79_MACH_WBS510, "WBS510", "TP-LINK WBS510", ++ wbs_setup); +diff --git a/target/linux/ar71xx/image/Makefile b/target/linux/ar71xx/image/Makefile +index 61e221255f6742f9594da168b11af7716d6a720e..459373b9cb96097d155b3d8f4e5fb76701d46d1c 100644 +--- a/target/linux/ar71xx/image/Makefile ++++ b/target/linux/ar71xx/image/Makefile +@@ -2166,6 +2166,8 @@ $(eval $(call SingleProfile,TPLINK-LZMA,64kraw,TLWR2543,tl-wr2543-v1,TL-WR2543N, + + $(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE210_220,cpe210-220,CPE210,ttyS0,115200,$$(cpe510_mtdlayout),CPE210)) + $(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,CPE510_520,cpe510-520,CPE510,ttyS0,115200,$$(cpe510_mtdlayout),CPE510)) ++$(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,WBS210,wbs210,WBS210,ttyS0,115200,$$(cpe510_mtdlayout),WBS210)) ++$(eval $(call SingleProfile,TPLINK-SAFELOADER,64kraw,WBS510,wbs510,WBS510,ttyS0,115200,$$(cpe510_mtdlayout),WBS510)) + + $(eval $(call SingleProfile,UAPPRO,64k,UAPPRO,ubnt-uap-pro,UAP-PRO,ttyS0,115200,BZ,BZ,ar934x)) + $(eval $(call SingleProfile,UAPPRO,64k,UBNTUNIFIOUTDOORPLUS,ubnt-unifi-outdoor-plus,UBNT-UOP,ttyS0,115200,BZ,BZ,ar7240)) +@@ -2229,7 +2231,7 @@ $(eval $(call MultiProfile,TLWR842,TLWR842V1)) + $(eval $(call MultiProfile,TLWR941,TLWR941NV2 TLWR941NV3 TLWR941NV4)) + $(eval $(call MultiProfile,TLWR1043,TLWR1043V1 TLWR1043V2 TLWR1043V3)) + $(eval $(call MultiProfile,TLWDR4300,TLWDR3500V1 TLWDR3600V1 TLWDR4300V1 TLWDR4300V1IL TLWDR4310V1 MW4530RV1)) +-$(eval $(call MultiProfile,CPE510,CPE210_220 CPE510_520)) ++$(eval $(call MultiProfile,CPE510,CPE210_220 CPE510_520 WBS210 WBS510)) + $(eval $(call MultiProfile,TUBE2H,TUBE2H8M TUBE2H16M)) + $(eval $(call MultiProfile,UBNT,UBNTAIRROUTER UBNTRS UBNTRSPRO UBNTLSSR71 UBNTBULLETM UBNTROCKETM UBNTROCKETMXW UBNTNANOM UBNTNANOMXW UBNTLOCOXW UBNTUNIFI UBNTUNIFIOUTDOOR UBNTUNIFIOUTDOORPLUS UAPPRO UBNTAIRGW)) + $(eval $(call MultiProfile,WNR612V2,REALWNR612V2 N150R)) +diff --git a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +index fb69cf3b9ee51e39c32a9e98de913c1a84bed56a..93ae596bfd9f439daf9295e3d58858c3067160b9 100644 +--- a/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch ++++ b/target/linux/ar71xx/patches-3.18/610-MIPS-ath79-openwrt-machines.patch +@@ -1,6 +1,6 @@ + --- a/arch/mips/ath79/machtypes.h + +++ b/arch/mips/ath79/machtypes.h +-@@ -16,22 +16,207 @@ ++@@ -16,22 +16,209 @@ + + enum ath79_mach_type { + ATH79_MACH_GENERIC = 0, +@@ -175,6 +175,8 @@ + ATH79_MACH_UBNT_UNIFI_OUTDOOR, /* Ubiquiti UnifiAP Outdoor */ + + ATH79_MACH_UBNT_UNIFI_OUTDOOR_PLUS, /* Ubiquiti UnifiAP Outdoor+ */ + ATH79_MACH_UBNT_XM, /* Ubiquiti Networks XM board rev 1.0 */ +++ ATH79_MACH_WBS210, /* TP-LINK WBS210 */ +++ ATH79_MACH_WBS510, /* TP-LINK WBS510 */ + + ATH79_MACH_WEIO, /* WeIO board */ + + ATH79_MACH_WHR_G301N, /* Buffalo WHR-G301N */ + + ATH79_MACH_WHR_HP_G300N, /* Buffalo WHR-HP-G300N */ diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index 9afad71f..86b1a558 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -24,6 +24,11 @@ $(eval $(call GluonModelAlias,CPE510,tp-link-cpe510-v1.0,tp-link-cpe510-v1.1)) $(eval $(call GluonModelAlias,CPE510,tp-link-cpe510-v1.0,tp-link-cpe520-v1.0)) $(eval $(call GluonModelAlias,CPE510,tp-link-cpe510-v1.0,tp-link-cpe520-v1.1)) +ifneq ($(BROKEN),) +$(eval $(call GluonModel,CPE510,wbs210,tp-link-wbs210-v1.20)) # BROKEN: untested +$(eval $(call GluonModel,CPE510,wbs510,tp-link-wbs510-v1.20)) # BROKEN: untested +endif + # TL-WA701N/ND v1, v2 $(eval $(call GluonProfile,TLWA701)) $(eval $(call GluonModel,TLWA701,tl-wa701n-v1,tp-link-tl-wa701n-nd-v1)) From d3bc378536445fbb74cc0ebef29bfa6559ad6239 Mon Sep 17 00:00:00 2001 From: kb-light Date: Mon, 9 Jan 2017 22:25:16 +0100 Subject: [PATCH 102/126] ar71xx-generic: TP-Link WBS210/510: remove BROKEN (#1002) --- docs/index.rst | 2 ++ targets/ar71xx-generic/profiles.mk | 8 +++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index e9517511..2f24459c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -192,6 +192,8 @@ ar71xx-generic - TL-WR941ND (v2, v3, v4, v5, v6) - TL-WR1043N/ND (v1, v2, v3, v4) - TL-WR2543N/ND (v1) + - WBS210 (v1.20) + - WBS510 (v1.20) * Ubiquiti diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index 86b1a558..6da40e12 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -11,7 +11,7 @@ endif ## TP-Link -# CPE210/220/510/520 +# CPE210/220/510/520; WBS210/510 $(eval $(call GluonProfile,CPE510,rssileds)) $(eval $(call GluonModel,CPE510,cpe210-220,tp-link-cpe210-v1.0)) @@ -24,10 +24,8 @@ $(eval $(call GluonModelAlias,CPE510,tp-link-cpe510-v1.0,tp-link-cpe510-v1.1)) $(eval $(call GluonModelAlias,CPE510,tp-link-cpe510-v1.0,tp-link-cpe520-v1.0)) $(eval $(call GluonModelAlias,CPE510,tp-link-cpe510-v1.0,tp-link-cpe520-v1.1)) -ifneq ($(BROKEN),) -$(eval $(call GluonModel,CPE510,wbs210,tp-link-wbs210-v1.20)) # BROKEN: untested -$(eval $(call GluonModel,CPE510,wbs510,tp-link-wbs510-v1.20)) # BROKEN: untested -endif +$(eval $(call GluonModel,CPE510,wbs210,tp-link-wbs210-v1.20)) +$(eval $(call GluonModel,CPE510,wbs510,tp-link-wbs510-v1.20)) # TL-WA701N/ND v1, v2 $(eval $(call GluonProfile,TLWA701)) From 471852814df23f47fcffe4b8a5c98fdc0f343628 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Mon, 9 Jan 2017 22:28:21 +0100 Subject: [PATCH 103/126] mac80211: Allow switching of the ath10k regulatory domain (#1001) ath10k has to switch the regulatory domain when switching the default country when ATH_USER_REGD is enabled. This is for example important when switching from country US (FCC) to DE (ETSI). The ath implementation will use ath_reg_dyn_country_user_allow to check if this is allowed. Unfortunately, this function always seems to return false to ath_reg_notifier_apply even when ATH_USER_REGD is enabled. But it must actually always accept the requests from the user (when ATH_USER_REGD is enabled) to correctly set the conformance test limits in the ath10k binary blob. Not doing it will sometimes allow too high transmit powers on edge channels for correctly calibrated devices outside their default regulatory domain. Signed-off-by: Sven Eckelmann --- ...itching-of-the-ath-regulatory-domain.patch | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 patches/openwrt/0094-mac80211-Allow-switching-of-the-ath-regulatory-domain.patch diff --git a/patches/openwrt/0094-mac80211-Allow-switching-of-the-ath-regulatory-domain.patch b/patches/openwrt/0094-mac80211-Allow-switching-of-the-ath-regulatory-domain.patch new file mode 100644 index 00000000..0ded4049 --- /dev/null +++ b/patches/openwrt/0094-mac80211-Allow-switching-of-the-ath-regulatory-domain.patch @@ -0,0 +1,70 @@ +From: Sven Eckelmann +Date: Fri, 6 Jan 2017 13:29:56 +0100 +Subject: mac80211: Allow switching of the ath regulatory domain + +ath10k has to switch the regulatory domain when switching the default +country when ATH_USER_REGD is enabled. This is for example important when +switching from country US (FCC) to DE (ETSI). The ath implementation will +use ath_reg_dyn_country_user_allow to check if this is allowed. + +Unfortunately, this function always seems to return false to +ath_reg_notifier_apply even when ATH_USER_REGD is enabled. But it must +actually always accept the requests from the user (when ATH_USER_REGD is +enabled) to correctly set the conformance test limits in the ath10k binary +blob. + +Not doing it will sometimes allow too high transmit powers on edge channels +for correctly calibrated devices outside their default regulatory domain. + +Signed-off-by: Sven Eckelmann + +Forwarded: https://github.com/openwrt/openwrt/pull/306 + +diff --git a/package/kernel/mac80211/patches/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/402-ath_regd_optional.patch +index 463428371b4c96ee63b6eba1477023ff739c6129..a3572a297718f883f6126fc33aff5e14a046b9a0 100644 +--- a/package/kernel/mac80211/patches/402-ath_regd_optional.patch ++++ b/package/kernel/mac80211/patches/402-ath_regd_optional.patch +@@ -1,6 +1,15 @@ + --- a/drivers/net/wireless/ath/regd.c + +++ b/drivers/net/wireless/ath/regd.c +-@@ -341,6 +341,10 @@ ath_reg_apply_beaconing_flags(struct wip ++@@ -188,6 +188,8 @@ static bool dynamic_country_user_possibl ++ ++ static bool ath_reg_dyn_country_user_allow(struct ath_regulatory *reg) ++ { +++ if (config_enabled(CPTCFG_ATH_USER_REGD)) +++ return true; ++ if (!config_enabled(CPTCFG_ATH_REG_DYNAMIC_USER_REG_HINTS)) ++ return false; ++ if (!dynamic_country_user_possible(reg)) ++@@ -341,6 +343,10 @@ ath_reg_apply_beaconing_flags(struct wip + struct ieee80211_channel *ch; + unsigned int i; + +@@ -11,7 +20,7 @@ + for (band = 0; band < NUM_NL80211_BANDS; band++) { + if (!wiphy->bands[band]) + continue; +-@@ -374,6 +378,10 @@ ath_reg_apply_ir_flags(struct wiphy *wip ++@@ -374,6 +380,10 @@ ath_reg_apply_ir_flags(struct wiphy *wip + { + struct ieee80211_supported_band *sband; + +@@ -22,7 +31,7 @@ + sband = wiphy->bands[NL80211_BAND_2GHZ]; + if (!sband) + return; +-@@ -402,6 +410,10 @@ static void ath_reg_apply_radar_flags(st ++@@ -402,6 +412,10 @@ static void ath_reg_apply_radar_flags(st + struct ieee80211_channel *ch; + unsigned int i; + +@@ -33,7 +42,7 @@ + if (!wiphy->bands[NL80211_BAND_5GHZ]) + return; + +-@@ -633,6 +645,11 @@ ath_regd_init_wiphy(struct ath_regulator ++@@ -633,6 +647,11 @@ ath_regd_init_wiphy(struct ath_regulator + const struct ieee80211_regdomain *regd; + + wiphy->reg_notifier = reg_notifier; From 850499fdb33de072014c4b7cd6257d989387a29b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 9 Jan 2017 23:06:09 +0100 Subject: [PATCH 104/126] ar71xx-generic: mark Meraki devices as BROKEN again These devices don't have unique MAC addresses with OpenWrt/LEDE at the moment (see #993). --- docs/index.rst | 5 ----- targets/ar71xx-generic/profiles.mk | 3 +++ 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 2f24459c..c5226c27 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -112,11 +112,6 @@ ar71xx-generic - WZR-HP-G300NH2 - WZR-HP-G450H -* Cisco Meraki - - - MR12 / MR62 - - MR16 / MR66 - * D-Link - DIR-505 (A1, A2) diff --git a/targets/ar71xx-generic/profiles.mk b/targets/ar71xx-generic/profiles.mk index 6da40e12..c76c8a8b 100644 --- a/targets/ar71xx-generic/profiles.mk +++ b/targets/ar71xx-generic/profiles.mk @@ -408,6 +408,8 @@ $(eval $(call GluonModel,ALFANX,alfa-nx,alfa-network-n2-n5)) ## Meraki +# BROKEN: MAC address uniqueness issues +ifneq ($(BROKEN),) # Meraki MR12/MR62 $(eval $(call GluonProfile,MR12,rssileds)) $(eval $(call GluonProfileFactorySuffix,MR12)) @@ -419,6 +421,7 @@ $(eval $(call GluonProfile,MR16,rssileds)) $(eval $(call GluonProfileFactorySuffix,MR16)) $(eval $(call GluonModel,MR16,mr16,meraki-mr16)) $(eval $(call GluonModelAlias,MR16,meraki-mr16,meraki-mr66)) +endif ## 8devices From 2dd8a700ca9cc288dc4ea8abb261b8e210c446f6 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sun, 9 Oct 2016 00:18:45 +0200 Subject: [PATCH 105/126] package: avoid use of GLUONDIR variable --- package/gluon-alfred/Makefile | 2 +- package/gluon-authorized-keys/Makefile | 2 +- package/gluon-autoupdater/Makefile | 2 +- package/gluon-client-bridge/Makefile | 2 +- package/gluon-config-mode-autoupdater/Makefile | 2 +- package/gluon-config-mode-contact-info/Makefile | 2 +- package/gluon-config-mode-core/Makefile | 2 +- package/gluon-config-mode-geo-location/Makefile | 2 +- package/gluon-config-mode-hostname/Makefile | 2 +- package/gluon-config-mode-mesh-vpn/Makefile | 2 +- package/gluon-core/Makefile | 2 +- package/gluon-legacy/Makefile | 2 +- package/gluon-luci-admin/Makefile | 2 +- package/gluon-luci-autoupdater/Makefile | 2 +- package/gluon-luci-mesh-vpn-fastd/Makefile | 2 +- package/gluon-luci-node-role/Makefile | 2 +- package/gluon-luci-portconfig/Makefile | 2 +- package/gluon-luci-private-wifi/Makefile | 2 +- package/gluon-luci-theme/Makefile | 2 +- package/gluon-luci-wifi-config/Makefile | 2 +- package/gluon-mesh-batman-adv-14/Makefile | 2 +- package/gluon-mesh-batman-adv-15/Makefile | 2 +- package/gluon-mesh-batman-adv-core/Makefile | 2 +- package/gluon-mesh-vpn-fastd/Makefile | 2 +- package/gluon-neighbour-info/Makefile | 2 +- package/gluon-node-info/Makefile | 2 +- package/gluon-radvd/Makefile | 2 +- package/gluon-respondd/Makefile | 2 +- package/gluon-setup-mode/Makefile | 2 +- package/gluon-site/Makefile | 4 ++-- package/gluon-status-page-api/Makefile | 2 +- package/gluon-wan-dnsmasq/Makefile | 2 +- include/package.mk => package/gluon.mk | 0 package/libgluonutil/Makefile | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) rename include/package.mk => package/gluon.mk (100%) diff --git a/package/gluon-alfred/Makefile b/package/gluon-alfred/Makefile index 01fbdf43..be0ff0da 100644 --- a/package/gluon-alfred/Makefile +++ b/package/gluon-alfred/Makefile @@ -6,7 +6,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-alfred diff --git a/package/gluon-authorized-keys/Makefile b/package/gluon-authorized-keys/Makefile index 83eaf04f..7d010dc9 100644 --- a/package/gluon-authorized-keys/Makefile +++ b/package/gluon-authorized-keys/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=2 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-authorized-keys diff --git a/package/gluon-autoupdater/Makefile b/package/gluon-autoupdater/Makefile index baae06ba..41cdf796 100644 --- a/package/gluon-autoupdater/Makefile +++ b/package/gluon-autoupdater/Makefile @@ -7,7 +7,7 @@ PKG_RELEASE:=$(GLUON_BRANCH) PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DEPENDS := respondd -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-autoupdater diff --git a/package/gluon-client-bridge/Makefile b/package/gluon-client-bridge/Makefile index cbd62a38..57d5b314 100644 --- a/package/gluon-client-bridge/Makefile +++ b/package/gluon-client-bridge/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-client-bridge diff --git a/package/gluon-config-mode-autoupdater/Makefile b/package/gluon-config-mode-autoupdater/Makefile index ab5d1adc..2fe1ccb2 100644 --- a/package/gluon-config-mode-autoupdater/Makefile +++ b/package/gluon-config-mode-autoupdater/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-config-mode-contact-info/Makefile b/package/gluon-config-mode-contact-info/Makefile index 3ac8a0b3..7a3780a6 100644 --- a/package/gluon-config-mode-contact-info/Makefile +++ b/package/gluon-config-mode-contact-info/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-config-mode-core/Makefile b/package/gluon-config-mode-core/Makefile index 52a4f0e1..d629c265 100644 --- a/package/gluon-config-mode-core/Makefile +++ b/package/gluon-config-mode-core/Makefile @@ -8,7 +8,7 @@ PKG_VERSION:=2 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-config-mode-geo-location/Makefile b/package/gluon-config-mode-geo-location/Makefile index aa16ad06..af523f09 100644 --- a/package/gluon-config-mode-geo-location/Makefile +++ b/package/gluon-config-mode-geo-location/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-config-mode-hostname/Makefile b/package/gluon-config-mode-hostname/Makefile index 6e30466d..2b24a640 100644 --- a/package/gluon-config-mode-hostname/Makefile +++ b/package/gluon-config-mode-hostname/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-config-mode-mesh-vpn/Makefile b/package/gluon-config-mode-mesh-vpn/Makefile index ec819a9c..c52ffed1 100644 --- a/package/gluon-config-mode-mesh-vpn/Makefile +++ b/package/gluon-config-mode-mesh-vpn/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=2 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-core/Makefile b/package/gluon-core/Makefile index 9917a5e0..3e0ae059 100644 --- a/package/gluon-core/Makefile +++ b/package/gluon-core/Makefile @@ -6,7 +6,7 @@ PKG_RELEASE:=$(GLUON_VERSION) PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-core diff --git a/package/gluon-legacy/Makefile b/package/gluon-legacy/Makefile index 1cb2e5f4..64607ea3 100644 --- a/package/gluon-legacy/Makefile +++ b/package/gluon-legacy/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=2 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-legacy diff --git a/package/gluon-luci-admin/Makefile b/package/gluon-luci-admin/Makefile index 7b5f632a..bb6f8350 100644 --- a/package/gluon-luci-admin/Makefile +++ b/package/gluon-luci-admin/Makefile @@ -9,7 +9,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-luci-autoupdater/Makefile b/package/gluon-luci-autoupdater/Makefile index 908a0879..4cecb10a 100644 --- a/package/gluon-luci-autoupdater/Makefile +++ b/package/gluon-luci-autoupdater/Makefile @@ -9,7 +9,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-luci-mesh-vpn-fastd/Makefile b/package/gluon-luci-mesh-vpn-fastd/Makefile index b6b7ce4f..71dadce7 100644 --- a/package/gluon-luci-mesh-vpn-fastd/Makefile +++ b/package/gluon-luci-mesh-vpn-fastd/Makefile @@ -6,7 +6,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-luci-node-role/Makefile b/package/gluon-luci-node-role/Makefile index 2c862610..058e879c 100644 --- a/package/gluon-luci-node-role/Makefile +++ b/package/gluon-luci-node-role/Makefile @@ -6,7 +6,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-luci-portconfig/Makefile b/package/gluon-luci-portconfig/Makefile index d4590864..eaec9db4 100644 --- a/package/gluon-luci-portconfig/Makefile +++ b/package/gluon-luci-portconfig/Makefile @@ -9,7 +9,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-luci-private-wifi/Makefile b/package/gluon-luci-private-wifi/Makefile index 34608900..ef6f2a0a 100644 --- a/package/gluon-luci-private-wifi/Makefile +++ b/package/gluon-luci-private-wifi/Makefile @@ -6,7 +6,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-luci-theme/Makefile b/package/gluon-luci-theme/Makefile index 6e65db3c..2486519a 100644 --- a/package/gluon-luci-theme/Makefile +++ b/package/gluon-luci-theme/Makefile @@ -9,7 +9,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-luci-theme diff --git a/package/gluon-luci-wifi-config/Makefile b/package/gluon-luci-wifi-config/Makefile index 0f0d90f2..881f2f0e 100644 --- a/package/gluon-luci-wifi-config/Makefile +++ b/package/gluon-luci-wifi-config/Makefile @@ -6,7 +6,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) diff --git a/package/gluon-mesh-batman-adv-14/Makefile b/package/gluon-mesh-batman-adv-14/Makefile index aa53e85f..cd3aa2fb 100644 --- a/package/gluon-mesh-batman-adv-14/Makefile +++ b/package/gluon-mesh-batman-adv-14/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-mesh-batman-adv-14 diff --git a/package/gluon-mesh-batman-adv-15/Makefile b/package/gluon-mesh-batman-adv-15/Makefile index d64fea88..7f8d8a80 100644 --- a/package/gluon-mesh-batman-adv-15/Makefile +++ b/package/gluon-mesh-batman-adv-15/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-mesh-batman-adv-15 diff --git a/package/gluon-mesh-batman-adv-core/Makefile b/package/gluon-mesh-batman-adv-core/Makefile index 1989ab78..d476d4f8 100644 --- a/package/gluon-mesh-batman-adv-core/Makefile +++ b/package/gluon-mesh-batman-adv-core/Makefile @@ -6,7 +6,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DEPENDS := respondd -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-mesh-batman-adv-core diff --git a/package/gluon-mesh-vpn-fastd/Makefile b/package/gluon-mesh-vpn-fastd/Makefile index 4d75116e..8fceae1a 100644 --- a/package/gluon-mesh-vpn-fastd/Makefile +++ b/package/gluon-mesh-vpn-fastd/Makefile @@ -6,7 +6,7 @@ PKG_VERSION:=3 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DEPENDS := respondd -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-mesh-vpn-fastd diff --git a/package/gluon-neighbour-info/Makefile b/package/gluon-neighbour-info/Makefile index 498abc4f..867f32f6 100644 --- a/package/gluon-neighbour-info/Makefile +++ b/package/gluon-neighbour-info/Makefile @@ -6,7 +6,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-neighbour-info diff --git a/package/gluon-node-info/Makefile b/package/gluon-node-info/Makefile index 8dd31553..59f60dfd 100644 --- a/package/gluon-node-info/Makefile +++ b/package/gluon-node-info/Makefile @@ -7,7 +7,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DEPENDS := respondd -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-node-info diff --git a/package/gluon-radvd/Makefile b/package/gluon-radvd/Makefile index 0ca18177..ba04c04e 100644 --- a/package/gluon-radvd/Makefile +++ b/package/gluon-radvd/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=3 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-radvd diff --git a/package/gluon-respondd/Makefile b/package/gluon-respondd/Makefile index c6cc71e4..c0b201fa 100644 --- a/package/gluon-respondd/Makefile +++ b/package/gluon-respondd/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-respondd diff --git a/package/gluon-setup-mode/Makefile b/package/gluon-setup-mode/Makefile index ea9722c0..e34f4858 100644 --- a/package/gluon-setup-mode/Makefile +++ b/package/gluon-setup-mode/Makefile @@ -8,7 +8,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-setup-mode diff --git a/package/gluon-site/Makefile b/package/gluon-site/Makefile index a0d120e8..b7138e3c 100644 --- a/package/gluon-site/Makefile +++ b/package/gluon-site/Makefile @@ -9,7 +9,7 @@ PKG_BUILD_DEPENDS := luci-base/host lua-cjson/host PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk PKG_CONFIG_DEPENDS += $(GLUON_I18N_CONFIG) @@ -28,7 +28,7 @@ define Build/Configure endef define Build/Compile - lua -e 'print(require("cjson").encode(assert(dofile("$(GLUONDIR)/scripts/site_config.lua"))))' > $(PKG_BUILD_DIR)/site.json + lua -e 'print(require("cjson").encode(assert(dofile("../../scripts/site_config.lua"))))' > $(PKG_BUILD_DIR)/site.json $(call GluonBuildI18N,gluon-site,$(GLUON_SITEDIR)/i18n) endef diff --git a/package/gluon-status-page-api/Makefile b/package/gluon-status-page-api/Makefile index 703d97f6..1c54dac0 100644 --- a/package/gluon-status-page-api/Makefile +++ b/package/gluon-status-page-api/Makefile @@ -7,7 +7,7 @@ PKG_RELEASE:=1 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DEPENDS := respondd -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-status-page-api diff --git a/package/gluon-wan-dnsmasq/Makefile b/package/gluon-wan-dnsmasq/Makefile index c672902d..c7c63ca9 100644 --- a/package/gluon-wan-dnsmasq/Makefile +++ b/package/gluon-wan-dnsmasq/Makefile @@ -5,7 +5,7 @@ PKG_VERSION:=1 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk define Package/gluon-wan-dnsmasq diff --git a/include/package.mk b/package/gluon.mk similarity index 100% rename from include/package.mk rename to package/gluon.mk diff --git a/package/libgluonutil/Makefile b/package/libgluonutil/Makefile index bebeb2b3..489a9ba9 100644 --- a/package/libgluonutil/Makefile +++ b/package/libgluonutil/Makefile @@ -8,7 +8,7 @@ PKG_LICENSE:=BSD-2-Clause PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) -include $(GLUONDIR)/include/package.mk +include ../gluon.mk include $(INCLUDE_DIR)/cmake.mk From 7736f53dc446aa109a26a0ccbcd7c039c5b8fb3f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 17 Jan 2017 22:04:58 +0100 Subject: [PATCH 106/126] Update LuCI to master branch --- modules | 3 +- .../lua/luci/view/gluon/cbi/config-mode.htm | 1 + .../controller/gluon-config-mode/index.lua | 6 +- .../lib/lua/luci/view/admin/expertmode.htm | 56 -------- .../usr/lib/lua/luci/view/admin/upgrade.htm | 2 +- .../lua/luci/view/admin/upgrade_confirm.htm | 7 +- .../lib/lua/luci/controller/admin/upgrade.lua | 6 + .../lib/lua/luci/model/cbi/admin/remote.lua | 4 +- .../lua/luci/model/cbi/admin/autoupdater.lua | 2 +- .../luci/model/cbi/admin/mesh_vpn_fastd.lua | 1 - .../lib/lua/luci/model/cbi/admin/noderole.lua | 1 - .../lua/luci/model/cbi/admin/portconfig.lua | 1 - .../lua/luci/model/cbi/admin/privatewifi.lua | 1 - .../lua/luci/model/cbi/admin/wifi-config.lua | 1 - .../files/lib/gluon/setup-mode/rc.d/S12rpcd | 5 + .../lib/gluon/upgrade/500-status-page-api | 2 + package/gluon.mk | 2 +- ...ass-STAGING_DIR_HOST-to-Host-Install.patch | 32 +++++ ...ue.html-add-label-that-can-be-styled.patch | 14 -- ....uci-add-add_to_set-remove_from_set.patch} | 8 +- ...none-provided-by-the-browser-matches.patch | 28 ---- ...-non-string-or-number-keys-in-tables.patch | 32 ----- ...lib-jsonc-allow-encoding-empty-lists.patch | 38 ----- ...b-jsonc-Fix-memory-leak-in-stringify.patch | 16 --- ...nc-Add-ltn12-compatible-sink-factory.patch | 133 ------------------ ...ency-from-luci-base-to-luci-mode-rpc.patch | 33 ----- 26 files changed, 63 insertions(+), 372 deletions(-) delete mode 100644 package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/expertmode.htm create mode 100755 package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S12rpcd create mode 100644 patches/openwrt/0095-build-pass-STAGING_DIR_HOST-to-Host-Install.patch delete mode 100644 patches/packages/luci/0001-fvalue.html-add-label-that-can-be-styled.patch rename patches/packages/luci/{0007-model.uci-add-add_to_set-remove_from_set.patch => 0001-model.uci-add-add_to_set-remove_from_set.patch} (90%) delete mode 100644 patches/packages/luci/0002-modules-base-dispatcher-set-default-language-if-none-provided-by-the-browser-matches.patch delete mode 100644 patches/packages/luci/0003-luci-lib-jsonc-Ignore-non-string-or-number-keys-in-tables.patch delete mode 100644 patches/packages/luci/0004-luci-lib-jsonc-allow-encoding-empty-lists.patch delete mode 100644 patches/packages/luci/0005-luci-lib-jsonc-Fix-memory-leak-in-stringify.patch delete mode 100644 patches/packages/luci/0006-luci-lib-jsonc-Add-ltn12-compatible-sink-factory.patch delete mode 100644 patches/packages/luci/0008-Move-rpcd-dependency-from-luci-base-to-luci-mode-rpc.patch diff --git a/modules b/modules index db6da19f..ca223295 100644 --- a/modules +++ b/modules @@ -15,5 +15,4 @@ PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git PACKAGES_ROUTING_COMMIT=d848d49d2443448b147c564c2dd8f64433b5fb9c PACKAGES_LUCI_REPO=git://github.com/openwrt/luci.git -PACKAGES_LUCI_COMMIT=70a4d43cc895b7d728b4fc201f2b6fd9f4b8aaec -PACKAGES_LUCI_BRANCH=for-15.05 +PACKAGES_LUCI_COMMIT=d7328360632d7fbf5fd4006b4172a9fe9861d838 diff --git a/package/gluon-config-mode-core/files/usr/lib/lua/luci/view/gluon/cbi/config-mode.htm b/package/gluon-config-mode-core/files/usr/lib/lua/luci/view/gluon/cbi/config-mode.htm index b4aca92e..e608b52c 100644 --- a/package/gluon-config-mode-core/files/usr/lib/lua/luci/view/gluon/cbi/config-mode.htm +++ b/package/gluon-config-mode-core/files/usr/lib/lua/luci/view/gluon/cbi/config-mode.htm @@ -19,6 +19,7 @@

+
<% end %> diff --git a/package/gluon-config-mode-core/luasrc/usr/lib/lua/luci/controller/gluon-config-mode/index.lua b/package/gluon-config-mode-core/luasrc/usr/lib/lua/luci/controller/gluon-config-mode/index.lua index 0a6a5495..4e1f5232 100644 --- a/package/gluon-config-mode-core/luasrc/usr/lib/lua/luci/controller/gluon-config-mode/index.lua +++ b/package/gluon-config-mode-core/luasrc/usr/lib/lua/luci/controller/gluon-config-mode/index.lua @@ -32,11 +32,11 @@ function index() page.title = _("Wizard") page.target = alias("gluon-config-mode", "wizard") page.order = 5 - page.setuser = "root" - page.setgroup = "root" + page.sysauth = "root" + page.sysauth_authenticator = function() return "root" end page.index = true - entry({"gluon-config-mode", "wizard"}, form("gluon-config-mode/wizard")).index = true + entry({"gluon-config-mode", "wizard"}, cbi("gluon-config-mode/wizard")).index = true entry({"gluon-config-mode", "reboot"}, call("action_reboot")) end end diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/expertmode.htm b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/expertmode.htm deleted file mode 100644 index 53947f3c..00000000 --- a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/expertmode.htm +++ /dev/null @@ -1,56 +0,0 @@ -<% if not self.embedded then %> - -
- - -
-<% end %> -
- <% if self.title and #self.title > 0 then %>

<%=self.title%>

<% end %> - <%- if self.message then %> -

<%=self.message%>

- <%- end %> - <%- if self.errmessage then %> -

<%=self.errmessage%>

- <%- end %> - <% if self.description and #self.description > 0 then %>
<%=self.description%>
<% end %> - <% self:render_children() %> -
-<% if not self.embedded then %> -
-<%- - if type(self.hidden) == "table" then - for k, v in pairs(self.hidden) do --%> - -<%- - end - end -%> -<% if redirect then %> -
- -
-<% end %> -<%- if self.flow and self.flow.skip then %> - -<% end %> -<%- if self.submit ~= false then %> - -<% end %> -<%- if self.reset ~= false then %> - -<% end %> -<%- if self.cancel ~= false and self.on_cancel then %> - -<% end %> - -
-
-<% end %> diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade.htm b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade.htm index a2b82235..87702918 100644 --- a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade.htm +++ b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade.htm @@ -48,8 +48,8 @@ $Id$
+
<%+footer%> - diff --git a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_confirm.htm b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_confirm.htm index 5618728f..d77f6c95 100644 --- a/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_confirm.htm +++ b/package/gluon-luci-admin/files/usr/lib/lua/luci/view/admin/upgrade_confirm.htm @@ -52,16 +52,17 @@ $Id$

-
+ " /> +
-
+ " /> +
<%+footer%> - diff --git a/package/gluon-luci-admin/luasrc/usr/lib/lua/luci/controller/admin/upgrade.lua b/package/gluon-luci-admin/luasrc/usr/lib/lua/luci/controller/admin/upgrade.lua index 2365f02c..1930e9ec 100644 --- a/package/gluon-luci-admin/luasrc/usr/lib/lua/luci/controller/admin/upgrade.lua +++ b/package/gluon-luci-admin/luasrc/usr/lib/lua/luci/controller/admin/upgrade.lua @@ -44,6 +44,12 @@ function action_upgrade() -- Determine state local step = tonumber(luci.http.formvalue("step") or 1) + + if step ~= 1 and not luci.dispatcher.test_post_security() then + nixio.fs.unlink(tmpfile) + return + end + local has_image = nixio.fs.access(tmpfile) local has_support = image_supported(tmpfile) diff --git a/package/gluon-luci-admin/luasrc/usr/lib/lua/luci/model/cbi/admin/remote.lua b/package/gluon-luci-admin/luasrc/usr/lib/lua/luci/model/cbi/admin/remote.lua index c79c0195..da0bf063 100644 --- a/package/gluon-luci-admin/luasrc/usr/lib/lua/luci/model/cbi/admin/remote.lua +++ b/package/gluon-luci-admin/luasrc/usr/lib/lua/luci/model/cbi/admin/remote.lua @@ -18,7 +18,7 @@ local fs = require "nixio.fs" local m = Map("system", translate("SSH keys")) m.pageaction = false -m.template = "admin/expertmode" +m.template = "cbi/simpleform" if fs.access("/etc/config/dropbear") then local s = m:section(TypedSection, "_dummy1", nil, @@ -58,7 +58,7 @@ end local m2 = Map("system", translate("Password")) m2.reset = false m2.pageaction = false -m2.template = "admin/expertmode" +m2.template = "cbi/simpleform" local s = m2:section(TypedSection, "_dummy2", nil, translate( "Alternatively, you can set a password to access you node. Please choose a secure password you don't use anywhere else.

" diff --git a/package/gluon-luci-autoupdater/luasrc/usr/lib/lua/luci/model/cbi/admin/autoupdater.lua b/package/gluon-luci-autoupdater/luasrc/usr/lib/lua/luci/model/cbi/admin/autoupdater.lua index a8f9d3b3..5c1d81a0 100644 --- a/package/gluon-luci-autoupdater/luasrc/usr/lib/lua/luci/model/cbi/admin/autoupdater.lua +++ b/package/gluon-luci-autoupdater/luasrc/usr/lib/lua/luci/model/cbi/admin/autoupdater.lua @@ -14,7 +14,7 @@ $Id$ m = Map("autoupdater", translate("Automatic updates")) m.pageaction = false -m.template = "admin/expertmode" +m.template = "cbi/simpleform" s = m:section(TypedSection, "autoupdater", nil) s.addremove = false diff --git a/package/gluon-luci-mesh-vpn-fastd/luasrc/usr/lib/lua/luci/model/cbi/admin/mesh_vpn_fastd.lua b/package/gluon-luci-mesh-vpn-fastd/luasrc/usr/lib/lua/luci/model/cbi/admin/mesh_vpn_fastd.lua index 14bb5783..1e918936 100644 --- a/package/gluon-luci-mesh-vpn-fastd/luasrc/usr/lib/lua/luci/model/cbi/admin/mesh_vpn_fastd.lua +++ b/package/gluon-luci-mesh-vpn-fastd/luasrc/usr/lib/lua/luci/model/cbi/admin/mesh_vpn_fastd.lua @@ -2,7 +2,6 @@ local uci = luci.model.uci.cursor() local util = luci.util local f = SimpleForm('mesh_vpn', translate('Mesh VPN')) -f.template = "admin/expertmode" local s = f:section(SimpleSection) diff --git a/package/gluon-luci-node-role/luasrc/usr/lib/lua/luci/model/cbi/admin/noderole.lua b/package/gluon-luci-node-role/luasrc/usr/lib/lua/luci/model/cbi/admin/noderole.lua index e7832ad9..8450a39c 100644 --- a/package/gluon-luci-node-role/luasrc/usr/lib/lua/luci/model/cbi/admin/noderole.lua +++ b/package/gluon-luci-node-role/luasrc/usr/lib/lua/luci/model/cbi/admin/noderole.lua @@ -8,7 +8,6 @@ local config = 'gluon-node-info' local role = uci:get(config, uci:get_first(config, "system"), "role") f = SimpleForm("role", i18n.translate("Node role")) -f.template = "admin/expertmode" s = f:section(SimpleSection, nil, i18n.translate( "If this node has a special role within the freifunk network you can specify this role here. " diff --git a/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua b/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua index c3be0e7a..0e3458f5 100644 --- a/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua +++ b/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua @@ -21,7 +21,6 @@ local wan6 = uci:get_all("network", "wan6") local dns = uci:get_first("gluon-wan-dnsmasq", "static") local f = SimpleForm("portconfig", translate("WAN connection")) -f.template = "admin/expertmode" local s local o diff --git a/package/gluon-luci-private-wifi/luasrc/usr/lib/lua/luci/model/cbi/admin/privatewifi.lua b/package/gluon-luci-private-wifi/luasrc/usr/lib/lua/luci/model/cbi/admin/privatewifi.lua index 46a1a9d7..c4ff78d9 100644 --- a/package/gluon-luci-private-wifi/luasrc/usr/lib/lua/luci/model/cbi/admin/privatewifi.lua +++ b/package/gluon-luci-private-wifi/luasrc/usr/lib/lua/luci/model/cbi/admin/privatewifi.lua @@ -8,7 +8,6 @@ local primary_iface = 'wan_radio0' local ssid = uci:get('wireless', primary_iface, "ssid") f = SimpleForm("wifi", translate("Private WLAN")) -f.template = "admin/expertmode" s = f:section(SimpleSection, nil, translate( 'Your node can additionally extend your private network by bridging the WAN interface ' diff --git a/package/gluon-luci-wifi-config/luasrc/usr/lib/lua/luci/model/cbi/admin/wifi-config.lua b/package/gluon-luci-wifi-config/luasrc/usr/lib/lua/luci/model/cbi/admin/wifi-config.lua index efff8657..4f280de1 100644 --- a/package/gluon-luci-wifi-config/luasrc/usr/lib/lua/luci/model/cbi/admin/wifi-config.lua +++ b/package/gluon-luci-wifi-config/luasrc/usr/lib/lua/luci/model/cbi/admin/wifi-config.lua @@ -41,7 +41,6 @@ end local f = SimpleForm("wifi", translate("WLAN")) -f.template = "admin/expertmode" local s = f:section(SimpleSection, nil, translate( "You can enable or disable your node's client and mesh network " diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S12rpcd b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S12rpcd new file mode 100755 index 00000000..3791a8ce --- /dev/null +++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S12rpcd @@ -0,0 +1,5 @@ +#!/bin/sh /etc/rc.common + +if [ -x /etc/init.d/rpcd ]; then + . /etc/init.d/rpcd +fi diff --git a/package/gluon-status-page-api/files/lib/gluon/upgrade/500-status-page-api b/package/gluon-status-page-api/files/lib/gluon/upgrade/500-status-page-api index ce1bf06e..854d1d26 100755 --- a/package/gluon-status-page-api/files/lib/gluon/upgrade/500-status-page-api +++ b/package/gluon-status-page-api/files/lib/gluon/upgrade/500-status-page-api @@ -11,3 +11,5 @@ uci -q batch <<-EOF set uhttpd.main.max_requests=32 EOF + +/etc/init.d/rpcd disable diff --git a/package/gluon.mk b/package/gluon.mk index 9d35ad3c..05875a44 100644 --- a/package/gluon.mk +++ b/package/gluon.mk @@ -11,7 +11,7 @@ END__GLUON__CHECK__SITE endef # Languages supported by LuCi -GLUON_SUPPORTED_LANGS := ca zh_cn en fr de el he hu it ja ms no pl pt_br pt ro ru es sv uk vi +GLUON_SUPPORTED_LANGS := ca cs de el en es fr he hu it ja ms no pl pt-br pt ro ru sk sv tr uk vi zh-cn zh-tw GLUON_I18N_PACKAGES := $(foreach lang,$(GLUON_SUPPORTED_LANGS),+LUCI_LANG_$(lang):luci-i18n-base-$(lang)) GLUON_I18N_CONFIG := $(foreach lang,$(GLUON_SUPPORTED_LANGS),CONFIG_LUCI_LANG_$(lang)) diff --git a/patches/openwrt/0095-build-pass-STAGING_DIR_HOST-to-Host-Install.patch b/patches/openwrt/0095-build-pass-STAGING_DIR_HOST-to-Host-Install.patch new file mode 100644 index 00000000..cec0454f --- /dev/null +++ b/patches/openwrt/0095-build-pass-STAGING_DIR_HOST-to-Host-Install.patch @@ -0,0 +1,32 @@ +From: Felix Fietkau +Date: Tue, 23 Aug 2016 10:58:00 +0200 +Subject: build: pass $(STAGING_DIR_HOST) to Host/Install + +makes it more consistent with package builds + +Signed-off-by: Felix Fietkau + +Backport of LEDE 4170267f5a794eb3fa6bb1718a665e3395077434 + +diff --git a/include/host-build.mk b/include/host-build.mk +index 44401b866a4d637648bb093470a5e66b4a3e38fc..82d5361e30e897e18f5c9f9c57334c07bb74c490 100644 +--- a/include/host-build.mk ++++ b/include/host-build.mk +@@ -110,7 +110,7 @@ define Host/Install/Default + endef + + define Host/Install +- $(call Host/Install/Default) ++ $(call Host/Install/Default,$(STAGING_DIR_HOST)) + endef + + +@@ -171,7 +171,7 @@ ifndef DUMP + touch $$@ + + $(HOST_STAMP_INSTALLED): $(HOST_STAMP_BUILT) $(if $(FORCE_HOST_INSTALL),FORCE) +- $(call Host/Install) ++ $(call Host/Install,$(STAGING_DIR_HOST)) + $(foreach hook,$(Hooks/HostInstall/Post),$(call $(hook))$(sep)) + mkdir -p $$(shell dirname $$@) + touch $(HOST_STAMP_BUILT) diff --git a/patches/packages/luci/0001-fvalue.html-add-label-that-can-be-styled.patch b/patches/packages/luci/0001-fvalue.html-add-label-that-can-be-styled.patch deleted file mode 100644 index 49884984..00000000 --- a/patches/packages/luci/0001-fvalue.html-add-label-that-can-be-styled.patch +++ /dev/null @@ -1,14 +0,0 @@ -From: Nils Schneider -Date: Sat, 9 Aug 2014 09:33:21 +0200 -Subject: fvalue.html: add label that can be styled - -diff --git a/modules/luci-base/luasrc/view/cbi/fvalue.htm b/modules/luci-base/luasrc/view/cbi/fvalue.htm -index a1e0808e8d3e8bf1845d4838b244ed6bb0b605f2..a324ab258a86b080f9bf285aa62ee4db43468a81 100644 ---- a/modules/luci-base/luasrc/view/cbi/fvalue.htm -+++ b/modules/luci-base/luasrc/view/cbi/fvalue.htm -@@ -6,4 +6,5 @@ - attr("id", cbid) .. attr("name", cbid) .. attr("value", self.enabled or 1) .. - ifattr((self:cfgvalue(section) or self.default) == self.enabled, "checked", "checked") - %> /> -+ > - <%+cbi/valuefooter%> diff --git a/patches/packages/luci/0007-model.uci-add-add_to_set-remove_from_set.patch b/patches/packages/luci/0001-model.uci-add-add_to_set-remove_from_set.patch similarity index 90% rename from patches/packages/luci/0007-model.uci-add-add_to_set-remove_from_set.patch rename to patches/packages/luci/0001-model.uci-add-add_to_set-remove_from_set.patch index 37abb91c..b0adfc1e 100644 --- a/patches/packages/luci/0007-model.uci-add-add_to_set-remove_from_set.patch +++ b/patches/packages/luci/0001-model.uci-add-add_to_set-remove_from_set.patch @@ -13,7 +13,7 @@ i.e. duplicated values will be removed. Also, order is not preserved. Signed-off-by: Nils Schneider diff --git a/modules/luci-base/luasrc/model/uci.lua b/modules/luci-base/luasrc/model/uci.lua -index 1659137742940ea0621e2b57e98232f393dc7efa..d35b9d70e27913c9da302c6975a97888774de535 100644 +index 577c6cde08eaa6e10887c97b26fed000f3289070..e77cacec5dfeb447085b13d6275edfe873beb3c4 100644 --- a/modules/luci-base/luasrc/model/uci.lua +++ b/modules/luci-base/luasrc/model/uci.lua @@ -9,7 +9,7 @@ local table = require "table" @@ -25,7 +25,7 @@ index 1659137742940ea0621e2b57e98232f393dc7efa..d35b9d70e27913c9da302c6975a97888 local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack -- The typical workflow for UCI is: Get a cursor instance from the -@@ -147,6 +147,40 @@ function Cursor.set_list(self, config, section, option, value) +@@ -150,6 +150,40 @@ function Cursor.set_list(self, config, section, option, value) return false end @@ -67,10 +67,10 @@ index 1659137742940ea0621e2b57e98232f393dc7efa..d35b9d70e27913c9da302c6975a97888 function Cursor._affected(self, configlist) configlist = type(configlist) == "table" and configlist or {configlist} diff --git a/modules/luci-base/luasrc/model/uci.luadoc b/modules/luci-base/luasrc/model/uci.luadoc -index 1c208669d17f24d2d1de99bbbf1cefe878649014..281bdb2953ee1888ee41d8d0fb1cc40e9345b3e0 100644 +index 49093c7930128f1e6de6f739662b96adcc43fe74..cfec9eea7922da551cb8d2a4f2c540d479b8ccbe 100644 --- a/modules/luci-base/luasrc/model/uci.luadoc +++ b/modules/luci-base/luasrc/model/uci.luadoc -@@ -116,6 +116,30 @@ Set given values as list. +@@ -118,6 +118,30 @@ has the same effect as deleting the option. ]] ---[[ diff --git a/patches/packages/luci/0002-modules-base-dispatcher-set-default-language-if-none-provided-by-the-browser-matches.patch b/patches/packages/luci/0002-modules-base-dispatcher-set-default-language-if-none-provided-by-the-browser-matches.patch deleted file mode 100644 index d1ad5944..00000000 --- a/patches/packages/luci/0002-modules-base-dispatcher-set-default-language-if-none-provided-by-the-browser-matches.patch +++ /dev/null @@ -1,28 +0,0 @@ -From: Matthias Schiffer -Date: Thu, 19 Mar 2015 18:44:52 +0100 -Subject: modules/base: dispatcher: set default language if none provided by the browser matches - -diff --git a/modules/luci-base/luasrc/dispatcher.lua b/modules/luci-base/luasrc/dispatcher.lua -index 25269501068dd26efe5b85706b555996d63b0f6d..be2fc3453f528853519649e4b64ecb3fd14d80be 100644 ---- a/modules/luci-base/luasrc/dispatcher.lua -+++ b/modules/luci-base/luasrc/dispatcher.lua -@@ -182,6 +182,7 @@ function dispatch(request) - assert(conf.main, - "/etc/config/luci seems to be corrupt, unable to find section 'main'") - -+ local i18n = require "luci.i18n" - local lang = conf.main.lang or "auto" - if lang == "auto" then - local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or "" -@@ -193,7 +194,10 @@ function dispatch(request) - end - end - end -- require "luci.i18n".setlanguage(lang) -+ if lang == "auto" then -+ lang = i18n.default -+ end -+ i18n.setlanguage(lang) - - local c = ctx.tree - local stat diff --git a/patches/packages/luci/0003-luci-lib-jsonc-Ignore-non-string-or-number-keys-in-tables.patch b/patches/packages/luci/0003-luci-lib-jsonc-Ignore-non-string-or-number-keys-in-tables.patch deleted file mode 100644 index c1fc1438..00000000 --- a/patches/packages/luci/0003-luci-lib-jsonc-Ignore-non-string-or-number-keys-in-tables.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Jan-Philipp Litza -Date: Sun, 30 Aug 2015 15:42:52 +0200 -Subject: luci-lib-jsonc: Ignore non-string-or-number keys in tables - -Previously, the following caused a segmentation fault: - - json.stringify({[{}] = true}) - -This was caused by lua_tostring() returning NULL for anything but -strings and numbers, letting json_object_object_add crash. - -This patch makes jsonc ignore all keys which have no string -representation altogether. - -Signed-off-by: Jan-Philipp Litza - -diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c -index 49cb21f5bcb2817792d0eef8dc5cd567bc6d86bc..827fde8843082e956b0c89b5855feeabd790e880 100644 ---- a/libs/luci-lib-jsonc/src/jsonc.c -+++ b/libs/luci-lib-jsonc/src/jsonc.c -@@ -286,8 +286,9 @@ static struct json_object * _lua_to_json(lua_State *L, int index) - lua_pushvalue(L, -2); - key = lua_tostring(L, -1); - -- json_object_object_add(obj, key, -- _lua_to_json(L, lua_gettop(L) - 1)); -+ if (key) -+ json_object_object_add(obj, key, -+ _lua_to_json(L, lua_gettop(L) - 1)); - - lua_pop(L, 2); - } diff --git a/patches/packages/luci/0004-luci-lib-jsonc-allow-encoding-empty-lists.patch b/patches/packages/luci/0004-luci-lib-jsonc-allow-encoding-empty-lists.patch deleted file mode 100644 index 55184774..00000000 --- a/patches/packages/luci/0004-luci-lib-jsonc-allow-encoding-empty-lists.patch +++ /dev/null @@ -1,38 +0,0 @@ -From: Jan-Philipp Litza -Date: Sun, 30 Aug 2015 15:45:49 +0200 -Subject: luci-lib-jsonc: allow encoding empty lists - -To be consistent with the behavior of luci-lib-json, an empty Lua table -should be encoded to an empty JSON list, not an empty JSON object. - -To still allow encoding empty JSON objects, the usage of anything other -than a number or a string as a key (for example an empty table or a -function) can be used to force encoding as an object: - - json.stringify({}) -- "[]" - json.stringify({[{}] = true}) -- "{}" - -Signed-off-by: Jan-Philipp Litza - -diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c -index 827fde8843082e956b0c89b5855feeabd790e880..971fb122f7655b379e717ef78a5417032ead9a57 100644 ---- a/libs/luci-lib-jsonc/src/jsonc.c -+++ b/libs/luci-lib-jsonc/src/jsonc.c -@@ -222,7 +222,7 @@ static int _lua_test_array(lua_State *L, int index) - - out: - lua_pop(L, 2); -- return 0; -+ return -1; - } - - /* check for holes */ -@@ -254,7 +254,7 @@ static struct json_object * _lua_to_json(lua_State *L, int index) - case LUA_TTABLE: - max = _lua_test_array(L, index); - -- if (max > 0) -+ if (max >= 0) - { - obj = json_object_new_array(); - diff --git a/patches/packages/luci/0005-luci-lib-jsonc-Fix-memory-leak-in-stringify.patch b/patches/packages/luci/0005-luci-lib-jsonc-Fix-memory-leak-in-stringify.patch deleted file mode 100644 index 473a1f9e..00000000 --- a/patches/packages/luci/0005-luci-lib-jsonc-Fix-memory-leak-in-stringify.patch +++ /dev/null @@ -1,16 +0,0 @@ -From: Jan-Philipp Litza -Date: Mon, 31 Aug 2015 19:52:36 +0200 -Subject: luci-lib-jsonc: Fix memory leak in stringify() - -diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c -index 971fb122f7655b379e717ef78a5417032ead9a57..b857c979e93bec395bca164a4f144c7c69005bec 100644 ---- a/libs/luci-lib-jsonc/src/jsonc.c -+++ b/libs/luci-lib-jsonc/src/jsonc.c -@@ -106,6 +106,7 @@ static int json_stringify(lua_State *L) - flags |= JSON_C_TO_STRING_PRETTY | JSON_C_TO_STRING_SPACED; - - lua_pushstring(L, json_object_to_json_string_ext(obj, flags)); -+ json_object_put(obj); - return 1; - } - diff --git a/patches/packages/luci/0006-luci-lib-jsonc-Add-ltn12-compatible-sink-factory.patch b/patches/packages/luci/0006-luci-lib-jsonc-Add-ltn12-compatible-sink-factory.patch deleted file mode 100644 index 86ccc9cb..00000000 --- a/patches/packages/luci/0006-luci-lib-jsonc-Add-ltn12-compatible-sink-factory.patch +++ /dev/null @@ -1,133 +0,0 @@ -From: Jan-Philipp Litza -Date: Tue, 1 Sep 2015 16:17:23 +0200 -Subject: luci-lib-jsonc: Add ltn12-compatible sink factory - -To use the luci-lib-jsonc parser as sink for an ltn12 pump (for example -from stdin), the following code will now do: - - require 'luci.ltn12' - require 'luci.jsonc' - - local parser = luci.jsonc.new() - luci.ltn12.pump.all(luci.ltn12.source.file(io.input()), parser:sink()) - print(parser:get()) - -Signed-off-by: Jan-Philipp Litza - -diff --git a/libs/luci-lib-jsonc/src/jsonc.c b/libs/luci-lib-jsonc/src/jsonc.c -index b857c979e93bec395bca164a4f144c7c69005bec..ef1110166055a78bf32cf1a6fbbd3e356b2bce3f 100644 ---- a/libs/luci-lib-jsonc/src/jsonc.c -+++ b/libs/luci-lib-jsonc/src/jsonc.c -@@ -328,6 +328,76 @@ static int json_parse_set(lua_State *L) - return 0; - } - -+static int json_parse_sink_closure(lua_State *L) -+{ -+ bool finished = lua_toboolean(L, lua_upvalueindex(2)); -+ if (lua_isnil(L, 1)) -+ { -+ // no more data available -+ if (finished) -+ { -+ // we were finished parsing -+ lua_pushboolean(L, true); -+ return 1; -+ } -+ else -+ { -+ lua_pushnil(L); -+ lua_pushstring(L, "Incomplete JSON data"); -+ return 2; -+ } -+ } -+ else -+ { -+ if (finished) -+ { -+ lua_pushnil(L); -+ lua_pushstring(L, "Unexpected data after complete JSON object"); -+ return 2; -+ } -+ else -+ { -+ // luci.jsonc.parser.chunk() -+ lua_pushcfunction(L, json_parse_chunk); -+ // parser object from closure -+ lua_pushvalue(L, lua_upvalueindex(1)); -+ // chunk -+ lua_pushvalue(L, 1); -+ lua_call(L, 2, 2); -+ -+ if (lua_isnil(L, -2)) -+ { -+ // an error occurred, leave (nil, errmsg) on the stack and return it -+ return 2; -+ } -+ else if (lua_toboolean(L, -2)) -+ { -+ // finished reading, set finished=true and return nil to prevent further input -+ lua_pop(L, 2); -+ lua_pushboolean(L, true); -+ lua_replace(L, lua_upvalueindex(2)); -+ lua_pushnil(L); -+ return 1; -+ } -+ else -+ { -+ // not finished reading, return true -+ lua_pop(L, 2); -+ lua_pushboolean(L, true); -+ return 1; -+ } -+ } -+ } -+} -+ -+static int json_parse_sink(lua_State *L) -+{ -+ luaL_checkudata(L, 1, LUCI_JSONC_PARSER); -+ lua_pushboolean(L, false); -+ lua_pushcclosure(L, json_parse_sink_closure, 2); -+ return 1; -+} -+ - static int json_tostring(lua_State *L) - { - struct json_state *s = luaL_checkudata(L, 1, LUCI_JSONC_PARSER); -@@ -367,6 +437,7 @@ static const luaL_reg jsonc_parser_methods[] = { - { "parse", json_parse_chunk }, - { "get", json_parse_get }, - { "set", json_parse_set }, -+ { "sink", json_parse_sink }, - { "stringify", json_tostring }, - - { "__gc", json_gc }, -diff --git a/libs/luci-lib-jsonc/src/jsonc.luadoc b/libs/luci-lib-jsonc/src/jsonc.luadoc -index 2ee9cebdc889242595f5281228783df15b9b8dcd..720b17d1eb76d8eb9a8b47939ac724891cfb3886 100644 ---- a/libs/luci-lib-jsonc/src/jsonc.luadoc -+++ b/libs/luci-lib-jsonc/src/jsonc.luadoc -@@ -121,10 +121,22 @@ parser:set({ "some", "data" })` - ]] - - ---[[ --Serialize current parser state as JSON. -+Generate an ltn12-compatible sink. - - @class function - @sort 4 -+@name parser.sink -+@return Returns a function that can be used as an ltn12 sink. -+@usage `parser = luci.jsonc.new() -+ltn12.pump.all(ltn12.source.file(io.input()), parser:sink()) -+print(parser:get())` -+]] -+ -+---[[ -+Serialize current parser state as JSON. -+ -+@class function -+@sort 5 - @name parser.stringify - @param pretty A boolean value indicating whether the resulting JSON should be pretty printed. - @return Returns the serialized JSON data of this parser instance. diff --git a/patches/packages/luci/0008-Move-rpcd-dependency-from-luci-base-to-luci-mode-rpc.patch b/patches/packages/luci/0008-Move-rpcd-dependency-from-luci-base-to-luci-mode-rpc.patch deleted file mode 100644 index 6376d6a2..00000000 --- a/patches/packages/luci/0008-Move-rpcd-dependency-from-luci-base-to-luci-mode-rpc.patch +++ /dev/null @@ -1,33 +0,0 @@ -From: Matthias Schiffer -Date: Sun, 6 Sep 2015 01:27:06 +0200 -Subject: Move rpcd dependency from luci-base to luci-mode-rpc - -LuCI's authentication won't work without rpcd, but we aren't using the -authentication anyways. Users who need it can just install rpcd explicitly. - -diff --git a/modules/luci-base/Makefile b/modules/luci-base/Makefile -index 54506b023a728e071b8fb4983ef614897363c0ec..4457034ada02972908a68f7c9c54352e7ac3c054 100644 ---- a/modules/luci-base/Makefile -+++ b/modules/luci-base/Makefile -@@ -12,7 +12,7 @@ LUCI_TYPE:=mod - LUCI_BASENAME:=base - - LUCI_TITLE:=LuCI core libraries --LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +rpcd +libubus-lua -+LUCI_DEPENDS:=+lua +libuci-lua +luci-lib-nixio +luci-lib-ip +libubus-lua - - PKG_SOURCE:=LuaSrcDiet-0.12.1.tar.bz2 - PKG_SOURCE_URL:=https://luasrcdiet.googlecode.com/files -diff --git a/modules/luci-mod-rpc/Makefile b/modules/luci-mod-rpc/Makefile -index e64c86c6283a5a7d1181816e9f148d78d15c7dd8..5f64a14d48ef1f74435e151bc03a2377239be1f8 100644 ---- a/modules/luci-mod-rpc/Makefile -+++ b/modules/luci-mod-rpc/Makefile -@@ -7,7 +7,7 @@ - include $(TOPDIR)/rules.mk - - LUCI_TITLE:=LuCI RPC - JSON-RPC API --LUCI_DEPENDS:=+luci-lib-json -+LUCI_DEPENDS:=+luci-lib-json +rpcd - - include ../../luci.mk - From a0efa9f3fd96276ebd88ffab85c6d7635d432eb8 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 17 Jan 2017 22:11:53 +0100 Subject: [PATCH 107/126] odhcp6c: update to use upstreamed solution to ignore default lifetime for RDNSS --- .../330-gluon-mesh-batman-adv-core-local-node | 1 + ...ndent-of-the-default-router-lifetime.patch | 31 ----- ...f9f4b4da9d1960f82e68ae797290e4b9c434.patch | 118 ++++++++++++++++++ 3 files changed, 119 insertions(+), 31 deletions(-) delete mode 100644 patches/openwrt/0003-odhcp6c-always-accept-RDNSS-independent-of-the-default-router-lifetime.patch create mode 100644 patches/openwrt/0003-odhcp6c-backport-from-LEDE-0d49f9f4b4da9d1960f82e68ae797290e4b9c434.patch diff --git a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/330-gluon-mesh-batman-adv-core-local-node b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/330-gluon-mesh-batman-adv-core-local-node index 04909fa6..ae20d61c 100755 --- a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/330-gluon-mesh-batman-adv-core-local-node +++ b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/330-gluon-mesh-batman-adv-core-local-node @@ -25,6 +25,7 @@ uci:section('network', 'interface', 'local_node', reqprefix = 'no', peerdns = 1, sourcefilter = 0, + keep_ra_dnslifetime = 1, } ) diff --git a/patches/openwrt/0003-odhcp6c-always-accept-RDNSS-independent-of-the-default-router-lifetime.patch b/patches/openwrt/0003-odhcp6c-always-accept-RDNSS-independent-of-the-default-router-lifetime.patch deleted file mode 100644 index 50efa243..00000000 --- a/patches/openwrt/0003-odhcp6c-always-accept-RDNSS-independent-of-the-default-router-lifetime.patch +++ /dev/null @@ -1,31 +0,0 @@ -From: Matthias Schiffer -Date: Thu, 13 Nov 2014 01:17:24 +0100 -Subject: odhcp6c: always accept RDNSS, independent of the default router lifetime - -diff --git a/package/network/ipv6/odhcp6c/patches/001-always_accept_rdnss.patch b/package/network/ipv6/odhcp6c/patches/001-always_accept_rdnss.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..cb694cadf4df4b487b3a4035eacca9c6a7798ecb ---- /dev/null -+++ b/package/network/ipv6/odhcp6c/patches/001-always_accept_rdnss.patch -@@ -0,0 +1,21 @@ -+--- a/src/ra.c -++++ b/src/ra.c -+@@ -438,18 +438,6 @@ bool ra_process(void) -+ } -+ } -+ } -+- -+- int states[2] = {STATE_RA_DNS, STATE_RA_SEARCH}; -+- for (size_t i = 0; i < 2; ++i) { -+- size_t ra_dns_len; -+- uint8_t *start = odhcp6c_get_state(states[i], &ra_dns_len); -+- for (struct odhcp6c_entry *c = (struct odhcp6c_entry*)start; -+- (uint8_t*)c < &start[ra_dns_len] && &c->auxtarget[c->auxlen] <= &start[ra_dns_len]; -+- c = (struct odhcp6c_entry*)(&c->auxtarget[c->auxlen])) -+- if (IN6_ARE_ADDR_EQUAL(&c->router, &from.sin6_addr) && -+- c->valid > router_valid) -+- c->valid = router_valid; -+- } -+ } -+ -+ if (found) diff --git a/patches/openwrt/0003-odhcp6c-backport-from-LEDE-0d49f9f4b4da9d1960f82e68ae797290e4b9c434.patch b/patches/openwrt/0003-odhcp6c-backport-from-LEDE-0d49f9f4b4da9d1960f82e68ae797290e4b9c434.patch new file mode 100644 index 00000000..75993f39 --- /dev/null +++ b/patches/openwrt/0003-odhcp6c-backport-from-LEDE-0d49f9f4b4da9d1960f82e68ae797290e4b9c434.patch @@ -0,0 +1,118 @@ +From: Matthias Schiffer +Date: Tue, 17 Jan 2017 22:08:21 +0100 +Subject: odhcp6c: backport from LEDE 0d49f9f4b4da9d1960f82e68ae797290e4b9c434 + +diff --git a/package/network/ipv6/odhcp6c/Makefile b/package/network/ipv6/odhcp6c/Makefile +index 3705705f6540dc841c7041e81f6d208a41a1f08a..a8e45588a52859daf14c68c665a53690b9d09be2 100644 +--- a/package/network/ipv6/odhcp6c/Makefile ++++ b/package/network/ipv6/odhcp6c/Makefile +@@ -8,15 +8,16 @@ + include $(TOPDIR)/rules.mk + + PKG_NAME:=odhcp6c +-PKG_VERSION:=2016-02-08 ++PKG_VERSION:=2017-01-07 + PKG_RELEASE=$(PKG_SOURCE_VERSION) + + PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 + PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) +-PKG_SOURCE_URL:=https://github.com/openwrt/odhcp6c.git ++PKG_SOURCE_URL:=git://git.lede-project.org/project/odhcp6c.git + PKG_SOURCE_PROTO:=git +-PKG_SOURCE_VERSION:=dc186d6d2b0dd4ad23ca5fc69c00e81f796ff6d9 +-PKG_MAINTAINER:=Steven Barth ++PKG_SOURCE_VERSION:=d420f49396c627ce1072b83170889baf0720bc8b ++PKG_MIRROR_HASH:=a7c599b5600b6cca9aec221dd32fc7754e0e942b0192bd902f1e789f53345127 ++PKG_MAINTAINER:=Hans Dedecker + PKG_LICENSE:=GPL-2.0 + + include $(INCLUDE_DIR)/package.mk +@@ -30,7 +31,7 @@ define Package/odhcp6c + SECTION:=net + CATEGORY:=Network + TITLE:=Embedded DHCPv6-client for OpenWrt +- DEPENDS:=+kmod-ipv6 ++ DEPENDS:=@IPV6 +libubox + endef + + define Package/odhcp6c/config +diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.script b/package/network/ipv6/odhcp6c/files/dhcpv6.script +index 677d35f4f92e82d6a7fe9ca01a35e071097baca8..1bb5e771b6dc80c1f5bceef88508d92cc69b1d3a 100755 +--- a/package/network/ipv6/odhcp6c/files/dhcpv6.script ++++ b/package/network/ipv6/odhcp6c/files/dhcpv6.script +@@ -77,6 +77,11 @@ setup_interface () { + -z "$RA_DNS" -a "$FAKE_ROUTES" = 1 ]; then + RA_ROUTES="::/0,$SERVER,$valid,4096" + fi ++ ++ # RFC 7278 ++ if [ "$mask" -eq 64 -a -z "$PREFIXES" -a -n "$EXTENDPREFIX" ]; then ++ proto_add_ipv6_prefix "$addr/$mask,$preferred,$valid" ++ fi + done + + for entry in $RA_ROUTES; do +@@ -180,7 +185,7 @@ setup_interface () { + # Apply IPv6 / ND configuration + HOPLIMIT=$(cat /proc/sys/net/ipv6/conf/$device/hop_limit) + [ -n "$RA_HOPLIMIT" -a -n "$HOPLIMIT" ] && [ "$RA_HOPLIMIT" -gt "$HOPLIMIT" ] && echo "$RA_HOPLIMIT" > /proc/sys/net/ipv6/conf/$device/hop_limit +- [ -n "$RA_MTU" ] && [ "$RA_MTU" -gt 0 ] && echo "$RA_MTU" > /proc/sys/net/ipv6/conf/$device/mtu ++ [ -n "$RA_MTU" ] && [ "$RA_MTU" -ge 1280 ] && echo "$RA_MTU" > /proc/sys/net/ipv6/conf/$device/mtu 2>/dev/null + [ -n "$RA_REACHABLE" ] && [ "$RA_REACHABLE" -gt 0 ] && echo "$RA_REACHABLE" > /proc/sys/net/ipv6/neigh/$device/base_reachable_time_ms + [ -n "$RA_RETRANSMIT" ] && [ "$RA_RETRANSMIT" -gt 0 ] && echo "$RA_RETRANSMIT" > /proc/sys/net/ipv6/neigh/$device/retrans_time_ms + +@@ -209,6 +214,6 @@ case "$2" in + esac + + # user rules +-[ -f /etc/odhcp6c.user ] && . /etc/odhcp6c.user ++[ -f /etc/odhcp6c.user ] && . /etc/odhcp6c.user "@" + + exit 0 +diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.sh b/package/network/ipv6/odhcp6c/files/dhcpv6.sh +index 4a453fdc4d94d9298067a986b0e4c6054b6c0a60..9e3f6697335a55cf4be1751fec907a4ac93f09ec 100755 +--- a/package/network/ipv6/odhcp6c/files/dhcpv6.sh ++++ b/package/network/ipv6/odhcp6c/files/dhcpv6.sh +@@ -13,6 +13,7 @@ proto_dhcpv6_init_config() { + proto_config_add_string 'reqopts:list(uinteger)' + proto_config_add_string 'noslaaconly:bool' + proto_config_add_string 'forceprefix:bool' ++ proto_config_add_string 'extendprefix:bool' + proto_config_add_string 'norelease:bool' + proto_config_add_string 'ip6prefix:ip6addr' + proto_config_add_string iface_dslite +@@ -29,14 +30,15 @@ proto_dhcpv6_init_config() { + proto_config_add_int "soltimeout" + proto_config_add_boolean fakeroutes + proto_config_add_boolean sourcefilter ++ proto_config_add_boolean keep_ra_dnslifetime + } + + proto_dhcpv6_setup() { + local config="$1" + local iface="$2" + +- local reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter +- json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter ++ local reqaddress reqprefix clientid reqopts noslaaconly forceprefix extendprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter keep_ra_dnslifetime ++ json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix extendprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter keep_ra_dnslifetime + + + # Configure +@@ -60,6 +62,8 @@ proto_dhcpv6_setup() { + + [ -n "$userclass" ] && append opts "-u$userclass" + ++ [ "$keep_ra_dnslifetime" = "1" ] && append opts "-L" ++ + for opt in $reqopts; do + append opts "-r$opt" + done +@@ -78,6 +82,7 @@ proto_dhcpv6_setup() { + [ -n "$zone" ] && proto_export "ZONE=$zone" + [ "$fakeroutes" != "0" ] && proto_export "FAKE_ROUTES=1" + [ "$sourcefilter" = "0" ] && proto_export "NOSOURCEFILTER=1" ++ [ "$extendprefix" = "1" ] && proto_export "EXTENDPREFIX=1" + + proto_export "INTERFACE=$config" + proto_run_command "$config" odhcp6c \ From 04818c170b2fb6d64eccdec5aa97673ad4419a9f Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 17 Jan 2017 23:57:39 +0100 Subject: [PATCH 108/126] package: refactor add_to_set/remove_to_set to get rid of last LuCI patch --- .../upgrade/300-gluon-client-bridge-network | 16 ++- .../luasrc/usr/lib/lua/gluon/util.lua | 24 ++++ .../lua/luci/model/cbi/admin/portconfig.lua | 16 +-- .../310-gluon-mesh-batman-adv-core-mesh | 5 +- ...l.uci-add-add_to_set-remove_from_set.patch | 103 ------------------ 5 files changed, 47 insertions(+), 117 deletions(-) delete mode 100644 patches/packages/luci/0001-model.uci-add-add_to_set-remove_from_set.patch diff --git a/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/300-gluon-client-bridge-network b/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/300-gluon-client-bridge-network index 67d0c061..7540ecb5 100755 --- a/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/300-gluon-client-bridge-network +++ b/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/300-gluon-client-bridge-network @@ -2,6 +2,7 @@ local site = require 'gluon.site_config' local sysconfig = require 'gluon.sysconfig' +local util = require 'gluon.util' local ip = require 'luci.ip' local lutil = require 'luci.util' @@ -35,21 +36,24 @@ uci:delete('network', 'client', 'peerdns') uci:delete('network', 'client', 'sourcefilter') -local ifname = uci:get('network', 'client', 'ifname') +local interfaces = uci:get('network', 'client', 'ifname') or {} -if type(ifname) == 'string' then - uci:delete('network', 'client', 'ifname') - for x in ifname:gmatch("[^%s]+") do - uci:add_to_set('network', 'client', 'ifname', x) +if type(interfaces) == 'string' then + local ifname = interfaces + interfaces = {} + for iface in ifname:gmatch("[^%s]+") do + util.add_to_set(interfaces, iface) end end if sysconfig.lan_ifname and not ifname and not uci:get_bool('network', 'mesh_lan', 'auto') then for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do - uci:add_to_set('network', 'client', 'ifname', lanif) + util.add_to_set(interfaces, lanif) end end +uci:set_list('network', 'client', 'ifname', interfaces) + uci:save('network') diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua index f07f0ab1..f013ec23 100644 --- a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua +++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua @@ -38,8 +38,32 @@ local uci = require('luci.model.uci').cursor() local lutil = require 'luci.util' local fs = require 'nixio.fs' + module 'gluon.util' +function add_to_set(t, itm) + for _,v in ipairs(t) do + if v == itm then return false end + end + table.insert(t, itm) + return true +end + +function remove_from_set(t, itm) + local i = 1 + local changed = false + while i <= #t do + if t[i] == itm then + table.remove(t, i) + changed = true + else + i = i + 1 + end + end + return changed +end + + function exec(...) return os.execute(escape_args('', 'exec', ...)) end diff --git a/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua b/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua index 0e3458f5..2cab7606 100644 --- a/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua +++ b/package/gluon-luci-portconfig/luasrc/usr/lib/lua/luci/model/cbi/admin/portconfig.lua @@ -15,6 +15,7 @@ $Id$ local uci = luci.model.uci.cursor() local lutil = require 'luci.util' local sysconfig = require 'gluon.sysconfig' +local util = require 'gluon.util' local wan = uci:get_all("network", "wan") local wan6 = uci:get_all("network", "wan6") @@ -127,16 +128,17 @@ function f.handle(self, state, data) if sysconfig.lan_ifname then uci:set("network", "mesh_lan", "auto", data.mesh_lan) - local doit - if data.mesh_lan == '1' then - doit = uci.remove_from_set - else - doit = uci.add_to_set - end + local interfaces = uci:get_list("network", "client", "ifname") for _, lanif in ipairs(lutil.split(sysconfig.lan_ifname, ' ')) do - doit(uci, "network", "client", "ifname", lanif) + if data.mesh_lan == '1' then + util.remove_from_set(interfaces, lanif) + else + util.add_to_set(interfaces, lanif) + end end + + uci:set_list("network", "client", "ifname", interfaces) end uci:save("network") diff --git a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/310-gluon-mesh-batman-adv-core-mesh b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/310-gluon-mesh-batman-adv-core-mesh index 9569df25..6558671c 100755 --- a/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/310-gluon-mesh-batman-adv-core-mesh +++ b/package/gluon-mesh-batman-adv-core/luasrc/lib/gluon/upgrade/310-gluon-mesh-batman-adv-core-mesh @@ -2,6 +2,7 @@ local sysconfig = require 'gluon.sysconfig' local site = require 'gluon.site_config' +local util = require 'gluon.util' local uci = require('luci.model.uci').cursor() @@ -34,6 +35,8 @@ uci:section('network', 'interface', 'bat0', } ) -uci:add_to_set('network', 'client', 'ifname', 'bat0') +local interfaces = uci:get_list('network', 'client', 'ifname') +util.add_to_set(interfaces, 'bat0') +uci:set_list('network', 'client', 'ifname', interfaces) uci:save('network') diff --git a/patches/packages/luci/0001-model.uci-add-add_to_set-remove_from_set.patch b/patches/packages/luci/0001-model.uci-add-add_to_set-remove_from_set.patch deleted file mode 100644 index b0adfc1e..00000000 --- a/patches/packages/luci/0001-model.uci-add-add_to_set-remove_from_set.patch +++ /dev/null @@ -1,103 +0,0 @@ -From: Nils Schneider -Date: Mon, 17 Aug 2015 20:39:58 +0200 -Subject: model.uci: add add_to_set / remove_from_set - -Adds two functions to simplify working with UCI lists: - -- add_to_set, which ensures a given value will be present in a list, and -- remove_from_set, which removes a value from list. - -I've called these methods "set" because they treat the list as a set, -i.e. duplicated values will be removed. Also, order is not preserved. - -Signed-off-by: Nils Schneider - -diff --git a/modules/luci-base/luasrc/model/uci.lua b/modules/luci-base/luasrc/model/uci.lua -index 577c6cde08eaa6e10887c97b26fed000f3289070..e77cacec5dfeb447085b13d6275edfe873beb3c4 100644 ---- a/modules/luci-base/luasrc/model/uci.lua -+++ b/modules/luci-base/luasrc/model/uci.lua -@@ -9,7 +9,7 @@ local table = require "table" - - local setmetatable, rawget, rawset = setmetatable, rawget, rawset - local require, getmetatable = require, getmetatable --local error, pairs, ipairs = error, pairs, ipairs -+local error, pairs, ipairs, next = error, pairs, ipairs, next - local type, tostring, tonumber, unpack = type, tostring, tonumber, unpack - - -- The typical workflow for UCI is: Get a cursor instance from the -@@ -150,6 +150,40 @@ function Cursor.set_list(self, config, section, option, value) - return false - end - -+function Cursor.add_to_set(self, config, section, option, value, remove) -+ local list = self:get_list(config, section, option) -+ -+ if not list then -+ return false -+ end -+ -+ local set = {} -+ for _, l in ipairs(list) do -+ set[l] = true -+ end -+ -+ if remove then -+ set[value] = nil -+ else -+ set[value] = true -+ end -+ -+ list = {} -+ for k, _ in pairs(set) do -+ table.insert(list, k) -+ end -+ -+ if next(list) == nil then -+ return self:delete(config, section, option) -+ else -+ return self:set(config, section, option, list) -+ end -+end -+ -+function Cursor.remove_from_set(self, config, section, option, value) -+ self:add_to_set(config, section, option, value, true) -+end -+ - -- Return a list of initscripts affected by configuration changes. - function Cursor._affected(self, configlist) - configlist = type(configlist) == "table" and configlist or {configlist} -diff --git a/modules/luci-base/luasrc/model/uci.luadoc b/modules/luci-base/luasrc/model/uci.luadoc -index 49093c7930128f1e6de6f739662b96adcc43fe74..cfec9eea7922da551cb8d2a4f2c540d479b8ccbe 100644 ---- a/modules/luci-base/luasrc/model/uci.luadoc -+++ b/modules/luci-base/luasrc/model/uci.luadoc -@@ -118,6 +118,30 @@ has the same effect as deleting the option. - ]] - - ---[[ -+Add a given value to a list of unique values. -+ -+@class function -+@name Cursor.add_to_set -+@param config UCI config -+@param section UCI section name -+@param option UCI option -+@param value UCI value -+@return Boolean whether operation succeeded -+]] -+ -+---[[ -+Remove a given value from a list of unique values. -+ -+@class function -+@name Cursor.add_to_set -+@param config UCI config -+@param section UCI section name -+@param option UCI option -+@param value UCI value -+@return Boolean whether operation succeeded -+]] -+ -+---[[ - Create a sub-state of this cursor. The sub-state is tied to the parent - - curser, means it the parent unloads or loads configs, the sub state will From 78b2775eecd2ba9182b47c255c0229ee81c8c7da Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 18 Jan 2017 17:21:43 +0100 Subject: [PATCH 109/126] Use LEDE as base for Gluon --- .gitignore | 5 +- LICENSE | 10 +- Makefile | 572 +- docs/dev/hardware.rst | 128 +- docs/site-example/site.mk | 5 +- docs/user/getting_started.rst | 52 +- docs/user/site.rst | 16 +- include/config | 22 - include/gluon.mk | 85 - include/toplevel.mk | 62 - include/verbose.mk | 67 - modules | 10 +- overlay/opkg.mk | 2 + package/gluon-autoupdater/Makefile | 19 +- package/gluon-core/Makefile | 14 +- package/gluon-core/check_site.lua | 2 +- .../luasrc/lib/gluon/upgrade/500-opkg | 65 +- .../lib/gluon/setup-mode/rc.d/K50dropbear | 1 - .../lib/gluon/setup-mode/rc.d/S13haveged | 2 +- .../lib/gluon/setup-mode/rc.d/S50dropbear | 22 +- .../files/lib/gluon/setup-mode/rc.d/S50telnet | 12 - package/gluon-site/Makefile | 25 +- package/gluon.mk | 19 +- ...o-a-common-directory-for-all-targets.patch | 111 + ...ort-for-alternative-rc.d-directories.patch | 0 ...-files-disable-reset-button-handling.patch | 43 + ...apd-prevent-channel-switch-for-5GHz.patch} | 0 ...r-custom-format-strings-for-doubles.patch} | 0 ...lways-allow-password-less-root-login.patch | 69 + ...le-fix-host-tools-build-dependencies.patch | 36 - ...f9f4b4da9d1960f82e68ae797290e4b9c434.patch | 118 - ...s-really-empty-not-when-it-is-locked.patch | 26 - ...-files-disable-reset-button-handling.patch | 32 - ...fine-wmac-reset-function-for-QCA955x.patch | 85 - .../0007-mac80211-hostapd-iw-.-update.patch | 25894 ---------------- ...ate-NanoStation-Loco-txpower-offsets.patch | 24 - ...ts-with-prohibited-blackholed-source.patch | 57 - ...stallation-of-headers-for-host-build.patch | 16 - ...malloc-instead-of-oom-kill-processes.patch | 63 - .../0013-fix-UBNT-XM-model-detection.patch | 74 - ...files-implemented-basic-GPIO-control.patch | 133 - ...-pin-for-Ubiquiti-Nanostation-models.patch | 32 - ...0016-netifd-update-to-latest-version.patch | 101 - ...xport_bootpart-for-Xen-virtual-disks.patch | 25 - ...port-LibreSSL-as-provider-of-openssl.patch | 27 - ...HWREV-on-upgrades-of-TP-LINK-devices.patch | 48 - ...a-space-on-some-TP-LINK-like-devices.patch | 45 - ...XX_MODEL-to-match-labels-image-names.patch | 39 - ...r71xx-build-image-for-TL-WR710N-v2.1.patch | 41 - ...igure-compatiblity-with-POSIX-shells.patch | 2026 -- ...was-only-added-in-the-latest-version.patch | 81 - ...compile-flock-before-everything-else.patch | 31 - ...-fall-back-to-unlocked-shell-command.patch | 32 - ...ce-conditions-with-multiple-variants.patch | 20 - ...ix-packed-checkout-mirroring-support.patch | 26 - ...l-backport-spi-nor-driver-from-4.4.9.patch | 2096 -- ...til-status-register-writes-are-ready.patch | 115 - ...el-mtd-spi-nor-unlock-Winbond-flashs.patch | 56 - ...9561-set-phy-interface-mode-and-mask.patch | 46 - ...ion-register-bitmask-for-QCA956x-SoC.patch | 33 - .../0034-ar71xx-update-QCA956x-support.patch | 415 - ...or-QCA956x-ethernet.patch-into-files.patch | 176 - ...ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch | 22 - ...-fix-qca956x-ethernet-initialization.patch | 64 - ...upport-for-Ubiquiti-UniFi-AP-AC-LITE.patch | 562 - ...th0-support-for-Ubiquiti-UniFi-AP-AC.patch | 21 - ...r71xx-Rename-unifiac-to-unifiac-lite.patch | 193 - ...support-for-Ubiquiti-UniFi-AP-AC-PRO.patch | 274 - ...tuner-support-for-UniFi-Outdoor-Plus.patch | 395 - ...xx-Send-power-to-USB-port-on-WNR2200.patch | 41 - ...71xx-WNR2200-fix-for-random-WLAN-MAC.patch | 86 - ...able-control-of-all-LEDs-and-buttons.patch | 251 - .../0047-ar71xx-add-GL-AR150-support.patch | 326 - ...-j-for-parallel-builds-with-Make-4.2.patch | 48 - ...ake-fix-parallel-build-with-Make-4.2.patch | 30 - ...-IPv6-builtin-if-selected-saves-30KB.patch | 143 - ...kages-with-multiple-PROVIDES-entries.patch | 21 - ...mod-crypto-core-and-kmod-crypto-arc4.patch | 154 - ...on-hexdump-for-image-build-signature.patch | 24 - ...0054-mt76-fix-build-with-kernel-3.18.patch | 34 - ...s-Support-LEDs-on-D-Link-DIR-860L-B1.patch | 41 - ...s-known-to-userspace-for-DIR-860L-B1.patch | 56 - ...LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch | 22 - ...-support-for-TP-LINK-TL-WR842N-ND-v3.patch | 323 - ...9-x86-generic-enable-CONFIG_SATA_VIA.patch | 18 - ...ncy-of-install-shared-so-make-target.patch | 45 - ...n-detection-for-D-Link-DIR-505-A1-A2.patch | 38 - ...505-status-LED-as-ethernet-indicator.patch | 28 - ...10-enable-LNA-for-CPE210-220-510-520.patch | 35 - ...le-into-2-profiles-cpe210-and-cpe510.patch | 169 - ...cf518d5e2b7d6526fd7a87a88a268030694a.patch | 555 - ...1xx-split-CPE210-from-CPE510-profile.patch | 26 - ...85c21ae0ede4e15e66cbd801b9fb502531df.patch | 437 - ...r71xx-Added-support-for-TL-WA801NDv3.patch | 567 - ...62bc0ea4010ddbfbd738453c9db70988a57c.patch | 856 - ...support-for-new-TP-Link-region-codes.patch | 38 - ...ware-add-ath10k-firmware-qca988x-11s.patch | 68 - ...re-compensation-support-patch-FS-111.patch | 124 - ...ing-patch-until-it-is-fixed-properly.patch | 885 - ...egion-code-for-TP-Link-TL-WA901ND-v4.patch | 29 - ...ax-error-in-etc-uci-defaults-01_leds.patch | 21 - ...ry-images-for-TP-Link-TL-WR841ND-v11.patch | 26 - .../0077-x86-64-add-pata-drivers.patch | 23 - ...78-x86-add-mmc-drivers-to-generic-64.patch | 42 - ...gpio_get-to-return-0-or-1-on-success.patch | 43 - ...flickering-on-devices-using-rsslieds.patch | 101 - ...kernel-add-at803x-fix-for-sgmii-mode.patch | 114 - ...sysupgrade-support-for-TL-WA801ND-v3.patch | 70 - ...detection-for-TP-Link-Pharos-devices.patch | 40 - ...add-Support-for-TP-LINK-TL-WR940N-v4.patch | 400 - ...eserve-partition-table-on-sysupgrade.patch | 135 - ...6-make-sysupgrade-work-without-partx.patch | 74 - ...-search-PARTUUID-in-any-block-device.patch | 22 - ...e-partition-discovery-for-sysupgrade.patch | 182 - ...-to-more-generic-mktplinkfw-combined.patch | 39 - ...ort-for-TL-WR1043ND-v4-to-mktplinkfw.patch | 36 - ...-add-support-for-TP-LINK-WR1043ND-v4.patch | 464 - ...d-support-for-TP-Link-WBS210-510-1.2.patch | 81 - ...x-add-support-for-TP-Link-WBS210-510.patch | 235 - ...itching-of-the-ath-regulatory-domain.patch | 70 - ...ass-STAGING_DIR_HOST-to-Host-Install.patch | 32 - ...n-host-to-HOST_BUILD_DEPENDS-as-well.patch | 18 - ...002-lua-cjson-add-host-build-support.patch | 32 - .../openwrt/0003-libuecc-update-to-v7.patch | 34 - .../openwrt/0004-fastd-update-to-v18.patch | 88 - .../0005-node-update-to-v0.12.14.patch | 49 - ...ur-leading-to-broken-code-with-GCC-6.patch | 80 - ...use-shared-instead-of-static-library.patch | 68 - scripts/check_site.sh | 6 - scripts/clean_output.sh | 20 + scripts/common.inc.sh | 66 + scripts/copy_output.sh | 157 + scripts/feeds.sh | 29 + scripts/generate_manifest.sh | 79 + scripts/modules.sh | 4 +- scripts/patch.sh | 15 +- scripts/site.sh | 4 +- scripts/site_config.lua | 4 +- scripts/target_config.sh | 77 + scripts/target_config_check.sh | 91 + scripts/update-patches.sh | 9 +- scripts/update.sh | 5 +- targets/ar71xx-generic | 241 + targets/ar71xx-generic/config | 1 - targets/ar71xx-generic/profiles.mk | 431 - targets/ar71xx-mikrotik | 6 + targets/ar71xx-mikrotik/profiles.mk | 10 - targets/ar71xx-nand | 7 + targets/ar71xx-nand/profiles.mk | 10 - targets/ar71xx-tiny | 88 + targets/brcm2708-bcm2708 | 3 + targets/brcm2708-bcm2708/profiles.mk | 4 - targets/brcm2708-bcm2709 | 3 + targets/brcm2708-bcm2709/profiles.mk | 4 - targets/generic | 14 + targets/mpc85xx-generic | 5 + targets/mpc85xx-generic/profiles.mk | 7 - targets/mvebu | 2 + targets/mvebu/profiles.mk | 10 - targets/ramips-mt7621 | 3 + targets/ramips-mt7621/profiles.mk | 4 - targets/ramips-rt305x | 7 + targets/ramips-rt305x/profiles.mk | 6 - targets/sunxi | 9 + targets/sunxi/profiles.mk | 17 - targets/targets.mk | 4 +- targets/x86-64 | 9 + targets/x86-64/config | 2 - targets/x86-64/profiles.mk | 17 - targets/x86-generic | 9 + targets/x86-generic/config | 2 - targets/x86-generic/profiles.mk | 17 - targets/x86-kvm_guest/profiles.mk | 4 - targets/x86-xen_domu | 2 + targets/x86-xen_domu/profiles.mk | 4 - 175 files changed, 1530 insertions(+), 43175 deletions(-) delete mode 100644 include/config delete mode 100644 include/gluon.mk delete mode 100644 include/toplevel.mk delete mode 100644 include/verbose.mk create mode 100644 overlay/opkg.mk delete mode 120000 package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K50dropbear mode change 120000 => 100755 package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear delete mode 100755 package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50telnet create mode 100644 patches/lede/0001-build-move-STAGING_DIR_HOSTPKG-and-BUILD_DIR_HOST-back-to-a-common-directory-for-all-targets.patch rename patches/{openwrt => lede}/0002-procd-add-support-for-alternative-rc.d-directories.patch (100%) create mode 100644 patches/lede/0003-base-files-disable-reset-button-handling.patch rename patches/{openwrt/0009-hostapd-prevent-channel-switch-for-5GHz.patch => lede/0004-hostapd-prevent-channel-switch-for-5GHz.patch} (100%) rename patches/{openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch => lede/0005-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch} (100%) create mode 100644 patches/lede/0006-dropbear-add-a-failsafe-mode-that-will-always-allow-password-less-root-login.patch delete mode 100644 patches/openwrt/0001-tools-Makefile-fix-host-tools-build-dependencies.patch delete mode 100644 patches/openwrt/0003-odhcp6c-backport-from-LEDE-0d49f9f4b4da9d1960f82e68ae797290e4b9c434.patch delete mode 100644 patches/openwrt/0004-busybox-enable-telnet-only-when-root-password-is-really-empty-not-when-it-is-locked.patch delete mode 100644 patches/openwrt/0005-base-files-disable-reset-button-handling.patch delete mode 100644 patches/openwrt/0006-ar71xx-define-wmac-reset-function-for-QCA955x.patch delete mode 100644 patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch delete mode 100644 patches/openwrt/0008-iwinfo-update-NanoStation-Loco-txpower-offsets.patch delete mode 100644 patches/openwrt/0010-ipv6-fix-crash-on-ICMPv6-redirects-with-prohibited-blackholed-source.patch delete mode 100644 patches/openwrt/0011-lua-fix-installation-of-headers-for-host-build.patch delete mode 100644 patches/openwrt/0012-kernel-fs-seq_file-fallback-to-vmalloc-instead-of-oom-kill-processes.patch delete mode 100644 patches/openwrt/0013-fix-UBNT-XM-model-detection.patch delete mode 100644 patches/openwrt/0014-base-files-implemented-basic-GPIO-control.patch delete mode 100644 patches/openwrt/0015-ar71xx-assign-proper-GPIO-pin-for-Ubiquiti-Nanostation-models.patch delete mode 100644 patches/openwrt/0016-netifd-update-to-latest-version.patch delete mode 100644 patches/openwrt/0017-x86-fix-platform_export_bootpart-for-Xen-virtual-disks.patch delete mode 100644 patches/openwrt/0018-Support-LibreSSL-as-provider-of-openssl.patch delete mode 100644 patches/openwrt/0019-ar71xx-check-both-HWID-and-HWREV-on-upgrades-of-TP-LINK-devices.patch delete mode 100644 patches/openwrt/0020-ar71xx-avoid-AR71XX_MODEL-ending-with-a-space-on-some-TP-LINK-like-devices.patch delete mode 100644 patches/openwrt/0021-ar71xx-fix-the-revision-of-a-few-TP-LINK-devices-in-AR71XX_MODEL-to-match-labels-image-names.patch delete mode 100644 patches/openwrt/0022-ar71xx-build-image-for-TL-WR710N-v2.1.patch delete mode 100644 patches/openwrt/0023-xtables-addons-build-fix-configure-compatiblity-with-POSIX-shells.patch delete mode 100644 patches/openwrt/0024-tools-add-tar-host-build-required-for-sort-name-which-was-only-added-in-the-latest-version.patch delete mode 100644 patches/openwrt/0025-tools-compile-flock-before-everything-else.patch delete mode 100644 patches/openwrt/0026-rules.mk-make-the-locked-template-available-even-if-flock-has-not-been-built-yet-fall-back-to-unlocked-shell-command.patch delete mode 100644 patches/openwrt/0027-build-add-locking-for-downloads-fixes-race-conditions-with-multiple-variants.patch delete mode 100644 patches/openwrt/0028-download.mk-fix-packed-checkout-mirroring-support.patch delete mode 100644 patches/openwrt/0029-kernel-backport-spi-nor-driver-from-4.4.9.patch delete mode 100644 patches/openwrt/0030-kernel-mtd-spi-nor-wait-until-status-register-writes-are-ready.patch delete mode 100644 patches/openwrt/0031-kernel-mtd-spi-nor-unlock-Winbond-flashs.patch delete mode 100644 patches/openwrt/0032-ath79-dev-eth-fix-QCA9561-set-phy-interface-mode-and-mask.patch delete mode 100644 patches/openwrt/0033-ar71xx-use-correct-PLL-configuration-register-bitmask-for-QCA956x-SoC.patch delete mode 100644 patches/openwrt/0034-ar71xx-update-QCA956x-support.patch delete mode 100644 patches/openwrt/0035-ar71xx-fold-patch-622-MIPS-ath79-add-support-for-QCA956x-ethernet.patch-into-files.patch delete mode 100644 patches/openwrt/0036-ar71xx-fix-MDIO-bus-probe-on-QCA956x.patch delete mode 100644 patches/openwrt/0037-ar71xx-fix-qca956x-ethernet-initialization.patch delete mode 100644 patches/openwrt/0038-ar71xx-Support-for-Ubiquiti-UniFi-AP-AC-LITE.patch delete mode 100644 patches/openwrt/0039-ar71xx-Fix-eth0-support-for-Ubiquiti-UniFi-AP-AC.patch delete mode 100644 patches/openwrt/0040-ar71xx-Rename-unifiac-to-unifiac-lite.patch delete mode 100644 patches/openwrt/0041-ar71xx-Add-support-for-Ubiquiti-UniFi-AP-AC-PRO.patch delete mode 100644 patches/openwrt/0043-ath9k-add-HSR-tuner-support-for-UniFi-Outdoor-Plus.patch delete mode 100644 patches/openwrt/0044-ar71xx-Send-power-to-USB-port-on-WNR2200.patch delete mode 100644 patches/openwrt/0045-ar71xx-WNR2200-fix-for-random-WLAN-MAC.patch delete mode 100644 patches/openwrt/0046-ar71xx-WNR2200-enable-control-of-all-LEDs-and-buttons.patch delete mode 100644 patches/openwrt/0047-ar71xx-add-GL-AR150-support.patch delete mode 100644 patches/openwrt/0048-build-don-t-add-j-for-parallel-builds-with-Make-4.2.patch delete mode 100644 patches/openwrt/0049-tools-cmake-fix-parallel-build-with-Make-4.2.patch delete mode 100644 patches/openwrt/0050-linux-make-IPv6-builtin-if-selected-saves-30KB.patch delete mode 100644 patches/openwrt/0051-package-ipkg.mk-fix-Provides-for-packages-with-multiple-PROVIDES-entries.patch delete mode 100644 patches/openwrt/0052-kernel-remove-packaging-of-kmod-crypto-core-and-kmod-crypto-arc4.patch delete mode 100644 patches/openwrt/0053-x86-stop-relying-on-hexdump-for-image-build-signature.patch delete mode 100644 patches/openwrt/0054-mt76-fix-build-with-kernel-3.18.patch delete mode 100644 patches/openwrt/0055-ramips-Support-LEDs-on-D-Link-DIR-860L-B1.patch delete mode 100644 patches/openwrt/0056-ramips-add-button-support-and-make-LEDs-known-to-userspace-for-DIR-860L-B1.patch delete mode 100644 patches/openwrt/0057-ramips-set-correct-LAN-WAN-MAC-addresses-on-DIR-860L-B1.patch delete mode 100644 patches/openwrt/0058-ar71xx-add-support-for-TP-LINK-TL-WR842N-ND-v3.patch delete mode 100644 patches/openwrt/0059-x86-generic-enable-CONFIG_SATA_VIA.patch delete mode 100644 patches/openwrt/0060-libpcap-fix-dependency-of-install-shared-so-make-target.patch delete mode 100644 patches/openwrt/0061-ar71xx-add-revision-detection-for-D-Link-DIR-505-A1-A2.patch delete mode 100644 patches/openwrt/0062-ar71xx-don-t-use-D-Link-DIR-505-status-LED-as-ethernet-indicator.patch delete mode 100644 patches/openwrt/0063-ar71xx-cpe510-enable-LNA-for-CPE210-220-510-520.patch delete mode 100644 patches/openwrt/0064-ar71xx-cpe510-split-profile-into-2-profiles-cpe210-and-cpe510.patch delete mode 100644 patches/openwrt/0065-firmware-utils-backport-tplink-safeloader-from-LEDE-05abcf518d5e2b7d6526fd7a87a88a268030694a.patch delete mode 100644 patches/openwrt/0066-ar71xx-split-CPE210-from-CPE510-profile.patch delete mode 100644 patches/openwrt/0067-dropbear-update-to-LEDE-277f85c21ae0ede4e15e66cbd801b9fb502531df.patch delete mode 100644 patches/openwrt/0068-ar71xx-Added-support-for-TL-WA801NDv3.patch delete mode 100644 patches/openwrt/0069-firmware-utils-mktplinkfw-backport-from-LEDE-a4fc62bc0ea4010ddbfbd738453c9db70988a57c.patch delete mode 100644 patches/openwrt/0070-ar71xx-backport-support-for-new-TP-Link-region-codes.patch delete mode 100644 patches/openwrt/0071-ath10k-firmware-add-ath10k-firmware-qca988x-11s.patch delete mode 100644 patches/openwrt/0072-ath9k-revert-temperature-compensation-support-patch-FS-111.patch delete mode 100644 patches/openwrt/0073-ath9k-remove-intermediate-queueing-patch-until-it-is-fixed-properly.patch delete mode 100644 patches/openwrt/0074-ar71xx-set-EU-region-code-for-TP-Link-TL-WA901ND-v4.patch delete mode 100644 patches/openwrt/0075-ar71xx-fix-syntax-error-in-etc-uci-defaults-01_leds.patch delete mode 100644 patches/openwrt/0076-ar71xx-generate-region-coded-factory-images-for-TP-Link-TL-WR841ND-v11.patch delete mode 100644 patches/openwrt/0077-x86-64-add-pata-drivers.patch delete mode 100644 patches/openwrt/0078-x86-add-mmc-drivers-to-generic-64.patch delete mode 100644 patches/openwrt/0079-ath9k-fix-ath9k_hw_gpio_get-to-return-0-or-1-on-success.patch delete mode 100644 patches/openwrt/0080-ar71xx-ramips-reduce-CPU-load-and-flickering-on-devices-using-rsslieds.patch delete mode 100644 patches/openwrt/0081-kernel-add-at803x-fix-for-sgmii-mode.patch delete mode 100644 patches/openwrt/0082-ar71xx-fix-LEDs-and-sysupgrade-support-for-TL-WA801ND-v3.patch delete mode 100644 patches/openwrt/0083-ar71xx-simplify-model-detection-for-TP-Link-Pharos-devices.patch delete mode 100644 patches/openwrt/0084-ar71xx-generic-add-Support-for-TP-LINK-TL-WR940N-v4.patch delete mode 100644 patches/openwrt/0085-x86-preserve-partition-table-on-sysupgrade.patch delete mode 100644 patches/openwrt/0086-x86-make-sysupgrade-work-without-partx.patch delete mode 100644 patches/openwrt/0087-x86-search-PARTUUID-in-any-block-device.patch delete mode 100644 patches/openwrt/0088-x86-generalize-partition-discovery-for-sysupgrade.patch delete mode 100644 patches/openwrt/0089-ar71xx-rename-mktplinkfw-initramfs-to-more-generic-mktplinkfw-combined.patch delete mode 100644 patches/openwrt/0090-firmware-utils-add-support-for-TL-WR1043ND-v4-to-mktplinkfw.patch delete mode 100644 patches/openwrt/0091-ar71xx-add-support-for-TP-LINK-WR1043ND-v4.patch delete mode 100644 patches/openwrt/0092-firmware-utils-tplink-safeloader-add-support-for-TP-Link-WBS210-510-1.2.patch delete mode 100644 patches/openwrt/0093-ar71xx-add-support-for-TP-Link-WBS210-510.patch delete mode 100644 patches/openwrt/0094-mac80211-Allow-switching-of-the-ath-regulatory-domain.patch delete mode 100644 patches/openwrt/0095-build-pass-STAGING_DIR_HOST-to-Host-Install.patch delete mode 100644 patches/packages/openwrt/0001-node-add-python-host-to-HOST_BUILD_DEPENDS-as-well.patch delete mode 100644 patches/packages/openwrt/0002-lua-cjson-add-host-build-support.patch delete mode 100644 patches/packages/openwrt/0003-libuecc-update-to-v7.patch delete mode 100644 patches/packages/openwrt/0004-fastd-update-to-v18.patch delete mode 100644 patches/packages/openwrt/0005-node-update-to-v0.12.14.patch delete mode 100644 patches/packages/openwrt/0006-node-fix-undefined-behaviour-leading-to-broken-code-with-GCC-6.patch delete mode 100644 patches/packages/openwrt/0007-libuecc-use-shared-instead-of-static-library.patch delete mode 100755 scripts/check_site.sh create mode 100755 scripts/clean_output.sh create mode 100644 scripts/common.inc.sh create mode 100755 scripts/copy_output.sh create mode 100755 scripts/feeds.sh create mode 100755 scripts/generate_manifest.sh create mode 100755 scripts/target_config.sh create mode 100755 scripts/target_config_check.sh create mode 100644 targets/ar71xx-generic delete mode 100644 targets/ar71xx-generic/config delete mode 100644 targets/ar71xx-generic/profiles.mk create mode 100644 targets/ar71xx-mikrotik delete mode 100644 targets/ar71xx-mikrotik/profiles.mk create mode 100644 targets/ar71xx-nand delete mode 100644 targets/ar71xx-nand/profiles.mk create mode 100644 targets/ar71xx-tiny create mode 100644 targets/brcm2708-bcm2708 delete mode 100644 targets/brcm2708-bcm2708/profiles.mk create mode 100644 targets/brcm2708-bcm2709 delete mode 100644 targets/brcm2708-bcm2709/profiles.mk create mode 100644 targets/generic create mode 100644 targets/mpc85xx-generic delete mode 100644 targets/mpc85xx-generic/profiles.mk create mode 100644 targets/mvebu delete mode 100644 targets/mvebu/profiles.mk create mode 100644 targets/ramips-mt7621 delete mode 100644 targets/ramips-mt7621/profiles.mk create mode 100644 targets/ramips-rt305x delete mode 100644 targets/ramips-rt305x/profiles.mk create mode 100644 targets/sunxi delete mode 100644 targets/sunxi/profiles.mk create mode 100644 targets/x86-64 delete mode 100644 targets/x86-64/config delete mode 100644 targets/x86-64/profiles.mk create mode 100644 targets/x86-generic delete mode 100644 targets/x86-generic/config delete mode 100644 targets/x86-generic/profiles.mk delete mode 100644 targets/x86-kvm_guest/profiles.mk create mode 100644 targets/x86-xen_domu delete mode 100644 targets/x86-xen_domu/profiles.mk diff --git a/.gitignore b/.gitignore index 2b6cabec..ab2b03cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ *~ -/build +/lede /output /site -/openwrt +/tmp /packages -/modules.local diff --git a/LICENSE b/LICENSE index 81ed5a23..a9adc369 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ The code of Project Gluon may be distributed under the following terms, unless noted otherwise in individual files or subtrees. -Copyright (c) 2013, Project Gluon +Copyright (c) 2013-2017, Project Gluon All rights reserved. Redistribution and use in source and binary forms, with or without @@ -25,10 +25,10 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -OpenWrt is licensed under the terms of the GNU General Public License Version 2, -which can be found under openwrt/LICENSE after the openwrt submodule has been -obtained. This applies to the following submodules: - * openwrt +LEDE and OpenWrt are licensed under the terms of the GNU General Public License +Version 2, which can be found at lede/LICENSE after the lede repository has been +obtained. This applies to the following repositories: + * lede * packages/openwrt * packages/routing * packages/luci diff --git a/Makefile b/Makefile index 26829692..aa426f30 100644 --- a/Makefile +++ b/Makefile @@ -4,503 +4,153 @@ LC_ALL:=C LANG:=C export LC_ALL LANG -export SHELL:=/usr/bin/env bash -GLUONPATH ?= $(PATH) -export GLUONPATH := $(GLUONPATH) +GLUON_SITEDIR ?= $(CURDIR)/site +GLUON_TMPDIR ?= $(CURDIR)/tmp -empty:= -space:= $(empty) $(empty) +GLUON_OUTPUTDIR ?= $(CURDIR)/output +GLUON_IMAGEDIR ?= $(GLUON_OUTPUTDIR)/images +GLUON_PACKAGEDIR ?= $(GLUON_OUTPUTDIR)/packages -GLUONMAKE_EARLY = PATH=$(GLUONPATH) $(SUBMAKE) -C $(GLUON_ORIGOPENWRTDIR) -f $(GLUONDIR)/Makefile GLUON_TOOLS=0 QUILT= -GLUONMAKE = PATH=$(GLUONPATH) $(SUBMAKE) -C $(GLUON_OPENWRTDIR) -f $(GLUONDIR)/Makefile +export GLUON_TMPDIR GLUON_IMAGEDIR GLUON_PACKAGEDIR DEVICES -ifneq ($(OPENWRT_BUILD),1) -GLUONDIR:=${CURDIR} +$(GLUON_SITEDIR)/site.mk: + $(error No site configuration was found. Please check out a site configuration to $(GLUON_SITEDIR)) -include $(GLUONDIR)/include/gluon.mk +-include $(GLUON_SITEDIR)/site.mk -TOPDIR:=$(GLUON_ORIGOPENWRTDIR) -export TOPDIR +ifeq ($(GLUON_RELEASE),) +$(error GLUON_RELEASE not set. GLUON_RELEASE can be set in site.mk or on the command line.) +endif + +GLUON_LANGS ?= en + +export GLUON_RELEASE GLUON_ATH10K_MESH GLUON_REGION update: FORCE - $(GLUONDIR)/scripts/update.sh - $(GLUONDIR)/scripts/patch.sh + @scripts/update.sh + @scripts/patch.sh + @scripts/feeds.sh update-patches: FORCE - $(GLUONDIR)/scripts/update.sh - $(GLUONDIR)/scripts/update-patches.sh - $(GLUONDIR)/scripts/patch.sh + @scripts/update.sh + @scripts/update-patches.sh + @scripts/patch.sh --include $(TOPDIR)/include/host.mk - -_SINGLE=export MAKEFLAGS=$(space); - -override OPENWRT_BUILD=1 -override GLUON_TOOLS=1 -GREP_OPTIONS= -export OPENWRT_BUILD GLUON_TOOLS GREP_OPTIONS - --include $(TOPDIR)/include/debug.mk --include $(TOPDIR)/include/depends.mk -include $(GLUONDIR)/include/toplevel.mk +update-feeds: FORCE + @scripts/feeds.sh -include $(GLUONDIR)/targets/targets.mk +GLUON_TARGETS := + +define GluonTarget +gluon_target := $(1)$$(if $(2),-$(2)) +GLUON_TARGETS += $$(gluon_target) +GLUON_TARGET_$$(gluon_target)_BOARD := $(1) +GLUON_TARGET_$$(gluon_target)_SUBTARGET := $(if $(3),$(3),$(2)) +endef + +include targets/targets.mk -CheckTarget := [ -n '$(GLUON_TARGET)' -a -n '$(GLUON_TARGET_$(GLUON_TARGET)_BOARD)' ] \ - || (echo -e 'Please set GLUON_TARGET to a valid target. Gluon supports the following targets:$(subst $(space),\n * ,$(GLUON_TARGETS))'; false) +LEDEMAKE = $(MAKE) -C lede + +BOARD := $(GLUON_TARGET_$(GLUON_TARGET)_BOARD) +SUBTARGET := $(GLUON_TARGET_$(GLUON_TARGET)_SUBTARGET) +LEDE_TARGET := $(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) + +export LEDE_TARGET -CheckExternal := test -d $(GLUON_ORIGOPENWRTDIR) || (echo 'You don'"'"'t seem to have obtained the external repositories needed by Gluon; please call `make update` first!'; false) +CheckTarget := [ '$(LEDE_TARGET)' ] \ + || (echo 'Please set GLUON_TARGET to a valid target. Gluon supports the following targets:'; $(foreach target,$(GLUON_TARGETS),echo ' * $(target)';) false) + +CheckExternal := test -d lede || (echo 'You don'"'"'t seem to have obtained the external repositories needed by Gluon; please call `make update` first!'; false) -create-key: FORCE - @$(CheckExternal) - +@$(GLUONMAKE_EARLY) create-key +GLUON_DEFAULT_PACKAGES := -odhcpd -ppp -ppp-mod-pppoe -wpad-mini gluon-core ip6tables hostapd-mini -prepare-target: FORCE +GLUON_PACKAGES := +define merge_packages + $(foreach pkg,$(1), + GLUON_PACKAGES := $$(strip $$(filter-out -$$(patsubst -%,%,$(pkg)) $$(patsubst -%,%,$(pkg)),$$(GLUON_PACKAGES)) $(pkg)) + ) +endef +$(eval $(call merge_packages,$(GLUON_DEFAULT_PACKAGES) $(GLUON_SITE_PACKAGES))) + +GLUON_PACKAGES_YES := $(filter-out -%,$(GLUON_PACKAGES)) +GLUON_PACKAGES_NO := $(patsubst -%,%,$(filter -%,$(GLUON_PACKAGES))) + + +config: FORCE @$(CheckExternal) @$(CheckTarget) - +@$(GLUONMAKE_EARLY) prepare-target + + @( \ + echo 'CONFIG_TARGET_$(BOARD)=y' \ + $(if $(SUBTARGET),&& echo 'CONFIG_TARGET_$(BOARD)_$(SUBTARGET)=y') \ + $(foreach pkg,$(GLUON_PACKAGES_NO),&& echo '# CONFIG_PACKAGE_$(pkg) is not set') \ + && scripts/target_config.sh generic \ + && GLUON_SITEDIR='$(GLUON_SITEDIR)' scripts/target_config.sh '$(GLUON_TARGET)' \ + $(foreach pkg,$(GLUON_PACKAGES_YES),&& echo 'CONFIG_PACKAGE_$(pkg)=y') \ + $(foreach lang,$(GLUON_LANGS),&& echo 'CONFIG_LUCI_LANG_$(lang)=y') \ + && echo 'CONFIG_GLUON_RELEASE="$(GLUON_RELEASE)"' \ + && echo 'CONFIG_GLUON_SITEDIR="$(GLUON_SITEDIR)"' \ + && echo 'CONFIG_GLUON_BRANCH="$(GLUON_BRANCH)"' \ + ) > lede/.config + +@$(LEDEMAKE) defconfig + + @GLUON_SITEDIR='$(GLUON_SITEDIR)' scripts/target_config_check.sh '$(GLUON_TARGET)' '$(GLUON_PACKAGES_YES)' + + +LUA := lede/staging_dir/hostpkg/bin/lua + +$(LUA): + @$(CheckExternal) + + +@[ -e lede/.config ] || $(LEDEMAKE) defconfig + +@$(LEDEMAKE) tools/install + +@$(LEDEMAKE) package/lua/host/install + +prepare-target: config $(LUA) ; all: prepare-target - +@$(GLUONMAKE) build-key - +@$(GLUONMAKE) prepare - +@$(GLUONMAKE) images - +@$(GLUONMAKE) modules + @GLUON_SITEDIR='$(GLUON_SITEDIR)' $(LUA) scripts/site_config.lua \ + || (echo 'Your site configuration did not pass validation.'; false) -prepare: prepare-target - +@$(GLUONMAKE) build-key - +@$(GLUONMAKE) $@ + @scripts/clean_output.sh + +@$(LEDEMAKE) + @GLUON_SITEDIR='$(GLUON_SITEDIR)' scripts/copy_output.sh '$(GLUON_TARGET)' -clean download images modules: FORCE - @$(CheckExternal) - @$(CheckTarget) - +@$(GLUONMAKE_EARLY) maybe-prepare-target - +@$(GLUONMAKE) build-key - +@$(GLUONMAKE) $@ +clean download: config + +@$(LEDEMAKE) $@ -toolchain/% package/% target/% image/%: FORCE - @$(CheckExternal) - @$(CheckTarget) - +@$(GLUONMAKE_EARLY) maybe-prepare-target - +@$(GLUONMAKE) build-key - +@$(GLUONMAKE) $@ +dirclean: FORCE + +@[ -e lede/.config ] || $(LEDEMAKE) defconfig + +@$(LEDEMAKE) dirclean + @rm -rf $(GLUON_TMPDIR) $(GLUON_OUTPUTDIR) -manifest: FORCE - @[ -n '$(GLUON_BRANCH)' ] || (echo 'Please set GLUON_BRANCH to create a manifest.'; false) +manifest: $(LUA) FORCE + @[ '$(GLUON_BRANCH)' ] || (echo 'Please set GLUON_BRANCH to create a manifest.'; false) @echo '$(GLUON_PRIORITY)' | grep -qE '^([0-9]*\.)?[0-9]+$$' || (echo 'Please specify a numeric value for GLUON_PRIORITY to create a manifest.'; false) @$(CheckExternal) - ( \ + @( \ echo 'BRANCH=$(GLUON_BRANCH)' && \ - echo 'DATE=$(shell $(GLUON_ORIGOPENWRTDIR)/staging_dir/host/bin/lua $(GLUONDIR)/scripts/rfc3339date.lua)' && \ + echo "DATE=$$($(LUA) scripts/rfc3339date.lua)" && \ echo 'PRIORITY=$(GLUON_PRIORITY)' && \ - echo \ - ) > $(GLUON_BUILDDIR)/$(GLUON_BRANCH).manifest.tmp - - +($(foreach GLUON_TARGET,$(GLUON_TARGETS), \ - ( [ ! -e $(BOARD_BUILDDIR)/prepared ] || ( $(GLUONMAKE) manifest GLUON_TARGET='$(GLUON_TARGET)' V=s$(OPENWRT_VERBOSE) ) ) && \ - ) :) - - mkdir -p $(GLUON_IMAGEDIR)/sysupgrade - mv $(GLUON_BUILDDIR)/$(GLUON_BRANCH).manifest.tmp $(GLUON_IMAGEDIR)/sysupgrade/$(GLUON_BRANCH).manifest - -dirclean : FORCE - for dir in build_dir dl staging_dir tmp; do \ - rm -rf $(GLUON_ORIGOPENWRTDIR)/$$dir; \ - done - rm -rf $(GLUON_BUILDDIR) $(GLUON_OUTPUTDIR) - -else - -TOPDIR=${CURDIR} -export TOPDIR - -include rules.mk - -include $(GLUONDIR)/include/gluon.mk - -include $(INCLUDE_DIR)/host.mk -include $(INCLUDE_DIR)/depends.mk -include $(INCLUDE_DIR)/subdir.mk - -include package/Makefile -include tools/Makefile -include toolchain/Makefile -include target/Makefile - - -PROFILES := -PROFILE_PACKAGES := - -define Profile - $(eval $(call Profile/Default)) - $(eval $(call Profile/$(1))) -endef - -define GluonProfile -PROFILES += $(1) -PROFILE_PACKAGES += $(filter-out -%,$(2) $(GLUON_$(1)_SITE_PACKAGES)) -GLUON_$(1)_PROFILE := $(if $(3),$(3),$(1)) -GLUON_$(1)_DEFAULT_PACKAGES := $(2) -GLUON_$(1)_FACTORY_SUFFIX := -squashfs-factory -GLUON_$(1)_SYSUPGRADE_SUFFIX := -squashfs-sysupgrade -GLUON_$(1)_FACTORY_EXT := .bin -GLUON_$(1)_SYSUPGRADE_EXT := .bin -GLUON_$(1)_FACTORY_EXTRA := -GLUON_$(1)_SYSUPGRADE_EXTRA := -GLUON_$(1)_MODELS := -endef - -define GluonProfileFactorySuffix -GLUON_$(1)_FACTORY_SUFFIX := $(2) -GLUON_$(1)_FACTORY_EXT := $(3) -GLUON_$(1)_FACTORY_EXTRA := $(4) -endef - -define GluonProfileSysupgradeSuffix -GLUON_$(1)_SYSUPGRADE_SUFFIX := $(2) -GLUON_$(1)_SYSUPGRADE_EXT := $(3) -GLUON_$(1)_SYSUPGRADE_EXTRA := $(4) -endef - -define GluonModel -GLUON_$(1)_MODELS += $(3) -GLUON_$(1)_MODEL_$(3) := $(2) -GLUON_$(1)_MODEL_$(3)_ALIASES := -endef - -define GluonModelAlias -GLUON_$(1)_MODEL_$(2)_ALIASES += $(3) -endef - - -export SHA512SUM := $(GLUONDIR)/scripts/sha512sum.sh - - -prereq: FORCE - +$(NO_TRACE_MAKE) prereq - -prepare-tmpinfo: FORCE - @+$(MAKE) -r -s staging_dir/host/.prereq-build OPENWRT_BUILD= QUIET=0 - mkdir -p tmp/info - $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="packageinfo" SCAN_DIR="package" SCAN_NAME="package" SCAN_DEPS="$(TOPDIR)/include/package*.mk $(TOPDIR)/overlay/*/*.mk" SCAN_EXTRA="" - $(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f include/scan.mk SCAN_TARGET="targetinfo" SCAN_DIR="target/linux" SCAN_NAME="target" SCAN_DEPS="profiles/*.mk $(TOPDIR)/include/kernel*.mk $(TOPDIR)/include/target.mk" SCAN_DEPTH=2 SCAN_EXTRA="" SCAN_MAKEOPTS="TARGET_BUILD=1" - for type in package target; do \ - f=tmp/.$${type}info; t=tmp/.config-$${type}.in; \ - [ "$$t" -nt "$$f" ] || ./scripts/metadata.pl $${type}_config "$$f" > "$$t" || { rm -f "$$t"; echo "Failed to build $$t"; false; break; }; \ - done - [ tmp/.config-feeds.in -nt tmp/.packagefeeds ] || ./scripts/feeds feed_config > tmp/.config-feeds.in - ./scripts/metadata.pl package_mk tmp/.packageinfo > tmp/.packagedeps || { rm -f tmp/.packagedeps; false; } - ./scripts/metadata.pl package_feeds tmp/.packageinfo > tmp/.packagefeeds || { rm -f tmp/.packagefeeds; false; } - touch $(TOPDIR)/tmp/.build - -feeds: FORCE - rm -rf $(TOPDIR)/package/feeds - mkdir $(TOPDIR)/package/feeds - [ ! -f $(GLUON_SITEDIR)/modules ] || . $(GLUON_SITEDIR)/modules && for feed in $$GLUON_SITE_FEEDS; do ln -s ../../../packages/$$feed $(TOPDIR)/package/feeds/$$feed; done - ln -s ../../../package $(TOPDIR)/package/feeds/gluon - . $(GLUONDIR)/modules && for feed in $$GLUON_FEEDS; do ln -s ../../../packages/$$feed $(TOPDIR)/package/feeds/module_$$feed; done - +$(GLUONMAKE_EARLY) prepare-tmpinfo - -gluon-tools: FORCE - +$(GLUONMAKE_EARLY) tools/patch/install - +$(GLUONMAKE_EARLY) tools/sed/install - +$(GLUONMAKE_EARLY) tools/cmake/install - +$(GLUONMAKE_EARLY) package/lua/host/install package/usign/host/install - - - -early_prepared_stamp := $(GLUON_BUILDDIR)/prepared_$(shell \ - ( \ - $(SHA512SUM) $(GLUONDIR)/modules; \ - [ ! -r $(GLUON_SITEDIR)/modules ] || $(SHA512SUM) $(GLUON_SITEDIR)/modules \ - ) | $(SHA512SUM) ) - -prepare-early: FORCE - for dir in build_dir dl staging_dir; do \ - mkdir -p $(GLUON_ORIGOPENWRTDIR)/$$dir; \ - done - - +$(GLUONMAKE_EARLY) feeds - +$(GLUONMAKE_EARLY) gluon-tools - - mkdir -p $$(dirname $(early_prepared_stamp)) - touch $(early_prepared_stamp) - -$(early_prepared_stamp): - rm -f $(GLUON_BUILDDIR)/prepared_* - +$(GLUONMAKE_EARLY) prepare-early - -$(GLUON_OPKG_KEY): $(early_prepared_stamp) FORCE - [ -s $(GLUON_OPKG_KEY) -a -s $(GLUON_OPKG_KEY).pub ] || \ - ( mkdir -p $$(dirname $(GLUON_OPKG_KEY)) && $(STAGING_DIR_HOST)/bin/usign -G -s $(GLUON_OPKG_KEY) -p $(GLUON_OPKG_KEY).pub -c "Gluon opkg key" ) - -$(GLUON_OPKG_KEY).pub: $(GLUON_OPKG_KEY) - -create-key: $(GLUON_OPKG_KEY).pub - -include $(GLUONDIR)/targets/targets.mk - -ifneq ($(GLUON_TARGET),) - -include $(GLUONDIR)/targets/$(GLUON_TARGET)/profiles.mk - -BOARD := $(GLUON_TARGET_$(GLUON_TARGET)_BOARD) -override SUBTARGET := $(GLUON_TARGET_$(GLUON_TARGET)_SUBTARGET) - -target_prepared_stamp := $(BOARD_BUILDDIR)/target-prepared -gluon_prepared_stamp := $(BOARD_BUILDDIR)/prepared - -PREPARED_RELEASE = $$(cat $(gluon_prepared_stamp)) -IMAGE_PREFIX = gluon-$(GLUON_SITE_CODE)-$(PREPARED_RELEASE) -MODULE_PREFIX = gluon-$(GLUON_SITE_CODE)-$(PREPARED_RELEASE) - - -include $(INCLUDE_DIR)/target.mk - -build-key: FORCE - rm -f $(BUILD_KEY) $(BUILD_KEY).pub - cp $(GLUON_OPKG_KEY) $(BUILD_KEY) - cp $(GLUON_OPKG_KEY).pub $(BUILD_KEY).pub - -config: FORCE - +$(NO_TRACE_MAKE) scripts/config/conf OPENWRT_BUILD= QUIET=0 - +$(GLUONMAKE) prepare-tmpinfo - ( \ - cat $(GLUONDIR)/include/config; \ - echo 'CONFIG_TARGET_$(GLUON_TARGET_$(GLUON_TARGET)_BOARD)=y'; \ - $(if $(GLUON_TARGET_$(GLUON_TARGET)_SUBTARGET), \ - echo 'CONFIG_TARGET_$(GLUON_TARGET_$(GLUON_TARGET)_BOARD)_$(GLUON_TARGET_$(GLUON_TARGET)_SUBTARGET)=y'; \ - ) \ - cat $(GLUONDIR)/targets/$(GLUON_TARGET)/config 2>/dev/null; \ - echo 'CONFIG_BUILD_SUFFIX="gluon-$(GLUON_TARGET)"'; \ - echo '$(patsubst %,CONFIG_PACKAGE_%=m,$(sort $(filter-out -%,$(DEFAULT_PACKAGES) $(GLUON_DEFAULT_PACKAGES) $(GLUON_SITE_PACKAGES) $(PROFILE_PACKAGES))))' \ - | sed -e 's/ /\n/g'; \ - echo '$(patsubst %,CONFIG_LUCI_LANG_%=y,$(GLUON_LANGS))' \ - | sed -e 's/ /\n/g'; \ - ) > $(BOARD_BUILDDIR)/config.tmp - scripts/config/conf --defconfig=$(BOARD_BUILDDIR)/config.tmp Config.in - +$(SUBMAKE) tools/install - -prepare-target: $(GLUON_OPKG_KEY).pub - rm $(GLUON_OPENWRTDIR)/tmp || true - mkdir -p $(GLUON_OPENWRTDIR)/tmp - - for link in build_dir config Config.in dl include Makefile package rules.mk scripts staging_dir target toolchain tools; do \ - ln -sf $(GLUON_ORIGOPENWRTDIR)/$$link $(GLUON_OPENWRTDIR); \ - done - - +$(GLUONMAKE) config - touch $(target_prepared_stamp) - -$(target_prepared_stamp): - +$(GLUONMAKE_EARLY) prepare-target - -maybe-prepare-target: $(target_prepared_stamp) - +$(GLUONMAKE_EARLY) $(GLUON_OPKG_KEY).pub - -$(BUILD_DIR)/.prepared: Makefile - @mkdir -p $$(dirname $@) - @touch $@ - -$(toolchain/stamp-install): $(tools/stamp-install) -$(package/stamp-compile): $(package/stamp-cleanup) - - -clean: FORCE - +$(SUBMAKE) clean - rm -f $(gluon_prepared_stamp) - - -download: FORCE - +$(SUBMAKE) tools/download - +$(SUBMAKE) toolchain/download - +$(SUBMAKE) package/download - +$(SUBMAKE) target/download - -toolchain: $(toolchain/stamp-install) $(tools/stamp-install) - -include $(INCLUDE_DIR)/kernel.mk - -kernel: FORCE - +$(NO_TRACE_MAKE) -C $(TOPDIR)/target/linux/$(BOARD) $(LINUX_DIR)/.image TARGET_BUILD=1 - +$(NO_TRACE_MAKE) -C $(TOPDIR)/target/linux/$(BOARD) $(LINUX_DIR)/.modules TARGET_BUILD=1 - -packages: $(package/stamp-compile) - $(_SINGLE)$(SUBMAKE) -r package/index - -prepare-image: FORCE - rm -rf $(BOARD_KDIR) - mkdir -p $(BOARD_KDIR) - -cp $(KERNEL_BUILD_DIR)/* $(BOARD_KDIR)/ - +$(SUBMAKE) -C $(TOPDIR)/target/linux/$(BOARD)/image image_prepare KDIR="$(BOARD_KDIR)" - -prepare: FORCE - @$(STAGING_DIR_HOST)/bin/lua $(GLUONDIR)/scripts/site_config.lua \ - || (echo 'Your site configuration did not pass validation.'; false) - - mkdir -p $(GLUON_IMAGEDIR) $(BOARD_BUILDDIR) - echo 'src packages file:../openwrt/bin/$(BOARD)/packages' > $(BOARD_BUILDDIR)/opkg.conf - - +$(GLUONMAKE) toolchain - +$(GLUONMAKE) kernel - +$(GLUONMAKE) packages - +$(GLUONMAKE) prepare-image - - echo "$(GLUON_RELEASE)" > $(gluon_prepared_stamp) - -$(gluon_prepared_stamp): - +$(GLUONMAKE) prepare - -modules: FORCE $(gluon_prepared_stamp) - -rm -f $(GLUON_MODULEDIR)/*/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic)/* - -rmdir -p $(GLUON_MODULEDIR)/*/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic) - mkdir -p $(GLUON_MODULEDIR)/$(MODULE_PREFIX)/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic) - cp $(PACKAGE_DIR)/kmod-*.ipk $(GLUON_MODULEDIR)/$(MODULE_PREFIX)/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic) - - $(_SINGLE)$(SUBMAKE) -r package/index PACKAGE_DIR=$(GLUON_MODULEDIR)/$(MODULE_PREFIX)/$(BOARD)/$(if $(SUBTARGET),$(SUBTARGET),generic) - - -include $(INCLUDE_DIR)/package-ipkg.mk - -# override variables from rules.mk -PACKAGE_DIR = $(GLUON_OPENWRTDIR)/bin/$(BOARD)/packages - -PROFILE_BUILDDIR = $(BOARD_BUILDDIR)/profiles/$(PROFILE) -PROFILE_KDIR = $(PROFILE_BUILDDIR)/kernel -BIN_DIR = $(PROFILE_BUILDDIR)/images - -TARGET_DIR = $(PROFILE_BUILDDIR)/root - -OPKG:= \ - TMPDIR="$(TMP_DIR)" \ - IPKG_INSTROOT="$(TARGET_DIR)" \ - IPKG_CONF_DIR="$(TMP_DIR)" \ - IPKG_OFFLINE_ROOT="$(TARGET_DIR)" \ - $(STAGING_DIR_HOST)/bin/opkg \ - -f $(BOARD_BUILDDIR)/opkg.conf \ - --cache $(TMP_DIR)/dl \ - --offline-root $(TARGET_DIR) \ - --force-postinstall \ - --add-dest root:/ \ - --add-arch all:100 \ - --add-arch $(ARCH_PACKAGES):200 - -EnableInitscript = ! grep -q '\#!/bin/sh /etc/rc.common' $(1) || bash ./etc/rc.common $(1) enable - - -enable_initscripts: FORCE - cd $(TARGET_DIR) && ( export IPKG_INSTROOT=$(TARGET_DIR); \ - $(foreach script,$(wildcard $(TARGET_DIR)/etc/init.d/*), \ - $(call EnableInitscript,$(script)); \ + echo && \ + $(foreach GLUON_TARGET,$(GLUON_TARGETS), \ + GLUON_SITEDIR='$(GLUON_SITEDIR)' scripts/generate_manifest.sh '$(GLUON_TARGET)' && \ ) : \ - ) + ) > 'tmp/$(GLUON_BRANCH).manifest.tmp' + @mkdir -p '$(GLUON_IMAGEDIR)/sysupgrade' + @mv 'tmp/$(GLUON_BRANCH).manifest.tmp' '$(GLUON_IMAGEDIR)/sysupgrade/$(GLUON_BRANCH).manifest' -# Generate package list -$(eval $(call merge-lists,INSTALL_PACKAGES,DEFAULT_PACKAGES GLUON_DEFAULT_PACKAGES GLUON_SITE_PACKAGES GLUON_$(PROFILE)_DEFAULT_PACKAGES GLUON_$(PROFILE)_SITE_PACKAGES)) +FORCE: ; -package_install: FORCE - $(OPKG) update - $(OPKG) install $(PACKAGE_DIR)/base-files_*.ipk $(PACKAGE_DIR)/libc_*.ipk - $(OPKG) install $(PACKAGE_DIR)/kernel_*.ipk - - $(OPKG) install $(INSTALL_PACKAGES) - +$(GLUONMAKE) enable_initscripts - - rm -f $(TARGET_DIR)/usr/lib/opkg/lists/* $(TARGET_DIR)/tmp/opkg.lock - rm -f $(TARGET_DIR)/usr/lib/opkg/info/*.postinst* - -# Remove opkg database when opkg is not intalled - if [ ! -x $(TARGET_DIR)/bin/opkg ]; then rm -rf $(TARGET_DIR)/usr/lib/opkg; fi - - -include $(INCLUDE_DIR)/version.mk - -opkg_config: FORCE - for d in base packages luci routing telephony management; do \ - echo "src/gz %n_$$d %U/$$d"; \ - done > $(TARGET_DIR)/etc/opkg/distfeeds.conf - $(VERSION_SED) $(TARGET_DIR)/etc/opkg/distfeeds.conf - - -image: FORCE - rm -rf $(TARGET_DIR) $(BIN_DIR) $(PROFILE_KDIR) - mkdir -p $(TARGET_DIR) $(BIN_DIR) $(TARGET_DIR)/tmp $(GLUON_IMAGEDIR)/factory $(GLUON_IMAGEDIR)/sysupgrade - cp -r $(BOARD_KDIR) $(PROFILE_KDIR) - - +$(GLUONMAKE) package_install - +$(GLUONMAKE) opkg_config - - $(call Image/mkfs/prepare) - $(_SINGLE)$(NO_TRACE_MAKE) -C $(TOPDIR)/target/linux/$(BOARD)/image install TARGET_BUILD=1 IMG_PREFIX=gluon \ - PROFILE="$(GLUON_$(PROFILE)_PROFILE)" KDIR="$(PROFILE_KDIR)" TARGET_DIR="$(TARGET_DIR)" BIN_DIR="$(BIN_DIR)" TMP_DIR="$(TMP_DIR)" - - $(foreach model,$(GLUON_$(PROFILE)_MODELS), \ - $(if $(GLUON_$(PROFILE)_SYSUPGRADE_EXT), \ - rm -f $(GLUON_IMAGEDIR)/sysupgrade/gluon-*-$(model)-sysupgrade$(GLUON_$(PROFILE)_SYSUPGRADE_EXT) && \ - cp $(BIN_DIR)/gluon-$(GLUON_$(PROFILE)_MODEL_$(model))$(GLUON_$(PROFILE)_SYSUPGRADE_SUFFIX)$(GLUON_$(PROFILE)_SYSUPGRADE_EXT) $(GLUON_IMAGEDIR)/sysupgrade/$(IMAGE_PREFIX)-$(model)-sysupgrade$(GLUON_$(PROFILE)_SYSUPGRADE_EXT) && \ - ) \ - $(if $(GLUON_$(PROFILE)_FACTORY_EXT), \ - rm -f $(GLUON_IMAGEDIR)/factory/gluon-*-$(model)$(GLUON_$(PROFILE)_FACTORY_EXT) && \ - cp $(BIN_DIR)/gluon-$(GLUON_$(PROFILE)_MODEL_$(model))$(GLUON_$(PROFILE)_FACTORY_SUFFIX)$(GLUON_$(PROFILE)_FACTORY_EXT) $(GLUON_IMAGEDIR)/factory/$(IMAGE_PREFIX)-$(model)$(GLUON_$(PROFILE)_FACTORY_EXT) && \ - ) \ - \ - $(if $(GLUON_$(PROFILE)_SYSUPGRADE_EXTRA), \ - rm -f $(GLUON_IMAGEDIR)/sysupgrade/gluon-*-$(model)-sysupgrade$(GLUON_$(PROFILE)_SYSUPGRADE_EXTRA) && \ - cp $(BIN_DIR)/gluon$(GLUON_$(PROFILE)_SYSUPGRADE_EXTRA) $(GLUON_IMAGEDIR)/sysupgrade/$(IMAGE_PREFIX)-$(model)-sysupgrade$(GLUON_$(PROFILE)_SYSUPGRADE_EXTRA) && \ - ) \ - $(if $(GLUON_$(PROFILE)_FACTORY_EXTRA), \ - rm -f $(GLUON_IMAGEDIR)/factory/gluon-*-$(model)$(GLUON_$(PROFILE)_FACTORY_EXTRA) && \ - cp $(BIN_DIR)/gluon$(GLUON_$(PROFILE)_FACTORY_EXTRA) $(GLUON_IMAGEDIR)/factory/$(IMAGE_PREFIX)-$(model)$(GLUON_$(PROFILE)_FACTORY_EXTRA) && \ - ) \ - \ - $(foreach alias,$(GLUON_$(PROFILE)_MODEL_$(model)_ALIASES), \ - $(if $(GLUON_$(PROFILE)_SYSUPGRADE_EXT), \ - rm -f $(GLUON_IMAGEDIR)/sysupgrade/gluon-*-$(alias)-sysupgrade$(GLUON_$(PROFILE)_SYSUPGRADE_EXT) && \ - ln -s $(IMAGE_PREFIX)-$(model)-sysupgrade$(GLUON_$(PROFILE)_SYSUPGRADE_EXT) $(GLUON_IMAGEDIR)/sysupgrade/$(IMAGE_PREFIX)-$(alias)-sysupgrade$(GLUON_$(PROFILE)_SYSUPGRADE_EXT) && \ - ) \ - $(if $(GLUON_$(PROFILE)_FACTORY_EXT), \ - rm -f $(GLUON_IMAGEDIR)/factory/gluon-*-$(alias)$(GLUON_$(PROFILE)_FACTORY_EXT) && \ - ln -s $(IMAGE_PREFIX)-$(model)$(GLUON_$(PROFILE)_FACTORY_EXT) $(GLUON_IMAGEDIR)/factory/$(IMAGE_PREFIX)-$(alias)$(GLUON_$(PROFILE)_FACTORY_EXT) && \ - ) \ - ) \ - ) : - - -image/%: $(gluon_prepared_stamp) - +$(GLUONMAKE) image PROFILE="$(patsubst image/%,%,$@)" V=s$(OPENWRT_VERBOSE) - -call_image/%: FORCE - +$(GLUONMAKE) $(patsubst call_image/%,image/%,$@) - -images: $(patsubst %,call_image/%,$(PROFILES)) ; - -manifest: FORCE - ( \ - cd $(GLUON_IMAGEDIR)/sysupgrade; \ - $(foreach profile,$(PROFILES), \ - $(if $(GLUON_$(profile)_SYSUPGRADE_EXT), \ - $(foreach model,$(GLUON_$(profile)_MODELS), \ - file="$(IMAGE_PREFIX)-$(model)-sysupgrade$(GLUON_$(profile)_SYSUPGRADE_EXT)"; \ - [ -e "$$file" ] && echo '$(model)' "$(PREPARED_RELEASE)" "$$($(SHA512SUM) "$$file")" "$$file"; \ - \ - $(foreach alias,$(GLUON_$(profile)_MODEL_$(model)_ALIASES), \ - file="$(IMAGE_PREFIX)-$(alias)-sysupgrade$(GLUON_$(profile)_SYSUPGRADE_EXT)"; \ - [ -e "$$file" ] && echo '$(alias)' "$(PREPARED_RELEASE)" "$$($(SHA512SUM) "$$file")" "$$file"; \ - ) \ - ) \ - ) \ - ) : \ - ) >> $(GLUON_BUILDDIR)/$(GLUON_BRANCH).manifest.tmp - -.PHONY: all create-key prepare images modules clean gluon-tools manifest - -endif -endif +.PHONY: FORCE +.NOTPARALLEL: diff --git a/docs/dev/hardware.rst b/docs/dev/hardware.rst index b7f7c174..54ae75e0 100644 --- a/docs/dev/hardware.rst +++ b/docs/dev/hardware.rst @@ -11,57 +11,114 @@ is a requirement. At the moment, Gluon's scripts can't handle devices without WLAN adapters (although such environments may also be interesting, e.g. for automated testing in virtual machines). + .. _hardware-adding-profiles: Adding profiles --------------- -The vast majority of devices with ath9k WLAN uses the ar71xx target of OpenWrt. +The vast majority of devices with ath9k WLAN uses the ar71xx target of LEDE. If the hardware you want to add support for is also ar71xx, adding a new profile is enough. -Profiles are defined in ``targets/-/profiles.mk``. There are two macros -used to define which images are generated: ``GluonProfile`` and ``GluonModel``. The following examples -are taken from ``profiles.mk`` of the ``ar71xx-generic`` target:: +Profiles are defined in ``targets/*`` in a shell-based DSL (so common shell +commands syntax like ``if`` can be used. - $(eval $(call GluonProfile,TLWR1043)) - $(eval $(call GluonModel,TLWR1043,tl-wr1043nd-v1-squashfs,tp-link-tl-wr1043n-nd-v1)) - $(eval $(call GluonModel,TLWR1043,tl-wr1043nd-v2-squashfs,tp-link-tl-wr1043n-nd-v2)) +The ``device`` command is used to define an image build for a device. It takes +two or three parameters. -The ``GluonProfile`` macro takes at least one parameter, the profile name as it is -defined in the Makefiles of OpenWrt (``openwrt/target/linux///profiles/*`` -and ``openwrt/target/linux//image/Makefile``). If the target you are on doesn't define -profiles (e.g. on x86), just add a single profile called ``Generic`` or similar. - -It may optionally take a second parameter which defines additional packages to include for the profile -(e.g. ath10k). The additional packages defined in ``openwrt/target/linux///profiles/*`` -aren't used. - -The ``GluonModel`` macro takes three parameters: The profile name, the suffix of the image file -generated by OpenWrt (without the file extension), and the final image name of the Gluon image. -The final image name must be the same that is returned by the following command. - -:: +The first parameter defines the Gluon profile name, which is used to refer to the +device and is part of the generated image name. The profile name must be same as +the output of the following command (on the target device), so the autoupdater +can work:: lua -e 'print(require("platform_info").get_image_name())' +The second parameter defines the name of the image files generated by LEDE. Usually, +it is also the LEDE profile name; for devices that still use the old image build +code, a third parameter with the LEDE profile name can be passed. The profile names +can be found in the image Makefiles in ``lede/target/linux//image/Makefile``. -This is just so the autoupdater can work. The command has to be executed _on_ the target (eg. the hardware router with a flashed image). So you'll first have to build an image with a guessed name, and afterwards build a new, correctly named image. On targets which aren't supported by the autoupdater, -``require("platform_info").get_image_name()`` will just return ``nil`` and the final image name -may be defined arbitrarily. +Examples:: + + device tp-link-tl-wr1043n-nd-v1 tl-wr1043nd-v1 + device alfa-network-hornet-ub hornet-ub HORNETUB + +Suffixes and extensions +''''''''''''''''''''''' + +By default, image files are expected to have the extension ``.bin``. In addition, +the images generated by LEDE have a suffix before the extension that defaults to +``-squashfs-factory`` and ``-squashfs-sysupgrade``. + +This can be changed using the ``factory`` and ``sysupgrade`` commands, either at +the top of the file to set the defaults for all images, or for a single image. There +are three forms with 0 to 2 arguments (all work with ``sysupgrade`` as well):: + + factory SUFFIX .EXT + factory .EXT + factory + +When only an extension is given, the default suffix is retained. When no arguments +are given, this signals that no factory (or sysupgrade) image exists. + +Aliases +''''''' + +Sometimes multiple models use the same LEDE images. In this case, the ``alias`` +command can be used to create symlinks and additional entries in the autoupdater +manifest for the alternative models. + +Standalone images +''''''''''''''''' + +On targets without *per-device rootfs* support in LEDE, the commands described above +can't be used. Instead, ``factory_image`` and ``sysupgrade_image`` are used:: + + factory_image PROFILE IMAGE .EXT + sysupgrade_image PROFILE IMAGE .EXT + +Again, the profile name must match the value printed by the aforementioned Lua +command. The image name must match the part between the target name and the extension +as generated by LEDE and is to be omitted when no such part exists. + +Packages +'''''''' + +The ``packages`` command takes an arbitrary number of arguments. Each argument +defines an additional package to include in the images in addition to the default +package sets defined by LEDE. When a package name is prefixed by a minus sign, the +packages are excluded instead. + +The ``packages`` command may be used at the top of a target definition to modify +the default package list for all images, or just for a single device (when the +target supports *per-default rootfs*). + + +Configuration +''''''''''''' + +The ``config`` command allows to add arbitary target-specific LEDE configuration +to be emitted to ``.config``. + +Notes +''''' On devices with multiple WLAN adapters, care must also be taken that the primary MAC address is configured correctly. ``/lib/gluon/core/sysconfig/primary_mac`` should contain the MAC address which can be found on a label on most hardware; if it does not, ``/lib/gluon/upgrade/010-primary-mac`` in ``gluon-core`` might need a fix. (There have also been cases in which the address was incorrect -even on devices with only one WLAN adapter, in these cases an OpenWrt bug was the cause). +even on devices with only one WLAN adapter, in these cases a LEDE bug was the cause). + Adding support for new hardware targets --------------------------------------- + Adding a new target is much more complex than adding a new profile. There are two basic steps required for adding a new target: -Adjust packages -''''''''''''''' +Package adjustments +''''''''''''''''''' + One package that definitely needs adjustments for every new target added is ``libplatforminfo`` (to be found in `packages/gluon/libs/libplatforminfo `_). Start with a copy of an existing platform info source file and adjust it for the new target (or just add a symlink if @@ -71,15 +128,14 @@ On many targets, Gluon's network setup scripts (mainly in the packages ``gluon-c won't run correctly without some adjustments, so better double check that everything is fine there (and the files ``primary_mac``, ``lan_ifname`` and ``wan_ifname`` in ``/lib/gluon/core/sysconfig/`` contain sensible values). -Add support to the build system -''''''''''''''''''''''''''''''' -A directory for the new target must be created under ``targets``, and it must be added -to ``targets/targets.mk``. In the new target directory, the following files must be created: +Build system support +'''''''''''''''''''' -* profiles.mk -* config (optional) - -For ``profiles.mk``, see :ref:`hardware-adding-profiles`. -The file ``config`` can be used to add additional, target-specific options to the OpenWrt config. +A definition for the new target must be created under ``targets``, and it must be added +to ``targets/targets.mk``. The ``GluonTarget`` macro takes one to three arguments: +the target name, the Gluon subtarget name (if the target has subtargets), and the +LEDE subtarget name (if it differs from the Gluon subtarget). The third argument +can be used to define multiple Gluon targets with different configuration for the +same LEDE target, like it is done for the ``ar71xx-tiny`` target. After this, is should be sufficient to call ``make GLUON_TARGET=`` to build the images for the new target. diff --git a/docs/site-example/site.mk b/docs/site-example/site.mk index f55db144..79ecf37a 100644 --- a/docs/site-example/site.mk +++ b/docs/site-example/site.mk @@ -1,11 +1,9 @@ ## gluon site.mk makefile example ## GLUON_SITE_PACKAGES -# specify gluon/openwrt packages to include here -# The gluon-mesh-batman-adv-* package must come first because of the dependency resolution +# specify Gluon/LEDE packages to include here GLUON_SITE_PACKAGES := \ - gluon-mesh-batman-adv-15 \ gluon-alfred \ gluon-respondd \ gluon-autoupdater \ @@ -21,6 +19,7 @@ GLUON_SITE_PACKAGES := \ gluon-luci-autoupdater \ gluon-luci-portconfig \ gluon-luci-wifi-config \ + gluon-mesh-batman-adv-15 \ gluon-mesh-vpn-fastd \ gluon-radvd \ gluon-setup-mode \ diff --git a/docs/user/getting_started.rst b/docs/user/getting_started.rst index c9df1d62..dd4ac422 100644 --- a/docs/user/getting_started.rst +++ b/docs/user/getting_started.rst @@ -85,7 +85,6 @@ Next go back to the top-level Gluon directory and build Gluon:: make update # Get other repositories used by Gluon make GLUON_TARGET=ar71xx-generic # Build Gluon -When calling make, the OpenWrt build environment is prepared/updated. In case of errors read the messages carefully and try to fix the stated issues (e.g. install tools not available yet). ``ar71xx-generic`` is the most common target and will generate images for most of the supported hardware. @@ -95,7 +94,7 @@ You should reserve about 10GB of disk space for each `GLUON_TARGET`. The built images can be found in the directory `output/images`. Of these, the `factory` images are to be used when flashing from the original firmware a device came with, -and `sysupgrade` is to upgrade from other versions of Gluon or any other OpenWrt-based +and `sysupgrade` is to upgrade from other versions of Gluon or any other OpenWrt/LEDE-based system. **Note:** The images for some models are identical; to save disk space, symlinks are generated instead @@ -111,39 +110,25 @@ There are two levels of `make clean`:: make clean GLUON_TARGET=ar71xx-generic -will ensure all packages are rebuilt for a single target; this is what you normally want to do after an update. +will ensure all packages are rebuilt for a single target. This normally not +necessary, but may fix certain kinds of build failures. :: make dirclean -will clean the entire tree, so the toolchain will be rebuilt as well, which is -not necessary in most cases, and will take a while. - -So in summary, to update and rebuild a Gluon build tree, the following commands should be used (repeat the -``make clean`` and ``make`` for all targets you want to build): - -:: - - git pull - (cd site && git pull) - make update - make clean GLUON_TARGET=ar71xx-generic - make GLUON_TARGET=ar71xx-generic - +will clean the entire tree, so the toolchain will be rebuilt as well, which will take a while. opkg repositories ----------------- -Gluon is mostly compatible with OpenWrt, so the normal OpenWrt package repositories -can be used for Gluon as well. It is advisable to setup a mirror or reverse proxy -reachable over IPv6 and add it to ``site.conf`` as http://downloads.openwrt.org/ does -not support IPv6. +Gluon is mostly compatible with LEDE, so the normal LEDE package repositories +can be used for Gluon as well. This is not true for kernel modules; the Gluon kernel is incompatible with the -kernel of the default OpenWrt images. Therefore, Gluon will not only generate images, -but also an opkg repository containing all kernel modules provided by OpenWrt/Gluon -for the kernel of the generated images. +kernel of the default LEDE images. Therefore, Gluon will not only generate images, +but also an opkg repository containing all core packages provided by LEDE, +including modules for the kernel of the generated images. Signing keys ............ @@ -151,18 +136,14 @@ Signing keys Gluon does not support HTTPS for downloading packages; fortunately, opkg deploys public-key cryptography to ensure package integrity. -The Gluon images will contain two public keys: the official OpenWrt signing key +The Gluon images will contain public keys from two sources: the official LEDE keyring (to allow installing userspace packages) and a Gluon-specific key (which is used -to sign the generated module repository). +to sign the generated package repository). -By default, Gluon will handle the generation and handling of the keys itself. +LEDE will handle the generation and handling of the keys itself. When making firmware releases based on Gluon, it might make sense to store the keypair, so updating the module repository later is possible. -The location the keys are stored at and read from can be changed -(see :ref:`getting-started-make-variables`). To only generate the keypair -at the configured location without doing a full build, use ``make create-key``. - .. _getting-started-make-variables: Make variables @@ -217,13 +198,8 @@ GLUON_BUILDDIR GLUON_IMAGEDIR Path where images will be stored. Defaults to ``$(GLUON_OUTPUTDIR)/images``. -GLUON_MODULEDIR - Path where the kernel module opkg repository will be stored. Defaults to ``$(GLUON_OUTPUTDIR)/modules``. - -GLUON_OPKG_KEY - Path key file used to sign the module opkg repository. Defaults to ``$(GLUON_BULDDIR)/gluon-opkg-key``. - - The private key will be stored as ``$(GLUON_OPKG_KEY)``, the public key as ``$(GLUON_OPKG_KEY).pub``. +GLUON_PACKAGEDIR + Path where the opkg package repository will be stored. Defaults to ``$(GLUON_OUTPUTDIR)/packages``. GLUON_OUTPUTDIR Path where output files will be stored. Defaults to ``output``. diff --git a/docs/user/site.rst b/docs/user/site.rst index df8525be..42ef85c6 100644 --- a/docs/user/site.rst +++ b/docs/user/site.rst @@ -56,23 +56,27 @@ opkg \: optional There are two optional fields in the ``opkg`` section: - - ``openwrt`` overrides the default OpenWrt repository URL + - ``lede`` overrides the default LEDE repository URL. The default URL would + correspond to ``http://downloads.lede-project.org/snapshots/packages/%A`` + and usually doesn't need to be changed when nodes are expected to have IPv6 + internet connectivity. - ``extra`` specifies a table of additional repositories (with arbitrary keys) :: opkg = { - openwrt = 'http://opkg.services.ffac/openwrt/%n/%v/%S/packages', + lede = 'http://opkg.services.ffac/lede/snapshots/packages/%A', extra = { - modules = 'http://opkg.services.ffac/modules/gluon-%GS-%GR/%S', + gluon = 'http://opkg.services.ffac/modules/gluon-%GS-%GR/%S', }, } There are various patterns which can be used in the URLs: - - ``%n`` is replaced by the OpenWrt version codename (e.g. "chaos_calmer") - - ``%v`` is replaced by the OpenWrt version number (e.g. "15.05") - - ``%S`` is replaced by the target architecture (e.g. "ar71xx/generic") + - ``%n`` is replaced by the LEDE version codename + - ``%v`` is replaced by the LEDE version number (e.g. "17.01") + - ``%S`` is replaced by the target board (e.g. "ar71xx/generic") + - ``%A`` is replaced by the target architecture (e.g. "mips_24kc") - ``%GS`` is replaced by the Gluon site code (as specified in ``site.conf``) - ``%GV`` is replaced by the Gluon version - ``%GR`` is replaced by the Gluon release (as specified in ``site.mk``) diff --git a/include/config b/include/config deleted file mode 100644 index 12f8a7d4..00000000 --- a/include/config +++ /dev/null @@ -1,22 +0,0 @@ -CONFIG_IMAGEOPT=y -# CONFIG_PER_FEED_REPO is not set -# CONFIG_TARGET_ROOTFS_INITRAMFS is not set -CONFIG_DEVEL=y -CONFIG_ALL_KMODS=y - -CONFIG_BUSYBOX_CUSTOM=y -CONFIG_BUSYBOX_CONFIG_SHA512SUM=y -# CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set -CONFIG_BUSYBOX_CONFIG_IP=y -CONFIG_BUSYBOX_CONFIG_FEATURE_IP_ADDRESS=y -CONFIG_BUSYBOX_CONFIG_FEATURE_IP_LINK=y -CONFIG_BUSYBOX_CONFIG_FEATURE_IP_ROUTE=y -CONFIG_BUSYBOX_CONFIG_FEATURE_IP_TUNNEL=y -CONFIG_BUSYBOX_CONFIG_FEATURE_IP_RULE=y -CONFIG_BUSYBOX_CONFIG_FEATURE_IP_SHORT_FORMS=y -CONFIG_BUSYBOX_CONFIG_FEATURE_WGET_TIMEOUT=y - -CONFIG_ATH_USER_REGD=y -CONFIG_PACKAGE_ATH_DEBUG=y - -CONFIG_LUCI_SRCDIET=y diff --git a/include/gluon.mk b/include/gluon.mk deleted file mode 100644 index 29ecf3ed..00000000 --- a/include/gluon.mk +++ /dev/null @@ -1,85 +0,0 @@ -ifneq ($(__gluon_inc),1) -__gluon_inc=1 - -GLUON_SITEDIR ?= $(GLUONDIR)/site -GLUON_BUILDDIR ?= $(GLUONDIR)/build - -GLUON_ORIGOPENWRTDIR := $(GLUONDIR)/openwrt -GLUON_SITE_CONFIG := $(GLUON_SITEDIR)/site.conf - -GLUON_OUTPUTDIR ?= $(GLUONDIR)/output -GLUON_IMAGEDIR ?= $(GLUON_OUTPUTDIR)/images -GLUON_MODULEDIR ?= $(GLUON_OUTPUTDIR)/modules - -GLUON_OPKG_KEY ?= $(GLUON_BUILDDIR)/gluon-opkg-key - -export GLUONDIR GLUON_SITEDIR GLUON_BUILDDIR GLUON_SITE_CONFIG GLUON_OUTPUTDIR GLUON_IMAGEDIR GLUON_MODULEDIR - - -BOARD_BUILDDIR = $(GLUON_BUILDDIR)/$(GLUON_TARGET) -BOARD_KDIR = $(BOARD_BUILDDIR)/kernel - -export BOARD_BUILDDIR - - -LINUX_RELEASE := 2 -export LINUX_RELEASE - - -GLUON_OPENWRTDIR = $(BOARD_BUILDDIR)/openwrt - - -$(GLUON_SITEDIR)/site.mk: - $(error There was no site configuration found. Please check out a site configuration to $(GLUON_SITEDIR)) - --include $(GLUON_SITEDIR)/site.mk - - -GLUON_VERSION := $(shell cd $(GLUONDIR) && git describe --always --dirty=+ 2>/dev/null || echo unknown) -export GLUON_VERSION - -GLUON_SITE_VERSION := $(shell cd $(GLUON_SITEDIR) && git --git-dir=.git describe --always --dirty=+ 2>/dev/null || echo unknown) -export GLUON_SITE_VERSION - -GLUON_LANGS ?= en -export GLUON_LANGS - - -ifeq ($(OPENWRT_BUILD),1) -ifeq ($(GLUON_TOOLS),1) - -GLUON_OPENWRT_FEEDS := base packages luci routing telephony management -export GLUON_OPENWRT_FEEDS - -GLUON_SITE_CODE := $(shell $(GLUONDIR)/scripts/site.sh site_code) -export GLUON_SITE_CODE - -ifeq ($(GLUON_RELEASE),) -$(error GLUON_RELEASE not set. GLUON_RELEASE can be set in site.mk or on the command line.) -endif -export GLUON_RELEASE - -endif -endif - - -define merge-lists -$(1) := -$(foreach var,$(2),$(1) := $$(filter-out -% $$(patsubst -%,%,$$(filter -%,$$($(var)))),$$($(1)) $$($(var))) -) -endef - -GLUON_TARGETS := - -define GluonTarget -gluon_target := $(1)$$(if $(2),-$(2)) -GLUON_TARGETS += $$(gluon_target) -GLUON_TARGET_$$(gluon_target)_BOARD := $(1) -GLUON_TARGET_$$(gluon_target)_SUBTARGET := $(2) -endef - -GLUON_DEFAULT_PACKAGES := gluon-core firewall ip6tables -uboot-envtools -wpad-mini hostapd-mini - -override DEFAULT_PACKAGES.router := - -endif #__gluon_inc diff --git a/include/toplevel.mk b/include/toplevel.mk deleted file mode 100644 index 087a7a19..00000000 --- a/include/toplevel.mk +++ /dev/null @@ -1,62 +0,0 @@ -# Makefile for OpenWrt -# -# Copyright (C) 2007-2012 OpenWrt.org -# Copyright (C) 2013-2014 Project Gluon -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -RELEASE:=Chaos Calmer -PREP_MK= OPENWRT_BUILD= QUIET=0 - -export IS_TTY=$(shell tty -s && echo 1 || echo 0) - -include $(GLUONDIR)/include/verbose.mk - -REVISION:=$(shell [ -d $(TOPDIR) ] && cd $(TOPDIR) && ./scripts/getver.sh 2>/dev/null) - -HOSTCC ?= gcc -OPENWRTVERSION:=$(RELEASE)$(if $(REVISION), ($(REVISION))) -export RELEASE -export REVISION -export OPENWRTVERSION -export IS_TTY=$(shell tty -s && echo 1 || echo 0) -export LD_LIBRARY_PATH:=$(subst ::,:,$(if $(LD_LIBRARY_PATH),$(LD_LIBRARY_PATH):)$(STAGING_DIR_HOST)/lib) -export DYLD_LIBRARY_PATH:=$(subst ::,:,$(if $(DYLD_LIBRARY_PATH),$(DYLD_LIBRARY_PATH):)$(STAGING_DIR_HOST)/lib) -export GIT_CONFIG_PARAMETERS='core.autocrlf=false' -export MAKE_JOBSERVER=$(filter --jobserver%,$(MAKEFLAGS)) - -# prevent perforce from messing with the patch utility -unexport P4PORT P4USER P4CONFIG P4CLIENT - -# prevent user defaults for quilt from interfering -unexport QUILT_PATCHES QUILT_PATCH_OPTS - -unexport C_INCLUDE_PATH CROSS_COMPILE ARCH - -# prevent distro default LPATH from interfering -unexport LPATH - -# make sure that a predefined CFLAGS variable does not disturb packages -export CFLAGS= - -ifneq ($(shell $(HOSTCC) 2>&1 | grep clang),) - export HOSTCC_REAL?=$(HOSTCC) - export HOSTCC_WRAPPER:=$(TOPDIR)/scripts/clang-gcc-wrapper -else - export HOSTCC_WRAPPER:=$(HOSTCC) -endif - -SCAN_COOKIE?=$(shell echo $$$$) -export SCAN_COOKIE - -SUBMAKE:=umask 022; $(SUBMAKE) - -ULIMIT_FIX=_limit=`ulimit -n`; [ "$$_limit" = "unlimited" -o "$$_limit" -ge 1024 ] || ulimit -n 1024; - -FORCE: ; - -.PHONY: FORCE -.NOTPARALLEL: - diff --git a/include/verbose.mk b/include/verbose.mk deleted file mode 100644 index d34f55fc..00000000 --- a/include/verbose.mk +++ /dev/null @@ -1,67 +0,0 @@ -# -# Copyright (C) 2006 OpenWrt.org -# -# This is free software, licensed under the GNU General Public License v2. -# See /LICENSE for more information. -# - -ifndef OPENWRT_VERBOSE - OPENWRT_VERBOSE:= -endif -ifeq ("$(origin V)", "command line") - OPENWRT_VERBOSE:=$(V) -endif - -ifeq ($(OPENWRT_VERBOSE),1) - OPENWRT_VERBOSE:=w -endif -ifeq ($(OPENWRT_VERBOSE),99) - OPENWRT_VERBOSE:=s -endif - -ifeq ($(NO_TRACE_MAKE),) -NO_TRACE_MAKE := $(MAKE) V=s$(OPENWRT_VERBOSE) -export NO_TRACE_MAKE -endif - -ifeq ($(IS_TTY),1) - ifneq ($(strip $(NO_COLOR)),1) - _Y:=\\033[33m - _R:=\\033[31m - _N:=\\033[m - endif -endif - -ifeq ($(findstring s,$(OPENWRT_VERBOSE)),) - define MESSAGE - printf "$(_Y)%s$(_N)\n" "$(1)" >&8 - endef - - define ERROR_MESSAGE - printf "$(_R)%s$(_N)\n" "$(1)" >&8 - endef - - ifeq ($(QUIET),1) - ifneq ($(CURDIR),$(TOPDIR)) - _DIR:=$(patsubst $(TOPDIR)/%,%,${CURDIR}) - else - _DIR:= - endif - _NULL:=$(if $(MAKECMDGOALS),$(shell \ - $(call MESSAGE, make[$(MAKELEVEL)]$(if $(_DIR), -C $(_DIR)) $(MAKECMDGOALS)); \ - )) - SUBMAKE=$(MAKE) - else - SILENT:=>/dev/null $(if $(findstring w,$(OPENWRT_VERBOSE)),,2>&1) - export QUIET:=1 - SUBMAKE=cmd() { $(SILENT) $(MAKE) -s $$* < /dev/null || { echo "make $$*: build failed. Please re-run make with V=s to see what's going on"; false; } } 8>&1 9>&2; cmd - endif - - .SILENT: $(MAKECMDGOALS) -else - SUBMAKE=$(MAKE) -w - define MESSAGE - printf "%s\n" "$(1)" - endef - ERROR_MESSAGE=$(MESSAGE) -endif diff --git a/modules b/modules index ca223295..7fc0a4e3 100644 --- a/modules +++ b/modules @@ -1,15 +1,13 @@ GLUON_FEEDS='openwrt gluon routing luci' -OPENWRT_REPO=git://github.com/openwrt/openwrt.git -OPENWRT_COMMIT=0f757bd2606971252f901ef3faf4dbd0086315f7 -OPENWRT_BRANCH=chaos_calmer +LEDE_REPO=git://git.lede-project.org/source.git +LEDE_COMMIT=b9a408c2b49ccfa0e906bda00ef77f4002e401fd PACKAGES_OPENWRT_REPO=git://github.com/openwrt/packages.git -PACKAGES_OPENWRT_COMMIT=73776792f7d58e982be9e5819450d4875b273159 -PACKAGES_OPENWRT_BRANCH=for-15.05 +PACKAGES_OPENWRT_COMMIT=ee211f94ec292f7ec3d563fcbc147359b6cf8290 PACKAGES_GLUON_REPO=git://github.com/freifunk-gluon/packages.git -PACKAGES_GLUON_COMMIT=5c25ed888f9f2e05652a994fc0212e34304d58fa +PACKAGES_GLUON_COMMIT=ef405e224082c26807fe24c02da9b02135fa46d0 PACKAGES_ROUTING_REPO=git://github.com/openwrt-routing/packages.git PACKAGES_ROUTING_COMMIT=d848d49d2443448b147c564c2dd8f64433b5fb9c diff --git a/overlay/opkg.mk b/overlay/opkg.mk new file mode 100644 index 00000000..2506dbe6 --- /dev/null +++ b/overlay/opkg.mk @@ -0,0 +1,2 @@ +FEEDS_ENABLED := $(FEEDS_DISABLED) +FEEDS_DISABLED := diff --git a/package/gluon-autoupdater/Makefile b/package/gluon-autoupdater/Makefile index 41cdf796..eacf80c1 100644 --- a/package/gluon-autoupdater/Makefile +++ b/package/gluon-autoupdater/Makefile @@ -2,11 +2,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gluon-autoupdater PKG_VERSION:=4 -PKG_RELEASE:=$(GLUON_BRANCH) PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) + +PKG_CONFIG_DEPENDS := CONFIG_GLUON_BRANCH PKG_BUILD_DEPENDS := respondd + include ../gluon.mk @@ -17,6 +19,13 @@ define Package/gluon-autoupdater TITLE:=Automatically update firmware endef +define Package/gluon-autoupdater/config +config GLUON_BRANCH + string "Gluon autoupdater branch" + depends on PACKAGE_gluon-autoupdater + default "" +endef + define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ @@ -34,10 +43,10 @@ define Package/gluon-autoupdater/install $(INSTALL_DIR) $(1)/lib/gluon/respondd $(CP) $(PKG_BUILD_DIR)/respondd.so $(1)/lib/gluon/respondd/autoupdater.so - if [ '$(GLUON_BRANCH)' ]; then \ - $(INSTALL_DIR) $(1)/lib/gluon/autoupdater; \ - echo '$(GLUON_BRANCH)' > $(1)/lib/gluon/autoupdater/default_branch; \ - fi +ifneq ($(CONFIG_GLUON_BRANCH),"") + $(INSTALL_DIR) $(1)/lib/gluon/autoupdater + echo '$(call qstrip,$(CONFIG_GLUON_BRANCH))' > $(1)/lib/gluon/autoupdater/default_branch +endif endef define Package/gluon-autoupdater/postinst diff --git a/package/gluon-core/Makefile b/package/gluon-core/Makefile index 3e0ae059..5a15fc36 100644 --- a/package/gluon-core/Makefile +++ b/package/gluon-core/Makefile @@ -1,8 +1,10 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gluon-core -PKG_VERSION:=3 -PKG_RELEASE:=$(GLUON_VERSION) + +GLUON_VERSION = $(shell git describe --always --dirty=+ 2>/dev/null || echo unknown) +PKG_VERSION:=$(if $(DUMP),x,$(GLUON_VERSION)) + PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) @@ -20,10 +22,6 @@ define Package/gluon-core/description Gluon community wifi mesh firmware framework: core endef -define Build/Prepare - mkdir -p $(PKG_BUILD_DIR) -endef - define Build/Configure endef @@ -34,11 +32,9 @@ endef define Package/gluon-core/install $(CP) ./files/* $(1)/ $(CP) $(PKG_BUILD_DIR)/luadest/* $(1)/ - $(SED) 's/__GLUON_OPENWRT_FEEDS__/{$(GLUON_OPENWRT_FEEDS:%="%",)}/' $(1)/lib/gluon/upgrade/500-opkg $(INSTALL_DIR) $(1)/lib/gluon - echo "$(GLUON_VERSION)" > $(1)/lib/gluon/gluon-version - echo "$(GLUON_SITE_VERSION)" > $(1)/lib/gluon/site-version + echo '$(GLUON_VERSION)' > $(1)/lib/gluon/gluon-version endef define Package/gluon-core/postinst diff --git a/package/gluon-core/check_site.lua b/package/gluon-core/check_site.lua index 480b367c..b6c5c684 100644 --- a/package/gluon-core/check_site.lua +++ b/package/gluon-core/check_site.lua @@ -2,7 +2,7 @@ need_string 'site_code' need_string 'site_name' if need_table('opkg', nil, false) then - need_string('opkg.openwrt', false) + need_string('opkg.lede', false) function check_repo(k, _) -- this is not actually a uci name, but using the same naming rules here is fine diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/500-opkg b/package/gluon-core/luasrc/lib/gluon/upgrade/500-opkg index 4380050c..9acd3b14 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/500-opkg +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/500-opkg @@ -8,42 +8,51 @@ local util = require 'luci.util' local subst = {} subst['%%v'] = util.trim(fs.readfile('/etc/openwrt_version')) -subst['%%n'], subst['%%S'] = util.exec('. /etc/openwrt_release; echo $DISTRIB_CODENAME; echo $DISTRIB_TARGET'):match('([^\n]*)\n([^\n]*)') +subst['%%n'], subst['%%S'], subst['%%A'] = util.exec('. /etc/openwrt_release; echo "$DISTRIB_CODENAME"; echo "$DISTRIB_TARGET"; echo "$DISTRIB_ARCH"'):match('([^\n]*)\n([^\n]*)\n([^\n]*)') subst['%%GS'] = site.site_code subst['%%GV'] = util.trim(fs.readfile('/lib/gluon/gluon-version')) subst['%%GR'] = util.trim(fs.readfile('/lib/gluon/release')) function replace_patterns(url) - for k, v in pairs(subst) do - url = url:gsub(k, v) - end + for k, v in pairs(subst) do + url = url:gsub(k, v) + end - return url + return url end -if site.opkg then - if site.opkg.openwrt then - local url = replace_patterns(site.opkg.openwrt) - local f = io.open('/etc/opkg/distfeeds.conf', 'w') +local prefix = subst['%%n'] .. '_' - for _, v in ipairs(__GLUON_OPENWRT_FEEDS__) do - f:write(replace_patterns(string.format('src/gz %%n_%s %s/%s\n', v, site.opkg.openwrt, v))) - end - - f:close() - end - - if site.opkg.extra and next(site.opkg.extra) then - local f = io.open('/etc/opkg/gluon.conf', 'w') - - for k, v in pairs(site.opkg.extra) do - f:write(string.format('src/gz %s %s\n', k, replace_patterns(v))) - end - - f:close() - - else - os.remove('/etc/opkg/gluon.conf') - end +local distfeeds = {} +for line in io.lines('/etc/opkg/distfeeds.conf') do + table.insert(distfeeds, line) +end + +local f = io.open('/etc/opkg/distfeeds.conf', 'w') + +for _, line in ipairs(distfeeds) do + local name = line:match('^src/gz%s' .. prefix .. '(%S+)%s') + if name == 'core' then + f:write('# ' .. line .. '\n') + elseif name and site.opkg and site.opkg.lede then + f:write(string.format('src/gz %s %s/%s\n', prefix .. name, replace_patterns(site.opkg.lede), name)) + else + f:write(line .. '\n') + end +end + +f:close() + +if site.opkg and site.opkg.extra and next(site.opkg.extra) then + local f = io.open('/etc/opkg/gluon.conf', 'w') + + for k, v in pairs(site.opkg.extra) do + f:write(string.format('src/gz %s %s\n', k, replace_patterns(v))) + end + + f:close() + +else + os.remove('/etc/opkg/gluon.conf') end diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K50dropbear b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K50dropbear deleted file mode 120000 index 066549b3..00000000 --- a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/K50dropbear +++ /dev/null @@ -1 +0,0 @@ -/etc/init.d/dropbear \ No newline at end of file diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S13haveged b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S13haveged index b4af677a..27b1a595 100755 --- a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S13haveged +++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S13haveged @@ -1,5 +1,5 @@ #!/bin/sh /etc/rc.common -if /etc/init.d/haveged enabled; then +if [ -x /etc/init.d/haveged ] && /etc/init.d/haveged enabled; then . /etc/init.d/haveged fi diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear deleted file mode 120000 index 066549b3..00000000 --- a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear +++ /dev/null @@ -1 +0,0 @@ -/etc/init.d/dropbear \ No newline at end of file diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear new file mode 100755 index 00000000..590aede3 --- /dev/null +++ b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50dropbear @@ -0,0 +1,21 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 +PROG=/usr/sbin/dropbear +NAME=dropbear + +start_service() { + [ -x /etc/init.d/dropbear ] || return 0 + + . /etc/init.d/dropbear + + [ -s /etc/dropbear/dropbear_rsa_host_key ] || keygen + + . /lib/functions.sh + . /lib/functions/network.sh + + procd_open_instance + procd_set_param command "$PROG" -F -f + procd_set_param respawn + procd_close_instance +} diff --git a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50telnet b/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50telnet deleted file mode 100755 index b524b2ce..00000000 --- a/package/gluon-setup-mode/files/lib/gluon/setup-mode/rc.d/S50telnet +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=50 - -USE_PROCD=1 -PROG=/usr/sbin/telnetd - -start_service() { - procd_open_instance - procd_set_param command "$PROG" -F -l /lib/gluon/setup-mode/ash-login - procd_close_instance -} diff --git a/package/gluon-site/Makefile b/package/gluon-site/Makefile index b7138e3c..0f803889 100644 --- a/package/gluon-site/Makefile +++ b/package/gluon-site/Makefile @@ -1,9 +1,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=gluon-site -PKG_VERSION:=$(if $(GLUON_SITE_CODE),$(GLUON_SITE_CODE),1) -PKG_RELEASE:=$(GLUON_RELEASE) +GLUON_SITEDIR = '$(call qstrip,$(CONFIG_GLUON_SITEDIR))' +GLUON_SITE_VERSION = $(shell ( cd $(GLUON_SITEDIR) && git --git-dir=.git describe --always --dirty=+ ) 2>/dev/null || echo unknown) +PKG_VERSION:=$(if $(DUMP),x,$(GLUON_SITE_VERSION)) + + +PKG_CONFIG_DEPENDS := CONFIG_GLUON_RELEASE CONFIG_GLUON_SITEDIR PKG_FILE_DEPENDS := $(GLUON_SITEDIR)/site.conf $(GLUON_SITEDIR)/i18n/ PKG_BUILD_DEPENDS := luci-base/host lua-cjson/host @@ -20,6 +24,18 @@ define Package/gluon-site TITLE:=Site-specific files of Gluon endef +define Package/gluon-site/config +config GLUON_RELEASE + string "Gluon release number" + depends on PACKAGE_gluon-site + default "" + +config GLUON_SITEDIR + string "Gluon site configuration directory" + depends on PACKAGE_gluon-site + default "" +endef + define Build/Prepare mkdir -p $(PKG_BUILD_DIR) endef @@ -28,14 +44,15 @@ define Build/Configure endef define Build/Compile - lua -e 'print(require("cjson").encode(assert(dofile("../../scripts/site_config.lua"))))' > $(PKG_BUILD_DIR)/site.json + GLUON_SITEDIR='$(call qstrip,$(CONFIG_GLUON_SITEDIR))' lua -e 'print(require("cjson").encode(assert(dofile("../../scripts/site_config.lua"))))' > $(PKG_BUILD_DIR)/site.json $(call GluonBuildI18N,gluon-site,$(GLUON_SITEDIR)/i18n) endef define Package/gluon-site/install $(INSTALL_DIR) $(1)/lib/gluon $(INSTALL_DATA) $(PKG_BUILD_DIR)/site.json $(1)/lib/gluon/ - echo "$(GLUON_RELEASE)" > $(1)/lib/gluon/release + echo '$(GLUON_SITE_VERSION)' > $(1)/lib/gluon/site-version + echo '$(call qstrip,$(CONFIG_GLUON_RELEASE))' > $(1)/lib/gluon/release $(call GluonInstallI18N,gluon-site,$(1)) endef diff --git a/package/gluon.mk b/package/gluon.mk index 05875a44..a36a9836 100644 --- a/package/gluon.mk +++ b/package/gluon.mk @@ -5,8 +5,13 @@ include $(INCLUDE_DIR)/package.mk # Annoyingly, make's shell function replaces all newlines with spaces, so we have to do some escaping work. Yuck. define GluonCheckSite -[ -z "$$GLUONDIR" ] || sed -e 's/-@/\n/g' -e 's/+@/@/g' <<'END__GLUON__CHECK__SITE' | "$$GLUONDIR"/scripts/check_site.sh -$(shell cat $(1) | sed -ne '1h; 1!H; $$ {g; s/@/+@/g; s/\n/-@/g; p}') +[ -z "$$IPKG_INSTROOT" ] || sed -e 's/-@/\n/g' -e 's/+@/@/g' <<'END__GLUON__CHECK__SITE' | "${TOPDIR}/staging_dir/hostpkg/bin/lua" -e 'dofile()' +local f = assert(io.open(os.getenv('IPKG_INSTROOT') .. '/lib/gluon/site.json')) +local site_json = f:read('*a') +f:close() + +site = require('cjson').decode(site_json) +$(shell cat '$(TOPDIR)/../scripts/check_site_lib.lua' '$(1)' | sed -ne '1h; 1!H; $$ {g; s/@/+@/g; s/\n/-@/g; p}') END__GLUON__CHECK__SITE endef @@ -41,11 +46,9 @@ define GluonSrcDiet rm -rf $(2) $(CP) $(1) $(2) $(FIND) $(2) -type f | while read src; do \ - if $(STAGING_DIR_HOST)/bin/lua $(STAGING_DIR_HOST)/bin/LuaSrcDiet \ - --noopt-binequiv -o "$$$$src.o" "$$$$src"; \ - then \ - chmod $$$$(stat -c%a "$$$$src") "$$$$src.o"; \ - mv "$$$$src.o" "$$$$src"; \ - fi; \ + if LuaSrcDiet --noopt-binequiv -o "$$$$src.o" "$$$$src"; then \ + chmod $$$$(stat -c%a "$$$$src") "$$$$src.o"; \ + mv "$$$$src.o" "$$$$src"; \ + fi; \ done endef diff --git a/patches/lede/0001-build-move-STAGING_DIR_HOSTPKG-and-BUILD_DIR_HOST-back-to-a-common-directory-for-all-targets.patch b/patches/lede/0001-build-move-STAGING_DIR_HOSTPKG-and-BUILD_DIR_HOST-back-to-a-common-directory-for-all-targets.patch new file mode 100644 index 00000000..3aecb9f5 --- /dev/null +++ b/patches/lede/0001-build-move-STAGING_DIR_HOSTPKG-and-BUILD_DIR_HOST-back-to-a-common-directory-for-all-targets.patch @@ -0,0 +1,111 @@ +From: Matthias Schiffer +Date: Sat, 14 Jan 2017 18:13:14 +0100 +Subject: build: move STAGING_DIR_HOSTPKG and BUILD_DIR_HOST back to a common directory for all targets + +$(STAGING_DIR)/host is kept in addition to $(STAGING_DIR_HOSTPKG) in most +places; it is still used as destination for host files in Build/InstallDev. + +Signed-off-by: Matthias Schiffer + +diff --git a/Makefile b/Makefile +index b220dfd3c56a11f3e27d70e3d6e58cc6448abd2f..c1a7285c83df310e987eaef8376500d2b614eafb 100644 +--- a/Makefile ++++ b/Makefile +@@ -55,7 +55,7 @@ clean: FORCE + rm -rf $(BUILD_DIR) $(STAGING_DIR) $(BIN_DIR) $(OUTPUT_DIR)/packages/$(ARCH_PACKAGES) $(BUILD_LOG_DIR) $(TOPDIR)/staging_dir/packages + + dirclean: clean +- rm -rf $(STAGING_DIR_HOST) $(TOOLCHAIN_DIR) $(BUILD_DIR_HOST) $(BUILD_DIR_TOOLCHAIN) ++ rm -rf $(STAGING_DIR_HOST) $(STAGING_DIR_HOSTPKG) $(TOOLCHAIN_DIR) $(BUILD_DIR_BASE)/host $(BUILD_DIR_BASE)/hostpkg $(BUILD_DIR_TOOLCHAIN) + rm -rf $(TMP_DIR) + + ifndef DUMP_TARGET_DB +diff --git a/include/autotools.mk b/include/autotools.mk +index c6aa47e0bef311697b4def7a7183d1ac59dcf599..7bd400ab36d052b39fcb76a66873c8673eb189a0 100644 +--- a/include/autotools.mk ++++ b/include/autotools.mk +@@ -75,7 +75,7 @@ define autoreconf_target + $(strip $(call autoreconf, \ + $(PKG_BUILD_DIR), $(PKG_REMOVE_FILES), \ + $(PKG_AUTOMAKE_PATHS), $(PKG_LIBTOOL_PATHS), \ +- $(STAGING_DIR)/host/share/aclocal $(STAGING_DIR)/usr/share/aclocal $(PKG_MACRO_PATHS))) ++ $(STAGING_DIR)/host/share/aclocal $(STAGING_DIR_HOSTPKG)/share/aclocal $(STAGING_DIR)/usr/share/aclocal $(PKG_MACRO_PATHS))) + endef + + define patch_libtool_target +diff --git a/include/cmake.mk b/include/cmake.mk +index 5f572e9d7475e807ea56713ee2069dc98f5c1f6b..80c1b05937410cb9fce20e7b759577480cf390e7 100644 +--- a/include/cmake.mk ++++ b/include/cmake.mk +@@ -34,7 +34,7 @@ CMAKE_NM:=$(call cmake_tool,$(TARGET_NM)) + CMAKE_RANLIB:=$(call cmake_tool,$(TARGET_RANLIB)) + + CMAKE_FIND_ROOT_PATH:=$(STAGING_DIR)/usr;$(TOOLCHAIN_DIR)$(if $(CONFIG_EXTERNAL_TOOLCHAIN),;$(CONFIG_TOOLCHAIN_ROOT)) +-CMAKE_HOST_FIND_ROOT_PATH:=$(STAGING_DIR)/host;$(STAGING_DIR_HOST) ++CMAKE_HOST_FIND_ROOT_PATH:=$(STAGING_DIR)/host;$(STAGING_DIR_HOSTPKG);$(STAGING_DIR_HOST) + CMAKE_SHARED_LDFLAGS:=-Wl,-Bsymbolic-functions + + define Build/Configure/Default +diff --git a/include/host-build.mk b/include/host-build.mk +index 5cfbdeba5138c4362f82b7ae86b910a1f41f082a..fee7c6ce8fca6160a7055a8ccb9c0ebd0759032b 100644 +--- a/include/host-build.mk ++++ b/include/host-build.mk +@@ -115,7 +115,7 @@ ifneq ($(if $(HOST_QUILT),,$(CONFIG_AUTOREBUILD)),) + endif + + define Host/Exports/Default +- $(1) : export ACLOCAL_INCLUDE=$$(foreach p,$$(wildcard $$(STAGING_DIR_HOST)/share/aclocal $$(STAGING_DIR_HOST)/share/aclocal-* $(if $(IS_PACKAGE_BUILD),$$(STAGING_DIR)/host/share/aclocal $$(STAGING_DIR)/host/share/aclocal-*)),-I $$(p)) ++ $(1) : export ACLOCAL_INCLUDE=$$(foreach p,$$(wildcard $$(STAGING_DIR_HOST)/share/aclocal $$(STAGING_DIR_HOST)/share/aclocal-* $(if $(IS_PACKAGE_BUILD),$$(STAGING_DIR)/host/share/aclocal $$(STAGING_DIR_HOSTPKG)/share/aclocal $$(STAGING_DIR)/host/share/aclocal-*)),-I $$(p)) + $(1) : export STAGING_PREFIX=$$(HOST_BUILD_PREFIX) + $(1) : export PKG_CONFIG_PATH=$$(STAGING_DIR_HOST)/lib/pkgconfig:$$(HOST_BUILD_PREFIX)/lib/pkgconfig + $(1) : export PKG_CONFIG_LIBDIR=$$(HOST_BUILD_PREFIX)/lib/pkgconfig +diff --git a/include/package.mk b/include/package.mk +index 32485176577b040f6e4a561c5d1144509877bcdf..ea801288eadb139cc0dd2412b4c927c6bd7330e0 100644 +--- a/include/package.mk ++++ b/include/package.mk +@@ -130,7 +130,7 @@ ifdef USE_SOURCE_DIR + endif + + define Build/Exports/Default +- $(1) : export ACLOCAL_INCLUDE=$$(foreach p,$$(wildcard $$(STAGING_DIR)/usr/share/aclocal $$(STAGING_DIR)/usr/share/aclocal-* $$(STAGING_DIR)/host/share/aclocal $$(STAGING_DIR)/host/share/aclocal-*),-I $$(p)) ++ $(1) : export ACLOCAL_INCLUDE=$$(foreach p,$$(wildcard $$(STAGING_DIR)/usr/share/aclocal $$(STAGING_DIR)/usr/share/aclocal-* $$(STAGING_DIR_HOSTPKG)/share/aclocal $$(STAGING_DIR_HOSTPKG)/share/aclocal-* $$(STAGING_DIR)/host/share/aclocal $$(STAGING_DIR)/host/share/aclocal-*),-I $$(p)) + $(1) : export STAGING_PREFIX=$$(STAGING_DIR)/usr + $(1) : export PATH=$$(TARGET_PATH_PKG) + $(1) : export CONFIG_SITE:=$$(CONFIG_SITE) +diff --git a/rules.mk b/rules.mk +index 04fd936660bef4af49de5500cd2d7c3601c1b9f6..95b18f9e5c69de479db54c5bdb740103140dcf74 100644 +--- a/rules.mk ++++ b/rules.mk +@@ -145,9 +145,9 @@ STAGING_DIR_ROOT:=$(STAGING_DIR)/root-$(BOARD) + BUILD_LOG_DIR:=$(TOPDIR)/logs + PKG_INFO_DIR := $(STAGING_DIR)/pkginfo + +-BUILD_DIR_HOST:=$(if $(IS_PACKAGE_BUILD),$(BUILD_DIR)/host,$(BUILD_DIR_BASE)/host) ++BUILD_DIR_HOST:=$(if $(IS_PACKAGE_BUILD),$(BUILD_DIR_BASE)/hostpkg,$(BUILD_DIR_BASE)/host) + STAGING_DIR_HOST:=$(TOPDIR)/staging_dir/host +-STAGING_DIR_HOSTPKG:=$(STAGING_DIR)/host ++STAGING_DIR_HOSTPKG:=$(TOPDIR)/staging_dir/hostpkg + + TARGET_PATH:=$(subst $(space),:,$(filter-out .,$(filter-out ./,$(subst :,$(space),$(PATH))))) + TARGET_INIT_PATH:=$(call qstrip,$(CONFIG_TARGET_INIT_PATH)) +@@ -206,7 +206,7 @@ ifndef DUMP + endif + endif + endif +-TARGET_PATH_PKG:=$(STAGING_DIR)/host/bin:$(TARGET_PATH) ++TARGET_PATH_PKG:=$(STAGING_DIR)/host/bin:$(STAGING_DIR_HOSTPKG)/bin:$(TARGET_PATH) + + ifeq ($(CONFIG_SOFT_FLOAT),y) + SOFT_FLOAT_CONFIG_OPTION:=--with-float=soft +@@ -232,9 +232,9 @@ export PKG_CONFIG + + HOSTCC:=gcc + HOSTCXX:=g++ +-HOST_CPPFLAGS:=-I$(STAGING_DIR_HOST)/include -I$(STAGING_DIR_HOST)/usr/include $(if $(IS_PACKAGE_BUILD),-I$(STAGING_DIR)/host/include) ++HOST_CPPFLAGS:=-I$(STAGING_DIR_HOST)/include -I$(STAGING_DIR_HOST)/usr/include $(if $(IS_PACKAGE_BUILD),-I$(STAGING_DIR_HOSTPKG)/include -I$(STAGING_DIR)/host/include) + HOST_CFLAGS:=-O2 $(HOST_CPPFLAGS) +-HOST_LDFLAGS:=-L$(STAGING_DIR_HOST)/lib -L$(STAGING_DIR_HOST)/usr/lib $(if $(IS_PACKAGE_BUILD),-L$(STAGING_DIR)/host/lib) ++HOST_LDFLAGS:=-L$(STAGING_DIR_HOST)/lib -L$(STAGING_DIR_HOST)/usr/lib $(if $(IS_PACKAGE_BUILD),-L$(STAGING_DIR_HOSTPKG)/lib -L$(STAGING_DIR)/host/lib) + + ifeq ($(CONFIG_EXTERNAL_TOOLCHAIN),) + TARGET_AR:=$(TARGET_CROSS)gcc-ar diff --git a/patches/openwrt/0002-procd-add-support-for-alternative-rc.d-directories.patch b/patches/lede/0002-procd-add-support-for-alternative-rc.d-directories.patch similarity index 100% rename from patches/openwrt/0002-procd-add-support-for-alternative-rc.d-directories.patch rename to patches/lede/0002-procd-add-support-for-alternative-rc.d-directories.patch diff --git a/patches/lede/0003-base-files-disable-reset-button-handling.patch b/patches/lede/0003-base-files-disable-reset-button-handling.patch new file mode 100644 index 00000000..7e44f290 --- /dev/null +++ b/patches/lede/0003-base-files-disable-reset-button-handling.patch @@ -0,0 +1,43 @@ +From: Matthias Schiffer +Date: Sat, 21 Mar 2015 16:40:52 +0100 +Subject: base-files: disable reset button handling + +This conflicts with our reset button usage. + +diff --git a/package/base-files/files/etc/rc.button/reset b/package/base-files/files/etc/rc.button/reset +deleted file mode 100755 +index 4265767437e8eda3c758fe7f7941d7f608c95782..0000000000000000000000000000000000000000 +--- a/package/base-files/files/etc/rc.button/reset ++++ /dev/null +@@ -1,31 +0,0 @@ +-#!/bin/sh +- +-. /lib/functions.sh +- +-OVERLAY="$( grep ' /overlay ' /proc/mounts )" +- +-case "$ACTION" in +-pressed) +- [ -z "$OVERLAY" ] && return 0 +- +- return 5 +-;; +-timeout) +- . /etc/diag.sh +- set_state failsafe +-;; +-released) +- if [ "$SEEN" -lt 1 ] +- then +- echo "REBOOT" > /dev/console +- sync +- reboot +- elif [ "$SEEN" -gt 5 -a -n "$OVERLAY" ] +- then +- echo "FACTORY RESET" > /dev/console +- jffs2reset -y && reboot & +- fi +-;; +-esac +- +-return 0 diff --git a/patches/openwrt/0009-hostapd-prevent-channel-switch-for-5GHz.patch b/patches/lede/0004-hostapd-prevent-channel-switch-for-5GHz.patch similarity index 100% rename from patches/openwrt/0009-hostapd-prevent-channel-switch-for-5GHz.patch rename to patches/lede/0004-hostapd-prevent-channel-switch-for-5GHz.patch diff --git a/patches/openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch b/patches/lede/0005-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch similarity index 100% rename from patches/openwrt/0042-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch rename to patches/lede/0005-libjson-c-Add-support-for-custom-format-strings-for-doubles.patch diff --git a/patches/lede/0006-dropbear-add-a-failsafe-mode-that-will-always-allow-password-less-root-login.patch b/patches/lede/0006-dropbear-add-a-failsafe-mode-that-will-always-allow-password-less-root-login.patch new file mode 100644 index 00000000..d0a36b27 --- /dev/null +++ b/patches/lede/0006-dropbear-add-a-failsafe-mode-that-will-always-allow-password-less-root-login.patch @@ -0,0 +1,69 @@ +From: Matthias Schiffer +Date: Tue, 27 Sep 2016 03:55:55 +0200 +Subject: dropbear: add a failsafe mode that will always allow password-less root login + +Signed-off-by: Matthias Schiffer + +diff --git a/package/network/services/dropbear/patches/700-failsafe-mode.patch b/package/network/services/dropbear/patches/700-failsafe-mode.patch +new file mode 100644 +index 0000000000000000000000000000000000000000..c6e45423e2dba1258549a5bfe4b5a59ac32d73d8 +--- /dev/null ++++ b/package/network/services/dropbear/patches/700-failsafe-mode.patch +@@ -0,0 +1,57 @@ ++--- a/runopts.h +++++ b/runopts.h ++@@ -97,6 +97,8 @@ typedef struct svr_runopts { ++ int norootpass; ++ int allowblankpass; ++ +++ int failsafe_mode; +++ ++ #ifdef ENABLE_SVR_REMOTETCPFWD ++ int noremotetcp; ++ #endif ++--- a/svr-auth.c +++++ b/svr-auth.c ++@@ -149,10 +149,11 @@ void recv_msg_userauth_request() { ++ AUTH_METHOD_NONE_LEN) == 0) { ++ TRACE(("recv_msg_userauth_request: 'none' request")) ++ if (valid_user ++- && (svr_opts.allowblankpass || !strcmp(ses.authstate.pw_name, "root")) ++- && !svr_opts.noauthpass ++- && !(svr_opts.norootpass && ses.authstate.pw_uid == 0) ++- && ses.authstate.pw_passwd[0] == '\0') +++ && ((svr_opts.failsafe_mode && !strcmp(ses.authstate.pw_name, "root")) +++ || ((svr_opts.allowblankpass || !strcmp(ses.authstate.pw_name, "root")) +++ && !svr_opts.noauthpass +++ && !(svr_opts.norootpass && ses.authstate.pw_uid == 0) +++ && ses.authstate.pw_passwd[0] == '\0'))) ++ { ++ dropbear_log(LOG_NOTICE, ++ "Auth succeeded with blank password for '%s' from %s", ++--- a/svr-runopts.c +++++ b/svr-runopts.c ++@@ -72,6 +72,7 @@ static void printhelp(const char * progn ++ "-s Disable password logins\n" ++ "-g Disable password logins for root\n" ++ "-B Allow blank password logins\n" +++ "-f Failsafe mode: always allow password-less root login\n" ++ #endif ++ #ifdef ENABLE_SVR_LOCALTCPFWD ++ "-j Disable local port forwarding\n" ++@@ -130,6 +131,7 @@ void svr_getopts(int argc, char ** argv) ++ svr_opts.noauthpass = 0; ++ svr_opts.norootpass = 0; ++ svr_opts.allowblankpass = 0; +++ svr_opts.failsafe_mode = 0; ++ svr_opts.inetdmode = 0; ++ svr_opts.portcount = 0; ++ svr_opts.hostkey = NULL; ++@@ -244,6 +246,9 @@ void svr_getopts(int argc, char ** argv) ++ case 'B': ++ svr_opts.allowblankpass = 1; ++ break; +++ case 'f': +++ svr_opts.failsafe_mode = 1; +++ break; ++ #endif ++ case 'h': ++ printhelp(argv[0]); diff --git a/patches/openwrt/0001-tools-Makefile-fix-host-tools-build-dependencies.patch b/patches/openwrt/0001-tools-Makefile-fix-host-tools-build-dependencies.patch deleted file mode 100644 index e86fba90..00000000 --- a/patches/openwrt/0001-tools-Makefile-fix-host-tools-build-dependencies.patch +++ /dev/null @@ -1,36 +0,0 @@ -From: Matthias Schiffer -Date: Sat, 26 Jul 2014 06:10:23 +0200 -Subject: tools/Makefile: fix host tools build dependencies - -diff --git a/tools/Makefile b/tools/Makefile -index d2fe2ffddf4b7207a937ca75efe1c2728e8067aa..c6cded8eccd81c422f99e7ee50754c4bc66decc7 100644 ---- a/tools/Makefile -+++ b/tools/Makefile -@@ -95,10 +95,16 @@ define PrepareStaging - endef - - # preparatory work -+ifneq ($(ARCH),) -+staging_prepared = $(STAGING_DIR)/.prepared -+ - $(STAGING_DIR)/.prepared: $(TMP_DIR)/.build - $(call PrepareStaging,$(STAGING_DIR)) - mkdir -p $(BUILD_DIR)/stamp - touch $@ -+else -+staging_prepared := -+endif - - $(STAGING_DIR_HOST)/.prepared: $(TMP_DIR)/.build - $(call PrepareStaging,$(STAGING_DIR_HOST)) -@@ -110,8 +116,8 @@ $(STAGING_DIR_HOST)/.prepared: $(TMP_DIR)/.build - - endif - --$(curdir)//prepare = $(STAGING_DIR)/.prepared $(STAGING_DIR_HOST)/.prepared --$(curdir)//compile = $(STAGING_DIR)/.prepared $(STAGING_DIR_HOST)/.prepared -+$(curdir)//prepare = $(staging_prepared) $(STAGING_DIR_HOST)/.prepared -+$(curdir)//compile = $(staging_prepared) $(STAGING_DIR_HOST)/.prepared - - # prerequisites for the individual targets - $(curdir)/ := .config prereq diff --git a/patches/openwrt/0003-odhcp6c-backport-from-LEDE-0d49f9f4b4da9d1960f82e68ae797290e4b9c434.patch b/patches/openwrt/0003-odhcp6c-backport-from-LEDE-0d49f9f4b4da9d1960f82e68ae797290e4b9c434.patch deleted file mode 100644 index 75993f39..00000000 --- a/patches/openwrt/0003-odhcp6c-backport-from-LEDE-0d49f9f4b4da9d1960f82e68ae797290e4b9c434.patch +++ /dev/null @@ -1,118 +0,0 @@ -From: Matthias Schiffer -Date: Tue, 17 Jan 2017 22:08:21 +0100 -Subject: odhcp6c: backport from LEDE 0d49f9f4b4da9d1960f82e68ae797290e4b9c434 - -diff --git a/package/network/ipv6/odhcp6c/Makefile b/package/network/ipv6/odhcp6c/Makefile -index 3705705f6540dc841c7041e81f6d208a41a1f08a..a8e45588a52859daf14c68c665a53690b9d09be2 100644 ---- a/package/network/ipv6/odhcp6c/Makefile -+++ b/package/network/ipv6/odhcp6c/Makefile -@@ -8,15 +8,16 @@ - include $(TOPDIR)/rules.mk - - PKG_NAME:=odhcp6c --PKG_VERSION:=2016-02-08 -+PKG_VERSION:=2017-01-07 - PKG_RELEASE=$(PKG_SOURCE_VERSION) - - PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 - PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) --PKG_SOURCE_URL:=https://github.com/openwrt/odhcp6c.git -+PKG_SOURCE_URL:=git://git.lede-project.org/project/odhcp6c.git - PKG_SOURCE_PROTO:=git --PKG_SOURCE_VERSION:=dc186d6d2b0dd4ad23ca5fc69c00e81f796ff6d9 --PKG_MAINTAINER:=Steven Barth -+PKG_SOURCE_VERSION:=d420f49396c627ce1072b83170889baf0720bc8b -+PKG_MIRROR_HASH:=a7c599b5600b6cca9aec221dd32fc7754e0e942b0192bd902f1e789f53345127 -+PKG_MAINTAINER:=Hans Dedecker - PKG_LICENSE:=GPL-2.0 - - include $(INCLUDE_DIR)/package.mk -@@ -30,7 +31,7 @@ define Package/odhcp6c - SECTION:=net - CATEGORY:=Network - TITLE:=Embedded DHCPv6-client for OpenWrt -- DEPENDS:=+kmod-ipv6 -+ DEPENDS:=@IPV6 +libubox - endef - - define Package/odhcp6c/config -diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.script b/package/network/ipv6/odhcp6c/files/dhcpv6.script -index 677d35f4f92e82d6a7fe9ca01a35e071097baca8..1bb5e771b6dc80c1f5bceef88508d92cc69b1d3a 100755 ---- a/package/network/ipv6/odhcp6c/files/dhcpv6.script -+++ b/package/network/ipv6/odhcp6c/files/dhcpv6.script -@@ -77,6 +77,11 @@ setup_interface () { - -z "$RA_DNS" -a "$FAKE_ROUTES" = 1 ]; then - RA_ROUTES="::/0,$SERVER,$valid,4096" - fi -+ -+ # RFC 7278 -+ if [ "$mask" -eq 64 -a -z "$PREFIXES" -a -n "$EXTENDPREFIX" ]; then -+ proto_add_ipv6_prefix "$addr/$mask,$preferred,$valid" -+ fi - done - - for entry in $RA_ROUTES; do -@@ -180,7 +185,7 @@ setup_interface () { - # Apply IPv6 / ND configuration - HOPLIMIT=$(cat /proc/sys/net/ipv6/conf/$device/hop_limit) - [ -n "$RA_HOPLIMIT" -a -n "$HOPLIMIT" ] && [ "$RA_HOPLIMIT" -gt "$HOPLIMIT" ] && echo "$RA_HOPLIMIT" > /proc/sys/net/ipv6/conf/$device/hop_limit -- [ -n "$RA_MTU" ] && [ "$RA_MTU" -gt 0 ] && echo "$RA_MTU" > /proc/sys/net/ipv6/conf/$device/mtu -+ [ -n "$RA_MTU" ] && [ "$RA_MTU" -ge 1280 ] && echo "$RA_MTU" > /proc/sys/net/ipv6/conf/$device/mtu 2>/dev/null - [ -n "$RA_REACHABLE" ] && [ "$RA_REACHABLE" -gt 0 ] && echo "$RA_REACHABLE" > /proc/sys/net/ipv6/neigh/$device/base_reachable_time_ms - [ -n "$RA_RETRANSMIT" ] && [ "$RA_RETRANSMIT" -gt 0 ] && echo "$RA_RETRANSMIT" > /proc/sys/net/ipv6/neigh/$device/retrans_time_ms - -@@ -209,6 +214,6 @@ case "$2" in - esac - - # user rules --[ -f /etc/odhcp6c.user ] && . /etc/odhcp6c.user -+[ -f /etc/odhcp6c.user ] && . /etc/odhcp6c.user "@" - - exit 0 -diff --git a/package/network/ipv6/odhcp6c/files/dhcpv6.sh b/package/network/ipv6/odhcp6c/files/dhcpv6.sh -index 4a453fdc4d94d9298067a986b0e4c6054b6c0a60..9e3f6697335a55cf4be1751fec907a4ac93f09ec 100755 ---- a/package/network/ipv6/odhcp6c/files/dhcpv6.sh -+++ b/package/network/ipv6/odhcp6c/files/dhcpv6.sh -@@ -13,6 +13,7 @@ proto_dhcpv6_init_config() { - proto_config_add_string 'reqopts:list(uinteger)' - proto_config_add_string 'noslaaconly:bool' - proto_config_add_string 'forceprefix:bool' -+ proto_config_add_string 'extendprefix:bool' - proto_config_add_string 'norelease:bool' - proto_config_add_string 'ip6prefix:ip6addr' - proto_config_add_string iface_dslite -@@ -29,14 +30,15 @@ proto_dhcpv6_init_config() { - proto_config_add_int "soltimeout" - proto_config_add_boolean fakeroutes - proto_config_add_boolean sourcefilter -+ proto_config_add_boolean keep_ra_dnslifetime - } - - proto_dhcpv6_setup() { - local config="$1" - local iface="$2" - -- local reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter -- json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter -+ local reqaddress reqprefix clientid reqopts noslaaconly forceprefix extendprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter keep_ra_dnslifetime -+ json_get_vars reqaddress reqprefix clientid reqopts noslaaconly forceprefix extendprefix norelease ip6prefix iface_dslite iface_map iface_464xlat ifaceid userclass vendorclass delegate zone_dslite zone_map zone_464xlat zone soltimeout fakeroutes sourcefilter keep_ra_dnslifetime - - - # Configure -@@ -60,6 +62,8 @@ proto_dhcpv6_setup() { - - [ -n "$userclass" ] && append opts "-u$userclass" - -+ [ "$keep_ra_dnslifetime" = "1" ] && append opts "-L" -+ - for opt in $reqopts; do - append opts "-r$opt" - done -@@ -78,6 +82,7 @@ proto_dhcpv6_setup() { - [ -n "$zone" ] && proto_export "ZONE=$zone" - [ "$fakeroutes" != "0" ] && proto_export "FAKE_ROUTES=1" - [ "$sourcefilter" = "0" ] && proto_export "NOSOURCEFILTER=1" -+ [ "$extendprefix" = "1" ] && proto_export "EXTENDPREFIX=1" - - proto_export "INTERFACE=$config" - proto_run_command "$config" odhcp6c \ diff --git a/patches/openwrt/0004-busybox-enable-telnet-only-when-root-password-is-really-empty-not-when-it-is-locked.patch b/patches/openwrt/0004-busybox-enable-telnet-only-when-root-password-is-really-empty-not-when-it-is-locked.patch deleted file mode 100644 index 74e6ad36..00000000 --- a/patches/openwrt/0004-busybox-enable-telnet-only-when-root-password-is-really-empty-not-when-it-is-locked.patch +++ /dev/null @@ -1,26 +0,0 @@ -From: Matthias Schiffer -Date: Fri, 5 Dec 2014 18:57:16 +0100 -Subject: busybox: enable telnet only when root password is really empty, not when it is locked - -diff --git a/package/utils/busybox/files/telnet b/package/utils/busybox/files/telnet -index a1d1cdf9b18d69895e7a08a8b1318f1ff591ea07..f95be90490597f6251d8c3e1247b522dfd9e72c0 100755 ---- a/package/utils/busybox/files/telnet -+++ b/package/utils/busybox/files/telnet -@@ -11,7 +11,7 @@ has_root_pwd() { - pwd="${pwd#*root:}" - pwd="${pwd%%:*}" - -- test -n "${pwd#[\!x]}" -+ test -n "${pwd}" - } - - get_root_home() { -@@ -28,7 +28,7 @@ has_ssh_pubkey() { - - start_service() { - if ( ! has_ssh_pubkey && \ -- ! has_root_pwd /etc/passwd && ! has_root_pwd /etc/shadow ) || \ -+ ( ! has_root_pwd /etc/passwd || ! has_root_pwd /etc/shadow ) ) || \ - ( ! /etc/init.d/dropbear enabled 2> /dev/null && ! /etc/init.d/sshd enabled 2> /dev/null ); - then - procd_open_instance diff --git a/patches/openwrt/0005-base-files-disable-reset-button-handling.patch b/patches/openwrt/0005-base-files-disable-reset-button-handling.patch deleted file mode 100644 index 3d990893..00000000 --- a/patches/openwrt/0005-base-files-disable-reset-button-handling.patch +++ /dev/null @@ -1,32 +0,0 @@ -From: Matthias Schiffer -Date: Sat, 21 Mar 2015 16:40:52 +0100 -Subject: base-files: disable reset button handling - -This conflicts with our reset button usage. - -diff --git a/package/base-files/files/etc/rc.button/reset b/package/base-files/files/etc/rc.button/reset -deleted file mode 100755 -index 3e241460efbb08abaa775c1a7843b5fa3e237d44..0000000000000000000000000000000000000000 ---- a/package/base-files/files/etc/rc.button/reset -+++ /dev/null -@@ -1,20 +0,0 @@ --#!/bin/sh -- --[ "${ACTION}" = "released" ] || exit 0 -- --. /lib/functions.sh -- --logger "$BUTTON pressed for $SEEN seconds" -- --if [ "$SEEN" -lt 1 ] --then -- echo "REBOOT" > /dev/console -- sync -- reboot --elif [ "$SEEN" -gt 5 ] --then -- echo "FACTORY RESET" > /dev/console -- jffs2reset -y && reboot & --fi -- --return 0 diff --git a/patches/openwrt/0006-ar71xx-define-wmac-reset-function-for-QCA955x.patch b/patches/openwrt/0006-ar71xx-define-wmac-reset-function-for-QCA955x.patch deleted file mode 100644 index dfc85491..00000000 --- a/patches/openwrt/0006-ar71xx-define-wmac-reset-function-for-QCA955x.patch +++ /dev/null @@ -1,85 +0,0 @@ -From: Matthias Schiffer -Date: Tue, 19 Jul 2016 17:48:53 +0200 -Subject: ar71xx: define wmac reset function for QCA955x - -Signed-off-by: Felix Fietkau - -Backport of LEDE a176168a85477caa44eef7e979567d1d52868fde - -diff --git a/target/linux/ar71xx/patches-3.18/640-MIPS-ath79-add-QCA955x-wmac-reset.patch b/target/linux/ar71xx/patches-3.18/640-MIPS-ath79-add-QCA955x-wmac-reset.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..4ac5acd618748fc9ad0f091d110d2503cdc39d53 ---- /dev/null -+++ b/target/linux/ar71xx/patches-3.18/640-MIPS-ath79-add-QCA955x-wmac-reset.patch -@@ -0,0 +1,71 @@ -+--- a/arch/mips/ath79/common.h -++++ b/arch/mips/ath79/common.h -+@@ -19,6 +19,8 @@ -+ #define ATH79_MEM_SIZE_MIN (2 * 1024 * 1024) -+ #define ATH79_MEM_SIZE_MAX (128 * 1024 * 1024) -+ -++extern void __iomem *ath79_ddr_base; -++ -+ void ath79_clocks_init(void); -+ unsigned long ath79_get_sys_clk_rate(const char *id); -+ -+--- a/arch/mips/ath79/dev-wmac.c -++++ b/arch/mips/ath79/dev-wmac.c -+@@ -149,6 +149,27 @@ static void ar934x_wmac_setup(void) -+ ath79_wmac_data.is_clk_25mhz = true; -+ } -+ -++static int ar955x_wmac_reset(void) -++{ -++ int i; -++ -++ /* Try to wait for WMAC DDR activity to stop */ -++ for (i = 0; i < 10; i++) { -++ if (!(__raw_readl(ath79_ddr_base + QCA955X_DDR_CTL_CONFIG) & -++ QCA955X_DDR_CTL_CONFIG_ACT_WMAC)) -++ break; -++ -++ udelay(10); -++ } -++ -++ ath79_device_reset_set(QCA955X_RESET_RTC); -++ udelay(10); -++ ath79_device_reset_clear(QCA955X_RESET_RTC); -++ udelay(10); -++ -++ return 0; -++} -++ -+ static void qca955x_wmac_setup(void) -+ { -+ u32 t; -+@@ -165,6 +186,8 @@ static void qca955x_wmac_setup(void) -+ ath79_wmac_data.is_clk_25mhz = false; -+ else -+ ath79_wmac_data.is_clk_25mhz = true; -++ -++ ath79_wmac_data.external_reset = ar955x_wmac_reset; -+ } -+ -+ static bool __init -+--- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -++++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h -+@@ -32,7 +32,7 @@ -+ #define AR71XX_SPI_SIZE 0x01000000 -+ -+ #define AR71XX_DDR_CTRL_BASE (AR71XX_APB_BASE + 0x00000000) -+-#define AR71XX_DDR_CTRL_SIZE 0x100 -++#define AR71XX_DDR_CTRL_SIZE 0x200 -+ #define AR71XX_UART_BASE (AR71XX_APB_BASE + 0x00020000) -+ #define AR71XX_UART_SIZE 0x100 -+ #define AR71XX_USB_CTRL_BASE (AR71XX_APB_BASE + 0x00030000) -+@@ -173,6 +173,9 @@ -+ #define AR934X_DDR_REG_FLUSH_PCIE 0xa8 -+ #define AR934X_DDR_REG_FLUSH_WMAC 0xac -+ -++#define QCA955X_DDR_CTL_CONFIG 0x108 -++#define QCA955X_DDR_CTL_CONFIG_ACT_WMAC BIT(23) -++ -+ /* -+ * PLL block -+ */ diff --git a/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch b/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch deleted file mode 100644 index 5a47e39d..00000000 --- a/patches/openwrt/0007-mac80211-hostapd-iw-.-update.patch +++ /dev/null @@ -1,25894 +0,0 @@ -From: Matthias Schiffer -Date: Tue, 11 Oct 2016 02:53:43 +0200 -Subject: mac80211, hostapd, iw, ...: update - -The following package is updated to -LEDE 6c2651566cce8f5b3a3d3b976439dee2bac5e07e: - -* mac80211 - -The following packages are updated to -LEDE 42f559ed70897a7b74dd3e6293b42e6d2e511eaa: - -* acx-mac80211 -* ath10k-firmware -* hostapd -* iw -* linux-firmware -* mt76 - -diff --git a/package/firmware/ath10k-firmware/Makefile b/package/firmware/ath10k-firmware/Makefile -index b03d64491a554fafb72170eaa4fae171b5599835..624da6a1ed43ea37bbb3409b3dbe4b3af01263b5 100644 ---- a/package/firmware/ath10k-firmware/Makefile -+++ b/package/firmware/ath10k-firmware/Makefile -@@ -8,7 +8,7 @@ - include $(TOPDIR)/rules.mk - - PKG_NAME:=ath10k-firmware --PKG_SOURCE_VERSION:=77f72b5f7dd940386d9e619a17904987759b7186 -+PKG_SOURCE_VERSION:=b00eb8d30fbebb6a5047ccacefa8c37e072fca9c - PKG_VERSION:=2014-11-13-$(PKG_SOURCE_VERSION) - PKG_RELEASE:=1 - -@@ -17,7 +17,7 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz - PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) - PKG_SOURCE_URL:=https://github.com/kvalo/ath10k-firmware.git - --PKG_MAINTAINER:=Felix Fietkau -+PKG_MAINTAINER:=Felix Fietkau - - include $(INCLUDE_DIR)/package.mk - -@@ -28,14 +28,48 @@ define Package/ath10k-firmware-default - CATEGORY:=Kernel modules - SUBMENU:=$(WMENU) - URL:=$(PKG_SOURCE_URL) -+ DEPENDS:= - endef - -+define Package/ath10k-firmware-qca9887 -+$(Package/ath10k-firmware-default) -+ TITLE:=ath10k firmware for QCA9887 devices -+endef -+ -+QCA9887_REV:=3cce88e245f2d685e49411c4f80998f94baf67b8 -+QCA9887_FIRMWARE_FILE:=firmware-5.bin_10.2.4-1.0-00013 -+QCA9887_FIRMWARE_FILE_MD5:=bd9cdcbf49561c7176432a81c29e7e87 -+QCA9887_FIRMWARE_FILE_DL:=$(QCA9887_FIRMWARE_FILE).$(QCA9887_FIRMWARE_FILE_MD5) -+QCA9887_BOARD_FILE:=board.bin -+QCA9887_BOARD_FILE_MD5:=ebf3af10160c45373f19e0b8226b02ae -+QCA9887_BOARD_FILE_DL:=$(QCA9887_BOARD_FILE).$(QCA9887_BOARD_FILE_MD5) -+ -+define Download/ath10k-qca9887-firmware -+ URL:=https://github.com/kvalo/ath10k-firmware/raw/$(QCA9887_REV)/QCA9887/hw1.0/ -+ URL_FILE:=$(QCA9887_FIRMWARE_FILE) -+ FILE:=$(QCA9887_FIRMWARE_FILE_DL) -+ MD5SUM:=$(QCA9887_FIRMWARE_FILE_MD5) -+endef -+$(eval $(call Download,ath10k-qca9887-firmware)) -+ -+define Download/ath10k-qca9887-board -+ URL:=https://github.com/kvalo/ath10k-firmware/raw/$(QCA9887_REV)/QCA9887/hw1.0/ -+ URL_FILE:=$(QCA9887_BOARD_FILE) -+ FILE:=$(QCA9887_BOARD_FILE_DL) -+ MD5SUM:=$(QCA9887_BOARD_FILE_MD5) -+endef -+$(eval $(call Download,ath10k-qca9887-board)) -+ - define Package/ath10k-firmware-qca988x - $(Package/ath10k-firmware-default) -+ DEFAULT:=PACKAGE_kmod-ath10k - TITLE:=ath10k firmware for QCA988x devices - endef - - QCA988X_FIRMWARE_FILE:=firmware-5.bin_10.2.4.97-1 -+QCA988X_FIRMWARE_FILE_CT:=firmware-2-ct-full-community-16.1.bin-lede -+QCA99X0_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-7.bin-lede.004 -+QCA9984_FIRMWARE_FILE_CT:=firmware-5-ct-full-community-7.bin-lede.004 - - define Download/ath10k-firmware-qca988x - URL:=https://www.codeaurora.org/cgit/quic/qsdk/oss/firmware/ath10k-firmware/plain/10.2.4/ -@@ -44,11 +78,83 @@ define Download/ath10k-firmware-qca988x - endef - $(eval $(call Download,ath10k-firmware-qca988x)) - -+define Download/ath10k-firmware-qca988x-ct -+ URL:=https://www.candelatech.com/downloads/ -+ FILE:=$(QCA988X_FIRMWARE_FILE_CT) -+ MD5SUM:=d7e081e9782936ed544b78994c9133fb -+endef -+$(eval $(call Download,ath10k-firmware-qca988x-ct)) -+ -+define Download/ath10k-firmware-qca99x0-ct -+ URL:=https://www.candelatech.com/downloads/ath10k-10-4/ -+ FILE:=$(QCA99X0_FIRMWARE_FILE_CT) -+ MD5SUM:=809bb9bf8a18ea218a8e1b9ffc0f8447 -+endef -+$(eval $(call Download,ath10k-firmware-qca99x0-ct)) -+ -+define Download/ath10k-firmware-qca9984-ct -+ URL:=https://www.candelatech.com/downloads/ath10k-9984-10-4/ -+ FILE:=$(QCA9984_FIRMWARE_FILE_CT) -+ MD5SUM:=924eb8ea30de11299b13e207469a3350 -+endef -+$(eval $(call Download,ath10k-firmware-qca9984-ct)) -+ - define Package/ath10k-firmware-qca99x0 - $(Package/ath10k-firmware-default) - TITLE:=ath10k firmware for QCA99x0 devices - endef - -+define Package/ath10k-firmware-qca988x-ct -+$(Package/ath10k-firmware-default) -+ TITLE:=ath10k CT 10.1 firmware for QCA988x devices -+endef -+ -+define Package/ath10k-firmware-qca988x-ct/description -+Alternative ath10k firmware for QCA988X from Candela Technologies. -+Enables IBSS and other features. See: -+http://www.candelatech.com/ath10k-10.1.php -+This firmware will NOT be used unless the standard ath10k-firmware-qca988x -+is un-selected since the driver will try to load firmware-5.bin before -+firmware-2.bin -+endef -+ -+define Package/ath10k-firmware-qca99x0-ct/description -+Alternative ath10k firmware for QCA99x0 from Candela Technologies. -+Enables IBSS and other features. See: -+http://www.candelatech.com/ath10k-10.4.php -+This firmware conflicts with the standard 99x0 firmware, so select only -+one. -+endef -+ -+define Package/ath10k-firmware-qca9984-ct/description -+Alternative ath10k firmware for QCA9984 from Candela Technologies. -+Enables IBSS and other features. See: -+http://www.candelatech.com/ath10k-10.4-9984.php -+This firmware conflicts with the standard 9984 firmware, so select only -+one. -+endef -+ -+define Package/ath10k-firmware-qca99x0/description -+Standard ath10k firmware for QCA99x0 from QCA -+This firmware conflicts with the CT 99x0 firmware, so select only -+one. -+endef -+ -+define Package/ath10k-firmware-qca99x0-ct -+$(Package/ath10k-firmware-default) -+ TITLE:=ath10k CT 10.4.3 firmware for QCA99x0 devices -+endef -+ -+define Package/ath10k-firmware-qca9984-ct -+$(Package/ath10k-firmware-default) -+ TITLE:=ath10k CT 10.4.3 firmware for QCA9984 devices -+endef -+ -+define Package/ath10k-firmware-qca9984 -+$(Package/ath10k-firmware-default) -+ TITLE:=ath10k firmware for QCA9984 devices -+endef -+ - define Package/ath10k-firmware-qca6174 - $(Package/ath10k-firmware-default) - TITLE:=ath10k firmware for QCA6174 devices -@@ -58,8 +164,8 @@ QCA99X0_BOARD_REV:=ddcec9efd245da9365c474f513a855a55f3ac7fe - QCA99X0_BOARD_FILE:=board-2.bin.$(QCA99X0_BOARD_REV) - - define Download/qca99x0-board -- URL:=https://www.codeaurora.org/cgit/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA99X0/hw2.0 -- URL_FILE:=board-2.bin?id=ddcec9efd245da9365c474f513a855a55f3ac7fe -+ URL:=https://source.codeaurora.org/quic/qsdk/oss/firmware/ath10k-firmware/plain/ath10k/QCA99X0/hw2.0 -+ URL_FILE:=board-2.bin?id=$(QCA99X0_BOARD_REV) - FILE:=$(QCA99X0_BOARD_FILE) - MD5SUM:=a2b3c653c2363a5641200051d6333d0a - endef -@@ -69,6 +175,16 @@ define Build/Compile - - endef - -+define Package/ath10k-firmware-qca9887/install -+ $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9887/hw1.0 -+ $(INSTALL_DATA) \ -+ $(DL_DIR)/$(QCA9887_FIRMWARE_FILE_DL) \ -+ $(1)/lib/firmware/ath10k/QCA9887/hw1.0/firmware-5.bin -+ $(INSTALL_DATA) \ -+ $(DL_DIR)/$(QCA9887_BOARD_FILE_DL) \ -+ $(1)/lib/firmware/ath10k/QCA9887/hw1.0/board.bin -+endef -+ - define Package/ath10k-firmware-qca988x/install - $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0 - $(INSTALL_DATA) \ -@@ -79,6 +195,16 @@ define Package/ath10k-firmware-qca988x/install - $(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-5.bin - endef - -+define Package/ath10k-firmware-qca988x-ct/install -+ $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0 -+ $(INSTALL_DATA) \ -+ $(PKG_BUILD_DIR)/QCA988X/board.bin \ -+ $(1)/lib/firmware/ath10k/QCA988X/hw2.0/ -+ $(INSTALL_DATA) \ -+ $(DL_DIR)/$(QCA988X_FIRMWARE_FILE_CT) \ -+ $(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-2.bin -+endef -+ - define Package/ath10k-firmware-qca6174/install - $(INSTALL_DIR) $(1)/lib/firmware/ath10k - $(CP) $(PKG_BUILD_DIR)/QCA6174 $(1)/lib/firmware/ath10k/ -@@ -97,6 +223,51 @@ define Package/ath10k-firmware-qca99x0/install - $(1)/lib/firmware/ath10k/QCA99X0/hw2.0/firmware-5.bin - endef - -+define Package/ath10k-firmware-qca99x0-ct/install -+ $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA99X0/hw2.0 -+ $(INSTALL_DATA) \ -+ $(DL_DIR)/$(QCA99X0_BOARD_FILE) \ -+ $(1)/lib/firmware/ath10k/QCA99X0/hw2.0/board-2.bin -+ $(INSTALL_DATA) \ -+ $(PKG_BUILD_DIR)/QCA99X0/hw2.0/boardData_AR900B_CUS239_5G_v2_001.bin \ -+ $(1)/lib/firmware/ath10k/QCA99X0/hw2.0/board.bin -+ $(INSTALL_DATA) \ -+ $(DL_DIR)/$(QCA99X0_FIRMWARE_FILE_CT) \ -+ $(1)/lib/firmware/ath10k/QCA99X0/hw2.0/firmware-5.bin -+endef -+ -+define Package/ath10k-firmware-qca9984/install -+ $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9984/hw1.0 -+ ln -s \ -+ ../../cal-pci-0000:01:00.0.bin \ -+ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board.bin -+ $(INSTALL_DATA) \ -+ $(PKG_BUILD_DIR)/QCA9984/hw1.0/board-2.bin \ -+ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board-2.bin -+ $(INSTALL_DATA) \ -+ $(PKG_BUILD_DIR)/QCA9984/hw1.0/firmware-5.bin_10.4-3.2-00072 \ -+ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/firmware-5.bin -+endef -+ -+define Package/ath10k-firmware-qca9984-ct/install -+ $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA9984/hw1.0 -+ ln -s \ -+ ../../cal-pci-0000:01:00.0.bin \ -+ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board.bin -+ $(INSTALL_DATA) \ -+ $(PKG_BUILD_DIR)/QCA9984/hw1.0/board-2.bin \ -+ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/board-2.bin -+ $(INSTALL_DATA) \ -+ $(DL_DIR)/$(QCA9984_FIRMWARE_FILE_CT) \ -+ $(1)/lib/firmware/ath10k/QCA9984/hw1.0/firmware-5.bin -+endef -+ -+$(eval $(call BuildPackage,ath10k-firmware-qca9887)) - $(eval $(call BuildPackage,ath10k-firmware-qca988x)) - $(eval $(call BuildPackage,ath10k-firmware-qca99x0)) - $(eval $(call BuildPackage,ath10k-firmware-qca6174)) -+$(eval $(call BuildPackage,ath10k-firmware-qca9984)) -+ -+$(eval $(call BuildPackage,ath10k-firmware-qca988x-ct)) -+$(eval $(call BuildPackage,ath10k-firmware-qca99x0-ct)) -+$(eval $(call BuildPackage,ath10k-firmware-qca9984-ct)) -diff --git a/package/firmware/linux-firmware/Makefile b/package/firmware/linux-firmware/Makefile -index 2fcd93b2ef104647a61c3aa40e2cef4404b1e484..ae5894cc56ff28271dff8871d640cc213c5c0107 100644 ---- a/package/firmware/linux-firmware/Makefile -+++ b/package/firmware/linux-firmware/Makefile -@@ -17,9 +17,9 @@ PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz - PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_SOURCE_VERSION) - PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR) - PKG_SOURCE_URL:=git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git --PKG_MIRROR_MD5SUM:=ca4d289ad9380471cae376fc7dd3660a -+PKG_MIRROR_MD5SUM:=8d44332359de89b1936b4ff608a72614 - --PKG_MAINTAINER:=Felix Fietkau -+PKG_MAINTAINER:=Felix Fietkau - - SCAN_DEPS = *.mk - -diff --git a/package/firmware/linux-firmware/realtek.mk b/package/firmware/linux-firmware/realtek.mk -index 0f8b1ce75053713b25ea601fd56ad02c410861b7..4229ca0ebbaa1fe55c3e30be5769c0cc492084d6 100644 ---- a/package/firmware/linux-firmware/realtek.mk -+++ b/package/firmware/linux-firmware/realtek.mk -@@ -43,8 +43,15 @@ endef - $(eval $(call BuildPackage,rtl8192de-firmware)) - - Package/rtl8192se-firmware = $(call Package/firmware-default,RealTek RTL8192SE firmware) --define KernelPackage/rtl8192se/install -+define Package/rtl8192se-firmware/install - $(INSTALL_DIR) $(1)/lib/firmware/rtlwifi - $(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8192sefw.bin $(1)/lib/firmware/rtlwifi - endef - $(eval $(call BuildPackage,rtl8192se-firmware)) -+ -+Package/rtl8192su-firmware = $(call Package/firmware-default,RealTek RTL8192SU firmware) -+define Package/rtl8192su-firmware/install -+ $(INSTALL_DIR) $(1)/lib/firmware/rtlwifi -+ $(INSTALL_DATA) $(PKG_BUILD_DIR)/rtlwifi/rtl8712u.bin $(1)/lib/firmware/rtlwifi -+endef -+$(eval $(call BuildPackage,rtl8192su-firmware)) -diff --git a/package/kernel/acx-mac80211/Makefile b/package/kernel/acx-mac80211/Makefile -index 1820e7abb3ed5adbe74c1e9774b9c910d72d34eb..8fce374d2b99446d11e3bf56b2df014fdd9cbc9d 100644 ---- a/package/kernel/acx-mac80211/Makefile -+++ b/package/kernel/acx-mac80211/Makefile -@@ -9,12 +9,12 @@ include $(TOPDIR)/rules.mk - include $(INCLUDE_DIR)/kernel.mk - - PKG_NAME:=acx-mac80211 --PKG_REV:=v20130127 --PKG_VERSION:=20130909 -+PKG_REV:=b6fc31491020cb01d2cd1acc170cfa03ced7e726 -+PKG_VERSION:=20140216 - PKG_RELEASE:=1 - - PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 --PKG_SOURCE_URL:=git://acx100.git.sourceforge.net/gitroot/acx100/acx-mac80211 -+PKG_SOURCE_URL:=http://git.code.sf.net/p/acx100/acx-mac80211 - PKG_SOURCE_PROTO:=git - PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) - PKG_SOURCE_VERSION:=$(PKG_REV) -@@ -190,7 +190,7 @@ define Build/Compile - CROSS_COMPILE="$(TARGET_CROSS)" \ - SUBDIRS="$(PKG_BUILD_DIR)" \ - $(PKG_EXTRA_KCONFIG) \ -- EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS) -DCONFIG_ACX_MAC80211_VERSION=\"KERNEL_VERSION(3,14,0)\"" \ -+ EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS) -DCONFIG_ACX_MAC80211_VERSION=\"KERNEL_VERSION(4,2,0)\"" \ - LINUXINCLUDE="-I$(STAGING_DIR)/usr/include/mac80211-backport/uapi -I$(STAGING_DIR)/usr/include/mac80211-backport \ - -I$(STAGING_DIR)/usr/include/mac80211/uapi -I$(STAGING_DIR)/usr/include/mac80211 \ - -I$(LINUX_DIR)/include -I$(LINUX_DIR)/include/$(LINUX_UAPI_DIR) \ -diff --git a/package/kernel/acx-mac80211/patches/001-pci-mem-Fix-3.8-build.patch b/package/kernel/acx-mac80211/patches/001-pci-mem-Fix-3.8-build.patch -deleted file mode 100644 -index fa4a6be6ab09ad9515ccc9595808a093aeac7ab2..0000000000000000000000000000000000000000 ---- a/package/kernel/acx-mac80211/patches/001-pci-mem-Fix-3.8-build.patch -+++ /dev/null -@@ -1,129 +0,0 @@ --From 8a0f5890019bf43f4bc95ef0754b062ddfcfa9cd Mon Sep 17 00:00:00 2001 --From: Oliver Winker --Date: Sun, 10 Mar 2013 21:04:23 +0100 --Subject: [PATCH 1/3] pci, mem: Fix 3.8 build -- --__devexit and __devinit not used anymore in 3.8 -- --Signed-off-by: Reinhard Karcher --Signed-off-by: Oliver Winker ----- -- mem.c | 13 ++++++++++++- -- pci.c | 26 +++++++++++++++++++++++++- -- 2 files changed, 37 insertions(+), 2 deletions(-) -- ----- a/mem.c --+++ b/mem.c --@@ -2216,7 +2216,11 @@ int acx100mem_ioctl_set_phy_amp_bias(str -- * ================================================== -- */ -- --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- static int __devinit acxmem_probe(struct platform_device *pdev) --+#else --+static int acxmem_probe(struct platform_device *pdev) --+#endif -- { -- acx_device_t *adev = NULL; -- const char *chip_name; --@@ -2392,7 +2396,11 @@ static int __devinit acxmem_probe(struct -- * pdev - ptr to PCI device structure containing info about pci -- * configuration -- */ --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- static int __devexit acxmem_remove(struct platform_device *pdev) --+#else --+static int acxmem_remove(struct platform_device *pdev) --+#endif -- { -- struct ieee80211_hw *hw = (struct ieee80211_hw *) -- platform_get_drvdata(pdev); --@@ -2594,8 +2602,11 @@ static struct platform_driver acxmem_dri -- .name = "acx-mem", -- }, -- .probe = acxmem_probe, --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- .remove = __devexit_p(acxmem_remove), --- --+#else --+ .remove = acxmem_remove, --+#endif -- #ifdef CONFIG_PM -- .suspend = acxmem_e_suspend, -- .resume = acxmem_e_resume ----- a/pci.c --+++ b/pci.c --@@ -1039,7 +1039,11 @@ int acx100pci_ioctl_set_phy_amp_bias(str -- * id - ptr to the device id entry that matched this device -- */ -- #ifdef CONFIG_PCI --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- static int __devinit acxpci_probe(struct pci_dev *pdev, --+#else --+static int acxpci_probe(struct pci_dev *pdev, --+#endif -- const struct pci_device_id *id) -- { -- unsigned long mem_region1 = 0; --@@ -1292,7 +1296,11 @@ static int __devinit acxpci_probe(struct -- * -- * pdev - ptr to PCI device structure containing info about pci configuration -- */ --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- static void __devexit acxpci_remove(struct pci_dev *pdev) --+#else --+static void acxpci_remove(struct pci_dev *pdev) --+#endif -- { -- struct ieee80211_hw *hw -- = (struct ieee80211_hw *) pci_get_drvdata(pdev); --@@ -1505,7 +1513,11 @@ static struct pci_driver acxpci_driver = -- .name = "acx_pci", -- .id_table = acxpci_id_tbl, -- .probe = acxpci_probe, --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- .remove = __devexit_p(acxpci_remove), --+#else --+ .remove = acxpci_remove, --+#endif -- #ifdef CONFIG_PM -- .suspend = acxpci_e_suspend, -- .resume = acxpci_e_resume --@@ -1603,8 +1615,12 @@ static struct vlynq_device_id acx_vlynq_ -- }; -- -- --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- static __devinit int vlynq_probe(struct vlynq_device *vdev, --- struct vlynq_device_id *id) --+#else --+static int vlynq_probe(struct vlynq_device *vdev, --+#endif --+ struct vlynq_device_id *id) -- { -- int result = -EIO, i; -- u32 addr; --@@ -1785,7 +1801,11 @@ static __devinit int vlynq_probe(struct -- return result; -- } -- --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- static __devexit void vlynq_remove(struct vlynq_device *vdev) --+#else --+static void vlynq_remove(struct vlynq_device *vdev) --+#endif -- { -- struct ieee80211_hw *hw = vlynq_get_drvdata(vdev); -- acx_device_t *adev = hw2adev(hw); --@@ -1851,7 +1871,11 @@ static struct vlynq_driver acxvlynq_driv -- .name = "acx_vlynq", -- .id_table = acx_vlynq_id, -- .probe = vlynq_probe, --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) -- .remove = __devexit_p(vlynq_remove), --+#else --+ .remove = vlynq_remove, --+#endif -- }; -- #endif /* CONFIG_VLYNQ */ -- -diff --git a/package/kernel/acx-mac80211/patches/003-Fix-3.10-build.patch b/package/kernel/acx-mac80211/patches/003-Fix-3.10-build.patch -deleted file mode 100644 -index c73784465e0729863aeba1c51a64ee8069bc99d1..0000000000000000000000000000000000000000 ---- a/package/kernel/acx-mac80211/patches/003-Fix-3.10-build.patch -+++ /dev/null -@@ -1,31 +0,0 @@ --From 1daf4bfdb072b08f3b4e412bbfa9645f88dc0a01 Mon Sep 17 00:00:00 2001 --From: Oliver Winker --Date: Tue, 3 Sep 2013 20:36:36 +0200 --Subject: [PATCH 3/3] Fix 3.10 build -- --Signed-off-by: Reinhard Karcher --Signed-off-by: Oliver Winker ----- -- main.c | 7 +++++++ -- 1 file changed, 7 insertions(+) -- ----- a/main.c --+++ b/main.c --@@ -682,10 +682,17 @@ int acx_op_config(struct ieee80211_hw *h -- -- if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { -- logf1(L_DEBUG, "IEEE80211_CONF_CHANGE_CHANNEL," --+#if CONFIG_ACX_MAC80211_VERSION >= KERNEL_VERSION(3, 10, 0) --+ "channel->hw_value=%i\n", conf->chandef.chan->hw_value); --+ --+ acx_set_channel(adev, conf->chandef.chan->hw_value, --+ conf->chandef.chan->center_freq); --+#else -- "channel->hw_value=%i\n", conf->channel->hw_value); -- -- acx_set_channel(adev, conf->channel->hw_value, -- conf->channel->center_freq); --+#endif -- -- changed_not_done &= ~IEEE80211_CONF_CHANGE_CHANNEL; -- } -diff --git a/package/kernel/acx-mac80211/patches/004-Fix-3.14-build.patch b/package/kernel/acx-mac80211/patches/004-Fix-3.14-build.patch -deleted file mode 100644 -index 847b5731598caee82179813fcc9dea2d75ffdebd..0000000000000000000000000000000000000000 ---- a/package/kernel/acx-mac80211/patches/004-Fix-3.14-build.patch -+++ /dev/null -@@ -1,22 +0,0 @@ --From d17fcac710e629463591f6bd09d76b66ec591583 Mon Sep 17 00:00:00 2001 --From: Hauke Mehrtens --Date: Wed, 5 Feb 2014 20:57:07 +0100 --Subject: [PATCH] Fix 3.14 build -- --Signed-off-by: Hauke Mehrtens ----- -- main.c | 2 ++ -- 1 file changed, 2 insertions(+) -- ----- a/main.c --+++ b/main.c --@@ -500,7 +500,9 @@ int acx_init_ieee80211(acx_device_t *ade -- hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; -- hw->queues = 1; -- hw->wiphy->max_scan_ssids = 1; --+#if CONFIG_ACX_MAC80211_VERSION < KERNEL_VERSION(3, 14, 0) -- hw->channel_change_time = 10000; --+#endif -- -- /* OW TODO Check if RTS/CTS threshold can be included here */ -- -diff --git a/package/kernel/acx-mac80211/patches/300-api_sync.patch b/package/kernel/acx-mac80211/patches/300-api_sync.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..94d61351aaaa530cc881448679219b28ab51888c ---- /dev/null -+++ b/package/kernel/acx-mac80211/patches/300-api_sync.patch -@@ -0,0 +1,83 @@ -+--- a/main.c -++++ b/main.c -+@@ -497,7 +497,7 @@ int acx_free_mechanics(acx_device_t *ade -+ -+ int acx_init_ieee80211(acx_device_t *adev, struct ieee80211_hw *hw) -+ { -+- hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; -++ __clear_bit(IEEE80211_HW_RX_INCLUDES_FCS, hw->flags); -+ hw->queues = 1; -+ hw->wiphy->max_scan_ssids = 1; -+ -+@@ -525,14 +525,14 @@ int acx_init_ieee80211(acx_device_t *ade -+ /* We base signal quality on winlevel approach of previous driver -+ * TODO OW 20100615 This should into a common init code -+ */ -+- hw->flags |= IEEE80211_HW_SIGNAL_UNSPEC; -++ __set_bit(IEEE80211_HW_SIGNAL_UNSPEC, hw->flags); -+ hw->max_signal = 100; -+ -+ if (IS_ACX100(adev)) { -+- adev->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = -++ adev->hw->wiphy->bands[NL80211_BAND_2GHZ] = -+ &acx100_band_2GHz; -+ } else if (IS_ACX111(adev)) -+- adev->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = -++ adev->hw->wiphy->bands[NL80211_BAND_2GHZ] = -+ &acx111_band_2GHz; -+ else { -+ log(L_ANY, "Error: Unknown device"); -+@@ -945,8 +945,8 @@ void acx_op_configure_filter(struct ieee -+ changed_flags, *total_flags); -+ -+ /* OWI TODO: Set also FIF_PROBE_REQ ? */ -+- *total_flags &= (FIF_PROMISC_IN_BSS | FIF_ALLMULTI | FIF_FCSFAIL -+- | FIF_CONTROL | FIF_OTHER_BSS); -++ *total_flags &= (FIF_ALLMULTI | FIF_FCSFAIL | FIF_CONTROL -++ | FIF_OTHER_BSS); -+ -+ logf1(L_DEBUG, "2: *total_flags=0x%08x\n", *total_flags); -+ -+@@ -1045,9 +1045,10 @@ void acx_op_tx(struct ieee80211_hw *hw, -+ } -+ -+ int acx_op_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, -+- struct cfg80211_scan_request *req) -++ struct ieee80211_scan_request *hw_req) -+ { -+ acx_device_t *adev = hw2adev(hw); -++ struct cfg80211_scan_request *req = &hw_req->req; -+ struct sk_buff *skb; -+ size_t ssid_len = 0; -+ u8 *ssid = NULL; -+@@ -1082,7 +1083,7 @@ int acx_op_hw_scan(struct ieee80211_hw * -+ goto out; -+ } -+ #else -+- skb = ieee80211_probereq_get(adev->hw, adev->vif, ssid, ssid_len, -++ skb = ieee80211_probereq_get(adev->hw, vif->addr, ssid, ssid_len, -+ req->ie_len); -+ if (!skb) { -+ ret = -ENOMEM; -+--- a/main.h -++++ b/main.h -+@@ -62,7 +62,7 @@ void acx_op_tx(struct ieee80211_hw *hw, -+ #endif -+ -+ int acx_op_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, -+- struct cfg80211_scan_request *req); -++ struct ieee80211_scan_request *req); -+ -+ int acx_recover_hw(acx_device_t *adev); -+ -+--- a/cardsetting.c -++++ b/cardsetting.c -+@@ -159,7 +159,7 @@ int acx_set_channel(acx_device_t *adev, -+ int res = 0; -+ -+ adev->rx_status.freq = freq; -+- adev->rx_status.band = IEEE80211_BAND_2GHZ; -++ adev->rx_status.band = NL80211_BAND_2GHZ; -+ -+ adev->channel = channel; -+ -diff --git a/package/kernel/ath10k-ct/Makefile b/package/kernel/ath10k-ct/Makefile -new file mode 100644 -index 0000000000000000000000000000000000000000..bbff8d8042ade849e467196056ca4ae1828dc3fe ---- /dev/null -+++ b/package/kernel/ath10k-ct/Makefile -@@ -0,0 +1,80 @@ -+include $(TOPDIR)/rules.mk -+ -+PKG_NAME:=ath10k-ct -+PKG_VERSION:=2016-08-24 -+PKG_RELEASE=1 -+ -+PKG_LICENSE:=GPLv2 -+PKG_LICENSE_FILES:= -+ -+PKG_SOURCE_URL:=https://github.com/greearb/ath10k-ct.git -+PKG_SOURCE_PROTO:=git -+PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) -+PKG_SOURCE_VERSION:=cd725d5465e1d4476a504794c541afeeba84b479 -+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz -+ -+PKG_MAINTAINER:=Ben Greear -+PKG_BUILD_PARALLEL:=1 -+ -+STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h -+ -+include $(INCLUDE_DIR)/kernel.mk -+include $(INCLUDE_DIR)/package.mk -+ -+define KernelPackage/ath10k-ct -+ SUBMENU:=Wireless Drivers -+ TITLE:=ath10k-ct driver optimized for CT ath10k firmware -+ DEPENDS:=+kmod-mac80211 +kmod-ath +@DRIVER_11N_SUPPORT @PCI_SUPPORT +@KERNEL_RELAY -+ FILES:=\ -+ $(PKG_BUILD_DIR)/ath10k/ath10k_pci.ko \ -+ $(PKG_BUILD_DIR)/ath10k/ath10k_core.ko -+ AUTOLOAD:=$(call AutoLoad,50,mac80211 ath ath10k_core ath10k_pci) -+endef -+ -+NOSTDINC_FLAGS = \ -+ -I$(PKG_BUILD_DIR) \ -+ -I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \ -+ -I$(STAGING_DIR)/usr/include/mac80211-backport \ -+ -I$(STAGING_DIR)/usr/include/mac80211/uapi \ -+ -I$(STAGING_DIR)/usr/include/mac80211 \ -+ -include backport/autoconf.h \ -+ -include backport/backport.h -+ -+ifdef CONFIG_PACKAGE_MAC80211_MESH -+ NOSTDINC_FLAGS += -DCONFIG_MAC80211_MESH -+endif -+ -+CT_MAKEDEFS += CONFIG_ATH10K=m CONFIG_ATH10K_PCI=m -+# No AHB support enabled yet. Could conditionally enable it later. -+#CT_MAKEDEFS += CONFIG_ATH10K_AHB=y -+#NOSTDINC_FLAGS += -DCONFIG_ATH10K_AHB -+NOSTDINC_FLAGS += -DSTANDALONE_CT -+ -+ifdef CONFIG_PACKAGE_MAC80211_DEBUGFS -+ CT_MAKEDEFS += CONFIG_ATH10K_DEBUGFS=y CONFIG_MAC80211_DEBUGFS=y -+ NOSTDINC_FLAGS += -DCONFIG_MAC80211_DEBUGFS -+ NOSTDINC_FLAGS += -DCONFIG_ATH10K_DEBUGFS -+endif -+ -+ifdef CONFIG_PACKAGE_ATH_DEBUG -+ NOSTDINC_FLAGS += -DCONFIG_ATH10K_DEBUG -+endif -+ -+define Build/Configure -+ cp $(STAGING_DIR)/usr/include/mac80211/ath/*.h $(PKG_BUILD_DIR) -+endef -+ -+ifneq ($(findstring c,$(OPENWRT_VERBOSE)),) -+ CT_MAKEDEFS += V=1 -+endif -+ -+define Build/Compile -+ +$(MAKE) $(CT_MAKEDEFS) $(PKG_JOBS) -C "$(LINUX_DIR)" \ -+ ARCH="$(LINUX_KARCH)" \ -+ CROSS_COMPILE="$(TARGET_CROSS)" \ -+ SUBDIRS="$(PKG_BUILD_DIR)/ath10k" \ -+ NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \ -+ modules -+endef -+ -+$(eval $(call KernelPackage,ath10k-ct)) -diff --git a/package/kernel/mac80211/Makefile b/package/kernel/mac80211/Makefile -index 30da1cfe250fd9cd630bf04e0c68cd7382355a2a..f2839cde2b1514f4342989b72e0baf1d79fddab2 100644 ---- a/package/kernel/mac80211/Makefile -+++ b/package/kernel/mac80211/Makefile -@@ -10,20 +10,21 @@ include $(INCLUDE_DIR)/kernel.mk - - PKG_NAME:=mac80211 - --PKG_VERSION:=2016-01-10 -+PKG_VERSION:=2016-06-20 - PKG_RELEASE:=1 - PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources - PKG_BACKPORT_VERSION:= --PKG_MD5SUM:=be5fae2e8d6f7490f9b073374fb895ba -+PKG_MD5SUM:=29c79bdc3928ef5113b17042ebda9237 - - PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2 - PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION) - PKG_BUILD_PARALLEL:=1 - --PKG_MAINTAINER:=Felix Fietkau -+PKG_MAINTAINER:=Felix Fietkau - - PKG_DRIVERS = \ - adm8211 \ -+ airo \ - ath ath5k ath9k ath9k-common ath9k-htc ath10k \ - b43 b43legacy \ - carl9170 \ -@@ -52,6 +53,7 @@ PKG_CONFIG_DEPENDS:= \ - $(patsubst %,CONFIG_PACKAGE_kmod-%,$(PKG_DRIVERS)) \ - CONFIG_PACKAGE_MAC80211_DEBUGFS \ - CONFIG_PACKAGE_MAC80211_MESH \ -+ CONFIG_PACKAGE_MAC80211_TRACING \ - CONFIG_PACKAGE_ATH_DEBUG \ - CONFIG_PACKAGE_ATH_DFS \ - CONFIG_PACKAGE_B43_DEBUG \ -@@ -63,7 +65,12 @@ PKG_CONFIG_DEPENDS:= \ - CONFIG_PACKAGE_B43_BUSES_BCMA_AND_SSB \ - CONFIG_PACKAGE_B43_BUSES_BCMA \ - CONFIG_PACKAGE_B43_BUSES_SSB \ -+ CONFIG_PACKAGE_BRCM80211_DEBUG \ -+ CONFIG_PACKAGE_IWLWIFI_DEBUG \ -+ CONFIG_PACKAGE_IWLWIFI_DEBUGFS \ - CONFIG_PACKAGE_RTLWIFI_DEBUG \ -+ CONFIG_ATH9K_SUPPORT_PCOEM \ -+ CONFIG_ATH9K_TX99 \ - CONFIG_ATH_USER_REGD \ - - include $(INCLUDE_DIR)/package.mk -@@ -73,7 +80,7 @@ WMENU:=Wireless Drivers - define KernelPackage/mac80211/Default - SUBMENU:=$(WMENU) - URL:=https://wireless.wiki.kernel.org/ -- MAINTAINER:=Felix Fietkau -+ MAINTAINER:=Felix Fietkau - endef - - define KernelPackage/cfg80211 -@@ -92,7 +99,7 @@ endef - define KernelPackage/mac80211 - $(call KernelPackage/mac80211/Default) - TITLE:=Linux 802.11 Wireless Networking Stack -- DEPENDS+= +kmod-cfg80211 +hostapd-common +kmod-crypto-core +kmod-crypto-arc4 -+ DEPENDS+= +kmod-cfg80211 +hostapd-common - KCONFIG:=\ - CONFIG_AVERAGE=y - FILES:= $(PKG_BUILD_DIR)/net/mac80211/mac80211.ko -@@ -138,10 +145,23 @@ define KernelPackage/adm8211 - AUTOLOAD:=$(call AutoProbe,adm8211) - endef - -+define KernelPackage/airo -+ $(call KernelPackage/mac80211/Default) -+ TITLE:=Cisco Aironet driver -+ DEPENDS+=@PCI_SUPPORT +@DRIVER_WEXT_SUPPORT +kmod-cfg80211 @TARGET_x86 -+ FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/cisco/airo.ko -+ AUTOLOAD:=$(call AutoProbe,airo) -+endef -+ -+define KernelPackage/airo/description -+ Kernel support for Cisco Aironet cards -+endef -+ - define KernelPackage/ath/config - if PACKAGE_kmod-ath - config ATH_USER_REGD - bool "Force Atheros drivers to respect the user's regdomain settings" -+ default y - help - Atheros' idea of regulatory handling is that the EEPROM of the card defines - the regulatory limits and the user is only allowed to restrict the settings -@@ -199,6 +219,7 @@ define KernelPackage/ath9k-common - $(call KernelPackage/mac80211/Default) - TITLE:=Atheros 802.11n wireless devices (common code for ath9k and ath9k_htc) - URL:=https://wireless.wiki.kernel.org/en/users/drivers/ath9k -+ HIDDEN:=1 - DEPENDS+= @PCI_SUPPORT||USB_SUPPORT||TARGET_ar71xx +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT +@KERNEL_RELAY - FILES:= \ - $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath9k/ath9k_common.ko \ -@@ -226,6 +247,10 @@ define KernelPackage/ath9k/config - bool "Support chips used in PC OEM cards" - depends on PACKAGE_kmod-ath9k - -+ config ATH9K_TX99 -+ bool "Enable TX99 support" -+ depends on PACKAGE_kmod-ath9k -+ - endef - - define KernelPackage/ath9k-htc -@@ -247,7 +272,7 @@ define KernelPackage/ath10k - $(call KernelPackage/mac80211/Default) - TITLE:=Atheros 802.11ac wireless cards support - URL:=https://wireless.wiki.kernel.org/en/users/Drivers/ath10k -- DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT +@KERNEL_RELAY +ath10k-firmware-qca988x -+ DEPENDS+= @PCI_SUPPORT +kmod-ath +@DRIVER_11N_SUPPORT +@DRIVER_11W_SUPPORT +@KERNEL_RELAY - FILES:= \ - $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_core.ko \ - $(PKG_BUILD_DIR)/drivers/net/wireless/ath/ath10k/ath10k_pci.ko -@@ -673,6 +698,7 @@ define KernelPackage/brcmfmac/config - - config BRCMFMAC_SDIO - bool "Enable SDIO bus interface support" -+ default y if TARGET_brcm2708 - default n - help - Enable support for cards attached to an SDIO bus. -@@ -761,7 +787,7 @@ endef - - define KernelPackage/iwlwifi - $(call KernelPackage/mac80211/Default) -- DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +iwlwifi-firmware -+ DEPENDS:= +kmod-mac80211 @PCI_SUPPORT +@DRIVER_11N_SUPPORT +iwlwifi-firmware @!LINUX_3_18 - TITLE:=Intel AGN Wireless support - FILES:= \ - $(PKG_BUILD_DIR)/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko \ -@@ -870,7 +896,7 @@ endef - define KernelPackage/lib80211 - $(call KernelPackage/mac80211/Default) - TITLE:=802.11 Networking stack -- DEPENDS:=+kmod-cfg80211 -+ DEPENDS:=+kmod-cfg80211 +kmod-crypto-hash - FILES:= \ - $(PKG_BUILD_DIR)/net/wireless/lib80211.ko \ - $(PKG_BUILD_DIR)/net/wireless/lib80211_crypt_wep.ko \ -@@ -897,7 +923,7 @@ endef - define KernelPackage/libipw - $(call KernelPackage/mac80211/Default) - TITLE:=libipw for ipw2100 and ipw2200 -- DEPENDS:=@PCI_SUPPORT +kmod-crypto-michael-mic +kmod-crypto-core +kmod-crypto-arc4 +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN -+ DEPENDS:=@PCI_SUPPORT +kmod-crypto-michael-mic +kmod-lib80211 +kmod-cfg80211 +@DRIVER_WEXT_SUPPORT @!BIG_ENDIAN - FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intel/ipw2x00/libipw.ko - AUTOLOAD:=$(call AutoProbe,libipw) - endef -@@ -978,7 +1004,7 @@ endef - define KernelPackage/libertas-spi - $(call KernelPackage/mac80211/Default) - SUBMENU:=Wireless Drivers -- DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT +libertas-spi-firmware -+ DEPENDS+= +kmod-cfg80211 +kmod-lib80211 +@DRIVER_WEXT_SUPPORT @!TARGET_uml +libertas-spi-firmware - KCONFIG := \ - CONFIG_SPI=y \ - CONFIG_SPI_MASTER=y -@@ -1036,33 +1062,6 @@ define KernelPackage/mwifiex-pcie/description - Kernel modules for Marvell 802.11n/802.11ac PCIe Wireless cards - endef - -- --# Prism54 drivers --P54PCIFW:=2.13.12.0.arm --P54USBFW:=2.13.24.0.lm87.arm --P54SPIFW:=2.13.0.0.a.13.14.arm -- --define Download/p54usb -- FILE:=$(P54USBFW) -- URL:=http://daemonizer.de/prism54/prism54-fw/fw-usb -- MD5SUM:=8e8ab005a4f8f0123bcdc51bc25b47f6 --endef --$(eval $(call Download,p54usb)) -- --define Download/p54pci -- FILE:=$(P54PCIFW) -- URL:=http://daemonizer.de/prism54/prism54-fw/fw-softmac -- MD5SUM:=ff7536af2092b1c4b21315bd103ef4c4 --endef --$(eval $(call Download,p54pci)) -- --define Download/p54spi -- FILE:=$(P54SPIFW) -- URL:=http://daemonizer.de/prism54/prism54-fw/stlc4560 -- MD5SUM:=42661f8ecbadd88012807493f596081d --endef --$(eval $(call Download,p54spi)) -- - define KernelPackage/p54/Default - $(call KernelPackage/mac80211/Default) - TITLE:=Prism54 Drivers -@@ -1082,7 +1081,7 @@ endef - define KernelPackage/p54-pci - $(call KernelPackage/p54/Default) - TITLE+= (PCI) -- DEPENDS+= @PCI_SUPPORT +kmod-p54-common -+ DEPENDS+= @PCI_SUPPORT +kmod-p54-common +p54-pci-firmware - FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54pci.ko - AUTOLOAD:=$(call AutoProbe,p54pci) - endef -@@ -1090,7 +1089,7 @@ endef - define KernelPackage/p54-usb - $(call KernelPackage/p54/Default) - TITLE+= (USB) -- DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-p54-common -+ DEPENDS+= @USB_SUPPORT +kmod-usb-core +kmod-p54-common +p54-usb-firmware - FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54usb.ko - AUTOLOAD:=$(call AutoProbe,p54usb) - endef -@@ -1098,7 +1097,7 @@ endef - define KernelPackage/p54-spi - $(call KernelPackage/p54/Default) - TITLE+= (SPI) -- DEPENDS+= @TARGET_omap24xx +kmod-p54-common -+ DEPENDS+= @TARGET_omap24xx +kmod-p54-common +p54-spi-firmware - FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/intersil/p54/p54spi.ko - AUTOLOAD:=$(call AutoProbe,p54spi) - endef -@@ -1453,6 +1452,7 @@ config-y:= \ - WLAN_VENDOR_ATH \ - WLAN_VENDOR_ATMEL \ - WLAN_VENDOR_BROADCOM \ -+ WLAN_VENDOR_CISCO \ - WLAN_VENDOR_INTEL \ - WLAN_VENDOR_INTERSIL \ - WLAN_VENDOR_MARVELL \ -@@ -1491,6 +1491,8 @@ endif - - config-$(call config_package,lib80211) += LIB80211 LIB80211_CRYPT_WEP LIB80211_CRYPT_CCMP LIB80211_CRYPT_TKIP - -+config-$(call config_package,airo) += AIRO -+ - config-$(call config_package,ath) += ATH_CARDS ATH_COMMON - config-$(CONFIG_PACKAGE_ATH_DEBUG) += ATH_DEBUG ATH10K_DEBUG - config-$(CONFIG_PACKAGE_ATH_DFS) += ATH9K_DFS_CERTIFIED ATH10K_DFS_CERTIFIED -@@ -1501,6 +1503,7 @@ config-$(CONFIG_TARGET_ar71xx) += ATH9K_AHB - config-$(CONFIG_PCI) += ATH9K_PCI - config-$(CONFIG_ATH_USER_REGD) += ATH_USER_REGD - config-$(CONFIG_ATH9K_SUPPORT_PCOEM) += ATH9K_PCOEM -+config-$(CONFIG_ATH9K_TX99) += ATH9K_TX99 - - config-$(call config_package,ath9k-htc) += ATH9K_HTC - config-$(call config_package,ath10k) += ATH10K ATH10K_PCI -@@ -1742,21 +1745,6 @@ define KernelPackage/ipw2200/install - $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(IPW2200_NAME)-$(IPW2200_VERSION)/ipw2200*.fw $(1)/lib/firmware - endef - --define KernelPackage/p54-pci/install -- $(INSTALL_DIR) $(1)/lib/firmware -- $(INSTALL_DATA) $(DL_DIR)/$(P54PCIFW) $(1)/lib/firmware/isl3886pci --endef -- --define KernelPackage/p54-usb/install -- $(INSTALL_DIR) $(1)/lib/firmware -- $(INSTALL_DATA) $(DL_DIR)/$(P54USBFW) $(1)/lib/firmware/isl3887usb --endef -- --define KernelPackage/p54-spi/install -- $(INSTALL_DIR) $(1)/lib/firmware -- $(INSTALL_DATA) $(DL_DIR)/$(P54SPIFW) $(1)/lib/firmware/3826.arm --endef -- - define KernelPackage/zd1211rw/install - $(INSTALL_DIR) $(1)/lib/firmware/zd1211 - $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(ZD1211FW_NAME)/zd1211* $(1)/lib/firmware/zd1211 -@@ -1764,6 +1752,7 @@ endef - - - $(eval $(call KernelPackage,adm8211)) -+$(eval $(call KernelPackage,airo)) - $(eval $(call KernelPackage,ath)) - $(eval $(call KernelPackage,ath10k)) - $(eval $(call KernelPackage,ath5k)) -diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh -index fb2f928751a8c7dd282022d64be784cfcca4663b..e3d612e4b2f3d6dc1345bf71311fd31ee3649f1e 100644 ---- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh -+++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh -@@ -23,6 +23,7 @@ drv_mac80211_init_device_config() { - config_add_int rxantenna txantenna antenna_gain txpower distance - config_add_boolean noscan ht_coex - config_add_array ht_capab -+ config_add_array channels - config_add_boolean \ - rxldpc \ - short_gi_80 \ -@@ -89,6 +90,7 @@ mac80211_hostapd_setup_base() { - json_select config - - [ "$auto_channel" -gt 0 ] && channel=acs_survey -+ [ "$auto_channel" -gt 0 ] && json_get_values channel_list channels - - json_get_vars noscan ht_coex - json_get_values ht_capab_list ht_capab -@@ -218,7 +220,6 @@ mac80211_hostapd_setup_base() { - vht_max_a_mpdu_len_exp:7 \ - vht_max_mpdu:11454 \ - rx_stbc:4 \ -- tx_stbc:4 \ - vht_link_adapt:3 \ - vht160:2 - -@@ -230,13 +231,13 @@ mac80211_hostapd_setup_base() { - - cap_rx_stbc=$((($vht_cap >> 8) & 7)) - [ "$rx_stbc" -lt "$cap_rx_stbc" ] && cap_rx_stbc="$rx_stbc" -- ht_cap_mask="$(( ($vht_cap & ~(0x700)) | ($cap_rx_stbc << 8) ))" -+ vht_cap="$(( ($vht_cap & ~(0x700)) | ($cap_rx_stbc << 8) ))" - - mac80211_add_capabilities vht_capab $vht_cap \ - RXLDPC:0x10::$rxldpc \ - SHORT-GI-80:0x20::$short_gi_80 \ - SHORT-GI-160:0x40::$short_gi_160 \ -- TX-STBC-2BY1:0x80::$tx_stbc \ -+ TX-STBC-2BY1:0x80::$tx_stbc_2by1 \ - SU-BEAMFORMER:0x800::$su_beamformer \ - SU-BEAMFORMEE:0x1000::$su_beamformee \ - MU-BEAMFORMER:0x80000::$mu_beamformer \ -@@ -245,10 +246,10 @@ mac80211_hostapd_setup_base() { - HTC-VHT:0x400000::$htc_vht \ - RX-ANTENNA-PATTERN:0x10000000::$rx_antenna_pattern \ - TX-ANTENNA-PATTERN:0x20000000::$tx_antenna_pattern \ -- RX-STBC1:0x700:0x100:1 \ -- RX-STBC12:0x700:0x200:1 \ -- RX-STBC123:0x700:0x300:1 \ -- RX-STBC1234:0x700:0x400:1 \ -+ RX-STBC-1:0x700:0x100:1 \ -+ RX-STBC-12:0x700:0x200:1 \ -+ RX-STBC-123:0x700:0x300:1 \ -+ RX-STBC-1234:0x700:0x400:1 \ - - # supported Channel widths - vht160_hw=0 -@@ -301,6 +302,7 @@ mac80211_hostapd_setup_base() { - hostapd_prepare_device_config "$hostapd_conf_file" nl80211 - cat >> "$hostapd_conf_file" </dev/null); do -+ case "$(readlink -f /sys/class/ieee80211/$phy/device)" in -+ *$path) return 0;; -+ esac - done - } - [ -n "$macaddr" ] && { -@@ -481,7 +482,7 @@ mac80211_prepare_vif() { - # All interfaces must have unique mac addresses - # which can either be explicitly set in the device - # section, or automatically generated -- ifconfig "$ifname" hw ether "$macaddr" -+ ip link set dev "$ifname" address "$macaddr" - fi - - json_select .. -@@ -496,7 +497,7 @@ mac80211_setup_supplicant() { - mac80211_setup_adhoc_htmode() { - case "$htmode" in - VHT20|HT20) ibss_htmode=HT20;; -- HT40*|VHT40|VHT80|VHT160) -+ HT40*|VHT40|VHT160) - case "$hwmode" in - a) - case "$(( ($channel / 4) % 2 ))" in -@@ -520,6 +521,9 @@ mac80211_setup_adhoc_htmode() { - esac - [ "$auto_channel" -gt 0 ] && ibss_htmode="HT40+" - ;; -+ VHT80) -+ ibss_htmode="80MHZ" -+ ;; - NONE|NOHT) - ibss_htmode="NOHT" - ;; -@@ -580,7 +584,7 @@ mac80211_setup_vif() { - json_get_vars mode - json_get_var vif_txpower txpower - -- ifconfig "$ifname" up || { -+ ip link set dev "$ifname" up || { - wireless_setup_vif_failed IFUP_ERROR - json_select .. - return -@@ -643,7 +647,7 @@ mac80211_interface_cleanup() { - local phy="$1" - - for wdev in $(list_phy_interfaces "$phy"); do -- ifconfig "$wdev" down 2>/dev/null -+ ip link set dev "$wdev" down 2>/dev/null - iw dev "$wdev" del - done - } -diff --git a/package/kernel/mac80211/files/lib/wifi/mac80211.sh b/package/kernel/mac80211/files/lib/wifi/mac80211.sh -index ea229d6c03393d4673c733c99ead4c24ff92817d..06f3b8b449fbf482d42123fd3d21f8c5b0d315bf 100644 ---- a/package/kernel/mac80211/files/lib/wifi/mac80211.sh -+++ b/package/kernel/mac80211/files/lib/wifi/mac80211.sh -@@ -9,11 +9,10 @@ lookup_phy() { - local devpath - config_get devpath "$device" path - [ -n "$devpath" ] && { -- for _phy in /sys/devices/$devpath/ieee80211/phy*; do -- [ -e "$_phy" ] && { -- phy="${_phy##*/}" -- return -- } -+ for phy in $(ls /sys/class/ieee80211 2>/dev/null); do -+ case "$(readlink -f /sys/class/ieee80211/$phy/device)" in -+ *$devpath) return;; -+ esac - done - } - -@@ -102,6 +101,9 @@ detect_mac80211() { - fi - if [ -n "$path" ]; then - path="${path##/sys/devices/}" -+ case "$path" in -+ platform*/pci*) path="${path##platform/}";; -+ esac - dev_id=" option path '$path'" - else - dev_id=" option macaddr $(cat /sys/class/ieee80211/${dev}/macaddress)" -diff --git a/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch b/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch -deleted file mode 100644 -index 9adfd8f719805961fb06d4fc3bc104b668e4fd41..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/004-backports-add-skb_free_frag.patch -+++ /dev/null -@@ -1,21 +0,0 @@ --From: Felix Fietkau --Date: Thu, 28 Jan 2016 15:16:35 +0100 --Subject: [PATCH] backports: add skb_free_frag() -- --Signed-off-by: Felix Fietkau ----- -- ----- a/backport-include/linux/skbuff.h --+++ b/backport-include/linux/skbuff.h --@@ -300,4 +300,11 @@ int skb_ensure_writable(struct sk_buff * -- -- #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) */ -- --+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0) --+static inline void skb_free_frag(void *data) --+{ --+ put_page(virt_to_head_page(data)); --+} --+#endif --+ -- #endif /* __BACKPORT_SKBUFF_H */ -diff --git a/package/kernel/mac80211/patches/004-fix_duplicate_skcipher_backport.patch b/package/kernel/mac80211/patches/004-fix_duplicate_skcipher_backport.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..38b31795a4ee0f3c5f0ad4895554117a63c2f037 ---- /dev/null -+++ b/package/kernel/mac80211/patches/004-fix_duplicate_skcipher_backport.patch -@@ -0,0 +1,11 @@ -+--- a/compat/Makefile -++++ b/compat/Makefile -+@@ -35,8 +35,6 @@ compat-$(CPTCFG_KERNEL_4_6) += backport- -+ -+ compat-$(CPTCFG_BPAUTO_BUILD_CRYPTO_CCM) += crypto-ccm.o -+ compat-$(CPTCFG_BPAUTO_CRYPTO_SKCIPHER) += crypto-skcipher.o -+-skcipher-objs += crypto-skcipher.o -+-obj-$(CPTCFG_BPAUTO_CRYPTO_SKCIPHER) += skcipher.o -+ compat-$(CPTCFG_BPAUTO_BUILD_WANT_DEV_COREDUMP) += drivers-base-devcoredump.o -+ compat-$(CPTCFG_BPAUTO_RHASHTABLE) += lib-rhashtable.o -+ cordic-objs += lib-cordic.o -diff --git a/package/kernel/mac80211/patches/005-backport_skb_get_hash_perturb.patch b/package/kernel/mac80211/patches/005-backport_skb_get_hash_perturb.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..29bccc1e995f910ff6d1aeaf0829e9bdfe4f72d7 ---- /dev/null -+++ b/package/kernel/mac80211/patches/005-backport_skb_get_hash_perturb.patch -@@ -0,0 +1,22 @@ -+--- a/backport-include/linux/skbuff.h -++++ b/backport-include/linux/skbuff.h -+@@ -305,6 +305,19 @@ static inline void skb_free_frag(void *d -+ { -+ put_page(virt_to_head_page(data)); -+ } -++ -++#include -++#include -++ -++static inline u32 skb_get_hash_perturb(struct sk_buff *skb, u32 key) -++{ -++ struct flow_keys keys; -++ -++ skb_flow_dissect(skb, &keys); -++ return jhash_3words((__force u32)keys.dst, -++ (__force u32)keys.src ^ keys.ip_proto, -++ (__force u32)keys.ports, key); -++} -+ #endif -+ -+ #endif /* __BACKPORT_SKBUFF_H */ -diff --git a/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch b/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch -deleted file mode 100644 -index 9b672a8d14ec4e27c7d14bd6018059520ae8296c..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/005-backports-add-napi_alloc_frag.patch -+++ /dev/null -@@ -1,20 +0,0 @@ --From: Felix Fietkau --Date: Thu, 28 Jan 2016 15:19:22 +0100 --Subject: [PATCH] backports: add napi_alloc_frag -- --Signed-off-by: Felix Fietkau ----- -- ----- a/backport-include/linux/netdevice.h --+++ b/backport-include/linux/netdevice.h --@@ -232,6 +232,10 @@ static inline void backport_unregister_n -- #define unregister_netdevice_many LINUX_BACKPORT(unregister_netdevice_many) -- #endif -- --+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0) --+#define napi_alloc_frag netdev_alloc_frag --+#endif --+ -- /* -- * Complicated way of saying: We only backport netdev_rss_key stuff on kernels -- * that either already have net_get_random_once() (>= 3.13) or where we've been -diff --git a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch -index fd1e1cff3020078b5529982d5868ec65b8b4c9da..8be5fa15e92b747bfeedb3360b62cb139ae5257a 100644 ---- a/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch -+++ b/package/kernel/mac80211/patches/060-no_local_ssb_bcma.patch -@@ -1,6 +1,6 @@ - --- a/.local-symbols - +++ b/.local-symbols --@@ -476,44 +476,6 @@ USB_IPHETH= -+@@ -481,45 +481,6 @@ USB_IPHETH= - USB_SIERRA_NET= - USB_VL600= - USB_NET_CH9200= -@@ -37,6 +37,7 @@ - -BCMA_DRIVER_PCI= - -BCMA_DRIVER_PCI_HOSTMODE= - -BCMA_DRIVER_MIPS= -+-BCMA_PFLASH= - -BCMA_SFLASH= - -BCMA_NFLASH= - -BCMA_DRIVER_GMAC_CMN= -@@ -56,7 +57,7 @@ - return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev); - #else - return bus->chipco.dev; --@@ -4903,7 +4903,7 @@ static int b43_wireless_core_init(struct -+@@ -4883,7 +4883,7 @@ static int b43_wireless_core_init(struct - } - if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW) - hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */ -diff --git a/package/kernel/mac80211/patches/080-disable_clk_backport.patch b/package/kernel/mac80211/patches/080-disable_clk_backport.patch -deleted file mode 100644 -index 3765591ebb8c5863e552417c3fb36275c711b118..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/080-disable_clk_backport.patch -+++ /dev/null -@@ -1,20 +0,0 @@ ----- a/compat/compat-3.6.c --+++ b/compat/compat-3.6.c --@@ -147,17 +147,3 @@ int sg_alloc_table_from_pages(struct sg_ -- return 0; -- } -- EXPORT_SYMBOL_GPL(sg_alloc_table_from_pages); --- ---/* whoopsie ! */ ---#ifndef CONFIG_COMMON_CLK ---int clk_enable(struct clk *clk) ---{ --- return 0; ---} ---EXPORT_SYMBOL_GPL(clk_enable); --- ---void clk_disable(struct clk *clk) ---{ ---} ---EXPORT_SYMBOL_GPL(clk_disable); ---#endif -diff --git a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch -index 02f46c778d8cd704b96af062ea73c2cffbf2c19a..fbe22e51b71eb513e3612d021b7c8ab62415d583 100644 ---- a/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch -+++ b/package/kernel/mac80211/patches/100-remove-cryptoapi-dependencies.patch -@@ -309,7 +309,7 @@ - #endif /* AES_GMAC_H */ - --- a/net/mac80211/key.h - +++ b/net/mac80211/key.h --@@ -84,7 +84,7 @@ struct ieee80211_key { -+@@ -88,7 +88,7 @@ struct ieee80211_key { - * Management frames. - */ - u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN]; -@@ -320,7 +320,7 @@ - struct { - --- a/net/mac80211/wpa.c - +++ b/net/mac80211/wpa.c --@@ -307,7 +307,8 @@ ieee80211_crypto_tkip_decrypt(struct iee -+@@ -304,7 +304,8 @@ ieee80211_crypto_tkip_decrypt(struct iee - } - - -@@ -330,7 +330,7 @@ - { - __le16 mask_fc; - int a4_included, mgmt; --@@ -337,14 +338,8 @@ static void ccmp_special_blocks(struct s -+@@ -334,14 +335,8 @@ static void ccmp_special_blocks(struct s - else - qos_tid = 0; - -@@ -347,7 +347,7 @@ - - /* Nonce: Nonce Flags | A2 | PN - * Nonce Flags: Priority (b0..b3) | Management (b4) | Reserved (b5..b7) --@@ -352,6 +347,8 @@ static void ccmp_special_blocks(struct s -+@@ -349,6 +344,8 @@ static void ccmp_special_blocks(struct s - b_0[1] = qos_tid | (mgmt << 4); - memcpy(&b_0[2], hdr->addr2, ETH_ALEN); - memcpy(&b_0[8], pn, IEEE80211_CCMP_PN_LEN); -@@ -356,7 +356,7 @@ - - /* AAD (extra authenticate-only data) / masked 802.11 header - * FC | A1 | A2 | A3 | SC | [A4] | [QC] */ --@@ -463,7 +460,7 @@ static int ccmp_encrypt_skb(struct ieee8 -+@@ -460,7 +457,7 @@ static int ccmp_encrypt_skb(struct ieee8 - return 0; - - pos += IEEE80211_CCMP_HDR_LEN; -@@ -365,7 +365,7 @@ - ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len, - skb_put(skb, mic_len), mic_len); - --@@ -534,7 +531,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee -+@@ -537,7 +534,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee - u8 aad[2 * AES_BLOCK_SIZE]; - u8 b_0[AES_BLOCK_SIZE]; - /* hardware didn't decrypt/verify MIC */ -diff --git a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch -index d1d9fbd9b157c5b888797ab650db04064dfa7d31..3ca166ff45552c1c544e301fd2833b06ffd9f8a1 100644 ---- a/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch -+++ b/package/kernel/mac80211/patches/110-mac80211_keep_keys_on_stop_ap.patch -@@ -2,7 +2,7 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnects - - --- a/net/mac80211/cfg.c - +++ b/net/mac80211/cfg.c --@@ -846,7 +846,6 @@ static int ieee80211_stop_ap(struct wiph -+@@ -850,7 +850,6 @@ static int ieee80211_stop_ap(struct wiph - sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF; - - __sta_info_flush(sdata, true); -diff --git a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch -index 2855a88af7b4017f8dfeebeb34ea430a0ad51914..16fab845356343480dd706bfe558a08420a6be90 100644 ---- a/package/kernel/mac80211/patches/150-disable_addr_notifier.patch -+++ b/package/kernel/mac80211/patches/150-disable_addr_notifier.patch -@@ -18,9 +18,9 @@ - static int ieee80211_ifa6_changed(struct notifier_block *nb, - unsigned long data, void *arg) - { --@@ -1087,14 +1087,14 @@ int ieee80211_register_hw(struct ieee802 -- -- rtnl_unlock(); -+@@ -1090,14 +1090,14 @@ int ieee80211_register_hw(struct ieee802 -+ if (result) -+ goto fail_flows; - - -#ifdef CONFIG_INET - +#ifdef __disabled__CONFIG_INET -@@ -35,7 +35,7 @@ - local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed; - result = register_inet6addr_notifier(&local->ifa6_notifier); - if (result) --@@ -1103,13 +1103,13 @@ int ieee80211_register_hw(struct ieee802 -+@@ -1106,13 +1106,13 @@ int ieee80211_register_hw(struct ieee802 - - return 0; - -@@ -51,8 +51,8 @@ - +#if defined(__disabled__CONFIG_INET) || defined(__disabled__CONFIG_IPV6) - fail_ifa: - #endif -- rtnl_lock(); --@@ -1137,10 +1137,10 @@ void ieee80211_unregister_hw(struct ieee -+ ieee80211_txq_teardown_flows(local); -+@@ -1142,10 +1142,10 @@ void ieee80211_unregister_hw(struct ieee - tasklet_kill(&local->tx_pending_tasklet); - tasklet_kill(&local->tasklet); - -diff --git a/package/kernel/mac80211/patches/210-ap_scan.patch b/package/kernel/mac80211/patches/210-ap_scan.patch -index a99cbd2bee913d292310e258c15c94050e90db71..29f05c44d6e205fe0a7f20009899f1de690ada5a 100644 ---- a/package/kernel/mac80211/patches/210-ap_scan.patch -+++ b/package/kernel/mac80211/patches/210-ap_scan.patch -@@ -1,6 +1,6 @@ - --- a/net/mac80211/cfg.c - +++ b/net/mac80211/cfg.c --@@ -1999,7 +1999,7 @@ static int ieee80211_scan(struct wiphy * -+@@ -2008,7 +2008,7 @@ static int ieee80211_scan(struct wiphy * - * the frames sent while scanning on other channel will be - * lost) - */ -diff --git a/package/kernel/mac80211/patches/220-fq_disable_hack.patch b/package/kernel/mac80211/patches/220-fq_disable_hack.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..7f420beea56335d5043de6fd71b5febae3e9bd79 ---- /dev/null -+++ b/package/kernel/mac80211/patches/220-fq_disable_hack.patch -@@ -0,0 +1,15 @@ -+mac80211 fq has been found to cause a regression in multi-stream TCP -+performance. Disable it until the cause has been found and fixed -+ -+--- a/include/net/fq_impl.h -++++ b/include/net/fq_impl.h -+@@ -104,6 +104,9 @@ static struct fq_flow *fq_flow_classify( -+ -+ lockdep_assert_held(&fq->lock); -+ -++ /* HACK: disable fq for now until TCP issues are fixed */ -++ return get_default_func(fq, tin, 0, skb); -++ -+ hash = skb_get_hash_perturb(skb, fq->perturbation); -+ idx = reciprocal_scale(hash, fq->flows_cnt); -+ flow = &fq->flows[idx]; -diff --git a/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch b/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch -index bddb15ad1a6bbcfcd0903c8b063c8289e5b6c43f..098bda7e93aa4453aa282eb170b2bc502bc85edd 100644 ---- a/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch -+++ b/package/kernel/mac80211/patches/300-ath9k-force-rx_clear-when-disabling-rx.patch -@@ -3,15 +3,16 @@ Date: Sun, 7 Jun 2015 13:53:35 +0200 - Subject: [PATCH] ath9k: force rx_clear when disabling rx - - This makes stopping Rx more reliable and should reduce the frequency of --Rx related DMA stop warnings -+Rx related DMA stop warnings. Don't use rx_clear in TX99 mode. - - Cc: stable@vger.kernel.org --Signed-off-by: Felix Fietkau -+Signed-off-by: Felix Fietkau -+Signed-off-by: Helmut Schaa - --- - - --- a/drivers/net/wireless/ath/ath9k/mac.c - +++ b/drivers/net/wireless/ath/ath9k/mac.c --@@ -677,13 +677,15 @@ void ath9k_hw_startpcureceive(struct ath -+@@ -677,13 +677,18 @@ void ath9k_hw_startpcureceive(struct ath - - ath9k_ani_reset(ah, is_scanning); - -@@ -24,8 +25,11 @@ Signed-off-by: Felix Fietkau - void ath9k_hw_abortpcurecv(struct ath_hw *ah) - { - - REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_ABORT | AR_DIAG_RX_DIS); --+ REG_SET_BIT(ah, AR_DIAG_SW, --+ AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT | AR_DIAG_FORCE_RX_CLEAR); -++ u32 reg = AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT; -++ -++ if (!config_enabled(CPTCFG_ATH9K_TX99)) -++ reg |= AR_DIAG_FORCE_RX_CLEAR; -++ REG_SET_BIT(ah, AR_DIAG_SW, reg); - - ath9k_hw_disable_mib_counters(ah); - } -diff --git a/package/kernel/mac80211/patches/302-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch b/package/kernel/mac80211/patches/302-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..7caa9be5a8b963b6199bf1a29cc370899d30b291 ---- /dev/null -+++ b/package/kernel/mac80211/patches/302-Revert-ath9k-interpret-requested-txpower-in-EIRP-dom.patch -@@ -0,0 +1,37 @@ -+From: Felix Fietkau -+Date: Sat, 14 May 2016 14:51:02 +0200 -+Subject: [PATCH] Revert "ath9k: interpret requested txpower in EIRP -+ domain" -+ -+This reverts commit 71f5137bf010c6faffab50c0ec15374c59c4a411. -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/hw.c -++++ b/drivers/net/wireless/ath/ath9k/hw.c -+@@ -2914,7 +2914,8 @@ void ath9k_hw_apply_txpower(struct ath_h -+ { -+ struct ath_regulatory *reg = ath9k_hw_regulatory(ah); -+ struct ieee80211_channel *channel; -+- int chan_pwr, new_pwr; -++ int chan_pwr, new_pwr, max_gain; -++ int ant_gain, ant_reduction = 0; -+ -+ if (!chan) -+ return; -+@@ -2922,10 +2923,15 @@ void ath9k_hw_apply_txpower(struct ath_h -+ channel = chan->chan; -+ chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER); -+ new_pwr = min_t(int, chan_pwr, reg->power_limit); -++ max_gain = chan_pwr - new_pwr + channel->max_antenna_gain * 2; -++ -++ ant_gain = get_antenna_gain(ah, chan); -++ if (ant_gain > max_gain) -++ ant_reduction = ant_gain - max_gain; -+ -+ ah->eep_ops->set_txpower(ah, chan, -+ ath9k_regd_get_ctl(reg, chan), -+- get_antenna_gain(ah, chan), new_pwr, test); -++ ant_reduction, new_pwr, test); -+ } -+ -+ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test) -diff --git a/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch b/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch -deleted file mode 100644 -index 22b987aa7aaae92f889adc938ca88042d3edfdf6..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/302-ath9k_hw-add-low-power-tx-gain-table-for-AR953x.patch -+++ /dev/null -@@ -1,95 +0,0 @@ --From: Felix Fietkau --Date: Thu, 14 Jan 2016 03:14:03 +0100 --Subject: [PATCH] ath9k_hw: add low power tx gain table for AR953x -- --Used in some newer TP-Link AR9533 devices. -- --Signed-off-by: Felix Fietkau ----- -- ----- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c --+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c --@@ -698,6 +698,9 @@ static void ar9003_tx_gain_table_mode2(s -- else if (AR_SREV_9340(ah)) -- INIT_INI_ARRAY(&ah->iniModesTxGain, -- ar9340Modes_low_ob_db_tx_gain_table_1p0); --+ else if (AR_SREV_9531_11(ah)) --+ INIT_INI_ARRAY(&ah->iniModesTxGain, --+ qca953x_1p1_modes_no_xpa_low_power_tx_gain_table); -- else if (AR_SREV_9485_11_OR_LATER(ah)) -- INIT_INI_ARRAY(&ah->iniModesTxGain, -- ar9485Modes_low_ob_db_tx_gain_1_1); ----- a/drivers/net/wireless/ath/ath9k/ar953x_initvals.h --+++ b/drivers/net/wireless/ath/ath9k/ar953x_initvals.h --@@ -757,6 +757,71 @@ static const u32 qca953x_1p1_modes_xpa_t -- {0x00016448, 0x6c927a70}, -- }; -- --+static const u32 qca953x_1p1_modes_no_xpa_low_power_tx_gain_table[][2] = { --+ /* Addr allmodes */ --+ {0x0000a2dc, 0xfff55592}, --+ {0x0000a2e0, 0xfff99924}, --+ {0x0000a2e4, 0xfffe1e00}, --+ {0x0000a2e8, 0xffffe000}, --+ {0x0000a410, 0x000050d6}, --+ {0x0000a500, 0x00000069}, --+ {0x0000a504, 0x0400006b}, --+ {0x0000a508, 0x0800006d}, --+ {0x0000a50c, 0x0c000269}, --+ {0x0000a510, 0x1000026b}, --+ {0x0000a514, 0x1400026d}, --+ {0x0000a518, 0x18000669}, --+ {0x0000a51c, 0x1c00066b}, --+ {0x0000a520, 0x1d000a68}, --+ {0x0000a524, 0x21000a6a}, --+ {0x0000a528, 0x25000a6c}, --+ {0x0000a52c, 0x29000a6e}, --+ {0x0000a530, 0x2d0012a9}, --+ {0x0000a534, 0x310012ab}, --+ {0x0000a538, 0x350012ad}, --+ {0x0000a53c, 0x39001b0a}, --+ {0x0000a540, 0x3d001b0c}, --+ {0x0000a544, 0x41001b0e}, --+ {0x0000a548, 0x43001bae}, --+ {0x0000a54c, 0x45001914}, --+ {0x0000a550, 0x47001916}, --+ {0x0000a554, 0x49001b96}, --+ {0x0000a558, 0x49001b96}, --+ {0x0000a55c, 0x49001b96}, --+ {0x0000a560, 0x49001b96}, --+ {0x0000a564, 0x49001b96}, --+ {0x0000a568, 0x49001b96}, --+ {0x0000a56c, 0x49001b96}, --+ {0x0000a570, 0x49001b96}, --+ {0x0000a574, 0x49001b96}, --+ {0x0000a578, 0x49001b96}, --+ {0x0000a57c, 0x49001b96}, --+ {0x0000a600, 0x00000000}, --+ {0x0000a604, 0x00000000}, --+ {0x0000a608, 0x00000000}, --+ {0x0000a60c, 0x00000000}, --+ {0x0000a610, 0x00000000}, --+ {0x0000a614, 0x00000000}, --+ {0x0000a618, 0x00804201}, --+ {0x0000a61c, 0x01408201}, --+ {0x0000a620, 0x01408502}, --+ {0x0000a624, 0x01408502}, --+ {0x0000a628, 0x01408502}, --+ {0x0000a62c, 0x01408502}, --+ {0x0000a630, 0x01408502}, --+ {0x0000a634, 0x01408502}, --+ {0x0000a638, 0x01408502}, --+ {0x0000a63c, 0x01408502}, --+ {0x0000b2dc, 0xfff55592}, --+ {0x0000b2e0, 0xfff99924}, --+ {0x0000b2e4, 0xfffe1e00}, --+ {0x0000b2e8, 0xffffe000}, --+ {0x00016044, 0x044922db}, --+ {0x00016048, 0x6c927a70}, --+ {0x00016444, 0x044922db}, --+ {0x00016448, 0x6c927a70}, --+}; --+ -- static const u32 qca953x_2p0_baseband_core[][2] = { -- /* Addr allmodes */ -- {0x00009800, 0xafe68e30}, -diff --git a/package/kernel/mac80211/patches/303-ath10k-Ensure-txrx-compl-task-is-stopped-when-cleani.patch b/package/kernel/mac80211/patches/303-ath10k-Ensure-txrx-compl-task-is-stopped-when-cleani.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..73accd866b91e84bfc42684daa3804b0a3bbc563 ---- /dev/null -+++ b/package/kernel/mac80211/patches/303-ath10k-Ensure-txrx-compl-task-is-stopped-when-cleani.patch -@@ -0,0 +1,21 @@ -+From: Ben Greear -+Date: Fri, 1 Apr 2016 14:12:08 -0700 -+Subject: [PATCH] ath10k: Ensure txrx-compl-task is stopped when cleaning -+ htt-tx. -+ -+Otherwise, the txrx-compl-task may access some bad memory? -+ -+Signed-off-by: Ben Greear -+--- -+ -+--- a/drivers/net/wireless/ath/ath10k/htt_tx.c -++++ b/drivers/net/wireless/ath/ath10k/htt_tx.c -+@@ -388,6 +388,8 @@ void ath10k_htt_tx_free(struct ath10k_ht -+ { -+ int size; -+ -++ tasklet_kill(&htt->txrx_compl_task); -++ -+ idr_for_each(&htt->pending_tx, ath10k_htt_tx_clean_up_pending, htt->ar); -+ idr_destroy(&htt->pending_tx); -+ -diff --git a/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch b/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch -deleted file mode 100644 -index 7bb74353eb128442bf26bc098d62a89c32cfc9d4..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/303-rt2x00-fix-monitor-mode-regression.patch -+++ /dev/null -@@ -1,156 +0,0 @@ --From: Eli Cooper --Date: Thu, 14 Jan 2016 00:07:12 +0800 --Subject: [PATCH] rt2x00: fix monitor mode regression -- --Since commit df1404650ccbfeb76a84f301f22316be0d00a864 monitor mode for rt2x00 --has been made effectively useless because the hardware filter is configured to --drop packets whose intended recipient is not the device, regardless of the --presence of monitor mode interfaces. -- --This patch fixes this regression by adding explicit monitor mode support, and --configuring the hardware filter accordingly. -- --Signed-off-by: Eli Cooper ----- -- ----- a/drivers/net/wireless/ralink/rt2x00/rt2400pci.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt2400pci.c --@@ -273,8 +273,10 @@ static void rt2400pci_config_filter(stru -- !(filter_flags & FIF_PLCPFAIL)); -- rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, -- !(filter_flags & FIF_CONTROL)); --- rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, 1); --+ rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, --+ !rt2x00dev->is_monitoring); -- rt2x00_set_field32(®, RXCSR0_DROP_TODS, --+ !rt2x00dev->is_monitoring && -- !rt2x00dev->intf_ap_count); -- rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); -- rt2x00mmio_register_write(rt2x00dev, RXCSR0, reg); ----- a/drivers/net/wireless/ralink/rt2x00/rt2500pci.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt2500pci.c --@@ -274,8 +274,10 @@ static void rt2500pci_config_filter(stru -- !(filter_flags & FIF_PLCPFAIL)); -- rt2x00_set_field32(®, RXCSR0_DROP_CONTROL, -- !(filter_flags & FIF_CONTROL)); --- rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, 1); --+ rt2x00_set_field32(®, RXCSR0_DROP_NOT_TO_ME, --+ !rt2x00dev->is_monitoring); -- rt2x00_set_field32(®, RXCSR0_DROP_TODS, --+ !rt2x00dev->is_monitoring && -- !rt2x00dev->intf_ap_count); -- rt2x00_set_field32(®, RXCSR0_DROP_VERSION_ERROR, 1); -- rt2x00_set_field32(®, RXCSR0_DROP_MCAST, ----- a/drivers/net/wireless/ralink/rt2x00/rt2500usb.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt2500usb.c --@@ -437,8 +437,10 @@ static void rt2500usb_config_filter(stru -- !(filter_flags & FIF_PLCPFAIL)); -- rt2x00_set_field16(®, TXRX_CSR2_DROP_CONTROL, -- !(filter_flags & FIF_CONTROL)); --- rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME, 1); --+ rt2x00_set_field16(®, TXRX_CSR2_DROP_NOT_TO_ME, --+ !rt2x00dev->is_monitoring); -- rt2x00_set_field16(®, TXRX_CSR2_DROP_TODS, --+ !rt2x00dev->is_monitoring && -- !rt2x00dev->intf_ap_count); -- rt2x00_set_field16(®, TXRX_CSR2_DROP_VERSION_ERROR, 1); -- rt2x00_set_field16(®, TXRX_CSR2_DROP_MULTICAST, ----- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c --@@ -1490,7 +1490,8 @@ void rt2800_config_filter(struct rt2x00_ -- !(filter_flags & FIF_FCSFAIL)); -- rt2x00_set_field32(®, RX_FILTER_CFG_DROP_PHY_ERROR, -- !(filter_flags & FIF_PLCPFAIL)); --- rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_TO_ME, 1); --+ rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_TO_ME, --+ !rt2x00dev->is_monitoring); -- rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0); -- rt2x00_set_field32(®, RX_FILTER_CFG_DROP_VER_ERROR, 1); -- rt2x00_set_field32(®, RX_FILTER_CFG_DROP_MULTICAST, ----- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h --+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h --@@ -844,11 +844,13 @@ struct rt2x00_dev { -- * - Open sta interface count. -- * - Association count. -- * - Beaconing enabled count. --+ * - Whether the device is monitoring. -- */ -- unsigned int intf_ap_count; -- unsigned int intf_sta_count; -- unsigned int intf_associated; -- unsigned int intf_beaconing; --+ bool is_monitoring; -- -- /* -- * Interface combinations ----- a/drivers/net/wireless/ralink/rt2x00/rt2x00config.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00config.c --@@ -244,6 +244,16 @@ void rt2x00lib_config(struct rt2x00_dev -- (ieee80211_flags & IEEE80211_CONF_CHANGE_PS)) -- cancel_delayed_work_sync(&rt2x00dev->autowakeup_work); -- --+ if (ieee80211_flags & IEEE80211_CONF_CHANGE_MONITOR) { --+ if (conf->flags & IEEE80211_CONF_MONITOR) { --+ rt2x00_dbg(rt2x00dev, "Monitor mode is enabled\n"); --+ rt2x00dev->is_monitoring = true; --+ } else { --+ rt2x00_dbg(rt2x00dev, "Monitor mode is disabled\n"); --+ rt2x00dev->is_monitoring = false; --+ } --+ } --+ -- /* -- * Start configuration. -- */ ----- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c --@@ -1204,6 +1204,7 @@ int rt2x00lib_start(struct rt2x00_dev *r -- rt2x00dev->intf_ap_count = 0; -- rt2x00dev->intf_sta_count = 0; -- rt2x00dev->intf_associated = 0; --+ rt2x00dev->is_monitoring = false; -- -- /* Enable the radio */ -- retval = rt2x00lib_enable_radio(rt2x00dev); ----- a/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00mac.c --@@ -385,11 +385,6 @@ void rt2x00mac_configure_filter(struct i -- *total_flags |= FIF_PSPOLL; -- } -- --- /* --- * Check if there is any work left for us. --- */ --- if (rt2x00dev->packet_filter == *total_flags) --- return; -- rt2x00dev->packet_filter = *total_flags; -- -- rt2x00dev->ops->lib->config_filter(rt2x00dev, *total_flags); ----- a/drivers/net/wireless/ralink/rt2x00/rt61pci.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt61pci.c --@@ -530,8 +530,10 @@ static void rt61pci_config_filter(struct -- !(filter_flags & FIF_PLCPFAIL)); -- rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, -- !(filter_flags & (FIF_CONTROL | FIF_PSPOLL))); --- rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, 1); --+ rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, --+ !rt2x00dev->is_monitoring); -- rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, --+ !rt2x00dev->is_monitoring && -- !rt2x00dev->intf_ap_count); -- rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); -- rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST, ----- a/drivers/net/wireless/ralink/rt2x00/rt73usb.c --+++ b/drivers/net/wireless/ralink/rt2x00/rt73usb.c --@@ -480,8 +480,10 @@ static void rt73usb_config_filter(struct -- !(filter_flags & FIF_PLCPFAIL)); -- rt2x00_set_field32(®, TXRX_CSR0_DROP_CONTROL, -- !(filter_flags & (FIF_CONTROL | FIF_PSPOLL))); --- rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, 1); --+ rt2x00_set_field32(®, TXRX_CSR0_DROP_NOT_TO_ME, --+ !rt2x00dev->is_monitoring); -- rt2x00_set_field32(®, TXRX_CSR0_DROP_TO_DS, --+ !rt2x00dev->is_monitoring && -- !rt2x00dev->intf_ap_count); -- rt2x00_set_field32(®, TXRX_CSR0_DROP_VERSION_ERROR, 1); -- rt2x00_set_field32(®, TXRX_CSR0_DROP_MULTICAST, -diff --git a/package/kernel/mac80211/patches/304-ath10k-Ensure-peer_map-references-are-cleaned-up.patch b/package/kernel/mac80211/patches/304-ath10k-Ensure-peer_map-references-are-cleaned-up.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..7dec1fb55ab64fed606c9162d39f90902a20d4e0 ---- /dev/null -+++ b/package/kernel/mac80211/patches/304-ath10k-Ensure-peer_map-references-are-cleaned-up.patch -@@ -0,0 +1,60 @@ -+From: Ben Greear -+Date: Fri, 1 Apr 2016 14:12:09 -0700 -+Subject: [PATCH] ath10k: Ensure peer_map references are cleaned up. -+ -+While debugging OS crashes due to firmware crashes, I enabled -+kasan, and it noticed that peer objects were being used-after-freed. -+ -+Looks like there are two places we could be leaving stale references -+in the peer-map, so clean that up. -+ -+Signed-off-by: Ben Greear -+--- -+ -+--- a/drivers/net/wireless/ath/ath10k/mac.c -++++ b/drivers/net/wireless/ath/ath10k/mac.c -+@@ -802,6 +802,7 @@ static void ath10k_peer_cleanup(struct a -+ { -+ struct ath10k_peer *peer, *tmp; -+ int peer_id; -++ int i; -+ -+ lockdep_assert_held(&ar->conf_mutex); -+ -+@@ -818,6 +819,17 @@ static void ath10k_peer_cleanup(struct a -+ ar->peer_map[peer_id] = NULL; -+ } -+ -++ /* Double check that peer is properly un-referenced from -++ * the peer_map -++ */ -++ for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) { -++ if (ar->peer_map[i] == peer) { -++ ath10k_warn(ar, "removing stale peer_map entry for %pM (ptr %p idx %d)\n", -++ peer->addr, peer, i); -++ ar->peer_map[i] = NULL; -++ } -++ } -++ -+ list_del(&peer->list); -+ kfree(peer); -+ ar->num_peers--; -+@@ -828,6 +840,7 @@ static void ath10k_peer_cleanup(struct a -+ static void ath10k_peer_cleanup_all(struct ath10k *ar) -+ { -+ struct ath10k_peer *peer, *tmp; -++ int i; -+ -+ lockdep_assert_held(&ar->conf_mutex); -+ -+@@ -836,6 +849,10 @@ static void ath10k_peer_cleanup_all(stru -+ list_del(&peer->list); -+ kfree(peer); -+ } -++ -++ for (i = 0; i < ARRAY_SIZE(ar->peer_map); i++) -++ ar->peer_map[i] = NULL; -++ -+ spin_unlock_bh(&ar->data_lock); -+ -+ ar->num_peers = 0; -diff --git a/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch b/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch -deleted file mode 100644 -index 049059aa24b50e71636336e3928bc66e64c39ae1..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/304-ath9k-avoid-ANI-restart-if-no-trigger.patch -+++ /dev/null -@@ -1,32 +0,0 @@ --From: Miaoqing Pan --Date: Fri, 15 Jan 2016 18:17:17 +0800 --Subject: [PATCH] ath9k: avoid ANI restart if no trigger -- --Fixes commit 54da20d83f0e ("ath9k_hw: improve ANI processing and rx desensitizing parameters") -- --Call ath9k_ani_restart() only when the phy error rate reach the --ANI immunity threshold. Sync the logic with internal code base. -- --Signed-off-by: Miaoqing Pan ----- -- ----- a/drivers/net/wireless/ath/ath9k/ani.c --+++ b/drivers/net/wireless/ath/ath9k/ani.c --@@ -444,14 +444,16 @@ void ath9k_hw_ani_monitor(struct ath_hw -- ofdmPhyErrRate < ah->config.ofdm_trig_low) { -- ath9k_hw_ani_lower_immunity(ah); -- aniState->ofdmsTurn = !aniState->ofdmsTurn; --+ ath9k_ani_restart(ah); -- } else if (ofdmPhyErrRate > ah->config.ofdm_trig_high) { -- ath9k_hw_ani_ofdm_err_trigger(ah); -- aniState->ofdmsTurn = false; --+ ath9k_ani_restart(ah); -- } else if (cckPhyErrRate > ah->config.cck_trig_high) { -- ath9k_hw_ani_cck_err_trigger(ah); -- aniState->ofdmsTurn = true; --+ ath9k_ani_restart(ah); -- } --- ath9k_ani_restart(ah); -- } -- } -- EXPORT_SYMBOL(ath9k_hw_ani_monitor); -diff --git a/package/kernel/mac80211/patches/305-ath10k-Clean-up-peer-when-sta-goes-away.patch b/package/kernel/mac80211/patches/305-ath10k-Clean-up-peer-when-sta-goes-away.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..7248a8cecf6b0798d354aa3fd44386f2e1f1b52d ---- /dev/null -+++ b/package/kernel/mac80211/patches/305-ath10k-Clean-up-peer-when-sta-goes-away.patch -@@ -0,0 +1,32 @@ -+From: Ben Greear -+Date: Fri, 1 Apr 2016 14:12:11 -0700 -+Subject: [PATCH] ath10k: Clean up peer when sta goes away. -+ -+If WMI and/or firmware has issues removing the peer object, -+then we still need to clean up the peer object in the driver. -+ -+Signed-off-by: Ben Greear -+--- -+ -+--- a/drivers/net/wireless/ath/ath10k/mac.c -++++ b/drivers/net/wireless/ath/ath10k/mac.c -+@@ -5992,9 +5992,17 @@ static int ath10k_sta_state(struct ieee8 -+ continue; -+ -+ if (peer->sta == sta) { -+- ath10k_warn(ar, "found sta peer %pM entry on vdev %i after it was supposedly removed\n", -+- sta->addr, arvif->vdev_id); -++ ath10k_warn(ar, "found sta peer %pM (ptr %p id %d) entry on vdev %i after it was supposedly removed\n", -++ sta->addr, peer, i, arvif->vdev_id); -+ peer->sta = NULL; -++ -++ /* Clean up the peer object as well since we -++ * must have failed to do this above. -++ */ -++ list_del(&peer->list); -++ ar->peer_map[i] = NULL; -++ kfree(peer); -++ ar->num_peers--; -+ } -+ } -+ spin_unlock_bh(&ar->data_lock); -diff --git a/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch b/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch -deleted file mode 100644 -index a1ac67c828deb429af4ba4db0e8c18e87a3e12b6..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/305-ath9k-clean-up-ANI-per-channel-pointer-checking.patch -+++ /dev/null -@@ -1,91 +0,0 @@ --From: Miaoqing Pan --Date: Fri, 15 Jan 2016 18:17:18 +0800 --Subject: [PATCH] ath9k: clean up ANI per-channel pointer checking -- --commit c24bd3620c50 ("ath9k: Do not maintain ANI state per-channel") --removed per-channel handling, the code to check 'curchan' also --should be removed as never used. -- --Signed-off-by: Miaoqing Pan ----- -- ----- a/drivers/net/wireless/ath/ath9k/ani.c --+++ b/drivers/net/wireless/ath/ath9k/ani.c --@@ -126,12 +126,8 @@ static void ath9k_hw_update_mibstats(str -- -- static void ath9k_ani_restart(struct ath_hw *ah) -- { --- struct ar5416AniState *aniState; --- --- if (!ah->curchan) --- return; --+ struct ar5416AniState *aniState = &ah->ani; -- --- aniState = &ah->ani; -- aniState->listenTime = 0; -- -- ENABLE_REGWRITE_BUFFER(ah); --@@ -221,12 +217,7 @@ static void ath9k_hw_set_ofdm_nil(struct -- -- static void ath9k_hw_ani_ofdm_err_trigger(struct ath_hw *ah) -- { --- struct ar5416AniState *aniState; --- --- if (!ah->curchan) --- return; --- --- aniState = &ah->ani; --+ struct ar5416AniState *aniState = &ah->ani; -- -- if (aniState->ofdmNoiseImmunityLevel < ATH9K_ANI_OFDM_MAX_LEVEL) -- ath9k_hw_set_ofdm_nil(ah, aniState->ofdmNoiseImmunityLevel + 1, false); --@@ -281,12 +272,7 @@ static void ath9k_hw_set_cck_nil(struct -- -- static void ath9k_hw_ani_cck_err_trigger(struct ath_hw *ah) -- { --- struct ar5416AniState *aniState; --- --- if (!ah->curchan) --- return; --- --- aniState = &ah->ani; --+ struct ar5416AniState *aniState = &ah->ani; -- -- if (aniState->cckNoiseImmunityLevel < ATH9K_ANI_CCK_MAX_LEVEL) -- ath9k_hw_set_cck_nil(ah, aniState->cckNoiseImmunityLevel + 1, --@@ -299,9 +285,7 @@ static void ath9k_hw_ani_cck_err_trigger -- */ -- static void ath9k_hw_ani_lower_immunity(struct ath_hw *ah) -- { --- struct ar5416AniState *aniState; --- --- aniState = &ah->ani; --+ struct ar5416AniState *aniState = &ah->ani; -- -- /* lower OFDM noise immunity */ -- if (aniState->ofdmNoiseImmunityLevel > 0 && --@@ -329,7 +313,7 @@ void ath9k_ani_reset(struct ath_hw *ah, -- struct ath_common *common = ath9k_hw_common(ah); -- int ofdm_nil, cck_nil; -- --- if (!ah->curchan) --+ if (!chan) -- return; -- -- BUG_ON(aniState == NULL); --@@ -416,14 +400,10 @@ static bool ath9k_hw_ani_read_counters(s -- -- void ath9k_hw_ani_monitor(struct ath_hw *ah, struct ath9k_channel *chan) -- { --- struct ar5416AniState *aniState; --+ struct ar5416AniState *aniState = &ah->ani; -- struct ath_common *common = ath9k_hw_common(ah); -- u32 ofdmPhyErrRate, cckPhyErrRate; -- --- if (!ah->curchan) --- return; --- --- aniState = &ah->ani; -- if (!ath9k_hw_ani_read_counters(ah)) -- return; -- -diff --git a/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch b/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch -deleted file mode 100644 -index cf8194aa334c7b85e26404ec3a104dff5431d4e9..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/306-ath9k-do-not-reset-while-BB-panic-0x4000409-on-ar956.patch -+++ /dev/null -@@ -1,31 +0,0 @@ --From: Miaoqing Pan --Date: Fri, 15 Jan 2016 18:17:19 +0800 --Subject: [PATCH] ath9k: do not reset while BB panic(0x4000409) on ar9561 -- --BB panic(0x4000409) observed while AP enabling/disabling --bursting. -- --Signed-off-by: Miaoqing Pan ----- -- ----- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c --+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c --@@ -2071,7 +2071,8 @@ void ar9003_hw_attach_phy_ops(struct ath -- * to be disabled. -- * -- * 0x04000409: Packet stuck on receive. --- * Full chip reset is required for all chips except AR9340. --+ * Full chip reset is required for all chips except --+ * AR9340, AR9531 and AR9561. -- */ -- -- /* --@@ -2100,7 +2101,7 @@ bool ar9003_hw_bb_watchdog_check(struct -- case 0x04000b09: -- return true; -- case 0x04000409: --- if (AR_SREV_9340(ah) || AR_SREV_9531(ah)) --+ if (AR_SREV_9340(ah) || AR_SREV_9531(ah) || AR_SREV_9561(ah)) -- return false; -- else -- return true; -diff --git a/package/kernel/mac80211/patches/306-mac80211-add-hdrlen-to-ieee80211_tx_data.patch b/package/kernel/mac80211/patches/306-mac80211-add-hdrlen-to-ieee80211_tx_data.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..4a8f14394640020ae7b32aa3e295cfb9494896df ---- /dev/null -+++ b/package/kernel/mac80211/patches/306-mac80211-add-hdrlen-to-ieee80211_tx_data.patch -@@ -0,0 +1,203 @@ -+From: Janusz Dziedzic -+Date: Fri, 19 Feb 2016 11:01:49 +0100 -+Subject: [PATCH] mac80211: add hdrlen to ieee80211_tx_data -+ -+Add hdrlen to ieee80211_tx_data and use this -+when wep/ccmd/tkip. This is preparation for -+aligned4 code. -+ -+Signed-off-by: Janusz Dziedzic -+--- -+ -+--- a/net/mac80211/ieee80211_i.h -++++ b/net/mac80211/ieee80211_i.h -+@@ -173,6 +173,7 @@ struct ieee80211_tx_data { -+ struct ieee80211_tx_rate rate; -+ -+ unsigned int flags; -++ unsigned int hdrlen; -+ }; -+ -+ -+--- a/net/mac80211/tx.c -++++ b/net/mac80211/tx.c -+@@ -922,7 +922,7 @@ ieee80211_tx_h_fragment(struct ieee80211 -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ struct ieee80211_hdr *hdr = (void *)skb->data; -+ int frag_threshold = tx->local->hw.wiphy->frag_threshold; -+- int hdrlen; -++ int hdrlen = tx->hdrlen; -+ int fragnum; -+ -+ /* no matter what happens, tx->skb moves to tx->skbs */ -+@@ -943,8 +943,6 @@ ieee80211_tx_h_fragment(struct ieee80211 -+ if (WARN_ON(info->flags & IEEE80211_TX_CTL_AMPDU)) -+ return TX_DROP; -+ -+- hdrlen = ieee80211_hdrlen(hdr->frame_control); -+- -+ /* internal error, why isn't DONTFRAG set? */ -+ if (WARN_ON(skb->len + FCS_LEN <= frag_threshold)) -+ return TX_DROP; -+@@ -1176,6 +1174,8 @@ ieee80211_tx_prepare(struct ieee80211_su -+ -+ hdr = (struct ieee80211_hdr *) skb->data; -+ -++ tx->hdrlen = ieee80211_hdrlen(hdr->frame_control); -++ -+ if (likely(sta)) { -+ if (!IS_ERR(sta)) -+ tx->sta = sta; -+--- a/net/mac80211/util.c -++++ b/net/mac80211/util.c -+@@ -1226,6 +1226,7 @@ void ieee80211_send_auth(struct ieee8021 -+ struct ieee80211_local *local = sdata->local; -+ struct sk_buff *skb; -+ struct ieee80211_mgmt *mgmt; -++ unsigned int hdrlen; -+ int err; -+ -+ /* 24 + 6 = header + auth_algo + auth_transaction + status_code */ -+@@ -1250,8 +1251,10 @@ void ieee80211_send_auth(struct ieee8021 -+ memcpy(skb_put(skb, extra_len), extra, extra_len); -+ -+ if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { -++ hdrlen = ieee80211_hdrlen(mgmt->frame_control); -+ mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); -+- err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx); -++ err = ieee80211_wep_encrypt(local, skb, hdrlen, key, -++ key_len, key_idx); -+ WARN_ON(err); -+ } -+ -+--- a/net/mac80211/wep.c -++++ b/net/mac80211/wep.c -+@@ -89,11 +89,11 @@ static void ieee80211_wep_get_iv(struct -+ -+ static u8 *ieee80211_wep_add_iv(struct ieee80211_local *local, -+ struct sk_buff *skb, -++ unsigned int hdrlen, -+ int keylen, int keyidx) -+ { -+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+- unsigned int hdrlen; -+ u8 *newhdr; -+ -+ hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); -+@@ -101,7 +101,6 @@ static u8 *ieee80211_wep_add_iv(struct i -+ if (WARN_ON(skb_headroom(skb) < IEEE80211_WEP_IV_LEN)) -+ return NULL; -+ -+- hdrlen = ieee80211_hdrlen(hdr->frame_control); -+ newhdr = skb_push(skb, IEEE80211_WEP_IV_LEN); -+ memmove(newhdr, newhdr + IEEE80211_WEP_IV_LEN, hdrlen); -+ -+@@ -160,6 +159,7 @@ int ieee80211_wep_encrypt_data(struct cr -+ */ -+ int ieee80211_wep_encrypt(struct ieee80211_local *local, -+ struct sk_buff *skb, -++ unsigned int hdrlen, -+ const u8 *key, int keylen, int keyidx) -+ { -+ u8 *iv; -+@@ -169,7 +169,7 @@ int ieee80211_wep_encrypt(struct ieee802 -+ if (WARN_ON(skb_tailroom(skb) < IEEE80211_WEP_ICV_LEN)) -+ return -1; -+ -+- iv = ieee80211_wep_add_iv(local, skb, keylen, keyidx); -++ iv = ieee80211_wep_add_iv(local, skb, hdrlen, keylen, keyidx); -+ if (!iv) -+ return -1; -+ -+@@ -306,13 +306,14 @@ static int wep_encrypt_skb(struct ieee80 -+ struct ieee80211_key_conf *hw_key = info->control.hw_key; -+ -+ if (!hw_key) { -+- if (ieee80211_wep_encrypt(tx->local, skb, tx->key->conf.key, -++ if (ieee80211_wep_encrypt(tx->local, skb, tx->hdrlen, -++ tx->key->conf.key, -+ tx->key->conf.keylen, -+ tx->key->conf.keyidx)) -+ return -1; -+ } else if ((hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) || -+ (hw_key->flags & IEEE80211_KEY_FLAG_PUT_IV_SPACE)) { -+- if (!ieee80211_wep_add_iv(tx->local, skb, -++ if (!ieee80211_wep_add_iv(tx->local, skb, tx->hdrlen, -+ tx->key->conf.keylen, -+ tx->key->conf.keyidx)) -+ return -1; -+--- a/net/mac80211/wep.h -++++ b/net/mac80211/wep.h -+@@ -22,6 +22,7 @@ int ieee80211_wep_encrypt_data(struct cr -+ size_t klen, u8 *data, size_t data_len); -+ int ieee80211_wep_encrypt(struct ieee80211_local *local, -+ struct sk_buff *skb, -++ unsigned int hdrlen, -+ const u8 *key, int keylen, int keyidx); -+ int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key, -+ size_t klen, u8 *data, size_t data_len); -+--- a/net/mac80211/wpa.c -++++ b/net/mac80211/wpa.c -+@@ -43,7 +43,7 @@ ieee80211_tx_h_michael_mic_add(struct ie -+ skb->len < 24 || !ieee80211_is_data_present(hdr->frame_control)) -+ return TX_CONTINUE; -+ -+- hdrlen = ieee80211_hdrlen(hdr->frame_control); -++ hdrlen = tx->hdrlen; -+ if (skb->len < hdrlen) -+ return TX_DROP; -+ -+@@ -186,7 +186,6 @@ mic_fail_no_key: -+ -+ static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb) -+ { -+- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; -+ struct ieee80211_key *key = tx->key; -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ unsigned int hdrlen; -+@@ -201,7 +200,7 @@ static int tkip_encrypt_skb(struct ieee8 -+ return 0; -+ } -+ -+- hdrlen = ieee80211_hdrlen(hdr->frame_control); -++ hdrlen = tx->hdrlen; -+ len = skb->len - hdrlen; -+ -+ if (info->control.hw_key) -+@@ -418,7 +417,7 @@ static int ccmp_encrypt_skb(struct ieee8 -+ return 0; -+ } -+ -+- hdrlen = ieee80211_hdrlen(hdr->frame_control); -++ hdrlen = tx->hdrlen; -+ len = skb->len - hdrlen; -+ -+ if (info->control.hw_key) -+@@ -651,7 +650,7 @@ static int gcmp_encrypt_skb(struct ieee8 -+ return 0; -+ } -+ -+- hdrlen = ieee80211_hdrlen(hdr->frame_control); -++ hdrlen = tx->hdrlen; -+ len = skb->len - hdrlen; -+ -+ if (info->control.hw_key) -+@@ -791,7 +790,6 @@ static ieee80211_tx_result -+ ieee80211_crypto_cs_encrypt(struct ieee80211_tx_data *tx, -+ struct sk_buff *skb) -+ { -+- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; -+ struct ieee80211_key *key = tx->key; -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ int hdrlen; -+@@ -807,8 +805,7 @@ ieee80211_crypto_cs_encrypt(struct ieee8 -+ pskb_expand_head(skb, iv_len, 0, GFP_ATOMIC))) -+ return TX_DROP; -+ -+- hdrlen = ieee80211_hdrlen(hdr->frame_control); -+- -++ hdrlen = tx->hdrlen; -+ pos = skb_push(skb, iv_len); -+ memmove(pos, pos + iv_len, hdrlen); -+ -diff --git a/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch b/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch -deleted file mode 100644 -index 80b781ca54dc8c217ffe5fa304bf2bc515cf1c90..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/307-ath9k-fix-inconsistent-use-of-tab-and-space-in-inden.patch -+++ /dev/null -@@ -1,27 +0,0 @@ --From: Miaoqing Pan --Date: Fri, 15 Jan 2016 18:17:20 +0800 --Subject: [PATCH] ath9k: fix inconsistent use of tab and space in -- indentation -- --Minor changes for indenting. -- --Signed-off-by: Miaoqing Pan ----- -- ----- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c --+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c --@@ -5485,11 +5485,11 @@ unsigned int ar9003_get_paprd_scale_fact -- AR9300_PAPRD_SCALE_1); -- else { -- if (chan->channel >= 5700) --- return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20), --- AR9300_PAPRD_SCALE_1); --+ return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20), --+ AR9300_PAPRD_SCALE_1); -- else if (chan->channel >= 5400) -- return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40), --- AR9300_PAPRD_SCALE_2); --+ AR9300_PAPRD_SCALE_2); -- else -- return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40), -- AR9300_PAPRD_SCALE_1); -diff --git a/package/kernel/mac80211/patches/307-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch b/package/kernel/mac80211/patches/307-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..eeb881e03064fc7b0fdbcb5dbb5ffc2600c9754e ---- /dev/null -+++ b/package/kernel/mac80211/patches/307-mac80211-add-NEED_ALIGNED4_SKBS-hw-flag.patch -@@ -0,0 +1,235 @@ -+From: Janusz Dziedzic -+Date: Fri, 19 Feb 2016 11:01:50 +0100 -+Subject: [PATCH] mac80211: add NEED_ALIGNED4_SKBS hw flag -+ -+HW/driver should set NEED_ALIGNED4_SKBS flag in case -+require aligned skbs to four-byte boundaries. -+This affect only TX direction. -+ -+Padding is added after ieee80211_hdr, before IV/LLC. -+ -+Before we have to do memmove(hdrlen) twice in the -+dirver. Once before we pass this to HW and next -+in tx completion (to be sure monitor will report -+this tx frame correctly). -+ -+With this patch we can skip this memmove() and save CPU. -+ -+Currently this was tested with ath9k, both hw/sw crypt for -+wep/tkip/ccmp. -+ -+Signed-off-by: Janusz Dziedzic -+--- -+ -+--- a/include/net/mac80211.h -++++ b/include/net/mac80211.h -+@@ -2014,6 +2014,9 @@ struct ieee80211_txq { -+ * @IEEE80211_HW_TX_FRAG_LIST: Hardware (or driver) supports sending frag_list -+ * skbs, needed for zero-copy software A-MSDU. -+ * -++ * @IEEE80211_HW_NEEDS_ALIGNED4_SKBS: Driver need aligned skbs to four-byte. -++ * Padding will be added after ieee80211_hdr, before IV/LLC. -++ * -+ * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays -+ */ -+ enum ieee80211_hw_flags { -+@@ -2054,6 +2057,7 @@ enum ieee80211_hw_flags { -+ IEEE80211_HW_USES_RSS, -+ IEEE80211_HW_TX_AMSDU, -+ IEEE80211_HW_TX_FRAG_LIST, -++ IEEE80211_HW_NEEDS_ALIGNED4_SKBS, -+ -+ /* keep last, obviously */ -+ NUM_IEEE80211_HW_FLAGS -+--- a/net/mac80211/debugfs.c -++++ b/net/mac80211/debugfs.c -+@@ -302,6 +302,7 @@ static const char *hw_flag_names[] = { -+ FLAG(USES_RSS), -+ FLAG(TX_AMSDU), -+ FLAG(TX_FRAG_LIST), -++ FLAG(NEEDS_ALIGNED4_SKBS), -+ #undef FLAG -+ }; -+ -+--- a/net/mac80211/ieee80211_i.h -++++ b/net/mac80211/ieee80211_i.h -+@@ -1497,6 +1497,29 @@ ieee80211_have_rx_timestamp(struct ieee8 -+ return false; -+ } -+ -++static inline unsigned int -++ieee80211_hdr_padsize(struct ieee80211_hw *hw, unsigned int hdrlen) -++{ -++ /* -++ * While hdrlen is already aligned to two-byte boundaries, -++ * simple check with & 2 will return correct padsize. -++ */ -++ if (ieee80211_hw_check(hw, NEEDS_ALIGNED4_SKBS)) -++ return hdrlen & 2; -++ return 0; -++} -++ -++static inline unsigned int -++ieee80211_padded_hdrlen(struct ieee80211_hw *hw, __le16 fc) -++{ -++ unsigned int hdrlen; -++ -++ hdrlen = ieee80211_hdrlen(fc); -++ hdrlen += ieee80211_hdr_padsize(hw, hdrlen); -++ -++ return hdrlen; -++} -++ -+ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, -+ struct ieee80211_rx_status *status, -+ unsigned int mpdu_len, -+--- a/net/mac80211/sta_info.h -++++ b/net/mac80211/sta_info.h -+@@ -279,7 +279,7 @@ struct ieee80211_fast_tx { -+ u8 hdr_len; -+ u8 sa_offs, da_offs, pn_offs; -+ u8 band; -+- u8 hdr[30 + 2 + IEEE80211_FAST_XMIT_MAX_IV + -++ u8 hdr[30 + 2 + 2 + IEEE80211_FAST_XMIT_MAX_IV + -+ sizeof(rfc1042_header)] __aligned(2); -+ -+ struct rcu_head rcu_head; -+--- a/net/mac80211/status.c -++++ b/net/mac80211/status.c -+@@ -683,9 +683,22 @@ void ieee80211_tx_monitor(struct ieee802 -+ struct sk_buff *skb2; -+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ struct ieee80211_sub_if_data *sdata; -++ struct ieee80211_hdr *hdr = (void *)skb->data; -+ struct net_device *prev_dev = NULL; -++ unsigned int hdrlen, padsize; -+ int rtap_len; -+ -++ /* Remove padding if was added */ -++ if (ieee80211_hw_check(&local->hw, NEEDS_ALIGNED4_SKBS)) { -++ hdrlen = ieee80211_hdrlen(hdr->frame_control); -++ padsize = ieee80211_hdr_padsize(&local->hw, hdrlen); -++ -++ if (padsize && skb->len > hdrlen + padsize) { -++ memmove(skb->data + padsize, skb->data, hdrlen); -++ skb_pull(skb, padsize); -++ } -++ } -++ -+ /* send frame to monitor interfaces now */ -+ rtap_len = ieee80211_tx_radiotap_len(info); -+ if (WARN_ON_ONCE(skb_headroom(skb) < rtap_len)) { -+--- a/net/mac80211/tkip.c -++++ b/net/mac80211/tkip.c -+@@ -201,10 +201,12 @@ void ieee80211_get_tkip_p2k(struct ieee8 -+ { -+ struct ieee80211_key *key = (struct ieee80211_key *) -+ container_of(keyconf, struct ieee80211_key, conf); -++ struct ieee80211_hw *hw = &key->local->hw; -+ const u8 *tk = &key->conf.key[NL80211_TKIP_DATA_OFFSET_ENCR_KEY]; -+ struct tkip_ctx *ctx = &key->u.tkip.tx; -+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; -+- const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control); -++ const u8 *data = (u8 *)hdr + ieee80211_padded_hdrlen(hw, -++ hdr->frame_control); -+ u32 iv32 = get_unaligned_le32(&data[4]); -+ u16 iv16 = data[2] | (data[0] << 8); -+ -+--- a/net/mac80211/tx.c -++++ b/net/mac80211/tx.c -+@@ -1173,8 +1173,7 @@ ieee80211_tx_prepare(struct ieee80211_su -+ info->flags &= ~IEEE80211_TX_INTFL_NEED_TXPROCESSING; -+ -+ hdr = (struct ieee80211_hdr *) skb->data; -+- -+- tx->hdrlen = ieee80211_hdrlen(hdr->frame_control); -++ tx->hdrlen = ieee80211_padded_hdrlen(&local->hw, hdr->frame_control); -+ -+ if (likely(sta)) { -+ if (!IS_ERR(sta)) -+@@ -2108,7 +2107,7 @@ netdev_tx_t ieee80211_monitor_start_xmit -+ goto fail; -+ -+ hdr = (struct ieee80211_hdr *)(skb->data + len_rthdr); -+- hdrlen = ieee80211_hdrlen(hdr->frame_control); -++ hdrlen = ieee80211_padded_hdrlen(&local->hw, hdr->frame_control); -+ -+ if (skb->len < len_rthdr + hdrlen) -+ goto fail; -+@@ -2334,7 +2333,7 @@ static struct sk_buff *ieee80211_build_h -+ struct ieee80211_chanctx_conf *chanctx_conf; -+ struct ieee80211_sub_if_data *ap_sdata; -+ enum nl80211_band band; -+- int ret; -++ int padsize, ret; -+ -+ if (IS_ERR(sta)) -+ sta = NULL; -+@@ -2554,6 +2553,9 @@ static struct sk_buff *ieee80211_build_h -+ hdrlen += 2; -+ } -+ -++ /* Check aligned4 skb required */ -++ padsize = ieee80211_hdr_padsize(&sdata->local->hw, hdrlen); -++ -+ /* -+ * Drop unicast frames to unauthorised stations unless they are -+ * EAPOL frames from the local station. -+@@ -2640,6 +2642,7 @@ static struct sk_buff *ieee80211_build_h -+ h_pos -= skip_header_bytes; -+ -+ head_need = hdrlen + encaps_len + meshhdrlen - skb_headroom(skb); -++ head_need += padsize; -+ -+ /* -+ * So we need to modify the skb header and hence need a copy of -+@@ -2678,6 +2681,9 @@ static struct sk_buff *ieee80211_build_h -+ } -+ #endif -+ -++ if (padsize) -++ memset(skb_push(skb, padsize), 0, padsize); -++ -+ if (ieee80211_is_data_qos(fc)) { -+ __le16 *qos_control; -+ -+@@ -2691,8 +2697,8 @@ static struct sk_buff *ieee80211_build_h -+ } else -+ memcpy(skb_push(skb, hdrlen), &hdr, hdrlen); -+ -+- nh_pos += hdrlen; -+- h_pos += hdrlen; -++ nh_pos += hdrlen + padsize; -++ h_pos += hdrlen + padsize; -+ -+ /* Update skb pointers to various headers since this modified frame -+ * is going to go through Linux networking code that may potentially -+@@ -2861,6 +2867,9 @@ void ieee80211_check_fast_xmit(struct st -+ fc |= cpu_to_le16(IEEE80211_STYPE_QOS_DATA); -+ } -+ -++ /* Check aligned4 skb required */ -++ build.hdr_len += ieee80211_hdr_padsize(&local->hw, build.hdr_len); -++ -+ /* We store the key here so there's no point in using rcu_dereference() -+ * but that's fine because the code that changes the pointers will call -+ * this function after doing so. For a single CPU that would be enough, -+--- a/net/mac80211/util.c -++++ b/net/mac80211/util.c -+@@ -1224,6 +1224,7 @@ void ieee80211_send_auth(struct ieee8021 -+ u32 tx_flags) -+ { -+ struct ieee80211_local *local = sdata->local; -++ struct ieee80211_hw *hw = &local->hw; -+ struct sk_buff *skb; -+ struct ieee80211_mgmt *mgmt; -+ unsigned int hdrlen; -+@@ -1251,7 +1252,7 @@ void ieee80211_send_auth(struct ieee8021 -+ memcpy(skb_put(skb, extra_len), extra, extra_len); -+ -+ if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) { -+- hdrlen = ieee80211_hdrlen(mgmt->frame_control); -++ hdrlen = ieee80211_padded_hdrlen(hw, mgmt->frame_control); -+ mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); -+ err = ieee80211_wep_encrypt(local, skb, hdrlen, key, -+ key_len, key_idx); -diff --git a/package/kernel/mac80211/patches/308-ath10k-Fix-sending-NULL-Qos-NULL-data-frames-for-QCA.patch b/package/kernel/mac80211/patches/308-ath10k-Fix-sending-NULL-Qos-NULL-data-frames-for-QCA.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..8590aadabe8d622a9691e13c17af23bd5d91886c ---- /dev/null -+++ b/package/kernel/mac80211/patches/308-ath10k-Fix-sending-NULL-Qos-NULL-data-frames-for-QCA.patch -@@ -0,0 +1,72 @@ -+From: Mohammed Shafi Shajakhan -+Date: Thu, 23 Jun 2016 22:10:01 +0530 -+Subject: [PATCH] ath10k: Fix sending NULL/ Qos NULL data frames for -+ QCA99X0 and later -+ -+For chipsets like QCA99X0, IPQ4019 and later we are not getting proper -+NULL func status (always acked/successs !!) when hostapd does a -+PROBE_CLIENT via nullfunc frames when the station is powered off -+abruptly (inactive timer probes client via null func after the inactive -+time reaches beyond the threshold). Fix this by disabling the workaround -+(getting the ACK status of NULL func frames by sending via HTT mgmt-tx -+ path) introduced by the change ("ath10k: fix beacon loss handling ") -+for QCA99X0 and later chipsets. The normal tx path provides the proper -+ACK status for NULL data frames. As of now disable this workaround for -+chipsets QCA99X0 and later, once the 10.1 firmware is obselete we can -+completely get rid of this workaround for all the chipsets -+ -+Signed-off-by: Tamizh chelvam -+Signed-off-by: Mohammed Shafi Shajakhan -+--- -+ -+--- a/drivers/net/wireless/ath/ath10k/core.c -++++ b/drivers/net/wireless/ath/ath10k/core.c -+@@ -181,6 +181,7 @@ static const struct ath10k_hw_params ath -+ .board = QCA99X0_HW_2_0_BOARD_DATA_FILE, -+ .board_size = QCA99X0_BOARD_DATA_SZ, -+ .board_ext_size = QCA99X0_BOARD_EXT_DATA_SZ, -++ .disable_null_func_workaround = true, -+ }, -+ }, -+ { -+@@ -204,6 +205,7 @@ static const struct ath10k_hw_params ath -+ .board = QCA9984_HW_1_0_BOARD_DATA_FILE, -+ .board_size = QCA99X0_BOARD_DATA_SZ, -+ .board_ext_size = QCA99X0_BOARD_EXT_DATA_SZ, -++ .disable_null_func_workaround = true, -+ }, -+ }, -+ { -+@@ -262,6 +264,7 @@ static const struct ath10k_hw_params ath -+ .board = QCA4019_HW_1_0_BOARD_DATA_FILE, -+ .board_size = QCA4019_BOARD_DATA_SZ, -+ .board_ext_size = QCA4019_BOARD_EXT_DATA_SZ, -++ .disable_null_func_workaround = true, -+ }, -+ }, -+ }; -+--- a/drivers/net/wireless/ath/ath10k/core.h -++++ b/drivers/net/wireless/ath/ath10k/core.h -+@@ -750,6 +750,12 @@ struct ath10k { -+ const char *board; -+ size_t board_size; -+ size_t board_ext_size; -++ /* Workaround of sending NULL data frames via -++ * HTT mgmt TX and getting the proper ACK status does -++ * not works for chipsets QCA99X0 and later, while -++ * Tx data path reports the ACK status properly. -++ */ -++ bool disable_null_func_workaround; -+ } fw; -+ } hw_params; -+ -+--- a/drivers/net/wireless/ath/ath10k/mac.c -++++ b/drivers/net/wireless/ath/ath10k/mac.c -+@@ -3253,6 +3253,7 @@ ath10k_mac_tx_h_get_txmode(struct ath10k -+ * mode though because AP don't sleep. -+ */ -+ if (ar->htt.target_version_major < 3 && -++ !ar->hw_params.fw.disable_null_func_workaround && -+ (ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) && -+ !test_bit(ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX, -+ ar->running_fw->fw_file.fw_features)) -diff --git a/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch b/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch -deleted file mode 100644 -index d4088664bf68166ecf5c25a9ac727578805da176..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/308-ath9k-fix-data-bus-error-on-ar9300-and-ar9580.patch -+++ /dev/null -@@ -1,65 +0,0 @@ --From: Miaoqing Pan --Date: Fri, 15 Jan 2016 18:17:21 +0800 --Subject: [PATCH] ath9k: fix data bus error on ar9300 and ar9580 -- --One crash issue be found on ar9300: RTC_RC reg read leads crash, leading --the data bus error, due to RTC_RC reg write not happen properly. -- --Warm Reset trigger in continuous beacon stuck for one of the customer for --other chip, noticed the MAC was stuck in RTC reset. After analysis noticed --DMA did not complete when RTC was put in reset. -- --So, before resetting the MAC need to make sure there are no pending DMA --transactions because this reset does not reset all parts of the chip. -- --The 12th and 11th bit of MAC _DMA_CFG register used to do that. -- 12 cfg_halt_ack 0x0 -- 0 DMA has not yet halted -- 1 DMA has halted -- 11 cfg_halt_req 0x0 -- 0 DMA logic operates normally -- 1 Request DMA logic to stop so software can reset the MAC -- --The Bit [12] of this register indicates when the halt has taken effect or --not. the DMA halt IS NOT recoverable; once software sets bit [11] to --request a DMA halt, software must wait for bit [12] to be set and reset --the MAC. -- --So, the same thing we implemented for ar9580 chip. -- --Signed-off-by: Miaoqing Pan ----- -- ----- a/drivers/net/wireless/ath/ath9k/hw.c --+++ b/drivers/net/wireless/ath/ath9k/hw.c --@@ -1368,6 +1368,16 @@ static bool ath9k_hw_set_reset(struct at -- if (ath9k_hw_mci_is_enabled(ah)) -- ar9003_mci_check_gpm_offset(ah); -- --+ /* DMA HALT added to resolve ar9300 and ar9580 bus error during --+ * RTC_RC reg read --+ */ --+ if (AR_SREV_9300(ah) || AR_SREV_9580(ah)) { --+ REG_SET_BIT(ah, AR_CFG, AR_CFG_HALT_REQ); --+ ath9k_hw_wait(ah, AR_CFG, AR_CFG_HALT_ACK, AR_CFG_HALT_ACK, --+ 20 * AH_WAIT_TIMEOUT); --+ REG_CLR_BIT(ah, AR_CFG, AR_CFG_HALT_REQ); --+ } --+ -- REG_WRITE(ah, AR_RTC_RC, rst_flags); -- -- REGWRITE_BUFFER_FLUSH(ah); ----- a/drivers/net/wireless/ath/ath9k/reg.h --+++ b/drivers/net/wireless/ath/ath9k/reg.h --@@ -34,8 +34,10 @@ -- #define AR_CFG_SWRG 0x00000010 -- #define AR_CFG_AP_ADHOC_INDICATION 0x00000020 -- #define AR_CFG_PHOK 0x00000100 ---#define AR_CFG_CLK_GATE_DIS 0x00000400 -- #define AR_CFG_EEBS 0x00000200 --+#define AR_CFG_CLK_GATE_DIS 0x00000400 --+#define AR_CFG_HALT_REQ 0x00000800 --+#define AR_CFG_HALT_ACK 0x00001000 -- #define AR_CFG_PCI_MASTER_REQ_Q_THRESH 0x00060000 -- #define AR_CFG_PCI_MASTER_REQ_Q_THRESH_S 17 -- -diff --git a/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch b/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch -deleted file mode 100644 -index d9511c8d5f5c8051bf2ed9c1cd408911c0ba02d9..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/309-01-brcmfmac-add-missing-include.patch -+++ /dev/null -@@ -1,19 +0,0 @@ --From: Felix Fietkau --Date: Fri, 15 Jan 2016 15:59:45 +0100 --Subject: [PATCH] brcmfmac: add missing include -- --linux/module.h is required for defining module parameters -- --Signed-off-by: Felix Fietkau ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --@@ -17,6 +17,7 @@ -- #include -- #include -- #include --+#include -- #include -- #include -- #include "core.h" -diff --git a/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch b/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch -deleted file mode 100644 -index 711e019e2b6836c6907a614fc3a3b1c17693f2cf..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/309-02-brcmfmac-fix-sdio-sg-table-alloc-crash.patch -+++ /dev/null -@@ -1,118 +0,0 @@ --From: Hante Meuleman --Date: Tue, 19 Jan 2016 12:39:24 +0100 --Subject: [PATCH] brcmfmac: fix sdio sg table alloc crash -- --With commit 7d34b0560567 ("brcmfmac: Move all module parameters to --one place") a bug was introduced causing a null pointer exception. --This patch fixes the bug by initializing the sg table till after --the settings have been initialized. -- --Fixes: 7d34b0560567 ("brcmfmac: Move all module parameters to one place") --Reported-by: Marc Zyngier --Tested-by: Marc Zyngier --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --@@ -879,11 +879,24 @@ int brcmf_sdiod_abort(struct brcmf_sdio_ -- return 0; -- } -- ---static void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev) --+void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev) -- { --+ struct sdio_func *func; --+ struct mmc_host *host; --+ uint max_blocks; -- uint nents; -- int err; -- --+ func = sdiodev->func[2]; --+ host = func->card->host; --+ sdiodev->sg_support = host->max_segs > 1; --+ max_blocks = min_t(uint, host->max_blk_count, 511u); --+ sdiodev->max_request_size = min_t(uint, host->max_req_size, --+ max_blocks * func->cur_blksize); --+ sdiodev->max_segment_count = min_t(uint, host->max_segs, --+ SG_MAX_SINGLE_ALLOC); --+ sdiodev->max_segment_size = host->max_seg_size; --+ -- if (!sdiodev->sg_support) -- return; -- --@@ -1021,9 +1034,6 @@ static void brcmf_sdiod_host_fixup(struc -- -- static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev) -- { --- struct sdio_func *func; --- struct mmc_host *host; --- uint max_blocks; -- int ret = 0; -- -- sdiodev->num_funcs = 2; --@@ -1054,26 +1064,6 @@ static int brcmf_sdiod_probe(struct brcm -- goto out; -- } -- --- /* --- * determine host related variables after brcmf_sdiod_probe() --- * as func->cur_blksize is properly set and F2 init has been --- * completed successfully. --- */ --- func = sdiodev->func[2]; --- host = func->card->host; --- sdiodev->sg_support = host->max_segs > 1; --- max_blocks = min_t(uint, host->max_blk_count, 511u); --- sdiodev->max_request_size = min_t(uint, host->max_req_size, --- max_blocks * func->cur_blksize); --- sdiodev->max_segment_count = min_t(uint, host->max_segs, --- SG_MAX_SINGLE_ALLOC); --- sdiodev->max_segment_size = host->max_seg_size; --- --- /* allocate scatter-gather table. sg support --- * will be disabled upon allocation failure. --- */ --- brcmf_sdiod_sgtable_alloc(sdiodev); --- -- ret = brcmf_sdiod_freezer_attach(sdiodev); -- if (ret) -- goto out; --@@ -1084,7 +1074,7 @@ static int brcmf_sdiod_probe(struct brcm -- ret = -ENODEV; -- goto out; -- } --- brcmf_sdiod_host_fixup(host); --+ brcmf_sdiod_host_fixup(sdiodev->func[2]->card->host); -- out: -- if (ret) -- brcmf_sdiod_remove(sdiodev); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -4114,6 +4114,11 @@ struct brcmf_sdio *brcmf_sdio_probe(stru -- goto fail; -- } -- --+ /* allocate scatter-gather table. sg support --+ * will be disabled upon allocation failure. --+ */ --+ brcmf_sdiod_sgtable_alloc(bus->sdiodev); --+ -- /* Query the F2 block size, set roundup accordingly */ -- bus->blocksize = bus->sdiodev->func[2]->cur_blksize; -- bus->roundup = min(max_roundup, bus->blocksize); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h --@@ -342,6 +342,7 @@ int brcmf_sdiod_ramrw(struct brcmf_sdio_ -- -- /* Issue an abort to the specified function */ -- int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn); --+void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev); -- void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev, -- enum brcmf_sdiod_state state); -- #ifdef CONFIG_PM_SLEEP -diff --git a/package/kernel/mac80211/patches/309-cfg80211-fix-proto-in-ieee80211_data_to_8023-for-fra.patch b/package/kernel/mac80211/patches/309-cfg80211-fix-proto-in-ieee80211_data_to_8023-for-fra.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..41c27cac4129547e1e6df0f4ed96d61279c13a44 ---- /dev/null -+++ b/package/kernel/mac80211/patches/309-cfg80211-fix-proto-in-ieee80211_data_to_8023-for-fra.patch -@@ -0,0 +1,37 @@ -+From: Felix Fietkau -+Date: Wed, 29 Jun 2016 10:02:32 +0200 -+Subject: [PATCH] cfg80211: fix proto in ieee80211_data_to_8023 for frames -+ without LLC header -+ -+The PDU length of incoming LLC frames is set to the total skb payload size -+in __ieee80211_data_to_8023() of net/wireless/util.c which incorrectly -+includes the length of the IEEE 802.11 header. -+ -+The resulting LLC frame header has a too large PDU length, causing the -+llc_fixup_skb() function of net/llc/llc_input.c to reject the incoming -+skb, effectively breaking STP. -+ -+Solve the problem by properly substracting the IEEE 802.11 frame header size -+from the PDU length, allowing the LLC processor to pick up the incoming -+control messages. -+ -+Special thanks to Gerry Rozema for tracking down the regression and proposing -+a suitable patch. -+ -+Fixes: 2d1c304cb2d5 ("cfg80211: add function for 802.3 conversion with separate output buffer") -+Cc: stable@vger.kernel.org -+Reported-by: Gerry Rozema -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/net/wireless/util.c -++++ b/net/wireless/util.c -+@@ -509,7 +509,7 @@ static int __ieee80211_data_to_8023(stru -+ * replace EtherType */ -+ hdrlen += ETH_ALEN + 2; -+ else -+- tmp.h_proto = htons(skb->len); -++ tmp.h_proto = htons(skb->len - hdrlen); -+ -+ pskb_pull(skb, hdrlen); -+ -diff --git a/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch b/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch -deleted file mode 100644 -index 287d6e13bd4a1dd4132cc2020a626e6bc60083fd..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/310-ath9k_hw-ignore-eeprom-magic-mismatch-on-flash-based.patch -+++ /dev/null -@@ -1,38 +0,0 @@ --From: Felix Fietkau --Date: Thu, 21 Jan 2016 16:28:44 +0100 --Subject: [PATCH] ath9k_hw: ignore eeprom magic mismatch on flash based devices -- --Many AR913x based devices (maybe others too) do not have a valid EEPROM --magic in their calibration data partition. -- --Fixes: 6fa658fd5ab2 ("ath9k: Simplify and fix eeprom endianness swapping") --Signed-off-by: Felix Fietkau ----- -- ----- a/drivers/net/wireless/ath/ath9k/eeprom.c --+++ b/drivers/net/wireless/ath/ath9k/eeprom.c --@@ -150,18 +150,18 @@ int ath9k_hw_nvram_swap_data(struct ath_ -- return -EIO; -- } -- --- if (magic == AR5416_EEPROM_MAGIC) { --- *swap_needed = false; --- } else if (swab16(magic) == AR5416_EEPROM_MAGIC) { --+ *swap_needed = false; --+ if (swab16(magic) == AR5416_EEPROM_MAGIC) { -- if (ah->ah_flags & AH_NO_EEP_SWAP) { -- ath_info(common, -- "Ignoring endianness difference in EEPROM magic bytes.\n"); --- --- *swap_needed = false; -- } else { -- *swap_needed = true; -- } --- } else { --+ } else if (magic != AR5416_EEPROM_MAGIC) { --+ if (ath9k_hw_use_flash(ah)) --+ return 0; --+ -- ath_err(common, -- "Invalid EEPROM Magic (0x%04x).\n", magic); -- return -EINVAL; -diff --git a/package/kernel/mac80211/patches/310-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch b/package/kernel/mac80211/patches/310-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..25929c98136c33e4e18be47c1a4c1f8c756220ba ---- /dev/null -+++ b/package/kernel/mac80211/patches/310-mac80211-minstrel-Enable-STBC-and-LDPC-for-VHT-Rates.patch -@@ -0,0 +1,81 @@ -+From: Chaitanya T K -+Date: Mon, 27 Jun 2016 15:23:26 +0530 -+Subject: [PATCH] mac80211: minstrel: Enable STBC and LDPC for VHT Rates -+ -+If peer support reception of STBC and LDPC, enable them for better -+performance. -+ -+Signed-off-by: Chaitanya TK -+--- -+ -+--- a/include/linux/ieee80211.h -++++ b/include/linux/ieee80211.h -+@@ -1550,6 +1550,7 @@ struct ieee80211_vht_operation { -+ #define IEEE80211_VHT_CAP_RXSTBC_3 0x00000300 -+ #define IEEE80211_VHT_CAP_RXSTBC_4 0x00000400 -+ #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700 -++#define IEEE80211_VHT_CAP_RXSTBC_SHIFT 8 -+ #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE 0x00000800 -+ #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE 0x00001000 -+ #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT 13 -+--- a/net/mac80211/rc80211_minstrel_ht.c -++++ b/net/mac80211/rc80211_minstrel_ht.c -+@@ -1166,13 +1166,14 @@ minstrel_ht_update_caps(void *priv, stru -+ struct minstrel_ht_sta_priv *msp = priv_sta; -+ struct minstrel_ht_sta *mi = &msp->ht; -+ struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs; -+- u16 sta_cap = sta->ht_cap.cap; -++ u16 ht_cap = sta->ht_cap.cap; -+ struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap; -+ int use_vht; -+ int n_supported = 0; -+ int ack_dur; -+ int stbc; -+ int i; -++ bool ldpc = false; -+ -+ /* fall back to the old minstrel for legacy stations */ -+ if (!sta->ht_cap.ht_supported) -+@@ -1210,16 +1211,24 @@ minstrel_ht_update_caps(void *priv, stru -+ } -+ mi->sample_tries = 4; -+ -+- /* TODO tx_flags for vht - ATM the RC API is not fine-grained enough */ -+ if (!use_vht) { -+- stbc = (sta_cap & IEEE80211_HT_CAP_RX_STBC) >> -++ stbc = (ht_cap & IEEE80211_HT_CAP_RX_STBC) >> -+ IEEE80211_HT_CAP_RX_STBC_SHIFT; -+- mi->tx_flags |= stbc << IEEE80211_TX_CTL_STBC_SHIFT; -+ -+- if (sta_cap & IEEE80211_HT_CAP_LDPC_CODING) -+- mi->tx_flags |= IEEE80211_TX_CTL_LDPC; -++ if (ht_cap & IEEE80211_HT_CAP_LDPC_CODING) -++ ldpc = true; -++ } else { -++ stbc = (vht_cap->cap & IEEE80211_VHT_CAP_RXSTBC_MASK) >> -++ IEEE80211_VHT_CAP_RXSTBC_SHIFT; -++ -++ if (vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC) -++ ldpc = true; -+ } -+ -++ mi->tx_flags |= stbc << IEEE80211_TX_CTL_STBC_SHIFT; -++ if (ldpc) -++ mi->tx_flags |= IEEE80211_TX_CTL_LDPC; -++ -+ for (i = 0; i < ARRAY_SIZE(mi->groups); i++) { -+ u32 gflags = minstrel_mcs_groups[i].flags; -+ int bw, nss; -+@@ -1232,10 +1241,10 @@ minstrel_ht_update_caps(void *priv, stru -+ -+ if (gflags & IEEE80211_TX_RC_SHORT_GI) { -+ if (gflags & IEEE80211_TX_RC_40_MHZ_WIDTH) { -+- if (!(sta_cap & IEEE80211_HT_CAP_SGI_40)) -++ if (!(ht_cap & IEEE80211_HT_CAP_SGI_40)) -+ continue; -+ } else { -+- if (!(sta_cap & IEEE80211_HT_CAP_SGI_20)) -++ if (!(ht_cap & IEEE80211_HT_CAP_SGI_20)) -+ continue; -+ } -+ } -diff --git a/package/kernel/mac80211/patches/311-ath10k-disable-wake_tx_queue-for-older-devices.patch b/package/kernel/mac80211/patches/311-ath10k-disable-wake_tx_queue-for-older-devices.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..4cf26a631f4404b7b3a0c18ab8186203f405a50a ---- /dev/null -+++ b/package/kernel/mac80211/patches/311-ath10k-disable-wake_tx_queue-for-older-devices.patch -@@ -0,0 +1,73 @@ -+From: Michal Kazior -+Date: Tue, 17 May 2016 14:47:01 +0200 -+Subject: [PATCH] ath10k: disable wake_tx_queue for older devices -+ -+Some setups suffer performance regressions with -+current wake_tx_queue implementation. -+ -+Signed-off-by: Michal Kazior -+--- -+ -+--- a/drivers/net/wireless/ath/ath10k/core.h -++++ b/drivers/net/wireless/ath/ath10k/core.h -+@@ -667,6 +667,7 @@ struct ath10k_fw_components { -+ struct ath10k { -+ struct ath_common ath_common; -+ struct ieee80211_hw *hw; -++ struct ieee80211_ops *ops; -+ struct device *dev; -+ u8 mac_addr[ETH_ALEN]; -+ -+--- a/drivers/net/wireless/ath/ath10k/mac.c -++++ b/drivers/net/wireless/ath/ath10k/mac.c -+@@ -7497,21 +7497,32 @@ static const struct ieee80211_channel at -+ struct ath10k *ath10k_mac_create(size_t priv_size) -+ { -+ struct ieee80211_hw *hw; -++ struct ieee80211_ops *ops; -+ struct ath10k *ar; -+ -+- hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops); -+- if (!hw) -++ ops = kmemdup(&ath10k_ops, sizeof(ath10k_ops), GFP_KERNEL); -++ if (!ops) -++ return NULL; -++ -++ hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, ops); -++ if (!hw) { -++ kfree(ops); -+ return NULL; -++ } -+ -+ ar = hw->priv; -+ ar->hw = hw; -++ ar->ops = ops; -+ -+ return ar; -+ } -+ -+ void ath10k_mac_destroy(struct ath10k *ar) -+ { -++ struct ieee80211_ops *ops = ar->ops; -++ -+ ieee80211_free_hw(ar->hw); -++ kfree(ops); -+ } -+ -+ static const struct ieee80211_iface_limit ath10k_if_limits[] = { -+@@ -7945,6 +7956,15 @@ int ath10k_mac_register(struct ath10k *a -+ 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 = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy, -+ ath10k_reg_notifier); -+ if (ret) { -diff --git a/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch b/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch -deleted file mode 100644 -index 070efa98e834e0dfe2334fc0eb9bc433e0f037e8..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/311-ath9k-do-not-limit-the-number-of-DFS-interfaces-to-1.patch -+++ /dev/null -@@ -1,55 +0,0 @@ --From: Felix Fietkau --Date: Fri, 22 Jan 2016 01:05:56 +0100 --Subject: [PATCH] ath9k: do not limit the number of DFS interfaces to 1 -- --Signed-off-by: Felix Fietkau ----- -- ----- a/drivers/net/wireless/ath/ath9k/init.c --+++ b/drivers/net/wireless/ath/ath9k/init.c --@@ -751,14 +751,6 @@ static const struct ieee80211_iface_comb -- -- #endif /* CPTCFG_ATH9K_CHANNEL_CONTEXT */ -- ---static const struct ieee80211_iface_limit if_dfs_limits[] = { --- { .max = 1, .types = BIT(NL80211_IFTYPE_AP) | ---#ifdef CPTCFG_MAC80211_MESH --- BIT(NL80211_IFTYPE_MESH_POINT) | ---#endif --- BIT(NL80211_IFTYPE_ADHOC) }, ---}; --- -- static const struct ieee80211_iface_combination if_comb[] = { -- { -- .limits = if_limits, --@@ -766,6 +758,11 @@ static const struct ieee80211_iface_comb -- .max_interfaces = 2048, -- .num_different_channels = 1, -- .beacon_int_infra_match = true, --+#ifdef CPTCFG_ATH9K_DFS_CERTIFIED --+ .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | --+ BIT(NL80211_CHAN_WIDTH_20) | --+ BIT(NL80211_CHAN_WIDTH_40), --+#endif -- }, -- { -- .limits = wds_limits, --@@ -774,18 +771,6 @@ static const struct ieee80211_iface_comb -- .num_different_channels = 1, -- .beacon_int_infra_match = true, -- }, ---#ifdef CPTCFG_ATH9K_DFS_CERTIFIED --- { --- .limits = if_dfs_limits, --- .n_limits = ARRAY_SIZE(if_dfs_limits), --- .max_interfaces = 1, --- .num_different_channels = 1, --- .beacon_int_infra_match = true, --- .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | --- BIT(NL80211_CHAN_WIDTH_20) | --- BIT(NL80211_CHAN_WIDTH_40), --- } ---#endif -- }; -- -- #ifdef CPTCFG_ATH9K_CHANNEL_CONTEXT -diff --git a/package/kernel/mac80211/patches/312-ath9k-Correct-TSF-adjustment-to-align-the-beacon-tim.patch b/package/kernel/mac80211/patches/312-ath9k-Correct-TSF-adjustment-to-align-the-beacon-tim.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..df43105cb8233828bef396d500b391731c5c580a ---- /dev/null -+++ b/package/kernel/mac80211/patches/312-ath9k-Correct-TSF-adjustment-to-align-the-beacon-tim.patch -@@ -0,0 +1,45 @@ -+From: Benjamin Berg -+Date: Mon, 4 Jul 2016 14:37:20 +0200 -+Subject: [PATCH] ath9k: Correct TSF adjustment to align the beacon time -+ correctly -+ -+Beacons were not send out at (timestamp % beacon_time == 0) for interfaces -+other than the primary one. To send out beacons with the correct timestamp -+according to 10.1.3.2 of the 802.11 standard the tsf_adjustment has to be -+set to the negative time difference instead of positive. This way the -+later beacons get corrected to have a lower (and similar) timestamp with -+regard to the beacon from slot 0. -+ -+I am not aware about any issues that have been caused by this. -+ -+Signed-off-by: Benjamin Berg -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/beacon.c -++++ b/drivers/net/wireless/ath/ath9k/beacon.c -+@@ -279,17 +279,21 @@ static void ath9k_set_tsfadjust(struct a -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ struct ath_vif *avp = (void *)vif->drv_priv; -+ struct ath_beacon_config *cur_conf = &avp->chanctx->beacon; -+- u32 tsfadjust; -++ s64 tsfadjust; -+ -+ if (avp->av_bslot == 0) -+ return; -+ -++ /* tsf_adjust is added to the TSF value. We send out the beacon late, -++ * so need to adjust the TSF starting point to be later in time (i.e. -++ * the theoretical first beacon has a TSF of 0 after correction). -++ */ -+ tsfadjust = cur_conf->beacon_interval * avp->av_bslot; -+- tsfadjust = TU_TO_USEC(tsfadjust) / ATH_BCBUF; -++ tsfadjust = -TU_TO_USEC(tsfadjust) / ATH_BCBUF; -+ avp->tsf_adjust = cpu_to_le64(tsfadjust); -+ -+- ath_dbg(common, CONFIG, "tsfadjust is: %llu for bslot: %d\n", -+- (unsigned long long)tsfadjust, avp->av_bslot); -++ ath_dbg(common, CONFIG, "tsfadjust is: %lld for bslot: %d\n", -++ (signed long long)tsfadjust, avp->av_bslot); -+ } -+ -+ bool ath9k_csa_is_finished(struct ath_softc *sc, struct ieee80211_vif *vif) -diff --git a/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch b/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch -deleted file mode 100644 -index 61cafc7625a8f8df5b67558a875794f5d20dbb99..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/312-mac80211-fix-txq-queue-related-crashes.patch -+++ /dev/null -@@ -1,27 +0,0 @@ --From: Michal Kazior --Date: Thu, 21 Jan 2016 14:23:07 +0100 --Subject: [PATCH] mac80211: fix txq queue related crashes -- --The driver can access the queue simultanously --while mac80211 tears down the interface. Without --spinlock protection this could lead to corrupting --sk_buff_head and subsequently to an invalid --pointer dereference. -- --Fixes: ba8c3d6f16a1 ("mac80211: add an intermediate software queue implementation") --Signed-off-by: Michal Kazior ----- -- ----- a/net/mac80211/iface.c --+++ b/net/mac80211/iface.c --@@ -977,7 +977,10 @@ static void ieee80211_do_stop(struct iee -- if (sdata->vif.txq) { -- struct txq_info *txqi = to_txq_info(sdata->vif.txq); -- --+ spin_lock_bh(&txqi->queue.lock); -- ieee80211_purge_tx_queue(&local->hw, &txqi->queue); --+ spin_unlock_bh(&txqi->queue.lock); --+ -- atomic_set(&sdata->txqs_len[txqi->txq.ac], 0); -- } -- -diff --git a/package/kernel/mac80211/patches/313-ath9k-Handle-channel-context-in-get_-set_-reset_tsf.patch b/package/kernel/mac80211/patches/313-ath9k-Handle-channel-context-in-get_-set_-reset_tsf.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..ef0afbea9c60f69b6a55be1ce1f2dcd4c0d43928 ---- /dev/null -+++ b/package/kernel/mac80211/patches/313-ath9k-Handle-channel-context-in-get_-set_-reset_tsf.patch -@@ -0,0 +1,70 @@ -+From: Benjamin Berg -+Date: Mon, 4 Jul 2016 14:37:21 +0200 -+Subject: [PATCH] ath9k: Handle channel context in get_/set_/reset_tsf -+ -+The ath9k TSF handling routines need to be aware of the channel context that -+is being modified. With this change the TSF related values that are stored -+in each channel context will be correctly tracked and the harware will only -+be updated if the modified context is currently the active one. -+ -+Without this change the TSF modifications done using these routines would -+for example be lost during a hardware reset as done by ath_complete_reset. -+ -+Signed-off-by: Benjamin Berg -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/main.c -++++ b/drivers/net/wireless/ath/ath9k/main.c -+@@ -1823,11 +1823,18 @@ static void ath9k_bss_info_changed(struc -+ static u64 ath9k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) -+ { -+ struct ath_softc *sc = hw->priv; -++ struct ath_vif *avp = (void *)vif->drv_priv; -+ u64 tsf; -+ -+ mutex_lock(&sc->mutex); -+ ath9k_ps_wakeup(sc); -+- tsf = ath9k_hw_gettsf64(sc->sc_ah); -++ /* Get current TSF either from HW or kernel time. */ -++ if (sc->cur_chan == avp->chanctx) { -++ tsf = ath9k_hw_gettsf64(sc->sc_ah); -++ } else { -++ tsf = sc->cur_chan->tsf_val + -++ ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL); -++ } -+ ath9k_ps_restore(sc); -+ mutex_unlock(&sc->mutex); -+ -+@@ -1839,10 +1846,14 @@ static void ath9k_set_tsf(struct ieee802 -+ u64 tsf) -+ { -+ struct ath_softc *sc = hw->priv; -++ struct ath_vif *avp = (void *)vif->drv_priv; -+ -+ mutex_lock(&sc->mutex); -+ ath9k_ps_wakeup(sc); -+- ath9k_hw_settsf64(sc->sc_ah, tsf); -++ getrawmonotonic(&avp->chanctx->tsf_ts); -++ if (sc->cur_chan == avp->chanctx) -++ ath9k_hw_settsf64(sc->sc_ah, tsf); -++ avp->chanctx->tsf_val = tsf; -+ ath9k_ps_restore(sc); -+ mutex_unlock(&sc->mutex); -+ } -+@@ -1850,11 +1861,15 @@ static void ath9k_set_tsf(struct ieee802 -+ static void ath9k_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) -+ { -+ struct ath_softc *sc = hw->priv; -++ struct ath_vif *avp = (void *)vif->drv_priv; -+ -+ mutex_lock(&sc->mutex); -+ -+ ath9k_ps_wakeup(sc); -+- ath9k_hw_reset_tsf(sc->sc_ah); -++ getrawmonotonic(&avp->chanctx->tsf_ts); -++ if (sc->cur_chan == avp->chanctx) -++ ath9k_hw_reset_tsf(sc->sc_ah); -++ avp->chanctx->tsf_val = 0; -+ ath9k_ps_restore(sc); -+ -+ mutex_unlock(&sc->mutex); -diff --git a/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch b/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch -deleted file mode 100644 -index 844d43bfc7875b937d8c67aba60f1204bcb7020a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/313-mac80211-fix-unnecessary-frame-drops-in-mesh-fwding.patch -+++ /dev/null -@@ -1,57 +0,0 @@ --From: Michal Kazior --Date: Mon, 25 Jan 2016 14:43:24 +0100 --Subject: [PATCH] mac80211: fix unnecessary frame drops in mesh fwding -- --The ieee80211_queue_stopped() expects hw queue --number but it was given raw WMM AC number instead. -- --This could cause frame drops and problems with --traffic in some cases - most notably if driver --doesn't map AC numbers to queue numbers 1:1 and --uses ieee80211_stop_queues() and --ieee80211_wake_queue() only without ever calling --ieee80211_wake_queues(). -- --On ath10k it was possible to hit this problem in --the following case: -- -- 1. wlan0 uses queue 0 -- (ath10k maps queues per vif) -- 2. offchannel uses queue 15 -- 3. queues 1-14 are unused -- 4. ieee80211_stop_queues() -- 5. ieee80211_wake_queue(q=0) -- 6. ieee80211_wake_queue(q=15) -- (other queues are not woken up because both -- driver and mac80211 know other queues are -- unused) -- 7. ieee80211_rx_h_mesh_fwding() -- 8. ieee80211_select_queue_80211() returns 2 -- 9. ieee80211_queue_stopped(q=2) returns true -- 10. frame is dropped (oops!) -- --Fixes: d3c1597b8d1b ("mac80211: fix forwarded mesh frame queue mapping") --Signed-off-by: Michal Kazior ----- -- ----- a/net/mac80211/rx.c --+++ b/net/mac80211/rx.c --@@ -2235,7 +2235,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80 -- struct ieee80211_local *local = rx->local; -- struct ieee80211_sub_if_data *sdata = rx->sdata; -- struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; --- u16 q, hdrlen; --+ u16 ac, q, hdrlen; -- -- hdr = (struct ieee80211_hdr *) skb->data; -- hdrlen = ieee80211_hdrlen(hdr->frame_control); --@@ -2304,7 +2304,8 @@ ieee80211_rx_h_mesh_fwding(struct ieee80 -- ether_addr_equal(sdata->vif.addr, hdr->addr3)) -- return RX_CONTINUE; -- --- q = ieee80211_select_queue_80211(sdata, skb, hdr); --+ ac = ieee80211_select_queue_80211(sdata, skb, hdr); --+ q = sdata->vif.hw_queue[ac]; -- if (ieee80211_queue_stopped(&local->hw, q)) { -- IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion); -- return RX_DROP_MONITOR; -diff --git a/package/kernel/mac80211/patches/314-ath9k-Use-tsf-offset-helper-in-ath9k_hw_reset.patch b/package/kernel/mac80211/patches/314-ath9k-Use-tsf-offset-helper-in-ath9k_hw_reset.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..e725a8bd6099ad12d0151b90241489f063a5196d ---- /dev/null -+++ b/package/kernel/mac80211/patches/314-ath9k-Use-tsf-offset-helper-in-ath9k_hw_reset.patch -@@ -0,0 +1,65 @@ -+From: Benjamin Berg -+Date: Mon, 4 Jul 2016 14:37:22 +0200 -+Subject: [PATCH] ath9k: Use tsf offset helper in ath9k_hw_reset -+ -+These changes make ath9k_hw_reset more consistent with other places that -+handle the TSF value by using the same helper routine. -+ -+A slight improvement is to not assume that a fixed time of 1.5ms has -+passed for the initval writes when compared to the first write attempt. -+Instead the TSF value is re-calculated which will yield a higher accuracy -+of the restored TSF timer. -+ -+Signed-off-by: Benjamin Berg -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/hw.c -++++ b/drivers/net/wireless/ath/ath9k/hw.c -+@@ -1832,8 +1832,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st -+ u32 saveLedState; -+ u32 saveDefAntenna; -+ u32 macStaId1; -++ struct timespec tsf_ts; -++ u32 tsf_offset; -+ u64 tsf = 0; -+- s64 usec = 0; -+ int r; -+ bool start_mci_reset = false; -+ bool save_fullsleep = ah->chip_fullsleep; -+@@ -1877,8 +1878,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st -+ macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B; -+ -+ /* Save TSF before chip reset, a cold reset clears it */ -++ getrawmonotonic(&tsf_ts); -+ tsf = ath9k_hw_gettsf64(ah); -+- usec = ktime_to_us(ktime_get_raw()); -+ -+ saveLedState = REG_READ(ah, AR_CFG_LED) & -+ (AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL | -+@@ -1911,8 +1912,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st -+ } -+ -+ /* Restore TSF */ -+- usec = ktime_to_us(ktime_get_raw()) - usec; -+- ath9k_hw_settsf64(ah, tsf + usec); -++ tsf_offset = ath9k_hw_get_tsf_offset(&tsf_ts, NULL); -++ ath9k_hw_settsf64(ah, tsf + tsf_offset); -+ -+ if (AR_SREV_9280_20_OR_LATER(ah)) -+ REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE); -+@@ -1932,12 +1933,11 @@ int ath9k_hw_reset(struct ath_hw *ah, st -+ /* -+ * Some AR91xx SoC devices frequently fail to accept TSF writes -+ * right after the chip reset. When that happens, write a new -+- * value after the initvals have been applied, with an offset -+- * based on measured time difference -++ * value after the initvals have been applied. -+ */ -+ if (AR_SREV_9100(ah) && (ath9k_hw_gettsf64(ah) < tsf)) { -+- tsf += 1500; -+- ath9k_hw_settsf64(ah, tsf); -++ tsf_offset = ath9k_hw_get_tsf_offset(&tsf_ts, NULL); -++ ath9k_hw_settsf64(ah, tsf + tsf_offset); -+ } -+ -+ ath9k_hw_init_mfp(ah); -diff --git a/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch b/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch -deleted file mode 100644 -index 5b3efbdc5aff65de96b959fbc250f7ddde0c5459..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/314-mac80211-Requeue-work-after-scan-complete-for-all-VI.patch -+++ /dev/null -@@ -1,103 +0,0 @@ --From: Sachin Kulkarni --Date: Tue, 12 Jan 2016 14:30:19 +0530 --Subject: [PATCH] mac80211: Requeue work after scan complete for all VIF -- types. -- --During a sw scan ieee80211_iface_work ignores work items for all vifs. --However after the scan complete work is requeued only for STA, ADHOC --and MESH iftypes. -- --This occasionally results in event processing getting delayed/not --processed for iftype AP when it coexists with a STA. This can result --in data halt and eventually disconnection on the AP interface. -- --Signed-off-by: Sachin Kulkarni --Cc: linux-wireless@vger.kernel.org --Cc: johannes@sipsolutions.net ----- -- ----- a/net/mac80211/ibss.c --+++ b/net/mac80211/ibss.c --@@ -1731,7 +1731,6 @@ void ieee80211_ibss_notify_scan_complete -- if (sdata->vif.type != NL80211_IFTYPE_ADHOC) -- continue; -- sdata->u.ibss.last_scan_completed = jiffies; --- ieee80211_queue_work(&local->hw, &sdata->work); -- } -- mutex_unlock(&local->iflist_mtx); -- } ----- a/net/mac80211/mesh.c --+++ b/net/mac80211/mesh.c --@@ -1369,17 +1369,6 @@ out: -- sdata_unlock(sdata); -- } -- ---void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) ---{ --- struct ieee80211_sub_if_data *sdata; --- --- rcu_read_lock(); --- list_for_each_entry_rcu(sdata, &local->interfaces, list) --- if (ieee80211_vif_is_mesh(&sdata->vif) && --- ieee80211_sdata_running(sdata)) --- ieee80211_queue_work(&local->hw, &sdata->work); --- rcu_read_unlock(); ---} -- -- void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata) -- { ----- a/net/mac80211/mesh.h --+++ b/net/mac80211/mesh.h --@@ -362,14 +362,10 @@ static inline bool mesh_path_sel_is_hwmp -- return sdata->u.mesh.mesh_pp_id == IEEE80211_PATH_PROTOCOL_HWMP; -- } -- ---void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local); --- -- void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata); -- void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata); -- void ieee80211s_stop(void); -- #else ---static inline void ---ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local) {} -- static inline bool mesh_path_sel_is_hwmp(struct ieee80211_sub_if_data *sdata) -- { return false; } -- static inline void mesh_path_flush_by_iface(struct ieee80211_sub_if_data *sdata) ----- a/net/mac80211/mlme.c --+++ b/net/mac80211/mlme.c --@@ -3978,8 +3978,6 @@ static void ieee80211_restart_sta_timer( -- if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR)) -- ieee80211_queue_work(&sdata->local->hw, -- &sdata->u.mgd.monitor_work); --- /* and do all the other regular work too */ --- ieee80211_queue_work(&sdata->local->hw, &sdata->work); -- } -- } -- ----- a/net/mac80211/scan.c --+++ b/net/mac80211/scan.c --@@ -314,6 +314,7 @@ static void __ieee80211_scan_completed(s -- bool was_scanning = local->scanning; -- struct cfg80211_scan_request *scan_req; -- struct ieee80211_sub_if_data *scan_sdata; --+ struct ieee80211_sub_if_data *sdata; -- -- lockdep_assert_held(&local->mtx); -- --@@ -373,7 +374,15 @@ static void __ieee80211_scan_completed(s -- -- ieee80211_mlme_notify_scan_completed(local); -- ieee80211_ibss_notify_scan_completed(local); --- ieee80211_mesh_notify_scan_completed(local); --+ --+ /* Requeue all the work that might have been ignored while --+ * the scan was in progress --+ */ --+ list_for_each_entry_rcu(sdata, &local->interfaces, list) { --+ if (ieee80211_sdata_running(sdata)) --+ ieee80211_queue_work(&sdata->local->hw, &sdata->work); --+ } --+ -- if (was_scanning) -- ieee80211_start_next_roc(local); -- } -diff --git a/package/kernel/mac80211/patches/315-ath9k-Expose-tsf_adjustment-in-mac80211-tsf-getters-.patch b/package/kernel/mac80211/patches/315-ath9k-Expose-tsf_adjustment-in-mac80211-tsf-getters-.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..c95ab7e644c4c932b619ae9b09a16a91347fc8da ---- /dev/null -+++ b/package/kernel/mac80211/patches/315-ath9k-Expose-tsf_adjustment-in-mac80211-tsf-getters-.patch -@@ -0,0 +1,32 @@ -+From: Benjamin Berg -+Date: Mon, 4 Jul 2016 14:37:23 +0200 -+Subject: [PATCH] ath9k: Expose tsf_adjustment in mac80211 tsf getters and -+ setters. -+ -+The ath9k driver modifies the TSF for VIFs for the purpose of sending -+beacons in a staggered fashion. This patch exposes this VIF specific -+adjustment of the TSF value to mac80211. Without the change the TSF -+routines handle the hardware TSF value instead of the actual TSF value as -+seen on the air. -+ -+Signed-off-by: Benjamin Berg -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/main.c -++++ b/drivers/net/wireless/ath/ath9k/main.c -+@@ -1835,6 +1835,7 @@ static u64 ath9k_get_tsf(struct ieee8021 -+ tsf = sc->cur_chan->tsf_val + -+ ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL); -+ } -++ tsf += le64_to_cpu(avp->tsf_adjust); -+ ath9k_ps_restore(sc); -+ mutex_unlock(&sc->mutex); -+ -+@@ -1850,6 +1851,7 @@ static void ath9k_set_tsf(struct ieee802 -+ -+ mutex_lock(&sc->mutex); -+ ath9k_ps_wakeup(sc); -++ tsf -= le64_to_cpu(avp->tsf_adjust); -+ getrawmonotonic(&avp->chanctx->tsf_ts); -+ if (sc->cur_chan == avp->chanctx) -+ ath9k_hw_settsf64(sc->sc_ah, tsf); -diff --git a/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch b/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch -deleted file mode 100644 -index 52fecb96b002de8ed650e2155f846cbcc9ba0900..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/315-mac80211-fix-ibss-scan-parameters.patch -+++ /dev/null -@@ -1,57 +0,0 @@ --From: Sara Sharon --Date: Mon, 25 Jan 2016 15:46:35 +0200 --Subject: [PATCH] mac80211: fix ibss scan parameters -- --When joining IBSS a full scan should be initiated in order to search --for existing cell, unless the fixed_channel parameter was set. --A default channel to create the IBSS on if no cell was found is --provided as well. --However - a scan is initiated only on the default channel provided --regardless of whether ifibss->fixed_channel is set or not, with the --obvious result of the cell not joining existing IBSS cell that is --on another channel. -- --Fixes: 76bed0f43b27 ("mac80211: IBSS fix scan request") --Signed-off-by: Sara Sharon --Signed-off-by: Emmanuel Grumbach ----- -- ----- a/net/mac80211/ibss.c --+++ b/net/mac80211/ibss.c --@@ -7,6 +7,7 @@ -- * Copyright 2007, Michael Wu -- * Copyright 2009, Johannes Berg -- * Copyright 2013-2014 Intel Mobile Communications GmbH --+ * Copyright(c) 2016 Intel Deutschland GmbH -- * -- * This program is free software; you can redistribute it and/or modify -- * it under the terms of the GNU General Public License version 2 as --@@ -1483,14 +1484,21 @@ static void ieee80211_sta_find_ibss(stru -- -- sdata_info(sdata, "Trigger new scan to find an IBSS to join\n"); -- --- num = ieee80211_ibss_setup_scan_channels(local->hw.wiphy, --- &ifibss->chandef, --- channels, --- ARRAY_SIZE(channels)); -- scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef); --- ieee80211_request_ibss_scan(sdata, ifibss->ssid, --- ifibss->ssid_len, channels, num, --- scan_width); --+ --+ if (ifibss->fixed_channel) { --+ num = ieee80211_ibss_setup_scan_channels(local->hw.wiphy, --+ &ifibss->chandef, --+ channels, --+ ARRAY_SIZE(channels)); --+ ieee80211_request_ibss_scan(sdata, ifibss->ssid, --+ ifibss->ssid_len, channels, --+ num, scan_width); --+ } else { --+ ieee80211_request_ibss_scan(sdata, ifibss->ssid, --+ ifibss->ssid_len, NULL, --+ 0, scan_width); --+ } -- } else { -- int interval = IEEE80211_SCAN_INTERVAL; -- -diff --git a/package/kernel/mac80211/patches/316-ath9k-Remove-some-defined-constants-to-decrease-verb.patch b/package/kernel/mac80211/patches/316-ath9k-Remove-some-defined-constants-to-decrease-verb.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..36aaa1030ea87569202cd109bb59479cbb0b64e5 ---- /dev/null -+++ b/package/kernel/mac80211/patches/316-ath9k-Remove-some-defined-constants-to-decrease-verb.patch -@@ -0,0 +1,137 @@ -+From: Benjamin Berg -+Date: Mon, 4 Jul 2016 14:37:24 +0200 -+Subject: [PATCH] ath9k: Remove some #defined constants to decrease -+ verbosity -+ -+The removed ATH9K_SLOT_TIME_X constants simply map the value in microseconds -+to the same integer. These constants were not used consistently, so fix the -+inconsistency issue by replacing all occurances with the integer equivalent. -+ -+Signed-off-by: Benjamin Berg -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/beacon.c -++++ b/drivers/net/wireless/ath/ath9k/beacon.c -+@@ -50,7 +50,7 @@ static void ath9k_beaconq_config(struct -+ txq = sc->tx.txq_map[IEEE80211_AC_BE]; -+ ath9k_hw_get_txq_props(ah, txq->axq_qnum, &qi_be); -+ qi.tqi_aifs = qi_be.tqi_aifs; -+- if (ah->slottime == ATH9K_SLOT_TIME_20) -++ if (ah->slottime == 20) -+ qi.tqi_cwmin = 2*qi_be.tqi_cwmin; -+ else -+ qi.tqi_cwmin = 4*qi_be.tqi_cwmin; -+--- a/drivers/net/wireless/ath/ath9k/dynack.c -++++ b/drivers/net/wireless/ath/ath9k/dynack.c -+@@ -280,7 +280,7 @@ EXPORT_SYMBOL(ath_dynack_sample_ack_ts); -+ void ath_dynack_node_init(struct ath_hw *ah, struct ath_node *an) -+ { -+ /* ackto = slottime + sifs + air delay */ -+- u32 ackto = ATH9K_SLOT_TIME_9 + 16 + 64; -++ u32 ackto = 9 + 16 + 64; -+ struct ath_dynack *da = &ah->dynack; -+ -+ an->ackto = ackto; -+@@ -315,7 +315,7 @@ EXPORT_SYMBOL(ath_dynack_node_deinit); -+ void ath_dynack_reset(struct ath_hw *ah) -+ { -+ /* ackto = slottime + sifs + air delay */ -+- u32 ackto = ATH9K_SLOT_TIME_9 + 16 + 64; -++ u32 ackto = 9 + 16 + 64; -+ struct ath_dynack *da = &ah->dynack; -+ -+ da->lto = jiffies; -+--- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c -++++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c -+@@ -45,7 +45,7 @@ void ath9k_htc_beaconq_config(struct ath -+ * Long slot time : 2x cwmin -+ * Short slot time : 4x cwmin -+ */ -+- if (ah->slottime == ATH9K_SLOT_TIME_20) -++ if (ah->slottime == 20) -+ qi.tqi_cwmin = 2*qi_be.tqi_cwmin; -+ else -+ qi.tqi_cwmin = 4*qi_be.tqi_cwmin; -+--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c -++++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c -+@@ -678,7 +678,7 @@ static int ath9k_init_priv(struct ath9k_ -+ -+ for (i = 0; i < ATH9K_HTC_MAX_BCN_VIF; i++) -+ priv->beacon.bslot[i] = NULL; -+- priv->beacon.slottime = ATH9K_SLOT_TIME_9; -++ priv->beacon.slottime = 9; -+ -+ ath9k_cmn_init_channels_rates(common); -+ ath9k_cmn_init_crypto(ah); -+--- a/drivers/net/wireless/ath/ath9k/hw.c -++++ b/drivers/net/wireless/ath/ath9k/hw.c -+@@ -454,7 +454,7 @@ static void ath9k_hw_init_defaults(struc -+ if (AR_SREV_9100(ah)) -+ ah->sta_id1_defaults |= AR_STA_ID1_AR9100_BA_FIX; -+ -+- ah->slottime = ATH9K_SLOT_TIME_9; -++ ah->slottime = 9; -+ ah->globaltxtimeout = (u32) -1; -+ ah->power_mode = ATH9K_PM_UNDEFINED; -+ ah->htc_reset_init = true; -+--- a/drivers/net/wireless/ath/ath9k/init.c -++++ b/drivers/net/wireless/ath/ath9k/init.c -+@@ -372,7 +372,7 @@ static void ath9k_init_misc(struct ath_s -+ -+ common->last_rssi = ATH_RSSI_DUMMY_MARKER; -+ memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN); -+- sc->beacon.slottime = ATH9K_SLOT_TIME_9; -++ sc->beacon.slottime = 9; -+ -+ for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) -+ sc->beacon.bslot[i] = NULL; -+--- a/drivers/net/wireless/ath/ath9k/mac.h -++++ b/drivers/net/wireless/ath/ath9k/mac.h -+@@ -65,10 +65,6 @@ -+ #define INIT_SSH_RETRY 32 -+ #define INIT_SLG_RETRY 32 -+ -+-#define ATH9K_SLOT_TIME_6 6 -+-#define ATH9K_SLOT_TIME_9 9 -+-#define ATH9K_SLOT_TIME_20 20 -+- -+ #define ATH9K_TXERR_XRETRY 0x01 -+ #define ATH9K_TXERR_FILT 0x02 -+ #define ATH9K_TXERR_FIFO 0x04 -+--- a/drivers/net/wireless/ath/ath9k/main.c -++++ b/drivers/net/wireless/ath/ath9k/main.c -+@@ -926,7 +926,7 @@ static void ath9k_vif_iter(struct ath9k_ -+ } -+ -+ if (!vif->bss_conf.use_short_slot) -+- iter_data->slottime = ATH9K_SLOT_TIME_20; -++ iter_data->slottime = 20; -+ -+ switch (vif->type) { -+ case NL80211_IFTYPE_AP: -+@@ -999,7 +999,7 @@ void ath9k_calculate_iter_data(struct at -+ */ -+ memset(iter_data, 0, sizeof(*iter_data)); -+ eth_broadcast_addr(iter_data->mask); -+- iter_data->slottime = ATH9K_SLOT_TIME_9; -++ iter_data->slottime = 9; -+ -+ list_for_each_entry(avp, &ctx->vifs, list) -+ ath9k_vif_iter(iter_data, avp->vif->addr, avp->vif); -+@@ -1061,7 +1061,7 @@ static void ath9k_set_offchannel_state(s -+ ah->opmode = vif->type; -+ ah->imask &= ~ATH9K_INT_SWBA; -+ ah->imask &= ~ATH9K_INT_TSFOOR; -+- ah->slottime = ATH9K_SLOT_TIME_9; -++ ah->slottime = 9; -+ -+ ath_hw_setbssidmask(common); -+ ath9k_hw_setopmode(ah); -+@@ -1788,6 +1788,7 @@ static void ath9k_bss_info_changed(struc -+ slottime = 9; -+ else -+ slottime = 20; -++ -+ if (vif->type == NL80211_IFTYPE_AP) { -+ /* -+ * Defer update, so that connected stations can adjust -diff --git a/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch b/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch -deleted file mode 100644 -index e78df366003ee0d1cb5402e7c0760d96c45a40d7..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/316-net-mac80211-agg-rx.c-fix-use-of-uninitialised-value.patch -+++ /dev/null -@@ -1,50 +0,0 @@ --From: Chris Bainbridge --Date: Wed, 27 Jan 2016 15:46:18 +0000 --Subject: [PATCH] net/mac80211/agg-rx.c: fix use of uninitialised values -- --Use kzalloc instead of kmalloc for struct tid_ampdu_rx. Fixes: -- --[ 7.976605] UBSAN: Undefined behaviour in net/mac80211/rx.c:932:29 --[ 7.976608] load of value 2 is not a valid value for type '_Bool' --[ 7.976611] CPU: 3 PID: 1134 Comm: kworker/u16:7 Not tainted 4.5.0-rc1+ #265 --[ 7.976613] Hardware name: Apple Inc. MacBookPro10,2/Mac-AFD8A9D944EA4843, BIOS MBP102.88Z.0106.B0A.1509130955 09/13/2015 --[ 7.976616] Workqueue: phy0 rt2x00usb_work_rxdone --[ 7.976619] 0000000000000004 ffff880254a7ba50 ffffffff8181d866 0000000000000007 --[ 7.976622] ffff880254a7ba78 ffff880254a7ba68 ffffffff8188422d ffffffff8379b500 --[ 7.976626] ffff880254a7bab8 ffffffff81884747 0000000000000202 0000000348620032 --[ 7.976629] Call Trace: --[ 7.976633] [] dump_stack+0x45/0x5f --[ 7.976637] [] ubsan_epilogue+0xd/0x40 --[ 7.976642] [] __ubsan_handle_load_invalid_value+0x67/0x70 --[ 7.976646] [] ieee80211_sta_reorder_release.isra.16+0x5ed/0x730 --[ 7.976650] [] ieee80211_prepare_and_rx_handle+0xd04/0x1c00 --[ 7.976654] [] ? usb_hcd_map_urb_for_dma+0x65e/0x960 --[ 7.976659] [] __ieee80211_rx_handle_packet+0x1f3/0x750 --[ 7.976663] [] ieee80211_rx_napi+0x447/0x990 --[ 7.976667] [] rt2x00lib_rxdone+0x305/0xbd0 --[ 7.976670] [] ? dequeue_task_fair+0x64f/0x1de0 --[ 7.976674] [] ? sched_clock_cpu+0xe6/0x150 --[ 7.976678] [] rt2x00usb_work_rxdone+0x7c/0x140 --[ 7.976682] [] process_one_work+0x226/0x860 --[ 7.976686] [] worker_thread+0x5c/0x680 --[ 7.976690] [] ? process_one_work+0x860/0x860 --[ 7.976693] [] kthread+0xf6/0x150 --[ 7.976697] [] ? kthread_worker_fn+0x310/0x310 --[ 7.976700] [] ret_from_fork+0x3f/0x70 --[ 7.976703] [] ? kthread_worker_fn+0x310/0x310 -- --Link: https://lkml.org/lkml/2016/1/26/230 --Signed-off-by: Chris Bainbridge ----- -- ----- a/net/mac80211/agg-rx.c --+++ b/net/mac80211/agg-rx.c --@@ -327,7 +327,7 @@ void __ieee80211_start_rx_ba_session(str -- } -- -- /* prepare A-MPDU MLME for Rx aggregation */ --- tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL); --+ tid_agg_rx = kzalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL); -- if (!tid_agg_rx) -- goto end; -- -diff --git a/package/kernel/mac80211/patches/317-ath9k-Fix-beacon-configuration-for-addition-removal-.patch b/package/kernel/mac80211/patches/317-ath9k-Fix-beacon-configuration-for-addition-removal-.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..360dfbfafb9b2c98e4b679aa45db5c7a2e747a3b ---- /dev/null -+++ b/package/kernel/mac80211/patches/317-ath9k-Fix-beacon-configuration-for-addition-removal-.patch -@@ -0,0 +1,544 @@ -+From: Benjamin Berg -+Date: Mon, 4 Jul 2016 14:37:25 +0200 -+Subject: [PATCH] ath9k: Fix beacon configuration for addition/removal of -+ interfaces -+ -+This patch fixes some issues with interface reconfiguration. It could -+for example happen that an AP interface in beacon slot 0 was removed -+leaving an IBSS station in one of the other slots. When this happens -+the driver never sends out the beacon as it only tries to send a beacon -+from slot 0. -+ -+Appart from that the tracking of required changes to the beacon config is -+relatively complicated and prone to errors. -+ -+The approach taken here is to solve reconfiguration issues is to -+reconfigure the beacons when any interface changes. This means that -+the complexity of deciding whether an interface change may modify the -+beacon configuration is gone. It also means that the beacon config will -+be reliably updated when an interface is removed. -+ -+The issue that a single non-AP interface might not be in beacon -+slot 0 and wouldn't be send out is solved by moving it into the -+first slot. The TSF value in hardware is adjusted accordingly so -+that the timestamp of the beacons stay consistent. -+ -+Signed-off-by: Benjamin Berg -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ath9k.h -++++ b/drivers/net/wireless/ath/ath9k/ath9k.h -+@@ -637,6 +637,8 @@ struct ath9k_vif_iter_data { -+ int nwds; /* number of WDS vifs */ -+ int nadhocs; /* number of adhoc vifs */ -+ int nocbs; /* number of OCB vifs */ -++ int nbcnvifs; /* number of beaconing vifs */ -++ struct ieee80211_vif *primary_beacon_vif; -+ struct ieee80211_vif *primary_sta; -+ }; -+ -+@@ -685,10 +687,11 @@ struct ath_beacon { -+ }; -+ -+ void ath9k_beacon_tasklet(unsigned long data); -+-void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif, -+- u32 changed); -++void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *main_vif, -++ bool beacons); -+ void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif); -+ void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif); -++void ath9k_beacon_ensure_primary_slot(struct ath_softc *sc); -+ void ath9k_set_beacon(struct ath_softc *sc); -+ bool ath9k_csa_is_finished(struct ath_softc *sc, struct ieee80211_vif *vif); -+ void ath9k_csa_update(struct ath_softc *sc); -+--- a/drivers/net/wireless/ath/ath9k/beacon.c -++++ b/drivers/net/wireless/ath/ath9k/beacon.c -+@@ -209,7 +209,6 @@ void ath9k_beacon_assign_slot(struct ath -+ } -+ -+ sc->beacon.bslot[avp->av_bslot] = vif; -+- sc->nbcnvifs++; -+ -+ ath_dbg(common, CONFIG, "Added interface at beacon slot: %d\n", -+ avp->av_bslot); -+@@ -220,15 +219,12 @@ void ath9k_beacon_remove_slot(struct ath -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ struct ath_vif *avp = (void *)vif->drv_priv; -+ struct ath_buf *bf = avp->av_bcbuf; -+- struct ath_beacon_config *cur_conf = &sc->cur_chan->beacon; -+ -+ ath_dbg(common, CONFIG, "Removing interface at beacon slot: %d\n", -+ avp->av_bslot); -+ -+ tasklet_disable(&sc->bcon_tasklet); -+ -+- cur_conf->enable_beacon &= ~BIT(avp->av_bslot); -+- -+ if (bf && bf->bf_mpdu) { -+ struct sk_buff *skb = bf->bf_mpdu; -+ dma_unmap_single(sc->dev, bf->bf_buf_addr, -+@@ -240,12 +236,73 @@ void ath9k_beacon_remove_slot(struct ath -+ -+ avp->av_bcbuf = NULL; -+ sc->beacon.bslot[avp->av_bslot] = NULL; -+- sc->nbcnvifs--; -+ list_add_tail(&bf->list, &sc->beacon.bbuf); -+ -+ tasklet_enable(&sc->bcon_tasklet); -+ } -+ -++void ath9k_beacon_ensure_primary_slot(struct ath_softc *sc) -++{ -++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -++ struct ieee80211_vif *vif; -++ struct ath_vif *avp; -++ s64 tsfadjust; -++ u32 offset; -++ int first_slot = ATH_BCBUF; -++ int slot; -++ -++ tasklet_disable(&sc->bcon_tasklet); -++ -++ /* Find first taken slot. */ -++ for (slot = 0; slot < ATH_BCBUF; slot++) { -++ if (sc->beacon.bslot[slot]) { -++ first_slot = slot; -++ break; -++ } -++ } -++ if (first_slot == 0) -++ goto out; -++ -++ /* Re-enumarate all slots, moving them forward. */ -++ for (slot = 0; slot < ATH_BCBUF; slot++) { -++ if (slot + first_slot < ATH_BCBUF) { -++ vif = sc->beacon.bslot[slot + first_slot]; -++ sc->beacon.bslot[slot] = vif; -++ -++ if (vif) { -++ avp = (void *)vif->drv_priv; -++ avp->av_bslot = slot; -++ } -++ } else { -++ sc->beacon.bslot[slot] = NULL; -++ } -++ } -++ -++ vif = sc->beacon.bslot[0]; -++ if (WARN_ON(!vif)) -++ goto out; -++ -++ /* Get the tsf_adjust value for the new first slot. */ -++ avp = (void *)vif->drv_priv; -++ tsfadjust = le64_to_cpu(avp->tsf_adjust); -++ -++ ath_dbg(common, CONFIG, -++ "Adjusting global TSF after beacon slot reassignment: %lld\n", -++ (signed long long)tsfadjust); -++ -++ /* Modify TSF as required and update the HW. */ -++ avp->chanctx->tsf_val += tsfadjust; -++ if (sc->cur_chan == avp->chanctx) { -++ offset = ath9k_hw_get_tsf_offset(&avp->chanctx->tsf_ts, NULL); -++ ath9k_hw_settsf64(sc->sc_ah, avp->chanctx->tsf_val + offset); -++ } -++ -++ /* The slots tsf_adjust will be updated by ath9k_beacon_config later. */ -++ -++out: -++ tasklet_enable(&sc->bcon_tasklet); -++} -++ -+ static int ath9k_beacon_choose_slot(struct ath_softc *sc) -+ { -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+@@ -274,26 +331,33 @@ static int ath9k_beacon_choose_slot(stru -+ return slot; -+ } -+ -+-static void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif) -++static void ath9k_set_tsfadjust(struct ath_softc *sc, -++ struct ath_beacon_config *cur_conf) -+ { -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+- struct ath_vif *avp = (void *)vif->drv_priv; -+- struct ath_beacon_config *cur_conf = &avp->chanctx->beacon; -+ s64 tsfadjust; -++ int slot; -+ -+- if (avp->av_bslot == 0) -+- return; -++ for (slot = 0; slot < ATH_BCBUF; slot++) { -++ struct ath_vif *avp; -+ -+- /* tsf_adjust is added to the TSF value. We send out the beacon late, -+- * so need to adjust the TSF starting point to be later in time (i.e. -+- * the theoretical first beacon has a TSF of 0 after correction). -+- */ -+- tsfadjust = cur_conf->beacon_interval * avp->av_bslot; -+- tsfadjust = -TU_TO_USEC(tsfadjust) / ATH_BCBUF; -+- avp->tsf_adjust = cpu_to_le64(tsfadjust); -++ if (!sc->beacon.bslot[slot]) -++ continue; -+ -+- ath_dbg(common, CONFIG, "tsfadjust is: %lld for bslot: %d\n", -+- (signed long long)tsfadjust, avp->av_bslot); -++ avp = (void *)sc->beacon.bslot[slot]->drv_priv; -++ -++ /* tsf_adjust is added to the TSF value. We send out the -++ * beacon late, so need to adjust the TSF starting point to be -++ * later in time (i.e. the theoretical first beacon has a TSF -++ * of 0 after correction). -++ */ -++ tsfadjust = cur_conf->beacon_interval * avp->av_bslot; -++ tsfadjust = -TU_TO_USEC(tsfadjust) / ATH_BCBUF; -++ avp->tsf_adjust = cpu_to_le64(tsfadjust); -++ -++ ath_dbg(common, CONFIG, "tsfadjust is: %lld for bslot: %d\n", -++ (signed long long)tsfadjust, avp->av_bslot); -++ } -+ } -+ -+ bool ath9k_csa_is_finished(struct ath_softc *sc, struct ieee80211_vif *vif) -+@@ -447,20 +511,28 @@ void ath9k_beacon_tasklet(unsigned long -+ * Both nexttbtt and intval have to be in usecs. -+ */ -+ static void ath9k_beacon_init(struct ath_softc *sc, u32 nexttbtt, -+- u32 intval, bool reset_tsf) -++ u32 intval) -+ { -+ struct ath_hw *ah = sc->sc_ah; -+ -+ ath9k_hw_disable_interrupts(ah); -+- if (reset_tsf) -+- ath9k_hw_reset_tsf(ah); -+ ath9k_beaconq_config(sc); -+ ath9k_hw_beaconinit(ah, nexttbtt, intval); -++ ah->imask |= ATH9K_INT_SWBA; -+ sc->beacon.bmisscnt = 0; -+ ath9k_hw_set_interrupts(ah); -+ ath9k_hw_enable_interrupts(ah); -+ } -+ -++static void ath9k_beacon_stop(struct ath_softc *sc) -++{ -++ ath9k_hw_disable_interrupts(sc->sc_ah); -++ sc->sc_ah->imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS); -++ sc->beacon.bmisscnt = 0; -++ ath9k_hw_set_interrupts(sc->sc_ah); -++ ath9k_hw_enable_interrupts(sc->sc_ah); -++} -++ -+ /* -+ * For multi-bss ap support beacons are either staggered evenly over N slots or -+ * burst together. For the former arrange for the SWBA to be delivered for each -+@@ -472,7 +544,7 @@ static void ath9k_beacon_config_ap(struc -+ struct ath_hw *ah = sc->sc_ah; -+ -+ ath9k_cmn_beacon_config_ap(ah, conf, ATH_BCBUF); -+- ath9k_beacon_init(sc, conf->nexttbtt, conf->intval, false); -++ ath9k_beacon_init(sc, conf->nexttbtt, conf->intval); -+ } -+ -+ static void ath9k_beacon_config_sta(struct ath_hw *ah, -+@@ -501,7 +573,7 @@ static void ath9k_beacon_config_adhoc(st -+ -+ ath9k_cmn_beacon_config_adhoc(ah, conf); -+ -+- ath9k_beacon_init(sc, conf->nexttbtt, conf->intval, conf->ibss_creator); -++ ath9k_beacon_init(sc, conf->nexttbtt, conf->intval); -+ -+ /* -+ * Set the global 'beacon has been configured' flag for the -+@@ -511,44 +583,6 @@ static void ath9k_beacon_config_adhoc(st -+ set_bit(ATH_OP_BEACONS, &common->op_flags); -+ } -+ -+-static bool ath9k_allow_beacon_config(struct ath_softc *sc, -+- struct ieee80211_vif *vif) -+-{ -+- struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+- struct ath_vif *avp = (void *)vif->drv_priv; -+- -+- if (ath9k_is_chanctx_enabled()) { -+- /* -+- * If the VIF is not present in the current channel context, -+- * then we can't do the usual opmode checks. Allow the -+- * beacon config for the VIF to be updated in this case and -+- * return immediately. -+- */ -+- if (sc->cur_chan != avp->chanctx) -+- return true; -+- } -+- -+- if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) { -+- if (vif->type != NL80211_IFTYPE_AP) { -+- ath_dbg(common, CONFIG, -+- "An AP interface is already present !\n"); -+- return false; -+- } -+- } -+- -+- if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) { -+- if ((vif->type == NL80211_IFTYPE_STATION) && -+- test_bit(ATH_OP_BEACONS, &common->op_flags) && -+- vif != sc->cur_chan->primary_sta) { -+- ath_dbg(common, CONFIG, -+- "Beacon already configured for a station interface\n"); -+- return false; -+- } -+- } -+- -+- return true; -+-} -+- -+ static void ath9k_cache_beacon_config(struct ath_softc *sc, -+ struct ath_chanctx *ctx, -+ struct ieee80211_bss_conf *bss_conf) -+@@ -584,87 +618,79 @@ static void ath9k_cache_beacon_config(st -+ if (cur_conf->dtim_period == 0) -+ cur_conf->dtim_period = 1; -+ -++ ath9k_set_tsfadjust(sc, cur_conf); -+ } -+ -+-void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif, -+- u32 changed) -++void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *main_vif, -++ bool beacons) -+ { -+- struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; -+- struct ath_hw *ah = sc->sc_ah; -+- struct ath_common *common = ath9k_hw_common(ah); -+- struct ath_vif *avp = (void *)vif->drv_priv; -+- struct ath_chanctx *ctx = avp->chanctx; -++ struct ath_hw *ah = sc->sc_ah; -++ struct ath_common *common = ath9k_hw_common(ah); -++ struct ath_vif *avp; -++ struct ath_chanctx *ctx; -+ struct ath_beacon_config *cur_conf; -+ unsigned long flags; -++ bool enabled; -+ bool skip_beacon = false; -+ -+- if (!ctx) -++ if (!beacons) { -++ clear_bit(ATH_OP_BEACONS, &common->op_flags); -++ ath9k_beacon_stop(sc); -+ return; -++ } -+ -+- cur_conf = &avp->chanctx->beacon; -+- if (vif->type == NL80211_IFTYPE_AP) -+- ath9k_set_tsfadjust(sc, vif); -+- -+- if (!ath9k_allow_beacon_config(sc, vif)) -++ if (WARN_ON(!main_vif)) -+ return; -+ -+- if (vif->type == NL80211_IFTYPE_STATION) { -+- ath9k_cache_beacon_config(sc, ctx, bss_conf); -+- if (ctx != sc->cur_chan) -+- return; -++ avp = (void *)main_vif->drv_priv; -++ ctx = avp->chanctx; -++ cur_conf = &ctx->beacon; -++ enabled = cur_conf->enable_beacon; -++ cur_conf->enable_beacon = beacons; -++ -++ if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) { -++ ath9k_cache_beacon_config(sc, ctx, &main_vif->bss_conf); -+ -+ ath9k_set_beacon(sc); -+ set_bit(ATH_OP_BEACONS, &common->op_flags); -+ return; -+ } -+ -+- /* -+- * Take care of multiple interfaces when -+- * enabling/disabling SWBA. -+- */ -+- if (changed & BSS_CHANGED_BEACON_ENABLED) { -+- bool enabled = cur_conf->enable_beacon; -+- -+- if (!bss_conf->enable_beacon) { -+- cur_conf->enable_beacon &= ~BIT(avp->av_bslot); -+- } else { -+- cur_conf->enable_beacon |= BIT(avp->av_bslot); -+- if (!enabled) -+- ath9k_cache_beacon_config(sc, ctx, bss_conf); -+- } -+- } -+- -+- if (ctx != sc->cur_chan) -+- return; -++ /* Update the beacon configuration. */ -++ ath9k_cache_beacon_config(sc, ctx, &main_vif->bss_conf); -+ -+ /* -+ * Configure the HW beacon registers only when we have a valid -+ * beacon interval. -+ */ -+ if (cur_conf->beacon_interval) { -+- /* -+- * If we are joining an existing IBSS network, start beaconing -+- * only after a TSF-sync has taken place. Ensure that this -+- * happens by setting the appropriate flags. -++ /* Special case to sync the TSF when joining an existing IBSS. -++ * This is only done if no AP interface is active. -++ * Note that mac80211 always resets the TSF when creating a new -++ * IBSS interface. -+ */ -+- if ((changed & BSS_CHANGED_IBSS) && !bss_conf->ibss_creator && -+- bss_conf->enable_beacon) { -++ if (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC && -++ !enabled && beacons && !main_vif->bss_conf.ibss_creator) { -+ spin_lock_irqsave(&sc->sc_pm_lock, flags); -+ sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON; -+ spin_unlock_irqrestore(&sc->sc_pm_lock, flags); -+ skip_beacon = true; -+- } else { -+- ath9k_set_beacon(sc); -+ } -+ -+ /* -+ * Do not set the ATH_OP_BEACONS flag for IBSS joiner mode -+ * here, it is done in ath9k_beacon_config_adhoc(). -+ */ -+- if (cur_conf->enable_beacon && !skip_beacon) -++ if (beacons && !skip_beacon) { -+ set_bit(ATH_OP_BEACONS, &common->op_flags); -+- else -++ ath9k_set_beacon(sc); -++ } else { -+ clear_bit(ATH_OP_BEACONS, &common->op_flags); -++ ath9k_beacon_stop(sc); -++ } -++ } else { -++ clear_bit(ATH_OP_BEACONS, &common->op_flags); -++ ath9k_beacon_stop(sc); -+ } -+ } -+ -+--- a/drivers/net/wireless/ath/ath9k/common.h -++++ b/drivers/net/wireless/ath/ath9k/common.h -+@@ -50,6 +50,7 @@ -+ #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) -+ -+ struct ath_beacon_config { -++ struct ieee80211_vif *main_vif; -+ int beacon_interval; -+ u16 dtim_period; -+ u16 bmiss_timeout; -+--- a/drivers/net/wireless/ath/ath9k/main.c -++++ b/drivers/net/wireless/ath/ath9k/main.c -+@@ -910,6 +910,22 @@ static bool ath9k_uses_beacons(int type) -+ } -+ } -+ -++static void ath9k_vif_iter_set_beacon(struct ath9k_vif_iter_data *iter_data, -++ struct ieee80211_vif *vif) -++{ -++ /* Use the first (configured) interface, but prefering AP interfaces. */ -++ if (!iter_data->primary_beacon_vif) { -++ iter_data->primary_beacon_vif = vif; -++ } else { -++ if (iter_data->primary_beacon_vif->type != NL80211_IFTYPE_AP && -++ vif->type == NL80211_IFTYPE_AP) -++ iter_data->primary_beacon_vif = vif; -++ } -++ -++ iter_data->beacons = true; -++ iter_data->nbcnvifs += 1; -++} -++ -+ static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data, -+ u8 *mac, struct ieee80211_vif *vif) -+ { -+@@ -931,6 +947,8 @@ static void ath9k_vif_iter(struct ath9k_ -+ switch (vif->type) { -+ case NL80211_IFTYPE_AP: -+ iter_data->naps++; -++ if (vif->bss_conf.enable_beacon) -++ ath9k_vif_iter_set_beacon(iter_data, vif); -+ break; -+ case NL80211_IFTYPE_STATION: -+ iter_data->nstations++; -+@@ -943,12 +961,12 @@ static void ath9k_vif_iter(struct ath9k_ -+ case NL80211_IFTYPE_ADHOC: -+ iter_data->nadhocs++; -+ if (vif->bss_conf.enable_beacon) -+- iter_data->beacons = true; -++ ath9k_vif_iter_set_beacon(iter_data, vif); -+ break; -+ case NL80211_IFTYPE_MESH_POINT: -+ iter_data->nmeshes++; -+ if (vif->bss_conf.enable_beacon) -+- iter_data->beacons = true; -++ ath9k_vif_iter_set_beacon(iter_data, vif); -+ break; -+ case NL80211_IFTYPE_WDS: -+ iter_data->nwds++; -+@@ -1081,7 +1099,6 @@ void ath9k_calculate_summary_state(struc -+ struct ath_hw *ah = sc->sc_ah; -+ struct ath_common *common = ath9k_hw_common(ah); -+ struct ath9k_vif_iter_data iter_data; -+- struct ath_beacon_config *cur_conf; -+ -+ ath_chanctx_check_active(sc, ctx); -+ -+@@ -1103,13 +1120,12 @@ void ath9k_calculate_summary_state(struc -+ ath_hw_setbssidmask(common); -+ -+ if (iter_data.naps > 0) { -+- cur_conf = &ctx->beacon; -+ ath9k_hw_set_tsfadjust(ah, true); -+ ah->opmode = NL80211_IFTYPE_AP; -+- if (cur_conf->enable_beacon) -+- iter_data.beacons = true; -+ } else { -+ ath9k_hw_set_tsfadjust(ah, false); -++ if (iter_data.beacons) -++ ath9k_beacon_ensure_primary_slot(sc); -+ -+ if (iter_data.nmeshes) -+ ah->opmode = NL80211_IFTYPE_MESH_POINT; -+@@ -1134,7 +1150,6 @@ void ath9k_calculate_summary_state(struc -+ ctx->switch_after_beacon = true; -+ } -+ -+- ah->imask &= ~ATH9K_INT_SWBA; -+ if (ah->opmode == NL80211_IFTYPE_STATION) { -+ bool changed = (iter_data.primary_sta != ctx->primary_sta); -+ -+@@ -1151,16 +1166,12 @@ void ath9k_calculate_summary_state(struc -+ if (ath9k_hw_mci_is_enabled(sc->sc_ah)) -+ ath9k_mci_update_wlan_channels(sc, true); -+ } -+- } else if (iter_data.beacons) { -+- ah->imask |= ATH9K_INT_SWBA; -+ } -++ sc->nbcnvifs = iter_data.nbcnvifs; -++ ath9k_beacon_config(sc, iter_data.primary_beacon_vif, -++ iter_data.beacons); -+ ath9k_hw_set_interrupts(ah); -+ -+- if (iter_data.beacons) -+- set_bit(ATH_OP_BEACONS, &common->op_flags); -+- else -+- clear_bit(ATH_OP_BEACONS, &common->op_flags); -+- -+ if (ah->slottime != iter_data.slottime) { -+ ah->slottime = iter_data.slottime; -+ ath9k_hw_init_global_settings(ah); -+@@ -1777,9 +1788,7 @@ static void ath9k_bss_info_changed(struc -+ if ((changed & BSS_CHANGED_BEACON_ENABLED) || -+ (changed & BSS_CHANGED_BEACON_INT) || -+ (changed & BSS_CHANGED_BEACON_INFO)) { -+- ath9k_beacon_config(sc, vif, changed); -+- if (changed & BSS_CHANGED_BEACON_ENABLED) -+- ath9k_calculate_summary_state(sc, avp->chanctx); -++ ath9k_calculate_summary_state(sc, avp->chanctx); -+ } -+ -+ if ((avp->chanctx == sc->cur_chan) && -diff --git a/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch b/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch -deleted file mode 100644 -index 5bf53b918c4936c09f65ea8a02f9ac7e93cf686a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/317-mac80211-minstrel_ht-fix-out-of-bound-in-minstrel_ht.patch -+++ /dev/null -@@ -1,45 +0,0 @@ --From: Konstantin Khlebnikov --Date: Fri, 29 Jan 2016 11:35:12 +0300 --Subject: [PATCH] mac80211: minstrel_ht: fix out-of-bound in -- minstrel_ht_set_best_prob_rate -- --Patch fixes this splat -- --BUG: KASAN: slab-out-of-bounds in minstrel_ht_update_stats.isra.7+0x6e1/0x9e0 --[mac80211] at addr ffff8800cee640f4 Read of size 4 by task swapper/3/0 -- --Signed-off-by: Konstantin Khlebnikov --Link: http://lkml.kernel.org/r/CALYGNiNyJhSaVnE35qS6UCGaSb2Dx1_i5HcRavuOX14oTz2P+w@mail.gmail.com ----- -- ----- a/net/mac80211/rc80211_minstrel_ht.c --+++ b/net/mac80211/rc80211_minstrel_ht.c --@@ -414,15 +414,16 @@ minstrel_ht_set_best_prob_rate(struct mi -- (max_tp_group != MINSTREL_CCK_GROUP)) -- return; -- --+ max_gpr_group = mg->max_group_prob_rate / MCS_GROUP_RATES; --+ max_gpr_idx = mg->max_group_prob_rate % MCS_GROUP_RATES; --+ max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_ewma; --+ -- if (mrs->prob_ewma > MINSTREL_FRAC(75, 100)) { -- cur_tp_avg = minstrel_ht_get_tp_avg(mi, cur_group, cur_idx, -- mrs->prob_ewma); -- if (cur_tp_avg > tmp_tp_avg) -- mi->max_prob_rate = index; -- --- max_gpr_group = mg->max_group_prob_rate / MCS_GROUP_RATES; --- max_gpr_idx = mg->max_group_prob_rate % MCS_GROUP_RATES; --- max_gpr_prob = mi->groups[max_gpr_group].rates[max_gpr_idx].prob_ewma; -- max_gpr_tp_avg = minstrel_ht_get_tp_avg(mi, max_gpr_group, -- max_gpr_idx, -- max_gpr_prob); --@@ -431,7 +432,7 @@ minstrel_ht_set_best_prob_rate(struct mi -- } else { -- if (mrs->prob_ewma > tmp_prob) -- mi->max_prob_rate = index; --- if (mrs->prob_ewma > mg->rates[mg->max_group_prob_rate].prob_ewma) --+ if (mrs->prob_ewma > max_gpr_prob) -- mg->max_group_prob_rate = index; -- } -- } -diff --git a/package/kernel/mac80211/patches/318-brcmfmac-slightly-simplify-building-interface-combin.patch b/package/kernel/mac80211/patches/318-brcmfmac-slightly-simplify-building-interface-combin.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..d946ecce19bf4e21355cc2563a58a02575d45f77 ---- /dev/null -+++ b/package/kernel/mac80211/patches/318-brcmfmac-slightly-simplify-building-interface-combin.patch -@@ -0,0 +1,108 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Tue, 7 Jun 2016 21:10:18 +0200 -+Subject: [PATCH] brcmfmac: slightly simplify building interface combinations -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+This change reorders some operations in brcmf_setup_ifmodes in hope to -+make it simpler: -+1) It allocates arrays right before filling them. This way it's easier -+ to follow requested array length as it's immediately followed by -+ code filling it. It's easier to check e.g. why we need 4 entries for -+ P2P. Other than that it deduplicates some checks (e.g. for P2P). -+2) It reorders code to first prepare limits and then define a new combo. -+ Previously this was mixed (e.g. we were setting num of channels -+ before preparing limits). -+3) It modifies mbss code to use i variable just like other combos do. -+ -+Signed-off-by: Rafał Miłecki -+Acked-by: Arend van Spriel -+Signed-off-by: Kalle Valo -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+@@ -6284,29 +6284,15 @@ static int brcmf_setup_ifmodes(struct wi -+ if (!combo) -+ goto err; -+ -+- c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL); -+- if (!c0_limits) -+- goto err; -+- -+- if (p2p) { -+- p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL); -+- if (!p2p_limits) -+- goto err; -+- } -+- -+- if (mbss) { -+- mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL); -+- if (!mbss_limits) -+- goto err; -+- } -+- -+ wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | -+ BIT(NL80211_IFTYPE_ADHOC) | -+ BIT(NL80211_IFTYPE_AP); -+ -+ c = 0; -+ i = 0; -+- combo[c].num_different_channels = 1; -++ c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL); -++ if (!c0_limits) -++ goto err; -+ c0_limits[i].max = 1; -+ c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION); -+ if (p2p) { -+@@ -6324,6 +6310,7 @@ static int brcmf_setup_ifmodes(struct wi -+ c0_limits[i].max = 1; -+ c0_limits[i++].types = BIT(NL80211_IFTYPE_AP); -+ } -++ combo[c].num_different_channels = 1; -+ combo[c].max_interfaces = i; -+ combo[c].n_limits = i; -+ combo[c].limits = c0_limits; -+@@ -6331,7 +6318,9 @@ static int brcmf_setup_ifmodes(struct wi -+ if (p2p) { -+ c++; -+ i = 0; -+- combo[c].num_different_channels = 1; -++ p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL); -++ if (!p2p_limits) -++ goto err; -+ p2p_limits[i].max = 1; -+ p2p_limits[i++].types = BIT(NL80211_IFTYPE_STATION); -+ p2p_limits[i].max = 1; -+@@ -6340,6 +6329,7 @@ static int brcmf_setup_ifmodes(struct wi -+ p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT); -+ p2p_limits[i].max = 1; -+ p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE); -++ combo[c].num_different_channels = 1; -+ combo[c].max_interfaces = i; -+ combo[c].n_limits = i; -+ combo[c].limits = p2p_limits; -+@@ -6347,14 +6337,19 @@ static int brcmf_setup_ifmodes(struct wi -+ -+ if (mbss) { -+ c++; -++ i = 0; -++ mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL); -++ if (!mbss_limits) -++ goto err; -++ mbss_limits[i].max = 4; -++ mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP); -+ combo[c].beacon_int_infra_match = true; -+ combo[c].num_different_channels = 1; -+- mbss_limits[0].max = 4; -+- mbss_limits[0].types = BIT(NL80211_IFTYPE_AP); -+ combo[c].max_interfaces = 4; -+- combo[c].n_limits = 1; -++ combo[c].n_limits = i; -+ combo[c].limits = mbss_limits; -+ } -++ -+ wiphy->n_iface_combinations = n_combos; -+ wiphy->iface_combinations = combo; -+ return 0; -diff --git a/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch b/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch -deleted file mode 100644 -index 655dc4bfa934ca34ac108e54a93626e7d73eeb6e..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/318-mac80211-move-A-MSDU-skb_linearize-call-to-ieee80211.patch -+++ /dev/null -@@ -1,35 +0,0 @@ --From: Felix Fietkau --Date: Tue, 2 Feb 2016 14:39:08 +0100 --Subject: [PATCH] mac80211: move A-MSDU skb_linearize call to -- ieee80211_amsdu_to_8023s -- --Prepararation for zero-copy A-MSDU support with page fragment SKBs -- --Signed-off-by: Felix Fietkau --Signed-off-by: Johannes Berg ----- -- ----- a/net/mac80211/rx.c --+++ b/net/mac80211/rx.c --@@ -2203,9 +2203,6 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx -- skb->dev = dev; -- __skb_queue_head_init(&frame_list); -- --- if (skb_linearize(skb)) --- return RX_DROP_UNUSABLE; --- -- ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, -- rx->sdata->vif.type, -- rx->local->hw.extra_tx_headroom, true); ----- a/net/wireless/util.c --+++ b/net/wireless/util.c --@@ -657,6 +657,9 @@ void ieee80211_amsdu_to_8023s(struct sk_ -- int remaining, err; -- u8 dst[ETH_ALEN], src[ETH_ALEN]; -- --+ if (skb_linearize(skb)) --+ goto out; --+ -- if (has_80211_header) { -- err = ieee80211_data_to_8023(skb, addr, iftype); -- if (err) -diff --git a/package/kernel/mac80211/patches/319-0001-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch b/package/kernel/mac80211/patches/319-0001-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..073d012dea37ebfc34ffac98797c5eebc48a6c6d ---- /dev/null -+++ b/package/kernel/mac80211/patches/319-0001-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch -@@ -0,0 +1,154 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Fri, 17 Jun 2016 12:29:21 +0200 -+Subject: [PATCH] brcmfmac: fix lockup when removing P2P interface after -+ event timeout -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+Removing P2P interface is handled by sending a proper request to the -+firmware. On success firmware triggers an event and driver's handler -+removes a matching interface. -+ -+However on event timeout we remove interface directly from the cfg80211 -+callback. Current code doesn't handle this case correctly as it always -+assumes rtnl to be unlocked. -+ -+Fix it by adding an extra rtnl_locked parameter to functions and calling -+unregister_netdevice when needed. -+ -+Signed-off-by: Rafał Miłecki -+Signed-off-by: Kalle Valo -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -+@@ -548,12 +548,16 @@ fail: -+ return -EBADE; -+ } -+ -+-static void brcmf_net_detach(struct net_device *ndev) -++static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked) -+ { -+- if (ndev->reg_state == NETREG_REGISTERED) -+- unregister_netdev(ndev); -+- else -++ if (ndev->reg_state == NETREG_REGISTERED) { -++ if (rtnl_locked) -++ unregister_netdevice(ndev); -++ else -++ unregister_netdev(ndev); -++ } else { -+ brcmf_cfg80211_free_netdev(ndev); -++ } -+ } -+ -+ void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on) -+@@ -651,7 +655,7 @@ struct brcmf_if *brcmf_add_if(struct brc -+ brcmf_err("ERROR: netdev:%s already exists\n", -+ ifp->ndev->name); -+ netif_stop_queue(ifp->ndev); -+- brcmf_net_detach(ifp->ndev); -++ brcmf_net_detach(ifp->ndev, false); -+ drvr->iflist[bsscfgidx] = NULL; -+ } else { -+ brcmf_dbg(INFO, "netdev:%s ignore IF event\n", -+@@ -699,7 +703,8 @@ struct brcmf_if *brcmf_add_if(struct brc -+ return ifp; -+ } -+ -+-static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx) -++static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx, -++ bool rtnl_locked) -+ { -+ struct brcmf_if *ifp; -+ -+@@ -729,7 +734,7 @@ static void brcmf_del_if(struct brcmf_pu -+ cancel_work_sync(&ifp->multicast_work); -+ cancel_work_sync(&ifp->ndoffload_work); -+ } -+- brcmf_net_detach(ifp->ndev); -++ brcmf_net_detach(ifp->ndev, rtnl_locked); -+ } else { -+ /* Only p2p device interfaces which get dynamically created -+ * end up here. In this case the p2p module should be informed -+@@ -743,14 +748,14 @@ static void brcmf_del_if(struct brcmf_pu -+ } -+ } -+ -+-void brcmf_remove_interface(struct brcmf_if *ifp) -++void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked) -+ { -+ if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bsscfgidx] != ifp)) -+ return; -+ brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx, -+ ifp->ifidx); -+ brcmf_fws_del_interface(ifp); -+- brcmf_del_if(ifp->drvr, ifp->bsscfgidx); -++ brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked); -+ } -+ -+ #ifdef CONFIG_INET -+@@ -1057,9 +1062,9 @@ fail: -+ brcmf_fws_deinit(drvr); -+ } -+ if (ifp) -+- brcmf_net_detach(ifp->ndev); -++ brcmf_net_detach(ifp->ndev, false); -+ if (p2p_ifp) -+- brcmf_net_detach(p2p_ifp->ndev); -++ brcmf_net_detach(p2p_ifp->ndev, false); -+ drvr->iflist[0] = NULL; -+ drvr->iflist[1] = NULL; -+ if (drvr->settings->ignore_probe_fail) -+@@ -1128,7 +1133,7 @@ void brcmf_detach(struct device *dev) -+ -+ /* make sure primary interface removed last */ -+ for (i = BRCMF_MAX_IFS-1; i > -1; i--) -+- brcmf_remove_interface(drvr->iflist[i]); -++ brcmf_remove_interface(drvr->iflist[i], false); -+ -+ brcmf_cfg80211_detach(drvr->config); -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h -+@@ -216,7 +216,7 @@ struct brcmf_if *brcmf_get_ifp(struct br -+ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); -+ struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, -+ bool is_p2pdev, char *name, u8 *mac_addr); -+-void brcmf_remove_interface(struct brcmf_if *ifp); -++void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); -+ void brcmf_txflowblock_if(struct brcmf_if *ifp, -+ enum brcmf_netif_stop_reason reason, bool state); -+ void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c -+@@ -183,7 +183,7 @@ static void brcmf_fweh_handle_if_event(s -+ err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data); -+ -+ if (ifp && ifevent->action == BRCMF_E_IF_DEL) -+- brcmf_remove_interface(ifp); -++ brcmf_remove_interface(ifp, false); -+ } -+ -+ /** -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -+@@ -2289,7 +2289,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph -+ err = 0; -+ } -+ if (err) -+- brcmf_remove_interface(vif->ifp); -++ brcmf_remove_interface(vif->ifp, true); -+ -+ brcmf_cfg80211_arm_vif_event(cfg, NULL); -+ if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) -+@@ -2395,7 +2395,7 @@ void brcmf_p2p_detach(struct brcmf_p2p_i -+ if (vif != NULL) { -+ brcmf_p2p_cancel_remain_on_channel(vif->ifp); -+ brcmf_p2p_deinit_discovery(p2p); -+- brcmf_remove_interface(vif->ifp); -++ brcmf_remove_interface(vif->ifp, false); -+ } -+ /* just set it all to zero */ -+ memset(p2p, 0, sizeof(*p2p)); -diff --git a/package/kernel/mac80211/patches/319-0002-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch b/package/kernel/mac80211/patches/319-0002-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..6d3f3c640cc5667adbbf828eab28995e1fc5d88c ---- /dev/null -+++ b/package/kernel/mac80211/patches/319-0002-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch -@@ -0,0 +1,40 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Fri, 17 Jun 2016 12:48:44 +0200 -+Subject: [PATCH] brcmfmac: use const char * for interface name in -+ brcmf_add_if -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+This function can work just fine with const pointer, it only calls -+alloc_netdev which take const as well. Moreover it makes this function -+more flexible as some cfg80211 callback may provide const char * as -+well, e.g. add_virtual_intf. This will be needed for more advanced -+interface management. -+ -+Signed-off-by: Rafał Miłecki -+Signed-off-by: Kalle Valo -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -+@@ -638,7 +638,7 @@ fail: -+ } -+ -+ struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, -+- bool is_p2pdev, char *name, u8 *mac_addr) -++ bool is_p2pdev, const char *name, u8 *mac_addr) -+ { -+ struct brcmf_if *ifp; -+ struct net_device *ndev; -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h -+@@ -215,7 +215,7 @@ char *brcmf_ifname(struct brcmf_if *ifp) -+ struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); -+ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); -+ struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, -+- bool is_p2pdev, char *name, u8 *mac_addr); -++ bool is_p2pdev, const char *name, u8 *mac_addr); -+ void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); -+ void brcmf_txflowblock_if(struct brcmf_if *ifp, -+ enum brcmf_netif_stop_reason reason, bool state); -diff --git a/package/kernel/mac80211/patches/319-0003-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch b/package/kernel/mac80211/patches/319-0003-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..eeda76661c30388ede4fd96a340af84e7f27d3b2 ---- /dev/null -+++ b/package/kernel/mac80211/patches/319-0003-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch -@@ -0,0 +1,33 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Sat, 18 Jun 2016 18:49:38 +0200 -+Subject: [PATCH] brcmfmac: include also core.h header in cfg80211.h -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+This header provides two inline functions using struct brcmf_if so we -+need core.h to avoid: -+ -+drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h: In function ‘ndev_to_prof’: -+drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:368:13: error: dereferencing pointer to incomplete type -+ return &ifp->vif->profile; -+ ^ -+drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h: In function ‘ndev_to_vif’: -+drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:374:12: error: dereferencing pointer to incomplete type -+ return ifp->vif; -+ ^ -+ -+Signed-off-by: Rafał Miłecki -+Signed-off-by: Kalle Valo -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h -+@@ -20,6 +20,7 @@ -+ /* for brcmu_d11inf */ -+ #include -+ -++#include "core.h" -+ #include "fwil_types.h" -+ #include "p2p.h" -+ -diff --git a/package/kernel/mac80211/patches/319-0004-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch b/package/kernel/mac80211/patches/319-0004-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..3819248b0fe94da017e99fba61931703036ad15c ---- /dev/null -+++ b/package/kernel/mac80211/patches/319-0004-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch -@@ -0,0 +1,27 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Sun, 19 Jun 2016 01:55:57 +0200 -+Subject: [PATCH] brcmfmac: add missing break when deleting P2P_DEVICE -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+We obviously don't want to fall through in that switch. With this change -+1) We wait for event (triggered by p2p_disc) as expected -+2) We remove interface manually on timeout -+3) We return 0 on success instead of -ENOTSUPP -+ -+Signed-off-by: Rafał Miłecki -+Signed-off-by: Kalle Valo -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -+@@ -2263,6 +2263,8 @@ int brcmf_p2p_del_vif(struct wiphy *wiph -+ return 0; -+ brcmf_p2p_cancel_remain_on_channel(vif->ifp); -+ brcmf_p2p_deinit_discovery(p2p); -++ break; -++ -+ default: -+ return -ENOTSUPP; -+ } -diff --git a/package/kernel/mac80211/patches/319-0005-brcmfmac-delete-interface-directly-in-code-that-sent.patch b/package/kernel/mac80211/patches/319-0005-brcmfmac-delete-interface-directly-in-code-that-sent.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..12d7eb48877d8f9d9e2eb64c7cfd887c3d1634ae ---- /dev/null -+++ b/package/kernel/mac80211/patches/319-0005-brcmfmac-delete-interface-directly-in-code-that-sent.patch -@@ -0,0 +1,75 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Wed, 29 Jun 2016 21:54:26 +0200 -+Subject: [PATCH] brcmfmac: delete interface directly in code that sent fw -+ request -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+So far when receiving event about in-firmware-interface removal our -+event worker was notifying listener and afterwards it was removing Linux -+interface. -+ -+First of all it was resulting in slightly unexpected order. The listener -+(del_virtual_intf callback) was (usually) returning with success before -+we even called unregister_netdev(ice). -+ -+Please note this couldn't be simply fixed by changing order of calls in -+brcmf_fweh_handle_if_event as unregistering interface earlier could free -+struct brcmf_if. -+ -+Another problem of current implementation are possible lockups. Focus on -+the time slot between calling event handler and removing Linux -+interface. During that time original caller may leave (unlocking rtnl -+semaphore) *and* another call to the same code may be done (locking it -+again). If that happens our event handler will stuck at removing Linux -+interface, it won't handle another event and will block process holding -+rtnl lock. -+ -+This can be simply solved by unregistering interface in a proper -+callback, right after receiving confirmation event from firmware. This -+only required modifying worker to don't unregister on its own if there -+is someone waiting for the event. -+ -+Signed-off-by: Rafał Miłecki -+Signed-off-by: Kalle Valo -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c -+@@ -18,6 +18,7 @@ -+ #include "brcmu_wifi.h" -+ #include "brcmu_utils.h" -+ -++#include "cfg80211.h" -+ #include "core.h" -+ #include "debug.h" -+ #include "tracepoint.h" -+@@ -182,8 +183,13 @@ static void brcmf_fweh_handle_if_event(s -+ -+ err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data); -+ -+- if (ifp && ifevent->action == BRCMF_E_IF_DEL) -+- brcmf_remove_interface(ifp, false); -++ if (ifp && ifevent->action == BRCMF_E_IF_DEL) { -++ bool armed = brcmf_cfg80211_vif_event_armed(drvr->config); -++ -++ /* Default handling in case no-one waits for this event */ -++ if (!armed) -++ brcmf_remove_interface(ifp, false); -++ } -+ } -+ -+ /** -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -+@@ -2290,8 +2290,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph -+ else -+ err = 0; -+ } -+- if (err) -+- brcmf_remove_interface(vif->ifp, true); -++ brcmf_remove_interface(vif->ifp, true); -+ -+ brcmf_cfg80211_arm_vif_event(cfg, NULL); -+ if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) -diff --git a/package/kernel/mac80211/patches/319-0006-brcmfmac-support-removing-AP-interfaces-with-interfa.patch b/package/kernel/mac80211/patches/319-0006-brcmfmac-support-removing-AP-interfaces-with-interfa.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..2f7165eade7c6ffba2b1ed23e71b66e54d6a430b ---- /dev/null -+++ b/package/kernel/mac80211/patches/319-0006-brcmfmac-support-removing-AP-interfaces-with-interfa.patch -@@ -0,0 +1,84 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Wed, 29 Jun 2016 21:54:27 +0200 -+Subject: [PATCH] brcmfmac: support removing AP interfaces with -+ "interface_remove" -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+New firmwares (e.g. 10.10.69.36 for BCM4366) support "interface_remove" -+for removing interfaces. Try to use this method on cfg80211 request. In -+case of older firmwares (e.g. 7.35.177.56 for BCM43602 as I tested) this -+will just result in firmware rejecting command and this won't change any -+behavior. -+ -+Signed-off-by: Rafał Miłecki -+Signed-off-by: Kalle Valo -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+@@ -785,12 +785,48 @@ s32 brcmf_notify_escan_complete(struct b -+ return err; -+ } -+ -++static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy, -++ struct wireless_dev *wdev) -++{ -++ struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); -++ struct net_device *ndev = wdev->netdev; -++ struct brcmf_if *ifp = netdev_priv(ndev); -++ int ret; -++ int err; -++ -++ brcmf_cfg80211_arm_vif_event(cfg, ifp->vif); -++ -++ err = brcmf_fil_bsscfg_data_set(ifp, "interface_remove", NULL, 0); -++ if (err) { -++ brcmf_err("interface_remove failed %d\n", err); -++ goto err_unarm; -++ } -++ -++ /* wait for firmware event */ -++ ret = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_DEL, -++ BRCMF_VIF_EVENT_TIMEOUT); -++ if (!ret) { -++ brcmf_err("timeout occurred\n"); -++ err = -EIO; -++ goto err_unarm; -++ } -++ -++ brcmf_remove_interface(ifp, true); -++ -++err_unarm: -++ brcmf_cfg80211_arm_vif_event(cfg, NULL); -++ return err; -++} -++ -+ static -+ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev) -+ { -+ struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); -+ struct net_device *ndev = wdev->netdev; -+ -++ if (ndev && ndev == cfg_to_ndev(cfg)) -++ return -ENOTSUPP; -++ -+ /* vif event pending in firmware */ -+ if (brcmf_cfg80211_vif_event_armed(cfg)) -+ return -EBUSY; -+@@ -807,12 +843,13 @@ int brcmf_cfg80211_del_iface(struct wiph -+ switch (wdev->iftype) { -+ case NL80211_IFTYPE_ADHOC: -+ case NL80211_IFTYPE_STATION: -+- case NL80211_IFTYPE_AP: -+ case NL80211_IFTYPE_AP_VLAN: -+ case NL80211_IFTYPE_WDS: -+ case NL80211_IFTYPE_MONITOR: -+ case NL80211_IFTYPE_MESH_POINT: -+ return -EOPNOTSUPP; -++ case NL80211_IFTYPE_AP: -++ return brcmf_cfg80211_del_ap_iface(wiphy, wdev); -+ case NL80211_IFTYPE_P2P_CLIENT: -+ case NL80211_IFTYPE_P2P_GO: -+ case NL80211_IFTYPE_P2P_DEVICE: -diff --git a/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch b/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch -deleted file mode 100644 -index b646ab36dd204205735338c394a71f3bb58bd46a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/319-cfg80211-add-function-for-802.3-conversion-with-sepa.patch -+++ /dev/null -@@ -1,186 +0,0 @@ --From: Felix Fietkau --Date: Tue, 2 Feb 2016 14:39:09 +0100 --Subject: [PATCH] cfg80211: add function for 802.3 conversion with separate -- output buffer -- --Use skb_copy_bits in preparation for allowing fragmented skbs -- --Signed-off-by: Felix Fietkau --Signed-off-by: Johannes Berg ----- -- ----- a/net/wireless/util.c --+++ b/net/wireless/util.c --@@ -393,9 +393,9 @@ unsigned int ieee80211_get_hdrlen_from_s -- } -- EXPORT_SYMBOL(ieee80211_get_hdrlen_from_skb); -- ---unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr) --+static unsigned int __ieee80211_get_mesh_hdrlen(u8 flags) -- { --- int ae = meshhdr->flags & MESH_FLAGS_AE; --+ int ae = flags & MESH_FLAGS_AE; -- /* 802.11-2012, 8.2.4.7.3 */ -- switch (ae) { -- default: --@@ -407,21 +407,31 @@ unsigned int ieee80211_get_mesh_hdrlen(s -- return 18; -- } -- } --+ --+unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr) --+{ --+ return __ieee80211_get_mesh_hdrlen(meshhdr->flags); --+} -- EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen); -- ---int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, --- enum nl80211_iftype iftype) --+static int __ieee80211_data_to_8023(struct sk_buff *skb, struct ethhdr *ehdr, --+ const u8 *addr, enum nl80211_iftype iftype) -- { -- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; --- u16 hdrlen, ethertype; --- u8 *payload; --- u8 dst[ETH_ALEN]; --- u8 src[ETH_ALEN] __aligned(2); --+ struct { --+ u8 hdr[ETH_ALEN] __aligned(2); --+ __be16 proto; --+ } payload; --+ struct ethhdr tmp; --+ u16 hdrlen; --+ u8 mesh_flags = 0; -- -- if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) -- return -1; -- -- hdrlen = ieee80211_hdrlen(hdr->frame_control); --+ if (skb->len < hdrlen + 8) --+ return -1; -- -- /* convert IEEE 802.11 header + possible LLC headers into Ethernet -- * header --@@ -432,8 +442,11 @@ int ieee80211_data_to_8023(struct sk_buf -- * 1 0 BSSID SA DA n/a -- * 1 1 RA TA DA SA -- */ --- memcpy(dst, ieee80211_get_DA(hdr), ETH_ALEN); --- memcpy(src, ieee80211_get_SA(hdr), ETH_ALEN); --+ memcpy(tmp.h_dest, ieee80211_get_DA(hdr), ETH_ALEN); --+ memcpy(tmp.h_source, ieee80211_get_SA(hdr), ETH_ALEN); --+ --+ if (iftype == NL80211_IFTYPE_MESH_POINT) --+ skb_copy_bits(skb, hdrlen, &mesh_flags, 1); -- -- switch (hdr->frame_control & -- cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) { --@@ -450,44 +463,31 @@ int ieee80211_data_to_8023(struct sk_buf -- iftype != NL80211_IFTYPE_STATION)) -- return -1; -- if (iftype == NL80211_IFTYPE_MESH_POINT) { --- struct ieee80211s_hdr *meshdr = --- (struct ieee80211s_hdr *) (skb->data + hdrlen); --- /* make sure meshdr->flags is on the linear part */ --- if (!pskb_may_pull(skb, hdrlen + 1)) --- return -1; --- if (meshdr->flags & MESH_FLAGS_AE_A4) --+ if (mesh_flags & MESH_FLAGS_AE_A4) -- return -1; --- if (meshdr->flags & MESH_FLAGS_AE_A5_A6) { --+ if (mesh_flags & MESH_FLAGS_AE_A5_A6) { -- skb_copy_bits(skb, hdrlen + -- offsetof(struct ieee80211s_hdr, eaddr1), --- dst, ETH_ALEN); --- skb_copy_bits(skb, hdrlen + --- offsetof(struct ieee80211s_hdr, eaddr2), --- src, ETH_ALEN); --+ tmp.h_dest, 2 * ETH_ALEN); -- } --- hdrlen += ieee80211_get_mesh_hdrlen(meshdr); --+ hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags); -- } -- break; -- case cpu_to_le16(IEEE80211_FCTL_FROMDS): -- if ((iftype != NL80211_IFTYPE_STATION && -- iftype != NL80211_IFTYPE_P2P_CLIENT && -- iftype != NL80211_IFTYPE_MESH_POINT) || --- (is_multicast_ether_addr(dst) && --- ether_addr_equal(src, addr))) --+ (is_multicast_ether_addr(tmp.h_dest) && --+ ether_addr_equal(tmp.h_source, addr))) -- return -1; -- if (iftype == NL80211_IFTYPE_MESH_POINT) { --- struct ieee80211s_hdr *meshdr = --- (struct ieee80211s_hdr *) (skb->data + hdrlen); --- /* make sure meshdr->flags is on the linear part */ --- if (!pskb_may_pull(skb, hdrlen + 1)) --- return -1; --- if (meshdr->flags & MESH_FLAGS_AE_A5_A6) --+ if (mesh_flags & MESH_FLAGS_AE_A5_A6) -- return -1; --- if (meshdr->flags & MESH_FLAGS_AE_A4) --+ if (mesh_flags & MESH_FLAGS_AE_A4) -- skb_copy_bits(skb, hdrlen + -- offsetof(struct ieee80211s_hdr, eaddr1), --- src, ETH_ALEN); --- hdrlen += ieee80211_get_mesh_hdrlen(meshdr); --+ tmp.h_source, ETH_ALEN); --+ hdrlen += __ieee80211_get_mesh_hdrlen(mesh_flags); -- } -- break; -- case cpu_to_le16(0): --@@ -498,33 +498,33 @@ int ieee80211_data_to_8023(struct sk_buf -- break; -- } -- --- if (!pskb_may_pull(skb, hdrlen + 8)) --- return -1; --- --- payload = skb->data + hdrlen; --- ethertype = (payload[6] << 8) | payload[7]; --+ skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)); --+ tmp.h_proto = payload.proto; -- --- if (likely((ether_addr_equal(payload, rfc1042_header) && --- ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) || --- ether_addr_equal(payload, bridge_tunnel_header))) { --+ if (likely((ether_addr_equal(payload.hdr, rfc1042_header) && --+ tmp.h_proto != htons(ETH_P_AARP) && --+ tmp.h_proto != htons(ETH_P_IPX)) || --+ ether_addr_equal(payload.hdr, bridge_tunnel_header))) -- /* remove RFC1042 or Bridge-Tunnel encapsulation and -- * replace EtherType */ --- skb_pull(skb, hdrlen + 6); --- memcpy(skb_push(skb, ETH_ALEN), src, ETH_ALEN); --- memcpy(skb_push(skb, ETH_ALEN), dst, ETH_ALEN); --- } else { --- struct ethhdr *ehdr; --- __be16 len; --+ hdrlen += ETH_ALEN + 2; --+ else --+ tmp.h_proto = htons(skb->len); -- --- skb_pull(skb, hdrlen); --- len = htons(skb->len); --+ pskb_pull(skb, hdrlen); --+ --+ if (!ehdr) -- ehdr = (struct ethhdr *) skb_push(skb, sizeof(struct ethhdr)); --- memcpy(ehdr->h_dest, dst, ETH_ALEN); --- memcpy(ehdr->h_source, src, ETH_ALEN); --- ehdr->h_proto = len; --- } --+ memcpy(ehdr, &tmp, sizeof(tmp)); --+ -- return 0; -- } --+ --+int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, --+ enum nl80211_iftype iftype) --+{ --+ return __ieee80211_data_to_8023(skb, NULL, addr, iftype); --+} -- EXPORT_SYMBOL(ieee80211_data_to_8023); -- -- int ieee80211_data_from_8023(struct sk_buff *skb, const u8 *addr, -diff --git a/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch b/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..f8b8f86e03ba0786ef410db31d6de2ab691430bd ---- /dev/null -+++ b/package/kernel/mac80211/patches/320-ath9k-Switch-to-using-mac80211-intermediate-software.patch -@@ -0,0 +1,871 @@ -+From: =?UTF-8?q?Toke=20H=C3=B8iland-J=C3=B8rgensen?= -+Date: Wed, 6 Jul 2016 21:34:17 +0200 -+Subject: [PATCH] ath9k: Switch to using mac80211 intermediate software queues. -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+This switches ath9k over to using the mac80211 intermediate software -+queueing mechanism for data packets. It removes the queueing inside the -+driver, except for the retry queue, and instead pulls from mac80211 when -+a packet is needed. The retry queue is used to store a packet that was -+pulled but can't be sent immediately. -+ -+The old code path in ath_tx_start that would queue packets has been -+removed completely, as has the qlen limit tunables (since there's no -+longer a queue in the driver to limit). -+ -+Based on Tim's original patch set, but reworked quite thoroughly. -+ -+Cc: Tim Shepard -+Cc: Felix Fietkau -+Signed-off-by: Toke Høiland-Jørgensen -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ath9k.h -++++ b/drivers/net/wireless/ath/ath9k/ath9k.h -+@@ -91,7 +91,6 @@ int ath_descdma_setup(struct ath_softc * -+ #define ATH_RXBUF 512 -+ #define ATH_TXBUF 512 -+ #define ATH_TXBUF_RESERVE 5 -+-#define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE) -+ #define ATH_TXMAXTRY 13 -+ #define ATH_MAX_SW_RETRIES 30 -+ -+@@ -145,7 +144,9 @@ int ath_descdma_setup(struct ath_softc * -+ #define BAW_WITHIN(_start, _bawsz, _seqno) \ -+ ((((_seqno) - (_start)) & 4095) < (_bawsz)) -+ -+-#define ATH_AN_2_TID(_an, _tidno) (&(_an)->tid[(_tidno)]) -++#define ATH_STA_2_TID(_sta, _tidno) ((struct ath_atx_tid *)(_sta)->txq[_tidno]->drv_priv) -++#define ATH_VIF_2_TID(_vif) ((struct ath_atx_tid *)(_vif)->txq->drv_priv) -++#define ATH_AN_2_TID(_an, _tidno) ((_an)->sta ? ATH_STA_2_TID((_an)->sta, _tidno) : ATH_VIF_2_TID((_an)->vif)) -+ -+ #define IS_HT_RATE(rate) (rate & 0x80) -+ #define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e)) -+@@ -164,7 +165,6 @@ struct ath_txq { -+ spinlock_t axq_lock; -+ u32 axq_depth; -+ u32 axq_ampdu_depth; -+- bool stopped; -+ bool axq_tx_inprogress; -+ struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; -+ u8 txq_headidx; -+@@ -232,7 +232,6 @@ struct ath_buf { -+ -+ struct ath_atx_tid { -+ struct list_head list; -+- struct sk_buff_head buf_q; -+ struct sk_buff_head retry_q; -+ struct ath_node *an; -+ struct ath_txq *txq; -+@@ -247,13 +246,13 @@ struct ath_atx_tid { -+ s8 bar_index; -+ bool active; -+ bool clear_ps_filter; -++ bool has_queued; -+ }; -+ -+ struct ath_node { -+ struct ath_softc *sc; -+ struct ieee80211_sta *sta; /* station struct we're part of */ -+ struct ieee80211_vif *vif; /* interface with which we're associated */ -+- struct ath_atx_tid tid[IEEE80211_NUM_TIDS]; -+ -+ u16 maxampdu; -+ u8 mpdudensity; -+@@ -276,7 +275,6 @@ struct ath_tx_control { -+ struct ath_node *an; -+ struct ieee80211_sta *sta; -+ u8 paprd; -+- bool force_channel; -+ }; -+ -+ -+@@ -293,7 +291,6 @@ struct ath_tx { -+ struct ath_descdma txdma; -+ struct ath_txq *txq_map[IEEE80211_NUM_ACS]; -+ struct ath_txq *uapsdq; -+- u32 txq_max_pending[IEEE80211_NUM_ACS]; -+ u16 max_aggr_framelen[IEEE80211_NUM_ACS][4][32]; -+ }; -+ -+@@ -585,6 +582,7 @@ void ath9k_release_buffered_frames(struc -+ u16 tids, int nframes, -+ enum ieee80211_frame_release_type reason, -+ bool more_data); -++void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue); -+ -+ /********/ -+ /* VIFs */ -+--- a/drivers/net/wireless/ath/ath9k/channel.c -++++ b/drivers/net/wireless/ath/ath9k/channel.c -+@@ -1007,7 +1007,6 @@ static void ath_scan_send_probe(struct a -+ goto error; -+ -+ txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO]; -+- txctl.force_channel = true; -+ if (ath_tx_start(sc->hw, skb, &txctl)) -+ goto error; -+ -+@@ -1130,7 +1129,6 @@ ath_chanctx_send_vif_ps_frame(struct ath -+ memset(&txctl, 0, sizeof(txctl)); -+ txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO]; -+ txctl.sta = sta; -+- txctl.force_channel = true; -+ if (ath_tx_start(sc->hw, skb, &txctl)) { -+ ieee80211_free_txskb(sc->hw, skb); -+ return false; -+--- a/drivers/net/wireless/ath/ath9k/debug.c -++++ b/drivers/net/wireless/ath/ath9k/debug.c -+@@ -600,7 +600,6 @@ static int read_file_xmit(struct seq_fil -+ PR("MPDUs XRetried: ", xretries); -+ PR("Aggregates: ", a_aggr); -+ PR("AMPDUs Queued HW:", a_queued_hw); -+- PR("AMPDUs Queued SW:", a_queued_sw); -+ PR("AMPDUs Completed:", a_completed); -+ PR("AMPDUs Retried: ", a_retries); -+ PR("AMPDUs XRetried: ", a_xretries); -+@@ -629,8 +628,7 @@ static void print_queue(struct ath_softc -+ seq_printf(file, "%s: %d ", "qnum", txq->axq_qnum); -+ seq_printf(file, "%s: %2d ", "qdepth", txq->axq_depth); -+ seq_printf(file, "%s: %2d ", "ampdu-depth", txq->axq_ampdu_depth); -+- seq_printf(file, "%s: %3d ", "pending", txq->pending_frames); -+- seq_printf(file, "%s: %d\n", "stopped", txq->stopped); -++ seq_printf(file, "%s: %3d\n", "pending", txq->pending_frames); -+ -+ ath_txq_unlock(sc, txq); -+ } -+@@ -1208,7 +1206,6 @@ static const char ath9k_gstrings_stats[] -+ AMKSTR(d_tx_mpdu_xretries), -+ AMKSTR(d_tx_aggregates), -+ AMKSTR(d_tx_ampdus_queued_hw), -+- AMKSTR(d_tx_ampdus_queued_sw), -+ AMKSTR(d_tx_ampdus_completed), -+ AMKSTR(d_tx_ampdu_retries), -+ AMKSTR(d_tx_ampdu_xretries), -+@@ -1288,7 +1285,6 @@ void ath9k_get_et_stats(struct ieee80211 -+ AWDATA(xretries); -+ AWDATA(a_aggr); -+ AWDATA(a_queued_hw); -+- AWDATA(a_queued_sw); -+ AWDATA(a_completed); -+ AWDATA(a_retries); -+ AWDATA(a_xretries); -+@@ -1346,14 +1342,6 @@ int ath9k_init_debug(struct ath_hw *ah) -+ read_file_xmit); -+ debugfs_create_devm_seqfile(sc->dev, "queues", sc->debug.debugfs_phy, -+ read_file_queues); -+- debugfs_create_u32("qlen_bk", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+- &sc->tx.txq_max_pending[IEEE80211_AC_BK]); -+- debugfs_create_u32("qlen_be", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+- &sc->tx.txq_max_pending[IEEE80211_AC_BE]); -+- debugfs_create_u32("qlen_vi", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+- &sc->tx.txq_max_pending[IEEE80211_AC_VI]); -+- debugfs_create_u32("qlen_vo", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, -+- &sc->tx.txq_max_pending[IEEE80211_AC_VO]); -+ debugfs_create_devm_seqfile(sc->dev, "misc", sc->debug.debugfs_phy, -+ read_file_misc); -+ debugfs_create_devm_seqfile(sc->dev, "reset", sc->debug.debugfs_phy, -+--- a/drivers/net/wireless/ath/ath9k/debug.h -++++ b/drivers/net/wireless/ath/ath9k/debug.h -+@@ -147,7 +147,6 @@ struct ath_interrupt_stats { -+ * @completed: Total MPDUs (non-aggr) completed -+ * @a_aggr: Total no. of aggregates queued -+ * @a_queued_hw: Total AMPDUs queued to hardware -+- * @a_queued_sw: Total AMPDUs queued to software queues -+ * @a_completed: Total AMPDUs completed -+ * @a_retries: No. of AMPDUs retried (SW) -+ * @a_xretries: No. of AMPDUs dropped due to xretries -+@@ -174,7 +173,6 @@ struct ath_tx_stats { -+ u32 xretries; -+ u32 a_aggr; -+ u32 a_queued_hw; -+- u32 a_queued_sw; -+ u32 a_completed; -+ u32 a_retries; -+ u32 a_xretries; -+--- a/drivers/net/wireless/ath/ath9k/debug_sta.c -++++ b/drivers/net/wireless/ath/ath9k/debug_sta.c -+@@ -52,8 +52,8 @@ static ssize_t read_file_node_aggr(struc -+ "TID", "SEQ_START", "SEQ_NEXT", "BAW_SIZE", -+ "BAW_HEAD", "BAW_TAIL", "BAR_IDX", "SCHED", "PAUSED"); -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ATH_STA_2_TID(an->sta, tidno); -+ txq = tid->txq; -+ ath_txq_lock(sc, txq); -+ if (tid->active) { -+--- a/drivers/net/wireless/ath/ath9k/init.c -++++ b/drivers/net/wireless/ath/ath9k/init.c -+@@ -358,7 +358,6 @@ static int ath9k_init_queues(struct ath_ -+ for (i = 0; i < IEEE80211_NUM_ACS; i++) { -+ sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i); -+ sc->tx.txq_map[i]->mac80211_qnum = i; -+- sc->tx.txq_max_pending[i] = ATH_MAX_QDEPTH; -+ } -+ return 0; -+ } -+@@ -873,6 +872,7 @@ static void ath9k_set_hw_capab(struct at -+ hw->max_rate_tries = 10; -+ hw->sta_data_size = sizeof(struct ath_node); -+ hw->vif_data_size = sizeof(struct ath_vif); -++ hw->txq_data_size = sizeof(struct ath_atx_tid); -+ hw->extra_tx_headroom = 4; -+ -+ hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1; -+--- a/drivers/net/wireless/ath/ath9k/main.c -++++ b/drivers/net/wireless/ath/ath9k/main.c -+@@ -2695,4 +2695,5 @@ struct ieee80211_ops ath9k_ops = { -+ .sw_scan_start = ath9k_sw_scan_start, -+ .sw_scan_complete = ath9k_sw_scan_complete, -+ .get_txpower = ath9k_get_txpower, -++ .wake_tx_queue = ath9k_wake_tx_queue, -+ }; -+--- a/drivers/net/wireless/ath/ath9k/xmit.c -++++ b/drivers/net/wireless/ath/ath9k/xmit.c -+@@ -65,6 +65,8 @@ static struct ath_buf *ath_tx_setup_buff -+ struct ath_txq *txq, -+ struct ath_atx_tid *tid, -+ struct sk_buff *skb); -++static int ath_tx_prepare(struct ieee80211_hw *hw, struct sk_buff *skb, -++ struct ath_tx_control *txctl); -+ -+ enum { -+ MCS_HT20, -+@@ -118,6 +120,26 @@ static void ath_tx_queue_tid(struct ath_ -+ list_add_tail(&tid->list, list); -+ } -+ -++void ath9k_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *queue) -++{ -++ struct ath_softc *sc = hw->priv; -++ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -++ struct ath_atx_tid *tid = (struct ath_atx_tid *) queue->drv_priv; -++ struct ath_txq *txq = tid->txq; -++ -++ ath_dbg(common, QUEUE, "Waking TX queue: %pM (%d)\n", -++ queue->sta ? queue->sta->addr : queue->vif->addr, -++ tid->tidno); -++ -++ ath_txq_lock(sc, txq); -++ -++ tid->has_queued = true; -++ ath_tx_queue_tid(sc, txq, tid); -++ ath_txq_schedule(sc, txq); -++ -++ ath_txq_unlock(sc, txq); -++} -++ -+ static struct ath_frame_info *get_frame_info(struct sk_buff *skb) -+ { -+ struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); -+@@ -160,7 +182,6 @@ static void ath_set_rates(struct ieee802 -+ static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq, -+ struct sk_buff *skb) -+ { -+- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -+ struct ath_frame_info *fi = get_frame_info(skb); -+ int q = fi->txq; -+ -+@@ -171,14 +192,6 @@ static void ath_txq_skb_done(struct ath_ -+ if (WARN_ON(--txq->pending_frames < 0)) -+ txq->pending_frames = 0; -+ -+- if (txq->stopped && -+- txq->pending_frames < sc->tx.txq_max_pending[q]) { -+- if (ath9k_is_chanctx_enabled()) -+- ieee80211_wake_queue(sc->hw, info->hw_queue); -+- else -+- ieee80211_wake_queue(sc->hw, q); -+- txq->stopped = false; -+- } -+ } -+ -+ static struct ath_atx_tid * -+@@ -188,9 +201,47 @@ ath_get_skb_tid(struct ath_softc *sc, st -+ return ATH_AN_2_TID(an, tidno); -+ } -+ -++static struct sk_buff * -++ath_tid_pull(struct ath_atx_tid *tid) -++{ -++ struct ath_softc *sc = tid->an->sc; -++ struct ieee80211_hw *hw = sc->hw; -++ struct ath_tx_control txctl = { -++ .txq = tid->txq, -++ .sta = tid->an->sta, -++ }; -++ struct sk_buff *skb; -++ struct ath_frame_info *fi; -++ int q; -++ -++ if (!tid->has_queued) -++ return NULL; -++ -++ skb = ieee80211_tx_dequeue(hw, container_of((void*)tid, struct ieee80211_txq, drv_priv)); -++ if (!skb) { -++ tid->has_queued = false; -++ return NULL; -++ } -++ -++ if (ath_tx_prepare(hw, skb, &txctl)) { -++ ieee80211_free_txskb(hw, skb); -++ return NULL; -++ } -++ -++ q = skb_get_queue_mapping(skb); -++ if (tid->txq == sc->tx.txq_map[q]) { -++ fi = get_frame_info(skb); -++ fi->txq = q; -++ ++tid->txq->pending_frames; -++ } -++ -++ return skb; -++ } -++ -++ -+ static bool ath_tid_has_buffered(struct ath_atx_tid *tid) -+ { -+- return !skb_queue_empty(&tid->buf_q) || !skb_queue_empty(&tid->retry_q); -++ return !skb_queue_empty(&tid->retry_q) || tid->has_queued; -+ } -+ -+ static struct sk_buff *ath_tid_dequeue(struct ath_atx_tid *tid) -+@@ -199,46 +250,11 @@ static struct sk_buff *ath_tid_dequeue(s -+ -+ skb = __skb_dequeue(&tid->retry_q); -+ if (!skb) -+- skb = __skb_dequeue(&tid->buf_q); -++ skb = ath_tid_pull(tid); -+ -+ return skb; -+ } -+ -+-/* -+- * ath_tx_tid_change_state: -+- * - clears a-mpdu flag of previous session -+- * - force sequence number allocation to fix next BlockAck Window -+- */ -+-static void -+-ath_tx_tid_change_state(struct ath_softc *sc, struct ath_atx_tid *tid) -+-{ -+- struct ath_txq *txq = tid->txq; -+- struct ieee80211_tx_info *tx_info; -+- struct sk_buff *skb, *tskb; -+- struct ath_buf *bf; -+- struct ath_frame_info *fi; -+- -+- skb_queue_walk_safe(&tid->buf_q, skb, tskb) { -+- fi = get_frame_info(skb); -+- bf = fi->bf; -+- -+- tx_info = IEEE80211_SKB_CB(skb); -+- tx_info->flags &= ~IEEE80211_TX_CTL_AMPDU; -+- -+- if (bf) -+- continue; -+- -+- bf = ath_tx_setup_buffer(sc, txq, tid, skb); -+- if (!bf) { -+- __skb_unlink(skb, &tid->buf_q); -+- ath_txq_skb_done(sc, txq, skb); -+- ieee80211_free_txskb(sc->hw, skb); -+- continue; -+- } -+- } -+- -+-} -+- -+ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) -+ { -+ struct ath_txq *txq = tid->txq; -+@@ -873,20 +889,16 @@ static int ath_compute_num_delims(struct -+ -+ static struct ath_buf * -+ ath_tx_get_tid_subframe(struct ath_softc *sc, struct ath_txq *txq, -+- struct ath_atx_tid *tid, struct sk_buff_head **q) -++ struct ath_atx_tid *tid) -+ { -+ struct ieee80211_tx_info *tx_info; -+ struct ath_frame_info *fi; -+- struct sk_buff *skb; -++ struct sk_buff *skb, *first_skb = NULL; -+ struct ath_buf *bf; -+ u16 seqno; -+ -+ while (1) { -+- *q = &tid->retry_q; -+- if (skb_queue_empty(*q)) -+- *q = &tid->buf_q; -+- -+- skb = skb_peek(*q); -++ skb = ath_tid_dequeue(tid); -+ if (!skb) -+ break; -+ -+@@ -898,7 +910,6 @@ ath_tx_get_tid_subframe(struct ath_softc -+ bf->bf_state.stale = false; -+ -+ if (!bf) { -+- __skb_unlink(skb, *q); -+ ath_txq_skb_done(sc, txq, skb); -+ ieee80211_free_txskb(sc->hw, skb); -+ continue; -+@@ -927,8 +938,19 @@ ath_tx_get_tid_subframe(struct ath_softc -+ seqno = bf->bf_state.seqno; -+ -+ /* do not step over block-ack window */ -+- if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) -++ if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) { -++ __skb_queue_tail(&tid->retry_q, skb); -++ -++ /* If there are other skbs in the retry q, they are -++ * probably within the BAW, so loop immediately to get -++ * one of them. Otherwise the queue can get stuck. */ -++ if (!skb_queue_is_first(&tid->retry_q, skb) && skb != first_skb) { -++ if(!first_skb) /* infinite loop prevention */ -++ first_skb = skb; -++ continue; -++ } -+ break; -++ } -+ -+ if (tid->bar_index > ATH_BA_INDEX(tid->seq_start, seqno)) { -+ struct ath_tx_status ts = {}; -+@@ -936,7 +958,6 @@ ath_tx_get_tid_subframe(struct ath_softc -+ -+ INIT_LIST_HEAD(&bf_head); -+ list_add(&bf->list, &bf_head); -+- __skb_unlink(skb, *q); -+ ath_tx_update_baw(sc, tid, seqno); -+ ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); -+ continue; -+@@ -948,11 +969,10 @@ ath_tx_get_tid_subframe(struct ath_softc -+ return NULL; -+ } -+ -+-static bool -++static int -+ ath_tx_form_aggr(struct ath_softc *sc, struct ath_txq *txq, -+ struct ath_atx_tid *tid, struct list_head *bf_q, -+- struct ath_buf *bf_first, struct sk_buff_head *tid_q, -+- int *aggr_len) -++ struct ath_buf *bf_first) -+ { -+ #define PADBYTES(_len) ((4 - ((_len) % 4)) % 4) -+ struct ath_buf *bf = bf_first, *bf_prev = NULL; -+@@ -962,12 +982,13 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ struct ieee80211_tx_info *tx_info; -+ struct ath_frame_info *fi; -+ struct sk_buff *skb; -+- bool closed = false; -++ -+ -+ bf = bf_first; -+ aggr_limit = ath_lookup_rate(sc, bf, tid); -+ -+- do { -++ while (bf) -++ { -+ skb = bf->bf_mpdu; -+ fi = get_frame_info(skb); -+ -+@@ -976,12 +997,12 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ if (nframes) { -+ if (aggr_limit < al + bpad + al_delta || -+ ath_lookup_legacy(bf) || nframes >= h_baw) -+- break; -++ goto stop; -+ -+ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); -+ if ((tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) || -+ !(tx_info->flags & IEEE80211_TX_CTL_AMPDU)) -+- break; -++ goto stop; -+ } -+ -+ /* add padding for previous frame to aggregation length */ -+@@ -1003,20 +1024,18 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ ath_tx_addto_baw(sc, tid, bf); -+ bf->bf_state.ndelim = ndelim; -+ -+- __skb_unlink(skb, tid_q); -+ list_add_tail(&bf->list, bf_q); -+ if (bf_prev) -+ bf_prev->bf_next = bf; -+ -+ bf_prev = bf; -+ -+- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); -+- if (!bf) { -+- closed = true; -+- break; -+- } -+- } while (ath_tid_has_buffered(tid)); -+- -++ bf = ath_tx_get_tid_subframe(sc, txq, tid); -++ } -++ goto finish; -++stop: -++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); -++finish: -+ bf = bf_first; -+ bf->bf_lastbf = bf_prev; -+ -+@@ -1027,9 +1046,7 @@ ath_tx_form_aggr(struct ath_softc *sc, s -+ TX_STAT_INC(txq->axq_qnum, a_aggr); -+ } -+ -+- *aggr_len = al; -+- -+- return closed; -++ return al; -+ #undef PADBYTES -+ } -+ -+@@ -1406,18 +1423,15 @@ static void ath_tx_fill_desc(struct ath_ -+ static void -+ ath_tx_form_burst(struct ath_softc *sc, struct ath_txq *txq, -+ struct ath_atx_tid *tid, struct list_head *bf_q, -+- struct ath_buf *bf_first, struct sk_buff_head *tid_q) -++ struct ath_buf *bf_first) -+ { -+ struct ath_buf *bf = bf_first, *bf_prev = NULL; -+- struct sk_buff *skb; -+ int nframes = 0; -+ -+ do { -+ struct ieee80211_tx_info *tx_info; -+- skb = bf->bf_mpdu; -+ -+ nframes++; -+- __skb_unlink(skb, tid_q); -+ list_add_tail(&bf->list, bf_q); -+ if (bf_prev) -+ bf_prev->bf_next = bf; -+@@ -1426,13 +1440,15 @@ ath_tx_form_burst(struct ath_softc *sc, -+ if (nframes >= 2) -+ break; -+ -+- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); -++ bf = ath_tx_get_tid_subframe(sc, txq, tid); -+ if (!bf) -+ break; -+ -+ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); -+- if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) -++ if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) { -++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); -+ break; -++ } -+ -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, false); -+ } while (1); -+@@ -1443,34 +1459,33 @@ static bool ath_tx_sched_aggr(struct ath -+ { -+ struct ath_buf *bf; -+ struct ieee80211_tx_info *tx_info; -+- struct sk_buff_head *tid_q; -+ struct list_head bf_q; -+ int aggr_len = 0; -+- bool aggr, last = true; -++ bool aggr; -+ -+ if (!ath_tid_has_buffered(tid)) -+ return false; -+ -+ INIT_LIST_HEAD(&bf_q); -+ -+- bf = ath_tx_get_tid_subframe(sc, txq, tid, &tid_q); -++ bf = ath_tx_get_tid_subframe(sc, txq, tid); -+ if (!bf) -+ return false; -+ -+ tx_info = IEEE80211_SKB_CB(bf->bf_mpdu); -+ aggr = !!(tx_info->flags & IEEE80211_TX_CTL_AMPDU); -+ if ((aggr && txq->axq_ampdu_depth >= ATH_AGGR_MIN_QDEPTH) || -+- (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { -++ (!aggr && txq->axq_depth >= ATH_NON_AGGR_MIN_QDEPTH)) { -++ __skb_queue_tail(&tid->retry_q, bf->bf_mpdu); -+ *stop = true; -+ return false; -+ } -+ -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, false); -+ if (aggr) -+- last = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf, -+- tid_q, &aggr_len); -++ aggr_len = ath_tx_form_aggr(sc, txq, tid, &bf_q, bf); -+ else -+- ath_tx_form_burst(sc, txq, tid, &bf_q, bf, tid_q); -++ ath_tx_form_burst(sc, txq, tid, &bf_q, bf); -+ -+ if (list_empty(&bf_q)) -+ return false; -+@@ -1513,9 +1528,6 @@ int ath_tx_aggr_start(struct ath_softc * -+ an->mpdudensity = density; -+ } -+ -+- /* force sequence number allocation for pending frames */ -+- ath_tx_tid_change_state(sc, txtid); -+- -+ txtid->active = true; -+ *ssn = txtid->seq_start = txtid->seq_next; -+ txtid->bar_index = -1; -+@@ -1540,7 +1552,6 @@ void ath_tx_aggr_stop(struct ath_softc * -+ ath_txq_lock(sc, txq); -+ txtid->active = false; -+ ath_tx_flush_tid(sc, txtid); -+- ath_tx_tid_change_state(sc, txtid); -+ ath_txq_unlock_complete(sc, txq); -+ } -+ -+@@ -1550,14 +1561,12 @@ void ath_tx_aggr_sleep(struct ieee80211_ -+ struct ath_common *common = ath9k_hw_common(sc->sc_ah); -+ struct ath_atx_tid *tid; -+ struct ath_txq *txq; -+- bool buffered; -+ int tidno; -+ -+ ath_dbg(common, XMIT, "%s called\n", __func__); -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { -+- -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ATH_AN_2_TID(an, tidno); -+ txq = tid->txq; -+ -+ ath_txq_lock(sc, txq); -+@@ -1567,13 +1576,12 @@ void ath_tx_aggr_sleep(struct ieee80211_ -+ continue; -+ } -+ -+- buffered = ath_tid_has_buffered(tid); -++ if (!skb_queue_empty(&tid->retry_q)) -++ ieee80211_sta_set_buffered(sta, tid->tidno, true); -+ -+ list_del_init(&tid->list); -+ -+ ath_txq_unlock(sc, txq); -+- -+- ieee80211_sta_set_buffered(sta, tidno, buffered); -+ } -+ } -+ -+@@ -1586,19 +1594,16 @@ void ath_tx_aggr_wakeup(struct ath_softc -+ -+ ath_dbg(common, XMIT, "%s called\n", __func__); -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { -+- -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ATH_AN_2_TID(an, tidno); -+ txq = tid->txq; -+ -+ ath_txq_lock(sc, txq); -+ tid->clear_ps_filter = true; -+- -+ if (ath_tid_has_buffered(tid)) { -+ ath_tx_queue_tid(sc, txq, tid); -+ ath_txq_schedule(sc, txq); -+ } -+- -+ ath_txq_unlock_complete(sc, txq); -+ } -+ } -+@@ -1621,11 +1626,6 @@ void ath_tx_aggr_resume(struct ath_softc -+ -+ tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; -+ -+- if (ath_tid_has_buffered(tid)) { -+- ath_tx_queue_tid(sc, txq, tid); -+- ath_txq_schedule(sc, txq); -+- } -+- -+ ath_txq_unlock_complete(sc, txq); -+ } -+ -+@@ -1641,7 +1641,6 @@ void ath9k_release_buffered_frames(struc -+ struct ieee80211_tx_info *info; -+ struct list_head bf_q; -+ struct ath_buf *bf_tail = NULL, *bf; -+- struct sk_buff_head *tid_q; -+ int sent = 0; -+ int i; -+ -+@@ -1656,11 +1655,10 @@ void ath9k_release_buffered_frames(struc -+ -+ ath_txq_lock(sc, tid->txq); -+ while (nframes > 0) { -+- bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid, &tid_q); -++ bf = ath_tx_get_tid_subframe(sc, sc->tx.uapsdq, tid); -+ if (!bf) -+ break; -+ -+- __skb_unlink(bf->bf_mpdu, tid_q); -+ list_add_tail(&bf->list, &bf_q); -+ ath_set_rates(tid->an->vif, tid->an->sta, bf, true); -+ if (bf_isampdu(bf)) { -+@@ -1675,7 +1673,7 @@ void ath9k_release_buffered_frames(struc -+ sent++; -+ TX_STAT_INC(txq->axq_qnum, a_queued_hw); -+ -+- if (an->sta && !ath_tid_has_buffered(tid)) -++ if (an->sta && skb_queue_empty(&tid->retry_q)) -+ ieee80211_sta_set_buffered(an->sta, i, false); -+ } -+ ath_txq_unlock_complete(sc, tid->txq); -+@@ -1902,13 +1900,7 @@ bool ath_drain_all_txq(struct ath_softc -+ if (!ATH_TXQ_SETUP(sc, i)) -+ continue; -+ -+- /* -+- * The caller will resume queues with ieee80211_wake_queues. -+- * Mark the queue as not stopped to prevent ath_tx_complete -+- * from waking the queue too early. -+- */ -+ txq = &sc->tx.txq[i]; -+- txq->stopped = false; -+ ath_draintxq(sc, txq); -+ } -+ -+@@ -2308,15 +2300,12 @@ int ath_tx_start(struct ieee80211_hw *hw -+ struct ath_txq *txq = txctl->txq; -+ struct ath_atx_tid *tid = NULL; -+ struct ath_buf *bf; -+- bool queue, ps_resp; -++ bool ps_resp; -+ int q, ret; -+ -+ if (vif) -+ avp = (void *)vif->drv_priv; -+ -+- if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) -+- txctl->force_channel = true; -+- -+ ps_resp = !!(info->control.flags & IEEE80211_TX_CTRL_PS_RESPONSE); -+ -+ ret = ath_tx_prepare(hw, skb, txctl); -+@@ -2331,63 +2320,13 @@ int ath_tx_start(struct ieee80211_hw *hw -+ -+ q = skb_get_queue_mapping(skb); -+ -++ if (ps_resp) -++ txq = sc->tx.uapsdq; -++ -+ ath_txq_lock(sc, txq); -+ if (txq == sc->tx.txq_map[q]) { -+ fi->txq = q; -+- if (++txq->pending_frames > sc->tx.txq_max_pending[q] && -+- !txq->stopped) { -+- if (ath9k_is_chanctx_enabled()) -+- ieee80211_stop_queue(sc->hw, info->hw_queue); -+- else -+- ieee80211_stop_queue(sc->hw, q); -+- txq->stopped = true; -+- } -+- } -+- -+- queue = ieee80211_is_data_present(hdr->frame_control); -+- -+- /* If chanctx, queue all null frames while NOA could be there */ -+- if (ath9k_is_chanctx_enabled() && -+- ieee80211_is_nullfunc(hdr->frame_control) && -+- !txctl->force_channel) -+- queue = true; -+- -+- /* Force queueing of all frames that belong to a virtual interface on -+- * a different channel context, to ensure that they are sent on the -+- * correct channel. -+- */ -+- if (((avp && avp->chanctx != sc->cur_chan) || -+- sc->cur_chan->stopped) && !txctl->force_channel) { -+- if (!txctl->an) -+- txctl->an = &avp->mcast_node; -+- queue = true; -+- ps_resp = false; -+- } -+- -+- if (txctl->an && queue) -+- tid = ath_get_skb_tid(sc, txctl->an, skb); -+- -+- if (ps_resp) { -+- ath_txq_unlock(sc, txq); -+- txq = sc->tx.uapsdq; -+- ath_txq_lock(sc, txq); -+- } else if (txctl->an && queue) { -+- WARN_ON(tid->txq != txctl->txq); -+- -+- if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT) -+- tid->clear_ps_filter = true; -+- -+- /* -+- * Add this frame to software queue for scheduling later -+- * for aggregation. -+- */ -+- TX_STAT_INC(txq->axq_qnum, a_queued_sw); -+- __skb_queue_tail(&tid->buf_q, skb); -+- if (!txctl->an->sleeping) -+- ath_tx_queue_tid(sc, txq, tid); -+- -+- ath_txq_schedule(sc, txq); -+- goto out; -++ ++txq->pending_frames; -+ } -+ -+ bf = ath_tx_setup_buffer(sc, txq, tid, skb); -+@@ -2871,9 +2810,8 @@ void ath_tx_node_init(struct ath_softc * -+ struct ath_atx_tid *tid; -+ int tidno, acno; -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; -+- tidno++, tid++) { -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ATH_AN_2_TID(an, tidno); -+ tid->an = an; -+ tid->tidno = tidno; -+ tid->seq_start = tid->seq_next = 0; -+@@ -2881,11 +2819,14 @@ void ath_tx_node_init(struct ath_softc * -+ tid->baw_head = tid->baw_tail = 0; -+ tid->active = false; -+ tid->clear_ps_filter = true; -+- __skb_queue_head_init(&tid->buf_q); -++ tid->has_queued = false; -+ __skb_queue_head_init(&tid->retry_q); -+ INIT_LIST_HEAD(&tid->list); -+ acno = TID_TO_WME_AC(tidno); -+ tid->txq = sc->tx.txq_map[acno]; -++ -++ if (!an->sta) -++ break; /* just one multicast ath_atx_tid */ -+ } -+ } -+ -+@@ -2895,9 +2836,8 @@ void ath_tx_node_cleanup(struct ath_soft -+ struct ath_txq *txq; -+ int tidno; -+ -+- for (tidno = 0, tid = &an->tid[tidno]; -+- tidno < IEEE80211_NUM_TIDS; tidno++, tid++) { -+- -++ for (tidno = 0; tidno < IEEE80211_NUM_TIDS; tidno++) { -++ tid = ATH_AN_2_TID(an, tidno); -+ txq = tid->txq; -+ -+ ath_txq_lock(sc, txq); -+@@ -2909,6 +2849,9 @@ void ath_tx_node_cleanup(struct ath_soft -+ tid->active = false; -+ -+ ath_txq_unlock(sc, txq); -++ -++ if (!an->sta) -++ break; /* just one multicast ath_atx_tid */ -+ } -+ } -+ -diff --git a/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch b/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch -deleted file mode 100644 -index 2eeed22af0adb5e8386f5f5e75af725bbf71ec7b..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/320-cfg80211-add-support-for-non-linear-skbs-in-ieee8021.patch -+++ /dev/null -@@ -1,159 +0,0 @@ --From: Felix Fietkau --Date: Tue, 2 Feb 2016 14:39:10 +0100 --Subject: [PATCH] cfg80211: add support for non-linear skbs in -- ieee80211_amsdu_to_8023s -- --Signed-off-by: Felix Fietkau --Signed-off-by: Johannes Berg ----- -- ----- a/net/wireless/util.c --+++ b/net/wireless/util.c --@@ -644,73 +644,75 @@ int ieee80211_data_from_8023(struct sk_b -- } -- EXPORT_SYMBOL(ieee80211_data_from_8023); -- --+static struct sk_buff * --+__ieee80211_amsdu_copy(struct sk_buff *skb, unsigned int hlen, --+ int offset, int len) --+{ --+ struct sk_buff *frame; --+ --+ if (skb->len - offset < len) --+ return NULL; --+ --+ /* --+ * Allocate and reserve two bytes more for payload --+ * alignment since sizeof(struct ethhdr) is 14. --+ */ --+ frame = dev_alloc_skb(hlen + sizeof(struct ethhdr) + 2 + len); --+ --+ skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2); --+ skb_copy_bits(skb, offset, skb_put(frame, len), len); --+ --+ return frame; --+} -- -- void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, -- const u8 *addr, enum nl80211_iftype iftype, -- const unsigned int extra_headroom, -- bool has_80211_header) -- { --+ unsigned int hlen = ALIGN(extra_headroom, 4); -- struct sk_buff *frame = NULL; -- u16 ethertype; -- u8 *payload; --- const struct ethhdr *eth; --- int remaining, err; --- u8 dst[ETH_ALEN], src[ETH_ALEN]; --- --- if (skb_linearize(skb)) --- goto out; --+ int offset = 0, remaining, err; --+ struct ethhdr eth; --+ bool reuse_skb = true; --+ bool last = false; -- -- if (has_80211_header) { --- err = ieee80211_data_to_8023(skb, addr, iftype); --+ err = __ieee80211_data_to_8023(skb, ð, addr, iftype); -- if (err) -- goto out; --- --- /* skip the wrapping header */ --- eth = (struct ethhdr *) skb_pull(skb, sizeof(struct ethhdr)); --- if (!eth) --- goto out; --- } else { --- eth = (struct ethhdr *) skb->data; -- } -- --- while (skb != frame) { --+ while (!last) { --+ unsigned int subframe_len; --+ int len; -- u8 padding; --- __be16 len = eth->h_proto; --- unsigned int subframe_len = sizeof(struct ethhdr) + ntohs(len); --- --- remaining = skb->len; --- memcpy(dst, eth->h_dest, ETH_ALEN); --- memcpy(src, eth->h_source, ETH_ALEN); -- --+ skb_copy_bits(skb, offset, ð, sizeof(eth)); --+ len = ntohs(eth.h_proto); --+ subframe_len = sizeof(struct ethhdr) + len; -- padding = (4 - subframe_len) & 0x3; --+ -- /* the last MSDU has no padding */ --+ remaining = skb->len - offset; -- if (subframe_len > remaining) -- goto purge; -- --- skb_pull(skb, sizeof(struct ethhdr)); --+ offset += sizeof(struct ethhdr); -- /* reuse skb for the last subframe */ --- if (remaining <= subframe_len + padding) --+ last = remaining <= subframe_len + padding; --+ if (!skb_is_nonlinear(skb) && last) { --+ skb_pull(skb, offset); -- frame = skb; --- else { --- unsigned int hlen = ALIGN(extra_headroom, 4); --- /* --- * Allocate and reserve two bytes more for payload --- * alignment since sizeof(struct ethhdr) is 14. --- */ --- frame = dev_alloc_skb(hlen + subframe_len + 2); --+ reuse_skb = true; --+ } else { --+ frame = __ieee80211_amsdu_copy(skb, hlen, offset, len); -- if (!frame) -- goto purge; -- --- skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2); --- memcpy(skb_put(frame, ntohs(len)), skb->data, --- ntohs(len)); --- --- eth = (struct ethhdr *)skb_pull(skb, ntohs(len) + --- padding); --- if (!eth) { --- dev_kfree_skb(frame); --- goto purge; --- } --+ offset += len + padding; -- } -- -- skb_reset_network_header(frame); --@@ -719,24 +721,20 @@ void ieee80211_amsdu_to_8023s(struct sk_ -- -- payload = frame->data; -- ethertype = (payload[6] << 8) | payload[7]; --- -- if (likely((ether_addr_equal(payload, rfc1042_header) && -- ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) || -- ether_addr_equal(payload, bridge_tunnel_header))) { --- /* remove RFC1042 or Bridge-Tunnel --- * encapsulation and replace EtherType */ --- skb_pull(frame, 6); --- memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN); --- memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN); --- } else { --- memcpy(skb_push(frame, sizeof(__be16)), &len, --- sizeof(__be16)); --- memcpy(skb_push(frame, ETH_ALEN), src, ETH_ALEN); --- memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN); --+ eth.h_proto = htons(ethertype); --+ skb_pull(frame, ETH_ALEN + 2); -- } --+ --+ memcpy(skb_push(frame, sizeof(eth)), ð, sizeof(eth)); -- __skb_queue_tail(list, frame); -- } -- --+ if (!reuse_skb) --+ dev_kfree_skb(skb); --+ -- return; -- -- purge: -diff --git a/package/kernel/mac80211/patches/321-ath9k_hw-reset-AHB-WMAC-interface-on-AR91xx.patch b/package/kernel/mac80211/patches/321-ath9k_hw-reset-AHB-WMAC-interface-on-AR91xx.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..9caa76dc5d40a2fe2ce332e549bfba762a1431d5 ---- /dev/null -+++ b/package/kernel/mac80211/patches/321-ath9k_hw-reset-AHB-WMAC-interface-on-AR91xx.patch -@@ -0,0 +1,25 @@ -+From: Felix Fietkau -+Date: Sat, 9 Jul 2016 15:25:24 +0200 -+Subject: [PATCH] ath9k_hw: reset AHB-WMAC interface on AR91xx -+ -+Should fix a few stability issues -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/hw.c -++++ b/drivers/net/wireless/ath/ath9k/hw.c -+@@ -1398,8 +1398,12 @@ static bool ath9k_hw_set_reset(struct at -+ if (!AR_SREV_9100(ah)) -+ REG_WRITE(ah, AR_RC, 0); -+ -+- if (AR_SREV_9100(ah)) -++ if (AR_SREV_9100(ah)) { -++ /* Reset the AHB-WMAC interface */ -++ if (ah->external_reset) -++ ah->external_reset(); -+ udelay(50); -++ } -+ -+ return true; -+ } -diff --git a/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch b/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch -deleted file mode 100644 -index c4155a118101fb910100de80f4ac7f6da1787a1c..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/321-mac80211-Parse-legacy-and-HT-rate-in-injected-frames.patch -+++ /dev/null -@@ -1,155 +0,0 @@ --From: Sven Eckelmann --Date: Tue, 26 Jan 2016 17:11:13 +0100 --Subject: [PATCH] mac80211: Parse legacy and HT rate in injected frames -- --Drivers/devices without their own rate control algorithm can get the --information what rates they should use from either the radiotap header of --injected frames or from the rate control algorithm. But the parsing of the --legacy rate information from the radiotap header was removed in commit --e6a9854b05c1 ("mac80211/drivers: rewrite the rate control API"). -- --The removal of this feature heavily reduced the usefulness of frame --injection when wanting to simulate specific transmission behavior. Having --rate parsing together with MCS rates and retry support allows a fine --grained selection of the tx behavior of injected frames for these kind of --tests. -- --Signed-off-by: Sven Eckelmann --Cc: Simon Wunderlich --Signed-off-by: Johannes Berg ----- -- ----- a/include/net/mac80211.h --+++ b/include/net/mac80211.h --@@ -708,12 +708,14 @@ enum mac80211_tx_info_flags { -- * protocol frame (e.g. EAP) -- * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll -- * frame (PS-Poll or uAPSD). --+ * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information -- * -- * These flags are used in tx_info->control.flags. -- */ -- enum mac80211_tx_control_flags { -- IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), -- IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), --+ IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), -- }; -- -- /* ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -710,6 +710,10 @@ ieee80211_tx_h_rate_ctrl(struct ieee8021 -- -- info->control.short_preamble = txrc.short_preamble; -- --+ /* don't ask rate control when rate already injected via radiotap */ --+ if (info->control.flags & IEEE80211_TX_CTRL_RATE_INJECT) --+ return TX_CONTINUE; --+ -- if (tx->sta) -- assoc = test_sta_flag(tx->sta, WLAN_STA_ASSOC); -- --@@ -1665,15 +1669,24 @@ void ieee80211_xmit(struct ieee80211_sub -- ieee80211_tx(sdata, sta, skb, false); -- } -- ---static bool ieee80211_parse_tx_radiotap(struct sk_buff *skb) --+static bool ieee80211_parse_tx_radiotap(struct ieee80211_local *local, --+ struct sk_buff *skb) -- { -- struct ieee80211_radiotap_iterator iterator; -- struct ieee80211_radiotap_header *rthdr = -- (struct ieee80211_radiotap_header *) skb->data; -- struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); --+ struct ieee80211_supported_band *sband = --+ local->hw.wiphy->bands[info->band]; -- int ret = ieee80211_radiotap_iterator_init(&iterator, rthdr, skb->len, -- NULL); -- u16 txflags; --+ u16 rate = 0; --+ bool rate_found = false; --+ u8 rate_retries = 0; --+ u16 rate_flags = 0; --+ u8 mcs_known, mcs_flags; --+ int i; -- -- info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT | -- IEEE80211_TX_CTL_DONTFRAG; --@@ -1724,6 +1737,35 @@ static bool ieee80211_parse_tx_radiotap( -- info->flags |= IEEE80211_TX_CTL_NO_ACK; -- break; -- --+ case IEEE80211_RADIOTAP_RATE: --+ rate = *iterator.this_arg; --+ rate_flags = 0; --+ rate_found = true; --+ break; --+ --+ case IEEE80211_RADIOTAP_DATA_RETRIES: --+ rate_retries = *iterator.this_arg; --+ break; --+ --+ case IEEE80211_RADIOTAP_MCS: --+ mcs_known = iterator.this_arg[0]; --+ mcs_flags = iterator.this_arg[1]; --+ if (!(mcs_known & IEEE80211_RADIOTAP_MCS_HAVE_MCS)) --+ break; --+ --+ rate_found = true; --+ rate = iterator.this_arg[2]; --+ rate_flags = IEEE80211_TX_RC_MCS; --+ --+ if (mcs_known & IEEE80211_RADIOTAP_MCS_HAVE_GI && --+ mcs_flags & IEEE80211_RADIOTAP_MCS_SGI) --+ rate_flags |= IEEE80211_TX_RC_SHORT_GI; --+ --+ if (mcs_known & IEEE80211_RADIOTAP_MCS_HAVE_BW && --+ mcs_flags & IEEE80211_RADIOTAP_MCS_BW_40) --+ rate_flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; --+ break; --+ -- /* -- * Please update the file -- * Documentation/networking/mac80211-injection.txt --@@ -1738,6 +1780,32 @@ static bool ieee80211_parse_tx_radiotap( -- if (ret != -ENOENT) /* ie, if we didn't simply run out of fields */ -- return false; -- --+ if (rate_found) { --+ info->control.flags |= IEEE80211_TX_CTRL_RATE_INJECT; --+ --+ for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { --+ info->control.rates[i].idx = -1; --+ info->control.rates[i].flags = 0; --+ info->control.rates[i].count = 0; --+ } --+ --+ if (rate_flags & IEEE80211_TX_RC_MCS) { --+ info->control.rates[0].idx = rate; --+ } else { --+ for (i = 0; i < sband->n_bitrates; i++) { --+ if (rate * 5 != sband->bitrates[i].bitrate) --+ continue; --+ --+ info->control.rates[0].idx = i; --+ break; --+ } --+ } --+ --+ info->control.rates[0].flags = rate_flags; --+ info->control.rates[0].count = min_t(u8, rate_retries + 1, --+ local->hw.max_rate_tries); --+ } --+ -- /* -- * remove the radiotap header -- * iterator->_max_length was sanity-checked against --@@ -1819,7 +1887,7 @@ netdev_tx_t ieee80211_monitor_start_xmit -- IEEE80211_TX_CTL_INJECTED; -- -- /* process and remove the injection radiotap header */ --- if (!ieee80211_parse_tx_radiotap(skb)) --+ if (!ieee80211_parse_tx_radiotap(local, skb)) -- goto fail; -- -- rcu_read_lock(); -diff --git a/package/kernel/mac80211/patches/322-ath9k_hw-issue-external-reset-for-QCA9550.patch b/package/kernel/mac80211/patches/322-ath9k_hw-issue-external-reset-for-QCA9550.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..5d4e849b7fd3e0cf1510e5759c150571864b3c89 ---- /dev/null -+++ b/package/kernel/mac80211/patches/322-ath9k_hw-issue-external-reset-for-QCA9550.patch -@@ -0,0 +1,125 @@ -+From: Felix Fietkau -+Date: Sat, 9 Jul 2016 15:26:44 +0200 -+Subject: [PATCH] ath9k_hw: issue external reset for QCA9550 -+ -+The RTC interface on the SoC needs to be reset along with the rest of -+the WMAC. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/hw.c -++++ b/drivers/net/wireless/ath/ath9k/hw.c -+@@ -1275,39 +1275,56 @@ void ath9k_hw_get_delta_slope_vals(struc -+ *coef_exponent = coef_exp - 16; -+ } -+ -+-/* AR9330 WAR: -+- * call external reset function to reset WMAC if: -+- * - doing a cold reset -+- * - we have pending frames in the TX queues. -+- */ -+-static bool ath9k_hw_ar9330_reset_war(struct ath_hw *ah, int type) -++static bool ath9k_hw_need_external_reset(struct ath_hw *ah, int type) -+ { -+- int i, npend = 0; -++ int i; -+ -+- for (i = 0; i < AR_NUM_QCU; i++) { -+- npend = ath9k_hw_numtxpending(ah, i); -+- if (npend) -+- break; -++ if (type == ATH9K_RESET_COLD) -++ return true; -++ -++ if (AR_SREV_9550(ah)) -++ return true; -++ -++ /* AR9330 WAR: -++ * call external reset function to reset WMAC if: -++ * - doing a cold reset -++ * - we have pending frames in the TX queues. -++ */ -++ if (AR_SREV_9330(ah)) { -++ for (i = 0; i < AR_NUM_QCU; i++) { -++ if (ath9k_hw_numtxpending(ah, i)) -++ return true; -++ } -+ } -+ -+- if (ah->external_reset && -+- (npend || type == ATH9K_RESET_COLD)) { -+- int reset_err = 0; -++ return false; -++} -+ -+- ath_dbg(ath9k_hw_common(ah), RESET, -+- "reset MAC via external reset\n"); -++static bool ath9k_hw_external_reset(struct ath_hw *ah, int type) -++{ -++ int err; -+ -+- reset_err = ah->external_reset(); -+- if (reset_err) { -+- ath_err(ath9k_hw_common(ah), -+- "External reset failed, err=%d\n", -+- reset_err); -+- return false; -+- } -++ if (!ah->external_reset || !ath9k_hw_need_external_reset(ah, type)) -++ return true; -+ -+- REG_WRITE(ah, AR_RTC_RESET, 1); -++ ath_dbg(ath9k_hw_common(ah), RESET, -++ "reset MAC via external reset\n"); -++ -++ err = ah->external_reset(); -++ if (err) { -++ ath_err(ath9k_hw_common(ah), -++ "External reset failed, err=%d\n", err); -++ return false; -++ } -++ -++ if (AR_SREV_9550(ah)) { -++ REG_WRITE(ah, AR_RTC_RESET, 0); -++ udelay(10); -+ } -+ -++ REG_WRITE(ah, AR_RTC_RESET, 1); -++ udelay(10); -++ -+ return true; -+ } -+ -+@@ -1360,24 +1377,23 @@ static bool ath9k_hw_set_reset(struct at -+ rst_flags |= AR_RTC_RC_MAC_COLD; -+ } -+ -+- if (AR_SREV_9330(ah)) { -+- if (!ath9k_hw_ar9330_reset_war(ah, type)) -+- return false; -+- } -+- -+ if (ath9k_hw_mci_is_enabled(ah)) -+ ar9003_mci_check_gpm_offset(ah); -+ -+ /* DMA HALT added to resolve ar9300 and ar9580 bus error during -+- * RTC_RC reg read -++ * RTC_RC reg read. Also needed for AR9550 external reset -+ */ -+- if (AR_SREV_9300(ah) || AR_SREV_9580(ah)) { -++ if (AR_SREV_9300(ah) || AR_SREV_9580(ah) || AR_SREV_9550(ah)) { -+ REG_SET_BIT(ah, AR_CFG, AR_CFG_HALT_REQ); -+ ath9k_hw_wait(ah, AR_CFG, AR_CFG_HALT_ACK, AR_CFG_HALT_ACK, -+ 20 * AH_WAIT_TIMEOUT); -+- REG_CLR_BIT(ah, AR_CFG, AR_CFG_HALT_REQ); -+ } -+ -++ ath9k_hw_external_reset(ah, type); -++ -++ if (AR_SREV_9300(ah) || AR_SREV_9580(ah)) -++ REG_CLR_BIT(ah, AR_CFG, AR_CFG_HALT_REQ); -++ -+ REG_WRITE(ah, AR_RTC_RC, rst_flags); -+ -+ REGWRITE_BUFFER_FLUSH(ah); -diff --git a/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch b/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch -deleted file mode 100644 -index e7bfb9c83dd406e41e523195fabd0a4611dc86b4..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/322-mac80211-add-A-MSDU-tx-support.patch -+++ /dev/null -@@ -1,317 +0,0 @@ --From: Felix Fietkau --Date: Fri, 5 Feb 2016 01:38:51 +0100 --Subject: [PATCH] mac80211: add A-MSDU tx support -- --Requires software tx queueing support. frag_list support (for zero-copy) --is optional. -- --Signed-off-by: Felix Fietkau ----- -- ----- a/include/net/mac80211.h --+++ b/include/net/mac80211.h --@@ -709,6 +709,7 @@ enum mac80211_tx_info_flags { -- * @IEEE80211_TX_CTRL_PS_RESPONSE: This frame is a response to a poll -- * frame (PS-Poll or uAPSD). -- * @IEEE80211_TX_CTRL_RATE_INJECT: This frame is injected with rate information --+ * @IEEE80211_TX_CTRL_AMSDU: This frame is an A-MSDU frame -- * -- * These flags are used in tx_info->control.flags. -- */ --@@ -716,6 +717,7 @@ enum mac80211_tx_control_flags { -- IEEE80211_TX_CTRL_PORT_CTRL_PROTO = BIT(0), -- IEEE80211_TX_CTRL_PS_RESPONSE = BIT(1), -- IEEE80211_TX_CTRL_RATE_INJECT = BIT(2), --+ IEEE80211_TX_CTRL_AMSDU = BIT(3), -- }; -- -- /* --@@ -1728,6 +1730,7 @@ struct ieee80211_sta_rates { -- * size is min(max_amsdu_len, 7935) bytes. -- * Both additional HT limits must be enforced by the low level driver. -- * This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 2). --+ * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control. -- * @txq: per-TID data TX queues (if driver uses the TXQ abstraction) -- */ -- struct ieee80211_sta { --@@ -1748,6 +1751,7 @@ struct ieee80211_sta { -- bool mfp; -- u8 max_amsdu_subframes; -- u16 max_amsdu_len; --+ u16 max_rc_amsdu_len; -- -- struct ieee80211_txq *txq[IEEE80211_NUM_TIDS]; -- --@@ -1961,6 +1965,15 @@ struct ieee80211_txq { -- * order and does not need to manage its own reorder buffer or BA session -- * timeout. -- * --+ * @IEEE80211_HW_TX_AMSDU: Hardware (or driver) supports software aggregated --+ * A-MSDU frames. Requires software tx queueing and fast-xmit support. --+ * When not using minstrel/minstrel_ht rate control, the driver should --+ * limit the maximum A-MSDU size based on the current tx rate by setting --+ * max_rc_amsdu_len in struct ieee80211_sta. --+ * --+ * @IEEE80211_HW_TX_FRAG_LIST: Hardware (or driver) supports sending frag_list --+ * skbs, needed for zero-copy software A-MSDU. --+ * -- * @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays -- */ -- enum ieee80211_hw_flags { --@@ -1998,6 +2011,8 @@ enum ieee80211_hw_flags { -- IEEE80211_HW_BEACON_TX_STATUS, -- IEEE80211_HW_NEEDS_UNIQUE_STA_ADDR, -- IEEE80211_HW_SUPPORTS_REORDERING_BUFFER, --+ IEEE80211_HW_TX_AMSDU, --+ IEEE80211_HW_TX_FRAG_LIST, -- -- /* keep last, obviously */ -- NUM_IEEE80211_HW_FLAGS --@@ -2070,6 +2085,9 @@ enum ieee80211_hw_flags { -- * size is smaller (an example is LinkSys WRT120N with FW v1.0.07 -- * build 002 Jun 18 2012). -- * --+ * @max_tx_fragments: maximum number of tx buffers per (A)-MSDU, sum --+ * of 1 + skb_shinfo(skb)->nr_frags for each skb in the frag_list. --+ * -- * @offchannel_tx_hw_queue: HW queue ID to use for offchannel TX -- * (if %IEEE80211_HW_QUEUE_CONTROL is set) -- * --@@ -2124,6 +2142,7 @@ struct ieee80211_hw { -- u8 max_rate_tries; -- u8 max_rx_aggregation_subframes; -- u8 max_tx_aggregation_subframes; --+ u8 max_tx_fragments; -- u8 offchannel_tx_hw_queue; -- u8 radiotap_mcs_details; -- u16 radiotap_vht_details; ----- a/net/mac80211/agg-tx.c --+++ b/net/mac80211/agg-tx.c --@@ -935,6 +935,7 @@ void ieee80211_process_addba_resp(struct -- size_t len) -- { -- struct tid_ampdu_tx *tid_tx; --+ struct ieee80211_txq *txq; -- u16 capab, tid; -- u8 buf_size; -- bool amsdu; --@@ -945,6 +946,10 @@ void ieee80211_process_addba_resp(struct -- buf_size = (capab & IEEE80211_ADDBA_PARAM_BUF_SIZE_MASK) >> 6; -- buf_size = min(buf_size, local->hw.max_tx_aggregation_subframes); -- --+ txq = sta->sta.txq[tid]; --+ if (!amsdu && txq) --+ set_bit(IEEE80211_TXQ_NO_AMSDU, &to_txq_info(txq)->flags); --+ -- mutex_lock(&sta->ampdu_mlme.mtx); -- -- tid_tx = rcu_dereference_protected_tid_tx(sta, tid); ----- a/net/mac80211/debugfs.c --+++ b/net/mac80211/debugfs.c --@@ -127,6 +127,8 @@ static const char *hw_flag_names[NUM_IEE -- FLAG(BEACON_TX_STATUS), -- FLAG(NEEDS_UNIQUE_STA_ADDR), -- FLAG(SUPPORTS_REORDERING_BUFFER), --+ FLAG(TX_AMSDU), --+ FLAG(TX_FRAG_LIST), -- -- /* keep last for the build bug below */ -- (void *)0x1 ----- a/net/mac80211/ieee80211_i.h --+++ b/net/mac80211/ieee80211_i.h --@@ -799,6 +799,7 @@ struct mac80211_qos_map { -- enum txq_info_flags { -- IEEE80211_TXQ_STOP, -- IEEE80211_TXQ_AMPDU, --+ IEEE80211_TXQ_NO_AMSDU, -- }; -- -- struct txq_info { ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -1318,6 +1318,10 @@ struct sk_buff *ieee80211_tx_dequeue(str -- out: -- spin_unlock_bh(&txqi->queue.lock); -- --+ if (skb && skb_has_frag_list(skb) && --+ !ieee80211_hw_check(&local->hw, TX_FRAG_LIST)) --+ skb_linearize(skb); --+ -- return skb; -- } -- EXPORT_SYMBOL(ieee80211_tx_dequeue); --@@ -2757,6 +2761,163 @@ void ieee80211_clear_fast_xmit(struct st -- kfree_rcu(fast_tx, rcu_head); -- } -- --+static bool ieee80211_amsdu_realloc_pad(struct ieee80211_local *local, --+ struct sk_buff *skb, int headroom, --+ int *subframe_len) --+{ --+ int amsdu_len = *subframe_len + sizeof(struct ethhdr); --+ int padding = (4 - amsdu_len) & 3; --+ --+ if (skb_headroom(skb) < headroom || skb_tailroom(skb) < padding) { --+ I802_DEBUG_INC(local->tx_expand_skb_head); --+ --+ if (pskb_expand_head(skb, headroom, padding, GFP_ATOMIC)) { --+ wiphy_debug(local->hw.wiphy, --+ "failed to reallocate TX buffer\n"); --+ return false; --+ } --+ } --+ --+ if (padding) { --+ *subframe_len += padding; --+ memset(skb_put(skb, padding), 0, padding); --+ } --+ --+ return true; --+} --+ --+static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata, --+ struct ieee80211_fast_tx *fast_tx, --+ struct sk_buff *skb) --+{ --+ struct ieee80211_local *local = sdata->local; --+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); --+ struct ieee80211_hdr *hdr; --+ struct ethhdr amsdu_hdr; --+ int hdr_len = fast_tx->hdr_len - sizeof(rfc1042_header); --+ int subframe_len = skb->len - hdr_len; --+ void *data; --+ u8 *qc; --+ --+ if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) --+ return false; --+ --+ if (info->control.flags & IEEE80211_TX_CTRL_AMSDU) --+ return true; --+ --+ if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(amsdu_hdr), --+ &subframe_len)) --+ return false; --+ --+ amsdu_hdr.h_proto = cpu_to_be16(subframe_len); --+ memcpy(amsdu_hdr.h_source, skb->data + fast_tx->sa_offs, ETH_ALEN); --+ memcpy(amsdu_hdr.h_dest, skb->data + fast_tx->da_offs, ETH_ALEN); --+ --+ data = skb_push(skb, sizeof(amsdu_hdr)); --+ memmove(data, data + sizeof(amsdu_hdr), hdr_len); --+ memcpy(data + hdr_len, &amsdu_hdr, sizeof(amsdu_hdr)); --+ --+ hdr = data; --+ qc = ieee80211_get_qos_ctl(hdr); --+ *qc |= IEEE80211_QOS_CTL_A_MSDU_PRESENT; --+ --+ info->control.flags |= IEEE80211_TX_CTRL_AMSDU; --+ --+ return true; --+} --+ --+static bool ieee80211_amsdu_aggregate(struct ieee80211_sub_if_data *sdata, --+ struct sta_info *sta, --+ struct ieee80211_fast_tx *fast_tx, --+ struct sk_buff *skb) --+{ --+ struct ieee80211_local *local = sdata->local; --+ u8 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; --+ struct ieee80211_txq *txq = sta->sta.txq[tid]; --+ struct txq_info *txqi; --+ struct sk_buff **frag_tail, *head; --+ int subframe_len = skb->len - ETH_ALEN; --+ u8 max_subframes = sta->sta.max_amsdu_subframes; --+ int max_frags = local->hw.max_tx_fragments; --+ int max_amsdu_len = sta->sta.max_amsdu_len; --+ __be16 len; --+ void *data; --+ bool ret = false; --+ int n = 1, nfrags; --+ --+ if (!ieee80211_hw_check(&local->hw, TX_AMSDU)) --+ return false; --+ --+ if (!txq) --+ return false; --+ --+ txqi = to_txq_info(txq); --+ if (test_bit(IEEE80211_TXQ_NO_AMSDU, &txqi->flags)) --+ return false; --+ --+ if (sta->sta.max_rc_amsdu_len) --+ max_amsdu_len = min_t(int, max_amsdu_len, --+ sta->sta.max_rc_amsdu_len); --+ --+ spin_lock_bh(&txqi->queue.lock); --+ --+ head = skb_peek_tail(&txqi->queue); --+ if (!head) --+ goto out; --+ --+ if (skb->len + head->len > max_amsdu_len) --+ goto out; --+ --+ /* --+ * HT A-MPDU limits maximum MPDU size to 4095 bytes. Since aggregation --+ * sessions are started/stopped without txq flush, use the limit here --+ * to avoid having to de-aggregate later. --+ */ --+ if (skb->len + head->len > 4095 && --+ !sta->sta.vht_cap.vht_supported) --+ goto out; --+ --+ if (!ieee80211_amsdu_prepare_head(sdata, fast_tx, head)) --+ goto out; --+ --+ nfrags = 1 + skb_shinfo(skb)->nr_frags; --+ nfrags += 1 + skb_shinfo(head)->nr_frags; --+ frag_tail = &skb_shinfo(head)->frag_list; --+ while (*frag_tail) { --+ nfrags += 1 + skb_shinfo(*frag_tail)->nr_frags; --+ frag_tail = &(*frag_tail)->next; --+ n++; --+ } --+ --+ if (max_subframes && n > max_subframes) --+ goto out; --+ --+ if (max_frags && nfrags > max_frags) --+ goto out; --+ --+ if (!ieee80211_amsdu_realloc_pad(local, skb, sizeof(rfc1042_header) + 2, --+ &subframe_len)) --+ return false; --+ --+ ret = true; --+ data = skb_push(skb, ETH_ALEN + 2); --+ memmove(data, data + ETH_ALEN + 2, 2 * ETH_ALEN); --+ --+ data += 2 * ETH_ALEN; --+ len = cpu_to_be16(subframe_len); --+ memcpy(data, &len, 2); --+ memcpy(data + 2, rfc1042_header, sizeof(rfc1042_header)); --+ --+ head->len += skb->len; --+ head->data_len += skb->len; --+ *frag_tail = skb; --+ --+out: --+ spin_unlock_bh(&txqi->queue.lock); --+ --+ return ret; --+} --+ -- static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata, -- struct net_device *dev, struct sta_info *sta, -- struct ieee80211_fast_tx *fast_tx, --@@ -2811,6 +2972,10 @@ static bool ieee80211_xmit_fast(struct i -- -- ieee80211_tx_stats(dev, skb->len + extra_head); -- --+ if ((hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) && --+ ieee80211_amsdu_aggregate(sdata, sta, fast_tx, skb)) --+ return true; --+ -- /* will not be crypto-handled beyond what we do here, so use false -- * as the may-encrypt argument for the resize to not account for -- * more room than we already have in 'extra_head' -diff --git a/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch b/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch -deleted file mode 100644 -index 9277b2cabcdf6a02fa285b7eef2391b7f575869a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/323-0000-brcmfmac-fix-setting-primary-channel-for-80-MHz-widt.patch -+++ /dev/null -@@ -1,64 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Wed, 20 Jan 2016 16:46:04 +0100 --Subject: [PATCH] brcmfmac: fix setting primary channel for 80 MHz width --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --First of all it changes the way we calculate primary channel offset. If --we use e.g. 80 MHz channel with primary frequency 5180 MHz (which means --center frequency is 5210 MHz) it makes sense to calculate primary offset --as -30 MHz. --Then it fixes values we compare primary_offset with. We were comparing --offset in MHz against -2 or 2 which was resulting in picking a wrong --primary channel. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -247,7 +247,7 @@ static u16 chandef_to_chanspec(struct br -- brcmf_dbg(TRACE, "chandef: control %d center %d width %d\n", -- ch->chan->center_freq, ch->center_freq1, ch->width); -- ch_inf.chnum = ieee80211_frequency_to_channel(ch->center_freq1); --- primary_offset = ch->center_freq1 - ch->chan->center_freq; --+ primary_offset = ch->chan->center_freq - ch->center_freq1; -- switch (ch->width) { -- case NL80211_CHAN_WIDTH_20: -- case NL80211_CHAN_WIDTH_20_NOHT: --@@ -256,24 +256,21 @@ static u16 chandef_to_chanspec(struct br -- break; -- case NL80211_CHAN_WIDTH_40: -- ch_inf.bw = BRCMU_CHAN_BW_40; --- if (primary_offset < 0) --+ if (primary_offset > 0) -- ch_inf.sb = BRCMU_CHAN_SB_U; -- else -- ch_inf.sb = BRCMU_CHAN_SB_L; -- break; -- case NL80211_CHAN_WIDTH_80: -- ch_inf.bw = BRCMU_CHAN_BW_80; --- if (primary_offset < 0) { --- if (primary_offset < -CH_10MHZ_APART) --- ch_inf.sb = BRCMU_CHAN_SB_UU; --- else --- ch_inf.sb = BRCMU_CHAN_SB_UL; --- } else { --- if (primary_offset > CH_10MHZ_APART) --- ch_inf.sb = BRCMU_CHAN_SB_LL; --- else --- ch_inf.sb = BRCMU_CHAN_SB_LU; --- } --+ if (primary_offset == -30) --+ ch_inf.sb = BRCMU_CHAN_SB_LL; --+ else if (primary_offset == -10) --+ ch_inf.sb = BRCMU_CHAN_SB_LU; --+ else if (primary_offset == 10) --+ ch_inf.sb = BRCMU_CHAN_SB_UL; --+ else --+ ch_inf.sb = BRCMU_CHAN_SB_UU; -- break; -- case NL80211_CHAN_WIDTH_80P80: -- case NL80211_CHAN_WIDTH_160: -diff --git a/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch b/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch -deleted file mode 100644 -index d7018dab3d230ab2e342824ff5067d0a24b586a1..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/323-0001-brcmfmac-analyze-descriptors-of-current-component-on.patch -+++ /dev/null -@@ -1,51 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 26 Jan 2016 17:57:01 +0100 --Subject: [PATCH] brcmfmac: analyze descriptors of current component only --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --So far we were looking for address descriptors without a check for --crossing current component border. In case of dealing with unsupported --descriptor or descriptor missing at all the code would incorrectly get --data from another component. -- --Consider this binary-described component from BCM4366 EROM: --4bf83b01 TAG==CI CID==0x83b --20080201 TAG==CI PORTS==0+1 WRAPPERS==0+1 --18400035 TAG==ADDR SZ_SZD TYPE_SLAVE --00050000 --18107085 TAG==ADDR SZ_4K TYPE_SWRAP -- --Driver was assigning invalid base address to this core: --brcmfmac: [6 ] core 0x83b:32 base 0x18109000 wrap 0x18107000 --which came from totally different component defined in EROM: --43b36701 TAG==CI CID==0x367 --00000201 TAG==CI PORTS==0+1 WRAPPERS==0+0 --18109005 TAG==ADDR SZ_4K TYPE_SLAVE -- --This change will also allow us to support components without wrapper --address in the future. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c --@@ -803,7 +803,14 @@ static int brcmf_chip_dmp_get_regaddr(st -- *eromaddr -= 4; -- return -EFAULT; -- } --- } while (desc != DMP_DESC_ADDRESS); --+ } while (desc != DMP_DESC_ADDRESS && --+ desc != DMP_DESC_COMPONENT); --+ --+ /* stop if we crossed current component border */ --+ if (desc == DMP_DESC_COMPONENT) { --+ *eromaddr -= 4; --+ return 0; --+ } -- -- /* skip upper 32-bit address descriptor */ -- if (val & DMP_DESC_ADDRSIZE_GT32) -diff --git a/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch b/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch -deleted file mode 100644 -index 045ab4953bb9a43044435baa8e242b3f4794952a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/323-0002-brcmfmac-allow-storing-PMU-core-without-wrapper-addr.patch -+++ /dev/null -@@ -1,28 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 26 Jan 2016 17:57:02 +0100 --Subject: [PATCH] brcmfmac: allow storing PMU core without wrapper address --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Separated PMU core can be found in new devices and should be used for --accessing PMU registers (which were routed through ChipCommon so far). --This core is one of exceptions that doesn't have or need wrapper address --to be still safely accessible. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c --@@ -883,7 +883,8 @@ int brcmf_chip_dmp_erom_scan(struct brcm -- rev = (val & DMP_COMP_REVISION) >> DMP_COMP_REVISION_S; -- -- /* need core with ports */ --- if (nmw + nsw == 0) --+ if (nmw + nsw == 0 && --+ id != BCMA_CORE_PMU) -- continue; -- -- /* try to obtain register address info */ -diff --git a/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch b/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch -deleted file mode 100644 -index 7b7ba4f743b244c0d766efbce7045e00e13e27ed..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/323-0003-brcmfmac-read-extended-capabilities-of-ChipCommon-co.patch -+++ /dev/null -@@ -1,43 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 26 Jan 2016 17:57:03 +0100 --Subject: [PATCH] brcmfmac: read extended capabilities of ChipCommon core --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This is an extra bitfield with info about some present hardware. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c --@@ -1025,6 +1025,9 @@ static int brcmf_chip_setup(struct brcmf -- /* get chipcommon capabilites */ -- pub->cc_caps = chip->ops->read32(chip->ctx, -- CORE_CC_REG(base, capabilities)); --+ pub->cc_caps_ext = chip->ops->read32(chip->ctx, --+ CORE_CC_REG(base, --+ capabilities_ext)); -- -- /* get pmu caps & rev */ -- if (pub->cc_caps & CC_CAP_PMU) { ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h --@@ -27,6 +27,7 @@ -- * @chip: chip identifier. -- * @chiprev: chip revision. -- * @cc_caps: chipcommon core capabilities. --+ * @cc_caps_ext: chipcommon core extended capabilities. -- * @pmucaps: PMU capabilities. -- * @pmurev: PMU revision. -- * @rambase: RAM base address (only applicable for ARM CR4 chips). --@@ -38,6 +39,7 @@ struct brcmf_chip { -- u32 chip; -- u32 chiprev; -- u32 cc_caps; --+ u32 cc_caps_ext; -- u32 pmucaps; -- u32 pmurev; -- u32 rambase; -diff --git a/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch b/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch -deleted file mode 100644 -index 2af6fd93bc06142b459144caf49489d51f7f6304..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/323-0004-brcmfmac-access-PMU-registers-using-standalone-PMU-c.patch -+++ /dev/null -@@ -1,148 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 26 Jan 2016 17:57:04 +0100 --Subject: [PATCH] brcmfmac: access PMU registers using standalone PMU core if -- available --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --On recent Broadcom chipsets PMU is present as separated core and it --can't be accessed using ChipCommon anymore as it fails with e.g.: --[ 18.198412] Unhandled fault: imprecise external abort (0x1406) at 0xb6da200f -- --Add a new helper function that will return a proper core that should be --used for accessing PMU registers. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c --@@ -1014,6 +1014,7 @@ static int brcmf_chip_setup(struct brcmf -- { -- struct brcmf_chip *pub; -- struct brcmf_core_priv *cc; --+ struct brcmf_core *pmu; -- u32 base; -- u32 val; -- int ret = 0; --@@ -1030,9 +1031,10 @@ static int brcmf_chip_setup(struct brcmf -- capabilities_ext)); -- -- /* get pmu caps & rev */ --+ pmu = brcmf_chip_get_pmu(pub); /* after reading cc_caps_ext */ -- if (pub->cc_caps & CC_CAP_PMU) { -- val = chip->ops->read32(chip->ctx, --- CORE_CC_REG(base, pmucapabilities)); --+ CORE_CC_REG(pmu->base, pmucapabilities)); -- pub->pmurev = val & PCAP_REV_MASK; -- pub->pmucaps = val; -- } --@@ -1131,6 +1133,23 @@ struct brcmf_core *brcmf_chip_get_chipco -- return &cc->pub; -- } -- --+struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub) --+{ --+ struct brcmf_core *cc = brcmf_chip_get_chipcommon(pub); --+ struct brcmf_core *pmu; --+ --+ /* See if there is separated PMU core available */ --+ if (cc->rev >= 35 && --+ pub->cc_caps_ext & BCMA_CC_CAP_EXT_AOB_PRESENT) { --+ pmu = brcmf_chip_get_core(pub, BCMA_CORE_PMU); --+ if (pmu) --+ return pmu; --+ } --+ --+ /* Fallback to ChipCommon core for older hardware */ --+ return cc; --+} --+ -- bool brcmf_chip_iscoreup(struct brcmf_core *pub) -- { -- struct brcmf_core_priv *core; --@@ -1301,6 +1320,7 @@ bool brcmf_chip_sr_capable(struct brcmf_ -- { -- u32 base, addr, reg, pmu_cc3_mask = ~0; -- struct brcmf_chip_priv *chip; --+ struct brcmf_core *pmu = brcmf_chip_get_pmu(pub); -- -- brcmf_dbg(TRACE, "Enter\n"); -- --@@ -1320,9 +1340,9 @@ bool brcmf_chip_sr_capable(struct brcmf_ -- case BRCM_CC_4335_CHIP_ID: -- case BRCM_CC_4339_CHIP_ID: -- /* read PMU chipcontrol register 3 */ --- addr = CORE_CC_REG(base, chipcontrol_addr); --+ addr = CORE_CC_REG(pmu->base, chipcontrol_addr); -- chip->ops->write32(chip->ctx, addr, 3); --- addr = CORE_CC_REG(base, chipcontrol_data); --+ addr = CORE_CC_REG(pmu->base, chipcontrol_data); -- reg = chip->ops->read32(chip->ctx, addr); -- return (reg & pmu_cc3_mask) != 0; -- case BRCM_CC_43430_CHIP_ID: --@@ -1330,12 +1350,12 @@ bool brcmf_chip_sr_capable(struct brcmf_ -- reg = chip->ops->read32(chip->ctx, addr); -- return reg != 0; -- default: --- addr = CORE_CC_REG(base, pmucapabilities_ext); --+ addr = CORE_CC_REG(pmu->base, pmucapabilities_ext); -- reg = chip->ops->read32(chip->ctx, addr); -- if ((reg & PCAPEXT_SR_SUPPORTED_MASK) == 0) -- return false; -- --- addr = CORE_CC_REG(base, retention_ctl); --+ addr = CORE_CC_REG(pmu->base, retention_ctl); -- reg = chip->ops->read32(chip->ctx, addr); -- return (reg & (PMU_RCTL_MACPHY_DISABLE_MASK | -- PMU_RCTL_LOGIC_DISABLE_MASK)) == 0; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h --@@ -85,6 +85,7 @@ struct brcmf_chip *brcmf_chip_attach(voi -- void brcmf_chip_detach(struct brcmf_chip *chip); -- struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *chip, u16 coreid); -- struct brcmf_core *brcmf_chip_get_chipcommon(struct brcmf_chip *chip); --+struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub); -- bool brcmf_chip_iscoreup(struct brcmf_core *core); -- void brcmf_chip_coredisable(struct brcmf_core *core, u32 prereset, u32 reset); -- void brcmf_chip_resetcore(struct brcmf_core *core, u32 prereset, u32 reset, ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -3615,7 +3615,6 @@ brcmf_sdio_drivestrengthinit(struct brcm -- const struct sdiod_drive_str *str_tab = NULL; -- u32 str_mask; -- u32 str_shift; --- u32 base; -- u32 i; -- u32 drivestrength_sel = 0; -- u32 cc_data_temp; --@@ -3658,14 +3657,15 @@ brcmf_sdio_drivestrengthinit(struct brcm -- } -- -- if (str_tab != NULL) { --+ struct brcmf_core *pmu = brcmf_chip_get_pmu(ci); --+ -- for (i = 0; str_tab[i].strength != 0; i++) { -- if (drivestrength >= str_tab[i].strength) { -- drivestrength_sel = str_tab[i].sel; -- break; -- } -- } --- base = brcmf_chip_get_chipcommon(ci)->base; --- addr = CORE_CC_REG(base, chipcontrol_addr); --+ addr = CORE_CC_REG(pmu->base, chipcontrol_addr); -- brcmf_sdiod_regwl(sdiodev, addr, 1, NULL); -- cc_data_temp = brcmf_sdiod_regrl(sdiodev, addr, NULL); -- cc_data_temp &= ~str_mask; --@@ -3835,8 +3835,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi -- goto fail; -- -- /* set PMUControl so a backplane reset does PMU state reload */ --- reg_addr = CORE_CC_REG(brcmf_chip_get_chipcommon(bus->ci)->base, --- pmucontrol); --+ reg_addr = CORE_CC_REG(brcmf_chip_get_pmu(bus->ci)->base, pmucontrol); -- reg_val = brcmf_sdiod_regrl(bus->sdiodev, reg_addr, &err); -- if (err) -- goto fail; -diff --git a/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch b/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch -deleted file mode 100644 -index 35887fcb59219270e0aedd6c9466956f9ba318f4..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/323-0005-brcmfmac-add-support-for-14e4-4365-PCI-ID-with-BCM43.patch -+++ /dev/null -@@ -1,38 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 26 Jan 2016 17:57:05 +0100 --Subject: [PATCH] brcmfmac: add support for 14e4:4365 PCI ID with BCM4366 -- chipset --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --On Broadcom ARM routers BCM4366 cards are available with 14e4:4365 ID. --Unfortunately this ID was already used by Broadcom for cards with --BCM43142, a totally different chipset requiring SoftMAC driver. To avoid --a conflict between brcmfmac and bcma use more specific ID entry with --subvendor and subdevice specified. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --@@ -1951,6 +1951,9 @@ static const struct dev_pm_ops brcmf_pci -- -- #define BRCMF_PCIE_DEVICE(dev_id) { BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\ -- PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 } --+#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev) { \ --+ BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\ --+ subvend, subdev, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 } -- -- static struct pci_device_id brcmf_pcie_devid_table[] = { -- BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID), --@@ -1966,6 +1969,7 @@ static struct pci_device_id brcmf_pcie_d -- BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_DEVICE_ID), -- BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_2G_DEVICE_ID), -- BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_5G_DEVICE_ID), --+ BRCMF_PCIE_DEVICE_SUB(0x4365, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4365), -- BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_DEVICE_ID), -- BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_2G_DEVICE_ID), -- BRCMF_PCIE_DEVICE(BRCM_PCIE_4366_5G_DEVICE_ID), -diff --git a/package/kernel/mac80211/patches/323-ath9k-Fix-programming-of-minCCA-power-threshold.patch b/package/kernel/mac80211/patches/323-ath9k-Fix-programming-of-minCCA-power-threshold.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..59ac29b1cfd6fa5d6f6cbab595ca0da1508fd077 ---- /dev/null -+++ b/package/kernel/mac80211/patches/323-ath9k-Fix-programming-of-minCCA-power-threshold.patch -@@ -0,0 +1,26 @@ -+From: Sven Eckelmann -+Date: Fri, 17 Jun 2016 11:58:20 +0200 -+Subject: [PATCH] ath9k: Fix programming of minCCA power threshold -+ -+The function ar9003_hw_apply_minccapwr_thresh takes as second parameter not -+a pointer to the channel but a boolean value describing whether the channel -+is 2.4GHz or not. This broke (according to the origin commit) the ETSI -+regulatory compliance on 5GHz channels. -+ -+Fixes: 3533bf6b15a0 ("ath9k: Fix regulatory compliance") -+Signed-off-by: Sven Eckelmann -+Cc: Simon Wunderlich -+Cc: Sujith Manoharan -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -++++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c -+@@ -4175,7 +4175,7 @@ static void ath9k_hw_ar9300_set_board_va -+ if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah) && !AR_SREV_9531(ah)) -+ ar9003_hw_internal_regulator_apply(ah); -+ ar9003_hw_apply_tuning_caps(ah); -+- ar9003_hw_apply_minccapwr_thresh(ah, chan); -++ ar9003_hw_apply_minccapwr_thresh(ah, is2ghz); -+ ar9003_hw_txend_to_xpa_off_apply(ah, is2ghz); -+ ar9003_hw_thermometer_apply(ah); -+ ar9003_hw_thermo_cal_apply(ah); -diff --git a/package/kernel/mac80211/patches/324-ath9k_hw-fix-spectral-scan-on-AR9285-and-newer.patch b/package/kernel/mac80211/patches/324-ath9k_hw-fix-spectral-scan-on-AR9285-and-newer.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..b6f48680b7b1e2522c53c51834a8ec32638a3dec ---- /dev/null -+++ b/package/kernel/mac80211/patches/324-ath9k_hw-fix-spectral-scan-on-AR9285-and-newer.patch -@@ -0,0 +1,86 @@ -+From: Felix Fietkau -+Date: Mon, 11 Jul 2016 10:34:37 +0200 -+Subject: [PATCH] ath9k_hw: fix spectral scan on AR9285 and newer -+ -+The register layout of AR_PHY_SPECTRAL_SCAN has changed, only AR9280 -+uses the old layout -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c -++++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c -+@@ -476,6 +476,7 @@ static void ar9002_hw_set_bt_ant_diversi -+ static void ar9002_hw_spectral_scan_config(struct ath_hw *ah, -+ struct ath_spec_scan *param) -+ { -++ u32 repeat_bit; -+ u8 count; -+ -+ if (!param->enabled) { -+@@ -486,12 +487,15 @@ static void ar9002_hw_spectral_scan_conf -+ REG_SET_BIT(ah, AR_PHY_RADAR_0, AR_PHY_RADAR_0_FFT_ENA); -+ REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN, AR_PHY_SPECTRAL_SCAN_ENABLE); -+ -++ if (AR_SREV_9280(ah)) -++ repeat_bit = AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT; -++ else -++ repeat_bit = AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI; -++ -+ if (param->short_repeat) -+- REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN, -+- AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT); -++ REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN, repeat_bit); -+ else -+- REG_CLR_BIT(ah, AR_PHY_SPECTRAL_SCAN, -+- AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT); -++ REG_CLR_BIT(ah, AR_PHY_SPECTRAL_SCAN, repeat_bit); -+ -+ /* on AR92xx, the highest bit of count will make the the chip send -+ * spectral samples endlessly. Check if this really was intended, -+@@ -499,15 +503,25 @@ static void ar9002_hw_spectral_scan_conf -+ */ -+ count = param->count; -+ if (param->endless) { -+- if (AR_SREV_9271(ah)) -+- count = 0; -+- else -++ if (AR_SREV_9280(ah)) -+ count = 0x80; -++ else -++ count = 0; -+ } else if (count & 0x80) -+ count = 0x7f; -++ else if (!count) -++ count = 1; -++ -++ if (AR_SREV_9280(ah)) { -++ REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN, -++ AR_PHY_SPECTRAL_SCAN_COUNT, count); -++ } else { -++ REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN, -++ AR_PHY_SPECTRAL_SCAN_COUNT_KIWI, count); -++ REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN, -++ AR_PHY_SPECTRAL_SCAN_PHYERR_MASK_SELECT); -++ } -+ -+- REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN, -+- AR_PHY_SPECTRAL_SCAN_COUNT, count); -+ REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN, -+ AR_PHY_SPECTRAL_SCAN_PERIOD, param->period); -+ REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN, -+--- a/drivers/net/wireless/ath/ath9k/ar9002_phy.h -++++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.h -+@@ -177,8 +177,11 @@ -+ #define AR_PHY_SPECTRAL_SCAN_PERIOD_S 8 -+ #define AR_PHY_SPECTRAL_SCAN_COUNT 0x00FF0000 /* Number of reports, reg 68, bits 16-23*/ -+ #define AR_PHY_SPECTRAL_SCAN_COUNT_S 16 -++#define AR_PHY_SPECTRAL_SCAN_COUNT_KIWI 0x0FFF0000 /* Number of reports, reg 68, bits 16-27*/ -++#define AR_PHY_SPECTRAL_SCAN_COUNT_KIWI_S 16 -+ #define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT 0x01000000 /* Short repeat, reg 68, bit 24*/ -+-#define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_S 24 /* Short repeat, reg 68, bit 24*/ -++#define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI 0x10000000 /* Short repeat, reg 68, bit 28*/ -++#define AR_PHY_SPECTRAL_SCAN_PHYERR_MASK_SELECT 0x40000000 -+ -+ #define AR_PHY_RX_DELAY 0x9914 -+ #define AR_PHY_SEARCH_START_DELAY 0x9918 -diff --git a/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch b/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch -deleted file mode 100644 -index 6ce60f19608abcc89a27c6cebfbb90806b58a503..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/324-brcmfmac-treat-NULL-character-in-NVRAM-as-separator.patch -+++ /dev/null -@@ -1,32 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Sun, 31 Jan 2016 12:14:34 +0100 --Subject: [PATCH] brcmfmac: treat NULL character in NVRAM as separator --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Platform NVRAM (stored on a flash partition) has entries separated by a --NULL (\0) char. Our parsing code switches from VALUE state to IDLE --whenever it meets a NULL (\0). When that happens our IDLE handler should --simply consume it and analyze whatever is placed ahead. -- --This fixes harmless warnings spamming debugging output: --[ 155.165624] brcmfmac: brcmf_nvram_handle_idle warning: ln=1:col=20: ignoring invalid character --[ 155.180806] brcmfmac: brcmf_nvram_handle_idle warning: ln=1:col=44: ignoring invalid character --[ 155.195971] brcmfmac: brcmf_nvram_handle_idle warning: ln=1:col=63: ignoring invalid character -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c --@@ -93,7 +93,7 @@ static enum nvram_parser_state brcmf_nvr -- c = nvp->data[nvp->pos]; -- if (c == '\n') -- return COMMENT; --- if (is_whitespace(c)) --+ if (is_whitespace(c) || c == '\0') -- goto proceed; -- if (c == '#') -- return COMMENT; -diff --git a/package/kernel/mac80211/patches/325-ath9k_hw-fix-duplicate-and-partially-wrong-definitio.patch b/package/kernel/mac80211/patches/325-ath9k_hw-fix-duplicate-and-partially-wrong-definitio.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..6685f33989dd9c872b817b32bcd5b1ce72f13089 ---- /dev/null -+++ b/package/kernel/mac80211/patches/325-ath9k_hw-fix-duplicate-and-partially-wrong-definitio.patch -@@ -0,0 +1,57 @@ -+From: Felix Fietkau -+Date: Mon, 11 Jul 2016 11:31:39 +0200 -+Subject: [PATCH] ath9k_hw: fix duplicate (and partially wrong) definition -+ of AR_CH0_THERM -+ -+AR_PHY_65NM_CH0_THERM and AR_CH0_THERM were supposed to refer to the -+same register, however they had different SREV checks. -+ -+Remove the duplicate and use the checks. Since there were other SREV -+checks present in the only place that uses this, this will probaby not -+affect runtime behavior. -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h -++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h -+@@ -689,13 +689,6 @@ -+ #define AR_CH0_TOP_XPABIASLVL (AR_SREV_9550(ah) ? 0x3c0 : 0x300) -+ #define AR_CH0_TOP_XPABIASLVL_S (AR_SREV_9550(ah) ? 6 : 8) -+ -+-#define AR_CH0_THERM (AR_SREV_9300(ah) ? 0x16290 : \ -+- ((AR_SREV_9485(ah) ? 0x1628c : 0x16294))) -+-#define AR_CH0_THERM_XPABIASLVL_MSB 0x3 -+-#define AR_CH0_THERM_XPABIASLVL_MSB_S 0 -+-#define AR_CH0_THERM_XPASHORT2GND 0x4 -+-#define AR_CH0_THERM_XPASHORT2GND_S 2 -+- -+ #define AR_SWITCH_TABLE_COM_ALL (0xffff) -+ #define AR_SWITCH_TABLE_COM_ALL_S (0) -+ #define AR_SWITCH_TABLE_COM_AR9462_ALL (0xffffff) -+@@ -712,15 +705,17 @@ -+ #define AR_SWITCH_TABLE_ALL (0xfff) -+ #define AR_SWITCH_TABLE_ALL_S (0) -+ -+-#define AR_PHY_65NM_CH0_THERM (AR_SREV_9300(ah) ? 0x16290 :\ -+- ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x16294 : 0x1628c)) -++#define AR_CH0_THERM (AR_SREV_9300(ah) ? 0x16290 :\ -++ ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x16294 : 0x1628c)) -++#define AR_CH0_THERM_XPABIASLVL_MSB 0x3 -++#define AR_CH0_THERM_XPABIASLVL_MSB_S 0 -++#define AR_CH0_THERM_XPASHORT2GND 0x4 -++#define AR_CH0_THERM_XPASHORT2GND_S 2 -+ -+-#define AR_PHY_65NM_CH0_THERM_LOCAL 0x80000000 -+-#define AR_PHY_65NM_CH0_THERM_LOCAL_S 31 -+-#define AR_PHY_65NM_CH0_THERM_START 0x20000000 -+-#define AR_PHY_65NM_CH0_THERM_START_S 29 -+-#define AR_PHY_65NM_CH0_THERM_SAR_ADC_OUT 0x0000ff00 -+-#define AR_PHY_65NM_CH0_THERM_SAR_ADC_OUT_S 8 -++#define AR_CH0_THERM_LOCAL 0x80000000 -++#define AR_CH0_THERM_START 0x20000000 -++#define AR_CH0_THERM_SAR_ADC_OUT 0x0000ff00 -++#define AR_CH0_THERM_SAR_ADC_OUT_S 8 -+ -+ #define AR_CH0_TOP2 (AR_SREV_9300(ah) ? 0x1628c : \ -+ (AR_SREV_9462(ah) ? 0x16290 : 0x16284)) -diff --git a/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch b/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch -deleted file mode 100644 -index 012dea1e3a995d0118faea99f994da117e16293d..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/325-brcmfmac-sdio-Increase-the-default-timeouts-a-bit.patch -+++ /dev/null -@@ -1,41 +0,0 @@ --From: Sjoerd Simons --Date: Mon, 25 Jan 2016 11:47:29 +0100 --Subject: [PATCH] brcmfmac: sdio: Increase the default timeouts a bit -- --On a Radxa Rock2 board with a Ampak AP6335 (Broadcom 4339 core) it seems --the card responds very quickly most of the time, unfortunately during --initialisation it sometimes seems to take just a bit over 2 seconds to --respond. -- --This results intialization failing with message like: -- brcmf_c_preinit_dcmds: Retreiving cur_etheraddr failed, -52 -- brcmf_bus_start: failed: -52 -- brcmf_sdio_firmware_callback: dongle is not responding -- --Increasing the timeout to allow for a bit more headroom allows the --card to initialize reliably. -- --A quick search online after diagnosing/fixing this showed that Google --has a similar patch in their ChromeOS tree, so this doesn't seem --specific to the board I'm using. -- --Signed-off-by: Sjoerd Simons --Reviewed-by: Julian Calaby --Acked-by: Arend van Spriel --Reviewed-by: Douglas Anderson --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -45,8 +45,8 @@ -- #include "chip.h" -- #include "firmware.h" -- ---#define DCMD_RESP_TIMEOUT msecs_to_jiffies(2000) ---#define CTL_DONE_TIMEOUT msecs_to_jiffies(2000) --+#define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500) --+#define CTL_DONE_TIMEOUT msecs_to_jiffies(2500) -- -- #ifdef DEBUG -- -diff --git a/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch b/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch -deleted file mode 100644 -index 71f7a4043304e4120bfb1fdfa3744a2ebd53ac54..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/326-ath9k-make-NF-load-complete-quickly-and-reliably.patch -+++ /dev/null -@@ -1,87 +0,0 @@ --From: Miaoqing Pan --Date: Fri, 5 Feb 2016 09:45:50 +0800 --Subject: [PATCH] ath9k: make NF load complete quickly and reliably -- --Make NF load complete quickly and reliably. NF load execution --is delayed by HW to end of frame if frame Rx or Tx is ongoing. --Increasing timeout to max frame duration. If NF cal is ongoing --before NF load, stop it before load, and restart it afterwards. -- --Signed-off-by: Miaoqing Pan ----- -- ----- a/drivers/net/wireless/ath/ath9k/calib.c --+++ b/drivers/net/wireless/ath/ath9k/calib.c --@@ -241,6 +241,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s -- u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; -- struct ath_common *common = ath9k_hw_common(ah); -- s16 default_nf = ath9k_hw_get_default_nf(ah, chan); --+ u32 bb_agc_ctl = REG_READ(ah, AR_PHY_AGC_CONTROL); -- -- if (ah->caldata) -- h = ah->caldata->nfCalHist; --@@ -264,6 +265,16 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s -- } -- -- /* --+ * stop NF cal if ongoing to ensure NF load completes immediately --+ * (or after end rx/tx frame if ongoing) --+ */ --+ if (bb_agc_ctl & AR_PHY_AGC_CONTROL_NF) { --+ REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); --+ REG_RMW_BUFFER_FLUSH(ah); --+ ENABLE_REG_RMW_BUFFER(ah); --+ } --+ --+ /* -- * Load software filtered NF value into baseband internal minCCApwr -- * variable. -- */ --@@ -276,18 +287,33 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s -- -- /* -- * Wait for load to complete, should be fast, a few 10s of us. --- * The max delay was changed from an original 250us to 10000us --- * since 250us often results in NF load timeout and causes deaf --- * condition during stress testing 12/12/2009 --+ * The max delay was changed from an original 250us to 22.2 msec. --+ * This would increase timeout to the longest possible frame --+ * (11n max length 22.1 msec) -- */ --- for (j = 0; j < 10000; j++) { --+ for (j = 0; j < 22200; j++) { -- if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & --- AR_PHY_AGC_CONTROL_NF) == 0) --+ AR_PHY_AGC_CONTROL_NF) == 0) -- break; -- udelay(10); -- } -- -- /* --+ * Restart NF so it can continue. --+ */ --+ if (bb_agc_ctl & AR_PHY_AGC_CONTROL_NF) { --+ ENABLE_REG_RMW_BUFFER(ah); --+ if (bb_agc_ctl & AR_PHY_AGC_CONTROL_ENABLE_NF) --+ REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, --+ AR_PHY_AGC_CONTROL_ENABLE_NF); --+ if (bb_agc_ctl & AR_PHY_AGC_CONTROL_NO_UPDATE_NF) --+ REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, --+ AR_PHY_AGC_CONTROL_NO_UPDATE_NF); --+ REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); --+ REG_RMW_BUFFER_FLUSH(ah); --+ } --+ --+ /* -- * We timed out waiting for the noisefloor to load, probably due to an -- * in-progress rx. Simply return here and allow the load plenty of time -- * to complete before the next calibration interval. We need to avoid --@@ -296,7 +322,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, s -- * here, the baseband nf cal will just be capped by our present -- * noisefloor until the next calibration timer. -- */ --- if (j == 10000) { --+ if (j == 22200) { -- ath_dbg(common, ANY, -- "Timeout while waiting for nf to load: AR_PHY_AGC_CONTROL=0x%x\n", -- REG_READ(ah, AR_PHY_AGC_CONTROL)); -diff --git a/package/kernel/mac80211/patches/326-ath9k_hw-simplify-ar9003_hw_per_calibration.patch b/package/kernel/mac80211/patches/326-ath9k_hw-simplify-ar9003_hw_per_calibration.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..999d9934cd47c41a53e296915139818ba10f9643 ---- /dev/null -+++ b/package/kernel/mac80211/patches/326-ath9k_hw-simplify-ar9003_hw_per_calibration.patch -@@ -0,0 +1,88 @@ -+From: Felix Fietkau -+Date: Mon, 11 Jul 2016 11:34:47 +0200 -+Subject: [PATCH] ath9k_hw: simplify ar9003_hw_per_calibration -+ -+Reduce indentation, use a variable to save a few pointer dereferences -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c -++++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c -+@@ -75,50 +75,49 @@ static bool ar9003_hw_per_calibration(st -+ struct ath9k_cal_list *currCal) -+ { -+ struct ath9k_hw_cal_data *caldata = ah->caldata; -+- /* Cal is assumed not done until explicitly set below */ -+- bool iscaldone = false; -++ const struct ath9k_percal_data *cur_caldata = currCal->calData; -+ -+ /* Calibration in progress. */ -+ if (currCal->calState == CAL_RUNNING) { -+ /* Check to see if it has finished. */ -+- if (!(REG_READ(ah, AR_PHY_TIMING4) & AR_PHY_TIMING4_DO_CAL)) { -+- /* -+- * Accumulate cal measures for active chains -+- */ -+- currCal->calData->calCollect(ah); -+- ah->cal_samples++; -++ if (REG_READ(ah, AR_PHY_TIMING4) & AR_PHY_TIMING4_DO_CAL) -++ return false; -+ -+- if (ah->cal_samples >= -+- currCal->calData->calNumSamples) { -+- unsigned int i, numChains = 0; -+- for (i = 0; i < AR9300_MAX_CHAINS; i++) { -+- if (rxchainmask & (1 << i)) -+- numChains++; -+- } -++ /* -++ * Accumulate cal measures for active chains -++ */ -++ cur_caldata->calCollect(ah); -++ ah->cal_samples++; -+ -+- /* -+- * Process accumulated data -+- */ -+- currCal->calData->calPostProc(ah, numChains); -++ if (ah->cal_samples >= cur_caldata->calNumSamples) { -++ unsigned int i, numChains = 0; -++ for (i = 0; i < AR9300_MAX_CHAINS; i++) { -++ if (rxchainmask & (1 << i)) -++ numChains++; -++ } -+ -+- /* Calibration has finished. */ -+- caldata->CalValid |= currCal->calData->calType; -+- currCal->calState = CAL_DONE; -+- iscaldone = true; -+- } else { -++ /* -++ * Process accumulated data -++ */ -++ cur_caldata->calPostProc(ah, numChains); -++ -++ /* Calibration has finished. */ -++ caldata->CalValid |= cur_caldata->calType; -++ currCal->calState = CAL_DONE; -++ return true; -++ } else { -+ /* -+ * Set-up collection of another sub-sample until we -+ * get desired number -+ */ -+ ar9003_hw_setup_calibration(ah, currCal); -+- } -+ } -+- } else if (!(caldata->CalValid & currCal->calData->calType)) { -++ } else if (!(caldata->CalValid & cur_caldata->calType)) { -+ /* If current cal is marked invalid in channel, kick it off */ -+ ath9k_hw_reset_calibration(ah, currCal); -+ } -+ -+- return iscaldone; -++ return false; -+ } -+ -+ static int ar9003_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan, -diff --git a/package/kernel/mac80211/patches/327-ath9k_hw-get-rid-of-some-duplicate-code-in-calibrati.patch b/package/kernel/mac80211/patches/327-ath9k_hw-get-rid-of-some-duplicate-code-in-calibrati.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..b7f3823ee625a7e77b84c4e293dbf6ac81fc3db1 ---- /dev/null -+++ b/package/kernel/mac80211/patches/327-ath9k_hw-get-rid-of-some-duplicate-code-in-calibrati.patch -@@ -0,0 +1,94 @@ -+From: Felix Fietkau -+Date: Mon, 11 Jul 2016 11:35:20 +0200 -+Subject: [PATCH] ath9k_hw: get rid of some duplicate code in calibration -+ init -+ -+Remove a misleading debug message as well -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c -++++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c -+@@ -1373,6 +1373,26 @@ static void ar9003_hw_cl_cal_post_proc(s -+ } -+ } -+ -++static void ar9003_hw_init_cal_common(struct ath_hw *ah) -++{ -++ struct ath9k_hw_cal_data *caldata = ah->caldata; -++ -++ /* Initialize list pointers */ -++ ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; -++ -++ INIT_CAL(&ah->iq_caldata); -++ INSERT_CAL(ah, &ah->iq_caldata); -++ -++ /* Initialize current pointer to first element in list */ -++ ah->cal_list_curr = ah->cal_list; -++ -++ if (ah->cal_list_curr) -++ ath9k_hw_reset_calibration(ah, ah->cal_list_curr); -++ -++ if (caldata) -++ caldata->CalValid = 0; -++} -++ -+ static bool ar9003_hw_init_cal_pcoem(struct ath_hw *ah, -+ struct ath9k_channel *chan) -+ { -+@@ -1532,21 +1552,7 @@ skip_tx_iqcal: -+ /* Revert chainmask to runtime parameters */ -+ ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask); -+ -+- /* Initialize list pointers */ -+- ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; -+- -+- INIT_CAL(&ah->iq_caldata); -+- INSERT_CAL(ah, &ah->iq_caldata); -+- ath_dbg(common, CALIBRATE, "enabling IQ Calibration\n"); -+- -+- /* Initialize current pointer to first element in list */ -+- ah->cal_list_curr = ah->cal_list; -+- -+- if (ah->cal_list_curr) -+- ath9k_hw_reset_calibration(ah, ah->cal_list_curr); -+- -+- if (caldata) -+- caldata->CalValid = 0; -++ ar9003_hw_init_cal_common(ah); -+ -+ return true; -+ } -+@@ -1577,8 +1583,6 @@ static bool do_ar9003_agc_cal(struct ath -+ static bool ar9003_hw_init_cal_soc(struct ath_hw *ah, -+ struct ath9k_channel *chan) -+ { -+- struct ath_common *common = ath9k_hw_common(ah); -+- struct ath9k_hw_cal_data *caldata = ah->caldata; -+ bool txiqcal_done = false; -+ bool status = true; -+ bool run_agc_cal = false, sep_iq_cal = false; -+@@ -1676,21 +1680,7 @@ skip_tx_iqcal: -+ /* Revert chainmask to runtime parameters */ -+ ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask); -+ -+- /* Initialize list pointers */ -+- ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; -+- -+- INIT_CAL(&ah->iq_caldata); -+- INSERT_CAL(ah, &ah->iq_caldata); -+- ath_dbg(common, CALIBRATE, "enabling IQ Calibration\n"); -+- -+- /* Initialize current pointer to first element in list */ -+- ah->cal_list_curr = ah->cal_list; -+- -+- if (ah->cal_list_curr) -+- ath9k_hw_reset_calibration(ah, ah->cal_list_curr); -+- -+- if (caldata) -+- caldata->CalValid = 0; -++ ar9003_hw_init_cal_common(ah); -+ -+ return true; -+ } -diff --git a/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch b/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch -deleted file mode 100644 -index f7f9df946a462b5ede16dc61f49f2731ae444af6..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/327-mac80211-Remove-MPP-table-entries-with-MPath.patch -+++ /dev/null -@@ -1,54 +0,0 @@ --From: Henning Rogge --Date: Wed, 3 Feb 2016 13:58:36 +0100 --Subject: [PATCH] mac80211: Remove MPP table entries with MPath -- --Make the mesh_path_del() function remove all mpp table entries --that are proxied by the removed mesh path. -- --Acked-by: Bob Copeland --Signed-off-by: Henning Rogge --Signed-off-by: Johannes Berg ----- -- ----- a/net/mac80211/mesh_pathtbl.c --+++ b/net/mac80211/mesh_pathtbl.c --@@ -835,6 +835,29 @@ void mesh_path_flush_by_nexthop(struct s -- rcu_read_unlock(); -- } -- --+static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata, --+ const u8 *proxy) --+{ --+ struct mesh_table *tbl; --+ struct mesh_path *mpp; --+ struct mpath_node *node; --+ int i; --+ --+ rcu_read_lock(); --+ read_lock_bh(&pathtbl_resize_lock); --+ tbl = resize_dereference_mpp_paths(); --+ for_each_mesh_entry(tbl, node, i) { --+ mpp = node->mpath; --+ if (ether_addr_equal(mpp->mpp, proxy)) { --+ spin_lock(&tbl->hashwlock[i]); --+ __mesh_path_del(tbl, node); --+ spin_unlock(&tbl->hashwlock[i]); --+ } --+ } --+ read_unlock_bh(&pathtbl_resize_lock); --+ rcu_read_unlock(); --+} --+ -- static void table_flush_by_iface(struct mesh_table *tbl, -- struct ieee80211_sub_if_data *sdata) -- { --@@ -892,6 +915,9 @@ int mesh_path_del(struct ieee80211_sub_i -- int hash_idx; -- int err = 0; -- --+ /* flush relevant mpp entries first */ --+ mpp_flush_by_proxy(sdata, addr); --+ -- read_lock_bh(&pathtbl_resize_lock); -- tbl = resize_dereference_mesh_paths(); -- hash_idx = mesh_table_hash(addr, sdata, tbl); -diff --git a/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..cff32ad47cb0b905d9cfa4eb021258b644b2a47a ---- /dev/null -+++ b/package/kernel/mac80211/patches/328-ath9k_hw-implement-temperature-compensation-support-.patch -@@ -0,0 +1,97 @@ -+From: Felix Fietkau -+Date: Mon, 11 Jul 2016 11:35:55 +0200 -+Subject: [PATCH] ath9k_hw: implement temperature compensation support for -+ AR9003+ -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c -++++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c -+@@ -33,6 +33,7 @@ struct coeff { -+ -+ enum ar9003_cal_types { -+ IQ_MISMATCH_CAL = BIT(0), -++ TEMP_COMP_CAL = BIT(1), -+ }; -+ -+ static void ar9003_hw_setup_calibration(struct ath_hw *ah, -+@@ -58,6 +59,12 @@ static void ar9003_hw_setup_calibration( -+ /* Kick-off cal */ -+ REG_SET_BIT(ah, AR_PHY_TIMING4, AR_PHY_TIMING4_DO_CAL); -+ break; -++ case TEMP_COMP_CAL: -++ ath_dbg(common, CALIBRATE, -++ "starting Temperature Compensation Calibration\n"); -++ REG_SET_BIT(ah, AR_CH0_THERM, AR_CH0_THERM_LOCAL); -++ REG_SET_BIT(ah, AR_CH0_THERM, AR_CH0_THERM_START); -++ break; -+ default: -+ ath_err(common, "Invalid calibration type\n"); -+ break; -+@@ -86,7 +93,8 @@ static bool ar9003_hw_per_calibration(st -+ /* -+ * Accumulate cal measures for active chains -+ */ -+- cur_caldata->calCollect(ah); -++ if (cur_caldata->calCollect) -++ cur_caldata->calCollect(ah); -+ ah->cal_samples++; -+ -+ if (ah->cal_samples >= cur_caldata->calNumSamples) { -+@@ -99,7 +107,8 @@ static bool ar9003_hw_per_calibration(st -+ /* -+ * Process accumulated data -+ */ -+- cur_caldata->calPostProc(ah, numChains); -++ if (cur_caldata->calPostProc) -++ cur_caldata->calPostProc(ah, numChains); -+ -+ /* Calibration has finished. */ -+ caldata->CalValid |= cur_caldata->calType; -+@@ -314,9 +323,16 @@ static const struct ath9k_percal_data iq -+ ar9003_hw_iqcalibrate -+ }; -+ -++static const struct ath9k_percal_data temp_cal_single_sample = { -++ TEMP_COMP_CAL, -++ MIN_CAL_SAMPLES, -++ PER_MAX_LOG_COUNT, -++}; -++ -+ static void ar9003_hw_init_cal_settings(struct ath_hw *ah) -+ { -+ ah->iq_caldata.calData = &iq_cal_single_sample; -++ ah->temp_caldata.calData = &temp_cal_single_sample; -+ -+ if (AR_SREV_9300_20_OR_LATER(ah)) { -+ ah->enabled_cals |= TX_IQ_CAL; -+@@ -324,7 +340,7 @@ static void ar9003_hw_init_cal_settings( -+ ah->enabled_cals |= TX_IQ_ON_AGC_CAL; -+ } -+ -+- ah->supp_cals = IQ_MISMATCH_CAL; -++ ah->supp_cals = IQ_MISMATCH_CAL | TEMP_COMP_CAL; -+ } -+ -+ #define OFF_UPPER_LT 24 -+@@ -1383,6 +1399,9 @@ static void ar9003_hw_init_cal_common(st -+ INIT_CAL(&ah->iq_caldata); -+ INSERT_CAL(ah, &ah->iq_caldata); -+ -++ INIT_CAL(&ah->temp_caldata); -++ INSERT_CAL(ah, &ah->temp_caldata); -++ -+ /* Initialize current pointer to first element in list */ -+ ah->cal_list_curr = ah->cal_list; -+ -+--- a/drivers/net/wireless/ath/ath9k/hw.h -++++ b/drivers/net/wireless/ath/ath9k/hw.h -+@@ -830,6 +830,7 @@ struct ath_hw { -+ /* Calibration */ -+ u32 supp_cals; -+ struct ath9k_cal_list iq_caldata; -++ struct ath9k_cal_list temp_caldata; -+ struct ath9k_cal_list adcgain_caldata; -+ struct ath9k_cal_list adcdc_caldata; -+ struct ath9k_cal_list *cal_list; -diff --git a/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch b/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch -deleted file mode 100644 -index 740993c9e0284e5d03a9036ac87fd7548b22ab3b..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/328-mac80211-let-unused-MPP-table-entries-timeout.patch -+++ /dev/null -@@ -1,104 +0,0 @@ --From: Henning Rogge --Date: Wed, 3 Feb 2016 13:58:37 +0100 --Subject: [PATCH] mac80211: let unused MPP table entries timeout -- --Remember the last time when a mpp table entry is used for --rx or tx and remove them after MESH_PATH_EXPIRE time. -- --Acked-by: Bob Copeland --Signed-off-by: Henning Rogge --Signed-off-by: Johannes Berg ----- -- ----- a/net/mac80211/mesh_pathtbl.c --+++ b/net/mac80211/mesh_pathtbl.c --@@ -942,6 +942,46 @@ enddel: -- } -- -- /** --+ * mpp_path_del - delete a mesh proxy path from the table --+ * --+ * @addr: addr address (ETH_ALEN length) --+ * @sdata: local subif --+ * --+ * Returns: 0 if successful --+ */ --+static int mpp_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr) --+{ --+ struct mesh_table *tbl; --+ struct mesh_path *mpath; --+ struct mpath_node *node; --+ struct hlist_head *bucket; --+ int hash_idx; --+ int err = 0; --+ --+ read_lock_bh(&pathtbl_resize_lock); --+ tbl = resize_dereference_mpp_paths(); --+ hash_idx = mesh_table_hash(addr, sdata, tbl); --+ bucket = &tbl->hash_buckets[hash_idx]; --+ --+ spin_lock(&tbl->hashwlock[hash_idx]); --+ hlist_for_each_entry(node, bucket, list) { --+ mpath = node->mpath; --+ if (mpath->sdata == sdata && --+ ether_addr_equal(addr, mpath->dst)) { --+ __mesh_path_del(tbl, node); --+ goto enddel; --+ } --+ } --+ --+ err = -ENXIO; --+enddel: --+ mesh_paths_generation++; --+ spin_unlock(&tbl->hashwlock[hash_idx]); --+ read_unlock_bh(&pathtbl_resize_lock); --+ return err; --+} --+ --+/** -- * mesh_path_tx_pending - sends pending frames in a mesh path queue -- * -- * @mpath: mesh path to activate --@@ -1157,6 +1197,17 @@ void mesh_path_expire(struct ieee80211_s -- time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE)) -- mesh_path_del(mpath->sdata, mpath->dst); -- } --+ --+ tbl = rcu_dereference(mpp_paths); --+ for_each_mesh_entry(tbl, node, i) { --+ if (node->mpath->sdata != sdata) --+ continue; --+ mpath = node->mpath; --+ if ((!(mpath->flags & MESH_PATH_FIXED)) && --+ time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE)) --+ mpp_path_del(mpath->sdata, mpath->dst); --+ } --+ -- rcu_read_unlock(); -- } -- ----- a/net/mac80211/rx.c --+++ b/net/mac80211/rx.c --@@ -2291,6 +2291,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80 -- spin_lock_bh(&mppath->state_lock); -- if (!ether_addr_equal(mppath->mpp, mpp_addr)) -- memcpy(mppath->mpp, mpp_addr, ETH_ALEN); --+ mppath->exp_time = jiffies; -- spin_unlock_bh(&mppath->state_lock); -- } -- rcu_read_unlock(); ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -2171,8 +2171,11 @@ static struct sk_buff *ieee80211_build_h -- mpp_lookup = true; -- } -- --- if (mpp_lookup) --+ if (mpp_lookup) { -- mppath = mpp_path_lookup(sdata, skb->data); --+ if (mppath) --+ mppath->exp_time = jiffies; --+ } -- -- if (mppath && mpath) -- mesh_path_del(mpath->sdata, mpath->dst); -diff --git a/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch b/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch -deleted file mode 100644 -index 0c36b1d5687447021eaa560d08b16580351b4a20..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/329-mac80211-Unify-mesh-and-mpp-path-removal-function.patch -+++ /dev/null -@@ -1,143 +0,0 @@ --From: Henning Rogge --Date: Wed, 3 Feb 2016 13:58:38 +0100 --Subject: [PATCH] mac80211: Unify mesh and mpp path removal function -- --mpp_path_del() and mesh_path_del() are mostly the same function. --Move common code into a new static function. -- --Acked-by: Bob Copeland --Signed-off-by: Henning Rogge --Signed-off-by: Johannes Berg ----- -- ----- a/net/mac80211/mesh_pathtbl.c --+++ b/net/mac80211/mesh_pathtbl.c --@@ -55,16 +55,21 @@ int mpp_paths_generation; -- static DEFINE_RWLOCK(pathtbl_resize_lock); -- -- --+static inline struct mesh_table *resize_dereference_paths( --+ struct mesh_table __rcu *table) --+{ --+ return rcu_dereference_protected(table, --+ lockdep_is_held(&pathtbl_resize_lock)); --+} --+ -- static inline struct mesh_table *resize_dereference_mesh_paths(void) -- { --- return rcu_dereference_protected(mesh_paths, --- lockdep_is_held(&pathtbl_resize_lock)); --+ return resize_dereference_paths(mesh_paths); -- } -- -- static inline struct mesh_table *resize_dereference_mpp_paths(void) -- { --- return rcu_dereference_protected(mpp_paths, --- lockdep_is_held(&pathtbl_resize_lock)); --+ return resize_dereference_paths(mpp_paths); -- } -- -- /* --@@ -899,14 +904,17 @@ void mesh_path_flush_by_iface(struct iee -- } -- -- /** --- * mesh_path_del - delete a mesh path from the table --+ * table_path_del - delete a path from the mesh or mpp table -- * --- * @addr: dst address (ETH_ALEN length) --+ * @tbl: mesh or mpp path table -- * @sdata: local subif --+ * @addr: dst address (ETH_ALEN length) -- * -- * Returns: 0 if successful -- */ ---int mesh_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr) --+static int table_path_del(struct mesh_table __rcu *rcu_tbl, --+ struct ieee80211_sub_if_data *sdata, --+ const u8 *addr) -- { -- struct mesh_table *tbl; -- struct mesh_path *mpath; --@@ -915,11 +923,7 @@ int mesh_path_del(struct ieee80211_sub_i -- int hash_idx; -- int err = 0; -- --- /* flush relevant mpp entries first */ --- mpp_flush_by_proxy(sdata, addr); --- --- read_lock_bh(&pathtbl_resize_lock); --- tbl = resize_dereference_mesh_paths(); --+ tbl = resize_dereference_paths(rcu_tbl); -- hash_idx = mesh_table_hash(addr, sdata, tbl); -- bucket = &tbl->hash_buckets[hash_idx]; -- --@@ -935,9 +939,30 @@ int mesh_path_del(struct ieee80211_sub_i -- -- err = -ENXIO; -- enddel: --- mesh_paths_generation++; -- spin_unlock(&tbl->hashwlock[hash_idx]); --+ return err; --+} --+ --+/** --+ * mesh_path_del - delete a mesh path from the table --+ * --+ * @addr: dst address (ETH_ALEN length) --+ * @sdata: local subif --+ * --+ * Returns: 0 if successful --+ */ --+int mesh_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr) --+{ --+ int err = 0; --+ --+ /* flush relevant mpp entries first */ --+ mpp_flush_by_proxy(sdata, addr); --+ --+ read_lock_bh(&pathtbl_resize_lock); --+ err = table_path_del(mesh_paths, sdata, addr); --+ mesh_paths_generation++; -- read_unlock_bh(&pathtbl_resize_lock); --+ -- return err; -- } -- --@@ -951,33 +976,13 @@ enddel: -- */ -- static int mpp_path_del(struct ieee80211_sub_if_data *sdata, const u8 *addr) -- { --- struct mesh_table *tbl; --- struct mesh_path *mpath; --- struct mpath_node *node; --- struct hlist_head *bucket; --- int hash_idx; -- int err = 0; -- -- read_lock_bh(&pathtbl_resize_lock); --- tbl = resize_dereference_mpp_paths(); --- hash_idx = mesh_table_hash(addr, sdata, tbl); --- bucket = &tbl->hash_buckets[hash_idx]; --- --- spin_lock(&tbl->hashwlock[hash_idx]); --- hlist_for_each_entry(node, bucket, list) { --- mpath = node->mpath; --- if (mpath->sdata == sdata && --- ether_addr_equal(addr, mpath->dst)) { --- __mesh_path_del(tbl, node); --- goto enddel; --- } --- } --- --- err = -ENXIO; ---enddel: --- mesh_paths_generation++; --- spin_unlock(&tbl->hashwlock[hash_idx]); --+ err = table_path_del(mpp_paths, sdata, addr); --+ mpp_paths_generation++; -- read_unlock_bh(&pathtbl_resize_lock); --+ -- return err; -- } -- -diff --git a/package/kernel/mac80211/patches/329-mac80211-fix-check-for-buffered-powersave-frames-wit.patch b/package/kernel/mac80211/patches/329-mac80211-fix-check-for-buffered-powersave-frames-wit.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..38e541c7150aaf9b32eed89f8edfdf989d4677f7 ---- /dev/null -+++ b/package/kernel/mac80211/patches/329-mac80211-fix-check-for-buffered-powersave-frames-wit.patch -@@ -0,0 +1,21 @@ -+From: Felix Fietkau -+Date: Mon, 11 Jul 2016 15:07:06 +0200 -+Subject: [PATCH] mac80211: fix check for buffered powersave frames with txq -+ -+The logic was inverted here, set the bit if frames are pending. -+ -+Fixes: ba8c3d6f16a1 ("mac80211: add an intermediate software queue implementation") -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/net/mac80211/rx.c -++++ b/net/mac80211/rx.c -+@@ -1268,7 +1268,7 @@ static void sta_ps_start(struct sta_info -+ for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) { -+ struct txq_info *txqi = to_txq_info(sta->sta.txq[tid]); -+ -+- if (!txqi->tin.backlog_packets) -++ if (txqi->tin.backlog_packets) -+ set_bit(tid, &sta->txq_buffered_tids); -+ else -+ clear_bit(tid, &sta->txq_buffered_tids); -diff --git a/package/kernel/mac80211/patches/330-ath10k-fix-rx-status-reporting-for-A-MSDU-subframes.patch b/package/kernel/mac80211/patches/330-ath10k-fix-rx-status-reporting-for-A-MSDU-subframes.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..a6031b9c265d87656f04a7f7a639233949054818 ---- /dev/null -+++ b/package/kernel/mac80211/patches/330-ath10k-fix-rx-status-reporting-for-A-MSDU-subframes.patch -@@ -0,0 +1,36 @@ -+From: Felix Fietkau -+Date: Sun, 17 Jul 2016 12:49:59 +0200 -+Subject: [PATCH] ath10k: fix rx status reporting for A-MSDU subframes -+ -+Patch by Nagarajan, Ashok Raj -+ -+Signed-off-by: Felix Fietkau -+--- -+ -+--- a/drivers/net/wireless/ath/ath10k/htt_rx.c -++++ b/drivers/net/wireless/ath/ath10k/htt_rx.c -+@@ -1525,7 +1525,7 @@ static void ath10k_htt_rx_h_filter(struc -+ static int ath10k_htt_rx_handle_amsdu(struct ath10k_htt *htt) -+ { -+ struct ath10k *ar = htt->ar; -+- static struct ieee80211_rx_status rx_status; -++ struct ieee80211_rx_status *rx_status = &htt->rx_status; -+ struct sk_buff_head amsdu; -+ int ret; -+ -+@@ -1549,11 +1549,11 @@ static int ath10k_htt_rx_handle_amsdu(st -+ return ret; -+ } -+ -+- ath10k_htt_rx_h_ppdu(ar, &amsdu, &rx_status, 0xffff); -++ ath10k_htt_rx_h_ppdu(ar, &amsdu, rx_status, 0xffff); -+ ath10k_htt_rx_h_unchain(ar, &amsdu, ret > 0); -+- ath10k_htt_rx_h_filter(ar, &amsdu, &rx_status); -+- ath10k_htt_rx_h_mpdu(ar, &amsdu, &rx_status); -+- ath10k_htt_rx_h_deliver(ar, &amsdu, &rx_status); -++ ath10k_htt_rx_h_filter(ar, &amsdu, rx_status); -++ ath10k_htt_rx_h_mpdu(ar, &amsdu, rx_status); -++ ath10k_htt_rx_h_deliver(ar, &amsdu, rx_status); -+ -+ return 0; -+ } -diff --git a/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch b/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch -deleted file mode 100644 -index 4dc6d663ed7af432b5d26338ef74732abe6aa31c..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/330-mac80211-minstrel-Change-expected-throughput-unit-ba.patch -+++ /dev/null -@@ -1,51 +0,0 @@ --From: Sven Eckelmann --Date: Tue, 2 Feb 2016 08:12:26 +0100 --Subject: [PATCH] mac80211: minstrel: Change expected throughput unit back to -- Kbps -- --The change from cur_tp to the function --minstrel_get_tp_avg/minstrel_ht_get_tp_avg changed the unit used for the --current throughput. For example in minstrel_ht the correct --conversion between them would be: -- -- mrs->cur_tp / 10 == minstrel_ht_get_tp_avg(..). -- --This factor 10 must also be included in the calculation of --minstrel_get_expected_throughput and minstrel_ht_get_expected_throughput to --return values with the unit [Kbps] instead of [10Kbps]. Otherwise routing --algorithms like B.A.T.M.A.N. V will make incorrect decision based on these --values. Its kernel based implementation expects expected_throughput always --to have the unit [Kbps] and not sometimes [10Kbps] and sometimes [Kbps]. -- --The same requirement has iw or olsrdv2's nl80211 based statistics module --which retrieve the same data via NL80211_STA_INFO_TX_BITRATE. -- --Cc: stable@vger.kernel.org --Fixes: 6a27b2c40b48 ("mac80211: restructure per-rate throughput calculation into function") --Signed-off-by: Sven Eckelmann --Signed-off-by: Johannes Berg ----- -- ----- a/net/mac80211/rc80211_minstrel.c --+++ b/net/mac80211/rc80211_minstrel.c --@@ -711,7 +711,7 @@ static u32 minstrel_get_expected_through -- * computing cur_tp -- */ -- tmp_mrs = &mi->r[idx].stats; --- tmp_cur_tp = minstrel_get_tp_avg(&mi->r[idx], tmp_mrs->prob_ewma); --+ tmp_cur_tp = minstrel_get_tp_avg(&mi->r[idx], tmp_mrs->prob_ewma) * 10; -- tmp_cur_tp = tmp_cur_tp * 1200 * 8 / 1024; -- -- return tmp_cur_tp; ----- a/net/mac80211/rc80211_minstrel_ht.c --+++ b/net/mac80211/rc80211_minstrel_ht.c --@@ -1335,7 +1335,8 @@ static u32 minstrel_ht_get_expected_thro -- prob = mi->groups[i].rates[j].prob_ewma; -- -- /* convert tp_avg from pkt per second in kbps */ --- tp_avg = minstrel_ht_get_tp_avg(mi, i, j, prob) * AVG_PKT_SIZE * 8 / 1024; --+ tp_avg = minstrel_ht_get_tp_avg(mi, i, j, prob) * 10; --+ tp_avg = tp_avg * AVG_PKT_SIZE * 8 / 1024; -- -- return tp_avg; -- } -diff --git a/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch b/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch -deleted file mode 100644 -index 1fd016f7f6bc9ad7bd4265e16a439b4de33b8f9c..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/331-brcmfmac-Increase-nr-of-supported-flowrings.patch -+++ /dev/null -@@ -1,307 +0,0 @@ --From: Hante Meuleman --Date: Sun, 7 Feb 2016 18:08:24 +0100 --Subject: [PATCH] brcmfmac: Increase nr of supported flowrings. --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --New generation devices have firmware which has more than 256 flowrings. --E.g. following debugging message comes from 14e4:4365 BCM4366: --[ 194.606245] brcmfmac: brcmf_pcie_init_ringbuffers Nr of flowrings is 264 -- --At various code places (related to flowrings) we were using u8 which --could lead to storing wrong number or infinite loops when indexing with --this type. This issue was quite easy to spot in brcmf_flowring_detach --where it led to infinite loop e.g. on failed initialization. -- --This patch switches code to proper types and increases the maximum --number of supported flowrings to 512. -- --Originally this change was sent in September 2015, but back it was --causing a regression on BCM43602 resulting in: --Unable to handle kernel NULL pointer dereference at virtual address ... -- --The reason for this regression was missing update (s/u8/u16) of struct --brcmf_flowring_ring. This problem was handled in 9f64df9 ("brcmfmac: Fix --bug in flowring management."). Starting with that it's safe to apply --this original patch as it doesn't cause a regression anymore. -- --This patch fixes an infinite loop on BCM4366 which is supported since --4.4 so it makes sense to apply it to stable 4.4+. -- --Cc: # 4.4+ --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Rafał Miłecki ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c --@@ -32,7 +32,7 @@ -- #define BRCMF_FLOWRING_LOW (BRCMF_FLOWRING_HIGH - 256) -- #define BRCMF_FLOWRING_INVALID_IFIDX 0xff -- ---#define BRCMF_FLOWRING_HASH_AP(da, fifo, ifidx) (da[5] + fifo + ifidx * 16) --+#define BRCMF_FLOWRING_HASH_AP(da, fifo, ifidx) (da[5] * 2 + fifo + ifidx * 16) -- #define BRCMF_FLOWRING_HASH_STA(fifo, ifidx) (fifo + ifidx * 16) -- -- static const u8 brcmf_flowring_prio2fifo[] = { --@@ -68,7 +68,7 @@ u32 brcmf_flowring_lookup(struct brcmf_f -- u8 prio, u8 ifidx) -- { -- struct brcmf_flowring_hash *hash; --- u8 hash_idx; --+ u16 hash_idx; -- u32 i; -- bool found; -- bool sta; --@@ -88,6 +88,7 @@ u32 brcmf_flowring_lookup(struct brcmf_f -- } -- hash_idx = sta ? BRCMF_FLOWRING_HASH_STA(fifo, ifidx) : -- BRCMF_FLOWRING_HASH_AP(mac, fifo, ifidx); --+ hash_idx &= (BRCMF_FLOWRING_HASHSIZE - 1); -- found = false; -- hash = flow->hash; -- for (i = 0; i < BRCMF_FLOWRING_HASHSIZE; i++) { --@@ -98,6 +99,7 @@ u32 brcmf_flowring_lookup(struct brcmf_f -- break; -- } -- hash_idx++; --+ hash_idx &= (BRCMF_FLOWRING_HASHSIZE - 1); -- } -- if (found) -- return hash[hash_idx].flowid; --@@ -111,7 +113,7 @@ u32 brcmf_flowring_create(struct brcmf_f -- { -- struct brcmf_flowring_ring *ring; -- struct brcmf_flowring_hash *hash; --- u8 hash_idx; --+ u16 hash_idx; -- u32 i; -- bool found; -- u8 fifo; --@@ -131,6 +133,7 @@ u32 brcmf_flowring_create(struct brcmf_f -- } -- hash_idx = sta ? BRCMF_FLOWRING_HASH_STA(fifo, ifidx) : -- BRCMF_FLOWRING_HASH_AP(mac, fifo, ifidx); --+ hash_idx &= (BRCMF_FLOWRING_HASHSIZE - 1); -- found = false; -- hash = flow->hash; -- for (i = 0; i < BRCMF_FLOWRING_HASHSIZE; i++) { --@@ -140,6 +143,7 @@ u32 brcmf_flowring_create(struct brcmf_f -- break; -- } -- hash_idx++; --+ hash_idx &= (BRCMF_FLOWRING_HASHSIZE - 1); -- } -- if (found) { -- for (i = 0; i < flow->nrofrings; i++) { --@@ -169,7 +173,7 @@ u32 brcmf_flowring_create(struct brcmf_f -- } -- -- ---u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid) --+u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u16 flowid) -- { -- struct brcmf_flowring_ring *ring; -- --@@ -179,7 +183,7 @@ u8 brcmf_flowring_tid(struct brcmf_flowr -- } -- -- ---static void brcmf_flowring_block(struct brcmf_flowring *flow, u8 flowid, --+static void brcmf_flowring_block(struct brcmf_flowring *flow, u16 flowid, -- bool blocked) -- { -- struct brcmf_flowring_ring *ring; --@@ -228,10 +232,10 @@ static void brcmf_flowring_block(struct -- } -- -- ---void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid) --+void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid) -- { -- struct brcmf_flowring_ring *ring; --- u8 hash_idx; --+ u16 hash_idx; -- struct sk_buff *skb; -- -- ring = flow->rings[flowid]; --@@ -253,7 +257,7 @@ void brcmf_flowring_delete(struct brcmf_ -- } -- -- ---u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid, --+u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u16 flowid, -- struct sk_buff *skb) -- { -- struct brcmf_flowring_ring *ring; --@@ -279,7 +283,7 @@ u32 brcmf_flowring_enqueue(struct brcmf_ -- } -- -- ---struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid) --+struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u16 flowid) -- { -- struct brcmf_flowring_ring *ring; -- struct sk_buff *skb; --@@ -300,7 +304,7 @@ struct sk_buff *brcmf_flowring_dequeue(s -- } -- -- ---void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid, --+void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u16 flowid, -- struct sk_buff *skb) -- { -- struct brcmf_flowring_ring *ring; --@@ -311,7 +315,7 @@ void brcmf_flowring_reinsert(struct brcm -- } -- -- ---u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u8 flowid) --+u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u16 flowid) -- { -- struct brcmf_flowring_ring *ring; -- --@@ -326,7 +330,7 @@ u32 brcmf_flowring_qlen(struct brcmf_flo -- } -- -- ---void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid) --+void brcmf_flowring_open(struct brcmf_flowring *flow, u16 flowid) -- { -- struct brcmf_flowring_ring *ring; -- --@@ -340,10 +344,10 @@ void brcmf_flowring_open(struct brcmf_fl -- } -- -- ---u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u8 flowid) --+u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u16 flowid) -- { -- struct brcmf_flowring_ring *ring; --- u8 hash_idx; --+ u16 hash_idx; -- -- ring = flow->rings[flowid]; -- hash_idx = ring->hash_id; --@@ -384,7 +388,7 @@ void brcmf_flowring_detach(struct brcmf_ -- struct brcmf_pub *drvr = bus_if->drvr; -- struct brcmf_flowring_tdls_entry *search; -- struct brcmf_flowring_tdls_entry *remove; --- u8 flowid; --+ u16 flowid; -- -- for (flowid = 0; flowid < flow->nrofrings; flowid++) { -- if (flow->rings[flowid]) --@@ -408,7 +412,7 @@ void brcmf_flowring_configure_addr_mode( -- struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev); -- struct brcmf_pub *drvr = bus_if->drvr; -- u32 i; --- u8 flowid; --+ u16 flowid; -- -- if (flow->addr_mode[ifidx] != addr_mode) { -- for (i = 0; i < ARRAY_SIZE(flow->hash); i++) { --@@ -434,7 +438,7 @@ void brcmf_flowring_delete_peer(struct b -- struct brcmf_flowring_tdls_entry *prev; -- struct brcmf_flowring_tdls_entry *search; -- u32 i; --- u8 flowid; --+ u16 flowid; -- bool sta; -- -- sta = (flow->addr_mode[ifidx] == ADDR_INDIRECT); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h --@@ -16,7 +16,7 @@ -- #define BRCMFMAC_FLOWRING_H -- -- ---#define BRCMF_FLOWRING_HASHSIZE 256 --+#define BRCMF_FLOWRING_HASHSIZE 512 /* has to be 2^x */ -- #define BRCMF_FLOWRING_INVALID_ID 0xFFFFFFFF -- -- --@@ -24,7 +24,7 @@ struct brcmf_flowring_hash { -- u8 mac[ETH_ALEN]; -- u8 fifo; -- u8 ifidx; --- u8 flowid; --+ u16 flowid; -- }; -- -- enum ring_status { --@@ -61,16 +61,16 @@ u32 brcmf_flowring_lookup(struct brcmf_f -- u8 prio, u8 ifidx); -- u32 brcmf_flowring_create(struct brcmf_flowring *flow, u8 da[ETH_ALEN], -- u8 prio, u8 ifidx); ---void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid); ---void brcmf_flowring_open(struct brcmf_flowring *flow, u8 flowid); ---u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u8 flowid); ---u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u8 flowid, --+void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid); --+void brcmf_flowring_open(struct brcmf_flowring *flow, u16 flowid); --+u8 brcmf_flowring_tid(struct brcmf_flowring *flow, u16 flowid); --+u32 brcmf_flowring_enqueue(struct brcmf_flowring *flow, u16 flowid, -- struct sk_buff *skb); ---struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u8 flowid); ---void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u8 flowid, --+struct sk_buff *brcmf_flowring_dequeue(struct brcmf_flowring *flow, u16 flowid); --+void brcmf_flowring_reinsert(struct brcmf_flowring *flow, u16 flowid, -- struct sk_buff *skb); ---u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u8 flowid); ---u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u8 flowid); --+u32 brcmf_flowring_qlen(struct brcmf_flowring *flow, u16 flowid); --+u8 brcmf_flowring_ifidx_get(struct brcmf_flowring *flow, u16 flowid); -- struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings); -- void brcmf_flowring_detach(struct brcmf_flowring *flow); -- void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx, ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --@@ -677,7 +677,7 @@ static u32 brcmf_msgbuf_flowring_create( -- } -- -- ---static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u8 flowid) --+static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u16 flowid) -- { -- struct brcmf_flowring *flow = msgbuf->flow; -- struct brcmf_commonring *commonring; --@@ -1310,7 +1310,7 @@ int brcmf_proto_msgbuf_rx_trigger(struct -- } -- -- ---void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u8 flowid) --+void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid) -- { -- struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; -- struct msgbuf_tx_flowring_delete_req *delete; --@@ -1415,6 +1415,13 @@ int brcmf_proto_msgbuf_attach(struct brc -- u32 count; -- -- if_msgbuf = drvr->bus_if->msgbuf; --+ --+ if (if_msgbuf->nrof_flowrings >= BRCMF_FLOWRING_HASHSIZE) { --+ brcmf_err("driver not configured for this many flowrings %d\n", --+ if_msgbuf->nrof_flowrings); --+ if_msgbuf->nrof_flowrings = BRCMF_FLOWRING_HASHSIZE - 1; --+ } --+ -- msgbuf = kzalloc(sizeof(*msgbuf), GFP_KERNEL); -- if (!msgbuf) -- goto fail; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h --@@ -33,7 +33,7 @@ -- -- -- int brcmf_proto_msgbuf_rx_trigger(struct device *dev); ---void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u8 flowid); --+void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid); -- int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr); -- void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr); -- #else -diff --git a/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch b/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch -deleted file mode 100644 -index e414f23784163abfeba59d9e523e3684643c038a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/332-cfg80211-fix-faulty-variable-initialization-in-ieee8.patch -+++ /dev/null -@@ -1,22 +0,0 @@ --From: Felix Fietkau --Date: Mon, 8 Feb 2016 14:24:36 +0100 --Subject: [PATCH] cfg80211: fix faulty variable initialization in -- ieee80211_amsdu_to_8023s -- --reuse_skb is set to true if the code decides to use the last segment. --Fixes a memory leak -- --Signed-off-by: Felix Fietkau ----- -- ----- a/net/wireless/util.c --+++ b/net/wireless/util.c --@@ -676,7 +676,7 @@ void ieee80211_amsdu_to_8023s(struct sk_ -- u8 *payload; -- int offset = 0, remaining, err; -- struct ethhdr eth; --- bool reuse_skb = true; --+ bool reuse_skb = false; -- bool last = false; -- -- if (has_80211_header) { -diff --git a/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch b/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch -deleted file mode 100644 -index 6e2d0cf5b0783860cb39264e33ecdef622fcc548..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/333-cfg80211-reuse-existing-page-fragments-in-A-MSDU-rx.patch -+++ /dev/null -@@ -1,132 +0,0 @@ --From: Felix Fietkau --Date: Mon, 8 Feb 2016 14:33:19 +0100 --Subject: [PATCH] cfg80211: reuse existing page fragments in A-MSDU rx -- --This massively reduces data copying and thus improves rx performance -- --Signed-off-by: Felix Fietkau ----- -- ----- a/net/wireless/util.c --+++ b/net/wireless/util.c --@@ -644,23 +644,93 @@ int ieee80211_data_from_8023(struct sk_b -- } -- EXPORT_SYMBOL(ieee80211_data_from_8023); -- --+static void --+__frame_add_frag(struct sk_buff *skb, struct page *page, --+ void *ptr, int len, int size) --+{ --+ struct skb_shared_info *sh = skb_shinfo(skb); --+ int page_offset; --+ --+ atomic_inc(&page->_count); --+ page_offset = ptr - page_address(page); --+ skb_add_rx_frag(skb, sh->nr_frags, page, page_offset, len, size); --+} --+ --+static void --+__ieee80211_amsdu_copy_frag(struct sk_buff *skb, struct sk_buff *frame, --+ int offset, int len) --+{ --+ struct skb_shared_info *sh = skb_shinfo(skb); --+ const skb_frag_t *frag = &sh->frags[-1]; --+ struct page *frag_page; --+ void *frag_ptr; --+ int frag_len, frag_size; --+ int head_size = skb->len - skb->data_len; --+ int cur_len; --+ --+ frag_page = virt_to_head_page(skb->head); --+ frag_ptr = skb->data; --+ frag_size = head_size; --+ --+ while (offset >= frag_size) { --+ offset -= frag_size; --+ frag++; --+ frag_page = skb_frag_page(frag); --+ frag_ptr = skb_frag_address(frag); --+ frag_size = skb_frag_size(frag); --+ } --+ --+ frag_ptr += offset; --+ frag_len = frag_size - offset; --+ --+ cur_len = min(len, frag_len); --+ --+ __frame_add_frag(frame, frag_page, frag_ptr, cur_len, frag_size); --+ len -= cur_len; --+ --+ while (len > 0) { --+ frag++; --+ frag_len = skb_frag_size(frag); --+ cur_len = min(len, frag_len); --+ __frame_add_frag(frame, skb_frag_page(frag), --+ skb_frag_address(frag), cur_len, frag_len); --+ len -= cur_len; --+ } --+} --+ -- static struct sk_buff * -- __ieee80211_amsdu_copy(struct sk_buff *skb, unsigned int hlen, --- int offset, int len) --+ int offset, int len, bool reuse_frag) -- { -- struct sk_buff *frame; --+ int cur_len = len; -- -- if (skb->len - offset < len) -- return NULL; -- -- /* --+ * When reusing framents, copy some data to the head to simplify --+ * ethernet header handling and speed up protocol header processing --+ * in the stack later. --+ */ --+ if (reuse_frag) --+ cur_len = min_t(int, len, 32); --+ --+ /* -- * Allocate and reserve two bytes more for payload -- * alignment since sizeof(struct ethhdr) is 14. -- */ --- frame = dev_alloc_skb(hlen + sizeof(struct ethhdr) + 2 + len); --+ frame = dev_alloc_skb(hlen + sizeof(struct ethhdr) + 2 + cur_len); -- -- skb_reserve(frame, hlen + sizeof(struct ethhdr) + 2); --- skb_copy_bits(skb, offset, skb_put(frame, len), len); --+ skb_copy_bits(skb, offset, skb_put(frame, cur_len), cur_len); --+ --+ len -= cur_len; --+ if (!len) --+ return frame; --+ --+ offset += cur_len; --+ __ieee80211_amsdu_copy_frag(skb, frame, offset, len); -- -- return frame; -- } --@@ -676,6 +746,7 @@ void ieee80211_amsdu_to_8023s(struct sk_ -- u8 *payload; -- int offset = 0, remaining, err; -- struct ethhdr eth; --+ bool reuse_frag = skb->head_frag && !skb_has_frag_list(skb); -- bool reuse_skb = false; -- bool last = false; -- --@@ -703,12 +774,13 @@ void ieee80211_amsdu_to_8023s(struct sk_ -- offset += sizeof(struct ethhdr); -- /* reuse skb for the last subframe */ -- last = remaining <= subframe_len + padding; --- if (!skb_is_nonlinear(skb) && last) { --+ if (!skb_is_nonlinear(skb) && !reuse_frag && last) { -- skb_pull(skb, offset); -- frame = skb; -- reuse_skb = true; -- } else { --- frame = __ieee80211_amsdu_copy(skb, hlen, offset, len); --+ frame = __ieee80211_amsdu_copy(skb, hlen, offset, len, --+ reuse_frag); -- if (!frame) -- goto purge; -- -diff --git a/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch b/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch -deleted file mode 100644 -index f8f4f0999dd2185090fdffef1d80629f15a67dd2..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/334-mac80211-fix-wiphy-supported_band-access.patch -+++ /dev/null -@@ -1,36 +0,0 @@ --From: Lorenzo Bianconi --Date: Wed, 10 Feb 2016 16:08:17 +0100 --Subject: [PATCH] mac80211: fix wiphy supported_band access -- --Fix wiphy supported_band access in tx radiotap parsing. In particular, --info->band is always set to 0 (IEEE80211_BAND_2GHZ) since it has not --assigned yet. This cause a kernel crash on 5GHz only devices. --Move ieee80211_parse_tx_radiotap() after info->band assignment -- --Signed-off-by: Lorenzo Bianconi ----- -- ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -1890,10 +1890,6 @@ netdev_tx_t ieee80211_monitor_start_xmit -- info->flags = IEEE80211_TX_CTL_REQ_TX_STATUS | -- IEEE80211_TX_CTL_INJECTED; -- --- /* process and remove the injection radiotap header */ --- if (!ieee80211_parse_tx_radiotap(local, skb)) --- goto fail; --- -- rcu_read_lock(); -- -- /* --@@ -1955,6 +1951,10 @@ netdev_tx_t ieee80211_monitor_start_xmit -- goto fail_rcu; -- -- info->band = chandef->chan->band; --+ /* process and remove the injection radiotap header */ --+ if (!ieee80211_parse_tx_radiotap(local, skb)) --+ goto fail_rcu; --+ -- ieee80211_xmit(sdata, NULL, skb); -- rcu_read_unlock(); -- -diff --git a/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch b/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch -deleted file mode 100644 -index acaacf7cacc3ecf380dd69794aaa6b07b5403708..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/335-mac80211-minstrel_ht-set-A-MSDU-tx-limits-based-on-s.patch -+++ /dev/null -@@ -1,61 +0,0 @@ --From: Felix Fietkau --Date: Thu, 18 Feb 2016 19:30:05 +0100 --Subject: [PATCH] mac80211: minstrel_ht: set A-MSDU tx limits based on selected -- max_prob_rate -- --Prevents excessive A-MSDU aggregation at low data rates or bad --conditions. -- --Signed-off-by: Felix Fietkau ----- -- ----- a/net/mac80211/rc80211_minstrel_ht.c --+++ b/net/mac80211/rc80211_minstrel_ht.c --@@ -883,6 +883,39 @@ minstrel_ht_set_rate(struct minstrel_pri -- ratetbl->rate[offset].flags = flags; -- } -- --+static int --+minstrel_ht_get_max_amsdu_len(struct minstrel_ht_sta *mi) --+{ --+ int group = mi->max_prob_rate / MCS_GROUP_RATES; --+ const struct mcs_group *g = &minstrel_mcs_groups[group]; --+ int rate = mi->max_prob_rate % MCS_GROUP_RATES; --+ --+ /* Disable A-MSDU if max_prob_rate is bad */ --+ if (mi->groups[group].rates[rate].prob_ewma < MINSTREL_FRAC(50, 100)) --+ return 1; --+ --+ /* If the rate is slower than single-stream MCS1, make A-MSDU limit small */ --+ if (g->duration[rate] > MCS_DURATION(1, 0, 52)) --+ return 500; --+ --+ /* --+ * If the rate is slower than single-stream MCS4, limit A-MSDU to usual --+ * data packet size --+ */ --+ if (g->duration[rate] > MCS_DURATION(1, 0, 104)) --+ return 1500; --+ --+ /* --+ * If the rate is slower than single-stream MCS7, limit A-MSDU to twice --+ * the usual data packet size --+ */ --+ if (g->duration[rate] > MCS_DURATION(1, 0, 260)) --+ return 3000; --+ --+ /* unlimited */ --+ return 0; --+} --+ -- static void -- minstrel_ht_update_rates(struct minstrel_priv *mp, struct minstrel_ht_sta *mi) -- { --@@ -907,6 +940,7 @@ minstrel_ht_update_rates(struct minstrel -- minstrel_ht_set_rate(mp, mi, rates, i++, mi->max_prob_rate); -- } -- --+ mi->sta->max_rc_amsdu_len = minstrel_ht_get_max_amsdu_len(mi); -- rates->rate[i].idx = -1; -- rate_control_set_rates(mp->hw, mi->sta, rates); -- } -diff --git a/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch b/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch -deleted file mode 100644 -index 32a2ad6f0bcdafc499f257b6f925aaf0499e24c0..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/336-mac80211-minstrel_ht-set-default-tx-aggregation-time.patch -+++ /dev/null -@@ -1,31 +0,0 @@ --From: Felix Fietkau --Date: Thu, 18 Feb 2016 19:45:33 +0100 --Subject: [PATCH] mac80211: minstrel_ht: set default tx aggregation timeout to -- 0 -- --The value 5000 was put here with the addition of the timeout field to --ieee80211_start_tx_ba_session. It was originally added in mac80211 to --save resources for drivers like iwlwifi, which only supports a limited --number of concurrent aggregation sessions. -- --Since iwlwifi does not use minstrel_ht and other drivers don't need --this, 0 is a better default - especially since there have been --recent reports of aggregation setup related issues reproduced with --ath9k. This should improve stability without causing any adverse --effects. -- --Cc: stable@vger.kernel.org --Signed-off-by: Felix Fietkau ----- -- ----- a/net/mac80211/rc80211_minstrel_ht.c --+++ b/net/mac80211/rc80211_minstrel_ht.c --@@ -692,7 +692,7 @@ minstrel_aggr_check(struct ieee80211_sta -- if (likely(sta->ampdu_mlme.tid_tx[tid])) -- return; -- --- ieee80211_start_tx_ba_session(pubsta, tid, 5000); --+ ieee80211_start_tx_ba_session(pubsta, tid, 0); -- } -- -- static void -diff --git a/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch b/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch -deleted file mode 100644 -index 229351ba56802ef44fae5fe5f88a3ffbb0ada098..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/337-mac80211-minstrel_ht-fix-a-logic-error-in-RTS-CTS-ha.patch -+++ /dev/null -@@ -1,26 +0,0 @@ --From: Felix Fietkau --Date: Wed, 24 Feb 2016 12:03:13 +0100 --Subject: [PATCH] mac80211: minstrel_ht: fix a logic error in RTS/CTS handling --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --RTS/CTS needs to be enabled if the rate is a fallback rate *or* if it's --a dual-stream rate and the sta is in dynamic SMPS mode. -- --Fixes: a3ebb4e1b763 ("mac80211: minstrel_ht: handle peers in dynamic SMPS") --Reported-by: Matías Richart --Signed-off-by: Felix Fietkau ----- -- ----- a/net/mac80211/rc80211_minstrel_ht.c --+++ b/net/mac80211/rc80211_minstrel_ht.c --@@ -872,7 +872,7 @@ minstrel_ht_set_rate(struct minstrel_pri -- * - if station is in dynamic SMPS (and streams > 1) -- * - for fallback rates, to increase chances of getting through -- */ --- if (offset > 0 && --+ if (offset > 0 || -- (mi->sta->smps_mode == IEEE80211_SMPS_DYNAMIC && -- group->streams > 1)) { -- ratetbl->rate[offset].count = ratetbl->rate[offset].count_rts; -diff --git a/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch b/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch -deleted file mode 100644 -index 56cd94aa152169fa4e98cd16dbf8a251dca4ca8a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/338-mac80211-Fix-Public-Action-frame-RX-in-AP-mode.patch -+++ /dev/null -@@ -1,35 +0,0 @@ --From: Jouni Malinen --Date: Tue, 1 Mar 2016 00:29:00 +0200 --Subject: [PATCH] mac80211: Fix Public Action frame RX in AP mode -- --Public Action frames use special rules for how the BSSID field (Address --3) is set. A wildcard BSSID is used in cases where the transmitter and --recipient are not members of the same BSS. As such, we need to accept --Public Action frames with wildcard BSSID. -- --Commit db8e17324553 ("mac80211: ignore frames between TDLS peers when --operating as AP") added a rule that drops Action frames to TDLS-peers --based on an Action frame having different DA (Address 1) and BSSID --(Address 3) values. This is not correct since it misses the possibility --of BSSID being a wildcard BSSID in which case the Address 1 would not --necessarily match. -- --Fix this by allowing mac80211 to accept wildcard BSSID in an Action --frame when in AP mode. -- --Fixes: db8e17324553 ("mac80211: ignore frames between TDLS peers when operating as AP") --Cc: stable@vger.kernel.org --Signed-off-by: Jouni Malinen --Signed-off-by: Johannes Berg ----- -- ----- a/net/mac80211/rx.c --+++ b/net/mac80211/rx.c --@@ -3374,6 +3374,7 @@ static bool ieee80211_accept_frame(struc -- return false; -- /* ignore action frames to TDLS-peers */ -- if (ieee80211_is_action(hdr->frame_control) && --+ !is_broadcast_ether_addr(bssid) && -- !ether_addr_equal(bssid, hdr->addr1)) -- return false; -- } -diff --git a/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch b/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch -deleted file mode 100644 -index 15d6cd03eae1c5b2380cb718238762cbf5f5a5b6..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/339-cfg80211-add-radiotap-VHT-info-to-rtap_namespace_siz.patch -+++ /dev/null -@@ -1,21 +0,0 @@ --From: Lorenzo Bianconi --Date: Fri, 19 Feb 2016 11:43:04 +0100 --Subject: [PATCH] cfg80211: add radiotap VHT info to rtap_namespace_sizes -- --Add IEEE80211_RADIOTAP_VHT entry to rtap_namespace_sizes array in order to --define alignment and size of VHT info in tx radiotap -- --Signed-off-by: Lorenzo Bianconi --Signed-off-by: Johannes Berg ----- -- ----- a/net/wireless/radiotap.c --+++ b/net/wireless/radiotap.c --@@ -43,6 +43,7 @@ static const struct radiotap_align_size -- [IEEE80211_RADIOTAP_DATA_RETRIES] = { .align = 1, .size = 1, }, -- [IEEE80211_RADIOTAP_MCS] = { .align = 1, .size = 3, }, -- [IEEE80211_RADIOTAP_AMPDU_STATUS] = { .align = 4, .size = 8, }, --+ [IEEE80211_RADIOTAP_VHT] = { .align = 2, .size = 12, }, -- /* -- * add more here as they are defined in radiotap.h -- */ -diff --git a/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch b/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch -deleted file mode 100644 -index de1b38625c3845be51df0f34c2b82290651ca4be..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/340-mac80211-fix-parsing-of-40Mhz-in-injected-radiotap-h.patch -+++ /dev/null -@@ -1,36 +0,0 @@ --From: Sven Eckelmann --Date: Wed, 24 Feb 2016 16:25:49 +0100 --Subject: [PATCH] mac80211: fix parsing of 40Mhz in injected radiotap -- header -- --The MCS bandwidth part of the radiotap header is 2 bits wide. The full 2 --bit have to compared against IEEE80211_RADIOTAP_MCS_BW_40 and not only if --the first bit is set. Otherwise IEEE80211_RADIOTAP_MCS_BW_40 can be --confused with IEEE80211_RADIOTAP_MCS_BW_20U. -- --Fixes: 5ec3aed9ba4c ("mac80211: Parse legacy and HT rate in injected frames") --Signed-off-by: Sven Eckelmann ----- -- ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -1689,7 +1689,7 @@ static bool ieee80211_parse_tx_radiotap( -- bool rate_found = false; -- u8 rate_retries = 0; -- u16 rate_flags = 0; --- u8 mcs_known, mcs_flags; --+ u8 mcs_known, mcs_flags, mcs_bw; -- int i; -- -- info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT | --@@ -1765,8 +1765,9 @@ static bool ieee80211_parse_tx_radiotap( -- mcs_flags & IEEE80211_RADIOTAP_MCS_SGI) -- rate_flags |= IEEE80211_TX_RC_SHORT_GI; -- --+ mcs_bw = mcs_flags & IEEE80211_RADIOTAP_MCS_BW_MASK; -- if (mcs_known & IEEE80211_RADIOTAP_MCS_HAVE_BW && --- mcs_flags & IEEE80211_RADIOTAP_MCS_BW_40) --+ mcs_bw == IEEE80211_RADIOTAP_MCS_BW_40) -- rate_flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; -- break; -- -diff --git a/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch b/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch -deleted file mode 100644 -index ac1f2517f29973c74cdd32301b32d1be93fcefb1..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/341-mac80211-parse-VHT-info-in-injected-frames.patch -+++ /dev/null -@@ -1,65 +0,0 @@ --From: Lorenzo Bianconi --Date: Tue, 23 Feb 2016 15:43:35 +0100 --Subject: [PATCH] mac80211: parse VHT info in injected frames -- --Add VHT radiotap parsing support to ieee80211_parse_tx_radiotap(). --That capability has been tested using a d-link dir-860l rev b1 running --OpenWrt trunk and mt76 driver -- --Signed-off-by: Lorenzo Bianconi ----- -- ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -1690,6 +1690,8 @@ static bool ieee80211_parse_tx_radiotap( -- u8 rate_retries = 0; -- u16 rate_flags = 0; -- u8 mcs_known, mcs_flags, mcs_bw; --+ u16 vht_known; --+ u8 vht_mcs = 0, vht_nss = 0; -- int i; -- -- info->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT | --@@ -1771,6 +1773,32 @@ static bool ieee80211_parse_tx_radiotap( -- rate_flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; -- break; -- --+ case IEEE80211_RADIOTAP_VHT: --+ vht_known = get_unaligned_le16(iterator.this_arg); --+ rate_found = true; --+ --+ rate_flags = IEEE80211_TX_RC_VHT_MCS; --+ if ((vht_known & IEEE80211_RADIOTAP_VHT_KNOWN_GI) && --+ (iterator.this_arg[2] & --+ IEEE80211_RADIOTAP_VHT_FLAG_SGI)) --+ rate_flags |= IEEE80211_TX_RC_SHORT_GI; --+ if (vht_known & --+ IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH) { --+ if (iterator.this_arg[3] == 1) --+ rate_flags |= --+ IEEE80211_TX_RC_40_MHZ_WIDTH; --+ else if (iterator.this_arg[3] == 4) --+ rate_flags |= --+ IEEE80211_TX_RC_80_MHZ_WIDTH; --+ else if (iterator.this_arg[3] == 11) --+ rate_flags |= --+ IEEE80211_TX_RC_160_MHZ_WIDTH; --+ } --+ --+ vht_mcs = iterator.this_arg[4] >> 4; --+ vht_nss = iterator.this_arg[4] & 0xF; --+ break; --+ -- /* -- * Please update the file -- * Documentation/networking/mac80211-injection.txt --@@ -1796,6 +1824,9 @@ static bool ieee80211_parse_tx_radiotap( -- -- if (rate_flags & IEEE80211_TX_RC_MCS) { -- info->control.rates[0].idx = rate; --+ } else if (rate_flags & IEEE80211_TX_RC_VHT_MCS) { --+ ieee80211_rate_set_vht(info->control.rates, vht_mcs, --+ vht_nss); -- } else { -- for (i = 0; i < sband->n_bitrates; i++) { -- if (rate * 5 != sband->bitrates[i].bitrate) -diff --git a/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch b/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch -deleted file mode 100644 -index d7452c29c1fad9ee170199c33b260161b603032a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/342-mac80211-do-not-pass-injected-frames-without-a-valid.patch -+++ /dev/null -@@ -1,23 +0,0 @@ --From: Felix Fietkau --Date: Wed, 2 Mar 2016 15:51:40 +0100 --Subject: [PATCH] mac80211: do not pass injected frames without a valid rate to -- the driver -- --Fall back to rate control if the requested bitrate was not found. -- --Fixes: dfdfc2beb0dd ("mac80211: Parse legacy and HT rate in injected frames") --Signed-off-by: Felix Fietkau ----- -- ----- a/net/mac80211/tx.c --+++ b/net/mac80211/tx.c --@@ -1837,6 +1837,9 @@ static bool ieee80211_parse_tx_radiotap( -- } -- } -- --+ if (info->control.rates[0].idx < 0) --+ info->control.flags &= ~IEEE80211_TX_CTRL_RATE_INJECT; --+ -- info->control.rates[0].flags = rate_flags; -- info->control.rates[0].count = min_t(u8, rate_retries + 1, -- local->hw.max_rate_tries); -diff --git a/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch b/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch -deleted file mode 100644 -index 55ff817009294fde4c61548f95a49ca506d15b4d..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/343-mac80211-minstrel_ht-improve-sample-rate-skip-logic.patch -+++ /dev/null -@@ -1,77 +0,0 @@ --From: Felix Fietkau --Date: Thu, 3 Mar 2016 23:20:06 +0100 --Subject: [PATCH] mac80211: minstrel_ht: improve sample rate skip logic -- --There were a few issues that were slowing down the process of finding --the optimal rate, especially on devices with multi-rate retry --limitations: -- --When max_tp_rate[0] was slower than max_tp_rate[1], the code did not --sample max_tp_rate[1], which would often allow it to switch places with --max_tp_rate[0] (e.g. if only the first sampling attempts were bad, but the --rate is otherwise good). -- --Also, sample attempts of rates between max_tp_rate[0] and [1] were being --ignored in this case, because the code only checked if the rate was --slower than [1]. -- --Fix this by checking against the fastest / second fastest max_tp_rate --instead of assuming a specific order between the two. -- --In my tests this patch significantly reduces the time until minstrel_ht --finds the optimal rate right after assoc -- --Signed-off-by: Felix Fietkau ----- -- ----- a/net/mac80211/rc80211_minstrel_ht.c --+++ b/net/mac80211/rc80211_minstrel_ht.c --@@ -958,6 +958,7 @@ minstrel_get_sample_rate(struct minstrel -- struct minstrel_rate_stats *mrs; -- struct minstrel_mcs_group_data *mg; -- unsigned int sample_dur, sample_group, cur_max_tp_streams; --+ int tp_rate1, tp_rate2; -- int sample_idx = 0; -- -- if (mi->sample_wait > 0) { --@@ -979,14 +980,22 @@ minstrel_get_sample_rate(struct minstrel -- mrs = &mg->rates[sample_idx]; -- sample_idx += sample_group * MCS_GROUP_RATES; -- --+ /* Set tp_rate1, tp_rate2 to the highest / second highest max_tp_rate */ --+ if (minstrel_get_duration(mi->max_tp_rate[0]) > --+ minstrel_get_duration(mi->max_tp_rate[1])) { --+ tp_rate1 = mi->max_tp_rate[1]; --+ tp_rate2 = mi->max_tp_rate[0]; --+ } else { --+ tp_rate1 = mi->max_tp_rate[0]; --+ tp_rate2 = mi->max_tp_rate[1]; --+ } --+ -- /* -- * Sampling might add some overhead (RTS, no aggregation) --- * to the frame. Hence, don't use sampling for the currently --- * used rates. --+ * to the frame. Hence, don't use sampling for the highest currently --+ * used highest throughput or probability rate. -- */ --- if (sample_idx == mi->max_tp_rate[0] || --- sample_idx == mi->max_tp_rate[1] || --- sample_idx == mi->max_prob_rate) --+ if (sample_idx == mi->max_tp_rate[0] || sample_idx == mi->max_prob_rate) -- return -1; -- -- /* --@@ -1001,10 +1010,10 @@ minstrel_get_sample_rate(struct minstrel -- * if the link is working perfectly. -- */ -- --- cur_max_tp_streams = minstrel_mcs_groups[mi->max_tp_rate[0] / --+ cur_max_tp_streams = minstrel_mcs_groups[tp_rate1 / -- MCS_GROUP_RATES].streams; -- sample_dur = minstrel_get_duration(sample_idx); --- if (sample_dur >= minstrel_get_duration(mi->max_tp_rate[1]) && --+ if (sample_dur >= minstrel_get_duration(tp_rate2) && -- (cur_max_tp_streams - 1 < -- minstrel_mcs_groups[sample_group].streams || -- sample_dur >= minstrel_get_duration(mi->max_prob_rate))) { -diff --git a/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch b/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch -deleted file mode 100644 -index e3427de732787befec7f0f738efb3cc85a00aa0d..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0001-brcmfmac-change-function-name-for-brcmf_cfg80211_wai.patch -+++ /dev/null -@@ -1,99 +0,0 @@ --From: Arend van Spriel --Date: Wed, 17 Feb 2016 11:26:50 +0100 --Subject: [PATCH] brcmfmac: change function name for -- brcmf_cfg80211_wait_vif_event_timeout() -- --Dropping the '_timeout' from the function name as the fact that a timeout --value is passed makes it obvious a timeout is used. Also helps to keep code --lines a bit shorter and easier to stick to 80 char boundary. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -564,8 +564,8 @@ struct wireless_dev *brcmf_ap_add_vif(st -- } -- -- /* wait for firmware event */ --- err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_ADD, --- BRCMF_VIF_EVENT_TIMEOUT); --+ err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_ADD, --+ BRCMF_VIF_EVENT_TIMEOUT); -- brcmf_cfg80211_arm_vif_event(cfg, NULL); -- if (!err) { -- brcmf_err("timeout occurred\n"); --@@ -6395,8 +6395,9 @@ bool brcmf_cfg80211_vif_event_armed(stru -- -- return armed; -- } ---int brcmf_cfg80211_wait_vif_event_timeout(struct brcmf_cfg80211_info *cfg, --- u8 action, ulong timeout) --+ --+int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg, --+ u8 action, ulong timeout) -- { -- struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --@@ -402,8 +402,8 @@ bool brcmf_get_vif_state_any(struct brcm -- void brcmf_cfg80211_arm_vif_event(struct brcmf_cfg80211_info *cfg, -- struct brcmf_cfg80211_vif *vif); -- bool brcmf_cfg80211_vif_event_armed(struct brcmf_cfg80211_info *cfg); ---int brcmf_cfg80211_wait_vif_event_timeout(struct brcmf_cfg80211_info *cfg, --- u8 action, ulong timeout); --+int brcmf_cfg80211_wait_vif_event(struct brcmf_cfg80211_info *cfg, --+ u8 action, ulong timeout); -- s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg, -- struct brcmf_if *ifp, bool aborted, -- bool fw_abort); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -1988,8 +1988,8 @@ int brcmf_p2p_ifchange(struct brcmf_cfg8 -- brcmf_cfg80211_arm_vif_event(cfg, NULL); -- return err; -- } --- err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_CHANGE, --- BRCMF_VIF_EVENT_TIMEOUT); --+ err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_CHANGE, --+ BRCMF_VIF_EVENT_TIMEOUT); -- brcmf_cfg80211_arm_vif_event(cfg, NULL); -- if (!err) { -- brcmf_err("No BRCMF_E_IF_CHANGE event received\n"); --@@ -2090,8 +2090,8 @@ static struct wireless_dev *brcmf_p2p_cr -- } -- -- /* wait for firmware event */ --- err = brcmf_cfg80211_wait_vif_event_timeout(p2p->cfg, BRCMF_E_IF_ADD, --- BRCMF_VIF_EVENT_TIMEOUT); --+ err = brcmf_cfg80211_wait_vif_event(p2p->cfg, BRCMF_E_IF_ADD, --+ BRCMF_VIF_EVENT_TIMEOUT); -- brcmf_cfg80211_arm_vif_event(p2p->cfg, NULL); -- brcmf_fweh_p2pdev_setup(pri_ifp, false); -- if (!err) { --@@ -2180,8 +2180,8 @@ struct wireless_dev *brcmf_p2p_add_vif(s -- } -- -- /* wait for firmware event */ --- err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_ADD, --- BRCMF_VIF_EVENT_TIMEOUT); --+ err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_ADD, --+ BRCMF_VIF_EVENT_TIMEOUT); -- brcmf_cfg80211_arm_vif_event(cfg, NULL); -- if (!err) { -- brcmf_err("timeout occurred\n"); --@@ -2274,8 +2274,8 @@ int brcmf_p2p_del_vif(struct wiphy *wiph -- } -- if (!err) { -- /* wait for firmware event */ --- err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL, --- BRCMF_VIF_EVENT_TIMEOUT); --+ err = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_DEL, --+ BRCMF_VIF_EVENT_TIMEOUT); -- if (!err) -- err = -EIO; -- else -diff --git a/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch b/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch -deleted file mode 100644 -index 9c336f774fd79a2306dae746d3622db22eee76eb..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0002-brcmfmac-Limit-memory-allocs-to-64K.patch -+++ /dev/null -@@ -1,127 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:26:51 +0100 --Subject: [PATCH] brcmfmac: Limit memory allocs to <64K -- --Some systems have problems with allocating memory allocation larger --then 64K. Often on unload/load or suspend/resume a failure is --reported: Could not allocate wiphy device. This patch makes the --escan intermediate storage buf dynamically allocated, and smaller --than 64K. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -1125,7 +1125,7 @@ brcmf_cfg80211_escan(struct wiphy *wiphy -- -- /* Arm scan timeout timer */ -- mod_timer(&cfg->escan_timeout, jiffies + --- WL_ESCAN_TIMER_INTERVAL_MS * HZ / 1000); --+ BRCMF_ESCAN_TIMER_INTERVAL_MS * HZ / 1000); -- -- return 0; -- --@@ -3020,7 +3020,7 @@ brcmf_cfg80211_escan_handler(struct brcm -- -- list = (struct brcmf_scan_results *) -- cfg->escan_info.escan_buf; --- if (bi_length > WL_ESCAN_BUF_SIZE - list->buflen) { --+ if (bi_length > BRCMF_ESCAN_BUF_SIZE - list->buflen) { -- brcmf_err("Buffer is too small: ignoring\n"); -- goto exit; -- } --@@ -3033,8 +3033,8 @@ brcmf_cfg80211_escan_handler(struct brcm -- bss_info_le)) -- goto exit; -- } --- memcpy(&(cfg->escan_info.escan_buf[list->buflen]), --- bss_info_le, bi_length); --+ memcpy(&cfg->escan_info.escan_buf[list->buflen], bss_info_le, --+ bi_length); -- list->version = le32_to_cpu(bss_info_le->version); -- list->buflen += bi_length; -- list->count++; --@@ -5402,14 +5402,14 @@ static void brcmf_deinit_priv_mem(struct -- { -- kfree(cfg->conf); -- cfg->conf = NULL; --- kfree(cfg->escan_ioctl_buf); --- cfg->escan_ioctl_buf = NULL; -- kfree(cfg->extra_buf); -- cfg->extra_buf = NULL; -- kfree(cfg->wowl.nd); -- cfg->wowl.nd = NULL; -- kfree(cfg->wowl.nd_info); -- cfg->wowl.nd_info = NULL; --+ kfree(cfg->escan_info.escan_buf); --+ cfg->escan_info.escan_buf = NULL; -- } -- -- static s32 brcmf_init_priv_mem(struct brcmf_cfg80211_info *cfg) --@@ -5417,9 +5417,6 @@ static s32 brcmf_init_priv_mem(struct br -- cfg->conf = kzalloc(sizeof(*cfg->conf), GFP_KERNEL); -- if (!cfg->conf) -- goto init_priv_mem_out; --- cfg->escan_ioctl_buf = kzalloc(BRCMF_DCMD_MEDLEN, GFP_KERNEL); --- if (!cfg->escan_ioctl_buf) --- goto init_priv_mem_out; -- cfg->extra_buf = kzalloc(WL_EXTRA_BUF_MAX, GFP_KERNEL); -- if (!cfg->extra_buf) -- goto init_priv_mem_out; --@@ -5431,6 +5428,9 @@ static s32 brcmf_init_priv_mem(struct br -- GFP_KERNEL); -- if (!cfg->wowl.nd_info) -- goto init_priv_mem_out; --+ cfg->escan_info.escan_buf = kzalloc(BRCMF_ESCAN_BUF_SIZE, GFP_KERNEL); --+ if (!cfg->escan_info.escan_buf) --+ goto init_priv_mem_out; -- -- return 0; -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --@@ -28,8 +28,11 @@ -- #define WL_ROAM_TRIGGER_LEVEL -75 -- #define WL_ROAM_DELTA 20 -- ---#define WL_ESCAN_BUF_SIZE (1024 * 64) ---#define WL_ESCAN_TIMER_INTERVAL_MS 10000 /* E-Scan timeout */ --+/* Keep BRCMF_ESCAN_BUF_SIZE below 64K (65536). Allocing over 64K can be --+ * problematic on some systems and should be avoided. --+ */ --+#define BRCMF_ESCAN_BUF_SIZE 65000 --+#define BRCMF_ESCAN_TIMER_INTERVAL_MS 10000 /* E-Scan timeout */ -- -- #define WL_ESCAN_ACTION_START 1 -- #define WL_ESCAN_ACTION_CONTINUE 2 --@@ -205,7 +208,7 @@ enum wl_escan_state { -- -- struct escan_info { -- u32 escan_state; --- u8 escan_buf[WL_ESCAN_BUF_SIZE]; --+ u8 *escan_buf; -- struct wiphy *wiphy; -- struct brcmf_if *ifp; -- s32 (*run)(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp, --@@ -278,7 +281,6 @@ struct brcmf_cfg80211_wowl { -- * @escan_info: escan information. -- * @escan_timeout: Timer for catch scan timeout. -- * @escan_timeout_work: scan timeout worker. --- * @escan_ioctl_buf: dongle command buffer for escan commands. -- * @vif_list: linked list of vif instances. -- * @vif_cnt: number of vif instances. -- * @vif_event: vif event signalling. --@@ -309,7 +311,6 @@ struct brcmf_cfg80211_info { -- struct escan_info escan_info; -- struct timer_list escan_timeout; -- struct work_struct escan_timeout_work; --- u8 *escan_ioctl_buf; -- struct list_head vif_list; -- struct brcmf_cfg80211_vif_event vif_event; -- struct completion vif_disabled; -diff --git a/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch b/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch -deleted file mode 100644 -index ee3d9f37a851cb1d31a53e341614bd7166c2e581..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0003-brcmfmac-check-for-wowl-support-before-enumerating-f.patch -+++ /dev/null -@@ -1,29 +0,0 @@ --From: Franky Lin --Date: Wed, 17 Feb 2016 11:26:52 +0100 --Subject: [PATCH] brcmfmac: check for wowl support before enumerating feature -- flag -- --In some cases wiphy->wowlan could be NULL if firmware doesn't have the --support. Driver should check for support before walking down the feature --flags. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Hante Meuleman --Signed-off-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -6594,7 +6594,8 @@ struct brcmf_cfg80211_info *brcmf_cfg802 -- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_SCAN_RANDOM_MAC)) { -- wiphy->features |= NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR; -- #ifdef CONFIG_PM --- if (wiphy->wowlan->flags & WIPHY_WOWLAN_NET_DETECT) --+ if (wiphy->wowlan && --+ wiphy->wowlan->flags & WIPHY_WOWLAN_NET_DETECT) -- wiphy->features |= NL80211_FEATURE_ND_RANDOM_MAC_ADDR; -- #endif -- } -diff --git a/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch b/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch -deleted file mode 100644 -index c52cac87b979e6da07d24f2e7e119261dceea2ce..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0004-brcmfmac-Configure-country-code-using-device-specifi.patch -+++ /dev/null -@@ -1,214 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:26:53 +0100 --Subject: [PATCH] brcmfmac: Configure country code using device specific -- settings -- --Country code configuration in a device is a device specific --operation. For this the country code as specified by reg notifier --(iso3166 alpha2) needs to be translated to a device specific --country locale and revision number. This patch adds this --translation and puts a placeholder in the device specific settings --where the translation table can be stored. Additional patches will --be needed to read these tables from for example device platform --data. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -6405,28 +6405,85 @@ int brcmf_cfg80211_wait_vif_event(struct -- vif_event_equals(event, action), timeout); -- } -- --+static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], --+ struct brcmf_fil_country_le *ccreq) --+{ --+ struct cc_translate *country_codes; --+ struct cc_entry *cc; --+ s32 found_index; --+ int i; --+ --+ country_codes = drvr->settings->country_codes; --+ if (!country_codes) { --+ brcmf_dbg(TRACE, "No country codes configured for device\n"); --+ return -EINVAL; --+ } --+ --+ if ((alpha2[0] == ccreq->country_abbrev[0]) && --+ (alpha2[1] == ccreq->country_abbrev[1])) { --+ brcmf_dbg(TRACE, "Country code already set\n"); --+ return -EAGAIN; --+ } --+ --+ found_index = -1; --+ for (i = 0; i < country_codes->table_size; i++) { --+ cc = &country_codes->table[i]; --+ if ((cc->iso3166[0] == '\0') && (found_index == -1)) --+ found_index = i; --+ if ((cc->iso3166[0] == alpha2[0]) && --+ (cc->iso3166[1] == alpha2[1])) { --+ found_index = i; --+ break; --+ } --+ } --+ if (found_index == -1) { --+ brcmf_dbg(TRACE, "No country code match found\n"); --+ return -EINVAL; --+ } --+ memset(ccreq, 0, sizeof(*ccreq)); --+ ccreq->rev = cpu_to_le32(country_codes->table[found_index].rev); --+ memcpy(ccreq->ccode, country_codes->table[found_index].cc, --+ BRCMF_COUNTRY_BUF_SZ); --+ ccreq->country_abbrev[0] = alpha2[0]; --+ ccreq->country_abbrev[1] = alpha2[1]; --+ ccreq->country_abbrev[2] = 0; --+ --+ return 0; --+} --+ -- static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy, -- struct regulatory_request *req) -- { -- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); -- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); -- struct brcmf_fil_country_le ccreq; --+ s32 err; -- int i; -- --- brcmf_dbg(TRACE, "enter: initiator=%d, alpha=%c%c\n", req->initiator, --- req->alpha2[0], req->alpha2[1]); --- -- /* ignore non-ISO3166 country codes */ -- for (i = 0; i < sizeof(req->alpha2); i++) -- if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') { --- brcmf_err("not a ISO3166 code\n"); --+ brcmf_err("not a ISO3166 code (0x%02x 0x%02x)\n", --+ req->alpha2[0], req->alpha2[1]); -- return; -- } --- memset(&ccreq, 0, sizeof(ccreq)); --- ccreq.rev = cpu_to_le32(-1); --- memcpy(ccreq.ccode, req->alpha2, sizeof(req->alpha2)); --- if (brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq))) { --- brcmf_err("firmware rejected country setting\n"); --+ --+ brcmf_dbg(TRACE, "Enter: initiator=%d, alpha=%c%c\n", req->initiator, --+ req->alpha2[0], req->alpha2[1]); --+ --+ err = brcmf_fil_iovar_data_get(ifp, "country", &ccreq, sizeof(ccreq)); --+ if (err) { --+ brcmf_err("Country code iovar returned err = %d\n", err); --+ return; --+ } --+ --+ err = brcmf_translate_country_code(ifp->drvr, req->alpha2, &ccreq); --+ if (err) --+ return; --+ --+ err = brcmf_fil_iovar_data_set(ifp, "country", &ccreq, sizeof(ccreq)); --+ if (err) { --+ brcmf_err("Firmware rejected country setting\n"); -- return; -- } -- brcmf_setup_wiphybands(wiphy); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --@@ -230,10 +230,8 @@ void brcmf_mp_attach(void) -- int brcmf_mp_device_attach(struct brcmf_pub *drvr) -- { -- drvr->settings = kzalloc(sizeof(*drvr->settings), GFP_ATOMIC); --- if (!drvr->settings) { --- brcmf_err("Failed to alloca storage space for settings\n"); --+ if (!drvr->settings) -- return -ENOMEM; --- } -- -- drvr->settings->sdiod_txglomsz = brcmf_sdiod_txglomsz; -- drvr->settings->p2p_enable = !!brcmf_p2p_enable; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --@@ -15,6 +15,8 @@ -- #ifndef BRCMFMAC_COMMON_H -- #define BRCMFMAC_COMMON_H -- --+#include "fwil_types.h" --+ -- extern const u8 ALLFFMAC[ETH_ALEN]; -- -- #define BRCMF_FW_ALTPATH_LEN 256 --@@ -39,6 +41,33 @@ struct brcmf_mp_global_t { -- extern struct brcmf_mp_global_t brcmf_mp_global; -- -- /** --+ * struct cc_entry - Struct for translating user space country code (iso3166) to --+ * firmware country code and revision. --+ * --+ * @iso3166: iso3166 alpha 2 country code string. --+ * @cc: firmware country code string. --+ * @rev: firmware country code revision. --+ */ --+struct cc_entry { --+ char iso3166[BRCMF_COUNTRY_BUF_SZ]; --+ char cc[BRCMF_COUNTRY_BUF_SZ]; --+ s32 rev; --+}; --+ --+/** --+ * struct cc_translate - Struct for translating country codes as set by user --+ * space to a country code and rev which can be used by --+ * firmware. --+ * --+ * @table_size: number of entries in table (> 0) --+ * @table: dynamic array of 1 or more elements with translation information. --+ */ --+struct cc_translate { --+ int table_size; --+ struct cc_entry table[0]; --+}; --+ --+/** -- * struct brcmf_mp_device - Device module paramaters. -- * -- * @sdiod_txglomsz: SDIO txglom size. --@@ -47,6 +76,7 @@ extern struct brcmf_mp_global_t brcmf_mp -- * @feature_disable: Feature_disable bitmask. -- * @fcmode: FWS flow control. -- * @roamoff: Firmware roaming off? --+ * @country_codes: If available, pointer to struct for translating country codes -- */ -- struct brcmf_mp_device { -- int sdiod_txglomsz; --@@ -56,6 +86,7 @@ struct brcmf_mp_device { -- int fcmode; -- bool roamoff; -- bool ignore_probe_fail; --+ struct cc_translate *country_codes; -- }; -- -- void brcmf_mp_attach(void); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h --@@ -134,6 +134,8 @@ -- #define BRCMF_PFN_MAC_OUI_ONLY BIT(0) -- #define BRCMF_PFN_SET_MAC_UNASSOC BIT(1) -- --+#define BRCMF_MCSSET_LEN 16 --+ -- /* join preference types for join_pref iovar */ -- enum brcmf_join_pref_types { -- BRCMF_JOIN_PREF_RSSI = 1, --@@ -279,7 +281,7 @@ struct brcmf_bss_info_le { -- __le32 reserved32[1]; /* Reserved for expansion of BSS properties */ -- u8 flags; /* flags */ -- u8 reserved[3]; /* Reserved for expansion of BSS properties */ --- u8 basic_mcs[MCSSET_LEN]; /* 802.11N BSS required MCS set */ --+ u8 basic_mcs[BRCMF_MCSSET_LEN]; /* 802.11N BSS required MCS set */ -- -- __le16 ie_offset; /* offset at which IEs start, from beginning */ -- __le32 ie_length; /* byte length of Information Elements */ -diff --git a/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch b/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch -deleted file mode 100644 -index 3e2e3503b629dbdd6abba44a9c9b24e4a5aea792..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0005-brcmfmac-Add-length-checks-on-firmware-events.patch -+++ /dev/null -@@ -1,283 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:26:54 +0100 --Subject: [PATCH] brcmfmac: Add length checks on firmware events -- --Add additional length checks on firmware events to create more --robust code. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Lei Zhang --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -3092,6 +3092,11 @@ brcmf_notify_sched_scan_results(struct b -- -- brcmf_dbg(SCAN, "Enter\n"); -- --+ if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) { --+ brcmf_dbg(SCAN, "Event data to small. Ignore\n"); --+ return 0; --+ } --+ -- if (e->event_code == BRCMF_E_PFN_NET_LOST) { -- brcmf_dbg(SCAN, "PFN NET LOST event. Do Nothing\n"); -- return 0; --@@ -3415,6 +3420,11 @@ brcmf_wowl_nd_results(struct brcmf_if *i -- -- brcmf_dbg(SCAN, "Enter\n"); -- --+ if (e->datalen < (sizeof(*pfn_result) + sizeof(*netinfo))) { --+ brcmf_dbg(SCAN, "Event data to small. Ignore\n"); --+ return 0; --+ } --+ -- pfn_result = (struct brcmf_pno_scanresults_le *)data; -- -- if (e->event_code == BRCMF_E_PFN_NET_LOST) { ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c --@@ -26,50 +26,6 @@ -- #include "fwil.h" -- -- /** --- * struct brcm_ethhdr - broadcom specific ether header. --- * --- * @subtype: subtype for this packet. --- * @length: TODO: length of appended data. --- * @version: version indication. --- * @oui: OUI of this packet. --- * @usr_subtype: subtype for this OUI. --- */ ---struct brcm_ethhdr { --- __be16 subtype; --- __be16 length; --- u8 version; --- u8 oui[3]; --- __be16 usr_subtype; ---} __packed; --- ---struct brcmf_event_msg_be { --- __be16 version; --- __be16 flags; --- __be32 event_type; --- __be32 status; --- __be32 reason; --- __be32 auth_type; --- __be32 datalen; --- u8 addr[ETH_ALEN]; --- char ifname[IFNAMSIZ]; --- u8 ifidx; --- u8 bsscfgidx; ---} __packed; --- ---/** --- * struct brcmf_event - contents of broadcom event packet. --- * --- * @eth: standard ether header. --- * @hdr: broadcom specific ether header. --- * @msg: common part of the actual event message. --- */ ---struct brcmf_event { --- struct ethhdr eth; --- struct brcm_ethhdr hdr; --- struct brcmf_event_msg_be msg; ---} __packed; --- ---/** -- * struct brcmf_fweh_queue_item - event item on event queue. -- * -- * @q: list element for queuing. --@@ -85,6 +41,7 @@ struct brcmf_fweh_queue_item { -- u8 ifidx; -- u8 ifaddr[ETH_ALEN]; -- struct brcmf_event_msg_be emsg; --+ u32 datalen; -- u8 data[0]; -- }; -- --@@ -294,6 +251,11 @@ static void brcmf_fweh_event_worker(stru -- brcmf_dbg_hex_dump(BRCMF_EVENT_ON(), event->data, -- min_t(u32, emsg.datalen, 64), -- "event payload, len=%d\n", emsg.datalen); --+ if (emsg.datalen > event->datalen) { --+ brcmf_err("event invalid length header=%d, msg=%d\n", --+ event->datalen, emsg.datalen); --+ goto event_free; --+ } -- -- /* special handling of interface event */ -- if (event->code == BRCMF_E_IF) { --@@ -439,7 +401,8 @@ int brcmf_fweh_activate_events(struct br -- * dispatch the event to a registered handler (using worker). -- */ -- void brcmf_fweh_process_event(struct brcmf_pub *drvr, --- struct brcmf_event *event_packet) --+ struct brcmf_event *event_packet, --+ u32 packet_len) -- { -- enum brcmf_fweh_event_code code; -- struct brcmf_fweh_info *fweh = &drvr->fweh; --@@ -459,6 +422,9 @@ void brcmf_fweh_process_event(struct brc -- if (code != BRCMF_E_IF && !fweh->evt_handler[code]) -- return; -- --+ if (datalen > BRCMF_DCMD_MAXLEN) --+ return; --+ -- if (in_interrupt()) -- alloc_flag = GFP_ATOMIC; -- --@@ -472,6 +438,7 @@ void brcmf_fweh_process_event(struct brc -- /* use memcpy to get aligned event message */ -- memcpy(&event->emsg, &event_packet->msg, sizeof(event->emsg)); -- memcpy(event->data, data, datalen); --+ event->datalen = datalen; -- memcpy(event->ifaddr, event_packet->eth.h_dest, ETH_ALEN); -- -- brcmf_fweh_queue_event(fweh, event); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h --@@ -27,7 +27,6 @@ -- struct brcmf_pub; -- struct brcmf_if; -- struct brcmf_cfg80211_info; ---struct brcmf_event; -- -- /* list of firmware events */ -- #define BRCMF_FWEH_EVENT_ENUM_DEFLIST \ --@@ -180,13 +179,55 @@ enum brcmf_fweh_event_code { -- /** -- * definitions for event packet validation. -- */ ---#define BRCMF_EVENT_OUI_OFFSET 19 ---#define BRCM_OUI "\x00\x10\x18" ---#define DOT11_OUI_LEN 3 ---#define BCMILCP_BCM_SUBTYPE_EVENT 1 --+#define BRCM_OUI "\x00\x10\x18" --+#define BCMILCP_BCM_SUBTYPE_EVENT 1 -- -- -- /** --+ * struct brcm_ethhdr - broadcom specific ether header. --+ * --+ * @subtype: subtype for this packet. --+ * @length: TODO: length of appended data. --+ * @version: version indication. --+ * @oui: OUI of this packet. --+ * @usr_subtype: subtype for this OUI. --+ */ --+struct brcm_ethhdr { --+ __be16 subtype; --+ __be16 length; --+ u8 version; --+ u8 oui[3]; --+ __be16 usr_subtype; --+} __packed; --+ --+struct brcmf_event_msg_be { --+ __be16 version; --+ __be16 flags; --+ __be32 event_type; --+ __be32 status; --+ __be32 reason; --+ __be32 auth_type; --+ __be32 datalen; --+ u8 addr[ETH_ALEN]; --+ char ifname[IFNAMSIZ]; --+ u8 ifidx; --+ u8 bsscfgidx; --+} __packed; --+ --+/** --+ * struct brcmf_event - contents of broadcom event packet. --+ * --+ * @eth: standard ether header. --+ * @hdr: broadcom specific ether header. --+ * @msg: common part of the actual event message. --+ */ --+struct brcmf_event { --+ struct ethhdr eth; --+ struct brcm_ethhdr hdr; --+ struct brcmf_event_msg_be msg; --+} __packed; --+ --+/** -- * struct brcmf_event_msg - firmware event message. -- * -- * @version: version information. --@@ -256,34 +297,35 @@ void brcmf_fweh_unregister(struct brcmf_ -- enum brcmf_fweh_event_code code); -- int brcmf_fweh_activate_events(struct brcmf_if *ifp); -- void brcmf_fweh_process_event(struct brcmf_pub *drvr, --- struct brcmf_event *event_packet); --+ struct brcmf_event *event_packet, --+ u32 packet_len); -- void brcmf_fweh_p2pdev_setup(struct brcmf_if *ifp, bool ongoing); -- -- static inline void brcmf_fweh_process_skb(struct brcmf_pub *drvr, -- struct sk_buff *skb) -- { -- struct brcmf_event *event_packet; --- u8 *data; -- u16 usr_stype; -- -- /* only process events when protocol matches */ -- if (skb->protocol != cpu_to_be16(ETH_P_LINK_CTL)) -- return; -- --+ if ((skb->len + ETH_HLEN) < sizeof(*event_packet)) --+ return; --+ -- /* check for BRCM oui match */ -- event_packet = (struct brcmf_event *)skb_mac_header(skb); --- data = (u8 *)event_packet; --- data += BRCMF_EVENT_OUI_OFFSET; --- if (memcmp(BRCM_OUI, data, DOT11_OUI_LEN)) --+ if (memcmp(BRCM_OUI, &event_packet->hdr.oui[0], --+ sizeof(event_packet->hdr.oui))) -- return; -- -- /* final match on usr_subtype */ --- data += DOT11_OUI_LEN; --- usr_stype = get_unaligned_be16(data); --+ usr_stype = get_unaligned_be16(&event_packet->hdr.usr_subtype); -- if (usr_stype != BCMILCP_BCM_SUBTYPE_EVENT) -- return; -- --- brcmf_fweh_process_event(drvr, event_packet); --+ brcmf_fweh_process_event(drvr, event_packet, skb->len + ETH_HLEN); -- } -- -- #endif /* FWEH_H_ */ ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -1361,6 +1361,11 @@ int brcmf_p2p_notify_action_frame_rx(str -- u16 mgmt_type; -- u8 action; -- --+ if (e->datalen < sizeof(*rxframe)) { --+ brcmf_dbg(SCAN, "Event data to small. Ignore\n"); --+ return 0; --+ } --+ -- ch.chspec = be16_to_cpu(rxframe->chanspec); -- cfg->d11inf.decchspec(&ch); -- /* Check if wpa_supplicant has registered for this frame */ --@@ -1858,6 +1863,11 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere -- brcmf_dbg(INFO, "Enter: event %d reason %d\n", e->event_code, -- e->reason); -- --+ if (e->datalen < sizeof(*rxframe)) { --+ brcmf_dbg(SCAN, "Event data to small. Ignore\n"); --+ return 0; --+ } --+ -- ch.chspec = be16_to_cpu(rxframe->chanspec); -- cfg->d11inf.decchspec(&ch); -- -diff --git a/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch b/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch -deleted file mode 100644 -index 888ad5b05059f1d6712303671a1052f1cbdcf30c..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0006-brcmfmac-add-neighbor-discovery-offload-ip-address-t.patch -+++ /dev/null -@@ -1,333 +0,0 @@ --From: Franky Lin --Date: Wed, 17 Feb 2016 11:26:55 +0100 --Subject: [PATCH] brcmfmac: add neighbor discovery offload ip address table -- configuration -- --Configure ipv6 address for neighbor discovery offload ip table in --firmware obtained through ipv6 address notification callback. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -456,7 +456,7 @@ send_key_to_dongle(struct brcmf_if *ifp, -- } -- -- static s32 ---brcmf_configure_arp_offload(struct brcmf_if *ifp, bool enable) --+brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable) -- { -- s32 err; -- u32 mode; --@@ -484,6 +484,15 @@ brcmf_configure_arp_offload(struct brcmf -- enable, mode); -- } -- --+ err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable); --+ if (err) { --+ brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n", --+ enable, err); --+ err = 0; --+ } else --+ brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n", --+ enable, mode); --+ -- return err; -- } -- --@@ -3543,7 +3552,7 @@ static s32 brcmf_cfg80211_resume(struct -- brcmf_report_wowl_wakeind(wiphy, ifp); -- brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0); -- brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0); --- brcmf_configure_arp_offload(ifp, true); --+ brcmf_configure_arp_nd_offload(ifp, true); -- brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, -- cfg->wowl.pre_pmmode); -- cfg->wowl.active = false; --@@ -3567,7 +3576,7 @@ static void brcmf_configure_wowl(struct -- -- brcmf_dbg(TRACE, "Suspend, wowl config.\n"); -- --- brcmf_configure_arp_offload(ifp, false); --+ brcmf_configure_arp_nd_offload(ifp, false); -- brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode); -- brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, PM_MAX); -- --@@ -4336,7 +4345,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- -- if (!mbss) { -- brcmf_set_mpc(ifp, 0); --- brcmf_configure_arp_offload(ifp, false); --+ brcmf_configure_arp_nd_offload(ifp, false); -- } -- -- /* find the RSN_IE */ --@@ -4482,7 +4491,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- exit: -- if ((err) && (!mbss)) { -- brcmf_set_mpc(ifp, 1); --- brcmf_configure_arp_offload(ifp, true); --+ brcmf_configure_arp_nd_offload(ifp, true); -- } -- return err; -- } --@@ -4540,7 +4549,7 @@ static int brcmf_cfg80211_stop_ap(struct -- brcmf_err("bss_enable config failed %d\n", err); -- } -- brcmf_set_mpc(ifp, 1); --- brcmf_configure_arp_offload(ifp, true); --+ brcmf_configure_arp_nd_offload(ifp, true); -- clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); -- brcmf_net_setcarrier(ifp, false); -- --@@ -6287,7 +6296,7 @@ static s32 brcmf_config_dongle(struct br -- if (err) -- goto default_conf_out; -- --- brcmf_configure_arp_offload(ifp, true); --+ brcmf_configure_arp_nd_offload(ifp, true); -- -- cfg->dongle_up = true; -- default_conf_out: ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -20,6 +20,8 @@ -- #include -- #include -- #include --+#include --+#include -- #include -- #include -- --@@ -172,6 +174,35 @@ _brcmf_set_mac_address(struct work_struc -- } -- } -- --+#if IS_ENABLED(CONFIG_IPV6) --+static void _brcmf_update_ndtable(struct work_struct *work) --+{ --+ struct brcmf_if *ifp; --+ int i, ret; --+ --+ ifp = container_of(work, struct brcmf_if, ndoffload_work); --+ --+ /* clear the table in firmware */ --+ ret = brcmf_fil_iovar_data_set(ifp, "nd_hostip_clear", NULL, 0); --+ if (ret) { --+ brcmf_dbg(TRACE, "fail to clear nd ip table err:%d\n", ret); --+ return; --+ } --+ --+ for (i = 0; i < ifp->ipv6addr_idx; i++) { --+ ret = brcmf_fil_iovar_data_set(ifp, "nd_hostip", --+ &ifp->ipv6_addr_tbl[i], --+ sizeof(struct in6_addr)); --+ if (ret) --+ brcmf_err("add nd ip err %d\n", ret); --+ } --+} --+#else --+static void _brcmf_update_ndtable(struct work_struct *work) --+{ --+} --+#endif --+ -- static int brcmf_netdev_set_mac_address(struct net_device *ndev, void *addr) -- { -- struct brcmf_if *ifp = netdev_priv(ndev); --@@ -685,6 +716,7 @@ int brcmf_net_attach(struct brcmf_if *if -- -- INIT_WORK(&ifp->setmacaddr_work, _brcmf_set_mac_address); -- INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list); --+ INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable); -- -- if (rtnl_locked) -- err = register_netdevice(ndev); --@@ -884,6 +916,7 @@ static void brcmf_del_if(struct brcmf_pu -- if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) { -- cancel_work_sync(&ifp->setmacaddr_work); -- cancel_work_sync(&ifp->multicast_work); --+ cancel_work_sync(&ifp->ndoffload_work); -- } -- brcmf_net_detach(ifp->ndev); -- } else { --@@ -1025,6 +1058,56 @@ static int brcmf_inetaddr_changed(struct -- } -- #endif -- --+#if IS_ENABLED(CONFIG_IPV6) --+static int brcmf_inet6addr_changed(struct notifier_block *nb, --+ unsigned long action, void *data) --+{ --+ struct brcmf_pub *drvr = container_of(nb, struct brcmf_pub, --+ inet6addr_notifier); --+ struct inet6_ifaddr *ifa = data; --+ struct brcmf_if *ifp; --+ int i; --+ struct in6_addr *table; --+ --+ /* Only handle primary interface */ --+ ifp = drvr->iflist[0]; --+ if (!ifp) --+ return NOTIFY_DONE; --+ if (ifp->ndev != ifa->idev->dev) --+ return NOTIFY_DONE; --+ --+ table = ifp->ipv6_addr_tbl; --+ for (i = 0; i < NDOL_MAX_ENTRIES; i++) --+ if (ipv6_addr_equal(&ifa->addr, &table[i])) --+ break; --+ --+ switch (action) { --+ case NETDEV_UP: --+ if (i == NDOL_MAX_ENTRIES) { --+ if (ifp->ipv6addr_idx < NDOL_MAX_ENTRIES) { --+ table[ifp->ipv6addr_idx++] = ifa->addr; --+ } else { --+ for (i = 0; i < NDOL_MAX_ENTRIES - 1; i++) --+ table[i] = table[i + 1]; --+ table[NDOL_MAX_ENTRIES - 1] = ifa->addr; --+ } --+ } --+ break; --+ case NETDEV_DOWN: --+ if (i < NDOL_MAX_ENTRIES) --+ for (; i < ifp->ipv6addr_idx; i++) --+ table[i] = table[i + 1]; --+ break; --+ default: --+ break; --+ } --+ --+ schedule_work(&ifp->ndoffload_work); --+ --+ return NOTIFY_OK; --+} --+#endif --+ -- int brcmf_attach(struct device *dev) -- { -- struct brcmf_pub *drvr = NULL; --@@ -1164,30 +1247,41 @@ int brcmf_bus_start(struct device *dev) -- #ifdef CONFIG_INET -- drvr->inetaddr_notifier.notifier_call = brcmf_inetaddr_changed; -- ret = register_inetaddr_notifier(&drvr->inetaddr_notifier); --+ if (ret) --+ goto fail; --+ --+#if IS_ENABLED(CONFIG_IPV6) --+ drvr->inet6addr_notifier.notifier_call = brcmf_inet6addr_changed; --+ ret = register_inet6addr_notifier(&drvr->inet6addr_notifier); --+ if (ret) { --+ unregister_inetaddr_notifier(&drvr->inetaddr_notifier); --+ goto fail; --+ } -- #endif --+#endif /* CONFIG_INET */ --+ --+ return 0; -- -- fail: --- if (ret < 0) { --- brcmf_err("failed: %d\n", ret); --- if (drvr->config) { --- brcmf_cfg80211_detach(drvr->config); --- drvr->config = NULL; --- } --- if (drvr->fws) { --- brcmf_fws_del_interface(ifp); --- brcmf_fws_deinit(drvr); --- } --- if (ifp) --- brcmf_net_detach(ifp->ndev); --- if (p2p_ifp) --- brcmf_net_detach(p2p_ifp->ndev); --- drvr->iflist[0] = NULL; --- drvr->iflist[1] = NULL; --- if (brcmf_ignoring_probe_fail(drvr)) --- ret = 0; --- return ret; --+ brcmf_err("failed: %d\n", ret); --+ if (drvr->config) { --+ brcmf_cfg80211_detach(drvr->config); --+ drvr->config = NULL; --+ } --+ if (drvr->fws) { --+ brcmf_fws_del_interface(ifp); --+ brcmf_fws_deinit(drvr); -- } --- return 0; --+ if (ifp) --+ brcmf_net_detach(ifp->ndev); --+ if (p2p_ifp) --+ brcmf_net_detach(p2p_ifp->ndev); --+ drvr->iflist[0] = NULL; --+ drvr->iflist[1] = NULL; --+ if (brcmf_ignoring_probe_fail(drvr)) --+ ret = 0; --+ --+ return ret; -- } -- -- void brcmf_bus_add_txhdrlen(struct device *dev, uint len) --@@ -1237,6 +1331,10 @@ void brcmf_detach(struct device *dev) -- unregister_inetaddr_notifier(&drvr->inetaddr_notifier); -- #endif -- --+#if IS_ENABLED(CONFIG_IPV6) --+ unregister_inet6addr_notifier(&drvr->inet6addr_notifier); --+#endif --+ -- /* stop firmware event handling */ -- brcmf_fweh_detach(drvr); -- if (drvr->config) ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -48,6 +48,8 @@ -- */ -- #define BRCMF_DRIVER_FIRMWARE_VERSION_LEN 32 -- --+#define NDOL_MAX_ENTRIES 8 --+ -- /** -- * struct brcmf_ampdu_rx_reorder - AMPDU receive reorder info -- * --@@ -143,6 +145,7 @@ struct brcmf_pub { -- #endif -- -- struct notifier_block inetaddr_notifier; --+ struct notifier_block inet6addr_notifier; -- struct brcmf_mp_device *settings; -- }; -- --@@ -175,6 +178,7 @@ enum brcmf_netif_stop_reason { -- * @stats: interface specific network statistics. -- * @setmacaddr_work: worker object for setting mac address. -- * @multicast_work: worker object for multicast provisioning. --+ * @ndoffload_work: worker object for neighbor discovery offload configuration. -- * @fws_desc: interface specific firmware-signalling descriptor. -- * @ifidx: interface index in device firmware. -- * @bsscfgidx: index of bss associated with this interface. --@@ -191,6 +195,7 @@ struct brcmf_if { -- struct net_device_stats stats; -- struct work_struct setmacaddr_work; -- struct work_struct multicast_work; --+ struct work_struct ndoffload_work; -- struct brcmf_fws_mac_descriptor *fws_desc; -- int ifidx; -- s32 bsscfgidx; --@@ -199,6 +204,8 @@ struct brcmf_if { -- spinlock_t netif_stop_lock; -- atomic_t pend_8021x_cnt; -- wait_queue_head_t pend_8021x_wait; --+ struct in6_addr ipv6_addr_tbl[NDOL_MAX_ENTRIES]; --+ u8 ipv6addr_idx; -- }; -- -- struct brcmf_skb_reorder_data { -diff --git a/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch b/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch -deleted file mode 100644 -index 68de8ed2a263a45c4d3e7c4d568801a6925b1a30..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0007-brcmfmac-check-return-for-ARP-ip-setting-iovar.patch -+++ /dev/null -@@ -1,38 +0,0 @@ --From: Franky Lin --Date: Wed, 17 Feb 2016 11:26:56 +0100 --Subject: [PATCH] brcmfmac: check return for ARP ip setting iovar -- --The return value of iovar set function should be saved and checked. -- --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Hante Meuleman --Signed-off-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -1039,14 +1039,14 @@ static int brcmf_inetaddr_changed(struct -- return NOTIFY_OK; -- } -- for (i = 0; i < ARPOL_MAX_ENTRIES; i++) { --- if (addr_table[i] != 0) { --- brcmf_fil_iovar_data_set(ifp, --- "arp_hostip", &addr_table[i], --- sizeof(addr_table[i])); --- if (ret) --- brcmf_err("add arp ip err %d\n", --- ret); --- } --+ if (addr_table[i] == 0) --+ continue; --+ ret = brcmf_fil_iovar_data_set(ifp, "arp_hostip", --+ &addr_table[i], --+ sizeof(addr_table[i])); --+ if (ret) --+ brcmf_err("add arp ip err %d\n", --+ ret); -- } -- } -- break; -diff --git a/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch b/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch -deleted file mode 100644 -index 3de0f64d560d8a64923f5227e95cbfa2cbfc72df..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0008-brcmfmac-use-device-memsize-config-from-fw-if-define.patch -+++ /dev/null -@@ -1,73 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:26:57 +0100 --Subject: [PATCH] brcmfmac: use device memsize config from fw if defined -- --Newer type pcie devices have memory which get shared between fw and --hw. The division of this memory is done firmware compile time. As a --result the ramsize as used by driver needs to be adjusted for this. --This is done by reading the memory size from the firmware. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --@@ -207,6 +207,10 @@ static struct brcmf_firmware_mapping brc -- #define BRCMF_PCIE_CFGREG_REG_BAR3_CONFIG 0x4F4 -- #define BRCMF_PCIE_LINK_STATUS_CTRL_ASPM_ENAB 3 -- --+/* Magic number at a magic location to find RAM size */ --+#define BRCMF_RAMSIZE_MAGIC 0x534d4152 /* SMAR */ --+#define BRCMF_RAMSIZE_OFFSET 0x6c --+ -- -- struct brcmf_pcie_console { -- u32 base_addr; --@@ -1412,6 +1416,28 @@ static const struct brcmf_bus_ops brcmf_ -- }; -- -- --+static void --+brcmf_pcie_adjust_ramsize(struct brcmf_pciedev_info *devinfo, u8 *data, --+ u32 data_len) --+{ --+ __le32 *field; --+ u32 newsize; --+ --+ if (data_len < BRCMF_RAMSIZE_OFFSET + 8) --+ return; --+ --+ field = (__le32 *)&data[BRCMF_RAMSIZE_OFFSET]; --+ if (le32_to_cpup(field) != BRCMF_RAMSIZE_MAGIC) --+ return; --+ field++; --+ newsize = le32_to_cpup(field); --+ --+ brcmf_dbg(PCIE, "Found ramsize info in FW, adjusting to 0x%x\n", --+ newsize); --+ devinfo->ci->ramsize = newsize; --+} --+ --+ -- static int -- brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo, -- u32 sharedram_addr) --@@ -1694,6 +1720,13 @@ static void brcmf_pcie_setup(struct devi -- -- brcmf_pcie_attach(devinfo); -- --+ /* Some of the firmwares have the size of the memory of the device --+ * defined inside the firmware. This is because part of the memory in --+ * the device is shared and the devision is determined by FW. Parse --+ * the firmware and adjust the chip memory size now. --+ */ --+ brcmf_pcie_adjust_ramsize(devinfo, (u8 *)fw->data, fw->size); --+ -- ret = brcmf_pcie_download_fw_nvram(devinfo, fw, nvram, nvram_len); -- if (ret) -- goto fail; -diff --git a/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch b/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch -deleted file mode 100644 -index ca03ffe4b09a5b565b9da2ce4eb13949bb3623b4..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0009-brcmfmac-use-bar1-window-size-as-provided-by-pci-sub.patch -+++ /dev/null -@@ -1,58 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:26:58 +0100 --Subject: [PATCH] brcmfmac: use bar1 window size as provided by pci subsystem -- --The PCIE bar1 window size is specified by chip. Currently the --ioremap of bar1 was using a define which always matched the size --of bar1, but newer chips can have a different bar1 sizes. With --this patch the ioremap will be called with the by chip provided --window size. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --@@ -72,7 +72,6 @@ static struct brcmf_firmware_mapping brc -- -- #define BRCMF_PCIE_FW_UP_TIMEOUT 2000 /* msec */ -- ---#define BRCMF_PCIE_TCM_MAP_SIZE (4096 * 1024) -- #define BRCMF_PCIE_REG_MAP_SIZE (32 * 1024) -- -- /* backplane addres space accessed by BAR0 */ --@@ -252,7 +251,6 @@ struct brcmf_pciedev_info { -- char nvram_name[BRCMF_FW_NAME_LEN]; -- void __iomem *regs; -- void __iomem *tcm; --- u32 tcm_size; -- u32 ram_base; -- u32 ram_size; -- struct brcmf_chip *ci; --@@ -1592,8 +1590,7 @@ static int brcmf_pcie_get_resource(struc -- } -- -- devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE); --- devinfo->tcm = ioremap_nocache(bar1_addr, BRCMF_PCIE_TCM_MAP_SIZE); --- devinfo->tcm_size = BRCMF_PCIE_TCM_MAP_SIZE; --+ devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size); -- -- if (!devinfo->regs || !devinfo->tcm) { -- brcmf_err("ioremap() failed (%p,%p)\n", devinfo->regs, --@@ -1602,8 +1599,9 @@ static int brcmf_pcie_get_resource(struc -- } -- brcmf_dbg(PCIE, "Phys addr : reg space = %p base addr %#016llx\n", -- devinfo->regs, (unsigned long long)bar0_addr); --- brcmf_dbg(PCIE, "Phys addr : mem space = %p base addr %#016llx\n", --- devinfo->tcm, (unsigned long long)bar1_addr); --+ brcmf_dbg(PCIE, "Phys addr : mem space = %p base addr %#016llx size 0x%x\n", --+ devinfo->tcm, (unsigned long long)bar1_addr, --+ (unsigned int)bar1_size); -- -- return 0; -- } -diff --git a/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch b/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch -deleted file mode 100644 -index e4a8f305cf5a8d9029ad5619ef8bcbc10a425ddd..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0010-brcmfmac-add-support-for-the-PCIE-4366c0-chip.patch -+++ /dev/null -@@ -1,34 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:26:59 +0100 --Subject: [PATCH] brcmfmac: add support for the PCIE 4366c0 chip -- --A newer version of the 4366 PCIE chip has been released. Add --support for this version of the chip. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --@@ -53,6 +53,7 @@ BRCMF_FW_NVRAM_DEF(4358, "brcmfmac4358-p -- BRCMF_FW_NVRAM_DEF(4359, "brcmfmac4359-pcie.bin", "brcmfmac4359-pcie.txt"); -- BRCMF_FW_NVRAM_DEF(4365B, "brcmfmac4365b-pcie.bin", "brcmfmac4365b-pcie.txt"); -- BRCMF_FW_NVRAM_DEF(4366B, "brcmfmac4366b-pcie.bin", "brcmfmac4366b-pcie.txt"); --+BRCMF_FW_NVRAM_DEF(4366C, "brcmfmac4366c-pcie.bin", "brcmfmac4366c-pcie.txt"); -- BRCMF_FW_NVRAM_DEF(4371, "brcmfmac4371-pcie.bin", "brcmfmac4371-pcie.txt"); -- -- static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { --@@ -66,7 +67,8 @@ static struct brcmf_firmware_mapping brc -- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358), -- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359), -- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFFF, 4365B), --- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFFF, 4366B), --+ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B), --+ BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C), -- BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371), -- }; -- -diff --git a/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch b/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch -deleted file mode 100644 -index f99f6dbf07660777a50fda006c049027ef88b16d..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0011-brcmfmac-remove-pcie-gen1-support.patch -+++ /dev/null -@@ -1,221 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:00 +0100 --Subject: [PATCH] brcmfmac: remove pcie gen1 support -- --The PCIE bus driver supports older gen1 (v1) chips, but there is no --actual device which is using this older pcie core which is supported --by brcmfmac. Remove all gen1 related code. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --@@ -100,9 +100,6 @@ static struct brcmf_firmware_mapping brc -- #define BRCMF_PCIE_PCIE2REG_CONFIGDATA 0x124 -- #define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX 0x140 -- ---#define BRCMF_PCIE_GENREV1 1 ---#define BRCMF_PCIE_GENREV2 2 --- -- #define BRCMF_PCIE2_INTA 0x01 -- #define BRCMF_PCIE2_INTB 0x02 -- --@@ -257,9 +254,7 @@ struct brcmf_pciedev_info { -- u32 ram_size; -- struct brcmf_chip *ci; -- u32 coreid; --- u32 generic_corerev; -- struct brcmf_pcie_shared_info shared; --- void (*ringbell)(struct brcmf_pciedev_info *devinfo); -- wait_queue_head_t mbdata_resp_wait; -- bool mbdata_completed; -- bool irq_allocated; --@@ -746,68 +741,22 @@ static void brcmf_pcie_bus_console_read( -- } -- -- ---static __used void brcmf_pcie_ringbell_v1(struct brcmf_pciedev_info *devinfo) ---{ --- u32 reg_value; --- --- brcmf_dbg(PCIE, "RING !\n"); --- reg_value = brcmf_pcie_read_reg32(devinfo, --- BRCMF_PCIE_PCIE2REG_MAILBOXINT); --- reg_value |= BRCMF_PCIE2_INTB; --- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, --- reg_value); ---} --- --- ---static void brcmf_pcie_ringbell_v2(struct brcmf_pciedev_info *devinfo) ---{ --- brcmf_dbg(PCIE, "RING !\n"); --- /* Any arbitrary value will do, lets use 1 */ --- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX, 1); ---} --- --- -- static void brcmf_pcie_intr_disable(struct brcmf_pciedev_info *devinfo) -- { --- if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) --- pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTMASK, --- 0); --- else --- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, --- 0); --+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, 0); -- } -- -- -- static void brcmf_pcie_intr_enable(struct brcmf_pciedev_info *devinfo) -- { --- if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) --- pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTMASK, --- BRCMF_PCIE_INT_DEF); --- else --- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, --- BRCMF_PCIE_MB_INT_D2H_DB | --- BRCMF_PCIE_MB_INT_FN0_0 | --- BRCMF_PCIE_MB_INT_FN0_1); --+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXMASK, --+ BRCMF_PCIE_MB_INT_D2H_DB | --+ BRCMF_PCIE_MB_INT_FN0_0 | --+ BRCMF_PCIE_MB_INT_FN0_1); -- } -- -- ---static irqreturn_t brcmf_pcie_quick_check_isr_v1(int irq, void *arg) ---{ --- struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; --- u32 status; --- --- status = 0; --- pci_read_config_dword(devinfo->pdev, BRCMF_PCIE_REG_INTSTATUS, &status); --- if (status) { --- brcmf_pcie_intr_disable(devinfo); --- brcmf_dbg(PCIE, "Enter\n"); --- return IRQ_WAKE_THREAD; --- } --- return IRQ_NONE; ---} --- --- ---static irqreturn_t brcmf_pcie_quick_check_isr_v2(int irq, void *arg) --+static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg) -- { -- struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; -- --@@ -820,29 +769,7 @@ static irqreturn_t brcmf_pcie_quick_chec -- } -- -- ---static irqreturn_t brcmf_pcie_isr_thread_v1(int irq, void *arg) ---{ --- struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; --- const struct pci_dev *pdev = devinfo->pdev; --- u32 status; --- --- devinfo->in_irq = true; --- status = 0; --- pci_read_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, &status); --- brcmf_dbg(PCIE, "Enter %x\n", status); --- if (status) { --- pci_write_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, status); --- if (devinfo->state == BRCMFMAC_PCIE_STATE_UP) --- brcmf_proto_msgbuf_rx_trigger(&devinfo->pdev->dev); --- } --- if (devinfo->state == BRCMFMAC_PCIE_STATE_UP) --- brcmf_pcie_intr_enable(devinfo); --- devinfo->in_irq = false; --- return IRQ_HANDLED; ---} --- --- ---static irqreturn_t brcmf_pcie_isr_thread_v2(int irq, void *arg) --+static irqreturn_t brcmf_pcie_isr_thread(int irq, void *arg) -- { -- struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)arg; -- u32 status; --@@ -879,28 +806,14 @@ static int brcmf_pcie_request_irq(struct -- brcmf_pcie_intr_disable(devinfo); -- -- brcmf_dbg(PCIE, "Enter\n"); --- /* is it a v1 or v2 implementation */ --+ -- pci_enable_msi(pdev); --- if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) { --- if (request_threaded_irq(pdev->irq, --- brcmf_pcie_quick_check_isr_v1, --- brcmf_pcie_isr_thread_v1, --- IRQF_SHARED, "brcmf_pcie_intr", --- devinfo)) { --- pci_disable_msi(pdev); --- brcmf_err("Failed to request IRQ %d\n", pdev->irq); --- return -EIO; --- } --- } else { --- if (request_threaded_irq(pdev->irq, --- brcmf_pcie_quick_check_isr_v2, --- brcmf_pcie_isr_thread_v2, --- IRQF_SHARED, "brcmf_pcie_intr", --- devinfo)) { --- pci_disable_msi(pdev); --- brcmf_err("Failed to request IRQ %d\n", pdev->irq); --- return -EIO; --- } --+ if (request_threaded_irq(pdev->irq, brcmf_pcie_quick_check_isr, --+ brcmf_pcie_isr_thread, IRQF_SHARED, --+ "brcmf_pcie_intr", devinfo)) { --+ pci_disable_msi(pdev); --+ brcmf_err("Failed to request IRQ %d\n", pdev->irq); --+ return -EIO; -- } -- devinfo->irq_allocated = true; -- return 0; --@@ -931,16 +844,9 @@ static void brcmf_pcie_release_irq(struc -- if (devinfo->in_irq) -- brcmf_err("Still in IRQ (processing) !!!\n"); -- --- if (devinfo->generic_corerev == BRCMF_PCIE_GENREV1) { --- status = 0; --- pci_read_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, &status); --- pci_write_config_dword(pdev, BRCMF_PCIE_REG_INTSTATUS, status); --- } else { --- status = brcmf_pcie_read_reg32(devinfo, --- BRCMF_PCIE_PCIE2REG_MAILBOXINT); --- brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, --- status); --- } --+ status = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT); --+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, status); --+ -- devinfo->irq_allocated = false; -- } -- --@@ -989,7 +895,9 @@ static int brcmf_pcie_ring_mb_ring_bell( -- if (devinfo->state != BRCMFMAC_PCIE_STATE_UP) -- return -EIO; -- --- devinfo->ringbell(devinfo); --+ brcmf_dbg(PCIE, "RING !\n"); --+ /* Any arbitrary value will do, lets use 1 */ --+ brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX, 1); -- -- return 0; -- } --@@ -1503,9 +1411,6 @@ static int brcmf_pcie_download_fw_nvram( -- u32 address; -- u32 resetintr; -- --- devinfo->ringbell = brcmf_pcie_ringbell_v2; --- devinfo->generic_corerev = BRCMF_PCIE_GENREV2; --- -- brcmf_dbg(PCIE, "Halt ARM.\n"); -- err = brcmf_pcie_enter_download_state(devinfo); -- if (err) -diff --git a/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch b/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch -deleted file mode 100644 -index 4adfc2dc644ab901dae25abcbd2e3c4845802bb5..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0012-brcmfmac-increase-timeout-for-tx-eapol.patch -+++ /dev/null -@@ -1,30 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:01 +0100 --Subject: [PATCH] brcmfmac: increase timeout for tx eapol -- --When keys get set and updated this has to happen after eapol got --transmitted (without key or old key) before the key can be updated. --To make sure the order of sending eapol and configuring key is done --correctly a timeout for tx of eapol is applied. This timeout is set --to 50 msec, which is not always enough. Especially in AP mode and --key updates the timeout may need to be much longer because client(s) --can be in powersave. Increase the timeout from 50 to 950 msec. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -42,7 +42,7 @@ MODULE_AUTHOR("Broadcom Corporation"); -- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); -- MODULE_LICENSE("Dual BSD/GPL"); -- ---#define MAX_WAIT_FOR_8021X_TX msecs_to_jiffies(50) --+#define MAX_WAIT_FOR_8021X_TX msecs_to_jiffies(950) -- -- /* AMPDU rx reordering definitions */ -- #define BRCMF_RXREORDER_FLOWID_OFFSET 0 -diff --git a/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch b/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch -deleted file mode 100644 -index bd62781188c37c339ab5eafb8434b6a5d07677bd..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0013-brcmfmac-move-module-init-and-exit-to-common.patch -+++ /dev/null -@@ -1,135 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:02 +0100 --Subject: [PATCH] brcmfmac: move module init and exit to common -- --In preparation of module parameters for all devices the module init --and exit routines are moved to the common file. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --@@ -28,6 +28,10 @@ -- #include "tracepoint.h" -- #include "common.h" -- --+MODULE_AUTHOR("Broadcom Corporation"); --+MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); --+MODULE_LICENSE("Dual BSD/GPL"); --+ -- const u8 ALLFFMAC[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -- -- #define BRCMF_DEFAULT_SCAN_CHANNEL_TIME 40 --@@ -221,7 +225,7 @@ void __brcmf_dbg(u32 level, const char * -- } -- #endif -- ---void brcmf_mp_attach(void) --+static void brcmf_mp_attach(void) -- { -- strlcpy(brcmf_mp_global.firmware_path, brcmf_firmware_path, -- BRCMF_FW_ALTPATH_LEN); --@@ -249,3 +253,33 @@ void brcmf_mp_device_detach(struct brcmf -- kfree(drvr->settings); -- } -- --+static int __init brcmfmac_module_init(void) --+{ --+ int err; --+ --+ /* Initialize debug system first */ --+ brcmf_debugfs_init(); --+ --+#ifdef CPTCFG_BRCMFMAC_SDIO --+ brcmf_sdio_init(); --+#endif --+ /* Initialize global module paramaters */ --+ brcmf_mp_attach(); --+ --+ /* Continue the initialization by registering the different busses */ --+ err = brcmf_core_init(); --+ if (err) --+ brcmf_debugfs_exit(); --+ --+ return err; --+} --+ --+static void __exit brcmfmac_module_exit(void) --+{ --+ brcmf_core_exit(); --+ brcmf_debugfs_exit(); --+} --+ --+module_init(brcmfmac_module_init); --+module_exit(brcmfmac_module_exit); --+ ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --@@ -89,7 +89,6 @@ struct brcmf_mp_device { -- struct cc_translate *country_codes; -- }; -- ---void brcmf_mp_attach(void); -- int brcmf_mp_device_attach(struct brcmf_pub *drvr); -- void brcmf_mp_device_detach(struct brcmf_pub *drvr); -- #ifdef DEBUG ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -38,10 +38,6 @@ -- #include "pcie.h" -- #include "common.h" -- ---MODULE_AUTHOR("Broadcom Corporation"); ---MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); ---MODULE_LICENSE("Dual BSD/GPL"); --- -- #define MAX_WAIT_FOR_8021X_TX msecs_to_jiffies(950) -- -- /* AMPDU rx reordering definitions */ --@@ -1422,19 +1418,15 @@ static void brcmf_driver_register(struct -- } -- static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register); -- ---static int __init brcmfmac_module_init(void) --+int __init brcmf_core_init(void) -- { --- brcmf_debugfs_init(); ---#ifdef CPTCFG_BRCMFMAC_SDIO --- brcmf_sdio_init(); ---#endif -- if (!schedule_work(&brcmf_driver_work)) -- return -EBUSY; -- -- return 0; -- } -- ---static void __exit brcmfmac_module_exit(void) --+void __exit brcmf_core_exit(void) -- { -- cancel_work_sync(&brcmf_driver_work); -- --@@ -1447,8 +1439,5 @@ static void __exit brcmfmac_module_exit( -- #ifdef CPTCFG_BRCMFMAC_PCIE -- brcmf_pcie_exit(); -- #endif --- brcmf_debugfs_exit(); -- } -- ---module_init(brcmfmac_module_init); ---module_exit(brcmfmac_module_exit); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -227,5 +227,7 @@ void brcmf_txflowblock_if(struct brcmf_i -- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); -- void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); -- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); --+int __init brcmf_core_init(void); --+void __exit brcmf_core_exit(void); -- -- #endif /* BRCMFMAC_CORE_H */ -diff --git a/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch b/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch -deleted file mode 100644 -index 577ca8ed2837b3c480be022067e7b8389f13af01..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0014-brcmfmac-add-wowl-gtk-rekeying-offload-support.patch -+++ /dev/null -@@ -1,260 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:03 +0100 --Subject: [PATCH] brcmfmac: add wowl gtk rekeying offload support -- --This patch adds support for gtk rekeying offload and for gtk --rekeying failure during wowl mode. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -3526,6 +3526,10 @@ static void brcmf_report_wowl_wakeind(st -- else -- wakeup_data.net_detect = cfg->wowl.nd_info; -- } --+ if (wakeind & BRCMF_WOWL_GTK_FAILURE) { --+ brcmf_dbg(INFO, "WOWL Wake indicator: BRCMF_WOWL_GTK_FAILURE\n"); --+ wakeup_data.gtk_rekey_failure = true; --+ } -- } else { -- wakeup = NULL; -- } --@@ -3607,6 +3611,8 @@ static void brcmf_configure_wowl(struct -- brcmf_fweh_register(cfg->pub, BRCMF_E_PFN_NET_FOUND, -- brcmf_wowl_nd_results); -- } --+ if (wowl->gtk_rekey_failure) --+ wowl_config |= BRCMF_WOWL_GTK_FAILURE; -- if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) -- wowl_config |= BRCMF_WOWL_UNASSOC; -- --@@ -4874,7 +4880,32 @@ static int brcmf_cfg80211_tdls_oper(stru -- return ret; -- } -- ---static struct cfg80211_ops wl_cfg80211_ops = { --+#ifdef CONFIG_PM --+static int --+brcmf_cfg80211_set_rekey_data(struct wiphy *wiphy, struct net_device *ndev, --+ struct cfg80211_gtk_rekey_data *gtk) --+{ --+ struct brcmf_if *ifp = netdev_priv(ndev); --+ struct brcmf_gtk_keyinfo_le gtk_le; --+ int ret; --+ --+ brcmf_dbg(TRACE, "Enter, bssidx=%d\n", ifp->bsscfgidx); --+ --+ memcpy(gtk_le.kck, gtk->kck, sizeof(gtk_le.kck)); --+ memcpy(gtk_le.kek, gtk->kek, sizeof(gtk_le.kek)); --+ memcpy(gtk_le.replay_counter, gtk->replay_ctr, --+ sizeof(gtk_le.replay_counter)); --+ --+ ret = brcmf_fil_iovar_data_set(ifp, "gtk_key_info", >k_le, --+ sizeof(gtk_le)); --+ if (ret < 0) --+ brcmf_err("gtk_key_info iovar failed: ret=%d\n", ret); --+ --+ return ret; --+} --+#endif --+ --+static struct cfg80211_ops brcmf_cfg80211_ops = { -- .add_virtual_intf = brcmf_cfg80211_add_iface, -- .del_virtual_intf = brcmf_cfg80211_del_iface, -- .change_virtual_intf = brcmf_cfg80211_change_iface, --@@ -6139,19 +6170,18 @@ static void brcmf_wiphy_wowl_params(stru -- { -- #ifdef CONFIG_PM -- struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); --- s32 err; --- u32 wowl_cap; -- -- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PNO)) { --- err = brcmf_fil_iovar_int_get(ifp, "wowl_cap", &wowl_cap); --- if (!err) { --- if (wowl_cap & BRCMF_WOWL_PFN_FOUND) { --- brcmf_wowlan_support.flags |= --- WIPHY_WOWLAN_NET_DETECT; --- init_waitqueue_head(&cfg->wowl.nd_data_wait); --- } --+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ND)) { --+ brcmf_wowlan_support.flags |= WIPHY_WOWLAN_NET_DETECT; --+ init_waitqueue_head(&cfg->wowl.nd_data_wait); -- } -- } --+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) { --+ brcmf_wowlan_support.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY; --+ brcmf_wowlan_support.flags |= WIPHY_WOWLAN_GTK_REKEY_FAILURE; --+ } --+ -- wiphy->wowlan = &brcmf_wowlan_support; -- #endif -- } --@@ -6538,6 +6568,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802 -- struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev; -- struct brcmf_cfg80211_info *cfg; -- struct wiphy *wiphy; --+ struct cfg80211_ops *ops; -- struct brcmf_cfg80211_vif *vif; -- struct brcmf_if *ifp; -- s32 err = 0; --@@ -6549,8 +6580,17 @@ struct brcmf_cfg80211_info *brcmf_cfg802 -- return NULL; -- } -- --+ ops = kzalloc(sizeof(*ops), GFP_KERNEL); --+ if (!ops) --+ return NULL; --+ --+ memcpy(ops, &brcmf_cfg80211_ops, sizeof(*ops)); -- ifp = netdev_priv(ndev); --- wiphy = wiphy_new(&wl_cfg80211_ops, sizeof(struct brcmf_cfg80211_info)); --+#ifdef CONFIG_PM --+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK)) --+ ops->set_rekey_data = brcmf_cfg80211_set_rekey_data; --+#endif --+ wiphy = wiphy_new(ops, sizeof(struct brcmf_cfg80211_info)); -- if (!wiphy) { -- brcmf_err("Could not allocate wiphy device\n"); -- return NULL; --@@ -6560,6 +6600,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802 -- -- cfg = wiphy_priv(wiphy); -- cfg->wiphy = wiphy; --+ cfg->ops = ops; -- cfg->pub = drvr; -- init_vif_event(&cfg->vif_event); -- INIT_LIST_HEAD(&cfg->vif_list); --@@ -6686,6 +6727,7 @@ priv_out: -- ifp->vif = NULL; -- wiphy_out: -- brcmf_free_wiphy(wiphy); --+ kfree(ops); -- return NULL; -- } -- --@@ -6696,6 +6738,7 @@ void brcmf_cfg80211_detach(struct brcmf_ -- -- brcmf_btcoex_detach(cfg); -- wiphy_unregister(cfg->wiphy); --+ kfree(cfg->ops); -- wl_deinit_priv(cfg); -- brcmf_free_wiphy(cfg->wiphy); -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --@@ -256,6 +256,7 @@ struct brcmf_cfg80211_wowl { -- * struct brcmf_cfg80211_info - dongle private data of cfg80211 interface -- * -- * @wiphy: wiphy object for cfg80211 interface. --+ * @ops: pointer to copy of ops as registered with wiphy object. -- * @conf: dongle configuration. -- * @p2p: peer-to-peer specific information. -- * @btcoex: Bluetooth coexistence information. --@@ -288,6 +289,7 @@ struct brcmf_cfg80211_wowl { -- */ -- struct brcmf_cfg80211_info { -- struct wiphy *wiphy; --+ struct cfg80211_ops *ops; -- struct brcmf_cfg80211_conf *conf; -- struct brcmf_p2p_info p2p; -- struct brcmf_btcoex_info *btcoex; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c --@@ -136,6 +136,7 @@ void brcmf_feat_attach(struct brcmf_pub -- { -- struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0); -- struct brcmf_pno_macaddr_le pfn_mac; --+ u32 wowl_cap; -- s32 err; -- -- brcmf_feat_firmware_capabilities(ifp); --@@ -143,6 +144,17 @@ void brcmf_feat_attach(struct brcmf_pub -- brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn"); -- if (drvr->bus_if->wowl_supported) -- brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl"); --+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL)) { --+ err = brcmf_fil_iovar_int_get(ifp, "wowl_cap", &wowl_cap); --+ if (!err) { --+ if (wowl_cap & BRCMF_WOWL_PFN_FOUND) --+ ifp->drvr->feat_flags |= --+ BIT(BRCMF_FEAT_WOWL_ND); --+ if (wowl_cap & BRCMF_WOWL_GTK_FAILURE) --+ ifp->drvr->feat_flags |= --+ BIT(BRCMF_FEAT_WOWL_GTK); --+ } --+ } -- /* MBSS does not work for 43362 */ -- if (drvr->bus_if->chip == BRCM_CC_43362_CHIP_ID) -- ifp->drvr->feat_flags &= ~BIT(BRCMF_FEAT_MBSS); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h --@@ -27,6 +27,8 @@ -- * RSDB: Real Simultaneous Dual Band -- * TDLS: Tunneled Direct Link Setup -- * SCAN_RANDOM_MAC: Random MAC during (net detect) scheduled scan. --+ * WOWL_ND: WOWL net detect (PNO) --+ * WOWL_GTK: (WOWL) GTK rekeying offload -- */ -- #define BRCMF_FEAT_LIST \ -- BRCMF_FEAT_DEF(MBSS) \ --@@ -36,7 +38,9 @@ -- BRCMF_FEAT_DEF(P2P) \ -- BRCMF_FEAT_DEF(RSDB) \ -- BRCMF_FEAT_DEF(TDLS) \ --- BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) --+ BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) \ --+ BRCMF_FEAT_DEF(WOWL_ND) \ --+ BRCMF_FEAT_DEF(WOWL_GTK) -- -- /* -- * Quirks: ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h --@@ -111,7 +111,9 @@ -- /* Wakeup if received matched secured pattern: */ -- #define BRCMF_WOWL_SECURE (1 << 25) -- /* Wakeup on finding preferred network */ ---#define BRCMF_WOWL_PFN_FOUND (1 << 26) --+#define BRCMF_WOWL_PFN_FOUND (1 << 27) --+/* Wakeup on receiving pairwise key EAP packets: */ --+#define WIPHY_WOWL_EAP_PK (1 << 28) -- /* Link Down indication in WoWL mode: */ -- #define BRCMF_WOWL_LINKDOWN (1 << 31) -- --@@ -136,6 +138,10 @@ -- -- #define BRCMF_MCSSET_LEN 16 -- --+#define BRCMF_RSN_KCK_LENGTH 16 --+#define BRCMF_RSN_KEK_LENGTH 16 --+#define BRCMF_RSN_REPLAY_LEN 8 --+ -- /* join preference types for join_pref iovar */ -- enum brcmf_join_pref_types { -- BRCMF_JOIN_PREF_RSSI = 1, --@@ -789,4 +795,17 @@ struct brcmf_pktcnt_le { -- __le32 rx_ocast_good_pkt; -- }; -- --+/** --+ * struct brcmf_gtk_keyinfo_le - GTP rekey data --+ * --+ * @kck: key confirmation key. --+ * @kek: key encryption key. --+ * @replay_counter: replay counter. --+ */ --+struct brcmf_gtk_keyinfo_le { --+ u8 kck[BRCMF_RSN_KCK_LENGTH]; --+ u8 kek[BRCMF_RSN_KEK_LENGTH]; --+ u8 replay_counter[BRCMF_RSN_REPLAY_LEN]; --+}; --+ -- #endif /* FWIL_TYPES_H_ */ -diff --git a/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch b/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch -deleted file mode 100644 -index 2685238925444a4d76cfb14d5ec85e69b9b686f1..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0015-brcmfmac-move-platform-data-retrieval-code-to-common.patch -+++ /dev/null -@@ -1,385 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:04 +0100 --Subject: [PATCH] brcmfmac: move platform data retrieval code to common -- --In preparation of module parameters for all devices the module --platform data retrieval is moved from sdio to common. It is still --only used for sdio devices. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --@@ -27,8 +27,6 @@ -- #include -- #include -- #include ---#include ---#include -- #include -- #include -- #include --@@ -46,7 +44,6 @@ -- #include "bus.h" -- #include "debug.h" -- #include "sdio.h" ---#include "of.h" -- #include "core.h" -- #include "common.h" -- --@@ -106,18 +103,18 @@ static void brcmf_sdiod_dummy_irqhandler -- -- int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev) -- { --+ struct brcmfmac_sdio_platform_data *pdata; -- int ret = 0; -- u8 data; -- u32 addr, gpiocontrol; -- unsigned long flags; -- --- if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) { --+ pdata = sdiodev->pdata; --+ if ((pdata) && (pdata->oob_irq_supported)) { -- brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n", --- sdiodev->pdata->oob_irq_nr); --- ret = request_irq(sdiodev->pdata->oob_irq_nr, --- brcmf_sdiod_oob_irqhandler, --- sdiodev->pdata->oob_irq_flags, --- "brcmf_oob_intr", --+ pdata->oob_irq_nr); --+ ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler, --+ pdata->oob_irq_flags, "brcmf_oob_intr", -- &sdiodev->func[1]->dev); -- if (ret != 0) { -- brcmf_err("request_irq failed %d\n", ret); --@@ -129,7 +126,7 @@ int brcmf_sdiod_intr_register(struct brc -- sdiodev->irq_en = true; -- spin_unlock_irqrestore(&sdiodev->irq_en_lock, flags); -- --- ret = enable_irq_wake(sdiodev->pdata->oob_irq_nr); --+ ret = enable_irq_wake(pdata->oob_irq_nr); -- if (ret != 0) { -- brcmf_err("enable_irq_wake failed %d\n", ret); -- return ret; --@@ -158,7 +155,7 @@ int brcmf_sdiod_intr_register(struct brc -- -- /* redirect, configure and enable io for interrupt signal */ -- data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE; --- if (sdiodev->pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) --+ if (pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) -- data |= SDIO_SEPINT_ACT_HI; -- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret); -- --@@ -176,9 +173,12 @@ int brcmf_sdiod_intr_register(struct brc -- -- int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev) -- { --+ struct brcmfmac_sdio_platform_data *pdata; --+ -- brcmf_dbg(SDIO, "Entering\n"); -- --- if ((sdiodev->pdata) && (sdiodev->pdata->oob_irq_supported)) { --+ pdata = sdiodev->pdata; --+ if ((pdata) && (pdata->oob_irq_supported)) { -- sdio_claim_host(sdiodev->func[1]); -- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL); -- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL); --@@ -187,11 +187,10 @@ int brcmf_sdiod_intr_unregister(struct b -- if (sdiodev->oob_irq_requested) { -- sdiodev->oob_irq_requested = false; -- if (sdiodev->irq_wake) { --- disable_irq_wake(sdiodev->pdata->oob_irq_nr); --+ disable_irq_wake(pdata->oob_irq_nr); -- sdiodev->irq_wake = false; -- } --- free_irq(sdiodev->pdata->oob_irq_nr, --- &sdiodev->func[1]->dev); --+ free_irq(pdata->oob_irq_nr, &sdiodev->func[1]->dev); -- sdiodev->irq_en = false; -- } -- } else { --@@ -1103,8 +1102,6 @@ static const struct sdio_device_id brcmf -- }; -- MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids); -- ---static struct brcmfmac_sdio_platform_data *brcmfmac_sdio_pdata; --- -- -- static void brcmf_sdiod_acpi_set_power_manageable(struct device *dev, -- int val) --@@ -1167,10 +1164,7 @@ static int brcmf_ops_sdio_probe(struct s -- dev_set_drvdata(&func->dev, bus_if); -- dev_set_drvdata(&sdiodev->func[1]->dev, bus_if); -- sdiodev->dev = &sdiodev->func[1]->dev; --- sdiodev->pdata = brcmfmac_sdio_pdata; --- --- if (!sdiodev->pdata) --- brcmf_of_probe(sdiodev); --+ sdiodev->pdata = brcmf_get_module_param(sdiodev->dev); -- -- #ifdef CONFIG_PM_SLEEP -- /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ --@@ -1296,7 +1290,7 @@ static const struct dev_pm_ops brcmf_sdi -- static struct sdio_driver brcmf_sdmmc_driver = { -- .probe = brcmf_ops_sdio_probe, -- .remove = brcmf_ops_sdio_remove, --- .name = BRCMFMAC_SDIO_PDATA_NAME, --+ .name = KBUILD_MODNAME, -- .id_table = brcmf_sdmmc_ids, -- .drv = { -- .owner = THIS_MODULE, --@@ -1306,37 +1300,6 @@ static struct sdio_driver brcmf_sdmmc_dr -- }, -- }; -- ---static int __init brcmf_sdio_pd_probe(struct platform_device *pdev) ---{ --- brcmf_dbg(SDIO, "Enter\n"); --- --- brcmfmac_sdio_pdata = dev_get_platdata(&pdev->dev); --- --- if (brcmfmac_sdio_pdata->power_on) --- brcmfmac_sdio_pdata->power_on(); --- --- return 0; ---} --- ---static int brcmf_sdio_pd_remove(struct platform_device *pdev) ---{ --- brcmf_dbg(SDIO, "Enter\n"); --- --- if (brcmfmac_sdio_pdata->power_off) --- brcmfmac_sdio_pdata->power_off(); --- --- sdio_unregister_driver(&brcmf_sdmmc_driver); --- --- return 0; ---} --- ---static struct platform_driver brcmf_sdio_pd = { --- .remove = brcmf_sdio_pd_remove, --- .driver = { --- .name = BRCMFMAC_SDIO_PDATA_NAME, --- } ---}; --- -- void brcmf_sdio_register(void) -- { -- int ret; --@@ -1350,19 +1313,6 @@ void brcmf_sdio_exit(void) -- { -- brcmf_dbg(SDIO, "Enter\n"); -- --- if (brcmfmac_sdio_pdata) --- platform_driver_unregister(&brcmf_sdio_pd); --- else --- sdio_unregister_driver(&brcmf_sdmmc_driver); --+ sdio_unregister_driver(&brcmf_sdmmc_driver); -- } -- ---void __init brcmf_sdio_init(void) ---{ --- int ret; --- --- brcmf_dbg(SDIO, "Enter\n"); --- --- ret = platform_driver_probe(&brcmf_sdio_pd, brcmf_sdio_pd_probe); --- if (ret == -ENODEV) --- brcmf_dbg(SDIO, "No platform data available.\n"); ---} ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --@@ -27,6 +27,7 @@ -- #include "fwil_types.h" -- #include "tracepoint.h" -- #include "common.h" --+#include "of.h" -- -- MODULE_AUTHOR("Broadcom Corporation"); -- MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); --@@ -79,6 +80,7 @@ module_param_named(ignore_probe_fail, br -- MODULE_PARM_DESC(ignore_probe_fail, "always succeed probe for debugging"); -- #endif -- --+static struct brcmfmac_sdio_platform_data *brcmfmac_pdata; -- struct brcmf_mp_global_t brcmf_mp_global; -- -- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) --@@ -231,6 +233,13 @@ static void brcmf_mp_attach(void) -- BRCMF_FW_ALTPATH_LEN); -- } -- --+struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev) --+{ --+ if (!brcmfmac_pdata) --+ brcmf_of_probe(dev, &brcmfmac_pdata); --+ return brcmfmac_pdata; --+} --+ -- int brcmf_mp_device_attach(struct brcmf_pub *drvr) -- { -- drvr->settings = kzalloc(sizeof(*drvr->settings), GFP_ATOMIC); --@@ -253,6 +262,35 @@ void brcmf_mp_device_detach(struct brcmf -- kfree(drvr->settings); -- } -- --+static int __init brcmf_common_pd_probe(struct platform_device *pdev) --+{ --+ brcmf_dbg(INFO, "Enter\n"); --+ --+ brcmfmac_pdata = dev_get_platdata(&pdev->dev); --+ --+ if (brcmfmac_pdata->power_on) --+ brcmfmac_pdata->power_on(); --+ --+ return 0; --+} --+ --+static int brcmf_common_pd_remove(struct platform_device *pdev) --+{ --+ brcmf_dbg(INFO, "Enter\n"); --+ --+ if (brcmfmac_pdata->power_off) --+ brcmfmac_pdata->power_off(); --+ --+ return 0; --+} --+ --+static struct platform_driver brcmf_pd = { --+ .remove = brcmf_common_pd_remove, --+ .driver = { --+ .name = BRCMFMAC_SDIO_PDATA_NAME, --+ } --+}; --+ -- static int __init brcmfmac_module_init(void) -- { -- int err; --@@ -260,16 +298,21 @@ static int __init brcmfmac_module_init(v -- /* Initialize debug system first */ -- brcmf_debugfs_init(); -- ---#ifdef CPTCFG_BRCMFMAC_SDIO --- brcmf_sdio_init(); ---#endif --+ /* Get the platform data (if available) for our devices */ --+ err = platform_driver_probe(&brcmf_pd, brcmf_common_pd_probe); --+ if (err == -ENODEV) --+ brcmf_dbg(INFO, "No platform data available.\n"); --+ -- /* Initialize global module paramaters */ -- brcmf_mp_attach(); -- -- /* Continue the initialization by registering the different busses */ -- err = brcmf_core_init(); --- if (err) --+ if (err) { -- brcmf_debugfs_exit(); --+ if (brcmfmac_pdata) --+ platform_driver_unregister(&brcmf_pd); --+ } -- -- return err; -- } --@@ -277,6 +320,8 @@ static int __init brcmfmac_module_init(v -- static void __exit brcmfmac_module_exit(void) -- { -- brcmf_core_exit(); --+ if (brcmfmac_pdata) --+ platform_driver_unregister(&brcmf_pd); -- brcmf_debugfs_exit(); -- } -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --@@ -15,6 +15,8 @@ -- #ifndef BRCMFMAC_COMMON_H -- #define BRCMFMAC_COMMON_H -- --+#include --+#include -- #include "fwil_types.h" -- -- extern const u8 ALLFFMAC[ETH_ALEN]; --@@ -89,6 +91,7 @@ struct brcmf_mp_device { -- struct cc_translate *country_codes; -- }; -- --+struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev); -- int brcmf_mp_device_attach(struct brcmf_pub *drvr); -- void brcmf_mp_device_detach(struct brcmf_pub *drvr); -- #ifdef DEBUG ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c --@@ -16,17 +16,16 @@ -- #include -- #include -- #include ---#include ---#include ---#include -- -- #include -- #include "debug.h" ---#include "sdio.h" --+#include "core.h" --+#include "common.h" --+#include "of.h" -- ---void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev) --+void --+brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio) -- { --- struct device *dev = sdiodev->dev; -- struct device_node *np = dev->of_node; -- int irq; -- u32 irqf; --@@ -35,12 +34,12 @@ void brcmf_of_probe(struct brcmf_sdio_de -- if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac")) -- return; -- --- sdiodev->pdata = devm_kzalloc(dev, sizeof(*sdiodev->pdata), GFP_KERNEL); --- if (!sdiodev->pdata) --+ *sdio = devm_kzalloc(dev, sizeof(*sdio), GFP_KERNEL); --+ if (!(*sdio)) -- return; -- -- if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0) --- sdiodev->pdata->drive_strength = val; --+ (*sdio)->drive_strength = val; -- -- /* make sure there are interrupts defined in the node */ -- if (!of_find_property(np, "interrupts", NULL)) --@@ -53,7 +52,7 @@ void brcmf_of_probe(struct brcmf_sdio_de -- } -- irqf = irqd_get_trigger_type(irq_get_irq_data(irq)); -- --- sdiodev->pdata->oob_irq_supported = true; --- sdiodev->pdata->oob_irq_nr = irq; --- sdiodev->pdata->oob_irq_flags = irqf; --+ (*sdio)->oob_irq_supported = true; --+ (*sdio)->oob_irq_nr = irq; --+ (*sdio)->oob_irq_flags = irqf; -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h --@@ -14,9 +14,11 @@ -- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- */ -- #ifdef CONFIG_OF ---void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev); --+void --+brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio); -- #else ---static void brcmf_of_probe(struct brcmf_sdio_dev *sdiodev) --+static void brcmf_of_probe(struct device *dev, --+ struct brcmfmac_sdio_platform_data **sdio) -- { -- } -- #endif /* CONFIG_OF */ -diff --git a/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch b/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch -deleted file mode 100644 -index 4e789cfc5a6cfc82c584bb59bd7dd4a7a058377b..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0016-brcmfmac-keep-ARP-and-ND-offload-enabled-during-WOWL.patch -+++ /dev/null -@@ -1,69 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:05 +0100 --Subject: [PATCH] brcmfmac: keep ARP and ND offload enabled during WOWL -- --Currently ARP and ND (IPv6 Neigbor Discovery) offload get disabled --on entering suspend. However when firmwares support the wowl_cap --iovar then these offload routines can be kept enabled as they --will work during WOWL as well. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -3556,7 +3556,8 @@ static s32 brcmf_cfg80211_resume(struct -- brcmf_report_wowl_wakeind(wiphy, ifp); -- brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0); -- brcmf_config_wowl_pattern(ifp, "clr", NULL, 0, NULL, 0); --- brcmf_configure_arp_nd_offload(ifp, true); --+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND)) --+ brcmf_configure_arp_nd_offload(ifp, true); -- brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, -- cfg->wowl.pre_pmmode); -- cfg->wowl.active = false; --@@ -3580,7 +3581,8 @@ static void brcmf_configure_wowl(struct -- -- brcmf_dbg(TRACE, "Suspend, wowl config.\n"); -- --- brcmf_configure_arp_nd_offload(ifp, false); --+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_ARP_ND)) --+ brcmf_configure_arp_nd_offload(ifp, false); -- brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->wowl.pre_pmmode); -- brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, PM_MAX); -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c --@@ -147,6 +147,7 @@ void brcmf_feat_attach(struct brcmf_pub -- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL)) { -- err = brcmf_fil_iovar_int_get(ifp, "wowl_cap", &wowl_cap); -- if (!err) { --+ ifp->drvr->feat_flags |= BIT(BRCMF_FEAT_WOWL_ARP_ND); -- if (wowl_cap & BRCMF_WOWL_PFN_FOUND) -- ifp->drvr->feat_flags |= -- BIT(BRCMF_FEAT_WOWL_ND); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h --@@ -29,6 +29,7 @@ -- * SCAN_RANDOM_MAC: Random MAC during (net detect) scheduled scan. -- * WOWL_ND: WOWL net detect (PNO) -- * WOWL_GTK: (WOWL) GTK rekeying offload --+ * WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL. -- */ -- #define BRCMF_FEAT_LIST \ -- BRCMF_FEAT_DEF(MBSS) \ --@@ -40,7 +41,8 @@ -- BRCMF_FEAT_DEF(TDLS) \ -- BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) \ -- BRCMF_FEAT_DEF(WOWL_ND) \ --- BRCMF_FEAT_DEF(WOWL_GTK) --+ BRCMF_FEAT_DEF(WOWL_GTK) \ --+ BRCMF_FEAT_DEF(WOWL_ARP_ND) -- -- /* -- * Quirks: -diff --git a/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch b/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch -deleted file mode 100644 -index 37b68552cc8ce99d021930f5fc78692a7ba92f06..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0017-brcmfmac-switch-to-new-platform-data.patch -+++ /dev/null -@@ -1,734 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:07 +0100 --Subject: [PATCH] brcmfmac: switch to new platform data -- --Platform data is only available for sdio. With this patch a new --platform data structure is being used which allows for platform --data for any device and configurable per device. This patch only --switches to the new structure and adds support for SDIO devices. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --@@ -103,7 +103,7 @@ static void brcmf_sdiod_dummy_irqhandler -- -- int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev) -- { --- struct brcmfmac_sdio_platform_data *pdata; --+ struct brcmfmac_sdio_pd *pdata; -- int ret = 0; -- u8 data; -- u32 addr, gpiocontrol; --@@ -173,7 +173,7 @@ int brcmf_sdiod_intr_register(struct brc -- -- int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev) -- { --- struct brcmfmac_sdio_platform_data *pdata; --+ struct brcmfmac_sdio_pd *pdata; -- -- brcmf_dbg(SDIO, "Entering\n"); -- --@@ -1164,17 +1164,6 @@ static int brcmf_ops_sdio_probe(struct s -- dev_set_drvdata(&func->dev, bus_if); -- dev_set_drvdata(&sdiodev->func[1]->dev, bus_if); -- sdiodev->dev = &sdiodev->func[1]->dev; --- sdiodev->pdata = brcmf_get_module_param(sdiodev->dev); --- ---#ifdef CONFIG_PM_SLEEP --- /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ --- * is true or when platform data OOB irq is true). --- */ --- if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) && --- ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) || --- (sdiodev->pdata && sdiodev->pdata->oob_irq_supported))) --- bus_if->wowl_supported = true; ---#endif -- -- brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN); -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -6459,8 +6459,8 @@ int brcmf_cfg80211_wait_vif_event(struct -- static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], -- struct brcmf_fil_country_le *ccreq) -- { --- struct cc_translate *country_codes; --- struct cc_entry *cc; --+ struct brcmfmac_pd_cc *country_codes; --+ struct brcmfmac_pd_cc_entry *cc; -- s32 found_index; -- int i; -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --@@ -80,7 +80,7 @@ module_param_named(ignore_probe_fail, br -- MODULE_PARM_DESC(ignore_probe_fail, "always succeed probe for debugging"); -- #endif -- ---static struct brcmfmac_sdio_platform_data *brcmfmac_pdata; --+static struct brcmfmac_platform_data *brcmfmac_pdata; -- struct brcmf_mp_global_t brcmf_mp_global; -- -- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) --@@ -229,15 +229,46 @@ void __brcmf_dbg(u32 level, const char * -- -- static void brcmf_mp_attach(void) -- { --+ /* If module param firmware path is set then this will always be used, --+ * if not set then if available use the platform data version. To make --+ * sure it gets initialized at all, always copy the module param version --+ */ -- strlcpy(brcmf_mp_global.firmware_path, brcmf_firmware_path, -- BRCMF_FW_ALTPATH_LEN); --+ if ((brcmfmac_pdata) && (brcmfmac_pdata->fw_alternative_path) && --+ (brcmf_mp_global.firmware_path[0] == '\0')) { --+ strlcpy(brcmf_mp_global.firmware_path, --+ brcmfmac_pdata->fw_alternative_path, --+ BRCMF_FW_ALTPATH_LEN); --+ } -- } -- ---struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev) ---{ --- if (!brcmfmac_pdata) --- brcmf_of_probe(dev, &brcmfmac_pdata); --- return brcmfmac_pdata; --+struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev, --+ enum brcmf_bus_type bus_type, --+ u32 chip, u32 chiprev) --+{ --+ struct brcmfmac_sdio_pd *pdata; --+ struct brcmfmac_pd_device *device_pd; --+ int i; --+ --+ if (brcmfmac_pdata) { --+ for (i = 0; i < brcmfmac_pdata->device_count; i++) { --+ device_pd = &brcmfmac_pdata->devices[i]; --+ if ((device_pd->bus_type == bus_type) && --+ (device_pd->id == chip) && --+ ((device_pd->rev == chiprev) || --+ (device_pd->rev == -1))) { --+ brcmf_dbg(INFO, "Platform data for device found\n"); --+ if (device_pd->bus_type == BRCMF_BUSTYPE_SDIO) --+ return &device_pd->bus.sdio; --+ break; --+ } --+ } --+ } --+ pdata = NULL; --+ brcmf_of_probe(dev, &pdata); --+ --+ return pdata; -- } -- -- int brcmf_mp_device_attach(struct brcmf_pub *drvr) --@@ -287,7 +318,7 @@ static int brcmf_common_pd_remove(struct -- static struct platform_driver brcmf_pd = { -- .remove = brcmf_common_pd_remove, -- .driver = { --- .name = BRCMFMAC_SDIO_PDATA_NAME, --+ .name = BRCMFMAC_PDATA_NAME, -- } -- }; -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --@@ -16,7 +16,7 @@ -- #define BRCMFMAC_COMMON_H -- -- #include ---#include --+#include -- #include "fwil_types.h" -- -- extern const u8 ALLFFMAC[ETH_ALEN]; --@@ -43,33 +43,6 @@ struct brcmf_mp_global_t { -- extern struct brcmf_mp_global_t brcmf_mp_global; -- -- /** --- * struct cc_entry - Struct for translating user space country code (iso3166) to --- * firmware country code and revision. --- * --- * @iso3166: iso3166 alpha 2 country code string. --- * @cc: firmware country code string. --- * @rev: firmware country code revision. --- */ ---struct cc_entry { --- char iso3166[BRCMF_COUNTRY_BUF_SZ]; --- char cc[BRCMF_COUNTRY_BUF_SZ]; --- s32 rev; ---}; --- ---/** --- * struct cc_translate - Struct for translating country codes as set by user --- * space to a country code and rev which can be used by --- * firmware. --- * --- * @table_size: number of entries in table (> 0) --- * @table: dynamic array of 1 or more elements with translation information. --- */ ---struct cc_translate { --- int table_size; --- struct cc_entry table[0]; ---}; --- ---/** -- * struct brcmf_mp_device - Device module paramaters. -- * -- * @sdiod_txglomsz: SDIO txglom size. --@@ -88,10 +61,12 @@ struct brcmf_mp_device { -- int fcmode; -- bool roamoff; -- bool ignore_probe_fail; --- struct cc_translate *country_codes; --+ struct brcmfmac_pd_cc *country_codes; -- }; -- ---struct brcmfmac_sdio_platform_data *brcmf_get_module_param(struct device *dev); --+struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev, --+ enum brcmf_bus_type bus_type, --+ u32 chip, u32 chiprev); -- int brcmf_mp_device_attach(struct brcmf_pub *drvr); -- void brcmf_mp_device_detach(struct brcmf_pub *drvr); -- #ifdef DEBUG ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c --@@ -23,8 +23,7 @@ -- #include "common.h" -- #include "of.h" -- ---void ---brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio) --+void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio) -- { -- struct device_node *np = dev->of_node; -- int irq; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h --@@ -15,10 +15,9 @@ -- */ -- #ifdef CONFIG_OF -- void ---brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_platform_data **sdio); --+brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio); -- #else ---static void brcmf_of_probe(struct device *dev, --- struct brcmfmac_sdio_platform_data **sdio) --+static void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio) -- { -- } -- #endif /* CONFIG_OF */ ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -33,8 +33,6 @@ -- #include -- #include -- #include ---#include ---#include -- #include -- #include -- #include --@@ -44,6 +42,8 @@ -- #include "sdio.h" -- #include "chip.h" -- #include "firmware.h" --+#include "core.h" --+#include "common.h" -- -- #define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500) -- #define CTL_DONE_TIMEOUT msecs_to_jiffies(2500) --@@ -3775,26 +3775,28 @@ static const struct brcmf_buscore_ops br -- static bool -- brcmf_sdio_probe_attach(struct brcmf_sdio *bus) -- { --+ struct brcmf_sdio_dev *sdiodev; -- u8 clkctl = 0; -- int err = 0; -- int reg_addr; -- u32 reg_val; -- u32 drivestrength; -- --- sdio_claim_host(bus->sdiodev->func[1]); --+ sdiodev = bus->sdiodev; --+ sdio_claim_host(sdiodev->func[1]); -- -- pr_debug("F1 signature read @0x18000000=0x%4x\n", --- brcmf_sdiod_regrl(bus->sdiodev, SI_ENUM_BASE, NULL)); --+ brcmf_sdiod_regrl(sdiodev, SI_ENUM_BASE, NULL)); -- -- /* -- * Force PLL off until brcmf_chip_attach() -- * programs PLL control regs -- */ -- --- brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, --+ brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, -- BRCMF_INIT_CLKCTL1, &err); -- if (!err) --- clkctl = brcmf_sdiod_regrb(bus->sdiodev, --+ clkctl = brcmf_sdiod_regrb(sdiodev, -- SBSDIO_FUNC1_CHIPCLKCSR, &err); -- -- if (err || ((clkctl & ~SBSDIO_AVBITS) != BRCMF_INIT_CLKCTL1)) { --@@ -3803,50 +3805,77 @@ brcmf_sdio_probe_attach(struct brcmf_sdi -- goto fail; -- } -- --- bus->ci = brcmf_chip_attach(bus->sdiodev, &brcmf_sdio_buscore_ops); --+ bus->ci = brcmf_chip_attach(sdiodev, &brcmf_sdio_buscore_ops); -- if (IS_ERR(bus->ci)) { -- brcmf_err("brcmf_chip_attach failed!\n"); -- bus->ci = NULL; -- goto fail; -- } --+ sdiodev->pdata = brcmf_get_module_param(sdiodev->dev, --+ BRCMF_BUSTYPE_SDIO, --+ bus->ci->chip, --+ bus->ci->chiprev); --+ /* platform specific configuration: --+ * alignments must be at least 4 bytes for ADMA --+ */ --+ bus->head_align = ALIGNMENT; --+ bus->sgentry_align = ALIGNMENT; --+ if (sdiodev->pdata) { --+ if (sdiodev->pdata->sd_head_align > ALIGNMENT) --+ bus->head_align = sdiodev->pdata->sd_head_align; --+ if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT) --+ bus->sgentry_align = sdiodev->pdata->sd_sgentry_align; --+ } --+ /* allocate scatter-gather table. sg support --+ * will be disabled upon allocation failure. --+ */ --+ brcmf_sdiod_sgtable_alloc(sdiodev); --+ --+#ifdef CONFIG_PM_SLEEP --+ /* wowl can be supported when KEEP_POWER is true and (WAKE_SDIO_IRQ --+ * is true or when platform data OOB irq is true). --+ */ --+ if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) && --+ ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) || --+ (sdiodev->pdata && sdiodev->pdata->oob_irq_supported))) --+ sdiodev->bus_if->wowl_supported = true; --+#endif -- -- if (brcmf_sdio_kso_init(bus)) { -- brcmf_err("error enabling KSO\n"); -- goto fail; -- } -- --- if ((bus->sdiodev->pdata) && (bus->sdiodev->pdata->drive_strength)) --- drivestrength = bus->sdiodev->pdata->drive_strength; --+ if ((sdiodev->pdata) && (sdiodev->pdata->drive_strength)) --+ drivestrength = sdiodev->pdata->drive_strength; -- else -- drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH; --- brcmf_sdio_drivestrengthinit(bus->sdiodev, bus->ci, drivestrength); --+ brcmf_sdio_drivestrengthinit(sdiodev, bus->ci, drivestrength); -- -- /* Set card control so an SDIO card reset does a WLAN backplane reset */ --- reg_val = brcmf_sdiod_regrb(bus->sdiodev, --- SDIO_CCCR_BRCM_CARDCTRL, &err); --+ reg_val = brcmf_sdiod_regrb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, &err); -- if (err) -- goto fail; -- -- reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET; -- --- brcmf_sdiod_regwb(bus->sdiodev, --- SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err); --+ brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err); -- if (err) -- goto fail; -- -- /* set PMUControl so a backplane reset does PMU state reload */ -- reg_addr = CORE_CC_REG(brcmf_chip_get_pmu(bus->ci)->base, pmucontrol); --- reg_val = brcmf_sdiod_regrl(bus->sdiodev, reg_addr, &err); --+ reg_val = brcmf_sdiod_regrl(sdiodev, reg_addr, &err); -- if (err) -- goto fail; -- -- reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT); -- --- brcmf_sdiod_regwl(bus->sdiodev, reg_addr, reg_val, &err); --+ brcmf_sdiod_regwl(sdiodev, reg_addr, reg_val, &err); -- if (err) -- goto fail; -- --- sdio_release_host(bus->sdiodev->func[1]); --+ sdio_release_host(sdiodev->func[1]); -- -- brcmu_pktq_init(&bus->txq, (PRIOMASK + 1), TXQLEN); -- --@@ -3867,7 +3896,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi -- return true; -- -- fail: --- sdio_release_host(bus->sdiodev->func[1]); --+ sdio_release_host(sdiodev->func[1]); -- return false; -- } -- --@@ -4045,18 +4074,6 @@ struct brcmf_sdio *brcmf_sdio_probe(stru -- bus->txminmax = BRCMF_TXMINMAX; -- bus->tx_seq = SDPCM_SEQ_WRAP - 1; -- --- /* platform specific configuration: --- * alignments must be at least 4 bytes for ADMA --- */ --- bus->head_align = ALIGNMENT; --- bus->sgentry_align = ALIGNMENT; --- if (sdiodev->pdata) { --- if (sdiodev->pdata->sd_head_align > ALIGNMENT) --- bus->head_align = sdiodev->pdata->sd_head_align; --- if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT) --- bus->sgentry_align = sdiodev->pdata->sd_sgentry_align; --- } --- -- /* single-threaded workqueue */ -- wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM, -- dev_name(&sdiodev->func[1]->dev)); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h --@@ -184,7 +184,7 @@ struct brcmf_sdio_dev { -- struct brcmf_sdio *bus; -- struct device *dev; -- struct brcmf_bus *bus_if; --- struct brcmfmac_sdio_platform_data *pdata; --+ struct brcmfmac_sdio_pd *pdata; -- bool oob_irq_requested; -- bool irq_en; /* irq enable flags */ -- spinlock_t irq_en_lock; ----- a/include/linux/platform_data/brcmfmac-sdio.h --+++ /dev/null --@@ -1,135 +0,0 @@ ---/* --- * Copyright (c) 2013 Broadcom Corporation --- * --- * Permission to use, copy, modify, and/or distribute this software for any --- * purpose with or without fee is hereby granted, provided that the above --- * copyright notice and this permission notice appear in all copies. --- * --- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES --- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF --- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY --- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION --- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN --- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --- */ --- ---#ifndef _LINUX_BRCMFMAC_PLATFORM_H ---#define _LINUX_BRCMFMAC_PLATFORM_H --- ---/* --- * Platform specific driver functions and data. Through the platform specific --- * device data functions can be provided to help the brcmfmac driver to --- * operate with the device in combination with the used platform. --- * --- * Use the platform data in the following (similar) way: --- * --- * ---#include --- --- ---static void brcmfmac_power_on(void) ---{ ---} --- ---static void brcmfmac_power_off(void) ---{ ---} --- ---static void brcmfmac_reset(void) ---{ ---} --- ---static struct brcmfmac_sdio_platform_data brcmfmac_sdio_pdata = { --- .power_on = brcmfmac_power_on, --- .power_off = brcmfmac_power_off, --- .reset = brcmfmac_reset ---}; --- ---static struct platform_device brcmfmac_device = { --- .name = BRCMFMAC_SDIO_PDATA_NAME, --- .id = PLATFORM_DEVID_NONE, --- .dev.platform_data = &brcmfmac_sdio_pdata ---}; --- ---void __init brcmfmac_init_pdata(void) ---{ --- brcmfmac_sdio_pdata.oob_irq_supported = true; --- brcmfmac_sdio_pdata.oob_irq_nr = gpio_to_irq(GPIO_BRCMF_SDIO_OOB); --- brcmfmac_sdio_pdata.oob_irq_flags = IORESOURCE_IRQ | --- IORESOURCE_IRQ_HIGHLEVEL; --- platform_device_register(&brcmfmac_device); ---} --- * --- * --- * Note: the brcmfmac can be loaded as module or be statically built-in into --- * the kernel. If built-in then do note that it uses module_init (and --- * module_exit) routines which equal device_initcall. So if you intend to --- * create a module with the platform specific data for the brcmfmac and have --- * it built-in to the kernel then use a higher initcall then device_initcall --- * (see init.h). If this is not done then brcmfmac will load without problems --- * but will not pickup the platform data. --- * --- * When the driver does not "detect" platform driver data then it will continue --- * without reporting anything and just assume there is no data needed. Which is --- * probably true for most platforms. --- * --- * Explanation of the platform_data fields: --- * --- * drive_strength: is the preferred drive_strength to be used for the SDIO --- * pins. If 0 then a default value will be used. This is the target drive --- * strength, the exact drive strength which will be used depends on the --- * capabilities of the device. --- * --- * oob_irq_supported: does the board have support for OOB interrupts. SDIO --- * in-band interrupts are relatively slow and for having less overhead on --- * interrupt processing an out of band interrupt can be used. If the HW --- * supports this then enable this by setting this field to true and configure --- * the oob related fields. --- * --- * oob_irq_nr, oob_irq_flags: the OOB interrupt information. The values are --- * used for registering the irq using request_irq function. --- * --- * broken_sg_support: flag for broken sg list support of SDIO host controller. --- * Set this to true if the SDIO host controller has higher align requirement --- * than 32 bytes for each scatterlist item. --- * --- * sd_head_align: alignment requirement for start of data buffer --- * --- * sd_sgentry_align: length alignment requirement for each sg entry --- * --- * power_on: This function is called by the brcmfmac when the module gets --- * loaded. This can be particularly useful for low power devices. The platform --- * spcific routine may for example decide to power up the complete device. --- * If there is no use-case for this function then provide NULL. --- * --- * power_off: This function is called by the brcmfmac when the module gets --- * unloaded. At this point the device can be powered down or otherwise be reset. --- * So if an actual power_off is not supported but reset is then reset the device --- * when this function gets called. This can be particularly useful for low power --- * devices. If there is no use-case for this function (either power-down or --- * reset) then provide NULL. --- * --- * reset: This function can get called if the device communication broke down. --- * This functionality is particularly useful in case of SDIO type devices. It is --- * possible to reset a dongle via sdio data interface, but it requires that --- * this is fully functional. This function is chip/module specific and this --- * function should return only after the complete reset has completed. --- */ --- ---#define BRCMFMAC_SDIO_PDATA_NAME "brcmfmac_sdio" --- ---struct brcmfmac_sdio_platform_data { --- unsigned int drive_strength; --- bool oob_irq_supported; --- unsigned int oob_irq_nr; --- unsigned long oob_irq_flags; --- bool broken_sg_support; --- unsigned short sd_head_align; --- unsigned short sd_sgentry_align; --- void (*power_on)(void); --- void (*power_off)(void); --- void (*reset)(void); ---}; --- ---#endif /* _LINUX_BRCMFMAC_PLATFORM_H */ ----- /dev/null --+++ b/include/linux/platform_data/brcmfmac.h --@@ -0,0 +1,185 @@ --+/* --+ * Copyright (c) 201 Broadcom Corporation --+ * --+ * Permission to use, copy, modify, and/or distribute this software for any --+ * purpose with or without fee is hereby granted, provided that the above --+ * copyright notice and this permission notice appear in all copies. --+ * --+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES --+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF --+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY --+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES --+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION --+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN --+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. --+ */ --+ --+#ifndef _LINUX_BRCMFMAC_PLATFORM_H --+#define _LINUX_BRCMFMAC_PLATFORM_H --+ --+ --+#define BRCMFMAC_PDATA_NAME "brcmfmac" --+ --+#define BRCMFMAC_COUNTRY_BUF_SZ 4 --+ --+ --+/* --+ * Platform specific driver functions and data. Through the platform specific --+ * device data functions and data can be provided to help the brcmfmac driver to --+ * operate with the device in combination with the used platform. --+ */ --+ --+ --+/** --+ * Note: the brcmfmac can be loaded as module or be statically built-in into --+ * the kernel. If built-in then do note that it uses module_init (and --+ * module_exit) routines which equal device_initcall. So if you intend to --+ * create a module with the platform specific data for the brcmfmac and have --+ * it built-in to the kernel then use a higher initcall then device_initcall --+ * (see init.h). If this is not done then brcmfmac will load without problems --+ * but will not pickup the platform data. --+ * --+ * When the driver does not "detect" platform driver data then it will continue --+ * without reporting anything and just assume there is no data needed. Which is --+ * probably true for most platforms. --+ */ --+ --+/** --+ * enum brcmf_bus_type - Bus type identifier. Currently SDIO, USB and PCIE are --+ * supported. --+ */ --+enum brcmf_bus_type { --+ BRCMF_BUSTYPE_SDIO, --+ BRCMF_BUSTYPE_USB, --+ BRCMF_BUSTYPE_PCIE --+}; --+ --+ --+/** --+ * struct brcmfmac_sdio_pd - SDIO Device specific platform data. --+ * --+ * @txglomsz: SDIO txglom size. Use 0 if default of driver is to be --+ * used. --+ * @drive_strength: is the preferred drive_strength to be used for the SDIO --+ * pins. If 0 then a default value will be used. This is --+ * the target drive strength, the exact drive strength --+ * which will be used depends on the capabilities of the --+ * device. --+ * @oob_irq_supported: does the board have support for OOB interrupts. SDIO --+ * in-band interrupts are relatively slow and for having --+ * less overhead on interrupt processing an out of band --+ * interrupt can be used. If the HW supports this then --+ * enable this by setting this field to true and configure --+ * the oob related fields. --+ * @oob_irq_nr, --+ * @oob_irq_flags: the OOB interrupt information. The values are used for --+ * registering the irq using request_irq function. --+ * @broken_sg_support: flag for broken sg list support of SDIO host controller. --+ * Set this to true if the SDIO host controller has higher --+ * align requirement than 32 bytes for each scatterlist --+ * item. --+ * @sd_head_align: alignment requirement for start of data buffer. --+ * @sd_sgentry_align: length alignment requirement for each sg entry. --+ * @reset: This function can get called if the device communication --+ * broke down. This functionality is particularly useful in --+ * case of SDIO type devices. It is possible to reset a --+ * dongle via sdio data interface, but it requires that --+ * this is fully functional. This function is chip/module --+ * specific and this function should return only after the --+ * complete reset has completed. --+ */ --+struct brcmfmac_sdio_pd { --+ int txglomsz; --+ unsigned int drive_strength; --+ bool oob_irq_supported; --+ unsigned int oob_irq_nr; --+ unsigned long oob_irq_flags; --+ bool broken_sg_support; --+ unsigned short sd_head_align; --+ unsigned short sd_sgentry_align; --+ void (*reset)(void); --+}; --+ --+/** --+ * struct brcmfmac_pd_cc_entry - Struct for translating user space country code --+ * (iso3166) to firmware country code and --+ * revision. --+ * --+ * @iso3166: iso3166 alpha 2 country code string. --+ * @cc: firmware country code string. --+ * @rev: firmware country code revision. --+ */ --+struct brcmfmac_pd_cc_entry { --+ char iso3166[BRCMFMAC_COUNTRY_BUF_SZ]; --+ char cc[BRCMFMAC_COUNTRY_BUF_SZ]; --+ s32 rev; --+}; --+ --+/** --+ * struct brcmfmac_pd_cc - Struct for translating country codes as set by user --+ * space to a country code and rev which can be used by --+ * firmware. --+ * --+ * @table_size: number of entries in table (> 0) --+ * @table: array of 1 or more elements with translation information. --+ */ --+struct brcmfmac_pd_cc { --+ int table_size; --+ struct brcmfmac_pd_cc_entry table[0]; --+}; --+ --+/** --+ * struct brcmfmac_pd_device - Device specific platform data. (id/rev/bus_type) --+ * is the unique identifier of the device. --+ * --+ * @id: ID of the device for which this data is. In case of SDIO --+ * or PCIE this is the chipid as identified by chip.c In --+ * case of USB this is the chipid as identified by the --+ * device query. --+ * @rev: chip revision, see id. --+ * @bus_type: The type of bus. Some chipid/rev exist for different bus --+ * types. Each bus type has its own set of settings. --+ * @feature_disable: Bitmask of features to disable (override), See feature.c --+ * in brcmfmac for details. --+ * @country_codes: If available, pointer to struct for translating country --+ * codes. --+ * @bus: Bus specific (union) device settings. Currently only --+ * SDIO. --+ */ --+struct brcmfmac_pd_device { --+ unsigned int id; --+ unsigned int rev; --+ enum brcmf_bus_type bus_type; --+ unsigned int feature_disable; --+ struct brcmfmac_pd_cc *country_codes; --+ union { --+ struct brcmfmac_sdio_pd sdio; --+ } bus; --+}; --+ --+/** --+ * struct brcmfmac_platform_data - BRCMFMAC specific platform data. --+ * --+ * @power_on: This function is called by the brcmfmac driver when the module --+ * gets loaded. This can be particularly useful for low power --+ * devices. The platform spcific routine may for example decide to --+ * power up the complete device. If there is no use-case for this --+ * function then provide NULL. --+ * @power_off: This function is called by the brcmfmac when the module gets --+ * unloaded. At this point the devices can be powered down or --+ * otherwise be reset. So if an actual power_off is not supported --+ * but reset is supported by the devices then reset the devices --+ * when this function gets called. This can be particularly useful --+ * for low power devices. If there is no use-case for this --+ * function then provide NULL. --+ */ --+struct brcmfmac_platform_data { --+ void (*power_on)(void); --+ void (*power_off)(void); --+ char *fw_alternative_path; --+ int device_count; --+ struct brcmfmac_pd_device devices[0]; --+}; --+ --+ --+#endif /* _LINUX_BRCMFMAC_PLATFORM_H */ -diff --git a/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch b/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch -deleted file mode 100644 -index 34341d7f1866bde09e839f128d14a2b40e54453f..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0018-brcmfmac-merge-platform-data-and-module-paramaters.patch -+++ /dev/null -@@ -1,607 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:08 +0100 --Subject: [PATCH] brcmfmac: merge platform data and module paramaters -- --Merge module parameters and platform data in one struct. This is the --last step to move to the new platform data per device. Now parameters --of platform data will be merged with module parameters per device. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --@@ -109,8 +109,8 @@ int brcmf_sdiod_intr_register(struct brc -- u32 addr, gpiocontrol; -- unsigned long flags; -- --- pdata = sdiodev->pdata; --- if ((pdata) && (pdata->oob_irq_supported)) { --+ pdata = &sdiodev->settings->bus.sdio; --+ if (pdata->oob_irq_supported) { -- brcmf_dbg(SDIO, "Enter, register OOB IRQ %d\n", -- pdata->oob_irq_nr); -- ret = request_irq(pdata->oob_irq_nr, brcmf_sdiod_oob_irqhandler, --@@ -177,8 +177,8 @@ int brcmf_sdiod_intr_unregister(struct b -- -- brcmf_dbg(SDIO, "Entering\n"); -- --- pdata = sdiodev->pdata; --- if ((pdata) && (pdata->oob_irq_supported)) { --+ pdata = &sdiodev->settings->bus.sdio; --+ if (pdata->oob_irq_supported) { -- sdio_claim_host(sdiodev->func[1]); -- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL); -- brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL); --@@ -522,7 +522,7 @@ static int brcmf_sdiod_sglist_rw(struct -- target_list = pktlist; -- /* for host with broken sg support, prepare a page aligned list */ -- __skb_queue_head_init(&local_list); --- if (sdiodev->pdata && sdiodev->pdata->broken_sg_support && !write) { --+ if (!write && sdiodev->settings->bus.sdio.broken_sg_support) { -- req_sz = 0; -- skb_queue_walk(pktlist, pkt_next) -- req_sz += pkt_next->len; --@@ -629,7 +629,7 @@ static int brcmf_sdiod_sglist_rw(struct -- } -- } -- --- if (sdiodev->pdata && sdiodev->pdata->broken_sg_support && !write) { --+ if (!write && sdiodev->settings->bus.sdio.broken_sg_support) { -- local_pkt_next = local_list.next; -- orig_offset = 0; -- skb_queue_walk(pktlist, pkt_next) { --@@ -900,7 +900,7 @@ void brcmf_sdiod_sgtable_alloc(struct br -- return; -- -- nents = max_t(uint, BRCMF_DEFAULT_RXGLOM_SIZE, --- sdiodev->bus_if->drvr->settings->sdiod_txglomsz); --+ sdiodev->settings->bus.sdio.txglomsz); -- nents += (nents >> 4) + 1; -- -- WARN_ON(nents > sdiodev->max_segment_count); --@@ -912,7 +912,7 @@ void brcmf_sdiod_sgtable_alloc(struct br -- sdiodev->sg_support = false; -- } -- --- sdiodev->txglomsz = sdiodev->bus_if->drvr->settings->sdiod_txglomsz; --+ sdiodev->txglomsz = sdiodev->settings->bus.sdio.txglomsz; -- } -- -- #ifdef CONFIG_PM_SLEEP --@@ -1246,8 +1246,8 @@ static int brcmf_ops_sdio_suspend(struct -- -- sdio_flags = MMC_PM_KEEP_POWER; -- if (sdiodev->wowl_enabled) { --- if (sdiodev->pdata->oob_irq_supported) --- enable_irq_wake(sdiodev->pdata->oob_irq_nr); --+ if (sdiodev->settings->bus.sdio.oob_irq_supported) --+ enable_irq_wake(sdiodev->settings->bus.sdio.oob_irq_nr); -- else -- sdio_flags |= MMC_PM_WAKE_SDIO_IRQ; -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h --@@ -43,6 +43,8 @@ enum brcmf_bus_protocol_type { -- BRCMF_PROTO_MSGBUF -- }; -- --+struct brcmf_mp_device; --+ -- struct brcmf_bus_dcmd { -- char *name; -- char *param; --@@ -217,7 +219,7 @@ bool brcmf_c_prec_enq(struct device *dev -- void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp); -- -- /* Indication from bus module regarding presence/insertion of dongle. */ ---int brcmf_attach(struct device *dev); --+int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings); -- /* Indication from bus module regarding removal/absence of dongle */ -- void brcmf_detach(struct device *dev); -- /* Indication from bus module that dongle should be reset */ ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c --@@ -243,14 +243,35 @@ static void brcmf_mp_attach(void) -- } -- } -- ---struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev, --- enum brcmf_bus_type bus_type, --- u32 chip, u32 chiprev) --+struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, --+ enum brcmf_bus_type bus_type, --+ u32 chip, u32 chiprev) -- { --- struct brcmfmac_sdio_pd *pdata; --+ struct brcmf_mp_device *settings; -- struct brcmfmac_pd_device *device_pd; --+ bool found; -- int i; -- --+ brcmf_dbg(INFO, "Enter, bus=%d, chip=%d, rev=%d\n", bus_type, chip, --+ chiprev); --+ settings = kzalloc(sizeof(*settings), GFP_ATOMIC); --+ if (!settings) --+ return NULL; --+ --+ /* start by using the module paramaters */ --+ settings->p2p_enable = !!brcmf_p2p_enable; --+ settings->feature_disable = brcmf_feature_disable; --+ settings->fcmode = brcmf_fcmode; --+ settings->roamoff = !!brcmf_roamoff; --+#ifdef DEBUG --+ settings->ignore_probe_fail = !!brcmf_ignore_probe_fail; --+#endif --+ --+ if (bus_type == BRCMF_BUSTYPE_SDIO) --+ settings->bus.sdio.txglomsz = brcmf_sdiod_txglomsz; --+ --+ /* See if there is any device specific platform data configured */ --+ found = false; -- if (brcmfmac_pdata) { -- for (i = 0; i < brcmfmac_pdata->device_count; i++) { -- device_pd = &brcmfmac_pdata->devices[i]; --@@ -259,38 +280,29 @@ struct brcmfmac_sdio_pd *brcmf_get_modul -- ((device_pd->rev == chiprev) || -- (device_pd->rev == -1))) { -- brcmf_dbg(INFO, "Platform data for device found\n"); --+ settings->country_codes = --+ device_pd->country_codes; -- if (device_pd->bus_type == BRCMF_BUSTYPE_SDIO) --- return &device_pd->bus.sdio; --+ memcpy(&settings->bus.sdio, --+ &device_pd->bus.sdio, --+ sizeof(settings->bus.sdio)); --+ found = true; -- break; -- } -- } -- } --- pdata = NULL; --- brcmf_of_probe(dev, &pdata); --- --- return pdata; ---} --- ---int brcmf_mp_device_attach(struct brcmf_pub *drvr) ---{ --- drvr->settings = kzalloc(sizeof(*drvr->settings), GFP_ATOMIC); --- if (!drvr->settings) --- return -ENOMEM; --- --- drvr->settings->sdiod_txglomsz = brcmf_sdiod_txglomsz; --- drvr->settings->p2p_enable = !!brcmf_p2p_enable; --- drvr->settings->feature_disable = brcmf_feature_disable; --- drvr->settings->fcmode = brcmf_fcmode; --- drvr->settings->roamoff = !!brcmf_roamoff; ---#ifdef DEBUG --- drvr->settings->ignore_probe_fail = !!brcmf_ignore_probe_fail; ---#endif --- return 0; --+ if ((bus_type == BRCMF_BUSTYPE_SDIO) && (!found)) { --+ /* No platform data for this device. In case of SDIO try OF --+ * (Open Firwmare) Device Tree. --+ */ --+ brcmf_of_probe(dev, &settings->bus.sdio); --+ } --+ return settings; -- } -- ---void brcmf_mp_device_detach(struct brcmf_pub *drvr) --+void brcmf_release_module_param(struct brcmf_mp_device *module_param) -- { --- kfree(drvr->settings); --+ kfree(module_param); -- } -- -- static int __init brcmf_common_pd_probe(struct platform_device *pdev) ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h --@@ -45,41 +45,30 @@ extern struct brcmf_mp_global_t brcmf_mp -- /** -- * struct brcmf_mp_device - Device module paramaters. -- * --- * @sdiod_txglomsz: SDIO txglom size. --- * @joinboost_5g_rssi: 5g rssi booost for preferred join selection. -- * @p2p_enable: Legacy P2P0 enable (old wpa_supplicant). -- * @feature_disable: Feature_disable bitmask. -- * @fcmode: FWS flow control. -- * @roamoff: Firmware roaming off? --+ * @ignore_probe_fail: Ignore probe failure. -- * @country_codes: If available, pointer to struct for translating country codes --+ * @bus: Bus specific platform data. Only SDIO at the mmoment. -- */ -- struct brcmf_mp_device { --- int sdiod_txglomsz; --- int joinboost_5g_rssi; --- bool p2p_enable; --- int feature_disable; --- int fcmode; --- bool roamoff; --- bool ignore_probe_fail; --+ bool p2p_enable; --+ unsigned int feature_disable; --+ int fcmode; --+ bool roamoff; --+ bool ignore_probe_fail; -- struct brcmfmac_pd_cc *country_codes; --+ union { --+ struct brcmfmac_sdio_pd sdio; --+ } bus; -- }; -- ---struct brcmfmac_sdio_pd *brcmf_get_module_param(struct device *dev, --- enum brcmf_bus_type bus_type, --- u32 chip, u32 chiprev); ---int brcmf_mp_device_attach(struct brcmf_pub *drvr); ---void brcmf_mp_device_detach(struct brcmf_pub *drvr); ---#ifdef DEBUG ---static inline bool brcmf_ignoring_probe_fail(struct brcmf_pub *drvr) ---{ --- return drvr->settings->ignore_probe_fail; ---} ---#else ---static inline bool brcmf_ignoring_probe_fail(struct brcmf_pub *drvr) ---{ --- return false; ---} ---#endif --+struct brcmf_mp_device *brcmf_get_module_param(struct device *dev, --+ enum brcmf_bus_type bus_type, --+ u32 chip, u32 chiprev); --+void brcmf_release_module_param(struct brcmf_mp_device *module_param); -- -- /* Sets dongle media info (drv_version, mac address). */ -- int brcmf_c_preinit_dcmds(struct brcmf_if *ifp); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -1104,7 +1104,7 @@ static int brcmf_inet6addr_changed(struc -- } -- #endif -- ---int brcmf_attach(struct device *dev) --+int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings) -- { -- struct brcmf_pub *drvr = NULL; -- int ret = 0; --@@ -1126,10 +1126,7 @@ int brcmf_attach(struct device *dev) -- drvr->hdrlen = 0; -- drvr->bus_if = dev_get_drvdata(dev); -- drvr->bus_if->drvr = drvr; --- --- /* Initialize device specific settings */ --- if (brcmf_mp_device_attach(drvr)) --- goto fail; --+ drvr->settings = settings; -- -- /* attach debug facilities */ -- brcmf_debug_attach(drvr); --@@ -1274,7 +1271,7 @@ fail: -- brcmf_net_detach(p2p_ifp->ndev); -- drvr->iflist[0] = NULL; -- drvr->iflist[1] = NULL; --- if (brcmf_ignoring_probe_fail(drvr)) --+ if (drvr->settings->ignore_probe_fail) -- ret = 0; -- -- return ret; --@@ -1350,8 +1347,6 @@ void brcmf_detach(struct device *dev) -- -- brcmf_proto_detach(drvr); -- --- brcmf_mp_device_detach(drvr); --- -- brcmf_debug_detach(drvr); -- bus_if->drvr = NULL; -- kfree(drvr); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c --@@ -23,7 +23,7 @@ -- #include "common.h" -- #include "of.h" -- ---void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio) --+void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio) -- { -- struct device_node *np = dev->of_node; -- int irq; --@@ -33,12 +33,8 @@ void brcmf_of_probe(struct device *dev, -- if (!np || !of_device_is_compatible(np, "brcm,bcm4329-fmac")) -- return; -- --- *sdio = devm_kzalloc(dev, sizeof(*sdio), GFP_KERNEL); --- if (!(*sdio)) --- return; --- -- if (of_property_read_u32(np, "brcm,drive-strength", &val) == 0) --- (*sdio)->drive_strength = val; --+ sdio->drive_strength = val; -- -- /* make sure there are interrupts defined in the node */ -- if (!of_find_property(np, "interrupts", NULL)) --@@ -51,7 +47,7 @@ void brcmf_of_probe(struct device *dev, -- } -- irqf = irqd_get_trigger_type(irq_get_irq_data(irq)); -- --- (*sdio)->oob_irq_supported = true; --- (*sdio)->oob_irq_nr = irq; --- (*sdio)->oob_irq_flags = irqf; --+ sdio->oob_irq_supported = true; --+ sdio->oob_irq_nr = irq; --+ sdio->oob_irq_flags = irqf; -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.h --@@ -14,10 +14,9 @@ -- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- */ -- #ifdef CONFIG_OF ---void ---brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio); --+void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio); -- #else ---static void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd **sdio) --+static void brcmf_of_probe(struct device *dev, struct brcmfmac_sdio_pd *sdio) -- { -- } -- #endif /* CONFIG_OF */ ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --@@ -37,6 +37,8 @@ -- #include "pcie.h" -- #include "firmware.h" -- #include "chip.h" --+#include "core.h" --+#include "common.h" -- -- -- enum brcmf_pcie_state { --@@ -266,6 +268,7 @@ struct brcmf_pciedev_info { -- u16 (*read_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset); -- void (*write_ptr)(struct brcmf_pciedev_info *devinfo, u32 mem_offset, -- u16 value); --+ struct brcmf_mp_device *settings; -- }; -- -- struct brcmf_pcie_ringbuf { --@@ -1525,16 +1528,16 @@ static void brcmf_pcie_release_resource( -- } -- -- ---static int brcmf_pcie_attach_bus(struct device *dev) --+static int brcmf_pcie_attach_bus(struct brcmf_pciedev_info *devinfo) -- { -- int ret; -- -- /* Attach to the common driver interface */ --- ret = brcmf_attach(dev); --+ ret = brcmf_attach(&devinfo->pdev->dev, devinfo->settings); -- if (ret) { -- brcmf_err("brcmf_attach failed\n"); -- } else { --- ret = brcmf_bus_start(dev); --+ ret = brcmf_bus_start(&devinfo->pdev->dev); -- if (ret) -- brcmf_err("dongle is not responding\n"); -- } --@@ -1672,7 +1675,7 @@ static void brcmf_pcie_setup(struct devi -- init_waitqueue_head(&devinfo->mbdata_resp_wait); -- -- brcmf_pcie_intr_enable(devinfo); --- if (brcmf_pcie_attach_bus(bus->dev) == 0) --+ if (brcmf_pcie_attach_bus(devinfo) == 0) -- return; -- -- brcmf_pcie_bus_console_read(devinfo); --@@ -1716,6 +1719,15 @@ brcmf_pcie_probe(struct pci_dev *pdev, c -- goto fail; -- } -- --+ devinfo->settings = brcmf_get_module_param(&devinfo->pdev->dev, --+ BRCMF_BUSTYPE_PCIE, --+ devinfo->ci->chip, --+ devinfo->ci->chiprev); --+ if (!devinfo->settings) { --+ ret = -ENOMEM; --+ goto fail; --+ } --+ -- bus = kzalloc(sizeof(*bus), GFP_KERNEL); -- if (!bus) { -- ret = -ENOMEM; --@@ -1760,6 +1772,8 @@ fail: -- brcmf_pcie_release_resource(devinfo); -- if (devinfo->ci) -- brcmf_chip_detach(devinfo->ci); --+ if (devinfo->settings) --+ brcmf_release_module_param(devinfo->settings); -- kfree(pcie_bus_dev); -- kfree(devinfo); -- return ret; --@@ -1799,6 +1813,8 @@ brcmf_pcie_remove(struct pci_dev *pdev) -- -- if (devinfo->ci) -- brcmf_chip_detach(devinfo->ci); --+ if (devinfo->settings) --+ brcmf_release_module_param(devinfo->settings); -- -- kfree(devinfo); -- dev_set_drvdata(&pdev->dev, NULL); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -2442,15 +2442,17 @@ static void brcmf_sdio_bus_stop(struct d -- -- static inline void brcmf_sdio_clrintr(struct brcmf_sdio *bus) -- { --+ struct brcmf_sdio_dev *sdiodev; -- unsigned long flags; -- --- if (bus->sdiodev->oob_irq_requested) { --- spin_lock_irqsave(&bus->sdiodev->irq_en_lock, flags); --- if (!bus->sdiodev->irq_en && !atomic_read(&bus->ipend)) { --- enable_irq(bus->sdiodev->pdata->oob_irq_nr); --- bus->sdiodev->irq_en = true; --+ sdiodev = bus->sdiodev; --+ if (sdiodev->oob_irq_requested) { --+ spin_lock_irqsave(&sdiodev->irq_en_lock, flags); --+ if (!sdiodev->irq_en && !atomic_read(&bus->ipend)) { --+ enable_irq(sdiodev->settings->bus.sdio.oob_irq_nr); --+ sdiodev->irq_en = true; -- } --- spin_unlock_irqrestore(&bus->sdiodev->irq_en_lock, flags); --+ spin_unlock_irqrestore(&sdiodev->irq_en_lock, flags); -- } -- } -- --@@ -3394,9 +3396,7 @@ static int brcmf_sdio_bus_preinit(struct -- sizeof(u32)); -- } else { -- /* otherwise, set txglomalign */ --- value = 4; --- if (sdiodev->pdata) --- value = sdiodev->pdata->sd_sgentry_align; --+ value = sdiodev->settings->bus.sdio.sd_sgentry_align; -- /* SDIO ADMA requires at least 32 bit alignment */ -- value = max_t(u32, value, 4); -- err = brcmf_iovar_data_set(dev, "bus:txglomalign", &value, --@@ -3811,21 +3811,25 @@ brcmf_sdio_probe_attach(struct brcmf_sdi -- bus->ci = NULL; -- goto fail; -- } --- sdiodev->pdata = brcmf_get_module_param(sdiodev->dev, --+ sdiodev->settings = brcmf_get_module_param(sdiodev->dev, -- BRCMF_BUSTYPE_SDIO, -- bus->ci->chip, -- bus->ci->chiprev); --+ if (!sdiodev->settings) { --+ brcmf_err("Failed to get device parameters\n"); --+ goto fail; --+ } -- /* platform specific configuration: -- * alignments must be at least 4 bytes for ADMA -- */ -- bus->head_align = ALIGNMENT; -- bus->sgentry_align = ALIGNMENT; --- if (sdiodev->pdata) { --- if (sdiodev->pdata->sd_head_align > ALIGNMENT) --- bus->head_align = sdiodev->pdata->sd_head_align; --- if (sdiodev->pdata->sd_sgentry_align > ALIGNMENT) --- bus->sgentry_align = sdiodev->pdata->sd_sgentry_align; --- } --+ if (sdiodev->settings->bus.sdio.sd_head_align > ALIGNMENT) --+ bus->head_align = sdiodev->settings->bus.sdio.sd_head_align; --+ if (sdiodev->settings->bus.sdio.sd_sgentry_align > ALIGNMENT) --+ bus->sgentry_align = --+ sdiodev->settings->bus.sdio.sd_sgentry_align; --+ -- /* allocate scatter-gather table. sg support -- * will be disabled upon allocation failure. -- */ --@@ -3837,7 +3841,7 @@ brcmf_sdio_probe_attach(struct brcmf_sdi -- */ -- if ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_KEEP_POWER) && -- ((sdio_get_host_pm_caps(sdiodev->func[1]) & MMC_PM_WAKE_SDIO_IRQ) || --- (sdiodev->pdata && sdiodev->pdata->oob_irq_supported))) --+ (sdiodev->settings->bus.sdio.oob_irq_supported))) -- sdiodev->bus_if->wowl_supported = true; -- #endif -- --@@ -3846,8 +3850,8 @@ brcmf_sdio_probe_attach(struct brcmf_sdi -- goto fail; -- } -- --- if ((sdiodev->pdata) && (sdiodev->pdata->drive_strength)) --- drivestrength = sdiodev->pdata->drive_strength; --+ if (sdiodev->settings->bus.sdio.drive_strength) --+ drivestrength = sdiodev->settings->bus.sdio.drive_strength; -- else -- drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH; -- brcmf_sdio_drivestrengthinit(sdiodev, bus->ci, drivestrength); --@@ -4124,7 +4128,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru -- bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN; -- -- /* Attach to the common layer, reserve hdr space */ --- ret = brcmf_attach(bus->sdiodev->dev); --+ ret = brcmf_attach(bus->sdiodev->dev, bus->sdiodev->settings); -- if (ret != 0) { -- brcmf_err("brcmf_attach failed\n"); -- goto fail; --@@ -4228,6 +4232,8 @@ void brcmf_sdio_remove(struct brcmf_sdio -- } -- brcmf_chip_detach(bus->ci); -- } --+ if (bus->sdiodev->settings) --+ brcmf_release_module_param(bus->sdiodev->settings); -- -- kfree(bus->rxbuf); -- kfree(bus->hdrbuf); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h --@@ -184,7 +184,7 @@ struct brcmf_sdio_dev { -- struct brcmf_sdio *bus; -- struct device *dev; -- struct brcmf_bus *bus_if; --- struct brcmfmac_sdio_pd *pdata; --+ struct brcmf_mp_device *settings; -- bool oob_irq_requested; -- bool irq_en; /* irq enable flags */ -- spinlock_t irq_en_lock; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --@@ -27,6 +27,8 @@ -- #include "debug.h" -- #include "firmware.h" -- #include "usb.h" --+#include "core.h" --+#include "common.h" -- -- -- #define IOCTL_RESP_TIMEOUT msecs_to_jiffies(2000) --@@ -171,6 +173,7 @@ struct brcmf_usbdev_info { -- struct urb *bulk_urb; /* used for FW download */ -- -- bool wowl_enabled; --+ struct brcmf_mp_device *settings; -- }; -- -- static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo, --@@ -1027,6 +1030,9 @@ static void brcmf_usb_detach(struct brcm -- -- kfree(devinfo->tx_reqs); -- kfree(devinfo->rx_reqs); --+ --+ if (devinfo->settings) --+ brcmf_release_module_param(devinfo->settings); -- } -- -- --@@ -1136,7 +1142,7 @@ static int brcmf_usb_bus_setup(struct br -- int ret; -- -- /* Attach to the common driver interface */ --- ret = brcmf_attach(devinfo->dev); --+ ret = brcmf_attach(devinfo->dev, devinfo->settings); -- if (ret) { -- brcmf_err("brcmf_attach failed\n"); -- return ret; --@@ -1223,6 +1229,14 @@ static int brcmf_usb_probe_cb(struct brc -- bus->wowl_supported = true; -- #endif -- --+ devinfo->settings = brcmf_get_module_param(bus->dev, BRCMF_BUSTYPE_USB, --+ bus_pub->devid, --+ bus_pub->chiprev); --+ if (!devinfo->settings) { --+ ret = -ENOMEM; --+ goto fail; --+ } --+ -- if (!brcmf_usb_dlneeded(devinfo)) { -- ret = brcmf_usb_bus_setup(devinfo); -- if (ret) -diff --git a/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch b/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch -deleted file mode 100644 -index eb680fccfc4695e3c676ed39593e57ffd60d908f..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0019-brcmfmac-integrate-add_keyext-in-add_key.patch -+++ /dev/null -@@ -1,227 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:09 +0100 --Subject: [PATCH] brcmfmac: integrate add_keyext in add_key -- --brcmf_add_keyext is called when a key is configured for a specific --mac address. This function is very similar to the calling function --brcmf_add_key. Integrate this function and also use existing del_key --function in case key is to be cleared. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -2073,84 +2073,34 @@ done: -- } -- -- static s32 ---brcmf_add_keyext(struct wiphy *wiphy, struct net_device *ndev, --- u8 key_idx, const u8 *mac_addr, struct key_params *params) --+brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev, --+ u8 key_idx, bool pairwise, const u8 *mac_addr) -- { -- struct brcmf_if *ifp = netdev_priv(ndev); -- struct brcmf_wsec_key key; -- s32 err = 0; --- u8 keybuf[8]; --+ --+ brcmf_dbg(TRACE, "Enter\n"); --+ if (!check_vif_up(ifp->vif)) --+ return -EIO; --+ --+ if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) { --+ /* we ignore this key index in this case */ --+ return -EINVAL; --+ } -- -- memset(&key, 0, sizeof(key)); --- key.index = (u32) key_idx; --- /* Instead of bcast for ea address for default wep keys, --- driver needs it to be Null */ --- if (!is_multicast_ether_addr(mac_addr)) --- memcpy((char *)&key.ea, (void *)mac_addr, ETH_ALEN); --- key.len = (u32) params->key_len; --- /* check for key index change */ --- if (key.len == 0) { --- /* key delete */ --- err = send_key_to_dongle(ifp, &key); --- if (err) --- brcmf_err("key delete error (%d)\n", err); --- } else { --- if (key.len > sizeof(key.data)) { --- brcmf_err("Invalid key length (%d)\n", key.len); --- return -EINVAL; --- } -- --- brcmf_dbg(CONN, "Setting the key index %d\n", key.index); --- memcpy(key.data, params->key, key.len); --+ key.index = (u32)key_idx; --+ key.flags = BRCMF_PRIMARY_KEY; --+ key.algo = CRYPTO_ALGO_OFF; -- --- if (!brcmf_is_apmode(ifp->vif) && --- (params->cipher == WLAN_CIPHER_SUITE_TKIP)) { --- brcmf_dbg(CONN, "Swapping RX/TX MIC key\n"); --- memcpy(keybuf, &key.data[24], sizeof(keybuf)); --- memcpy(&key.data[24], &key.data[16], sizeof(keybuf)); --- memcpy(&key.data[16], keybuf, sizeof(keybuf)); --- } --+ brcmf_dbg(CONN, "key index (%d)\n", key_idx); -- --- /* if IW_ENCODE_EXT_RX_SEQ_VALID set */ --- if (params->seq && params->seq_len == 6) { --- /* rx iv */ --- u8 *ivptr; --- ivptr = (u8 *) params->seq; --- key.rxiv.hi = (ivptr[5] << 24) | (ivptr[4] << 16) | --- (ivptr[3] << 8) | ivptr[2]; --- key.rxiv.lo = (ivptr[1] << 8) | ivptr[0]; --- key.iv_initialized = true; --- } --+ /* Set the new key/index */ --+ err = send_key_to_dongle(ifp, &key); -- --- switch (params->cipher) { --- case WLAN_CIPHER_SUITE_WEP40: --- key.algo = CRYPTO_ALGO_WEP1; --- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP40\n"); --- break; --- case WLAN_CIPHER_SUITE_WEP104: --- key.algo = CRYPTO_ALGO_WEP128; --- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_WEP104\n"); --- break; --- case WLAN_CIPHER_SUITE_TKIP: --- key.algo = CRYPTO_ALGO_TKIP; --- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_TKIP\n"); --- break; --- case WLAN_CIPHER_SUITE_AES_CMAC: --- key.algo = CRYPTO_ALGO_AES_CCM; --- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_AES_CMAC\n"); --- break; --- case WLAN_CIPHER_SUITE_CCMP: --- key.algo = CRYPTO_ALGO_AES_CCM; --- brcmf_dbg(CONN, "WLAN_CIPHER_SUITE_CCMP\n"); --- break; --- default: --- brcmf_err("Invalid cipher (0x%x)\n", params->cipher); --- return -EINVAL; --- } --- err = send_key_to_dongle(ifp, &key); --- if (err) --- brcmf_err("wsec_key error (%d)\n", err); --- } --+ brcmf_dbg(TRACE, "Exit\n"); -- return err; -- } -- --@@ -2163,8 +2113,9 @@ brcmf_cfg80211_add_key(struct wiphy *wip -- struct brcmf_wsec_key *key; -- s32 val; -- s32 wsec; --- s32 err = 0; --+ s32 err; -- u8 keybuf[8]; --+ bool ext_key; -- -- brcmf_dbg(TRACE, "Enter\n"); -- brcmf_dbg(CONN, "key index (%d)\n", key_idx); --@@ -2177,27 +2128,32 @@ brcmf_cfg80211_add_key(struct wiphy *wip -- return -EINVAL; -- } -- --- if (mac_addr && --- (params->cipher != WLAN_CIPHER_SUITE_WEP40) && --- (params->cipher != WLAN_CIPHER_SUITE_WEP104)) { --- brcmf_dbg(TRACE, "Exit"); --- return brcmf_add_keyext(wiphy, ndev, key_idx, mac_addr, params); --- } --- --- key = &ifp->vif->profile.key[key_idx]; --- memset(key, 0, sizeof(*key)); --+ if (params->key_len == 0) --+ return brcmf_cfg80211_del_key(wiphy, ndev, key_idx, pairwise, --+ mac_addr); -- -- if (params->key_len > sizeof(key->data)) { -- brcmf_err("Too long key length (%u)\n", params->key_len); --- err = -EINVAL; --- goto done; --+ return -EINVAL; --+ } --+ --+ ext_key = false; --+ if (mac_addr && (params->cipher != WLAN_CIPHER_SUITE_WEP40) && --+ (params->cipher != WLAN_CIPHER_SUITE_WEP104)) { --+ brcmf_dbg(TRACE, "Ext key, mac %pM", mac_addr); --+ ext_key = true; -- } --+ --+ key = &ifp->vif->profile.key[key_idx]; --+ memset(key, 0, sizeof(*key)); --+ if ((ext_key) && (!is_multicast_ether_addr(mac_addr))) --+ memcpy((char *)&key->ea, (void *)mac_addr, ETH_ALEN); -- key->len = params->key_len; -- key->index = key_idx; --- -- memcpy(key->data, params->key, key->len); --+ if (!ext_key) --+ key->flags = BRCMF_PRIMARY_KEY; -- --- key->flags = BRCMF_PRIMARY_KEY; -- switch (params->cipher) { -- case WLAN_CIPHER_SUITE_WEP40: -- key->algo = CRYPTO_ALGO_WEP1; --@@ -2237,7 +2193,7 @@ brcmf_cfg80211_add_key(struct wiphy *wip -- } -- -- err = send_key_to_dongle(ifp, key); --- if (err) --+ if (ext_key || err) -- goto done; -- -- err = brcmf_fil_bsscfg_int_get(ifp, "wsec", &wsec); --@@ -2256,38 +2212,6 @@ done: -- brcmf_dbg(TRACE, "Exit\n"); -- return err; -- } --- ---static s32 ---brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev, --- u8 key_idx, bool pairwise, const u8 *mac_addr) ---{ --- struct brcmf_if *ifp = netdev_priv(ndev); --- struct brcmf_wsec_key key; --- s32 err = 0; --- --- brcmf_dbg(TRACE, "Enter\n"); --- if (!check_vif_up(ifp->vif)) --- return -EIO; --- --- if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) { --- /* we ignore this key index in this case */ --- return -EINVAL; --- } --- --- memset(&key, 0, sizeof(key)); --- --- key.index = (u32) key_idx; --- key.flags = BRCMF_PRIMARY_KEY; --- key.algo = CRYPTO_ALGO_OFF; --- --- brcmf_dbg(CONN, "key index (%d)\n", key_idx); --- --- /* Set the new key/index */ --- err = send_key_to_dongle(ifp, &key); --- --- brcmf_dbg(TRACE, "Exit\n"); --- return err; ---} -- -- static s32 -- brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, -diff --git a/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch b/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch -deleted file mode 100644 -index c20d40c049724d71cf65170872be9e3a0c3ff21a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/344-0020-brcmfmac-add-802.11w-management-frame-protection-sup.patch -+++ /dev/null -@@ -1,509 +0,0 @@ --From: Hante Meuleman --Date: Wed, 17 Feb 2016 11:27:10 +0100 --Subject: [PATCH] brcmfmac: add 802.11w management frame protection support -- --Add full support for both AP and STA for management frame protection. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -72,8 +72,13 @@ -- #define RSN_AKM_NONE 0 /* None (IBSS) */ -- #define RSN_AKM_UNSPECIFIED 1 /* Over 802.1x */ -- #define RSN_AKM_PSK 2 /* Pre-shared Key */ --+#define RSN_AKM_SHA256_1X 5 /* SHA256, 802.1X */ --+#define RSN_AKM_SHA256_PSK 6 /* SHA256, Pre-shared Key */ -- #define RSN_CAP_LEN 2 /* Length of RSN capabilities */ ---#define RSN_CAP_PTK_REPLAY_CNTR_MASK 0x000C --+#define RSN_CAP_PTK_REPLAY_CNTR_MASK (BIT(2) | BIT(3)) --+#define RSN_CAP_MFPR_MASK BIT(6) --+#define RSN_CAP_MFPC_MASK BIT(7) --+#define RSN_PMKID_COUNT_LEN 2 -- -- #define VNDR_IE_CMD_LEN 4 /* length of the set command -- * string :"add", "del" (+ NUL) --@@ -211,12 +216,19 @@ static const struct ieee80211_regdomain -- REG_RULE(5470-10, 5850+10, 80, 6, 20, 0), } -- }; -- ---static const u32 __wl_cipher_suites[] = { --+/* Note: brcmf_cipher_suites is an array of int defining which cipher suites --+ * are supported. A pointer to this array and the number of entries is passed --+ * on to upper layers. AES_CMAC defines whether or not the driver supports MFP. --+ * So the cipher suite AES_CMAC has to be the last one in the array, and when --+ * device does not support MFP then the number of suites will be decreased by 1 --+ */ --+static const u32 brcmf_cipher_suites[] = { -- WLAN_CIPHER_SUITE_WEP40, -- WLAN_CIPHER_SUITE_WEP104, -- WLAN_CIPHER_SUITE_TKIP, -- WLAN_CIPHER_SUITE_CCMP, --- WLAN_CIPHER_SUITE_AES_CMAC, --+ /* Keep as last entry: */ --+ WLAN_CIPHER_SUITE_AES_CMAC -- }; -- -- /* Vendor specific ie. id = 221, oui and type defines exact ie */ --@@ -1533,7 +1545,7 @@ static s32 brcmf_set_auth_type(struct ne -- -- static s32 -- brcmf_set_wsec_mode(struct net_device *ndev, --- struct cfg80211_connect_params *sme, bool mfp) --+ struct cfg80211_connect_params *sme) -- { -- struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev); -- struct brcmf_cfg80211_security *sec; --@@ -1592,10 +1604,7 @@ brcmf_set_wsec_mode(struct net_device *n -- sme->privacy) -- pval = AES_ENABLED; -- --- if (mfp) --- wsec = pval | gval | MFP_CAPABLE; --- else --- wsec = pval | gval; --+ wsec = pval | gval; -- err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wsec", wsec); -- if (err) { -- brcmf_err("error (%d)\n", err); --@@ -1612,56 +1621,100 @@ brcmf_set_wsec_mode(struct net_device *n -- static s32 -- brcmf_set_key_mgmt(struct net_device *ndev, struct cfg80211_connect_params *sme) -- { --- struct brcmf_cfg80211_profile *profile = ndev_to_prof(ndev); --- struct brcmf_cfg80211_security *sec; --- s32 val = 0; --- s32 err = 0; --+ struct brcmf_if *ifp = netdev_priv(ndev); --+ s32 val; --+ s32 err; --+ const struct brcmf_tlv *rsn_ie; --+ const u8 *ie; --+ u32 ie_len; --+ u32 offset; --+ u16 rsn_cap; --+ u32 mfp; --+ u16 count; -- --- if (sme->crypto.n_akm_suites) { --- err = brcmf_fil_bsscfg_int_get(netdev_priv(ndev), --- "wpa_auth", &val); --- if (err) { --- brcmf_err("could not get wpa_auth (%d)\n", err); --- return err; --+ if (!sme->crypto.n_akm_suites) --+ return 0; --+ --+ err = brcmf_fil_bsscfg_int_get(netdev_priv(ndev), "wpa_auth", &val); --+ if (err) { --+ brcmf_err("could not get wpa_auth (%d)\n", err); --+ return err; --+ } --+ if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) { --+ switch (sme->crypto.akm_suites[0]) { --+ case WLAN_AKM_SUITE_8021X: --+ val = WPA_AUTH_UNSPECIFIED; --+ break; --+ case WLAN_AKM_SUITE_PSK: --+ val = WPA_AUTH_PSK; --+ break; --+ default: --+ brcmf_err("invalid cipher group (%d)\n", --+ sme->crypto.cipher_group); --+ return -EINVAL; -- } --- if (val & (WPA_AUTH_PSK | WPA_AUTH_UNSPECIFIED)) { --- switch (sme->crypto.akm_suites[0]) { --- case WLAN_AKM_SUITE_8021X: --- val = WPA_AUTH_UNSPECIFIED; --- break; --- case WLAN_AKM_SUITE_PSK: --- val = WPA_AUTH_PSK; --- break; --- default: --- brcmf_err("invalid cipher group (%d)\n", --- sme->crypto.cipher_group); --- return -EINVAL; --- } --- } else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) { --- switch (sme->crypto.akm_suites[0]) { --- case WLAN_AKM_SUITE_8021X: --- val = WPA2_AUTH_UNSPECIFIED; --- break; --- case WLAN_AKM_SUITE_PSK: --- val = WPA2_AUTH_PSK; --- break; --- default: --- brcmf_err("invalid cipher group (%d)\n", --- sme->crypto.cipher_group); --- return -EINVAL; --- } --+ } else if (val & (WPA2_AUTH_PSK | WPA2_AUTH_UNSPECIFIED)) { --+ switch (sme->crypto.akm_suites[0]) { --+ case WLAN_AKM_SUITE_8021X: --+ val = WPA2_AUTH_UNSPECIFIED; --+ break; --+ case WLAN_AKM_SUITE_8021X_SHA256: --+ val = WPA2_AUTH_1X_SHA256; --+ break; --+ case WLAN_AKM_SUITE_PSK_SHA256: --+ val = WPA2_AUTH_PSK_SHA256; --+ break; --+ case WLAN_AKM_SUITE_PSK: --+ val = WPA2_AUTH_PSK; --+ break; --+ default: --+ brcmf_err("invalid cipher group (%d)\n", --+ sme->crypto.cipher_group); --+ return -EINVAL; -- } --+ } -- --- brcmf_dbg(CONN, "setting wpa_auth to %d\n", val); --- err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), --- "wpa_auth", val); --- if (err) { --- brcmf_err("could not set wpa_auth (%d)\n", err); --- return err; --- } --+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) --+ goto skip_mfp_config; --+ /* The MFP mode (1 or 2) needs to be determined, parse IEs. The --+ * IE will not be verified, just a quick search for MFP config --+ */ --+ rsn_ie = brcmf_parse_tlvs((const u8 *)sme->ie, sme->ie_len, --+ WLAN_EID_RSN); --+ if (!rsn_ie) --+ goto skip_mfp_config; --+ ie = (const u8 *)rsn_ie; --+ ie_len = rsn_ie->len + TLV_HDR_LEN; --+ /* Skip unicast suite */ --+ offset = TLV_HDR_LEN + WPA_IE_VERSION_LEN + WPA_IE_MIN_OUI_LEN; --+ if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len) --+ goto skip_mfp_config; --+ /* Skip multicast suite */ --+ count = ie[offset] + (ie[offset + 1] << 8); --+ offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN); --+ if (offset + WPA_IE_SUITE_COUNT_LEN >= ie_len) --+ goto skip_mfp_config; --+ /* Skip auth key management suite(s) */ --+ count = ie[offset] + (ie[offset + 1] << 8); --+ offset += WPA_IE_SUITE_COUNT_LEN + (count * WPA_IE_MIN_OUI_LEN); --+ if (offset + WPA_IE_SUITE_COUNT_LEN > ie_len) --+ goto skip_mfp_config; --+ /* Ready to read capabilities */ --+ mfp = BRCMF_MFP_NONE; --+ rsn_cap = ie[offset] + (ie[offset + 1] << 8); --+ if (rsn_cap & RSN_CAP_MFPR_MASK) --+ mfp = BRCMF_MFP_REQUIRED; --+ else if (rsn_cap & RSN_CAP_MFPC_MASK) --+ mfp = BRCMF_MFP_CAPABLE; --+ brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "mfp", mfp); --+ --+skip_mfp_config: --+ brcmf_dbg(CONN, "setting wpa_auth to %d\n", val); --+ err = brcmf_fil_bsscfg_int_set(netdev_priv(ndev), "wpa_auth", val); --+ if (err) { --+ brcmf_err("could not set wpa_auth (%d)\n", err); --+ return err; -- } --- sec = &profile->sec; --- sec->wpa_auth = sme->crypto.akm_suites[0]; -- -- return err; -- } --@@ -1827,7 +1880,7 @@ brcmf_cfg80211_connect(struct wiphy *wip -- goto done; -- } -- --- err = brcmf_set_wsec_mode(ndev, sme, sme->mfp == NL80211_MFP_REQUIRED); --+ err = brcmf_set_wsec_mode(ndev, sme); -- if (err) { -- brcmf_err("wl_set_set_cipher failed (%d)\n", err); -- goto done; --@@ -2077,10 +2130,12 @@ brcmf_cfg80211_del_key(struct wiphy *wip -- u8 key_idx, bool pairwise, const u8 *mac_addr) -- { -- struct brcmf_if *ifp = netdev_priv(ndev); --- struct brcmf_wsec_key key; --- s32 err = 0; --+ struct brcmf_wsec_key *key; --+ s32 err; -- -- brcmf_dbg(TRACE, "Enter\n"); --+ brcmf_dbg(CONN, "key index (%d)\n", key_idx); --+ -- if (!check_vif_up(ifp->vif)) -- return -EIO; -- --@@ -2089,16 +2144,19 @@ brcmf_cfg80211_del_key(struct wiphy *wip -- return -EINVAL; -- } -- --- memset(&key, 0, sizeof(key)); --+ key = &ifp->vif->profile.key[key_idx]; -- --- key.index = (u32)key_idx; --- key.flags = BRCMF_PRIMARY_KEY; --- key.algo = CRYPTO_ALGO_OFF; --+ if (key->algo == CRYPTO_ALGO_OFF) { --+ brcmf_dbg(CONN, "Ignore clearing of (never configured) key\n"); --+ return -EINVAL; --+ } -- --- brcmf_dbg(CONN, "key index (%d)\n", key_idx); --+ memset(key, 0, sizeof(*key)); --+ key->index = (u32)key_idx; --+ key->flags = BRCMF_PRIMARY_KEY; -- --- /* Set the new key/index */ --- err = send_key_to_dongle(ifp, &key); --+ /* Clear the key/index */ --+ err = send_key_to_dongle(ifp, key); -- -- brcmf_dbg(TRACE, "Exit\n"); -- return err; --@@ -2106,8 +2164,8 @@ brcmf_cfg80211_del_key(struct wiphy *wip -- -- static s32 -- brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev, --- u8 key_idx, bool pairwise, const u8 *mac_addr, --- struct key_params *params) --+ u8 key_idx, bool pairwise, const u8 *mac_addr, --+ struct key_params *params) -- { -- struct brcmf_if *ifp = netdev_priv(ndev); -- struct brcmf_wsec_key *key; --@@ -2214,9 +2272,10 @@ done: -- } -- -- static s32 ---brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, --- u8 key_idx, bool pairwise, const u8 *mac_addr, void *cookie, --- void (*callback) (void *cookie, struct key_params * params)) --+brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, u8 key_idx, --+ bool pairwise, const u8 *mac_addr, void *cookie, --+ void (*callback)(void *cookie, --+ struct key_params *params)) -- { -- struct key_params params; -- struct brcmf_if *ifp = netdev_priv(ndev); --@@ -2268,8 +2327,15 @@ done: -- -- static s32 -- brcmf_cfg80211_config_default_mgmt_key(struct wiphy *wiphy, --- struct net_device *ndev, u8 key_idx) --+ struct net_device *ndev, u8 key_idx) -- { --+ struct brcmf_if *ifp = netdev_priv(ndev); --+ --+ brcmf_dbg(TRACE, "Enter key_idx %d\n", key_idx); --+ --+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) --+ return 0; --+ -- brcmf_dbg(INFO, "Not supported\n"); -- -- return -EOPNOTSUPP; --@@ -3769,7 +3835,7 @@ brcmf_configure_wpaie(struct brcmf_if *i -- u32 auth = 0; /* d11 open authentication */ -- u16 count; -- s32 err = 0; --- s32 len = 0; --+ s32 len; -- u32 i; -- u32 wsec; -- u32 pval = 0; --@@ -3779,6 +3845,7 @@ brcmf_configure_wpaie(struct brcmf_if *i -- u8 *data; -- u16 rsn_cap; -- u32 wme_bss_disable; --+ u32 mfp; -- -- brcmf_dbg(TRACE, "Enter\n"); -- if (wpa_ie == NULL) --@@ -3893,19 +3960,53 @@ brcmf_configure_wpaie(struct brcmf_if *i -- is_rsn_ie ? (wpa_auth |= WPA2_AUTH_PSK) : -- (wpa_auth |= WPA_AUTH_PSK); -- break; --+ case RSN_AKM_SHA256_PSK: --+ brcmf_dbg(TRACE, "RSN_AKM_MFP_PSK\n"); --+ wpa_auth |= WPA2_AUTH_PSK_SHA256; --+ break; --+ case RSN_AKM_SHA256_1X: --+ brcmf_dbg(TRACE, "RSN_AKM_MFP_1X\n"); --+ wpa_auth |= WPA2_AUTH_1X_SHA256; --+ break; -- default: -- brcmf_err("Ivalid key mgmt info\n"); -- } -- offset++; -- } -- --+ mfp = BRCMF_MFP_NONE; -- if (is_rsn_ie) { -- wme_bss_disable = 1; -- if ((offset + RSN_CAP_LEN) <= len) { -- rsn_cap = data[offset] + (data[offset + 1] << 8); -- if (rsn_cap & RSN_CAP_PTK_REPLAY_CNTR_MASK) -- wme_bss_disable = 0; --+ if (rsn_cap & RSN_CAP_MFPR_MASK) { --+ brcmf_dbg(TRACE, "MFP Required\n"); --+ mfp = BRCMF_MFP_REQUIRED; --+ /* Firmware only supports mfp required in --+ * combination with WPA2_AUTH_PSK_SHA256 or --+ * WPA2_AUTH_1X_SHA256. --+ */ --+ if (!(wpa_auth & (WPA2_AUTH_PSK_SHA256 | --+ WPA2_AUTH_1X_SHA256))) { --+ err = -EINVAL; --+ goto exit; --+ } --+ /* Firmware has requirement that WPA2_AUTH_PSK/ --+ * WPA2_AUTH_UNSPECIFIED be set, if SHA256 OUI --+ * is to be included in the rsn ie. --+ */ --+ if (wpa_auth & WPA2_AUTH_PSK_SHA256) --+ wpa_auth |= WPA2_AUTH_PSK; --+ else if (wpa_auth & WPA2_AUTH_1X_SHA256) --+ wpa_auth |= WPA2_AUTH_UNSPECIFIED; --+ } else if (rsn_cap & RSN_CAP_MFPC_MASK) { --+ brcmf_dbg(TRACE, "MFP Capable\n"); --+ mfp = BRCMF_MFP_CAPABLE; --+ } -- } --+ offset += RSN_CAP_LEN; -- /* set wme_bss_disable to sync RSN Capabilities */ -- err = brcmf_fil_bsscfg_int_set(ifp, "wme_bss_disable", -- wme_bss_disable); --@@ -3913,6 +4014,21 @@ brcmf_configure_wpaie(struct brcmf_if *i -- brcmf_err("wme_bss_disable error %d\n", err); -- goto exit; -- } --+ --+ /* Skip PMKID cnt as it is know to be 0 for AP. */ --+ offset += RSN_PMKID_COUNT_LEN; --+ --+ /* See if there is BIP wpa suite left for MFP */ --+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP) && --+ ((offset + WPA_IE_MIN_OUI_LEN) <= len)) { --+ err = brcmf_fil_bsscfg_data_set(ifp, "bip", --+ &data[offset], --+ WPA_IE_MIN_OUI_LEN); --+ if (err < 0) { --+ brcmf_err("bip error %d\n", err); --+ goto exit; --+ } --+ } -- } -- /* FOR WPS , set SES_OW_ENABLED */ -- wsec = (pval | gval | SES_OW_ENABLED); --@@ -3929,6 +4045,16 @@ brcmf_configure_wpaie(struct brcmf_if *i -- brcmf_err("wsec error %d\n", err); -- goto exit; -- } --+ /* Configure MFP, this needs to go after wsec otherwise the wsec command --+ * will overwrite the values set by MFP --+ */ --+ if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) { --+ err = brcmf_fil_bsscfg_int_set(ifp, "mfp", mfp); --+ if (err < 0) { --+ brcmf_err("mfp error %d\n", err); --+ goto exit; --+ } --+ } -- /* set upper-layer auth */ -- err = brcmf_fil_bsscfg_int_set(ifp, "wpa_auth", wpa_auth); -- if (err < 0) { --@@ -6149,8 +6275,10 @@ static int brcmf_setup_wiphy(struct wiph -- wiphy->n_addresses = i; -- -- wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; --- wiphy->cipher_suites = __wl_cipher_suites; --- wiphy->n_cipher_suites = ARRAY_SIZE(__wl_cipher_suites); --+ wiphy->cipher_suites = brcmf_cipher_suites; --+ wiphy->n_cipher_suites = ARRAY_SIZE(brcmf_cipher_suites); --+ if (!brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MFP)) --+ wiphy->n_cipher_suites--; -- wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT | -- WIPHY_FLAG_OFFCHAN_TX | -- WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --@@ -72,7 +72,7 @@ -- -- #define BRCMF_VNDR_IE_P2PAF_SHIFT 12 -- ---#define BRCMF_MAX_DEFAULT_KEYS 4 --+#define BRCMF_MAX_DEFAULT_KEYS 6 -- -- /* beacon loss timeout defaults */ -- #define BRCMF_DEFAULT_BCN_TIMEOUT_ROAM_ON 2 --@@ -107,7 +107,6 @@ struct brcmf_cfg80211_security { -- u32 auth_type; -- u32 cipher_pairwise; -- u32 cipher_group; --- u32 wpa_auth; -- }; -- -- /** ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c --@@ -161,6 +161,7 @@ void brcmf_feat_attach(struct brcmf_pub -- ifp->drvr->feat_flags &= ~BIT(BRCMF_FEAT_MBSS); -- brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_RSDB, "rsdb_mode"); -- brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable"); --+ brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MFP, "mfp"); -- -- pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER; -- err = brcmf_fil_iovar_data_get(ifp, "pfn_macaddr", &pfn_mac, ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h --@@ -30,6 +30,7 @@ -- * WOWL_ND: WOWL net detect (PNO) -- * WOWL_GTK: (WOWL) GTK rekeying offload -- * WOWL_ARP_ND: ARP and Neighbor Discovery offload support during WOWL. --+ * MFP: 802.11w Management Frame Protection. -- */ -- #define BRCMF_FEAT_LIST \ -- BRCMF_FEAT_DEF(MBSS) \ --@@ -42,7 +43,8 @@ -- BRCMF_FEAT_DEF(SCAN_RANDOM_MAC) \ -- BRCMF_FEAT_DEF(WOWL_ND) \ -- BRCMF_FEAT_DEF(WOWL_GTK) \ --- BRCMF_FEAT_DEF(WOWL_ARP_ND) --+ BRCMF_FEAT_DEF(WOWL_ARP_ND) \ --+ BRCMF_FEAT_DEF(MFP) -- -- /* -- * Quirks: ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h --@@ -142,6 +142,10 @@ -- #define BRCMF_RSN_KEK_LENGTH 16 -- #define BRCMF_RSN_REPLAY_LEN 8 -- --+#define BRCMF_MFP_NONE 0 --+#define BRCMF_MFP_CAPABLE 1 --+#define BRCMF_MFP_REQUIRED 2 --+ -- /* join preference types for join_pref iovar */ -- enum brcmf_join_pref_types { -- BRCMF_JOIN_PREF_RSSI = 1, ----- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h --+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h --@@ -236,6 +236,8 @@ static inline bool ac_bitmap_tst(u8 bitm -- #define WPA2_AUTH_RESERVED3 0x0200 -- #define WPA2_AUTH_RESERVED4 0x0400 -- #define WPA2_AUTH_RESERVED5 0x0800 --+#define WPA2_AUTH_1X_SHA256 0x1000 /* 1X with SHA256 key derivation */ --+#define WPA2_AUTH_PSK_SHA256 0x8000 /* PSK with SHA256 key derivation */ -- -- #define DOT11_DEFAULT_RTS_LEN 2347 -- #define DOT11_DEFAULT_FRAG_LEN 2346 -diff --git a/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch b/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch -deleted file mode 100644 -index 39f438321e833984ef54d3f653f95c01ed041c47..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/345-brcmfmac-Remove-waitqueue_active-check.patch -+++ /dev/null -@@ -1,54 +0,0 @@ --From: Hui Wang --Date: Wed, 9 Mar 2016 15:25:26 +0800 --Subject: [PATCH] brcmfmac: Remove waitqueue_active check -- --We met a problem of pm_suspend when repeated closing/opening the lid --on a Lenovo laptop (1/20 reproduce rate), below is the log: -- --[ 199.735876] PM: Entering mem sleep --[ 199.750516] e1000e: EEE TX LPI TIMER: 00000011 --[ 199.856638] Trying to free nonexistent resource <000000000000d000-000000000000d0ff> --[ 201.753566] brcmfmac: brcmf_pcie_suspend: Timeout on response for entering D3 substate --[ 201.753581] pci_legacy_suspend(): brcmf_pcie_suspend+0x0/0x1f0 [brcmfmac] returns -5 --[ 201.753585] dpm_run_callback(): pci_pm_suspend+0x0/0x160 returns -5 --[ 201.753589] PM: Device 0000:04:00.0 failed to suspend async: error -5 -- --Through debugging, we found when problem happens, it is not the device --fails to enter D3, but the signal D3_ACK comes too early to pass the --waitqueue_active() check. -- --Just like this: --brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D3_INFORM); --// signal is triggered here --wait_event_timeout(devinfo->mbdata_resp_wait, devinfo->mbdata_completed, -- BRCMF_PCIE_MBDATA_TIMEOUT); -- --So far I think it is safe to remove waitqueue_active check since there --is only one place to trigger this signal (sending --BRCMF_H2D_HOST_D3_INFORM). And it is not a problem calling wake_up --event earlier than calling wait_event. -- --Cc: Brett Rudley --Cc: Hante Meuleman --Cc: Franky (Zhenhui) Lin --Cc: Pieter-Paul Giesberts --Cc: Arend van Spriel --Signed-off-by: Hui Wang --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c --@@ -677,10 +677,8 @@ static void brcmf_pcie_handle_mb_data(st -- brcmf_dbg(PCIE, "D2H_MB_DATA: DEEP SLEEP EXIT\n"); -- if (dtoh_mb_data & BRCMF_D2H_DEV_D3_ACK) { -- brcmf_dbg(PCIE, "D2H_MB_DATA: D3 ACK\n"); --- if (waitqueue_active(&devinfo->mbdata_resp_wait)) { --- devinfo->mbdata_completed = true; --- wake_up(&devinfo->mbdata_resp_wait); --- } --+ devinfo->mbdata_completed = true; --+ wake_up(&devinfo->mbdata_resp_wait); -- } -- } -- -diff --git a/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch b/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch -deleted file mode 100644 -index 3c9ed425da0cb5140149f2c220d029e792ff41b7..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/346-brcmfmac-uninitialized-ret-variable.patch -+++ /dev/null -@@ -1,21 +0,0 @@ --From: Dan Carpenter --Date: Tue, 15 Mar 2016 10:06:10 +0300 --Subject: [PATCH] brcmfmac: uninitialized "ret" variable -- --There is an error path where "ret" isn't initialized. -- --Signed-off-by: Dan Carpenter --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --@@ -250,7 +250,7 @@ static int brcmf_sdiod_request_data(stru -- u32 addr, u8 regsz, void *data, bool write) -- { -- struct sdio_func *func; --- int ret; --+ int ret = -EINVAL; -- -- brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n", -- write, fn, addr, regsz); -diff --git a/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch b/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch -deleted file mode 100644 -index d1deb6ee5ce73cb1a6ecc9775360c422113cd0b4..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/347-brcmfmac-sdio-remove-unused-variable-retry_limit.patch -+++ /dev/null -@@ -1,24 +0,0 @@ --From: Colin Ian King --Date: Sun, 20 Mar 2016 17:34:52 +0000 --Subject: [PATCH] brcmfmac: sdio: remove unused variable retry_limit -- --retry_limit has never been used during the life of this driver, so --we may as well remove it as it is redundant. -- --Signed-off-by: Colin Ian King --Reviewed-by: Julian Calaby --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -535,9 +535,6 @@ static int qcount[NUMPRIO]; -- -- #define RETRYCHAN(chan) ((chan) == SDPCM_EVENT_CHANNEL) -- ---/* Retry count for register access failures */ ---static const uint retry_limit = 2; --- -- /* Limit on rounding up frames */ -- static const uint max_roundup = 512; -- -diff --git a/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch b/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch -deleted file mode 100644 -index d399b264ea9d2ac0d1ba82d725707720b4c0693e..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/348-brcmfmac-Delete-unnecessary-variable-initialisation.patch -+++ /dev/null -@@ -1,26 +0,0 @@ --From: Markus Elfring --Date: Fri, 18 Mar 2016 13:23:24 +1100 --Subject: [PATCH] brcmfmac: Delete unnecessary variable initialisation -- --In brcmf_sdio_download_firmware(), bcmerror is set by the call to --brcmf_sdio_download_code_file(), before it's checked in the following --line. -- --Signed-off-by: Markus Elfring --Acked-by: Arend van Spriel --[Rewrote commit message] --Signed-off-by: Julian Calaby --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -3258,7 +3258,7 @@ static int brcmf_sdio_download_firmware( -- const struct firmware *fw, -- void *nvram, u32 nvlen) -- { --- int bcmerror = -EFAULT; --+ int bcmerror; -- u32 rstvec; -- -- sdio_claim_host(bus->sdiodev->func[1]); -diff --git a/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch b/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch -deleted file mode 100644 -index 0acb4faaf1acb27dd39d11bef81be070c556dcf0..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/349-0001-brcmfmac-clear-eventmask-array-before-using-it.patch -+++ /dev/null -@@ -1,27 +0,0 @@ --From: Hante Meuleman --Date: Mon, 11 Apr 2016 11:35:21 +0200 --Subject: [PATCH] brcmfmac: clear eventmask array before using it -- --When the event_msgs iovar is set an array is used to configure the --enabled events. This arrays needs to nulled before configuring --otherwise unhandled events will be enabled. This solves a problem --where in case of wowl the host got woken by an incorrectly enabled --event. -- --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Arend Van Spriel --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c --@@ -371,6 +371,7 @@ int brcmf_fweh_activate_events(struct br -- int i, err; -- s8 eventmask[BRCMF_EVENTING_MASK_LEN]; -- --+ memset(eventmask, 0, sizeof(eventmask)); -- for (i = 0; i < BRCMF_E_LAST; i++) { -- if (ifp->drvr->fweh.evt_handler[i]) { -- brcmf_dbg(EVENT, "enable event %s\n", -diff --git a/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch b/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch -deleted file mode 100644 -index 8d3067890c2fe87f88547d151d3da6d7facd8ea0..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/349-0002-brcmfmac-fix-clearing-wowl-wake-indicators.patch -+++ /dev/null -@@ -1,27 +0,0 @@ --From: Hante Meuleman --Date: Mon, 11 Apr 2016 11:35:22 +0200 --Subject: [PATCH] brcmfmac: fix clearing wowl wake indicators -- --Newer firmwares require the usage of the wowl wakeind struct as size --for the iovar to clear the wake indicators. Older firmwares do not --care, so change the used size. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -3608,7 +3608,8 @@ static void brcmf_configure_wowl(struct -- if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) -- wowl_config |= BRCMF_WOWL_UNASSOC; -- --- brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", "clear", strlen("clear")); --+ brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", "clear", --+ sizeof(struct brcmf_wowl_wakeind_le)); -- brcmf_fil_iovar_int_set(ifp, "wowl", wowl_config); -- brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1); -- brcmf_bus_wowl_config(cfg->pub->bus_if, true); -diff --git a/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch b/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch -deleted file mode 100644 -index f293401ca82d37e367600acf2676b18f6fad92ba..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/349-0003-brcmfmac-insert-default-boardrev-in-nvram-data-if-mi.patch -+++ /dev/null -@@ -1,114 +0,0 @@ --From: Hante Meuleman --Date: Mon, 11 Apr 2016 11:35:23 +0200 --Subject: [PATCH] brcmfmac: insert default boardrev in nvram data if -- missing -- --Some nvram files/stores come without the boardrev information, --but firmware requires this to be set. When not found in nvram then --add a default boardrev string to the nvram data. -- --Reported-by: Rafal Milecki --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky (Zhenhui) Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c --@@ -29,6 +29,7 @@ -- #define BRCMF_FW_MAX_NVRAM_SIZE 64000 -- #define BRCMF_FW_NVRAM_DEVPATH_LEN 19 /* devpath0=pcie/1/4/ */ -- #define BRCMF_FW_NVRAM_PCIEDEV_LEN 10 /* pcie/1/4/ + \0 */ --+#define BRCMF_FW_DEFAULT_BOARDREV "boardrev=0xff" -- -- enum nvram_parser_state { -- IDLE, --@@ -51,6 +52,7 @@ enum nvram_parser_state { -- * @entry: start position of key,value entry. -- * @multi_dev_v1: detect pcie multi device v1 (compressed). -- * @multi_dev_v2: detect pcie multi device v2. --+ * @boardrev_found: nvram contains boardrev information. -- */ -- struct nvram_parser { -- enum nvram_parser_state state; --@@ -63,6 +65,7 @@ struct nvram_parser { -- u32 entry; -- bool multi_dev_v1; -- bool multi_dev_v2; --+ bool boardrev_found; -- }; -- -- /** --@@ -125,6 +128,8 @@ static enum nvram_parser_state brcmf_nvr -- nvp->multi_dev_v1 = true; -- if (strncmp(&nvp->data[nvp->entry], "pcie/", 5) == 0) -- nvp->multi_dev_v2 = true; --+ if (strncmp(&nvp->data[nvp->entry], "boardrev", 8) == 0) --+ nvp->boardrev_found = true; -- } else if (!is_nvram_char(c) || c == ' ') { -- brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n", -- nvp->line, nvp->column); --@@ -284,6 +289,8 @@ static void brcmf_fw_strip_multi_v1(stru -- while (i < nvp->nvram_len) { -- if ((nvp->nvram[i] - '0' == id) && (nvp->nvram[i + 1] == ':')) { -- i += 2; --+ if (strncmp(&nvp->nvram[i], "boardrev", 8) == 0) --+ nvp->boardrev_found = true; -- while (nvp->nvram[i] != 0) { -- nvram[j] = nvp->nvram[i]; -- i++; --@@ -335,6 +342,8 @@ static void brcmf_fw_strip_multi_v2(stru -- while (i < nvp->nvram_len - len) { -- if (strncmp(&nvp->nvram[i], prefix, len) == 0) { -- i += len; --+ if (strncmp(&nvp->nvram[i], "boardrev", 8) == 0) --+ nvp->boardrev_found = true; -- while (nvp->nvram[i] != 0) { -- nvram[j] = nvp->nvram[i]; -- i++; --@@ -356,6 +365,18 @@ fail: -- nvp->nvram_len = 0; -- } -- --+static void brcmf_fw_add_defaults(struct nvram_parser *nvp) --+{ --+ if (nvp->boardrev_found) --+ return; --+ --+ memcpy(&nvp->nvram[nvp->nvram_len], &BRCMF_FW_DEFAULT_BOARDREV, --+ strlen(BRCMF_FW_DEFAULT_BOARDREV)); --+ nvp->nvram_len += strlen(BRCMF_FW_DEFAULT_BOARDREV); --+ nvp->nvram[nvp->nvram_len] = '\0'; --+ nvp->nvram_len++; --+} --+ -- /* brcmf_nvram_strip :Takes a buffer of "=\n" lines read from a fil -- * and ending in a NUL. Removes carriage returns, empty lines, comment lines, -- * and converts newlines to NULs. Shortens buffer as needed and pads with NULs. --@@ -377,16 +398,21 @@ static void *brcmf_fw_nvram_strip(const -- if (nvp.state == END) -- break; -- } --- if (nvp.multi_dev_v1) --+ if (nvp.multi_dev_v1) { --+ nvp.boardrev_found = false; -- brcmf_fw_strip_multi_v1(&nvp, domain_nr, bus_nr); --- else if (nvp.multi_dev_v2) --+ } else if (nvp.multi_dev_v2) { --+ nvp.boardrev_found = false; -- brcmf_fw_strip_multi_v2(&nvp, domain_nr, bus_nr); --+ } -- -- if (nvp.nvram_len == 0) { -- kfree(nvp.nvram); -- return NULL; -- } -- --+ brcmf_fw_add_defaults(&nvp); --+ -- pad = nvp.nvram_len; -- *new_length = roundup(nvp.nvram_len + 1, 4); -- while (pad != *new_length) { -diff --git a/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch b/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch -deleted file mode 100644 -index ed0c83f9bbc9a2ce4741cfbe5a5cd7fde6938c7b..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/349-0004-brcmfmac-fix-p2p-scan-abort-null-pointer-exception.patch -+++ /dev/null -@@ -1,29 +0,0 @@ --From: Hante Meuleman --Date: Mon, 11 Apr 2016 11:35:24 +0200 --Subject: [PATCH] brcmfmac: fix p2p scan abort null pointer exception -- --When p2p connection setup is performed without having ever done an --escan a null pointer exception can occur. This is because the ifp --to abort scanning is taken from escan struct while it was never --initialized. Fix this by using the primary ifp for scan abort. The --abort should still be performed and all scan related commands are --performed on primary ifp. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -1266,7 +1266,7 @@ static void -- brcmf_p2p_stop_wait_next_action_frame(struct brcmf_cfg80211_info *cfg) -- { -- struct brcmf_p2p_info *p2p = &cfg->p2p; --- struct brcmf_if *ifp = cfg->escan_info.ifp; --+ struct brcmf_if *ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; -- -- if (test_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status) && -- (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status) || -diff --git a/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch b/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch -deleted file mode 100644 -index 4d26404f51951086da093df1073a2bfd09d14349..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/349-0005-brcmfmac-screening-firmware-event-packet.patch -+++ /dev/null -@@ -1,297 +0,0 @@ --From: Franky Lin --Date: Mon, 11 Apr 2016 11:35:25 +0200 --Subject: [PATCH] brcmfmac: screening firmware event packet -- --Firmware uses asynchronized events as a communication method to the --host. The event packets are marked as ETH_P_LINK_CTL protocol type. For --SDIO and PCIe bus, this kind of packets are delivered through virtual --event channel not data channel. This patch adds a screening logic to --make sure the event handler only processes the events coming from the --correct channel. -- --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h --@@ -216,7 +216,9 @@ bool brcmf_c_prec_enq(struct device *dev -- int prec); -- -- /* Receive frame for delivery to OS. Callee disposes of rxp. */ ---void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp); --+void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_evnt); --+/* Receive async event packet from firmware. Callee disposes of rxp. */ --+void brcmf_rx_event(struct device *dev, struct sk_buff *rxp); -- -- /* Indication from bus module regarding presence/insertion of dongle. */ -- int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -311,16 +311,17 @@ void brcmf_txflowblock(struct device *de -- brcmf_fws_bus_blocked(drvr, state); -- } -- ---void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb) --+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, --+ bool handle_event) -- { --- skb->dev = ifp->ndev; --- skb->protocol = eth_type_trans(skb, skb->dev); --+ skb->protocol = eth_type_trans(skb, ifp->ndev); -- -- if (skb->pkt_type == PACKET_MULTICAST) -- ifp->stats.multicast++; -- -- /* Process special event packets */ --- brcmf_fweh_process_skb(ifp->drvr, skb); --+ if (handle_event) --+ brcmf_fweh_process_skb(ifp->drvr, skb); -- -- if (!(ifp->ndev->flags & IFF_UP)) { -- brcmu_pkt_buf_free_skb(skb); --@@ -381,7 +382,7 @@ static void brcmf_rxreorder_process_info -- /* validate flags and flow id */ -- if (flags == 0xFF) { -- brcmf_err("invalid flags...so ignore this packet\n"); --- brcmf_netif_rx(ifp, pkt); --+ brcmf_netif_rx(ifp, pkt, false); -- return; -- } -- --@@ -393,7 +394,7 @@ static void brcmf_rxreorder_process_info -- if (rfi == NULL) { -- brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n", -- flow_id); --- brcmf_netif_rx(ifp, pkt); --+ brcmf_netif_rx(ifp, pkt, false); -- return; -- } -- --@@ -418,7 +419,7 @@ static void brcmf_rxreorder_process_info -- rfi = kzalloc(buf_size, GFP_ATOMIC); -- if (rfi == NULL) { -- brcmf_err("failed to alloc buffer\n"); --- brcmf_netif_rx(ifp, pkt); --+ brcmf_netif_rx(ifp, pkt, false); -- return; -- } -- --@@ -532,11 +533,11 @@ static void brcmf_rxreorder_process_info -- netif_rx: -- skb_queue_walk_safe(&reorder_list, pkt, pnext) { -- __skb_unlink(pkt, &reorder_list); --- brcmf_netif_rx(ifp, pkt); --+ brcmf_netif_rx(ifp, pkt, false); -- } -- } -- ---void brcmf_rx_frame(struct device *dev, struct sk_buff *skb) --+void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt) -- { -- struct brcmf_if *ifp; -- struct brcmf_bus *bus_if = dev_get_drvdata(dev); --@@ -560,7 +561,32 @@ void brcmf_rx_frame(struct device *dev, -- if (rd->reorder) -- brcmf_rxreorder_process_info(ifp, rd->reorder, skb); -- else --- brcmf_netif_rx(ifp, skb); --+ brcmf_netif_rx(ifp, skb, handle_evnt); --+} --+ --+void brcmf_rx_event(struct device *dev, struct sk_buff *skb) --+{ --+ struct brcmf_if *ifp; --+ struct brcmf_bus *bus_if = dev_get_drvdata(dev); --+ struct brcmf_pub *drvr = bus_if->drvr; --+ int ret; --+ --+ brcmf_dbg(EVENT, "Enter: %s: rxp=%p\n", dev_name(dev), skb); --+ --+ /* process and remove protocol-specific header */ --+ ret = brcmf_proto_hdrpull(drvr, true, skb, &ifp); --+ --+ if (ret || !ifp || !ifp->ndev) { --+ if (ret != -ENODATA && ifp) --+ ifp->stats.rx_errors++; --+ brcmu_pkt_buf_free_skb(skb); --+ return; --+ } --+ --+ skb->protocol = eth_type_trans(skb, ifp->ndev); --+ --+ brcmf_fweh_process_skb(ifp->drvr, skb); --+ brcmu_pkt_buf_free_skb(skb); -- } -- -- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success) ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -225,7 +225,8 @@ int brcmf_get_next_free_bsscfgidx(struct -- void brcmf_txflowblock_if(struct brcmf_if *ifp, -- enum brcmf_netif_stop_reason reason, bool state); -- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); ---void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); --+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, --+ bool handle_event); -- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); -- int __init brcmf_core_init(void); -- void __exit brcmf_core_exit(void); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --@@ -20,6 +20,7 @@ -- -- #include -- #include --+#include -- -- #include -- #include --@@ -1075,28 +1076,13 @@ static void brcmf_msgbuf_rxbuf_event_pos -- } -- -- ---static void ---brcmf_msgbuf_rx_skb(struct brcmf_msgbuf *msgbuf, struct sk_buff *skb, --- u8 ifidx) ---{ --- struct brcmf_if *ifp; --- --- ifp = brcmf_get_ifp(msgbuf->drvr, ifidx); --- if (!ifp || !ifp->ndev) { --- brcmf_err("Received pkt for invalid ifidx %d\n", ifidx); --- brcmu_pkt_buf_free_skb(skb); --- return; --- } --- brcmf_netif_rx(ifp, skb); ---} --- --- -- static void brcmf_msgbuf_process_event(struct brcmf_msgbuf *msgbuf, void *buf) -- { -- struct msgbuf_rx_event *event; -- u32 idx; -- u16 buflen; -- struct sk_buff *skb; --+ struct brcmf_if *ifp; -- -- event = (struct msgbuf_rx_event *)buf; -- idx = le32_to_cpu(event->msg.request_id); --@@ -1116,7 +1102,19 @@ static void brcmf_msgbuf_process_event(s -- -- skb_trim(skb, buflen); -- --- brcmf_msgbuf_rx_skb(msgbuf, skb, event->msg.ifidx); --+ ifp = brcmf_get_ifp(msgbuf->drvr, event->msg.ifidx); --+ if (!ifp || !ifp->ndev) { --+ brcmf_err("Received pkt for invalid ifidx %d\n", --+ event->msg.ifidx); --+ goto exit; --+ } --+ --+ skb->protocol = eth_type_trans(skb, ifp->ndev); --+ --+ brcmf_fweh_process_skb(ifp->drvr, skb); --+ --+exit: --+ brcmu_pkt_buf_free_skb(skb); -- } -- -- --@@ -1128,6 +1126,7 @@ brcmf_msgbuf_process_rx_complete(struct -- u16 data_offset; -- u16 buflen; -- u32 idx; --+ struct brcmf_if *ifp; -- -- brcmf_msgbuf_update_rxbufpost_count(msgbuf, 1); -- --@@ -1148,7 +1147,14 @@ brcmf_msgbuf_process_rx_complete(struct -- -- skb_trim(skb, buflen); -- --- brcmf_msgbuf_rx_skb(msgbuf, skb, rx_complete->msg.ifidx); --+ ifp = brcmf_get_ifp(msgbuf->drvr, rx_complete->msg.ifidx); --+ if (!ifp || !ifp->ndev) { --+ brcmf_err("Received pkt for invalid ifidx %d\n", --+ rx_complete->msg.ifidx); --+ brcmu_pkt_buf_free_skb(skb); --+ return; --+ } --+ brcmf_netif_rx(ifp, skb, false); -- } -- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -1294,6 +1294,17 @@ static inline u8 brcmf_sdio_getdatoffset -- return (u8)((hdrvalue & SDPCM_DOFFSET_MASK) >> SDPCM_DOFFSET_SHIFT); -- } -- --+static inline bool brcmf_sdio_fromevntchan(u8 *swheader) --+{ --+ u32 hdrvalue; --+ u8 ret; --+ --+ hdrvalue = *(u32 *)swheader; --+ ret = (u8)((hdrvalue & SDPCM_CHANNEL_MASK) >> SDPCM_CHANNEL_SHIFT); --+ --+ return (ret == SDPCM_EVENT_CHANNEL); --+} --+ -- static int brcmf_sdio_hdparse(struct brcmf_sdio *bus, u8 *header, -- struct brcmf_sdio_hdrinfo *rd, -- enum brcmf_sdio_frmtype type) --@@ -1641,7 +1652,11 @@ static u8 brcmf_sdio_rxglom(struct brcmf -- pfirst->len, pfirst->next, -- pfirst->prev); -- skb_unlink(pfirst, &bus->glom); --- brcmf_rx_frame(bus->sdiodev->dev, pfirst); --+ if (brcmf_sdio_fromevntchan(pfirst->data)) --+ brcmf_rx_event(bus->sdiodev->dev, pfirst); --+ else --+ brcmf_rx_frame(bus->sdiodev->dev, pfirst, --+ false); -- bus->sdcnt.rxglompkts++; -- } -- --@@ -1967,18 +1982,19 @@ static uint brcmf_sdio_readframes(struct -- __skb_trim(pkt, rd->len); -- skb_pull(pkt, rd->dat_offset); -- --+ if (pkt->len == 0) --+ brcmu_pkt_buf_free_skb(pkt); --+ else if (rd->channel == SDPCM_EVENT_CHANNEL) --+ brcmf_rx_event(bus->sdiodev->dev, pkt); --+ else --+ brcmf_rx_frame(bus->sdiodev->dev, pkt, --+ false); --+ -- /* prepare the descriptor for the next read */ -- rd->len = rd->len_nxtfrm << 4; -- rd->len_nxtfrm = 0; -- /* treat all packet as event if we don't know */ -- rd->channel = SDPCM_EVENT_CHANNEL; --- --- if (pkt->len == 0) { --- brcmu_pkt_buf_free_skb(pkt); --- continue; --- } --- --- brcmf_rx_frame(bus->sdiodev->dev, pkt); -- } -- -- rxcount = maxframes - rxleft; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --@@ -514,7 +514,7 @@ static void brcmf_usb_rx_complete(struct -- -- if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) { -- skb_put(skb, urb->actual_length); --- brcmf_rx_frame(devinfo->dev, skb); --+ brcmf_rx_frame(devinfo->dev, skb, true); -- brcmf_usb_rx_refill(devinfo, req); -- } else { -- brcmu_pkt_buf_free_skb(skb); -diff --git a/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch b/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch -deleted file mode 100644 -index 33b263df3aefc1b00e99860b4b9450a6ff23ad83..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/349-0006-brcmfmac-cleanup-ampdu-rx-host-reorder-code.patch -+++ /dev/null -@@ -1,585 +0,0 @@ --From: Arend van Spriel --Date: Mon, 11 Apr 2016 11:35:26 +0200 --Subject: [PATCH] brcmfmac: cleanup ampdu-rx host reorder code -- --The code for ampdu-rx host reorder is related to the firmware signalling --supported in BCDC protocol. This change moves the code to fwsignal module. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c --@@ -351,6 +351,12 @@ brcmf_proto_bcdc_add_tdls_peer(struct br -- { -- } -- --+static void brcmf_proto_bcdc_rxreorder(struct brcmf_if *ifp, --+ struct sk_buff *skb) --+{ --+ brcmf_fws_rxreorder(ifp, skb); --+} --+ -- int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) -- { -- struct brcmf_bcdc *bcdc; --@@ -372,6 +378,7 @@ int brcmf_proto_bcdc_attach(struct brcmf -- drvr->proto->configure_addr_mode = brcmf_proto_bcdc_configure_addr_mode; -- drvr->proto->delete_peer = brcmf_proto_bcdc_delete_peer; -- drvr->proto->add_tdls_peer = brcmf_proto_bcdc_add_tdls_peer; --+ drvr->proto->rxreorder = brcmf_proto_bcdc_rxreorder; -- drvr->proto->pd = bcdc; -- -- drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -40,19 +40,6 @@ -- -- #define MAX_WAIT_FOR_8021X_TX msecs_to_jiffies(950) -- ---/* AMPDU rx reordering definitions */ ---#define BRCMF_RXREORDER_FLOWID_OFFSET 0 ---#define BRCMF_RXREORDER_MAXIDX_OFFSET 2 ---#define BRCMF_RXREORDER_FLAGS_OFFSET 4 ---#define BRCMF_RXREORDER_CURIDX_OFFSET 6 ---#define BRCMF_RXREORDER_EXPIDX_OFFSET 8 --- ---#define BRCMF_RXREORDER_DEL_FLOW 0x01 ---#define BRCMF_RXREORDER_FLUSH_ALL 0x02 ---#define BRCMF_RXREORDER_CURIDX_VALID 0x04 ---#define BRCMF_RXREORDER_EXPIDX_VALID 0x08 ---#define BRCMF_RXREORDER_NEW_HOLE 0x10 --- -- #define BRCMF_BSSIDX_INVALID -1 -- -- char *brcmf_ifname(struct brcmf_if *ifp) --@@ -342,207 +329,11 @@ void brcmf_netif_rx(struct brcmf_if *ifp -- netif_rx_ni(skb); -- } -- ---static void brcmf_rxreorder_get_skb_list(struct brcmf_ampdu_rx_reorder *rfi, --- u8 start, u8 end, --- struct sk_buff_head *skb_list) ---{ --- /* initialize return list */ --- __skb_queue_head_init(skb_list); --- --- if (rfi->pend_pkts == 0) { --- brcmf_dbg(INFO, "no packets in reorder queue\n"); --- return; --- } --- --- do { --- if (rfi->pktslots[start]) { --- __skb_queue_tail(skb_list, rfi->pktslots[start]); --- rfi->pktslots[start] = NULL; --- } --- start++; --- if (start > rfi->max_idx) --- start = 0; --- } while (start != end); --- rfi->pend_pkts -= skb_queue_len(skb_list); ---} --- ---static void brcmf_rxreorder_process_info(struct brcmf_if *ifp, u8 *reorder_data, --- struct sk_buff *pkt) ---{ --- u8 flow_id, max_idx, cur_idx, exp_idx, end_idx; --- struct brcmf_ampdu_rx_reorder *rfi; --- struct sk_buff_head reorder_list; --- struct sk_buff *pnext; --- u8 flags; --- u32 buf_size; --- --- flow_id = reorder_data[BRCMF_RXREORDER_FLOWID_OFFSET]; --- flags = reorder_data[BRCMF_RXREORDER_FLAGS_OFFSET]; --- --- /* validate flags and flow id */ --- if (flags == 0xFF) { --- brcmf_err("invalid flags...so ignore this packet\n"); --- brcmf_netif_rx(ifp, pkt, false); --- return; --- } --- --- rfi = ifp->drvr->reorder_flows[flow_id]; --- if (flags & BRCMF_RXREORDER_DEL_FLOW) { --- brcmf_dbg(INFO, "flow-%d: delete\n", --- flow_id); --- --- if (rfi == NULL) { --- brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n", --- flow_id); --- brcmf_netif_rx(ifp, pkt, false); --- return; --- } --- --- brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, rfi->exp_idx, --- &reorder_list); --- /* add the last packet */ --- __skb_queue_tail(&reorder_list, pkt); --- kfree(rfi); --- ifp->drvr->reorder_flows[flow_id] = NULL; --- goto netif_rx; --- } --- /* from here on we need a flow reorder instance */ --- if (rfi == NULL) { --- buf_size = sizeof(*rfi); --- max_idx = reorder_data[BRCMF_RXREORDER_MAXIDX_OFFSET]; --- --- buf_size += (max_idx + 1) * sizeof(pkt); --- --- /* allocate space for flow reorder info */ --- brcmf_dbg(INFO, "flow-%d: start, maxidx %d\n", --- flow_id, max_idx); --- rfi = kzalloc(buf_size, GFP_ATOMIC); --- if (rfi == NULL) { --- brcmf_err("failed to alloc buffer\n"); --- brcmf_netif_rx(ifp, pkt, false); --- return; --- } --- --- ifp->drvr->reorder_flows[flow_id] = rfi; --- rfi->pktslots = (struct sk_buff **)(rfi+1); --- rfi->max_idx = max_idx; --- } --- if (flags & BRCMF_RXREORDER_NEW_HOLE) { --- if (rfi->pend_pkts) { --- brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, --- rfi->exp_idx, --- &reorder_list); --- WARN_ON(rfi->pend_pkts); --- } else { --- __skb_queue_head_init(&reorder_list); --- } --- rfi->cur_idx = reorder_data[BRCMF_RXREORDER_CURIDX_OFFSET]; --- rfi->exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; --- rfi->max_idx = reorder_data[BRCMF_RXREORDER_MAXIDX_OFFSET]; --- rfi->pktslots[rfi->cur_idx] = pkt; --- rfi->pend_pkts++; --- brcmf_dbg(DATA, "flow-%d: new hole %d (%d), pending %d\n", --- flow_id, rfi->cur_idx, rfi->exp_idx, rfi->pend_pkts); --- } else if (flags & BRCMF_RXREORDER_CURIDX_VALID) { --- cur_idx = reorder_data[BRCMF_RXREORDER_CURIDX_OFFSET]; --- exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; --- --- if ((exp_idx == rfi->exp_idx) && (cur_idx != rfi->exp_idx)) { --- /* still in the current hole */ --- /* enqueue the current on the buffer chain */ --- if (rfi->pktslots[cur_idx] != NULL) { --- brcmf_dbg(INFO, "HOLE: ERROR buffer pending..free it\n"); --- brcmu_pkt_buf_free_skb(rfi->pktslots[cur_idx]); --- rfi->pktslots[cur_idx] = NULL; --- } --- rfi->pktslots[cur_idx] = pkt; --- rfi->pend_pkts++; --- rfi->cur_idx = cur_idx; --- brcmf_dbg(DATA, "flow-%d: store pkt %d (%d), pending %d\n", --- flow_id, cur_idx, exp_idx, rfi->pend_pkts); --- --- /* can return now as there is no reorder --- * list to process. --- */ --- return; --- } --- if (rfi->exp_idx == cur_idx) { --- if (rfi->pktslots[cur_idx] != NULL) { --- brcmf_dbg(INFO, "error buffer pending..free it\n"); --- brcmu_pkt_buf_free_skb(rfi->pktslots[cur_idx]); --- rfi->pktslots[cur_idx] = NULL; --- } --- rfi->pktslots[cur_idx] = pkt; --- rfi->pend_pkts++; --- --- /* got the expected one. flush from current to expected --- * and update expected --- */ --- brcmf_dbg(DATA, "flow-%d: expected %d (%d), pending %d\n", --- flow_id, cur_idx, exp_idx, rfi->pend_pkts); --- --- rfi->cur_idx = cur_idx; --- rfi->exp_idx = exp_idx; --- --- brcmf_rxreorder_get_skb_list(rfi, cur_idx, exp_idx, --- &reorder_list); --- brcmf_dbg(DATA, "flow-%d: freeing buffers %d, pending %d\n", --- flow_id, skb_queue_len(&reorder_list), --- rfi->pend_pkts); --- } else { --- u8 end_idx; --- --- brcmf_dbg(DATA, "flow-%d (0x%x): both moved, old %d/%d, new %d/%d\n", --- flow_id, flags, rfi->cur_idx, rfi->exp_idx, --- cur_idx, exp_idx); --- if (flags & BRCMF_RXREORDER_FLUSH_ALL) --- end_idx = rfi->exp_idx; --- else --- end_idx = exp_idx; --- --- /* flush pkts first */ --- brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, end_idx, --- &reorder_list); --- --- if (exp_idx == ((cur_idx + 1) % (rfi->max_idx + 1))) { --- __skb_queue_tail(&reorder_list, pkt); --- } else { --- rfi->pktslots[cur_idx] = pkt; --- rfi->pend_pkts++; --- } --- rfi->exp_idx = exp_idx; --- rfi->cur_idx = cur_idx; --- } --- } else { --- /* explicity window move updating the expected index */ --- exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; --- --- brcmf_dbg(DATA, "flow-%d (0x%x): change expected: %d -> %d\n", --- flow_id, flags, rfi->exp_idx, exp_idx); --- if (flags & BRCMF_RXREORDER_FLUSH_ALL) --- end_idx = rfi->exp_idx; --- else --- end_idx = exp_idx; --- --- brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, end_idx, --- &reorder_list); --- __skb_queue_tail(&reorder_list, pkt); --- /* set the new expected idx */ --- rfi->exp_idx = exp_idx; --- } ---netif_rx: --- skb_queue_walk_safe(&reorder_list, pkt, pnext) { --- __skb_unlink(pkt, &reorder_list); --- brcmf_netif_rx(ifp, pkt, false); --- } ---} --- -- void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt) -- { -- struct brcmf_if *ifp; -- struct brcmf_bus *bus_if = dev_get_drvdata(dev); -- struct brcmf_pub *drvr = bus_if->drvr; --- struct brcmf_skb_reorder_data *rd; -- int ret; -- -- brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb); --@@ -557,9 +348,8 @@ void brcmf_rx_frame(struct device *dev, -- return; -- } -- --- rd = (struct brcmf_skb_reorder_data *)skb->cb; --- if (rd->reorder) --- brcmf_rxreorder_process_info(ifp, rd->reorder, skb); --+ if (brcmf_proto_is_reorder_skb(skb)) --+ brcmf_proto_rxreorder(ifp, skb); -- else -- brcmf_netif_rx(ifp, skb, handle_evnt); -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -208,10 +208,6 @@ struct brcmf_if { -- u8 ipv6addr_idx; -- }; -- ---struct brcmf_skb_reorder_data { --- u8 *reorder; ---}; --- -- int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp); -- -- /* Return pointer to interface name */ ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c --@@ -92,6 +92,19 @@ enum brcmf_fws_tlv_len { -- }; -- #undef BRCMF_FWS_TLV_DEF -- --+/* AMPDU rx reordering definitions */ --+#define BRCMF_RXREORDER_FLOWID_OFFSET 0 --+#define BRCMF_RXREORDER_MAXIDX_OFFSET 2 --+#define BRCMF_RXREORDER_FLAGS_OFFSET 4 --+#define BRCMF_RXREORDER_CURIDX_OFFSET 6 --+#define BRCMF_RXREORDER_EXPIDX_OFFSET 8 --+ --+#define BRCMF_RXREORDER_DEL_FLOW 0x01 --+#define BRCMF_RXREORDER_FLUSH_ALL 0x02 --+#define BRCMF_RXREORDER_CURIDX_VALID 0x04 --+#define BRCMF_RXREORDER_EXPIDX_VALID 0x08 --+#define BRCMF_RXREORDER_NEW_HOLE 0x10 --+ -- #ifdef DEBUG -- /* -- * brcmf_fws_tlv_names - array of tlv names. --@@ -1614,6 +1627,202 @@ static int brcmf_fws_notify_bcmc_credit_ -- return 0; -- } -- --+static void brcmf_rxreorder_get_skb_list(struct brcmf_ampdu_rx_reorder *rfi, --+ u8 start, u8 end, --+ struct sk_buff_head *skb_list) --+{ --+ /* initialize return list */ --+ __skb_queue_head_init(skb_list); --+ --+ if (rfi->pend_pkts == 0) { --+ brcmf_dbg(INFO, "no packets in reorder queue\n"); --+ return; --+ } --+ --+ do { --+ if (rfi->pktslots[start]) { --+ __skb_queue_tail(skb_list, rfi->pktslots[start]); --+ rfi->pktslots[start] = NULL; --+ } --+ start++; --+ if (start > rfi->max_idx) --+ start = 0; --+ } while (start != end); --+ rfi->pend_pkts -= skb_queue_len(skb_list); --+} --+ --+void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *pkt) --+{ --+ u8 *reorder_data; --+ u8 flow_id, max_idx, cur_idx, exp_idx, end_idx; --+ struct brcmf_ampdu_rx_reorder *rfi; --+ struct sk_buff_head reorder_list; --+ struct sk_buff *pnext; --+ u8 flags; --+ u32 buf_size; --+ --+ reorder_data = ((struct brcmf_skb_reorder_data *)pkt->cb)->reorder; --+ flow_id = reorder_data[BRCMF_RXREORDER_FLOWID_OFFSET]; --+ flags = reorder_data[BRCMF_RXREORDER_FLAGS_OFFSET]; --+ --+ /* validate flags and flow id */ --+ if (flags == 0xFF) { --+ brcmf_err("invalid flags...so ignore this packet\n"); --+ brcmf_netif_rx(ifp, pkt, false); --+ return; --+ } --+ --+ rfi = ifp->drvr->reorder_flows[flow_id]; --+ if (flags & BRCMF_RXREORDER_DEL_FLOW) { --+ brcmf_dbg(INFO, "flow-%d: delete\n", --+ flow_id); --+ --+ if (rfi == NULL) { --+ brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n", --+ flow_id); --+ brcmf_netif_rx(ifp, pkt, false); --+ return; --+ } --+ --+ brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, rfi->exp_idx, --+ &reorder_list); --+ /* add the last packet */ --+ __skb_queue_tail(&reorder_list, pkt); --+ kfree(rfi); --+ ifp->drvr->reorder_flows[flow_id] = NULL; --+ goto netif_rx; --+ } --+ /* from here on we need a flow reorder instance */ --+ if (rfi == NULL) { --+ buf_size = sizeof(*rfi); --+ max_idx = reorder_data[BRCMF_RXREORDER_MAXIDX_OFFSET]; --+ --+ buf_size += (max_idx + 1) * sizeof(pkt); --+ --+ /* allocate space for flow reorder info */ --+ brcmf_dbg(INFO, "flow-%d: start, maxidx %d\n", --+ flow_id, max_idx); --+ rfi = kzalloc(buf_size, GFP_ATOMIC); --+ if (rfi == NULL) { --+ brcmf_err("failed to alloc buffer\n"); --+ brcmf_netif_rx(ifp, pkt, false); --+ return; --+ } --+ --+ ifp->drvr->reorder_flows[flow_id] = rfi; --+ rfi->pktslots = (struct sk_buff **)(rfi + 1); --+ rfi->max_idx = max_idx; --+ } --+ if (flags & BRCMF_RXREORDER_NEW_HOLE) { --+ if (rfi->pend_pkts) { --+ brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, --+ rfi->exp_idx, --+ &reorder_list); --+ WARN_ON(rfi->pend_pkts); --+ } else { --+ __skb_queue_head_init(&reorder_list); --+ } --+ rfi->cur_idx = reorder_data[BRCMF_RXREORDER_CURIDX_OFFSET]; --+ rfi->exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; --+ rfi->max_idx = reorder_data[BRCMF_RXREORDER_MAXIDX_OFFSET]; --+ rfi->pktslots[rfi->cur_idx] = pkt; --+ rfi->pend_pkts++; --+ brcmf_dbg(DATA, "flow-%d: new hole %d (%d), pending %d\n", --+ flow_id, rfi->cur_idx, rfi->exp_idx, rfi->pend_pkts); --+ } else if (flags & BRCMF_RXREORDER_CURIDX_VALID) { --+ cur_idx = reorder_data[BRCMF_RXREORDER_CURIDX_OFFSET]; --+ exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; --+ --+ if ((exp_idx == rfi->exp_idx) && (cur_idx != rfi->exp_idx)) { --+ /* still in the current hole */ --+ /* enqueue the current on the buffer chain */ --+ if (rfi->pktslots[cur_idx] != NULL) { --+ brcmf_dbg(INFO, "HOLE: ERROR buffer pending..free it\n"); --+ brcmu_pkt_buf_free_skb(rfi->pktslots[cur_idx]); --+ rfi->pktslots[cur_idx] = NULL; --+ } --+ rfi->pktslots[cur_idx] = pkt; --+ rfi->pend_pkts++; --+ rfi->cur_idx = cur_idx; --+ brcmf_dbg(DATA, "flow-%d: store pkt %d (%d), pending %d\n", --+ flow_id, cur_idx, exp_idx, rfi->pend_pkts); --+ --+ /* can return now as there is no reorder --+ * list to process. --+ */ --+ return; --+ } --+ if (rfi->exp_idx == cur_idx) { --+ if (rfi->pktslots[cur_idx] != NULL) { --+ brcmf_dbg(INFO, "error buffer pending..free it\n"); --+ brcmu_pkt_buf_free_skb(rfi->pktslots[cur_idx]); --+ rfi->pktslots[cur_idx] = NULL; --+ } --+ rfi->pktslots[cur_idx] = pkt; --+ rfi->pend_pkts++; --+ --+ /* got the expected one. flush from current to expected --+ * and update expected --+ */ --+ brcmf_dbg(DATA, "flow-%d: expected %d (%d), pending %d\n", --+ flow_id, cur_idx, exp_idx, rfi->pend_pkts); --+ --+ rfi->cur_idx = cur_idx; --+ rfi->exp_idx = exp_idx; --+ --+ brcmf_rxreorder_get_skb_list(rfi, cur_idx, exp_idx, --+ &reorder_list); --+ brcmf_dbg(DATA, "flow-%d: freeing buffers %d, pending %d\n", --+ flow_id, skb_queue_len(&reorder_list), --+ rfi->pend_pkts); --+ } else { --+ u8 end_idx; --+ --+ brcmf_dbg(DATA, "flow-%d (0x%x): both moved, old %d/%d, new %d/%d\n", --+ flow_id, flags, rfi->cur_idx, rfi->exp_idx, --+ cur_idx, exp_idx); --+ if (flags & BRCMF_RXREORDER_FLUSH_ALL) --+ end_idx = rfi->exp_idx; --+ else --+ end_idx = exp_idx; --+ --+ /* flush pkts first */ --+ brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, end_idx, --+ &reorder_list); --+ --+ if (exp_idx == ((cur_idx + 1) % (rfi->max_idx + 1))) { --+ __skb_queue_tail(&reorder_list, pkt); --+ } else { --+ rfi->pktslots[cur_idx] = pkt; --+ rfi->pend_pkts++; --+ } --+ rfi->exp_idx = exp_idx; --+ rfi->cur_idx = cur_idx; --+ } --+ } else { --+ /* explicity window move updating the expected index */ --+ exp_idx = reorder_data[BRCMF_RXREORDER_EXPIDX_OFFSET]; --+ --+ brcmf_dbg(DATA, "flow-%d (0x%x): change expected: %d -> %d\n", --+ flow_id, flags, rfi->exp_idx, exp_idx); --+ if (flags & BRCMF_RXREORDER_FLUSH_ALL) --+ end_idx = rfi->exp_idx; --+ else --+ end_idx = exp_idx; --+ --+ brcmf_rxreorder_get_skb_list(rfi, rfi->exp_idx, end_idx, --+ &reorder_list); --+ __skb_queue_tail(&reorder_list, pkt); --+ /* set the new expected idx */ --+ rfi->exp_idx = exp_idx; --+ } --+netif_rx: --+ skb_queue_walk_safe(&reorder_list, pkt, pnext) { --+ __skb_unlink(pkt, &reorder_list); --+ brcmf_netif_rx(ifp, pkt, false); --+ } --+} --+ -- void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb) -- { -- struct brcmf_skb_reorder_data *rd; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h --@@ -29,5 +29,6 @@ void brcmf_fws_add_interface(struct brcm -- void brcmf_fws_del_interface(struct brcmf_if *ifp); -- void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb); -- void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked); --+void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb); -- -- #endif /* FWSIGNAL_H_ */ ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --@@ -527,6 +527,9 @@ static int brcmf_msgbuf_hdrpull(struct b -- return -ENODEV; -- } -- --+static void brcmf_msgbuf_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb) --+{ --+} -- -- static void -- brcmf_msgbuf_remove_flowring(struct brcmf_msgbuf *msgbuf, u16 flowid) --@@ -1466,6 +1469,7 @@ int brcmf_proto_msgbuf_attach(struct brc -- drvr->proto->configure_addr_mode = brcmf_msgbuf_configure_addr_mode; -- drvr->proto->delete_peer = brcmf_msgbuf_delete_peer; -- drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer; --+ drvr->proto->rxreorder = brcmf_msgbuf_rxreorder; -- drvr->proto->pd = msgbuf; -- -- init_waitqueue_head(&msgbuf->ioctl_resp_wait); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h --@@ -22,6 +22,9 @@ enum proto_addr_mode { -- ADDR_DIRECT -- }; -- --+struct brcmf_skb_reorder_data { --+ u8 *reorder; --+}; -- -- struct brcmf_proto { -- int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, --@@ -38,6 +41,7 @@ struct brcmf_proto { -- u8 peer[ETH_ALEN]); -- void (*add_tdls_peer)(struct brcmf_pub *drvr, int ifidx, -- u8 peer[ETH_ALEN]); --+ void (*rxreorder)(struct brcmf_if *ifp, struct sk_buff *skb); -- void *pd; -- }; -- --@@ -91,6 +95,18 @@ brcmf_proto_add_tdls_peer(struct brcmf_p -- { -- drvr->proto->add_tdls_peer(drvr, ifidx, peer); -- } --+static inline bool brcmf_proto_is_reorder_skb(struct sk_buff *skb) --+{ --+ struct brcmf_skb_reorder_data *rd; --+ --+ rd = (struct brcmf_skb_reorder_data *)skb->cb; --+ return !!rd->reorder; --+} -- --+static inline void --+brcmf_proto_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb) --+{ --+ ifp->drvr->proto->rxreorder(ifp, skb); --+} -- -- #endif /* BRCMFMAC_PROTO_H */ -diff --git a/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch b/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch -deleted file mode 100644 -index a43feffe1792c44e207908c21e314bfcf0378cf1..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/349-0007-brcmfmac-revise-handling-events-in-receive-path.patch -+++ /dev/null -@@ -1,139 +0,0 @@ --From: Arend van Spriel --Date: Mon, 11 Apr 2016 11:35:27 +0200 --Subject: [PATCH] brcmfmac: revise handling events in receive path -- --Move event handling out of brcmf_netif_rx() avoiding the need --to pass a flag. This flag is only ever true for USB hosts as --other interface use separate brcmf_rx_event() function. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h --@@ -216,7 +216,7 @@ bool brcmf_c_prec_enq(struct device *dev -- int prec); -- -- /* Receive frame for delivery to OS. Callee disposes of rxp. */ ---void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_evnt); --+void brcmf_rx_frame(struct device *dev, struct sk_buff *rxp, bool handle_event); -- /* Receive async event packet from firmware. Callee disposes of rxp. */ -- void brcmf_rx_event(struct device *dev, struct sk_buff *rxp); -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -298,18 +298,11 @@ void brcmf_txflowblock(struct device *de -- brcmf_fws_bus_blocked(drvr, state); -- } -- ---void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, --- bool handle_event) --+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb) -- { --- skb->protocol = eth_type_trans(skb, ifp->ndev); --- -- if (skb->pkt_type == PACKET_MULTICAST) -- ifp->stats.multicast++; -- --- /* Process special event packets */ --- if (handle_event) --- brcmf_fweh_process_skb(ifp->drvr, skb); --- -- if (!(ifp->ndev->flags & IFF_UP)) { -- brcmu_pkt_buf_free_skb(skb); -- return; --@@ -329,7 +322,7 @@ void brcmf_netif_rx(struct brcmf_if *ifp -- netif_rx_ni(skb); -- } -- ---void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_evnt) --+void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_event) -- { -- struct brcmf_if *ifp; -- struct brcmf_bus *bus_if = dev_get_drvdata(dev); --@@ -348,10 +341,17 @@ void brcmf_rx_frame(struct device *dev, -- return; -- } -- --- if (brcmf_proto_is_reorder_skb(skb)) --+ skb->protocol = eth_type_trans(skb, ifp->ndev); --+ --+ if (brcmf_proto_is_reorder_skb(skb)) { -- brcmf_proto_rxreorder(ifp, skb); --- else --- brcmf_netif_rx(ifp, skb, handle_evnt); --+ } else { --+ /* Process special event packets */ --+ if (handle_event) --+ brcmf_fweh_process_skb(ifp->drvr, skb); --+ --+ brcmf_netif_rx(ifp, skb); --+ } -- } -- -- void brcmf_rx_event(struct device *dev, struct sk_buff *skb) ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -221,8 +221,7 @@ int brcmf_get_next_free_bsscfgidx(struct -- void brcmf_txflowblock_if(struct brcmf_if *ifp, -- enum brcmf_netif_stop_reason reason, bool state); -- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); ---void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb, --- bool handle_event); --+void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb); -- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on); -- int __init brcmf_core_init(void); -- void __exit brcmf_core_exit(void); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c --@@ -1668,7 +1668,7 @@ void brcmf_fws_rxreorder(struct brcmf_if -- /* validate flags and flow id */ -- if (flags == 0xFF) { -- brcmf_err("invalid flags...so ignore this packet\n"); --- brcmf_netif_rx(ifp, pkt, false); --+ brcmf_netif_rx(ifp, pkt); -- return; -- } -- --@@ -1680,7 +1680,7 @@ void brcmf_fws_rxreorder(struct brcmf_if -- if (rfi == NULL) { -- brcmf_dbg(INFO, "received flags to cleanup, but no flow (%d) yet\n", -- flow_id); --- brcmf_netif_rx(ifp, pkt, false); --+ brcmf_netif_rx(ifp, pkt); -- return; -- } -- --@@ -1705,7 +1705,7 @@ void brcmf_fws_rxreorder(struct brcmf_if -- rfi = kzalloc(buf_size, GFP_ATOMIC); -- if (rfi == NULL) { -- brcmf_err("failed to alloc buffer\n"); --- brcmf_netif_rx(ifp, pkt, false); --+ brcmf_netif_rx(ifp, pkt); -- return; -- } -- --@@ -1819,7 +1819,7 @@ void brcmf_fws_rxreorder(struct brcmf_if -- netif_rx: -- skb_queue_walk_safe(&reorder_list, pkt, pnext) { -- __skb_unlink(pkt, &reorder_list); --- brcmf_netif_rx(ifp, pkt, false); --+ brcmf_netif_rx(ifp, pkt); -- } -- } -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --@@ -1157,7 +1157,7 @@ brcmf_msgbuf_process_rx_complete(struct -- brcmu_pkt_buf_free_skb(skb); -- return; -- } --- brcmf_netif_rx(ifp, skb, false); --+ brcmf_netif_rx(ifp, skb); -- } -- -- -diff --git a/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch b/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch -deleted file mode 100644 -index 08ea235fddc7caf06eb4b196c51765cd4adbee2f..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/349-0008-brcmfmac-create-common-function-for-handling-brcmf_p.patch -+++ /dev/null -@@ -1,88 +0,0 @@ --From: Arend van Spriel --Date: Mon, 11 Apr 2016 11:35:28 +0200 --Subject: [PATCH] brcmfmac: create common function for handling -- brcmf_proto_hdrpull() -- --In receive path brcmf_proto_hdrpull() needs to be called and handled --similar in brcmf_rx_frame() and brcmf_rx_event(). Move that duplicated --code in separate function. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -322,26 +322,35 @@ void brcmf_netif_rx(struct brcmf_if *ifp -- netif_rx_ni(skb); -- } -- ---void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_event) --+static int brcmf_rx_hdrpull(struct brcmf_pub *drvr, struct sk_buff *skb, --+ struct brcmf_if **ifp) -- { --- struct brcmf_if *ifp; --- struct brcmf_bus *bus_if = dev_get_drvdata(dev); --- struct brcmf_pub *drvr = bus_if->drvr; -- int ret; -- --- brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb); --- -- /* process and remove protocol-specific header */ --- ret = brcmf_proto_hdrpull(drvr, true, skb, &ifp); --+ ret = brcmf_proto_hdrpull(drvr, true, skb, ifp); -- --- if (ret || !ifp || !ifp->ndev) { --+ if (ret || !(*ifp) || !(*ifp)->ndev) { -- if (ret != -ENODATA && ifp) --- ifp->stats.rx_errors++; --+ (*ifp)->stats.rx_errors++; -- brcmu_pkt_buf_free_skb(skb); --- return; --+ return -ENODATA; -- } -- --- skb->protocol = eth_type_trans(skb, ifp->ndev); --+ skb->protocol = eth_type_trans(skb, (*ifp)->ndev); --+ return 0; --+} --+ --+void brcmf_rx_frame(struct device *dev, struct sk_buff *skb, bool handle_event) --+{ --+ struct brcmf_if *ifp; --+ struct brcmf_bus *bus_if = dev_get_drvdata(dev); --+ struct brcmf_pub *drvr = bus_if->drvr; --+ --+ brcmf_dbg(DATA, "Enter: %s: rxp=%p\n", dev_name(dev), skb); --+ --+ if (brcmf_rx_hdrpull(drvr, skb, &ifp)) --+ return; -- -- if (brcmf_proto_is_reorder_skb(skb)) { -- brcmf_proto_rxreorder(ifp, skb); --@@ -359,21 +368,11 @@ void brcmf_rx_event(struct device *dev, -- struct brcmf_if *ifp; -- struct brcmf_bus *bus_if = dev_get_drvdata(dev); -- struct brcmf_pub *drvr = bus_if->drvr; --- int ret; -- -- brcmf_dbg(EVENT, "Enter: %s: rxp=%p\n", dev_name(dev), skb); -- --- /* process and remove protocol-specific header */ --- ret = brcmf_proto_hdrpull(drvr, true, skb, &ifp); --- --- if (ret || !ifp || !ifp->ndev) { --- if (ret != -ENODATA && ifp) --- ifp->stats.rx_errors++; --- brcmu_pkt_buf_free_skb(skb); --+ if (brcmf_rx_hdrpull(drvr, skb, &ifp)) -- return; --- } --- --- skb->protocol = eth_type_trans(skb, ifp->ndev); -- -- brcmf_fweh_process_skb(ifp->drvr, skb); -- brcmu_pkt_buf_free_skb(skb); -diff --git a/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch b/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch -deleted file mode 100644 -index c602f2272a4a322d9e5246c517eecfc3a00e1db2..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0005-brcmfmac-rework-function-picking-free-BSS-index.patch -+++ /dev/null -@@ -1,119 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Thu, 26 May 2016 01:44:27 +0200 --Subject: [PATCH] brcmfmac: rework function picking free BSS index --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --The old implementation was overcomplicated and slightly bugged in some --corner cases. -- --Consider following state of BSS-es (limited to 6 for simplification): --drvr->iflist[0]: { bsscfgidx:0, ndev->name:wlan1, } --drvr->iflist[1]: (null) --drvr->iflist[2]: { bsscfgidx:2, ndev->name:wlan1-1, } --drvr->iflist[3]: { bsscfgidx:3, ndev->name:wlan1-2, } --drvr->iflist[4]: (null) --drvr->iflist[5]: (null) --In such case the next AP interface should bsscfgidx 4 (we don't use 1 as --it's reserved for P2P). -- --With old code the loop iterations were following: --[ifidx = 0] [bsscfgidx = 2] [highest = 2] --[ifidx = 1] [bsscfgidx = 2] [highest = 2] available = true --[ifidx = 2] [bsscfgidx = 2] [highest = 2] bsscfgidx = highest + 1 --[ifidx = 3] [bsscfgidx = 3] [highest = 2] bsscfgidx = highest + 1 --[ifidx = 4] [bsscfgidx = 3] [highest = 2] available = true --[ifidx = 5] [bsscfgidx = 3] [highest = 2] available = true --There were 2 obvious problems: --1) Having empty BSS at index 1 was resulting in available being always -- set to true, even if we would run out of BSS-es. --2) Calculated bsscfgidx was invalid (3 instead of 4) resulting in driver -- not being able to create the 4th AP interface. -- --New code is simpler, placed in file where it's really used, handles --running out of free BSS-es and allows using 4 interfaces at the same --time. It also looks for the first free BSS instead of one after the last --in use. It works well with current driver (which doesn't allow deleting --interfaces) and should be future proof (if we ever allow deleting). -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -527,6 +527,21 @@ brcmf_cfg80211_update_proto_addr_mode(st -- ADDR_INDIRECT); -- } -- --+static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr) --+{ --+ int bsscfgidx; --+ --+ for (bsscfgidx = 0; bsscfgidx < BRCMF_MAX_IFS; bsscfgidx++) { --+ /* bsscfgidx 1 is reserved for legacy P2P */ --+ if (bsscfgidx == 1) --+ continue; --+ if (!drvr->iflist[bsscfgidx]) --+ return bsscfgidx; --+ } --+ --+ return -ENOMEM; --+} --+ -- static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp) -- { -- struct brcmf_mbss_ssid_le mbss_ssid_le; --@@ -534,7 +549,7 @@ static int brcmf_cfg80211_request_ap_if( -- int err; -- -- memset(&mbss_ssid_le, 0, sizeof(mbss_ssid_le)); --- bsscfgidx = brcmf_get_next_free_bsscfgidx(ifp->drvr); --+ bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr); -- if (bsscfgidx < 0) -- return bsscfgidx; -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -753,30 +753,6 @@ void brcmf_remove_interface(struct brcmf -- brcmf_del_if(ifp->drvr, ifp->bsscfgidx); -- } -- ---int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr) ---{ --- int ifidx; --- int bsscfgidx; --- bool available; --- int highest; --- --- available = false; --- bsscfgidx = 2; --- highest = 2; --- for (ifidx = 0; ifidx < BRCMF_MAX_IFS; ifidx++) { --- if (drvr->iflist[ifidx]) { --- if (drvr->iflist[ifidx]->bsscfgidx == bsscfgidx) --- bsscfgidx = highest + 1; --- else if (drvr->iflist[ifidx]->bsscfgidx > highest) --- highest = drvr->iflist[ifidx]->bsscfgidx; --- } else { --- available = true; --- } --- } --- --- return available ? bsscfgidx : -ENOMEM; ---} --- -- #ifdef CONFIG_INET -- #define ARPOL_MAX_ENTRIES 8 -- static int brcmf_inetaddr_changed(struct notifier_block *nb, ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -217,7 +217,6 @@ int brcmf_net_attach(struct brcmf_if *if -- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, -- bool is_p2pdev, char *name, u8 *mac_addr); -- void brcmf_remove_interface(struct brcmf_if *ifp); ---int brcmf_get_next_free_bsscfgidx(struct brcmf_pub *drvr); -- void brcmf_txflowblock_if(struct brcmf_if *ifp, -- enum brcmf_netif_stop_reason reason, bool state); -- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); -diff --git a/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch b/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch -deleted file mode 100644 -index a79c9a2e93732d8c4c15af55387e378afd72001a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0007-brcmutil-add-field-storing-control-channel-to-the-st.patch -+++ /dev/null -@@ -1,244 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Fri, 20 May 2016 13:38:57 +0200 --Subject: [PATCH] brcmutil: add field storing control channel to the struct -- brcmu_chan --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Our d11 code supports encoding/decoding channel info into/from chanspec --format used by firmware. Current implementation is quite misleading --because of the way "chnum" field is used. --When encoding channel info, "chnum" has to be filled by a caller with --*center* channel number. However when decoding chanspec the same field --is filled with a *control* channel number. -- --1) This can be confusing. It's expected for information to be the same -- after encoding and decoding. --2) It doesn't allow accessing all info when decoding. Some functions may -- need to know both channel numbers, e.g. cfg80211 callback getting -- current channel. --Solve this by adding a separated field for control channel. -- --Signed-off-by: Rafał Miłecki --Reviewed-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -2689,7 +2689,7 @@ static s32 brcmf_inform_single_bss(struc -- if (!bi->ctl_ch) { -- ch.chspec = le16_to_cpu(bi->chanspec); -- cfg->d11inf.decchspec(&ch); --- bi->ctl_ch = ch.chnum; --+ bi->ctl_ch = ch.control_ch_num; -- } -- channel = bi->ctl_ch; -- --@@ -2807,7 +2807,7 @@ static s32 brcmf_inform_ibss(struct brcm -- else -- band = wiphy->bands[IEEE80211_BAND_5GHZ]; -- --- freq = ieee80211_channel_to_frequency(ch.chnum, band->band); --+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band); -- cfg->channel = freq; -- notify_channel = ieee80211_get_channel(wiphy, freq); -- --@@ -2817,7 +2817,7 @@ static s32 brcmf_inform_ibss(struct brcm -- notify_ielen = le32_to_cpu(bi->ie_length); -- notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100; -- --- brcmf_dbg(CONN, "channel: %d(%d)\n", ch.chnum, freq); --+ brcmf_dbg(CONN, "channel: %d(%d)\n", ch.control_ch_num, freq); -- brcmf_dbg(CONN, "capability: %X\n", notify_capability); -- brcmf_dbg(CONN, "beacon interval: %d\n", notify_interval); -- brcmf_dbg(CONN, "signal: %d\n", notify_signal); --@@ -5235,7 +5235,7 @@ brcmf_bss_roaming_done(struct brcmf_cfg8 -- else -- band = wiphy->bands[IEEE80211_BAND_5GHZ]; -- --- freq = ieee80211_channel_to_frequency(ch.chnum, band->band); --+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, band->band); -- notify_channel = ieee80211_get_channel(wiphy, freq); -- -- done: --@@ -5757,14 +5757,15 @@ static int brcmf_construct_chaninfo(stru -- channel = band->channels; -- index = band->n_channels; -- for (j = 0; j < band->n_channels; j++) { --- if (channel[j].hw_value == ch.chnum) { --+ if (channel[j].hw_value == ch.control_ch_num) { -- index = j; -- break; -- } -- } -- channel[index].center_freq = --- ieee80211_channel_to_frequency(ch.chnum, band->band); --- channel[index].hw_value = ch.chnum; --+ ieee80211_channel_to_frequency(ch.control_ch_num, --+ band->band); --+ channel[index].hw_value = ch.control_ch_num; -- -- /* assuming the chanspecs order is HT20, -- * HT40 upper, HT40 lower, and VHT80. --@@ -5866,7 +5867,7 @@ static int brcmf_enable_bw40_2g(struct b -- if (WARN_ON(ch.bw != BRCMU_CHAN_BW_40)) -- continue; -- for (j = 0; j < band->n_channels; j++) { --- if (band->channels[j].hw_value == ch.chnum) --+ if (band->channels[j].hw_value == ch.control_ch_num) -- break; -- } -- if (WARN_ON(j == band->n_channels)) ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -1246,7 +1246,7 @@ bool brcmf_p2p_scan_finding_common_chann -- if (!bi->ctl_ch) { -- ch.chspec = le16_to_cpu(bi->chanspec); -- cfg->d11inf.decchspec(&ch); --- bi->ctl_ch = ch.chnum; --+ bi->ctl_ch = ch.control_ch_num; -- } -- afx_hdl->peer_chan = bi->ctl_ch; -- brcmf_dbg(TRACE, "ACTION FRAME SCAN : Peer %pM found, channel : %d\n", --@@ -1385,7 +1385,7 @@ int brcmf_p2p_notify_action_frame_rx(str -- if (test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, -- &p2p->status) && -- (ether_addr_equal(afx_hdl->tx_dst_addr, e->addr))) { --- afx_hdl->peer_chan = ch.chnum; --+ afx_hdl->peer_chan = ch.control_ch_num; -- brcmf_dbg(INFO, "GON request: Peer found, channel=%d\n", -- afx_hdl->peer_chan); -- complete(&afx_hdl->act_frm_scan); --@@ -1428,7 +1428,7 @@ int brcmf_p2p_notify_action_frame_rx(str -- memcpy(&mgmt_frame->u, frame, mgmt_frame_len); -- mgmt_frame_len += offsetof(struct ieee80211_mgmt, u); -- --- freq = ieee80211_channel_to_frequency(ch.chnum, --+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, -- ch.band == BRCMU_CHAN_BAND_2G ? -- IEEE80211_BAND_2GHZ : -- IEEE80211_BAND_5GHZ); --@@ -1873,7 +1873,7 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere -- -- if (test_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, &p2p->status) && -- (ether_addr_equal(afx_hdl->tx_dst_addr, e->addr))) { --- afx_hdl->peer_chan = ch.chnum; --+ afx_hdl->peer_chan = ch.control_ch_num; -- brcmf_dbg(INFO, "PROBE REQUEST: Peer found, channel=%d\n", -- afx_hdl->peer_chan); -- complete(&afx_hdl->act_frm_scan); --@@ -1898,7 +1898,7 @@ s32 brcmf_p2p_notify_rx_mgmt_p2p_probere -- -- mgmt_frame = (u8 *)(rxframe + 1); -- mgmt_frame_len = e->datalen - sizeof(*rxframe); --- freq = ieee80211_channel_to_frequency(ch.chnum, --+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, -- ch.band == BRCMU_CHAN_BAND_2G ? -- IEEE80211_BAND_2GHZ : -- IEEE80211_BAND_5GHZ); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c --@@ -107,6 +107,7 @@ static void brcmu_d11n_decchspec(struct -- u16 val; -- -- ch->chnum = (u8)(ch->chspec & BRCMU_CHSPEC_CH_MASK); --+ ch->control_ch_num = ch->chnum; -- -- switch (ch->chspec & BRCMU_CHSPEC_D11N_BW_MASK) { -- case BRCMU_CHSPEC_D11N_BW_20: --@@ -118,10 +119,10 @@ static void brcmu_d11n_decchspec(struct -- val = ch->chspec & BRCMU_CHSPEC_D11N_SB_MASK; -- if (val == BRCMU_CHSPEC_D11N_SB_L) { -- ch->sb = BRCMU_CHAN_SB_L; --- ch->chnum -= CH_10MHZ_APART; --+ ch->control_ch_num -= CH_10MHZ_APART; -- } else { -- ch->sb = BRCMU_CHAN_SB_U; --- ch->chnum += CH_10MHZ_APART; --+ ch->control_ch_num += CH_10MHZ_APART; -- } -- break; -- default: --@@ -147,6 +148,7 @@ static void brcmu_d11ac_decchspec(struct -- u16 val; -- -- ch->chnum = (u8)(ch->chspec & BRCMU_CHSPEC_CH_MASK); --+ ch->control_ch_num = ch->chnum; -- -- switch (ch->chspec & BRCMU_CHSPEC_D11AC_BW_MASK) { -- case BRCMU_CHSPEC_D11AC_BW_20: --@@ -158,10 +160,10 @@ static void brcmu_d11ac_decchspec(struct -- val = ch->chspec & BRCMU_CHSPEC_D11AC_SB_MASK; -- if (val == BRCMU_CHSPEC_D11AC_SB_L) { -- ch->sb = BRCMU_CHAN_SB_L; --- ch->chnum -= CH_10MHZ_APART; --+ ch->control_ch_num -= CH_10MHZ_APART; -- } else if (val == BRCMU_CHSPEC_D11AC_SB_U) { -- ch->sb = BRCMU_CHAN_SB_U; --- ch->chnum += CH_10MHZ_APART; --+ ch->control_ch_num += CH_10MHZ_APART; -- } else { -- WARN_ON_ONCE(1); -- } --@@ -172,16 +174,16 @@ static void brcmu_d11ac_decchspec(struct -- BRCMU_CHSPEC_D11AC_SB_SHIFT); -- switch (ch->sb) { -- case BRCMU_CHAN_SB_LL: --- ch->chnum -= CH_30MHZ_APART; --+ ch->control_ch_num -= CH_30MHZ_APART; -- break; -- case BRCMU_CHAN_SB_LU: --- ch->chnum -= CH_10MHZ_APART; --+ ch->control_ch_num -= CH_10MHZ_APART; -- break; -- case BRCMU_CHAN_SB_UL: --- ch->chnum += CH_10MHZ_APART; --+ ch->control_ch_num += CH_10MHZ_APART; -- break; -- case BRCMU_CHAN_SB_UU: --- ch->chnum += CH_30MHZ_APART; --+ ch->control_ch_num += CH_30MHZ_APART; -- break; -- default: -- WARN_ON_ONCE(1); ----- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_d11.h --+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_d11.h --@@ -125,14 +125,36 @@ enum brcmu_chan_sb { -- BRCMU_CHAN_SB_UU = BRCMU_CHAN_SB_LUU, -- }; -- --+/** --+ * struct brcmu_chan - stores channel formats --+ * --+ * This structure can be used with functions translating chanspec into generic --+ * channel info and the other way. --+ * --+ * @chspec: firmware specific format --+ * @chnum: center channel number --+ * @control_ch_num: control channel number --+ * @band: frequency band --+ * @bw: channel width --+ * @sb: control sideband (location of control channel against the center one) --+ */ -- struct brcmu_chan { -- u16 chspec; -- u8 chnum; --+ u8 control_ch_num; -- u8 band; -- enum brcmu_chan_bw bw; -- enum brcmu_chan_sb sb; -- }; -- --+/** --+ * struct brcmu_d11inf - provides functions translating channel format --+ * --+ * @io_type: determines version of channel format used by firmware --+ * @encchspec: encodes channel info into a chanspec, requires center channel --+ * number, ignores control one --+ * @decchspec: decodes chanspec into generic info --+ */ -- struct brcmu_d11inf { -- u8 io_type; -- -diff --git a/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch b/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch -deleted file mode 100644 -index 2c536d178d6746aca311d6ce16421a609061a3ad..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0008-brcmfmac-support-get_channel-cfg80211-callback.patch -+++ /dev/null -@@ -1,94 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Fri, 20 May 2016 13:38:58 +0200 --Subject: [PATCH] brcmfmac: support get_channel cfg80211 callback --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This is important for brcmfmac as some of released firmwares (e.g. --brcmfmac4366b-pcie.bin) may pick different channel than requested. This --has been tested with BCM4366B1 in D-Link DIR-885L. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -4847,6 +4847,68 @@ exit: -- return err; -- } -- --+static int brcmf_cfg80211_get_channel(struct wiphy *wiphy, --+ struct wireless_dev *wdev, --+ struct cfg80211_chan_def *chandef) --+{ --+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); --+ struct net_device *ndev = wdev->netdev; --+ struct brcmf_if *ifp; --+ struct brcmu_chan ch; --+ enum nl80211_band band = 0; --+ enum nl80211_chan_width width = 0; --+ u32 chanspec; --+ int freq, err; --+ --+ if (!ndev) --+ return -ENODEV; --+ ifp = netdev_priv(ndev); --+ --+ err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec); --+ if (err) { --+ brcmf_err("chanspec failed (%d)\n", err); --+ return err; --+ } --+ --+ ch.chspec = chanspec; --+ cfg->d11inf.decchspec(&ch); --+ --+ switch (ch.band) { --+ case BRCMU_CHAN_BAND_2G: --+ band = NL80211_BAND_2GHZ; --+ break; --+ case BRCMU_CHAN_BAND_5G: --+ band = NL80211_BAND_5GHZ; --+ break; --+ } --+ --+ switch (ch.bw) { --+ case BRCMU_CHAN_BW_80: --+ width = NL80211_CHAN_WIDTH_80; --+ break; --+ case BRCMU_CHAN_BW_40: --+ width = NL80211_CHAN_WIDTH_40; --+ break; --+ case BRCMU_CHAN_BW_20: --+ width = NL80211_CHAN_WIDTH_20; --+ break; --+ case BRCMU_CHAN_BW_80P80: --+ width = NL80211_CHAN_WIDTH_80P80; --+ break; --+ case BRCMU_CHAN_BW_160: --+ width = NL80211_CHAN_WIDTH_160; --+ break; --+ } --+ --+ freq = ieee80211_channel_to_frequency(ch.control_ch_num, band); --+ chandef->chan = ieee80211_get_channel(wiphy, freq); --+ chandef->width = width; --+ chandef->center_freq1 = ieee80211_channel_to_frequency(ch.chnum, band); --+ chandef->center_freq2 = 0; --+ --+ return 0; --+} --+ -- static int brcmf_cfg80211_crit_proto_start(struct wiphy *wiphy, -- struct wireless_dev *wdev, -- enum nl80211_crit_proto_id proto, --@@ -5009,6 +5071,7 @@ static struct cfg80211_ops brcmf_cfg8021 -- .mgmt_tx = brcmf_cfg80211_mgmt_tx, -- .remain_on_channel = brcmf_p2p_remain_on_channel, -- .cancel_remain_on_channel = brcmf_cfg80211_cancel_remain_on_channel, --+ .get_channel = brcmf_cfg80211_get_channel, -- .start_p2p_device = brcmf_p2p_start_device, -- .stop_p2p_device = brcmf_p2p_stop_device, -- .crit_proto_start = brcmf_cfg80211_crit_proto_start, -diff --git a/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch b/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch -deleted file mode 100644 -index 1b119b2c8599e26de399c7d0174b5ef0be02067d..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0009-brcmfmac-print-errors-if-creating-interface-fails.patch -+++ /dev/null -@@ -1,59 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Fri, 27 May 2016 10:54:28 +0200 --Subject: [PATCH] brcmfmac: print errors if creating interface fails -- --This is helpful for debugging. Without this all I was getting from "iw" --command on failed creating of P2P interface was: --> command failed: Too many open files in system (-23) -- --Signed-off-by: Rafal Milecki --[arend@broadcom.com: reduce error prints upon iface creation] --Signed-off-by: Arend van Spriel --Reviewed-by: Julian Calaby --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -670,20 +670,24 @@ static struct wireless_dev *brcmf_cfg802 -- return ERR_PTR(-EOPNOTSUPP); -- case NL80211_IFTYPE_AP: -- wdev = brcmf_ap_add_vif(wiphy, name, flags, params); --- if (!IS_ERR(wdev)) --- brcmf_cfg80211_update_proto_addr_mode(wdev); --- return wdev; --+ break; -- case NL80211_IFTYPE_P2P_CLIENT: -- case NL80211_IFTYPE_P2P_GO: -- case NL80211_IFTYPE_P2P_DEVICE: -- wdev = brcmf_p2p_add_vif(wiphy, name, name_assign_type, type, flags, params); --- if (!IS_ERR(wdev)) --- brcmf_cfg80211_update_proto_addr_mode(wdev); --- return wdev; --+ break; -- case NL80211_IFTYPE_UNSPECIFIED: -- default: -- return ERR_PTR(-EINVAL); -- } --+ --+ if (IS_ERR(wdev)) --+ brcmf_err("add iface %s type %d failed: err=%d\n", --+ name, type, (int)PTR_ERR(wdev)); --+ else --+ brcmf_cfg80211_update_proto_addr_mode(wdev); --+ --+ return wdev; -- } -- -- static void brcmf_scan_config_mpc(struct brcmf_if *ifp, int mpc) ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -2030,8 +2030,6 @@ static int brcmf_p2p_request_p2p_if(stru -- -- err = brcmf_fil_iovar_data_set(ifp, "p2p_ifadd", &if_request, -- sizeof(if_request)); --- if (err) --- return err; -- -- return err; -- } -diff --git a/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch b/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch -deleted file mode 100644 -index a2e18a5fe994ed40619f5f12e936765ffeec2314..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0010-brcmfmac-fix-setting-AP-channel-with-new-firmwares.patch -+++ /dev/null -@@ -1,114 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Fri, 27 May 2016 21:07:19 +0200 --Subject: [PATCH] brcmfmac: fix setting AP channel with new firmwares --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Firmware for new chipsets is based on a new major version of code --internally maintained at Broadcom. E.g. brcmfmac4366b-pcie.bin (used for --BCM4366B1) is based on 10.10.69.3309 while brcmfmac43602-pcie.ap.bin was --based on 7.35.177.56. -- --Currently setting AP 5 GHz channel doesn't work reliably with BCM4366B1. --When setting e.g. 36 control channel with VHT80 (center channel 42) --firmware may randomly pick one of: --1) 52 control channel with 58 as center one --2) 100 control channel with 106 as center one --3) 116 control channel with 122 as center one --4) 149 control channel with 155 as center one -- --It seems new firmwares require setting AP mode (BRCMF_C_SET_AP) before --specifying a channel. Changing an order of firmware calls fixes the --problem. This requirement resulted in two separated "chanspec" calls, --one in AP code path and one in P2P path. -- --This fix was verified with BCM4366B1 and tested for regressions on --BCM43602. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -4382,7 +4382,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- struct brcmf_join_params join_params; -- enum nl80211_iftype dev_role; -- struct brcmf_fil_bss_enable_le bss_enable; --- u16 chanspec; --+ u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef); -- bool mbss; -- int is_11d; -- --@@ -4458,16 +4458,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- -- brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); -- --+ /* Parameters shared by all radio interfaces */ -- if (!mbss) { --- chanspec = chandef_to_chanspec(&cfg->d11inf, --- &settings->chandef); --- err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); --- if (err < 0) { --- brcmf_err("Set Channel failed: chspec=%d, %d\n", --- chanspec, err); --- goto exit; --- } --- -- if (is_11d != ifp->vif->is_11d) { -- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY, -- is_11d); --@@ -4515,6 +4507,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- err = -EINVAL; -- goto exit; -- } --+ --+ /* Interface specific setup */ -- if (dev_role == NL80211_IFTYPE_AP) { -- if ((brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) && (!mbss)) -- brcmf_fil_iovar_int_set(ifp, "mbss", 1); --@@ -4524,6 +4518,17 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- brcmf_err("setting AP mode failed %d\n", err); -- goto exit; -- } --+ if (!mbss) { --+ /* Firmware 10.x requires setting channel after enabling --+ * AP and before bringing interface up. --+ */ --+ err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); --+ if (err < 0) { --+ brcmf_err("Set Channel failed: chspec=%d, %d\n", --+ chanspec, err); --+ goto exit; --+ } --+ } -- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); -- if (err < 0) { -- brcmf_err("BRCMF_C_UP error (%d)\n", err); --@@ -4545,7 +4550,13 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- goto exit; -- } -- brcmf_dbg(TRACE, "AP mode configuration complete\n"); --- } else { --+ } else if (dev_role == NL80211_IFTYPE_P2P_GO) { --+ err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); --+ if (err < 0) { --+ brcmf_err("Set Channel failed: chspec=%d, %d\n", --+ chanspec, err); --+ goto exit; --+ } -- err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le, -- sizeof(ssid_le)); -- if (err < 0) { --@@ -4562,7 +4573,10 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- } -- -- brcmf_dbg(TRACE, "GO mode configuration complete\n"); --+ } else { --+ WARN_ON(1); -- } --+ -- set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); -- brcmf_net_setcarrier(ifp, true); -- -diff --git a/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch b/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch -deleted file mode 100644 -index 167e4347d5ff00cf87cf352058723bd58e1468ce..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0011-brcmfmac-don-t-remove-interface-on-link-down-firmwar.patch -+++ /dev/null -@@ -1,60 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Mon, 30 May 2016 06:40:54 +0200 --Subject: [PATCH] brcmfmac: don't remove interface on link down firmware event --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --There are two firmware events we handle similarly in brcmfmac: --BRCMF_E_LINK and BRCMF_E_IF. The difference from firmware point of view --is that the first one means BSS remains present in the firmware. Trying --to (re)create it (e.g. when adding new virtual interface) will result in --an error. -- --Current code treats both events in a similar way. It removes Linux --interface for each of them. It works OK with e.g. BCM43602. Its firmware --generates both events for each interface. It means we get BRCMF_E_LINK --and remove interface. That is soon followed by BRCMF_E_IF which means --BSS was also removed in a firmware. The only downside of this is a --harmless error like: --[ 208.643180] brcmfmac: brcmf_fweh_call_event_handler: no interface object -- --Unfortunately BCM4366 firmware doesn't automatically remove BSS and so --it doesn't generate BRCMF_E_IF. In such case we incorrectly remove Linux --interface on BRCMF_E_LINK as BSS is still present in the firmware. It --results in an error when trying to re-create virtual interface, e.g.: --> iw phy phy1 interface add wlan1-1 type __ap --[ 3602.929199] brcmfmac: brcmf_ap_add_vif: timeout occurred --command failed: I/O error (-5) -- --With this patch we don't remove Linux interface while firmware keeps --BSS. Thanks to this we keep a consistent states of host driver and --device firmware. -- --Further improvement should be to mark BSS as disabled and remove --interface on BRCMF_E_LINK. Then we should add support for reusing --BSS-es. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -5372,7 +5372,6 @@ brcmf_notify_connect_status_ap(struct br -- struct net_device *ndev, -- const struct brcmf_event_msg *e, void *data) -- { --- struct brcmf_if *ifp = netdev_priv(ndev); -- static int generation; -- u32 event = e->event_code; -- u32 reason = e->reason; --@@ -5383,8 +5382,6 @@ brcmf_notify_connect_status_ap(struct br -- ndev != cfg_to_ndev(cfg)) { -- brcmf_dbg(CONN, "AP mode link down\n"); -- complete(&cfg->vif_disabled); --- if (ifp->vif->mbss) --- brcmf_remove_interface(ifp); -- return 0; -- } -- -diff --git a/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch b/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch -deleted file mode 100644 -index 28ef3a65fd6b28749308521bceb6d150fc42688d..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0017-brcmfmac-drop-unused-pm_block-vif-attribute.patch -+++ /dev/null -@@ -1,103 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Mon, 6 Jun 2016 23:03:55 +0200 --Subject: [PATCH] brcmfmac: drop unused pm_block vif attribute --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This attribute was added 3 years ago by --commit 3eacf866559c ("brcmfmac: introduce brcmf_cfg80211_vif structure") --but it remains unused since then. It seems we can safely drop it. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -587,7 +587,7 @@ struct wireless_dev *brcmf_ap_add_vif(st -- -- brcmf_dbg(INFO, "Adding vif \"%s\"\n", name); -- --- vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP, false); --+ vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_AP); -- if (IS_ERR(vif)) -- return (struct wireless_dev *)vif; -- --@@ -5098,8 +5098,7 @@ static struct cfg80211_ops brcmf_cfg8021 -- }; -- -- struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, --- enum nl80211_iftype type, --- bool pm_block) --+ enum nl80211_iftype type) -- { -- struct brcmf_cfg80211_vif *vif_walk; -- struct brcmf_cfg80211_vif *vif; --@@ -5114,8 +5113,6 @@ struct brcmf_cfg80211_vif *brcmf_alloc_v -- vif->wdev.wiphy = cfg->wiphy; -- vif->wdev.iftype = type; -- --- vif->pm_block = pm_block; --- -- brcmf_init_prof(&vif->profile); -- -- if (type == NL80211_IFTYPE_AP) { --@@ -6754,7 +6751,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802 -- init_vif_event(&cfg->vif_event); -- INIT_LIST_HEAD(&cfg->vif_list); -- --- vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION, false); --+ vif = brcmf_alloc_vif(cfg, NL80211_IFTYPE_STATION); -- if (IS_ERR(vif)) -- goto wiphy_out; -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --@@ -167,7 +167,6 @@ struct vif_saved_ie { -- * @wdev: wireless device. -- * @profile: profile information. -- * @sme_state: SME state using enum brcmf_vif_status bits. --- * @pm_block: power-management blocked. -- * @list: linked list. -- * @mgmt_rx_reg: registered rx mgmt frame types. -- * @mbss: Multiple BSS type, set if not first AP (not relevant for P2P). --@@ -177,7 +176,6 @@ struct brcmf_cfg80211_vif { -- struct wireless_dev wdev; -- struct brcmf_cfg80211_profile profile; -- unsigned long sme_state; --- bool pm_block; -- struct vif_saved_ie saved_ie; -- struct list_head list; -- u16 mgmt_rx_reg; --@@ -388,8 +386,7 @@ s32 brcmf_cfg80211_down(struct net_devic -- enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp); -- -- struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, --- enum nl80211_iftype type, --- bool pm_block); --+ enum nl80211_iftype type); -- void brcmf_free_vif(struct brcmf_cfg80211_vif *vif); -- -- s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag, ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -2074,8 +2074,7 @@ static struct wireless_dev *brcmf_p2p_cr -- if (p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif) -- return ERR_PTR(-ENOSPC); -- --- p2p_vif = brcmf_alloc_vif(p2p->cfg, NL80211_IFTYPE_P2P_DEVICE, --- false); --+ p2p_vif = brcmf_alloc_vif(p2p->cfg, NL80211_IFTYPE_P2P_DEVICE); -- if (IS_ERR(p2p_vif)) { -- brcmf_err("could not create discovery vif\n"); -- return (struct wireless_dev *)p2p_vif; --@@ -2175,7 +2174,7 @@ struct wireless_dev *brcmf_p2p_add_vif(s -- return ERR_PTR(-EOPNOTSUPP); -- } -- --- vif = brcmf_alloc_vif(cfg, type, false); --+ vif = brcmf_alloc_vif(cfg, type); -- if (IS_ERR(vif)) -- return (struct wireless_dev *)vif; -- brcmf_cfg80211_arm_vif_event(cfg, vif); -diff --git a/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch b/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch -deleted file mode 100644 -index 09547d8d3b5b021d920963a6280fe80a0a561a59..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0018-brcmfmac-include-required-headers-in-cfg80211.h.patch -+++ /dev/null -@@ -1,37 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 7 Jun 2016 08:20:21 +0200 --Subject: [PATCH] brcmfmac: include required headers in cfg80211.h --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Without this including cfg80211.h in a wrong order could result in: -- --drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:122:24: error: array type has incomplete element type -- struct brcmf_wsec_key key[BRCMF_MAX_DEFAULT_KEYS]; -- ^ --drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:291:24: error: field ‘p2p’ has incomplete type -- struct brcmf_p2p_info p2p; -- ^ --drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:297:27: error: field ‘pmk_list’ has incomplete type -- struct brcmf_pmk_list_le pmk_list; -- ^ --drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:317:28: error: field ‘assoclist’ has incomplete type -- struct brcmf_assoclist_le assoclist; -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --@@ -20,6 +20,9 @@ -- /* for brcmu_d11inf */ -- #include -- --+#include "fwil_types.h" --+#include "p2p.h" --+ -- #define WL_NUM_SCAN_MAX 10 -- #define WL_TLV_INFO_MAX 1024 -- #define WL_BSS_INFO_MAX 2048 -diff --git a/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch b/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch -deleted file mode 100644 -index 461e3dba5397f7b48f00ec984d4edfd108dbbbb6..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0019-brcmfmac-slightly-simplify-building-interface-combin.patch -+++ /dev/null -@@ -1,108 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 7 Jun 2016 21:10:18 +0200 --Subject: [PATCH] brcmfmac: slightly simplify building interface combinations --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This change reorders some operations in brcmf_setup_ifmodes in hope to --make it simpler: --1) It allocates arrays right before filling them. This way it's easier -- to follow requested array length as it's immediately followed by -- code filling it. It's easier to check e.g. why we need 4 entries for -- P2P. Other than that it deduplicates some checks (e.g. for P2P). --2) It reorders code to first prepare limits and then define a new combo. -- Previously this was mixed (e.g. we were setting num of channels -- before preparing limits). --3) It modifies mbss code to use i variable just like other combos do. -- --Signed-off-by: Rafał Miłecki --Acked-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -6208,29 +6208,15 @@ static int brcmf_setup_ifmodes(struct wi -- if (!combo) -- goto err; -- --- c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL); --- if (!c0_limits) --- goto err; --- --- if (p2p) { --- p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL); --- if (!p2p_limits) --- goto err; --- } --- --- if (mbss) { --- mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL); --- if (!mbss_limits) --- goto err; --- } --- -- wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | -- BIT(NL80211_IFTYPE_ADHOC) | -- BIT(NL80211_IFTYPE_AP); -- -- c = 0; -- i = 0; --- combo[c].num_different_channels = 1; --+ c0_limits = kcalloc(p2p ? 3 : 2, sizeof(*c0_limits), GFP_KERNEL); --+ if (!c0_limits) --+ goto err; -- c0_limits[i].max = 1; -- c0_limits[i++].types = BIT(NL80211_IFTYPE_STATION); -- if (p2p) { --@@ -6248,6 +6234,7 @@ static int brcmf_setup_ifmodes(struct wi -- c0_limits[i].max = 1; -- c0_limits[i++].types = BIT(NL80211_IFTYPE_AP); -- } --+ combo[c].num_different_channels = 1; -- combo[c].max_interfaces = i; -- combo[c].n_limits = i; -- combo[c].limits = c0_limits; --@@ -6255,7 +6242,9 @@ static int brcmf_setup_ifmodes(struct wi -- if (p2p) { -- c++; -- i = 0; --- combo[c].num_different_channels = 1; --+ p2p_limits = kcalloc(4, sizeof(*p2p_limits), GFP_KERNEL); --+ if (!p2p_limits) --+ goto err; -- p2p_limits[i].max = 1; -- p2p_limits[i++].types = BIT(NL80211_IFTYPE_STATION); -- p2p_limits[i].max = 1; --@@ -6264,6 +6253,7 @@ static int brcmf_setup_ifmodes(struct wi -- p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_CLIENT); -- p2p_limits[i].max = 1; -- p2p_limits[i++].types = BIT(NL80211_IFTYPE_P2P_DEVICE); --+ combo[c].num_different_channels = 1; -- combo[c].max_interfaces = i; -- combo[c].n_limits = i; -- combo[c].limits = p2p_limits; --@@ -6271,14 +6261,19 @@ static int brcmf_setup_ifmodes(struct wi -- -- if (mbss) { -- c++; --+ i = 0; --+ mbss_limits = kcalloc(1, sizeof(*mbss_limits), GFP_KERNEL); --+ if (!mbss_limits) --+ goto err; --+ mbss_limits[i].max = 4; --+ mbss_limits[i++].types = BIT(NL80211_IFTYPE_AP); -- combo[c].beacon_int_infra_match = true; -- combo[c].num_different_channels = 1; --- mbss_limits[0].max = 4; --- mbss_limits[0].types = BIT(NL80211_IFTYPE_AP); -- combo[c].max_interfaces = 4; --- combo[c].n_limits = 1; --+ combo[c].n_limits = i; -- combo[c].limits = mbss_limits; -- } --+ -- wiphy->n_iface_combinations = n_combos; -- wiphy->iface_combinations = combo; -- return 0; -diff --git a/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch b/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch -deleted file mode 100644 -index e991f32327d5fdb7a796ab0f8f3059487b6ebbe1..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0020-brcmfmac-fix-lockup-when-removing-P2P-interface-afte.patch -+++ /dev/null -@@ -1,160 +0,0 @@ --From b50ddfa8530e9b5f52e873fdd6ff04f327a88799 Mon Sep 17 00:00:00 2001 --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Fri, 17 Jun 2016 12:29:21 +0200 --Subject: [PATCH] brcmfmac: fix lockup when removing P2P interface after event -- timeout --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Removing P2P interface is handled by sending a proper request to the --firmware. On success firmware triggers an event and driver's handler --removes a matching interface. -- --However on event timeout we remove interface directly from the cfg80211 --callback. Current code doesn't handle this case correctly as it always --assumes rtnl to be unlocked. -- --Fix it by adding an extra rtnl_locked parameter to functions and calling --unregister_netdevice when needed. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- .../wireless/broadcom/brcm80211/brcmfmac/core.c | 29 +++++++++++++--------- -- .../wireless/broadcom/brcm80211/brcmfmac/core.h | 2 +- -- .../wireless/broadcom/brcm80211/brcmfmac/fweh.c | 2 +- -- .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 4 +-- -- 4 files changed, 21 insertions(+), 16 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -548,12 +548,16 @@ fail: -- return -EBADE; -- } -- ---static void brcmf_net_detach(struct net_device *ndev) --+static void brcmf_net_detach(struct net_device *ndev, bool rtnl_locked) -- { --- if (ndev->reg_state == NETREG_REGISTERED) --- unregister_netdev(ndev); --- else --+ if (ndev->reg_state == NETREG_REGISTERED) { --+ if (rtnl_locked) --+ unregister_netdevice(ndev); --+ else --+ unregister_netdev(ndev); --+ } else { -- brcmf_cfg80211_free_netdev(ndev); --+ } -- } -- -- void brcmf_net_setcarrier(struct brcmf_if *ifp, bool on) --@@ -651,7 +655,7 @@ struct brcmf_if *brcmf_add_if(struct brc -- brcmf_err("ERROR: netdev:%s already exists\n", -- ifp->ndev->name); -- netif_stop_queue(ifp->ndev); --- brcmf_net_detach(ifp->ndev); --+ brcmf_net_detach(ifp->ndev, false); -- drvr->iflist[bsscfgidx] = NULL; -- } else { -- brcmf_dbg(INFO, "netdev:%s ignore IF event\n", --@@ -699,7 +703,8 @@ struct brcmf_if *brcmf_add_if(struct brc -- return ifp; -- } -- ---static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx) --+static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx, --+ bool rtnl_locked) -- { -- struct brcmf_if *ifp; -- --@@ -729,7 +734,7 @@ static void brcmf_del_if(struct brcmf_pu -- cancel_work_sync(&ifp->multicast_work); -- cancel_work_sync(&ifp->ndoffload_work); -- } --- brcmf_net_detach(ifp->ndev); --+ brcmf_net_detach(ifp->ndev, rtnl_locked); -- } else { -- /* Only p2p device interfaces which get dynamically created -- * end up here. In this case the p2p module should be informed --@@ -743,14 +748,14 @@ static void brcmf_del_if(struct brcmf_pu -- } -- } -- ---void brcmf_remove_interface(struct brcmf_if *ifp) --+void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked) -- { -- if (!ifp || WARN_ON(ifp->drvr->iflist[ifp->bsscfgidx] != ifp)) -- return; -- brcmf_dbg(TRACE, "Enter, bsscfgidx=%d, ifidx=%d\n", ifp->bsscfgidx, -- ifp->ifidx); -- brcmf_fws_del_interface(ifp); --- brcmf_del_if(ifp->drvr, ifp->bsscfgidx); --+ brcmf_del_if(ifp->drvr, ifp->bsscfgidx, rtnl_locked); -- } -- -- #ifdef CONFIG_INET --@@ -1057,9 +1062,9 @@ fail: -- brcmf_fws_deinit(drvr); -- } -- if (ifp) --- brcmf_net_detach(ifp->ndev); --+ brcmf_net_detach(ifp->ndev, false); -- if (p2p_ifp) --- brcmf_net_detach(p2p_ifp->ndev); --+ brcmf_net_detach(p2p_ifp->ndev, false); -- drvr->iflist[0] = NULL; -- drvr->iflist[1] = NULL; -- if (drvr->settings->ignore_probe_fail) --@@ -1128,7 +1133,7 @@ void brcmf_detach(struct device *dev) -- -- /* make sure primary interface removed last */ -- for (i = BRCMF_MAX_IFS-1; i > -1; i--) --- brcmf_remove_interface(drvr->iflist[i]); --+ brcmf_remove_interface(drvr->iflist[i], false); -- -- brcmf_cfg80211_detach(drvr->config); -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -216,7 +216,7 @@ struct brcmf_if *brcmf_get_ifp(struct br -- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); -- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, -- bool is_p2pdev, char *name, u8 *mac_addr); ---void brcmf_remove_interface(struct brcmf_if *ifp); --+void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); -- void brcmf_txflowblock_if(struct brcmf_if *ifp, -- enum brcmf_netif_stop_reason reason, bool state); -- void brcmf_txfinalize(struct brcmf_if *ifp, struct sk_buff *txp, bool success); ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c --@@ -183,7 +183,7 @@ static void brcmf_fweh_handle_if_event(s -- err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data); -- -- if (ifp && ifevent->action == BRCMF_E_IF_DEL) --- brcmf_remove_interface(ifp); --+ brcmf_remove_interface(ifp, false); -- } -- -- /** ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -2289,7 +2289,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph -- err = 0; -- } -- if (err) --- brcmf_remove_interface(vif->ifp); --+ brcmf_remove_interface(vif->ifp, true); -- -- brcmf_cfg80211_arm_vif_event(cfg, NULL); -- if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) --@@ -2395,7 +2395,7 @@ void brcmf_p2p_detach(struct brcmf_p2p_i -- if (vif != NULL) { -- brcmf_p2p_cancel_remain_on_channel(vif->ifp); -- brcmf_p2p_deinit_discovery(p2p); --- brcmf_remove_interface(vif->ifp); --+ brcmf_remove_interface(vif->ifp, false); -- } -- /* just set it all to zero */ -- memset(p2p, 0, sizeof(*p2p)); -diff --git a/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch b/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch -deleted file mode 100644 -index ed65f4dc885d936cd7776009b5b04a2376e16dc5..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0021-brcmfmac-use-const-char-for-interface-name-in-brcmf_.patch -+++ /dev/null -@@ -1,39 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Fri, 17 Jun 2016 12:48:44 +0200 --Subject: [PATCH] brcmfmac: use const char * for interface name in brcmf_add_if --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This function can work just fine with const pointer, it only calls --alloc_netdev which take const as well. Moreover it makes this function --more flexible as some cfg80211 callback may provide const char * as --well, e.g. add_virtual_intf. This will be needed for more advanced --interface management. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -638,7 +638,7 @@ fail: -- } -- -- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, --- bool is_p2pdev, char *name, u8 *mac_addr) --+ bool is_p2pdev, const char *name, u8 *mac_addr) -- { -- struct brcmf_if *ifp; -- struct net_device *ndev; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -215,7 +215,7 @@ char *brcmf_ifname(struct brcmf_if *ifp) -- struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); -- int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); -- struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, --- bool is_p2pdev, char *name, u8 *mac_addr); --+ bool is_p2pdev, const char *name, u8 *mac_addr); -- void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); -- void brcmf_txflowblock_if(struct brcmf_if *ifp, -- enum brcmf_netif_stop_reason reason, bool state); -diff --git a/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch b/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch -deleted file mode 100644 -index ef35fab7d74b31ab2305ce881a4d45cba73337cc..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0022-brcmfmac-include-also-core.h-header-in-cfg80211.h.patch -+++ /dev/null -@@ -1,33 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Sat, 18 Jun 2016 18:49:38 +0200 --Subject: [PATCH] brcmfmac: include also core.h header in cfg80211.h --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This header provides two inline functions using struct brcmf_if so we --need core.h to avoid: -- --drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h: In function ‘ndev_to_prof’: --drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:368:13: error: dereferencing pointer to incomplete type -- return &ifp->vif->profile; -- ^ --drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h: In function ‘ndev_to_vif’: --drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h:374:12: error: dereferencing pointer to incomplete type -- return ifp->vif; -- ^ -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --@@ -20,6 +20,7 @@ -- /* for brcmu_d11inf */ -- #include -- --+#include "core.h" -- #include "fwil_types.h" -- #include "p2p.h" -- -diff --git a/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch b/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch -deleted file mode 100644 -index ab9a63443738dd8979cf415cd06b62ddb1a8d2cf..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0023-brcmfmac-add-missing-break-when-deleting-P2P_DEVICE.patch -+++ /dev/null -@@ -1,27 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Sun, 19 Jun 2016 01:55:57 +0200 --Subject: [PATCH] brcmfmac: add missing break when deleting P2P_DEVICE --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --We obviously don't want to fall through in that switch. With this change --1) We wait for event (triggered by p2p_disc) as expected --2) We remove interface manually on timeout --3) We return 0 on success instead of -ENOTSUPP -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -2263,6 +2263,8 @@ int brcmf_p2p_del_vif(struct wiphy *wiph -- return 0; -- brcmf_p2p_cancel_remain_on_channel(vif->ifp); -- brcmf_p2p_deinit_discovery(p2p); --+ break; --+ -- default: -- return -ENOTSUPP; -- } -diff --git a/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch b/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch -deleted file mode 100644 -index 6dd0c03e3dfe5c5ed3c310931040a14596de79f1..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0024-brcmfmac-delete-interface-directly-in-code-that-sent.patch -+++ /dev/null -@@ -1,75 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Wed, 29 Jun 2016 21:54:26 +0200 --Subject: [PATCH] brcmfmac: delete interface directly in code that sent fw -- request --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --So far when receiving event about in-firmware-interface removal our --event worker was notifying listener and afterwards it was removing Linux --interface. -- --First of all it was resulting in slightly unexpected order. The listener --(del_virtual_intf callback) was (usually) returning with success before --we even called unregister_netdev(ice). -- --Please note this couldn't be simply fixed by changing order of calls in --brcmf_fweh_handle_if_event as unregistering interface earlier could free --struct brcmf_if. -- --Another problem of current implementation are possible lockups. Focus on --the time slot between calling event handler and removing Linux --interface. During that time original caller may leave (unlocking rtnl --semaphore) *and* another call to the same code may be done (locking it --again). If that happens our event handler will stuck at removing Linux --interface, it won't handle another event and will block process holding --rtnl lock. -- --This can be simply solved by unregistering interface in a proper --callback, right after receiving confirmation event from firmware. This --only required modifying worker to don't unregister on its own if there --is someone waiting for the event. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.c --@@ -18,6 +18,7 @@ -- #include "brcmu_wifi.h" -- #include "brcmu_utils.h" -- --+#include "cfg80211.h" -- #include "core.h" -- #include "debug.h" -- #include "tracepoint.h" --@@ -182,8 +183,13 @@ static void brcmf_fweh_handle_if_event(s -- -- err = brcmf_fweh_call_event_handler(ifp, emsg->event_code, emsg, data); -- --- if (ifp && ifevent->action == BRCMF_E_IF_DEL) --- brcmf_remove_interface(ifp, false); --+ if (ifp && ifevent->action == BRCMF_E_IF_DEL) { --+ bool armed = brcmf_cfg80211_vif_event_armed(drvr->config); --+ --+ /* Default handling in case no-one waits for this event */ --+ if (!armed) --+ brcmf_remove_interface(ifp, false); --+ } -- } -- -- /** ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -2290,8 +2290,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph -- else -- err = 0; -- } --- if (err) --- brcmf_remove_interface(vif->ifp, true); --+ brcmf_remove_interface(vif->ifp, true); -- -- brcmf_cfg80211_arm_vif_event(cfg, NULL); -- if (vif->wdev.iftype != NL80211_IFTYPE_P2P_DEVICE) -diff --git a/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch b/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch -deleted file mode 100644 -index 1929f0b8126ed8659d642019648c4b86cc85ecb6..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0025-brcmfmac-support-removing-AP-interfaces-with-interfa.patch -+++ /dev/null -@@ -1,84 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Wed, 29 Jun 2016 21:54:27 +0200 --Subject: [PATCH] brcmfmac: support removing AP interfaces with -- "interface_remove" --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --New firmwares (e.g. 10.10.69.36 for BCM4366) support "interface_remove" --for removing interfaces. Try to use this method on cfg80211 request. In --case of older firmwares (e.g. 7.35.177.56 for BCM43602 as I tested) this --will just result in firmware rejecting command and this won't change any --behavior. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -771,12 +771,48 @@ s32 brcmf_notify_escan_complete(struct b -- return err; -- } -- --+static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy, --+ struct wireless_dev *wdev) --+{ --+ struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); --+ struct net_device *ndev = wdev->netdev; --+ struct brcmf_if *ifp = netdev_priv(ndev); --+ int ret; --+ int err; --+ --+ brcmf_cfg80211_arm_vif_event(cfg, ifp->vif); --+ --+ err = brcmf_fil_bsscfg_data_set(ifp, "interface_remove", NULL, 0); --+ if (err) { --+ brcmf_err("interface_remove failed %d\n", err); --+ goto err_unarm; --+ } --+ --+ /* wait for firmware event */ --+ ret = brcmf_cfg80211_wait_vif_event(cfg, BRCMF_E_IF_DEL, --+ BRCMF_VIF_EVENT_TIMEOUT); --+ if (!ret) { --+ brcmf_err("timeout occurred\n"); --+ err = -EIO; --+ goto err_unarm; --+ } --+ --+ brcmf_remove_interface(ifp, true); --+ --+err_unarm: --+ brcmf_cfg80211_arm_vif_event(cfg, NULL); --+ return err; --+} --+ -- static -- int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev) -- { -- struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); -- struct net_device *ndev = wdev->netdev; -- --+ if (ndev && ndev == cfg_to_ndev(cfg)) --+ return -ENOTSUPP; --+ -- /* vif event pending in firmware */ -- if (brcmf_cfg80211_vif_event_armed(cfg)) -- return -EBUSY; --@@ -793,12 +829,13 @@ int brcmf_cfg80211_del_iface(struct wiph -- switch (wdev->iftype) { -- case NL80211_IFTYPE_ADHOC: -- case NL80211_IFTYPE_STATION: --- case NL80211_IFTYPE_AP: -- case NL80211_IFTYPE_AP_VLAN: -- case NL80211_IFTYPE_WDS: -- case NL80211_IFTYPE_MONITOR: -- case NL80211_IFTYPE_MESH_POINT: -- return -EOPNOTSUPP; --+ case NL80211_IFTYPE_AP: --+ return brcmf_cfg80211_del_ap_iface(wiphy, wdev); -- case NL80211_IFTYPE_P2P_CLIENT: -- case NL80211_IFTYPE_P2P_GO: -- case NL80211_IFTYPE_P2P_DEVICE: -diff --git a/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch b/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch -deleted file mode 100644 -index ae458e7a02608101799f072b4211a01d6d487f96..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0026-brcmfmac-respect-hidden_ssid-for-AP-interfaces.patch -+++ /dev/null -@@ -1,43 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Wed, 6 Jul 2016 12:22:54 +0200 --Subject: [PATCH] brcmfmac: respect hidden_ssid for AP interfaces --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This was succesfully tested with 4366B1. A small workaround is needed --for the main interface otherwise it would stuck at the hidden state. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -4586,6 +4586,15 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- brcmf_err("SET SSID error (%d)\n", err); -- goto exit; -- } --+ --+ if (settings->hidden_ssid) { --+ err = brcmf_fil_iovar_int_set(ifp, "closednet", 1); --+ if (err) { --+ brcmf_err("closednet error (%d)\n", err); --+ goto exit; --+ } --+ } --+ -- brcmf_dbg(TRACE, "AP mode configuration complete\n"); -- } else if (dev_role == NL80211_IFTYPE_P2P_GO) { -- err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); --@@ -4644,6 +4653,10 @@ static int brcmf_cfg80211_stop_ap(struct -- return err; -- } -- --+ /* First BSS doesn't get a full reset */ --+ if (ifp->bsscfgidx == 0) --+ brcmf_fil_iovar_int_set(ifp, "closednet", 0); --+ -- memset(&join_params, 0, sizeof(join_params)); -- err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID, -- &join_params, sizeof(join_params)); -diff --git a/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch b/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch -deleted file mode 100644 -index fcafa797ef02fa53c05fb5a1dde8f550f02bf9d8..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0027-brcmfmac-restore-stopping-netdev-queue-when-bus-clog.patch -+++ /dev/null -@@ -1,53 +0,0 @@ --From: Arend Van Spriel --Date: Fri, 15 Jul 2016 12:16:12 +0200 --Subject: [PATCH] brcmfmac: restore stopping netdev queue when bus clogs up --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --When the host-interface bus has hard time handling transmit packets --it informs higher layer about this and it would stop the netdev --queue when needed. However, since commit 9cd18359d31e ("brcmfmac: --Make FWS queueing configurable.") this was broken. With this patch --the behaviour is restored. -- --Cc: stable@vger.kernel.org # v4.5, v4.6, v4.7 --Fixes: 9cd18359d31e ("brcmfmac: Make FWS queueing configurable.") --Tested-by: Per Förlin --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c --@@ -2469,10 +2469,22 @@ void brcmf_fws_bustxfail(struct brcmf_fw -- void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked) -- { -- struct brcmf_fws_info *fws = drvr->fws; --+ struct brcmf_if *ifp; --+ int i; -- --- fws->bus_flow_blocked = flow_blocked; --- if (!flow_blocked) --- brcmf_fws_schedule_deq(fws); --- else --- fws->stats.bus_flow_block++; --+ if (fws->avoid_queueing) { --+ for (i = 0; i < BRCMF_MAX_IFS; i++) { --+ ifp = drvr->iflist[i]; --+ if (!ifp || !ifp->ndev) --+ continue; --+ brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FLOW, --+ flow_blocked); --+ } --+ } else { --+ fws->bus_flow_blocked = flow_blocked; --+ if (!flow_blocked) --+ brcmf_fws_schedule_deq(fws); --+ else --+ fws->stats.bus_flow_block++; --+ } -- } -diff --git a/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch b/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch -deleted file mode 100644 -index a24c07f9731916f4bd3ff9bd3cb787d5982a1345..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0028-brcmfmac-defer-DPC-processing-during-probe.patch -+++ /dev/null -@@ -1,42 +0,0 @@ --From fd3ed33f51c2a586412d35b4f64803f019ab589f Mon Sep 17 00:00:00 2001 --From: Arend Van Spriel --Date: Fri, 15 Jul 2016 12:39:13 +0200 --Subject: [PATCH] brcmfmac: defer DPC processing during probe -- --The sdio dpc starts processing when in SDIOD_STATE_DATA. This state was --entered right after firmware download. This patch moves that transition --just before enabling sdio interrupt handling thus avoiding watchdog --expiry which would put the bus to sleep while probing. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 7 +++---- -- 1 file changed, 3 insertions(+), 4 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -3304,10 +3304,6 @@ static int brcmf_sdio_download_firmware( -- goto err; -- } -- --- /* Allow full data communication using DPC from now on. */ --- brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA); --- bcmerror = 0; --- -- err: -- brcmf_sdio_clkctl(bus, CLK_SDONLY, false); -- sdio_release_host(bus->sdiodev->func[1]); --@@ -4045,6 +4041,9 @@ static void brcmf_sdio_firmware_callback -- } -- -- if (err == 0) { --+ /* Allow full data communication using DPC from now on. */ --+ brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA); --+ -- err = brcmf_sdiod_intr_register(sdiodev); -- if (err != 0) -- brcmf_err("intr register failed:%d\n", err); -diff --git a/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch b/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch -deleted file mode 100644 -index ba9a349f0fd1874c5b038e4cc4d7f4cf2097ae47..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0029-brcmfmac-Fix-glob_skb-leak-in-brcmf_sdiod_recv_chain.patch -+++ /dev/null -@@ -1,32 +0,0 @@ --From 3bdae810721b33061d2e541bd78a70f86ca42af3 Mon Sep 17 00:00:00 2001 --From: Florian Fainelli --Date: Mon, 18 Jul 2016 16:24:34 -0700 --Subject: [PATCH] brcmfmac: Fix glob_skb leak in brcmf_sdiod_recv_chain -- --In case brcmf_sdiod_recv_chain() cannot complete a succeful call to --brcmf_sdiod_buffrw, we would be leaking glom_skb and not free it as we --should, fix this. -- --Reported-by: coverity (CID 1164856) --Fixes: a413e39a38573 ("brcmfmac: fix brcmf_sdcard_recv_chain() for host without sg support") --Signed-off-by: Florian Fainelli --Acked-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 4 +++- -- 1 file changed, 3 insertions(+), 1 deletion(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --@@ -722,8 +722,10 @@ int brcmf_sdiod_recv_chain(struct brcmf_ -- return -ENOMEM; -- err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, -- glom_skb); --- if (err) --+ if (err) { --+ brcmu_pkt_buf_free_skb(glom_skb); -- goto done; --+ } -- -- skb_queue_walk(pktq, skb) { -- memcpy(skb->data, glom_skb->data, skb->len); -diff --git a/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch b/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch -deleted file mode 100644 -index 540b7f08bf7c6b9c78f5b2ccfdae2a96dbaa4e6f..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0030-net-wireless-broadcom-brcm80211-brcmfmac-usb-don-t-p.patch -+++ /dev/null -@@ -1,34 +0,0 @@ --From 938f89e50a41c2d56710805fb019ad7618cef84b Mon Sep 17 00:00:00 2001 --From: Wolfram Sang --Date: Thu, 11 Aug 2016 23:05:31 +0200 --Subject: [PATCH] net: wireless: broadcom: brcm80211: brcmfmac: usb: don't -- print error when allocating urb fails -- --kmalloc will print enough information in case of failure. -- --Signed-off-by: Wolfram Sang --Signed-off-by: David S. Miller ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 8 ++------ -- 1 file changed, 2 insertions(+), 6 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --@@ -1099,15 +1099,11 @@ struct brcmf_usbdev *brcmf_usb_attach(st -- devinfo->tx_freecount = ntxq; -- -- devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC); --- if (!devinfo->ctl_urb) { --- brcmf_err("usb_alloc_urb (ctl) failed\n"); --+ if (!devinfo->ctl_urb) -- goto error; --- } -- devinfo->bulk_urb = usb_alloc_urb(0, GFP_ATOMIC); --- if (!devinfo->bulk_urb) { --- brcmf_err("usb_alloc_urb (bulk) failed\n"); --+ if (!devinfo->bulk_urb) -- goto error; --- } -- -- return &devinfo->bus_pub; -- -diff --git a/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch b/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch -deleted file mode 100644 -index b98b68a88a23b85b69092979ac92ebf1e2b1a5d2..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0031-brcmfmac-Check-rtnl_lock-is-locked-when-removing-int.patch -+++ /dev/null -@@ -1,111 +0,0 @@ --From 15dacf880e49ce3ecee05eb1a0c6b8e363dbacdc Mon Sep 17 00:00:00 2001 --From: "mhiramat@kernel.org" --Date: Mon, 15 Aug 2016 18:40:57 +0900 --Subject: [PATCH] brcmfmac: Check rtnl_lock is locked when removing interface --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Check rtnl_lock is locked in brcmf_p2p_ifp_removed() by passing --rtnl_locked flag. Actually the caller brcmf_del_if() checks whether --the rtnl_lock is locked, but doesn't pass it to brcmf_p2p_ifp_removed(). -- --Without this fix, wpa_supplicant goes softlockup with rtnl_lock --holding (this means all other process using netlink are locked up too) -- --e.g. --[ 4495.876627] INFO: task wpa_supplicant:7307 blocked for more than 10 seconds. --[ 4495.876632] Tainted: G W 4.8.0-rc1+ #8 --[ 4495.876635] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. --[ 4495.876638] wpa_supplicant D ffff974c647b39a0 0 7307 1 0x00000000 --[ 4495.876644] ffff974c647b39a0 0000000000000000 ffff974c00000000 ffff974c7dc59c58 --[ 4495.876651] ffff974c6b7417c0 ffff974c645017c0 ffff974c647b4000 ffffffff86f16c08 --[ 4495.876657] ffff974c645017c0 0000000000000246 00000000ffffffff ffff974c647b39b8 --[ 4495.876664] Call Trace: --[ 4495.876671] [] schedule+0x3c/0x90 --[ 4495.876676] [] schedule_preempt_disabled+0x15/0x20 --[ 4495.876682] [] mutex_lock_nested+0x176/0x3b0 --[ 4495.876686] [] ? rtnl_lock+0x17/0x20 --[ 4495.876690] [] rtnl_lock+0x17/0x20 --[ 4495.876720] [] brcmf_p2p_ifp_removed+0x4d/0x70 [brcmfmac] --[ 4495.876741] [] brcmf_remove_interface+0x196/0x1b0 [brcmfmac] --[ 4495.876760] [] brcmf_p2p_del_vif+0x111/0x220 [brcmfmac] --[ 4495.876777] [] brcmf_cfg80211_del_iface+0x21b/0x270 [brcmfmac] --[ 4495.876820] [] nl80211_del_interface+0xfe/0x3a0 [cfg80211] --[ 4495.876825] [] genl_family_rcv_msg+0x1b5/0x370 --[ 4495.876832] [] ? trace_hardirqs_on+0xd/0x10 --[ 4495.876836] [] genl_rcv_msg+0x7d/0xb0 --[ 4495.876839] [] ? genl_family_rcv_msg+0x370/0x370 --[ 4495.876846] [] netlink_rcv_skb+0x97/0xb0 --[ 4495.876849] [] genl_rcv+0x28/0x40 --[ 4495.876854] [] netlink_unicast+0x1d3/0x2f0 --[ 4495.876860] [] ? netlink_unicast+0x14b/0x2f0 --[ 4495.876866] [] netlink_sendmsg+0x2eb/0x3a0 --[ 4495.876870] [] sock_sendmsg+0x38/0x50 --[ 4495.876874] [] ___sys_sendmsg+0x27f/0x290 --[ 4495.876882] [] ? mntput_no_expire+0x5/0x3f0 --[ 4495.876888] [] ? mntput_no_expire+0x8e/0x3f0 --[ 4495.876894] [] ? mntput_no_expire+0x5/0x3f0 --[ 4495.876899] [] ? mntput+0x24/0x40 --[ 4495.876904] [] ? __fput+0x190/0x200 --[ 4495.876909] [] __sys_sendmsg+0x45/0x80 --[ 4495.876914] [] SyS_sendmsg+0x12/0x20 --[ 4495.876918] [] entry_SYSCALL_64_fastpath+0x23/0xc1 --[ 4495.876924] [] ? trace_hardirqs_off_caller+0x1f/0xc0 -- --Signed-off-by: Masami Hiramatsu --Acked-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 2 +- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 8 +++++--- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h | 2 +- -- 3 files changed, 7 insertions(+), 5 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -743,7 +743,7 @@ static void brcmf_del_if(struct brcmf_pu -- * serious troublesome side effects. The p2p module will clean -- * up the ifp if needed. -- */ --- brcmf_p2p_ifp_removed(ifp); --+ brcmf_p2p_ifp_removed(ifp, rtnl_locked); -- kfree(ifp); -- } -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c --@@ -2299,7 +2299,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiph -- return err; -- } -- ---void brcmf_p2p_ifp_removed(struct brcmf_if *ifp) --+void brcmf_p2p_ifp_removed(struct brcmf_if *ifp, bool rtnl_locked) -- { -- struct brcmf_cfg80211_info *cfg; -- struct brcmf_cfg80211_vif *vif; --@@ -2308,9 +2308,11 @@ void brcmf_p2p_ifp_removed(struct brcmf_ -- vif = ifp->vif; -- cfg = wdev_to_cfg(&vif->wdev); -- cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; --- rtnl_lock(); --+ if (!rtnl_locked) --+ rtnl_lock(); -- cfg80211_unregister_wdev(&vif->wdev); --- rtnl_unlock(); --+ if (!rtnl_locked) --+ rtnl_unlock(); -- brcmf_free_vif(vif); -- } -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.h --@@ -155,7 +155,7 @@ struct wireless_dev *brcmf_p2p_add_vif(s -- int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev); -- int brcmf_p2p_ifchange(struct brcmf_cfg80211_info *cfg, -- enum brcmf_fil_p2p_if_types if_type); ---void brcmf_p2p_ifp_removed(struct brcmf_if *ifp); --+void brcmf_p2p_ifp_removed(struct brcmf_if *ifp, bool rtnl_locked); -- int brcmf_p2p_start_device(struct wiphy *wiphy, struct wireless_dev *wdev); -- void brcmf_p2p_stop_device(struct wiphy *wiphy, struct wireless_dev *wdev); -- int brcmf_p2p_scan_prep(struct wiphy *wiphy, -diff --git a/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch b/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch -deleted file mode 100644 -index 30ca25897d06fb2b26866255721377f5dbccfed0..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0032-brcmfmac-Change-vif_event_lock-to-spinlock.patch -+++ /dev/null -@@ -1,175 +0,0 @@ --From b64abcb7dae6060c67ab0e548da3ef923c49641d Mon Sep 17 00:00:00 2001 --From: "mhiramat@kernel.org" --Date: Mon, 15 Aug 2016 18:41:12 +0900 --Subject: [PATCH] brcmfmac: Change vif_event_lock to spinlock -- --Change vif_event_lock to spinlock from mutex, since this lock is --used in wait_event_timeout() via vif_event_equals(). This caused --a warning report as below. -- --As far as I can see, this lock protects regions where updating --structure members, not function calls. Also, since those --regions are not called from interrupt handlers (of course, it --was a mutex), spin_lock is used instead of spin_lock_irqsave. -- --[ 186.678550] ------------[ cut here ]------------ --[ 186.678556] WARNING: CPU: 2 PID: 7140 at /home/mhiramat/ksrc/linux/kernel/sched/core.c:7545 __might_sleep+0x7c/0x80 --[ 186.678560] do not call blocking ops when !TASK_RUNNING; state=2 set at [] prepare_to_wait_event+0x60/0x100 --[ 186.678560] Modules linked in: brcmfmac xt_CHECKSUM rfcomm ipt_MASQUERADE nf_nat_masquerade_ipv4 xt_addrtype br_netfilter xt_tcpudp ip6t_rpfilter ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_conntrack ip_set nfnetlink ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_raw ip6table_security ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_filter ip6_tables iptable_raw iptable_security iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_filter ip_tables x_tables bnep nls_iso8859_1 i2c_designware_platform i2c_designware_core snd_hda_codec_hdmi snd_hda_codec_realtek dcdbas snd_hda_codec_generic snd_hda_intel snd_hda_codec intel_rapl snd_hda_core x86_pkg_temp_thermal intel_powerclamp coretemp --[ 186.678594] snd_pcm crct10dif_pclmul crc32_pclmul aesni_intel aes_x86_64 joydev glue_helper snd_hwdep lrw gf128mul uvcvideo ablk_helper snd_seq_midi cryptd snd_seq_midi_event snd_rawmidi videobuf2_vmalloc videobuf2_memops snd_seq input_leds videobuf2_v4l2 cfg80211 videobuf2_core snd_timer videodev serio_raw btusb snd_seq_device media btrtl rtsx_pci_ms snd mei_me memstick hid_multitouch mei soundcore brcmutil idma64 virt_dma intel_lpss_pci processor_thermal_device intel_soc_dts_iosf hci_uart btbcm btqca btintel bluetooth int3403_thermal dell_smo8800 intel_lpss_acpi intel_lpss int3402_thermal int340x_thermal_zone intel_hid mac_hid int3400_thermal shpchp sparse_keymap acpi_pad acpi_thermal_rel acpi_als kfifo_buf industrialio kvm_intel kvm irqbypass parport_pc ppdev lp parport autofs4 btrfs xor raid6_pq --[ 186.678631] usbhid nouveau ttm i915 rtsx_pci_sdmmc mxm_wmi i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops psmouse drm ahci rtsx_pci nvme nvme_core libahci i2c_hid hid pinctrl_sunrisepoint video wmi pinctrl_intel fjes [last unloaded: brcmfmac] --[ 186.678646] CPU: 2 PID: 7140 Comm: wpa_supplicant Not tainted 4.8.0-rc1+ #8 --[ 186.678647] Hardware name: Dell Inc. XPS 15 9550/0N7TVV, BIOS 01.02.00 04/07/2016 --[ 186.678648] 0000000000000000 ffff9d8c64b5b900 ffffffff98442f23 ffff9d8c64b5b950 --[ 186.678651] 0000000000000000 ffff9d8c64b5b940 ffffffff9808b22b 00001d790000000d --[ 186.678653] ffffffff98c75e78 000000000000026c 0000000000000000 ffff9d8c2706d058 --[ 186.678655] Call Trace: --[ 186.678659] [] dump_stack+0x85/0xc2 --[ 186.678666] [] __warn+0xcb/0xf0 --[ 186.678668] [] warn_slowpath_fmt+0x4f/0x60 --[ 186.678671] [] ? prepare_to_wait_event+0x60/0x100 --[ 186.678672] [] ? prepare_to_wait_event+0x60/0x100 --[ 186.678674] [] __might_sleep+0x7c/0x80 --[ 186.678680] [] mutex_lock_nested+0x33/0x3b0 --[ 186.678682] [] ? trace_hardirqs_on+0xd/0x10 --[ 186.678689] [] brcmf_cfg80211_wait_vif_event+0xcd/0x130 [brcmfmac] --[ 186.678691] [] ? wake_atomic_t_function+0x60/0x60 --[ 186.678697] [] brcmf_p2p_del_vif+0xf9/0x220 [brcmfmac] --[ 186.678702] [] brcmf_cfg80211_del_iface+0x21b/0x270 [brcmfmac] --[ 186.678716] [] nl80211_del_interface+0xfe/0x3a0 [cfg80211] --[ 186.678718] [] genl_family_rcv_msg+0x1b5/0x370 --[ 186.678720] [] ? trace_hardirqs_on+0xd/0x10 --[ 186.678721] [] genl_rcv_msg+0x7d/0xb0 --[ 186.678722] [] ? genl_family_rcv_msg+0x370/0x370 --[ 186.678724] [] netlink_rcv_skb+0x97/0xb0 --[ 186.678726] [] genl_rcv+0x28/0x40 --[ 186.678727] [] netlink_unicast+0x1d3/0x2f0 --[ 186.678729] [] ? netlink_unicast+0x14b/0x2f0 --[ 186.678731] [] netlink_sendmsg+0x2eb/0x3a0 --[ 186.678733] [] sock_sendmsg+0x38/0x50 --[ 186.678734] [] ___sys_sendmsg+0x27f/0x290 --[ 186.678737] [] ? mntput_no_expire+0x5/0x3f0 --[ 186.678739] [] ? mntput_no_expire+0x8e/0x3f0 --[ 186.678741] [] ? mntput_no_expire+0x5/0x3f0 --[ 186.678743] [] ? mntput+0x24/0x40 --[ 186.678744] [] ? __fput+0x190/0x200 --[ 186.678746] [] __sys_sendmsg+0x45/0x80 --[ 186.678748] [] SyS_sendmsg+0x12/0x20 --[ 186.678749] [] entry_SYSCALL_64_fastpath+0x23/0xc1 --[ 186.678751] [] ? trace_hardirqs_off_caller+0x1f/0xc0 --[ 186.678752] ---[ end trace e224d66c5d8408b5 ]--- -- --Signed-off-by: Masami Hiramatsu --Acked-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 26 +++++++++++----------- -- .../broadcom/brcm80211/brcmfmac/cfg80211.h | 2 +- -- 2 files changed, 14 insertions(+), 14 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -5555,7 +5555,7 @@ static s32 brcmf_notify_vif_event(struct -- ifevent->action, ifevent->flags, ifevent->ifidx, -- ifevent->bsscfgidx); -- --- mutex_lock(&event->vif_event_lock); --+ spin_lock(&event->vif_event_lock); -- event->action = ifevent->action; -- vif = event->vif; -- --@@ -5563,7 +5563,7 @@ static s32 brcmf_notify_vif_event(struct -- case BRCMF_E_IF_ADD: -- /* waiting process may have timed out */ -- if (!cfg->vif_event.vif) { --- mutex_unlock(&event->vif_event_lock); --+ spin_unlock(&event->vif_event_lock); -- return -EBADF; -- } -- --@@ -5574,24 +5574,24 @@ static s32 brcmf_notify_vif_event(struct -- ifp->ndev->ieee80211_ptr = &vif->wdev; -- SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy)); -- } --- mutex_unlock(&event->vif_event_lock); --+ spin_unlock(&event->vif_event_lock); -- wake_up(&event->vif_wq); -- return 0; -- -- case BRCMF_E_IF_DEL: --- mutex_unlock(&event->vif_event_lock); --+ spin_unlock(&event->vif_event_lock); -- /* event may not be upon user request */ -- if (brcmf_cfg80211_vif_event_armed(cfg)) -- wake_up(&event->vif_wq); -- return 0; -- -- case BRCMF_E_IF_CHANGE: --- mutex_unlock(&event->vif_event_lock); --+ spin_unlock(&event->vif_event_lock); -- wake_up(&event->vif_wq); -- return 0; -- -- default: --- mutex_unlock(&event->vif_event_lock); --+ spin_unlock(&event->vif_event_lock); -- break; -- } -- return -EINVAL; --@@ -5712,7 +5712,7 @@ static void wl_deinit_priv(struct brcmf_ -- static void init_vif_event(struct brcmf_cfg80211_vif_event *event) -- { -- init_waitqueue_head(&event->vif_wq); --- mutex_init(&event->vif_event_lock); --+ spin_lock_init(&event->vif_event_lock); -- } -- -- static s32 brcmf_dongle_roam(struct brcmf_if *ifp) --@@ -6607,9 +6607,9 @@ static inline bool vif_event_equals(stru -- { -- u8 evt_action; -- --- mutex_lock(&event->vif_event_lock); --+ spin_lock(&event->vif_event_lock); -- evt_action = event->action; --- mutex_unlock(&event->vif_event_lock); --+ spin_unlock(&event->vif_event_lock); -- return evt_action == action; -- } -- --@@ -6618,10 +6618,10 @@ void brcmf_cfg80211_arm_vif_event(struct -- { -- struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; -- --- mutex_lock(&event->vif_event_lock); --+ spin_lock(&event->vif_event_lock); -- event->vif = vif; -- event->action = 0; --- mutex_unlock(&event->vif_event_lock); --+ spin_unlock(&event->vif_event_lock); -- } -- -- bool brcmf_cfg80211_vif_event_armed(struct brcmf_cfg80211_info *cfg) --@@ -6629,9 +6629,9 @@ bool brcmf_cfg80211_vif_event_armed(stru -- struct brcmf_cfg80211_vif_event *event = &cfg->vif_event; -- bool armed; -- --- mutex_lock(&event->vif_event_lock); --+ spin_lock(&event->vif_event_lock); -- armed = event->vif != NULL; --- mutex_unlock(&event->vif_event_lock); --+ spin_unlock(&event->vif_event_lock); -- -- return armed; -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h --@@ -227,7 +227,7 @@ struct escan_info { -- */ -- struct brcmf_cfg80211_vif_event { -- wait_queue_head_t vif_wq; --- struct mutex vif_event_lock; --+ spinlock_t vif_event_lock; -- u8 action; -- struct brcmf_cfg80211_vif *vif; -- }; -diff --git a/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch b/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch -deleted file mode 100644 -index 1a7947b39a5eca626d2c79fecb627c52868f713b..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0033-brcmfmac-add-missing-header-dependencies.patch -+++ /dev/null -@@ -1,29 +0,0 @@ --From 8af92af3f2d55db143417a5d401696f4b642009a Mon Sep 17 00:00:00 2001 --From: Baoyou Xie --Date: Mon, 29 Aug 2016 20:39:35 +0800 --Subject: [PATCH] brcmfmac: add missing header dependencies -- --We get 1 warning when building kernel with W=1: -- --drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c:23:6: warning: no previous prototype for '__brcmf_err' [-Wmissing-prototypes] -- --In fact, this function is declared in brcmfmac/debug.h, so this patch --adds missing header dependencies. -- --Signed-off-by: Baoyou Xie --Acked-by: Arnd Bergmann --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c | 1 + -- 1 file changed, 1 insertion(+) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/tracepoint.c --@@ -19,6 +19,7 @@ -- #ifndef __CHECKER__ -- #define CREATE_TRACE_POINTS -- #include "tracepoint.h" --+#include "debug.h" -- -- void __brcmf_err(const char *func, const char *fmt, ...) -- { -diff --git a/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch b/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch -deleted file mode 100644 -index 24cd92a8bebfdffbb0e0d19b53a7c1cae4738ec1..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0034-brcmfmac-Add-USB-ID-for-Cisco-Linksys-AE1200.patch -+++ /dev/null -@@ -1,51 +0,0 @@ --From bccf3ffc8c6d8e0251a15541bb4d12b423c4f729 Mon Sep 17 00:00:00 2001 --From: Ismael Luceno --Date: Mon, 22 Aug 2016 19:40:07 -0300 --Subject: [PATCH] brcmfmac: Add USB ID for Cisco Linksys AE1200 -- --The AE1200 comes with different revisions of the BCM43235 chipset, --but all have the same USB ID. Only revision 3 can be supported. -- --Signed-off-by: Ismael Luceno --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 4 ++++ -- drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 2 ++ -- 2 files changed, 6 insertions(+) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c --@@ -1456,11 +1456,15 @@ static int brcmf_usb_reset_resume(struct -- #define BRCMF_USB_DEVICE(dev_id) \ -- { USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, dev_id) } -- --+#define LINKSYS_USB_DEVICE(dev_id) \ --+ { USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id) } --+ -- static struct usb_device_id brcmf_usb_devid_table[] = { -- BRCMF_USB_DEVICE(BRCM_USB_43143_DEVICE_ID), -- BRCMF_USB_DEVICE(BRCM_USB_43236_DEVICE_ID), -- BRCMF_USB_DEVICE(BRCM_USB_43242_DEVICE_ID), -- BRCMF_USB_DEVICE(BRCM_USB_43569_DEVICE_ID), --+ LINKSYS_USB_DEVICE(BRCM_USB_43235_LINKSYS_DEVICE_ID), -- { USB_DEVICE(BRCM_USB_VENDOR_ID_LG, BRCM_USB_43242_LG_DEVICE_ID) }, -- /* special entry for device with firmware loaded and running */ -- BRCMF_USB_DEVICE(BRCM_USB_BCMFW_DEVICE_ID), ----- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h --+++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h --@@ -22,6 +22,7 @@ -- -- #define BRCM_USB_VENDOR_ID_BROADCOM 0x0a5c -- #define BRCM_USB_VENDOR_ID_LG 0x043e --+#define BRCM_USB_VENDOR_ID_LINKSYS 0x13b1 -- #define BRCM_PCIE_VENDOR_ID_BROADCOM PCI_VENDOR_ID_BROADCOM -- -- /* Chipcommon Core Chip IDs */ --@@ -56,6 +57,7 @@ -- -- /* USB Device IDs */ -- #define BRCM_USB_43143_DEVICE_ID 0xbd1e --+#define BRCM_USB_43235_LINKSYS_DEVICE_ID 0x0039 -- #define BRCM_USB_43236_DEVICE_ID 0xbd17 -- #define BRCM_USB_43242_DEVICE_ID 0xbd1f -- #define BRCM_USB_43242_LG_DEVICE_ID 0x3101 -diff --git a/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch b/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch -deleted file mode 100644 -index b58a266a2542d44cb626ad4eef93dc56130d5900..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0035-brcmfmac-fix-pmksa-bssid-usage.patch -+++ /dev/null -@@ -1,51 +0,0 @@ --From 7703773ef1d85b40433902a8da20167331597e4a Mon Sep 17 00:00:00 2001 --From: Nicolas Iooss --Date: Tue, 23 Aug 2016 11:37:17 +0200 --Subject: [PATCH] brcmfmac: fix pmksa->bssid usage -- --The struct cfg80211_pmksa defines its bssid field as: -- -- const u8 *bssid; -- --contrary to struct brcmf_pmksa, which uses: -- -- u8 bssid[ETH_ALEN]; -- --Therefore in brcmf_cfg80211_del_pmksa(), &pmksa->bssid takes the address --of this field (of type u8**), not the one of its content (which would be --u8*). Remove the & operator to make brcmf_dbg("%pM") and memcmp() --behave as expected. -- --This bug have been found using a custom static checker (which checks the --usage of %p... attributes at build time). It has been introduced in --commit 6c404f34f2bd ("brcmfmac: Cleanup pmksa cache handling code"), --which replaced pmksa->bssid by &pmksa->bssid while refactoring the code, --without modifying struct cfg80211_pmksa definition. -- --Replace &pmk[i].bssid with pmk[i].bssid too to make the code clearer, --this change does not affect the semantic. -- --Fixes: 6c404f34f2bd ("brcmfmac: Cleanup pmksa cache handling code") --Cc: stable@vger.kernel.org --Signed-off-by: Nicolas Iooss --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++-- -- 1 file changed, 2 insertions(+), 2 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -3804,11 +3804,11 @@ brcmf_cfg80211_del_pmksa(struct wiphy *w -- if (!check_vif_up(ifp->vif)) -- return -EIO; -- --- brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", &pmksa->bssid); --+ brcmf_dbg(CONN, "del_pmksa - PMK bssid = %pM\n", pmksa->bssid); -- -- npmk = le32_to_cpu(cfg->pmk_list.npmk); -- for (i = 0; i < npmk; i++) --- if (!memcmp(&pmksa->bssid, &pmk[i].bssid, ETH_ALEN)) --+ if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) -- break; -- -- if ((npmk > 0) && (i < npmk)) { -diff --git a/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch b/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch -deleted file mode 100644 -index 760b6daf25ef57d3b777373b9695a909ec42b1d2..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0036-brcmfmac-avoid-potential-stack-overflow-in-brcmf_cfg.patch -+++ /dev/null -@@ -1,34 +0,0 @@ --From ded89912156b1a47d940a0c954c43afbabd0c42c Mon Sep 17 00:00:00 2001 --From: Arend Van Spriel --Date: Mon, 5 Sep 2016 10:45:47 +0100 --Subject: [PATCH] brcmfmac: avoid potential stack overflow in -- brcmf_cfg80211_start_ap() -- --User-space can choose to omit NL80211_ATTR_SSID and only provide raw --IE TLV data. When doing so it can provide SSID IE with length exceeding --the allowed size. The driver further processes this IE copying it --into a local variable without checking the length. Hence stack can be --corrupted and used as exploit. -- --Cc: stable@vger.kernel.org # v4.7 --Reported-by: Daxing Guo --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +- -- 1 file changed, 1 insertion(+), 1 deletion(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -4447,7 +4447,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- (u8 *)&settings->beacon.head[ie_offset], -- settings->beacon.head_len - ie_offset, -- WLAN_EID_SSID); --- if (!ssid_ie) --+ if (!ssid_ie || ssid_ie->len > IEEE80211_MAX_SSID_LEN) -- return -EINVAL; -- -- memcpy(ssid_le.SSID, ssid_ie->data, ssid_ie->len); -diff --git a/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch b/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch -deleted file mode 100644 -index 1285b3096075e85a4c7c99592c73000244f75216..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0037-brcmfmac-add-support-for-bcm4339-chip-with-modalias-.patch -+++ /dev/null -@@ -1,55 +0,0 @@ --From 634faf3686900ccdee87b77e2c56df8b2159912b Mon Sep 17 00:00:00 2001 --From: Arend Van Spriel --Date: Mon, 5 Sep 2016 11:42:12 +0100 --Subject: [PATCH] brcmfmac: add support for bcm4339 chip with modalias -- sdio:c00v02D0d4339 -- --The driver already supports the bcm4339 chipset but only for the variant --that shares the same modalias as the bcm4335, ie. sdio:c00v02D0d4335. --It turns out that there are also bcm4339 devices out there that have a --more distiguishable modalias sdio:c00v02D0d4339. -- --Reported-by: Steve deRosier --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 1 + -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 3 ++- -- include/linux/mmc/sdio_ids.h | 1 + -- 3 files changed, 4 insertions(+), 1 deletion(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --@@ -1097,6 +1097,7 @@ static const struct sdio_device_id brcmf -- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341), -- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362), -- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339), --+ BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4339), -- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430), -- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345), -- BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354), ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -3756,7 +3756,8 @@ static u32 brcmf_sdio_buscore_read32(voi -- u32 val, rev; -- -- val = brcmf_sdiod_regrl(sdiodev, addr, NULL); --- if (sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 && --+ if ((sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 || --+ sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4339) && -- addr == CORE_CC_REG(SI_ENUM_BASE, chipid)) { -- rev = (val & CID_REV_MASK) >> CID_REV_SHIFT; -- if (rev >= 2) { ----- a/include/linux/mmc/sdio_ids.h --+++ b/include/linux/mmc/sdio_ids.h --@@ -32,6 +32,7 @@ -- #define SDIO_DEVICE_ID_BROADCOM_43340 0xa94c -- #define SDIO_DEVICE_ID_BROADCOM_43341 0xa94d -- #define SDIO_DEVICE_ID_BROADCOM_4335_4339 0x4335 --+#define SDIO_DEVICE_ID_BROADCOM_4339 0x4339 -- #define SDIO_DEVICE_ID_BROADCOM_43362 0xa962 -- #define SDIO_DEVICE_ID_BROADCOM_43430 0xa9a6 -- #define SDIO_DEVICE_ID_BROADCOM_4345 0x4345 -diff --git a/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch b/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch -deleted file mode 100644 -index 1d5667ee6ed705db4dab6175207a9b0284167181..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0038-brcmfmac-sdio-shorten-retry-loop-in-brcmf_sdio_kso_c.patch -+++ /dev/null -@@ -1,56 +0,0 @@ --From 5251b6be8bb5c5675bdf12347c7b83937a5c91e5 Mon Sep 17 00:00:00 2001 --From: Arend Van Spriel --Date: Mon, 5 Sep 2016 11:42:13 +0100 --Subject: [PATCH] brcmfmac: sdio: shorten retry loop in -- brcmf_sdio_kso_control() -- --In brcmf_sdio_kso_control() there is a retry loop as hardware may take --time to settle. However, when the call to brcmf_sdiod_regrb() returns --an error it is due to SDIO access failure and it makes no sense to wait --for hardware to settle. This patch aborts the loop after a number of --subsequent access errors. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 11 +++++++++-- -- 1 file changed, 9 insertions(+), 2 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c --@@ -313,6 +313,7 @@ struct rte_console { -- -- #define KSO_WAIT_US 50 -- #define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US) --+#define BRCMF_SDIO_MAX_ACCESS_ERRORS 5 -- -- /* -- * Conversion of 802.1D priority to precedence level --@@ -675,6 +676,7 @@ brcmf_sdio_kso_control(struct brcmf_sdio -- { -- u8 wr_val = 0, rd_val, cmp_val, bmask; -- int err = 0; --+ int err_cnt = 0; -- int try_cnt = 0; -- -- brcmf_dbg(TRACE, "Enter: on=%d\n", on); --@@ -710,9 +712,14 @@ brcmf_sdio_kso_control(struct brcmf_sdio -- */ -- rd_val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, -- &err); --- if (((rd_val & bmask) == cmp_val) && !err) --+ if (!err) { --+ if ((rd_val & bmask) == cmp_val) --+ break; --+ err_cnt = 0; --+ } --+ /* bail out upon subsequent access errors */ --+ if (err && (err_cnt++ > BRCMF_SDIO_MAX_ACCESS_ERRORS)) -- break; --- -- udelay(KSO_WAIT_US); -- brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, -- wr_val, &err); -diff --git a/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch b/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch -deleted file mode 100644 -index 1620e0022bbe0093c658948ca0b1c70677f61984..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0039-brcmfmac-ignore-11d-configuration-errors.patch -+++ /dev/null -@@ -1,84 +0,0 @@ --From b3589dfe02123a0d0ea82076a9f8ef84a46852c0 Mon Sep 17 00:00:00 2001 --From: Hante Meuleman --Date: Mon, 19 Sep 2016 12:09:51 +0100 --Subject: [PATCH] brcmfmac: ignore 11d configuration errors -- --802.11d is not always supported by firmware anymore. Currently the --AP configuration of 11d will cause an abort if the ioctl set is --failing. This behavior is not correct and the error should be --ignored. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 27 ++++++++++++---------- -- 1 file changed, 15 insertions(+), 12 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -4422,6 +4422,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- u16 chanspec = chandef_to_chanspec(&cfg->d11inf, &settings->chandef); -- bool mbss; -- int is_11d; --+ bool supports_11d; -- -- brcmf_dbg(TRACE, "ctrlchn=%d, center=%d, bw=%d, beacon_interval=%d, dtim_period=%d,\n", -- settings->chandef.chan->hw_value, --@@ -4434,11 +4435,16 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- mbss = ifp->vif->mbss; -- -- /* store current 11d setting */ --- brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY, &ifp->vif->is_11d); --- country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, --- settings->beacon.tail_len, --- WLAN_EID_COUNTRY); --- is_11d = country_ie ? 1 : 0; --+ if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY, --+ &ifp->vif->is_11d)) { --+ supports_11d = false; --+ } else { --+ country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, --+ settings->beacon.tail_len, --+ WLAN_EID_COUNTRY); --+ is_11d = country_ie ? 1 : 0; --+ supports_11d = true; --+ } -- -- memset(&ssid_le, 0, sizeof(ssid_le)); -- if (settings->ssid == NULL || settings->ssid_len == 0) { --@@ -4497,7 +4503,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- -- /* Parameters shared by all radio interfaces */ -- if (!mbss) { --- if (is_11d != ifp->vif->is_11d) { --+ if ((supports_11d) && (is_11d != ifp->vif->is_11d)) { -- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY, -- is_11d); -- if (err < 0) { --@@ -4539,7 +4545,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wi -- brcmf_err("SET INFRA error %d\n", err); -- goto exit; -- } --- } else if (WARN_ON(is_11d != ifp->vif->is_11d)) { --+ } else if (WARN_ON(supports_11d && (is_11d != ifp->vif->is_11d))) { -- /* Multiple-BSS should use same 11d configuration */ -- err = -EINVAL; -- goto exit; --@@ -4673,11 +4679,8 @@ static int brcmf_cfg80211_stop_ap(struct -- brcmf_err("setting INFRA mode failed %d\n", err); -- if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS)) -- brcmf_fil_iovar_int_set(ifp, "mbss", 0); --- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY, --- ifp->vif->is_11d); --- if (err < 0) --- brcmf_err("restoring REGULATORY setting failed %d\n", --- err); --+ brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY, --+ ifp->vif->is_11d); -- /* Bring device back up so it can be used again */ -- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); -- if (err < 0) -diff --git a/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch b/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch -deleted file mode 100644 -index 9461164523fcc05daa4873274eb7378777612338..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0040-brcmfmac-rework-pointer-trickery-in-brcmf_proto_bcdc.patch -+++ /dev/null -@@ -1,32 +0,0 @@ --From 704d1c6b56f4ee2ad6a5f012a72a278d17c1a223 Mon Sep 17 00:00:00 2001 --From: Arend Van Spriel --Date: Mon, 19 Sep 2016 12:09:52 +0100 --Subject: [PATCH] brcmfmac: rework pointer trickery in -- brcmf_proto_bcdc_query_dcmd() -- --The variable info is assigned to point to bcdc->msg[1], which is the --same as pointing to bcdc->buf. As that is what we want to access --make it clear by fixing the assignment. This also avoid out-of-bounds --errors from static analyzers are bcdc->msg[1] is not in the structure --definition. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | 2 +- -- 1 file changed, 1 insertion(+), 1 deletion(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c --@@ -194,7 +194,7 @@ retry: -- } -- -- /* Check info buffer */ --- info = (void *)&msg[1]; --+ info = (void *)&bcdc->buf[0]; -- -- /* Copy info buffer */ -- if (buf) { -diff --git a/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch b/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch -deleted file mode 100644 -index 2ececdf1972d3e2769f4730bb846866d247d681f..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0041-brcmfmac-fix-memory-leak-in-brcmf_flowring_add_tdls_.patch -+++ /dev/null -@@ -1,39 +0,0 @@ --From bc981641360183990de59da17f9f560f9150b801 Mon Sep 17 00:00:00 2001 --From: Arend Van Spriel --Date: Mon, 19 Sep 2016 12:09:53 +0100 --Subject: [PATCH] brcmfmac: fix memory leak in brcmf_flowring_add_tdls_peer() -- --In the error paths in brcmf_flowring_add_tdls_peer() the allocated --resource should be freed. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c | 8 ++++++-- -- 1 file changed, 6 insertions(+), 2 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c --@@ -495,14 +495,18 @@ void brcmf_flowring_add_tdls_peer(struct -- } else { -- search = flow->tdls_entry; -- if (memcmp(search->mac, peer, ETH_ALEN) == 0) --- return; --+ goto free_entry; -- while (search->next) { -- search = search->next; -- if (memcmp(search->mac, peer, ETH_ALEN) == 0) --- return; --+ goto free_entry; -- } -- search->next = tdls_entry; -- } -- -- flow->tdls_active = true; --+ return; --+ --+free_entry: --+ kfree(tdls_entry); -- } -diff --git a/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch b/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch -deleted file mode 100644 -index 529cc8df02771a6680f59382278f3d273f512457..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0042-brcmfmac-initialize-variable-in-brcmf_sdiod_regrl.patch -+++ /dev/null -@@ -1,28 +0,0 @@ --From 26305d3d7298d1ddf8fd4ce95a382aa90534f0a3 Mon Sep 17 00:00:00 2001 --From: Arend Van Spriel --Date: Mon, 19 Sep 2016 12:09:54 +0100 --Subject: [PATCH] brcmfmac: initialize variable in brcmf_sdiod_regrl() -- --In case of an error the variable returned is uninitialized. The caller --will probably check the error code before using it, but better assure --it is set to zero. -- --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 +- -- 1 file changed, 1 insertion(+), 1 deletion(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c --@@ -416,7 +416,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d -- -- u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) -- { --- u32 data; --+ u32 data = 0; -- int retval; -- -- brcmf_dbg(SDIO, "addr:0x%08x\n", addr); -diff --git a/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch b/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch -deleted file mode 100644 -index 67af30e4fd0684d57453e43b2751ac7e853066b5..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0043-brcmfmac-remove-worker-from-.ndo_set_mac_address-cal.patch -+++ /dev/null -@@ -1,107 +0,0 @@ --From 8fa5fdec09cd379c9ecb8972f344f8f308e0ccf3 Mon Sep 17 00:00:00 2001 --From: Arend Van Spriel --Date: Mon, 19 Sep 2016 12:09:55 +0100 --Subject: [PATCH] brcmfmac: remove worker from .ndo_set_mac_address() callback -- --As it turns out there is no need to use a worker for the callback --because it is not called from atomic context. -- --Reported-by: Dan Williams --Reviewed-by: Hante Meuleman --Reviewed-by: Pieter-Paul Giesberts --Reviewed-by: Franky Lin --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- .../wireless/broadcom/brcm80211/brcmfmac/core.c | 39 ++++++++-------------- -- .../wireless/broadcom/brcm80211/brcmfmac/core.h | 2 -- -- 2 files changed, 13 insertions(+), 28 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -136,27 +136,6 @@ static void _brcmf_set_multicast_list(st -- err); -- } -- ---static void ---_brcmf_set_mac_address(struct work_struct *work) ---{ --- struct brcmf_if *ifp; --- s32 err; --- --- ifp = container_of(work, struct brcmf_if, setmacaddr_work); --- --- brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx); --- --- err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", ifp->mac_addr, --- ETH_ALEN); --- if (err < 0) { --- brcmf_err("Setting cur_etheraddr failed, %d\n", err); --- } else { --- brcmf_dbg(TRACE, "MAC address updated to %pM\n", --- ifp->mac_addr); --- memcpy(ifp->ndev->dev_addr, ifp->mac_addr, ETH_ALEN); --- } ---} --- -- #if IS_ENABLED(CONFIG_IPV6) -- static void _brcmf_update_ndtable(struct work_struct *work) -- { --@@ -190,10 +169,20 @@ static int brcmf_netdev_set_mac_address( -- { -- struct brcmf_if *ifp = netdev_priv(ndev); -- struct sockaddr *sa = (struct sockaddr *)addr; --+ int err; -- --- memcpy(&ifp->mac_addr, sa->sa_data, ETH_ALEN); --- schedule_work(&ifp->setmacaddr_work); --- return 0; --+ brcmf_dbg(TRACE, "Enter, bsscfgidx=%d\n", ifp->bsscfgidx); --+ --+ err = brcmf_fil_iovar_data_set(ifp, "cur_etheraddr", sa->sa_data, --+ ETH_ALEN); --+ if (err < 0) { --+ brcmf_err("Setting cur_etheraddr failed, %d\n", err); --+ } else { --+ brcmf_dbg(TRACE, "updated to %pM\n", sa->sa_data); --+ memcpy(ifp->mac_addr, sa->sa_data, ETH_ALEN); --+ memcpy(ifp->ndev->dev_addr, ifp->mac_addr, ETH_ALEN); --+ } --+ return err; -- } -- -- static void brcmf_netdev_set_multicast_list(struct net_device *ndev) --@@ -525,7 +514,6 @@ int brcmf_net_attach(struct brcmf_if *if -- /* set the mac address */ -- memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN); -- --- INIT_WORK(&ifp->setmacaddr_work, _brcmf_set_mac_address); -- INIT_WORK(&ifp->multicast_work, _brcmf_set_multicast_list); -- INIT_WORK(&ifp->ndoffload_work, _brcmf_update_ndtable); -- --@@ -730,7 +718,6 @@ static void brcmf_del_if(struct brcmf_pu -- } -- -- if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) { --- cancel_work_sync(&ifp->setmacaddr_work); -- cancel_work_sync(&ifp->multicast_work); -- cancel_work_sync(&ifp->ndoffload_work); -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -176,7 +176,6 @@ enum brcmf_netif_stop_reason { -- * @vif: points to cfg80211 specific interface information. -- * @ndev: associated network device. -- * @stats: interface specific network statistics. --- * @setmacaddr_work: worker object for setting mac address. -- * @multicast_work: worker object for multicast provisioning. -- * @ndoffload_work: worker object for neighbor discovery offload configuration. -- * @fws_desc: interface specific firmware-signalling descriptor. --@@ -193,7 +192,6 @@ struct brcmf_if { -- struct brcmf_cfg80211_vif *vif; -- struct net_device *ndev; -- struct net_device_stats stats; --- struct work_struct setmacaddr_work; -- struct work_struct multicast_work; -- struct work_struct ndoffload_work; -- struct brcmf_fws_mac_descriptor *fws_desc; -diff --git a/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch b/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch -deleted file mode 100644 -index 5a0847932964cbbfec126aacc82cada1624d63f7..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0044-brcmfmac-remove-unnecessary-null-pointer-check.patch -+++ /dev/null -@@ -1,31 +0,0 @@ --From 835680b82f029818c813324aed3073cdcf63241f Mon Sep 17 00:00:00 2001 --From: Hante Meuleman --Date: Mon, 19 Sep 2016 12:09:56 +0100 --Subject: [PATCH] brcmfmac: remove unnecessary null pointer check -- --in the function brcmf_bus_start() in the exception handling a --check is made to dermine whether ifp is null, though this is not --possible. Removing the unnessary check. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 +-- -- 1 file changed, 1 insertion(+), 2 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -1048,8 +1048,7 @@ fail: -- brcmf_fws_del_interface(ifp); -- brcmf_fws_deinit(drvr); -- } --- if (ifp) --- brcmf_net_detach(ifp->ndev, false); --+ brcmf_net_detach(ifp->ndev, false); -- if (p2p_ifp) -- brcmf_net_detach(p2p_ifp->ndev, false); -- drvr->iflist[0] = NULL; -diff --git a/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch b/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch -deleted file mode 100644 -index 0b3a23edc0839974750b3af21298b3fa20d7fc1b..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0045-brcmfmac-fix-clearing-entry-IPv6-address.patch -+++ /dev/null -@@ -1,37 +0,0 @@ --From 2b7425f3629b38c438f890c20c5faeca64b144ff Mon Sep 17 00:00:00 2001 --From: Hante Meuleman --Date: Mon, 19 Sep 2016 12:09:57 +0100 --Subject: [PATCH] brcmfmac: fix clearing entry IPv6 address -- --When IPv6 address is to be cleared there is a possible out of --bound access. But also the clearing of the last entry and the --adjustment of total number of stored IPv6 addresses is not --updated. This patch fixes that bug. Bug was found using coverity. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 7 +++++-- -- 1 file changed, 5 insertions(+), 2 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -873,9 +873,12 @@ static int brcmf_inet6addr_changed(struc -- } -- break; -- case NETDEV_DOWN: --- if (i < NDOL_MAX_ENTRIES) --- for (; i < ifp->ipv6addr_idx; i++) --+ if (i < NDOL_MAX_ENTRIES) { --+ for (; i < ifp->ipv6addr_idx - 1; i++) -- table[i] = table[i + 1]; --+ memset(&table[i], 0, sizeof(table[i])); --+ ifp->ipv6addr_idx--; --+ } -- break; -- default: -- break; -diff --git a/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch b/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch -deleted file mode 100644 -index a47cb3266fe936dc8d1b30fae76cb54c8811e3e4..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0046-brcmfmac-fix-out-of-bound-access-on-clearing-wowl-wa.patch -+++ /dev/null -@@ -1,44 +0,0 @@ --From a7ed7828ecda0c2b5e0d7f55dedd4230afd4b583 Mon Sep 17 00:00:00 2001 --From: Hante Meuleman --Date: Mon, 19 Sep 2016 12:09:58 +0100 --Subject: [PATCH] brcmfmac: fix out of bound access on clearing wowl wake -- indicator -- --Clearing the wowl wakeindicator happens with a rather odd --construction where the string "clear" is used to set the iovar --wowl_wakeind. This was implemented incorrectly as it caused an --out of bound access. Use an intermediate variable of correct --length and copy string in that. Problem was found using coverity. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 6 ++++-- -- 1 file changed, 4 insertions(+), 2 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -3623,6 +3623,7 @@ static void brcmf_configure_wowl(struct -- struct cfg80211_wowlan *wowl) -- { -- u32 wowl_config; --+ struct brcmf_wowl_wakeind_le wowl_wakeind; -- u32 i; -- -- brcmf_dbg(TRACE, "Suspend, wowl config.\n"); --@@ -3664,8 +3665,9 @@ static void brcmf_configure_wowl(struct -- if (!test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) -- wowl_config |= BRCMF_WOWL_UNASSOC; -- --- brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", "clear", --- sizeof(struct brcmf_wowl_wakeind_le)); --+ memcpy(&wowl_wakeind, "clear", 6); --+ brcmf_fil_iovar_data_set(ifp, "wowl_wakeind", &wowl_wakeind, --+ sizeof(wowl_wakeind)); -- brcmf_fil_iovar_int_set(ifp, "wowl", wowl_config); -- brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1); -- brcmf_bus_wowl_config(cfg->pub->bus_if, true); -diff --git a/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch b/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch -deleted file mode 100644 -index a652ae60b850540fb4f8996d912b0e8b6af06a9a..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0047-brcmfmac-simplify-mapping-of-auth-type.patch -+++ /dev/null -@@ -1,39 +0,0 @@ --From 92c313604711a0976def79dabb9e8da3cc2cc780 Mon Sep 17 00:00:00 2001 --From: Hante Meuleman --Date: Mon, 19 Sep 2016 12:09:59 +0100 --Subject: [PATCH] brcmfmac: simplify mapping of auth type -- --The 802.11 standard only has four valid auth type configurations of which --our firmware only supports two, ie. Open System and Shared Key. Simplify --the mapping falling back to automatic for other types specified by --user-space. -- --Reviewed-by: Arend Van Spriel --Reviewed-by: Franky Lin --Reviewed-by: Pieter-Paul Giesberts --Signed-off-by: Hante Meuleman --Signed-off-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 8 +------- -- 1 file changed, 1 insertion(+), 7 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -1577,15 +1577,9 @@ static s32 brcmf_set_auth_type(struct ne -- val = 1; -- brcmf_dbg(CONN, "shared key\n"); -- break; --- case NL80211_AUTHTYPE_AUTOMATIC: --- val = 2; --- brcmf_dbg(CONN, "automatic\n"); --- break; --- case NL80211_AUTHTYPE_NETWORK_EAP: --- brcmf_dbg(CONN, "network eap\n"); -- default: -- val = 2; --- brcmf_err("invalid auth type (%d)\n", sme->auth_type); --+ brcmf_dbg(CONN, "automatic, auth type (%d)\n", sme->auth_type); -- break; -- } -- -diff --git a/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch b/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch -deleted file mode 100644 -index a6fae378038dff7b672b82a21c0ed59f663473df..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0048-brcmfmac-fix-memory-leak-in-brcmf_fill_bss_param.patch -+++ /dev/null -@@ -1,41 +0,0 @@ --From 23e9c128adb2038c27a424a5f91136e7fa3e0dc6 Mon Sep 17 00:00:00 2001 --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Wed, 21 Sep 2016 08:23:24 +0200 --Subject: [PATCH] brcmfmac: fix memory leak in brcmf_fill_bss_param --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This function is called from get_station callback which means that every --time user space was getting/dumping station(s) we were leaking 2 KiB. -- --Signed-off-by: Rafał Miłecki --Fixes: 1f0dc59a6de ("brcmfmac: rework .get_station() callback") --Cc: stable@vger.kernel.org # 4.2+ --Acked-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 ++++- -- 1 file changed, 4 insertions(+), 1 deletion(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -2463,7 +2463,7 @@ static void brcmf_fill_bss_param(struct -- WL_BSS_INFO_MAX); -- if (err) { -- brcmf_err("Failed to get bss info (%d)\n", err); --- return; --+ goto out_kfree; -- } -- si->filled |= BIT(NL80211_STA_INFO_BSS_PARAM); -- si->bss_param.beacon_interval = le16_to_cpu(buf->bss_le.beacon_period); --@@ -2475,6 +2475,9 @@ static void brcmf_fill_bss_param(struct -- si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE; -- if (capability & WLAN_CAPABILITY_SHORT_SLOT_TIME) -- si->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME; --+ --+out_kfree: --+ kfree(buf); -- } -- -- static s32 -diff --git a/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch b/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch -deleted file mode 100644 -index 47af73ad29115ab80fe22cde35c127b86db8b8f5..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0049-brcmfmac-drop-unused-fields-from-struct-brcmf_pub.patch -+++ /dev/null -@@ -1,60 +0,0 @@ --From 2df86ad959c9d1cdbeb2f23a0801857731156692 Mon Sep 17 00:00:00 2001 --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Fri, 23 Sep 2016 15:27:46 +0200 --Subject: [PATCH] brcmfmac: drop unused fields from struct brcmf_pub --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --They seem to be there from the first day. We calculate these values but --never use them. -- --Signed-off-by: Rafał Miłecki --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 --- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h | 4 ---- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 2 -- -- 3 files changed, 9 deletions(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -508,9 +508,6 @@ int brcmf_net_attach(struct brcmf_if *if -- ndev->hard_header_len += drvr->hdrlen; -- ndev->ethtool_ops = &brcmf_ethtool_ops; -- --- drvr->rxsz = ndev->mtu + ndev->hard_header_len + --- drvr->hdrlen; --- -- /* set the mac address */ -- memcpy(ndev->dev_addr, ifp->mac_addr, ETH_ALEN); -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h --@@ -112,15 +112,11 @@ struct brcmf_pub { -- -- /* Internal brcmf items */ -- uint hdrlen; /* Total BRCMF header length (proto + bus) */ --- uint rxsz; /* Rx buffer size bus module should use */ -- -- /* Dongle media info */ -- char fwver[BRCMF_DRIVER_FIRMWARE_VERSION_LEN]; -- u8 mac[ETH_ALEN]; /* MAC address obtained from dongle */ -- --- /* Multicast data packets sent to dongle */ --- unsigned long tx_multicast; --- -- struct mac_address addresses[BRCMF_MAX_IFS]; -- -- struct brcmf_if *iflist[BRCMF_MAX_IFS]; ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c --@@ -2104,8 +2104,6 @@ int brcmf_fws_process_skb(struct brcmf_i -- if (!skb->priority) -- skb->priority = cfg80211_classify8021d(skb, NULL); -- --- drvr->tx_multicast += !!multicast; --- -- if (fws->avoid_queueing) { -- rc = brcmf_proto_txdata(drvr, ifp->ifidx, 0, skb); -- if (rc < 0) -diff --git a/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch b/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch -deleted file mode 100644 -index ca4863a19500ccc0d1f7f21b6ef032c48097aeba..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0050-brcmfmac-replace-WARNING-on-timeout-with-a-simple-er.patch -+++ /dev/null -@@ -1,38 +0,0 @@ --From 2f0e56fa37cce60a5ac5d451bcadec51cd711436 Mon Sep 17 00:00:00 2001 --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 27 Sep 2016 12:12:24 +0200 --Subject: [PATCH] brcmfmac: replace WARNING on timeout with a simple error -- message --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Even with timeout increased to 950 ms we get WARNINGs from time to time. --It mostly happens on A-MPDU stalls (e.g. when station goes out of --range). It may take up to 5-10 secods for the firmware to recover and --for that time it doesn't process packets. -- --It's still useful to have a message on time out as it may indicate some --firmware problem and incorrect key update. Raising a WARNING however --wasn't really that necessary, it doesn't point to any driver bug anymore --and backtrace wasn't much useful. -- --Signed-off-by: Rafał Miłecki --Acked-by: Arend van Spriel --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 3 ++- -- 1 file changed, 2 insertions(+), 1 deletion(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -1155,7 +1155,8 @@ int brcmf_netdev_wait_pend8021x(struct b -- !brcmf_get_pend_8021x_cnt(ifp), -- MAX_WAIT_FOR_8021X_TX); -- --- WARN_ON(!err); --+ if (!err) --+ brcmf_err("Timed out waiting for no pending 802.1x packets\n"); -- -- return !err; -- } -diff --git a/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch b/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch -deleted file mode 100644 -index 697635941b6eb28bc99c89e589b4a530107d2fa3..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/351-0051-brcmfmac-use-correct-skb-freeing-helper-when-deletin.patch -+++ /dev/null -@@ -1,58 +0,0 @@ --From 7f00ee2bbc630900ba16fc2690473f3e2db0e264 Mon Sep 17 00:00:00 2001 --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Tue, 27 Sep 2016 14:11:04 +0200 --Subject: [PATCH] brcmfmac: use correct skb freeing helper when deleting -- flowring --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Flowrings contain skbs waiting for transmission that were passed to us --by netif. It means we checked every one of them looking for 802.1x --Ethernet type. When deleting flowring we have to use freeing function --that will check for 802.1x type as well. -- --Freeing skbs without a proper check was leading to counter not being --properly decreased. This was triggering a WARNING every time --brcmf_netdev_wait_pend8021x was called. -- --Signed-off-by: Rafał Miłecki --Acked-by: Arend van Spriel --Cc: stable@vger.kernel.org # 4.5+ --Signed-off-by: Kalle Valo ----- -- drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c | 9 ++++++++- -- 1 file changed, 8 insertions(+), 1 deletion(-) -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c --@@ -234,13 +234,20 @@ static void brcmf_flowring_block(struct -- -- void brcmf_flowring_delete(struct brcmf_flowring *flow, u16 flowid) -- { --+ struct brcmf_bus *bus_if = dev_get_drvdata(flow->dev); -- struct brcmf_flowring_ring *ring; --+ struct brcmf_if *ifp; -- u16 hash_idx; --+ u8 ifidx; -- struct sk_buff *skb; -- -- ring = flow->rings[flowid]; -- if (!ring) -- return; --+ --+ ifidx = brcmf_flowring_ifidx_get(flow, flowid); --+ ifp = brcmf_get_ifp(bus_if->drvr, ifidx); --+ -- brcmf_flowring_block(flow, flowid, false); -- hash_idx = ring->hash_id; -- flow->hash[hash_idx].ifidx = BRCMF_FLOWRING_INVALID_IFIDX; --@@ -249,7 +256,7 @@ void brcmf_flowring_delete(struct brcmf_ -- -- skb = skb_dequeue(&ring->skblist); -- while (skb) { --- brcmu_pkt_buf_free_skb(skb); --+ brcmf_txfinalize(ifp, skb, false); -- skb = skb_dequeue(&ring->skblist); -- } -- -diff --git a/package/kernel/mac80211/patches/402-ath_regd_optional.patch b/package/kernel/mac80211/patches/402-ath_regd_optional.patch -index 735135307631290037afa6a00bab73a50fea78ba..463428371b4c96ee63b6eba1477023ff739c6129 100644 ---- a/package/kernel/mac80211/patches/402-ath_regd_optional.patch -+++ b/package/kernel/mac80211/patches/402-ath_regd_optional.patch -@@ -8,7 +8,7 @@ - + return; - +#endif - + -- for (band = 0; band < IEEE80211_NUM_BANDS; band++) { -+ for (band = 0; band < NUM_NL80211_BANDS; band++) { - if (!wiphy->bands[band]) - continue; - @@ -374,6 +378,10 @@ ath_reg_apply_ir_flags(struct wiphy *wip -@@ -19,7 +19,7 @@ - + return; - +#endif - + -- sband = wiphy->bands[IEEE80211_BAND_2GHZ]; -+ sband = wiphy->bands[NL80211_BAND_2GHZ]; - if (!sband) - return; - @@ -402,6 +410,10 @@ static void ath_reg_apply_radar_flags(st -@@ -30,7 +30,7 @@ - + return; - +#endif - + -- if (!wiphy->bands[IEEE80211_BAND_5GHZ]) -+ if (!wiphy->bands[NL80211_BAND_5GHZ]) - return; - - @@ -633,6 +645,11 @@ ath_regd_init_wiphy(struct ath_regulator -@@ -59,7 +59,7 @@ - ---help--- - --- a/.local-symbols - +++ b/.local-symbols --@@ -125,6 +125,7 @@ ADM8211= -+@@ -127,6 +127,7 @@ ADM8211= - ATH_COMMON= - WLAN_VENDOR_ATH= - ATH_DEBUG= -diff --git a/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch b/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch -index 1a624849546ca40db86f27a5edc3ffe860b2280d..f2f52f93afcd9501df5170dad99905c5baef06bc 100644 ---- a/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch -+++ b/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath9k/init.c - +++ b/drivers/net/wireless/ath/ath9k/init.c --@@ -722,6 +722,7 @@ static const struct ieee80211_iface_limi -+@@ -727,6 +727,7 @@ static const struct ieee80211_iface_limi - BIT(NL80211_IFTYPE_AP) }, - { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) | - BIT(NL80211_IFTYPE_P2P_GO) }, -diff --git a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch -index a7f9d9f8b9706b0c2d359e09e3d3ef396764b3d3..f21eed18c3f1ff0ec43f42632bda1fd4c1236faf 100644 ---- a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch -+++ b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath9k/debug.c - +++ b/drivers/net/wireless/ath/ath9k/debug.c --@@ -1301,6 +1301,53 @@ void ath9k_deinit_debug(struct ath_softc -+@@ -1315,6 +1315,53 @@ void ath9k_deinit_debug(struct ath_softc - ath9k_cmn_spectral_deinit_debug(&sc->spec_priv); - } - -@@ -54,7 +54,7 @@ - int ath9k_init_debug(struct ath_hw *ah) - { - struct ath_common *common = ath9k_hw_common(ah); --@@ -1320,6 +1367,8 @@ int ath9k_init_debug(struct ath_hw *ah) -+@@ -1334,6 +1381,8 @@ int ath9k_init_debug(struct ath_hw *ah) - ath9k_tx99_init_debug(sc); - ath9k_cmn_spectral_init_debug(&sc->spec_priv, sc->debug.debugfs_phy); - -diff --git a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch -index 5892c3e17a65ae7eea33fd44906a6eb8cb511c70..1825d77b7f83e4a5cf5922ba6fd314a4c8704759 100644 ---- a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch -+++ b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath9k/init.c - +++ b/drivers/net/wireless/ath/ath9k/init.c --@@ -1024,23 +1024,23 @@ static int __init ath9k_init(void) -+@@ -1030,23 +1030,23 @@ static int __init ath9k_init(void) - { - int error; - -diff --git a/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch b/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch -index 6766111dfd3e43b2251a0248f256e97f8d5cbffa..15b8d7b86b137b9c5ba46ae5a7afc7ac5f455aaf 100644 ---- a/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch -+++ b/package/kernel/mac80211/patches/511-ath9k_reduce_rxbuf.patch -@@ -8,4 +8,4 @@ - +#define ATH_RXBUF 256 - #define ATH_TXBUF 512 - #define ATH_TXBUF_RESERVE 5 -- #define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE) -+ #define ATH_TXMAXTRY 13 -diff --git a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch -index 5ecf528e598aff996c21b128d7fdcfecc6fa564f..c98072bac9cba922eac5031dede34116485ac435 100644 ---- a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch -+++ b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath9k/debug.c - +++ b/drivers/net/wireless/ath/ath9k/debug.c --@@ -1348,6 +1348,52 @@ static const struct file_operations fops -+@@ -1362,6 +1362,52 @@ static const struct file_operations fops - .owner = THIS_MODULE - }; - -@@ -53,7 +53,7 @@ - int ath9k_init_debug(struct ath_hw *ah) - { - struct ath_common *common = ath9k_hw_common(ah); --@@ -1369,6 +1415,8 @@ int ath9k_init_debug(struct ath_hw *ah) -+@@ -1383,6 +1429,8 @@ int ath9k_init_debug(struct ath_hw *ah) - - debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc, - &fops_eeprom); -@@ -90,7 +90,7 @@ - ichan->channel = chan->center_freq; - ichan->chan = chan; - @@ -308,7 +310,19 @@ static void ath9k_cmn_update_ichannel(st -- if (chan->band == IEEE80211_BAND_5GHZ) -+ if (chan->band == NL80211_BAND_5GHZ) - flags |= CHANNEL_5GHZ; - - - switch (chandef->width) { -diff --git a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch -index c84d1bc8290e673d8366e3fcf9b97e84e634726a..167eeff2d2acfd98de87a8275bd56ef1c22928cd 100644 ---- a/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch -+++ b/package/kernel/mac80211/patches/513-ath9k_add_pci_ids.patch -@@ -20,7 +20,7 @@ - #define AR9160_DEVID_PCI 0x0027 - --- a/drivers/net/wireless/ath/ath9k/pci.c - +++ b/drivers/net/wireless/ath/ath9k/pci.c --@@ -751,6 +751,7 @@ static const struct pci_device_id ath_pc -+@@ -761,6 +761,7 @@ static const struct pci_device_id ath_pc - .driver_data = ATH9K_PCI_BT_ANT_DIV }, - #endif - -diff --git a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch -index e151a12967ccf90d2de7cfde5728803b1069591c..c40598dde63b7c91cef9040e9927274cfd0c358a 100644 ---- a/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch -+++ b/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch -@@ -1,6 +1,6 @@ - --- a/include/net/cfg80211.h - +++ b/include/net/cfg80211.h --@@ -2363,6 +2363,7 @@ struct cfg80211_qos_map { -+@@ -2410,6 +2410,7 @@ struct cfg80211_qos_map { - * (as advertised by the nl80211 feature flag.) - * @get_tx_power: store the current TX power into the dbm variable; - * return 0 if successful -@@ -8,7 +8,7 @@ - * - * @set_wds_peer: set the WDS peer for a WDS interface - * --@@ -2624,6 +2625,7 @@ struct cfg80211_ops { -+@@ -2671,6 +2672,7 @@ struct cfg80211_ops { - enum nl80211_tx_power_setting type, int mbm); - int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, - int *dbm); -@@ -18,7 +18,7 @@ - const u8 *addr); - --- a/include/net/mac80211.h - +++ b/include/net/mac80211.h --@@ -1286,6 +1286,7 @@ enum ieee80211_smps_mode { -+@@ -1317,6 +1317,7 @@ enum ieee80211_smps_mode { - * - * @power_level: requested transmit power (in dBm), backward compatibility - * value only that is set to the minimum of all interfaces -@@ -26,7 +26,7 @@ - * - * @chandef: the channel definition to tune to - * @radar_enabled: whether radar detection is enabled --@@ -1306,6 +1307,7 @@ enum ieee80211_smps_mode { -+@@ -1337,6 +1338,7 @@ enum ieee80211_smps_mode { - struct ieee80211_conf { - u32 flags; - int power_level, dynamic_ps_timeout; -@@ -36,9 +36,9 @@ - u8 ps_dtim_period; - --- a/include/uapi/linux/nl80211.h - +++ b/include/uapi/linux/nl80211.h --@@ -1790,6 +1790,9 @@ enum nl80211_commands { -- * between scans. The scan plans are executed sequentially. -- * Each scan plan is a nested attribute of &enum nl80211_sched_scan_plan. -+@@ -1829,6 +1829,9 @@ enum nl80211_commands { -+ * %NL80211_ATTR_EXT_CAPA_MASK, to specify the extended capabilities per -+ * interface type. - * - + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce - + * transmit power to stay within regulatory limits. u32, dBi. -@@ -46,9 +46,9 @@ - * @NUM_NL80211_ATTR: total number of nl80211_attrs available - * @NL80211_ATTR_MAX: highest attribute number currently defined - * @__NL80211_ATTR_AFTER_LAST: internal use --@@ -2164,6 +2167,8 @@ enum nl80211_attrs { -- NL80211_ATTR_MAX_SCAN_PLAN_ITERATIONS, -- NL80211_ATTR_SCHED_SCAN_PLANS, -+@@ -2213,6 +2216,8 @@ enum nl80211_attrs { -+ -+ NL80211_ATTR_IFTYPE_EXT_CAPA, - - + NL80211_ATTR_WIPHY_ANTENNA_GAIN, - + -@@ -57,7 +57,7 @@ - __NL80211_ATTR_AFTER_LAST, - --- a/net/mac80211/cfg.c - +++ b/net/mac80211/cfg.c --@@ -2229,6 +2229,19 @@ static int ieee80211_get_tx_power(struct -+@@ -2238,6 +2238,19 @@ static int ieee80211_get_tx_power(struct - return 0; - } - -@@ -77,7 +77,7 @@ - static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, - const u8 *addr) - { --@@ -3403,6 +3416,7 @@ const struct cfg80211_ops mac80211_confi -+@@ -3412,6 +3425,7 @@ const struct cfg80211_ops mac80211_confi - .set_wiphy_params = ieee80211_set_wiphy_params, - .set_tx_power = ieee80211_set_tx_power, - .get_tx_power = ieee80211_get_tx_power, -@@ -87,7 +87,7 @@ - CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) - --- a/net/mac80211/ieee80211_i.h - +++ b/net/mac80211/ieee80211_i.h --@@ -1318,6 +1318,7 @@ struct ieee80211_local { -+@@ -1338,6 +1338,7 @@ struct ieee80211_local { - int dynamic_ps_forced_timeout; - - int user_power_level; /* in dBm, for all interfaces */ -@@ -119,7 +119,7 @@ - if (local->hw.conf.power_level != power) { - changed |= IEEE80211_CONF_CHANGE_POWER; - local->hw.conf.power_level = power; --@@ -586,6 +592,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ -+@@ -588,6 +594,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ - IEEE80211_RADIOTAP_MCS_HAVE_BW; - local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | - IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; -@@ -129,15 +129,15 @@ - local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; - --- a/net/wireless/nl80211.c - +++ b/net/wireless/nl80211.c --@@ -403,6 +403,7 @@ static const struct nla_policy nl80211_p -- [NL80211_ATTR_NETNS_FD] = { .type = NLA_U32 }, -- [NL80211_ATTR_SCHED_SCAN_DELAY] = { .type = NLA_U32 }, -- [NL80211_ATTR_REG_INDOOR] = { .type = NLA_FLAG }, -+@@ -407,6 +407,7 @@ static const struct nla_policy nl80211_p -+ [NL80211_ATTR_PBSS] = { .type = NLA_FLAG }, -+ [NL80211_ATTR_BSS_SELECT] = { .type = NLA_NESTED }, -+ [NL80211_ATTR_STA_SUPPORT_P2P_PS] = { .type = NLA_U8 }, - + [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, - }; - - /* policy for the key attributes */ --@@ -2220,6 +2221,20 @@ static int nl80211_set_wiphy(struct sk_b -+@@ -2294,6 +2295,20 @@ static int nl80211_set_wiphy(struct sk_b - if (result) - return result; - } -diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch -index 5a5e4643f5287e1426dd63a662b1f9b75cf22c80..0b257496082bab62ac43daf232f83628888e04ed 100644 ---- a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch -+++ b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch -@@ -1,16 +1,16 @@ - --- a/drivers/net/wireless/ath/ath9k/ath9k.h - +++ b/drivers/net/wireless/ath/ath9k/ath9k.h - @@ -814,6 +814,9 @@ static inline int ath9k_dump_btcoex(stru -+ #ifdef CPTCFG_MAC80211_LEDS - void ath_init_leds(struct ath_softc *sc); - void ath_deinit_leds(struct ath_softc *sc); -- void ath_fill_led_pin(struct ath_softc *sc); - +int ath_create_gpio_led(struct ath_softc *sc, int gpio, const char *name, --+ const char *trigger, bool active_low); -++ const char *trigger, bool active_low); - + - #else - static inline void ath_init_leds(struct ath_softc *sc) - { --@@ -953,6 +956,13 @@ void ath_ant_comb_scan(struct ath_softc -+@@ -950,6 +953,13 @@ void ath_ant_comb_scan(struct ath_softc - - #define ATH9K_NUM_CHANCTX 2 /* supports 2 operating channels */ - -@@ -24,7 +24,7 @@ - struct ath_softc { - struct ieee80211_hw *hw; - struct device *dev; --@@ -1005,9 +1015,8 @@ struct ath_softc { -+@@ -1002,9 +1012,8 @@ struct ath_softc { - spinlock_t chan_lock; - - #ifdef CPTCFG_MAC80211_LEDS -@@ -38,24 +38,33 @@ - #ifdef CPTCFG_ATH9K_DEBUGFS - --- a/drivers/net/wireless/ath/ath9k/gpio.c - +++ b/drivers/net/wireless/ath/ath9k/gpio.c --@@ -24,45 +24,102 @@ -- static void ath_led_brightness(struct led_classdev *led_cdev, -- enum led_brightness brightness) -+@@ -22,7 +22,7 @@ -+ -+ #ifdef CPTCFG_MAC80211_LEDS -+ -+-void ath_fill_led_pin(struct ath_softc *sc) -++static void ath_fill_led_pin(struct ath_softc *sc) - { --- struct ath_softc *sc = container_of(led_cdev, struct ath_softc, led_cdev); --- u32 val = (brightness == LED_OFF); -+ struct ath_hw *ah = sc->sc_ah; -+ -+@@ -39,61 +39,111 @@ void ath_fill_led_pin(struct ath_softc * -+ else -+ ah->led_pin = ATH_LED_PIN_DEF; -+ } -++} -++ -++static void ath_led_brightness(struct led_classdev *led_cdev, -++ enum led_brightness brightness) -++{ - + struct ath_led *led = container_of(led_cdev, struct ath_led, cdev); - + struct ath_softc *sc = led->sc; -- --- if (sc->sc_ah->config.led_active_high) --- val = !val; -++ - + ath9k_ps_wakeup(sc); - + ath9k_hw_set_gpio(sc->sc_ah, led->gpio->gpio, - + (brightness != LED_OFF) ^ led->gpio->active_low); - + ath9k_ps_restore(sc); - +} -- --- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val); -++ - +static int ath_add_led(struct ath_softc *sc, struct ath_led *led) - +{ - + const struct gpio_led *gpio = led->gpio; -@@ -71,30 +80,40 @@ - + - + led->sc = sc; - + list_add(&led->list, &sc->leds); --+ --+ /* Configure gpio for output */ --+ ath9k_hw_cfg_output(sc->sc_ah, gpio->gpio, --+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT); --+ -+ -+ /* Configure gpio for output */ -+- ath9k_hw_gpio_request_out(ah, ah->led_pin, "ath9k-led", -++ ath9k_hw_gpio_request_out(sc->sc_ah, gpio->gpio, gpio->name, -+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT); -+ -+- /* LED off, active low */ -+- ath9k_hw_set_gpio(ah, ah->led_pin, ah->config.led_active_high ? 0 : 1); - + /* LED off */ - + ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low); - + - + return 0; --+} --+ -+ } -+ -+-static void ath_led_brightness(struct led_classdev *led_cdev, -+- enum led_brightness brightness) - +int ath_create_gpio_led(struct ath_softc *sc, int gpio_num, const char *name, - + const char *trigger, bool active_low) --+{ -+ { -+- struct ath_softc *sc = container_of(led_cdev, struct ath_softc, led_cdev); -+- u32 val = (brightness == LED_OFF); - + struct ath_led *led; - + struct gpio_led *gpio; - + char *_name; - + int ret; --+ -+ -+- if (sc->sc_ah->config.led_active_high) -+- val = !val; - + led = kzalloc(sizeof(*led) + sizeof(*gpio) + strlen(name) + 1, - + GFP_KERNEL); - + if (!led) - + return -ENOMEM; --+ -+ -+- ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, val); - + led->gpio = gpio = (struct gpio_led *) (led + 1); - + _name = (char *) (led->gpio + 1); - + -@@ -115,15 +134,18 @@ - { - - if (!sc->led_registered) - - return; --+ struct ath_led *led; -- -+- - - ath_led_brightness(&sc->led_cdev, LED_OFF); - - led_classdev_unregister(&sc->led_cdev); -++ struct ath_led *led; -+ -+- ath9k_hw_gpio_free(sc->sc_ah, sc->sc_ah->led_pin); - + while (!list_empty(&sc->leds)) { - + led = list_first_entry(&sc->leds, struct ath_led, list); - + list_del(&led->list); - + ath_led_brightness(&led->cdev, LED_OFF); - + led_classdev_unregister(&led->cdev); -++ ath9k_hw_gpio_free(sc->sc_ah, led->gpio->gpio); - + kfree(led); - + } - } -@@ -139,6 +161,8 @@ - if (AR_SREV_9100(sc->sc_ah)) - return; - -+ ath_fill_led_pin(sc); -+ - - if (!ath9k_led_blink) - - sc->led_cdev.default_trigger = - - ieee80211_get_radio_led_name(sc->hw); -@@ -159,13 +183,14 @@ - + trigger = ieee80211_get_radio_led_name(sc->hw); - - - sc->led_registered = true; --+ ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, !sc->sc_ah->config.led_active_high); -++ ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, -++ !sc->sc_ah->config.led_active_high); - } -+ #endif - -- void ath_fill_led_pin(struct ath_softc *sc) - --- a/drivers/net/wireless/ath/ath9k/init.c - +++ b/drivers/net/wireless/ath/ath9k/init.c --@@ -936,7 +936,7 @@ int ath9k_init_device(u16 devid, struct -+@@ -942,7 +942,7 @@ int ath9k_init_device(u16 devid, struct - - #ifdef CPTCFG_MAC80211_LEDS - /* must be initialized before ieee80211_register_hw */ -@@ -176,7 +201,7 @@ - #endif - --- a/drivers/net/wireless/ath/ath9k/debug.c - +++ b/drivers/net/wireless/ath/ath9k/debug.c --@@ -1393,6 +1393,61 @@ static const struct file_operations fops -+@@ -1407,6 +1407,61 @@ static const struct file_operations fops - .llseek = default_llseek, - }; - -@@ -238,7 +263,7 @@ - - int ath9k_init_debug(struct ath_hw *ah) - { --@@ -1417,6 +1472,10 @@ int ath9k_init_debug(struct ath_hw *ah) -+@@ -1431,6 +1486,10 @@ int ath9k_init_debug(struct ath_hw *ah) - &fops_eeprom); - debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, - sc, &fops_chanbw); -diff --git a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch -index 7c10ea6b0d042db76b703e12356f53bea36e90de..f656697a077a417c7993bd41880f65b7b261fc99 100644 ---- a/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch -+++ b/package/kernel/mac80211/patches/531-ath9k_extra_platform_leds.patch -@@ -1,6 +1,6 @@ - --- a/include/linux/ath9k_platform.h - +++ b/include/linux/ath9k_platform.h --@@ -41,6 +41,9 @@ struct ath9k_platform_data { -+@@ -45,6 +45,9 @@ struct ath9k_platform_data { - int (*external_reset)(void); - - bool use_eeprom; -@@ -20,7 +20,7 @@ - - /********************************/ - /* LED functions */ --@@ -88,6 +89,24 @@ int ath_create_gpio_led(struct ath_softc -+@@ -108,6 +109,24 @@ int ath_create_gpio_led(struct ath_softc - return ret; - } - -@@ -45,7 +45,7 @@ - void ath_deinit_leds(struct ath_softc *sc) - { - struct ath_led *led; --@@ -103,8 +122,10 @@ void ath_deinit_leds(struct ath_softc *s -+@@ -124,8 +143,10 @@ void ath_deinit_leds(struct ath_softc *s - - void ath_init_leds(struct ath_softc *sc) - { -@@ -56,10 +56,10 @@ - - INIT_LIST_HEAD(&sc->leds); - --@@ -120,6 +141,12 @@ void ath_init_leds(struct ath_softc *sc) -- trigger = ieee80211_get_radio_led_name(sc->hw); -+@@ -144,6 +165,12 @@ void ath_init_leds(struct ath_softc *sc) - -- ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, !sc->sc_ah->config.led_active_high); -+ ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, -+ !sc->sc_ah->config.led_active_high); - + - + if (!pdata) - + return; -@@ -67,5 +67,5 @@ - + for (i = 0; i < pdata->num_leds; i++) - + ath_create_platform_led(sc, &pdata->leds[i]); - } -+ #endif - -- void ath_fill_led_pin(struct ath_softc *sc) -diff --git a/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch b/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch -index 6d62a2b1c2cdb716c9e207e219cad96075b82bac..50d8a7abae686b6b25ad561c71176b5661dbc437 100644 ---- a/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch -+++ b/package/kernel/mac80211/patches/532-ath9k_get_led_polarity_from_platform_data.patch -@@ -1,6 +1,6 @@ - --- a/include/linux/ath9k_platform.h - +++ b/include/linux/ath9k_platform.h --@@ -36,6 +36,7 @@ struct ath9k_platform_data { -+@@ -40,6 +40,7 @@ struct ath9k_platform_data { - bool tx_gain_buffalo; - bool disable_2ghz; - bool disable_5ghz; -@@ -10,7 +10,7 @@ - int (*external_reset)(void); - --- a/drivers/net/wireless/ath/ath9k/init.c - +++ b/drivers/net/wireless/ath/ath9k/init.c --@@ -577,6 +577,7 @@ static int ath9k_init_softc(u16 devid, s -+@@ -580,6 +580,7 @@ static int ath9k_init_softc(u16 devid, s - ah->external_reset = pdata->external_reset; - ah->disable_2ghz = pdata->disable_2ghz; - ah->disable_5ghz = pdata->disable_5ghz; -diff --git a/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch b/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch -index 3c5e9f5fcda6cc16bcdbfe1a757f8a5c352eed15..c2d27815592ba1e09251e1c581e634c985750c5e 100644 ---- a/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch -+++ b/package/kernel/mac80211/patches/541-ath9k_rx_dma_stop_check.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath9k/mac.c - +++ b/drivers/net/wireless/ath/ath9k/mac.c --@@ -695,7 +695,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw -+@@ -698,7 +698,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw - { - #define AH_RX_STOP_DMA_TIMEOUT 10000 /* usec */ - struct ath_common *common = ath9k_hw_common(ah); -@@ -9,7 +9,7 @@ - int i; - - /* Enable access to the DMA observation bus */ --@@ -725,6 +725,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw -+@@ -728,6 +728,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw - } - - if (i == 0) { -diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch -index e83c6bfbf90d18577398c50fca1fa46b46e7822c..461564350feb43410e5c702a8a67514cdfaa3961 100644 ---- a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch -+++ b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath9k/debug.c - +++ b/drivers/net/wireless/ath/ath9k/debug.c --@@ -1449,6 +1449,50 @@ static const struct file_operations fops -+@@ -1463,6 +1463,50 @@ static const struct file_operations fops - #endif - - -@@ -51,7 +51,7 @@ - int ath9k_init_debug(struct ath_hw *ah) - { - struct ath_common *common = ath9k_hw_common(ah); --@@ -1476,6 +1520,8 @@ int ath9k_init_debug(struct ath_hw *ah) -+@@ -1490,6 +1534,8 @@ int ath9k_init_debug(struct ath_hw *ah) - debugfs_create_file("gpio_led", S_IWUSR, - sc->debug.debugfs_phy, sc, &fops_gpio_led); - #endif -@@ -62,7 +62,7 @@ - debugfs_create_devm_seqfile(sc->dev, "interrupt", sc->debug.debugfs_phy, - --- a/drivers/net/wireless/ath/ath9k/hw.h - +++ b/drivers/net/wireless/ath/ath9k/hw.h --@@ -519,6 +519,12 @@ enum { -+@@ -520,6 +520,12 @@ enum { - ATH9K_RESET_COLD, - }; - -@@ -75,7 +75,7 @@ - struct ath9k_hw_version { - u32 magic; - u16 devid; --@@ -804,6 +810,8 @@ struct ath_hw { -+@@ -805,6 +811,8 @@ struct ath_hw { - u32 rfkill_polarity; - u32 ah_flags; - -@@ -84,7 +84,7 @@ - bool reset_power_on; - bool htc_reset_init; - --@@ -1066,6 +1074,7 @@ void ath9k_hw_check_nav(struct ath_hw *a -+@@ -1068,6 +1076,7 @@ void ath9k_hw_check_nav(struct ath_hw *a - bool ath9k_hw_check_alive(struct ath_hw *ah); - - bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); -@@ -94,7 +94,7 @@ - struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, - --- a/drivers/net/wireless/ath/ath9k/hw.c - +++ b/drivers/net/wireless/ath/ath9k/hw.c --@@ -1819,6 +1819,20 @@ u32 ath9k_hw_get_tsf_offset(struct times -+@@ -1841,6 +1841,20 @@ u32 ath9k_hw_get_tsf_offset(struct times - } - EXPORT_SYMBOL(ath9k_hw_get_tsf_offset); - -@@ -115,7 +115,7 @@ - int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, - struct ath9k_hw_cal_data *caldata, bool fastcc) - { --@@ -2027,6 +2041,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st -+@@ -2049,6 +2063,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st - ar9003_hw_disable_phy_restart(ah); - - ath9k_hw_apply_gpio_override(ah); -diff --git a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch -index d7bb5a12ce6f4135cdb7eaa951321cec48d221b8..656ed439b9b8aebd554e91f9963c2f6521651960 100644 ---- a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch -+++ b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath9k/hw.h - +++ b/drivers/net/wireless/ath/ath9k/hw.h --@@ -720,6 +720,7 @@ struct ath_spec_scan { -+@@ -721,6 +721,7 @@ struct ath_spec_scan { - * @config_pci_powersave: - * @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC - * -@@ -8,7 +8,7 @@ - * @spectral_scan_config: set parameters for spectral scan and enable/disable it - * @spectral_scan_trigger: trigger a spectral scan run - * @spectral_scan_wait: wait for a spectral scan run to finish --@@ -742,6 +743,7 @@ struct ath_hw_ops { -+@@ -743,6 +744,7 @@ struct ath_hw_ops { - struct ath_hw_antcomb_conf *antconf); - void (*antdiv_comb_conf_set)(struct ath_hw *ah, - struct ath_hw_antcomb_conf *antconf); -@@ -18,7 +18,7 @@ - void (*spectral_scan_trigger)(struct ath_hw *ah); - --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c - +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c --@@ -1998,6 +1998,26 @@ void ar9003_hw_init_rate_txpower(struct -+@@ -1945,6 +1945,26 @@ void ar9003_hw_init_rate_txpower(struct - } - } - -@@ -45,7 +45,7 @@ - void ar9003_hw_attach_phy_ops(struct ath_hw *ah) - { - struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); --@@ -2034,6 +2054,7 @@ void ar9003_hw_attach_phy_ops(struct ath -+@@ -1981,6 +2001,7 @@ void ar9003_hw_attach_phy_ops(struct ath - priv_ops->set_radar_params = ar9003_hw_set_radar_params; - priv_ops->fast_chan_change = ar9003_hw_fast_chan_change; - -@@ -55,9 +55,9 @@ - ops->spectral_scan_config = ar9003_hw_spectral_scan_config; - --- a/drivers/net/wireless/ath/ath9k/init.c - +++ b/drivers/net/wireless/ath/ath9k/init.c --@@ -711,7 +711,8 @@ static void ath9k_init_txpower_limits(st -+@@ -716,7 +716,8 @@ static void ath9k_init_txpower_limits(st - if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) -- ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ); -+ ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ); - - - ah->curchan = curchan; - + if (curchan) -@@ -65,7 +65,7 @@ - } - - static const struct ieee80211_iface_limit if_limits[] = { --@@ -897,6 +898,18 @@ static void ath9k_set_hw_capab(struct at -+@@ -903,6 +904,18 @@ static void ath9k_set_hw_capab(struct at - SET_IEEE80211_PERM_ADDR(hw, common->macaddr); - } - -@@ -84,7 +84,7 @@ - int ath9k_init_device(u16 devid, struct ath_softc *sc, - const struct ath_bus_ops *bus_ops) - { --@@ -942,6 +955,8 @@ int ath9k_init_device(u16 devid, struct -+@@ -948,6 +961,8 @@ int ath9k_init_device(u16 devid, struct - ARRAY_SIZE(ath9k_tpt_blink)); - #endif - -@@ -110,7 +110,7 @@ - static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable) - --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c - +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c --@@ -1327,9 +1327,30 @@ void ar5008_hw_init_rate_txpower(struct -+@@ -1325,9 +1325,30 @@ void ar5008_hw_init_rate_txpower(struct - } - } - -@@ -141,7 +141,7 @@ - static const u32 ar5416_cca_regs[6] = { - AR_PHY_CCA, - AR_PHY_CH1_CCA, --@@ -1344,6 +1365,8 @@ int ar5008_hw_attach_phy_ops(struct ath_ -+@@ -1342,6 +1363,8 @@ int ar5008_hw_attach_phy_ops(struct ath_ - if (ret) - return ret; - -@@ -175,7 +175,7 @@ - #define AR_PHY_TIMING2 0x9810 - #define AR_PHY_TIMING3 0x9814 - #define AR_PHY_TIMING3_DSC_MAN 0xFFFE0000 --@@ -390,6 +399,8 @@ -+@@ -393,6 +402,8 @@ - #define AR_PHY_RFBUS_GRANT 0x9C20 - #define AR_PHY_RFBUS_GRANT_EN 0x00000001 - -diff --git a/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch b/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch -index 8768c5d89a7b38d0e0a3c07dc94bf52edb480732..b9c962e1b5d13338ab4f7ddf6f370dbffeda299a 100644 ---- a/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch -+++ b/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch -@@ -20,9 +20,9 @@ - /******************/ - /* Chip Revisions */ - /******************/ --@@ -1397,6 +1410,9 @@ static bool ath9k_hw_set_reset(struct at -- if (AR_SREV_9100(ah)) -+@@ -1417,6 +1430,9 @@ static bool ath9k_hw_set_reset(struct at - udelay(50); -+ } - - + if (AR_SREV_9330(ah) || AR_SREV_9340(ah)) - + ath9k_hw_disable_pll_lock_detect(ah); -@@ -30,7 +30,7 @@ - return true; - } - --@@ -1496,6 +1512,9 @@ static bool ath9k_hw_chip_reset(struct a -+@@ -1516,6 +1532,9 @@ static bool ath9k_hw_chip_reset(struct a - ar9003_hw_internal_regulator_apply(ah); - ath9k_hw_init_pll(ah, chan); - -@@ -40,7 +40,7 @@ - return true; - } - --@@ -1797,8 +1816,14 @@ static int ath9k_hw_do_fastcc(struct ath -+@@ -1819,8 +1838,14 @@ static int ath9k_hw_do_fastcc(struct ath - if (AR_SREV_9271(ah)) - ar9002_hw_load_ani_reg(ah, chan); - -@@ -55,7 +55,7 @@ - return -EINVAL; - } - --@@ -2052,6 +2077,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st -+@@ -2074,6 +2099,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st - ath9k_hw_set_radar_params(ah); - } - -diff --git a/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch b/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch -index 3d24ccda1f83daee789973c101bd650df4c1694b..b639f972d83b8966812b98c7b99f546b187001fc 100644 ---- a/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch -+++ b/package/kernel/mac80211/patches/545-ath9k_ani_ws_detect.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c - +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c --@@ -956,55 +956,6 @@ static bool ar5008_hw_ani_control_new(st -+@@ -954,55 +954,6 @@ static bool ar5008_hw_ani_control_new(st - * on == 0 means more noise imm - */ - u32 on = param ? 1 : 0; -@@ -58,7 +58,7 @@ - REG_SET_BIT(ah, AR_PHY_SFCORR_LOW, - --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c - +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c --@@ -41,20 +41,6 @@ static const int cycpwrThr1_table[] = -+@@ -42,20 +42,6 @@ static const int cycpwrThr1_table[] = - /* level: 0 1 2 3 4 5 6 7 8 */ - { -6, -4, -2, 0, 2, 4, 6, 8 }; /* lvl 0-7, default 3 */ - -@@ -79,7 +79,7 @@ - static const u8 ofdm2pwr[] = { - ALL_TARGET_LEGACY_6_24, - ALL_TARGET_LEGACY_6_24, --@@ -1089,11 +1075,6 @@ static bool ar9003_hw_ani_control(struct -+@@ -1095,11 +1081,6 @@ static bool ar9003_hw_ani_control(struct - struct ath_common *common = ath9k_hw_common(ah); - struct ath9k_channel *chan = ah->curchan; - struct ar5416AniState *aniState = &ah->ani; -@@ -91,7 +91,7 @@ - s32 value, value2; - - switch (cmd & ah->ani_function) { --@@ -1107,61 +1088,6 @@ static bool ar9003_hw_ani_control(struct -+@@ -1113,61 +1094,6 @@ static bool ar9003_hw_ani_control(struct - */ - u32 on = param ? 1 : 0; - -diff --git a/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..ced72c6c69fe30ebbc1c416c5e60d95dc985d6db ---- /dev/null -+++ b/package/kernel/mac80211/patches/546-ath9k_platform_led_name.patch -@@ -0,0 +1,39 @@ -+From: Michal Cieslakiewicz -+Date: Sun, 31 Jan 2016 20:45:57 +0100 -+Subject: [PATCH v4 1/8] mac80211: ath9k: enable platform WLAN LED name -+ -+Enable platform-supplied WLAN LED name for ath9k device. It replaces generic -+'ath9k-phy*' label with string set during platform initialization. -+ -+Signed-off-by: Michal Cieslakiewicz -+--- -+ drivers/net/wireless/ath/ath9k/gpio.c | 10 +++++++--- -+ include/linux/ath9k_platform.h | 1 + -+ 2 files changed, 8 insertions(+), 3 deletions(-) -+ -+--- a/drivers/net/wireless/ath/ath9k/gpio.c -++++ b/drivers/net/wireless/ath/ath9k/gpio.c -+@@ -155,8 +155,11 @@ void ath_init_leds(struct ath_softc *sc) -+ -+ ath_fill_led_pin(sc); -+ -+- snprintf(led_name, sizeof(led_name), "ath9k-%s", -+- wiphy_name(sc->hw->wiphy)); -++ if (pdata && pdata->led_name) -++ strncpy(led_name, pdata->led_name, sizeof(led_name)); -++ else -++ snprintf(led_name, sizeof(led_name), "ath9k-%s", -++ wiphy_name(sc->hw->wiphy)); -+ -+ if (ath9k_led_blink) -+ trigger = sc->led_default_trigger; -+--- a/include/linux/ath9k_platform.h -++++ b/include/linux/ath9k_platform.h -+@@ -49,6 +49,7 @@ struct ath9k_platform_data { -+ -+ int num_leds; -+ const struct gpio_led *leds; -++ const char *led_name; -+ }; -+ -+ #endif /* _LINUX_ATH9K_PLATFORM_H */ -diff --git a/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch b/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..5d84cf0c423a6138b0a48305006202f00e4bbdef ---- /dev/null -+++ b/package/kernel/mac80211/patches/547-ath9k_led_defstate_fix.patch -@@ -0,0 +1,29 @@ -+From: Michal Cieslakiewicz -+Date: Sun, 31 Jan 2016 20:48:49 +0100 -+Subject: [PATCH v4 2/8] mac80211: ath9k: set default state for platform LEDs -+ -+Support default state for platform LEDs connected to ath9k device. -+Now LEDs are correctly set on or off at ath9k module initialization. -+Very useful if power LED is connected to wireless chip. -+ -+Signed-off-by: Michal Cieslakiewicz -+--- -+ gpio.c | 7 +++++-- -+ 1 file changed, 5 insertions(+), 2 deletions(-) -+ -+--- a/drivers/net/wireless/ath/ath9k/gpio.c -++++ b/drivers/net/wireless/ath/ath9k/gpio.c -+@@ -74,8 +74,11 @@ static int ath_add_led(struct ath_softc -+ ath9k_hw_gpio_request_out(sc->sc_ah, gpio->gpio, gpio->name, -+ AR_GPIO_OUTPUT_MUX_AS_OUTPUT); -+ -+- /* LED off */ -+- ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low); -++ /* Set default LED state */ -++ if (gpio->default_state == LEDS_GPIO_DEFSTATE_ON) -++ ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, !gpio->active_low); -++ else -++ ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low); -+ -+ return 0; -+ } -diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..de7c0ac8f034402d6cae563ee3a6b1aafa184ab0 ---- /dev/null -+++ b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch -@@ -0,0 +1,234 @@ -+From: Michal Cieslakiewicz -+Date: Sun, 31 Jan 2016 21:01:31 +0100 -+Subject: [PATCH v4 4/8] mac80211: ath9k: enable access to GPIO -+ -+Enable access to GPIO chip and its pins for Atheros AR92xx -+wireless devices. For now AR9285 and AR9287 are supported. -+ -+Signed-off-by: Michal Cieslakiewicz -+Signed-off-by: Felix Fietkau -+--- -+--- a/drivers/net/wireless/ath/ath9k/ath9k.h -++++ b/drivers/net/wireless/ath/ath9k/ath9k.h -+@@ -24,6 +24,7 @@ -+ #include -+ #include -+ #include -++#include -+ -+ #include "common.h" -+ #include "debug.h" -+@@ -960,6 +961,14 @@ struct ath_led { -+ struct led_classdev cdev; -+ }; -+ -++#ifdef CONFIG_GPIOLIB -++struct ath9k_gpio_chip { -++ struct ath_softc *sc; -++ char label[32]; -++ struct gpio_chip gchip; -++}; -++#endif -++ -+ struct ath_softc { -+ struct ieee80211_hw *hw; -+ struct device *dev; -+@@ -1014,6 +1023,9 @@ struct ath_softc { -+ #ifdef CPTCFG_MAC80211_LEDS -+ const char *led_default_trigger; -+ struct list_head leds; -++#ifdef CONFIG_GPIOLIB -++ struct ath9k_gpio_chip *gpiochip; -++#endif -+ #endif -+ -+ #ifdef CPTCFG_ATH9K_DEBUGFS -+--- a/drivers/net/wireless/ath/ath9k/gpio.c -++++ b/drivers/net/wireless/ath/ath9k/gpio.c -+@@ -16,13 +16,135 @@ -+ -+ #include "ath9k.h" -+ #include -++#include -++ -++#ifdef CPTCFG_MAC80211_LEDS -++ -++#ifdef CONFIG_GPIOLIB -++ -++/***************/ -++/* GPIO Chip */ -++/***************/ -++ -++/* gpio_chip handler : set GPIO to input */ -++static int ath9k_gpio_pin_cfg_input(struct gpio_chip *chip, unsigned offset) -++{ -++ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip, -++ gchip); -++ -++ ath9k_hw_gpio_request_in(gc->sc->sc_ah, offset, "ath9k-gpio"); -++ -++ return 0; -++} -++ -++/* gpio_chip handler : set GPIO to output */ -++static int ath9k_gpio_pin_cfg_output(struct gpio_chip *chip, unsigned offset, -++ int value) -++{ -++ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip, -++ gchip); -++ -++ ath9k_hw_gpio_request_out(gc->sc->sc_ah, offset, "ath9k-gpio", -++ AR_GPIO_OUTPUT_MUX_AS_OUTPUT); -++ ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value); -++ -++ return 0; -++} -++ -++/* gpio_chip handler : query GPIO direction (0=out, 1=in) */ -++static int ath9k_gpio_pin_get_dir(struct gpio_chip *chip, unsigned offset) -++{ -++ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip, -++ gchip); -++ struct ath_hw *ah = gc->sc->sc_ah; -++ -++ return !((REG_READ(ah, AR_GPIO_OE_OUT) >> (offset * 2)) & 3); -++} -++ -++/* gpio_chip handler : get GPIO pin value */ -++static int ath9k_gpio_pin_get(struct gpio_chip *chip, unsigned offset) -++{ -++ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip, -++ gchip); -++ -++ return ath9k_hw_gpio_get(gc->sc->sc_ah, offset); -++} -++ -++/* gpio_chip handler : set GPIO pin to value */ -++static void ath9k_gpio_pin_set(struct gpio_chip *chip, unsigned offset, -++ int value) -++{ -++ struct ath9k_gpio_chip *gc = container_of(chip, struct ath9k_gpio_chip, -++ gchip); -++ -++ ath9k_hw_set_gpio(gc->sc->sc_ah, offset, value); -++} -++ -++/* register GPIO chip */ -++static void ath9k_register_gpio_chip(struct ath_softc *sc) -++{ -++ struct ath9k_gpio_chip *gc; -++ struct ath_hw *ah = sc->sc_ah; -++ -++ gc = kzalloc(sizeof(struct ath9k_gpio_chip), GFP_KERNEL); -++ if (!gc) -++ return; -++ -++ snprintf(gc->label, sizeof(gc->label), "ath9k-%s", -++ wiphy_name(sc->hw->wiphy)); -++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,5,0) -++ gc->gchip.parent = sc->dev; -++#else -++ gc->gchip.dev = sc->dev; -++#endif -++ gc->gchip.label = gc->label; -++ gc->gchip.base = -1; /* determine base automatically */ -++ gc->gchip.ngpio = ah->caps.num_gpio_pins; -++ gc->gchip.direction_input = ath9k_gpio_pin_cfg_input; -++ gc->gchip.direction_output = ath9k_gpio_pin_cfg_output; -++ gc->gchip.get_direction = ath9k_gpio_pin_get_dir; -++ gc->gchip.get = ath9k_gpio_pin_get; -++ gc->gchip.set = ath9k_gpio_pin_set; -++ -++ if (gpiochip_add(&gc->gchip)) { -++ kfree(gc); -++ return; -++ } -++ -++ gc->gchip.owner = NULL; -++ sc->gpiochip = gc; -++ gc->sc = sc; -++} -++ -++/* remove GPIO chip */ -++static void ath9k_unregister_gpio_chip(struct ath_softc *sc) -++{ -++ struct ath9k_gpio_chip *gc = sc->gpiochip; -++ -++ if (!gc) -++ return; -++ -++ gpiochip_remove(&gc->gchip); -++ kfree(gc); -++ sc->gpiochip = NULL; -++} -++ -++#else /* CONFIG_GPIOLIB */ -++ -++static inline void ath9k_register_gpio_chip(struct ath_softc *sc) -++{ -++} -++ -++static inline void ath9k_unregister_gpio_chip(struct ath_softc *sc) -++{ -++} -++ -++#endif /* CONFIG_GPIOLIB */ -+ -+ /********************************/ -+ /* LED functions */ -+ /********************************/ -+ -+-#ifdef CPTCFG_MAC80211_LEDS -+- -+ static void ath_fill_led_pin(struct ath_softc *sc) -+ { -+ struct ath_hw *ah = sc->sc_ah; -+@@ -80,6 +202,12 @@ static int ath_add_led(struct ath_softc -+ else -+ ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low); -+ -++#ifdef CONFIG_GPIOLIB -++ /* If there is GPIO chip configured, reserve LED pin */ -++ if (sc->gpiochip) -++ gpio_request(sc->gpiochip->gchip.base + gpio->gpio, gpio->name); -++#endif -++ -+ return 0; -+ } -+ -+@@ -136,12 +264,18 @@ void ath_deinit_leds(struct ath_softc *s -+ -+ while (!list_empty(&sc->leds)) { -+ led = list_first_entry(&sc->leds, struct ath_led, list); -++#ifdef CONFIG_GPIOLIB -++ /* If there is GPIO chip configured, free LED pin */ -++ if (sc->gpiochip) -++ gpio_free(sc->gpiochip->gchip.base + led->gpio->gpio); -++#endif -+ list_del(&led->list); -+ ath_led_brightness(&led->cdev, LED_OFF); -+ led_classdev_unregister(&led->cdev); -+ ath9k_hw_gpio_free(sc->sc_ah, led->gpio->gpio); -+ kfree(led); -+ } -++ ath9k_unregister_gpio_chip(sc); -+ } -+ -+ void ath_init_leds(struct ath_softc *sc) -+@@ -158,6 +292,8 @@ void ath_init_leds(struct ath_softc *sc) -+ -+ ath_fill_led_pin(sc); -+ -++ ath9k_register_gpio_chip(sc); -++ -+ if (pdata && pdata->led_name) -+ strncpy(led_name, pdata->led_name, sizeof(led_name)); -+ else -+@@ -178,6 +314,7 @@ void ath_init_leds(struct ath_softc *sc) -+ for (i = 0; i < pdata->num_leds; i++) -+ ath_create_platform_led(sc, &pdata->leds[i]); -+ } -++ -+ #endif -+ -+ /*******************/ -diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..b9d18834393dca078e444950c77642095a83f401 ---- /dev/null -+++ b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch -@@ -0,0 +1,149 @@ -+From: Michal Cieslakiewicz -+Subject: [PATCH v5 5/8] mac80211: ath9k: enable GPIO buttons -+ -+Enable platform-defined GPIO button support for ath9k device. -+Key poller is activated for attached platform buttons. -+Requires ath9k GPIO chip access. -+ -+Signed-off-by: Michal Cieslakiewicz -+Signed-off-by: Felix Fietkau -+--- -+--- a/drivers/net/wireless/ath/ath9k/ath9k.h -++++ b/drivers/net/wireless/ath/ath9k/ath9k.h -+@@ -1025,6 +1025,7 @@ struct ath_softc { -+ struct list_head leds; -+ #ifdef CONFIG_GPIOLIB -+ struct ath9k_gpio_chip *gpiochip; -++ struct platform_device *btnpdev; /* gpio-keys-polled */ -+ #endif -+ #endif -+ -+--- a/drivers/net/wireless/ath/ath9k/gpio.c -++++ b/drivers/net/wireless/ath/ath9k/gpio.c -+@@ -17,6 +17,8 @@ -+ #include "ath9k.h" -+ #include -+ #include -++#include -++#include -+ -+ #ifdef CPTCFG_MAC80211_LEDS -+ -+@@ -129,6 +131,64 @@ static void ath9k_unregister_gpio_chip(s -+ sc->gpiochip = NULL; -+ } -+ -++/******************/ -++/* GPIO Buttons */ -++/******************/ -++ -++/* add GPIO buttons */ -++static void ath9k_init_buttons(struct ath_softc *sc) -++{ -++ struct ath9k_platform_data *pdata = sc->dev->platform_data; -++ struct platform_device *pdev; -++ struct gpio_keys_platform_data gkpdata; -++ struct gpio_keys_button *bt; -++ int i; -++ -++ if (!sc->gpiochip) -++ return; -++ -++ if (!pdata || !pdata->btns || !pdata->num_btns) -++ return; -++ -++ bt = devm_kmemdup(sc->dev, pdata->btns, -++ pdata->num_btns * sizeof(struct gpio_keys_button), -++ GFP_KERNEL); -++ if (!bt) -++ return; -++ -++ for (i = 0; i < pdata->num_btns; i++) { -++ ath9k_hw_gpio_request_in(sc->sc_ah, pdata->btns[i].gpio, -++ "ath9k-gpio"); -++ bt[i].gpio = sc->gpiochip->gchip.base + pdata->btns[i].gpio; -++ } -++ -++ memset(&gkpdata, 0, sizeof(struct gpio_keys_platform_data)); -++ gkpdata.buttons = bt; -++ gkpdata.nbuttons = pdata->num_btns; -++ gkpdata.poll_interval = pdata->btn_poll_interval; -++ -++ pdev = platform_device_register_data(sc->dev, "gpio-keys-polled", -++ PLATFORM_DEVID_AUTO, &gkpdata, -++ sizeof(gkpdata)); -++ if (!IS_ERR_OR_NULL(pdev)) -++ sc->btnpdev = pdev; -++ else { -++ sc->btnpdev = NULL; -++ devm_kfree(sc->dev, bt); -++ } -++} -++ -++/* remove GPIO buttons */ -++static void ath9k_deinit_buttons(struct ath_softc *sc) -++{ -++ if (!sc->gpiochip || !sc->btnpdev) -++ return; -++ -++ platform_device_unregister(sc->btnpdev); -++ -++ sc->btnpdev = NULL; -++} -++ -+ #else /* CONFIG_GPIOLIB */ -+ -+ static inline void ath9k_register_gpio_chip(struct ath_softc *sc) -+@@ -139,6 +199,14 @@ static inline void ath9k_unregister_gpio -+ { -+ } -+ -++static inline void ath9k_init_buttons(struct ath_softc *sc) -++{ -++} -++ -++static inline void ath9k_deinit_buttons(struct ath_softc *sc) -++{ -++} -++ -+ #endif /* CONFIG_GPIOLIB */ -+ -+ /********************************/ -+@@ -262,6 +330,7 @@ void ath_deinit_leds(struct ath_softc *s -+ { -+ struct ath_led *led; -+ -++ ath9k_deinit_buttons(sc); -+ while (!list_empty(&sc->leds)) { -+ led = list_first_entry(&sc->leds, struct ath_led, list); -+ #ifdef CONFIG_GPIOLIB -+@@ -293,6 +362,7 @@ void ath_init_leds(struct ath_softc *sc) -+ ath_fill_led_pin(sc); -+ -+ ath9k_register_gpio_chip(sc); -++ ath9k_init_buttons(sc); -+ -+ if (pdata && pdata->led_name) -+ strncpy(led_name, pdata->led_name, sizeof(led_name)); -+@@ -308,7 +378,7 @@ void ath_init_leds(struct ath_softc *sc) -+ ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, -+ !sc->sc_ah->config.led_active_high); -+ -+- if (!pdata) -++ if (!pdata || !pdata->leds || !pdata->num_leds) -+ return; -+ -+ for (i = 0; i < pdata->num_leds; i++) -+--- a/include/linux/ath9k_platform.h -++++ b/include/linux/ath9k_platform.h -+@@ -50,6 +50,10 @@ struct ath9k_platform_data { -+ int num_leds; -+ const struct gpio_led *leds; -+ const char *led_name; -++ -++ unsigned num_btns; -++ const struct gpio_keys_button *btns; -++ unsigned btn_poll_interval; -+ }; -+ -+ #endif /* _LINUX_ATH9K_PLATFORM_H */ -diff --git a/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch b/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch -index 82459091fe47c8b2fb17c88ed9cef1c1b9502280..db70a334bde149dd28461161f69b4f36623a9db4 100644 ---- a/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch -+++ b/package/kernel/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch -@@ -24,7 +24,7 @@ Changes since v1: - - --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c - +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c --@@ -7722,6 +7722,7 @@ static int rt2800_probe_rt(struct rt2x00 -+@@ -7726,6 +7726,7 @@ static int rt2800_probe_rt(struct rt2x00 - - int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev) - { -@@ -32,7 +32,7 @@ Changes since v1: - int retval; - u32 reg; - --@@ -7729,6 +7730,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r -+@@ -7733,6 +7734,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r - if (retval) - return retval; - -diff --git a/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch b/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch -index 7abfcd16f2e68354cb990b85d75c792fe9468fcb..a3b62bcc14d62f0930e264fc61c7d7668964db88 100644 ---- a/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch -+++ b/package/kernel/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch -@@ -239,7 +239,7 @@ Changes since v1: --- - msleep(1); - - /* --@@ -7726,6 +7774,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r -+@@ -7730,6 +7778,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r - int retval; - u32 reg; - -@@ -248,7 +248,7 @@ Changes since v1: --- - retval = rt2800_probe_rt(rt2x00dev); - if (retval) - return retval; --@@ -7809,8 +7859,11 @@ void rt2800_get_key_seq(struct ieee80211 -+@@ -7813,8 +7863,11 @@ void rt2800_get_key_seq(struct ieee80211 - return; - - offset = MAC_IVEIV_ENTRY(key->hw_key_idx); -diff --git a/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch b/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch -index 02b2acfeee4c40af3f4739362d12ca0ce7f5e587..f41a160d3f953fca0695d8dadfca589f810a24e6 100644 ---- a/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch -+++ b/package/kernel/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch -@@ -41,7 +41,7 @@ Signed-off-by: Gabor Juhos - rt2800_clear_beacon_register(rt2x00dev, i); - - if (rt2x00_is_usb(rt2x00dev)) { --@@ -7827,6 +7828,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r -+@@ -7831,6 +7832,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r - if (rt2x00_rt(rt2x00dev, RT3593)) - __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); - -diff --git a/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch b/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch -index e90927271090fafef5f2e1b33be1a43f2a0eeba8..5099c64492e4f1c6f96657d4c738f094a919d7fc 100644 ---- a/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch -+++ b/package/kernel/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch -@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos - - --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c - +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c --@@ -7852,7 +7852,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r -+@@ -7856,7 +7856,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r - if (rt2x00_rt(rt2x00dev, RT3593)) - __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); - -diff --git a/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch b/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch -index 7fe38e0958a170f6f127fedc3764a0df87163180..a2e701527b99a4e9f1f8beb3a0fffd48d07c0bef 100644 ---- a/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch -+++ b/package/kernel/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch -@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos - - --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c - +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c --@@ -7822,6 +7822,7 @@ static int rt2800_probe_rt(struct rt2x00 -+@@ -7826,6 +7826,7 @@ static int rt2800_probe_rt(struct rt2x00 - case RT3390: - case RT3572: - case RT3593: -diff --git a/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch b/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch -index 253a0c0c1e67def822917c469a41bea3b2d0c862..89bd0acb87a0599962efd1d82a61512d45890b4c 100644 ---- a/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch -+++ b/package/kernel/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch -@@ -98,7 +98,7 @@ Signed-off-by: Gabor Juhos - static const struct rf_channel rf_vals_5592_xtal20[] = { - /* Channel, N, K, mod, R */ - {1, 482, 4, 10, 3}, --@@ -7669,6 +7729,11 @@ static int rt2800_probe_hw_mode(struct r -+@@ -7673,6 +7733,11 @@ static int rt2800_probe_hw_mode(struct r - spec->channels = rf_vals_3x; - break; - -diff --git a/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch b/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch -index f15c22b30f8e517e10f71c64082e8bea3a2b1d63..b7efc9f31bed7a4afd9a52d9f05b2aa4ca46e320 100644 ---- a/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch -+++ b/package/kernel/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch -@@ -18,7 +18,7 @@ Signed-off-by: Gabor Juhos - case RF5360: - case RF5362: - case RF5370: --@@ -7848,6 +7849,7 @@ static int rt2800_probe_hw_mode(struct r -+@@ -7852,6 +7853,7 @@ static int rt2800_probe_hw_mode(struct r - case RF3053: - case RF3070: - case RF3290: -diff --git a/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch b/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch -index 6ce224aba27242f5e55030a396ea044d16528653..220e35fe4c201bed6678fb4a8e293563c41c1240 100644 ---- a/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch -+++ b/package/kernel/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch -@@ -10,7 +10,7 @@ Signed-off-by: Gabor Juhos - - --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c - +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c --@@ -8403,7 +8403,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r -+@@ -8407,7 +8407,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r - if (rt2x00_rt(rt2x00dev, RT3593)) - __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags); - -diff --git a/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch b/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch -index 25753af81b2bf911fec969118e81c90a6c95e975..2ffa5a4162f65c0451e2462842c5801fade1c25d 100644 ---- a/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch -+++ b/package/kernel/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch -@@ -11,7 +11,7 @@ Signed-off-by: Gabor Juhos - - --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c - +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c --@@ -8416,7 +8416,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r -+@@ -8420,7 +8420,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r - if (retval) - return retval; - -diff --git a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch -index 7a183a404bae73cdcc120b41e83910ab579974ea..daa5dc61f9db18ba73cc19ea908587bb868bf292 100644 ---- a/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch -+++ b/package/kernel/mac80211/patches/602-rt2x00-introduce-rt2x00_platform_h.patch -@@ -22,10 +22,10 @@ - +#endif /* _RT2X00_PLATFORM_H */ - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h --@@ -38,6 +38,7 @@ -- #include -+@@ -39,6 +39,7 @@ - #include - #include -+ #include - +#include - - #include -diff --git a/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch b/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch -index bc056cd7357f57570168e5c1a4dbd4b9acd9a3c3..8ae5da38797df39f8bc13e3eace5f2f9496cde9c 100644 ---- a/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch -+++ b/package/kernel/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch -@@ -1,6 +1,6 @@ - --- a/.local-symbols - +++ b/.local-symbols --@@ -329,6 +329,7 @@ RT2X00_LIB_FIRMWARE= -+@@ -331,6 +331,7 @@ RT2X00_LIB_FIRMWARE= - RT2X00_LIB_CRYPTO= - RT2X00_LIB_LEDS= - RT2X00_LIB_DEBUGFS= -@@ -105,7 +105,7 @@ - .drv_init_registers = rt2800mmio_init_registers, - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h --@@ -697,6 +697,7 @@ enum rt2x00_capability_flags { -+@@ -699,6 +699,7 @@ enum rt2x00_capability_flags { - REQUIRE_HT_TX_DESC, - REQUIRE_PS_AUTOWAKE, - REQUIRE_DELAYED_RFKILL, -@@ -127,7 +127,7 @@ - DECLARE_KFIFO_PTR(txstatus_fifo, u32); - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c --@@ -1335,6 +1335,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de -+@@ -1334,6 +1334,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de - INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup); - INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep); - -@@ -138,7 +138,7 @@ - /* - * Let the driver probe the device to detect the capabilities. - */ --@@ -1475,6 +1479,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ -+@@ -1477,6 +1481,11 @@ void rt2x00lib_remove_dev(struct rt2x00_ - * Free the driver data. - */ - kfree(rt2x00dev->drv_data); -diff --git a/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch -index d923e05c770f2f325d7b47a9a5c9bcdf63cbbbdc..a2e1faf9c3793b51f912c743a38f7a9afd3bd0a0 100644 ---- a/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch -+++ b/package/kernel/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch -@@ -37,7 +37,7 @@ - num_rates += 4; - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h --@@ -405,6 +405,7 @@ struct hw_mode_spec { -+@@ -406,6 +406,7 @@ struct hw_mode_spec { - unsigned int supported_bands; - #define SUPPORT_BAND_2GHZ 0x00000001 - #define SUPPORT_BAND_5GHZ 0x00000002 -diff --git a/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch b/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch -index a645ba176e4ab17046945a87bb97359602b675c6..6704ff835c186b575b79c62ad6d83021fee3ee8a 100644 ---- a/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch -+++ b/package/kernel/mac80211/patches/608-add_platform_data_mac_addr.patch -@@ -31,7 +31,7 @@ - { - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h --@@ -1414,6 +1414,7 @@ static inline void rt2x00debug_dump_fram -+@@ -1416,6 +1416,7 @@ static inline void rt2x00debug_dump_fram - */ - u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev, - struct ieee80211_vif *vif); -diff --git a/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch b/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch -index c69d33025d91dfb49ec411cbe2fc506ba67d03ff..9f10fe35c3a5c599bf3fb897583481a0971ef475 100644 ---- a/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch -+++ b/package/kernel/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch -@@ -200,7 +200,7 @@ - * EEPROM frequency - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h --@@ -717,6 +717,8 @@ enum rt2x00_capability_flags { -+@@ -719,6 +719,8 @@ enum rt2x00_capability_flags { - CAPABILITY_DOUBLE_ANTENNA, - CAPABILITY_BT_COEXIST, - CAPABILITY_VCO_RECALIBRATION, -diff --git a/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch b/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch -index b44fe900d53f87580ab8c0e502bc7f94958e6109..860fdc07ede072fce1cd65b177115dfd4dc30c03 100644 ---- a/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch -+++ b/package/kernel/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch -@@ -28,7 +28,7 @@ - static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - { - struct hw_mode_spec *spec = &rt2x00dev->spec; --@@ -8272,7 +8293,10 @@ static int rt2800_probe_hw_mode(struct r -+@@ -8276,7 +8297,10 @@ static int rt2800_probe_hw_mode(struct r - case RF5390: - case RF5392: - spec->num_channels = 14; -@@ -40,7 +40,7 @@ - break; - - case RF3052: --@@ -8456,6 +8480,19 @@ static int rt2800_probe_rt(struct rt2x00 -+@@ -8460,6 +8484,19 @@ static int rt2800_probe_rt(struct rt2x00 - return 0; - } - -@@ -60,7 +60,7 @@ - int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev) - { - struct rt2800_drv_data *drv_data = rt2x00dev->drv_data; --@@ -8498,6 +8535,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r -+@@ -8502,6 +8539,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r - rt2800_register_write(rt2x00dev, GPIO_CTRL, reg); - - /* -@@ -78,7 +78,7 @@ - retval = rt2800_probe_hw_mode(rt2x00dev); - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h --@@ -400,6 +400,7 @@ static inline struct rt2x00_intf* vif_to -+@@ -401,6 +401,7 @@ static inline struct rt2x00_intf* vif_to - * @channels: Device/chipset specific channel values (See &struct rf_channel). - * @channels_info: Additional information for channels (See &struct channel_info). - * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap). -@@ -86,7 +86,7 @@ - */ - struct hw_mode_spec { - unsigned int supported_bands; --@@ -416,6 +417,7 @@ struct hw_mode_spec { -+@@ -417,6 +418,7 @@ struct hw_mode_spec { - const struct channel_info *channels_info; - - struct ieee80211_sta_ht_cap ht; -diff --git a/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch b/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch -index 8e3bd2a3622c1954a01ed548c71e436be9e92d8e..e7b2a8ca896118d5733e81a44ffb3a37502aeb42 100644 ---- a/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch -+++ b/package/kernel/mac80211/patches/615-rt2x00-fix_20mhz_clk.patch -@@ -8,7 +8,7 @@ - - #include "rt2x00.h" - #include "rt2800lib.h" --@@ -8482,13 +8483,14 @@ static int rt2800_probe_rt(struct rt2x00 -+@@ -8486,13 +8487,14 @@ static int rt2800_probe_rt(struct rt2x00 - - int rt2800_probe_clk(struct rt2x00_dev *rt2x00dev) - { -diff --git a/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch b/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch -index faa5879de68b0ec27d0099b51e296cfd7ccf7416..44bd8a194b23f9ef807fb66e99f6695998fc844c 100644 ---- a/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch -+++ b/package/kernel/mac80211/patches/616-rt2x00-support-rt5350.patch -@@ -240,7 +240,7 @@ - case RF5360: - case RF5362: - case RF5370: --@@ -8287,6 +8398,7 @@ static int rt2800_probe_hw_mode(struct r -+@@ -8291,6 +8402,7 @@ static int rt2800_probe_hw_mode(struct r - case RF3290: - case RF3320: - case RF3322: -@@ -248,7 +248,7 @@ - case RF5360: - case RF5362: - case RF5370: --@@ -8426,6 +8538,7 @@ static int rt2800_probe_hw_mode(struct r -+@@ -8430,6 +8542,7 @@ static int rt2800_probe_hw_mode(struct r - case RF3070: - case RF3290: - case RF3853: -@@ -256,7 +256,7 @@ - case RF5360: - case RF5362: - case RF5370: --@@ -8466,6 +8579,7 @@ static int rt2800_probe_rt(struct rt2x00 -+@@ -8470,6 +8583,7 @@ static int rt2800_probe_rt(struct rt2x00 - case RT3572: - case RT3593: - case RT3883: -@@ -266,7 +266,7 @@ - case RT5592: - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h --@@ -169,6 +169,7 @@ struct rt2x00_chip { -+@@ -170,6 +170,7 @@ struct rt2x00_chip { - #define RT3572 0x3572 - #define RT3593 0x3593 - #define RT3883 0x3883 /* WSOC */ -diff --git a/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch b/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch -index 55452b9ebde82e716e9fbf557db07abdde07dce5..dba6033edb83aaec0943a523dc1bf2c8f3ba5b31 100644 ---- a/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch -+++ b/package/kernel/mac80211/patches/620-rt2x00-add-AP+STA-support.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c - +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00dev.c --@@ -1284,7 +1284,7 @@ static inline void rt2x00lib_set_if_comb -+@@ -1283,7 +1283,7 @@ static inline void rt2x00lib_set_if_comb - */ - if_limit = &rt2x00dev->if_limits_ap; - if_limit->max = rt2x00dev->ops->max_ap_intf; -diff --git a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch -index fd885cc002461dbdb4b21f3bc4c5ae97c6609ad3..02f3053b2f34305e5db0a953aee3378fc17f351f 100644 ---- a/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch -+++ b/package/kernel/mac80211/patches/801-libertas-configure-sysfs-links.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/marvell/libertas/cfg.c - +++ b/drivers/net/wireless/marvell/libertas/cfg.c --@@ -2084,6 +2084,8 @@ struct wireless_dev *lbs_cfg_alloc(struc -+@@ -2122,6 +2122,8 @@ struct wireless_dev *lbs_cfg_alloc(struc - goto err_wiphy_new; - } - -diff --git a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch -index b67a95f948b79b4430799beadbcb98fc6f05e0da..ad306083da6cddff80b36241689cfeb3ba77d072 100644 ---- a/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch -+++ b/package/kernel/mac80211/patches/802-libertas-set-wireless-macaddr.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/marvell/libertas/cfg.c - +++ b/drivers/net/wireless/marvell/libertas/cfg.c --@@ -2174,6 +2174,8 @@ int lbs_cfg_register(struct lbs_private -+@@ -2212,6 +2212,8 @@ int lbs_cfg_register(struct lbs_private - wdev->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); - wdev->wiphy->reg_notifier = lbs_reg_notifier; - -diff --git a/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch b/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch -deleted file mode 100644 -index 74cd4489f15fb1b18a2157441011a4ff68bb60f8..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/804-b43-sync-with-bcma.patch -+++ /dev/null -@@ -1,17 +0,0 @@ ----- a/drivers/net/wireless/broadcom/b43/main.c --+++ b/drivers/net/wireless/broadcom/b43/main.c --@@ -1215,10 +1215,10 @@ void b43_wireless_core_phy_pll_reset(str -- case B43_BUS_BCMA: -- bcma_cc = &dev->dev->bdev->bus->drv_cc; -- --- bcma_cc_write32(bcma_cc, BCMA_CC_CHIPCTL_ADDR, 0); --- bcma_cc_mask32(bcma_cc, BCMA_CC_CHIPCTL_DATA, ~0x4); --- bcma_cc_set32(bcma_cc, BCMA_CC_CHIPCTL_DATA, 0x4); --- bcma_cc_mask32(bcma_cc, BCMA_CC_CHIPCTL_DATA, ~0x4); --+ bcma_cc_write32(bcma_cc, BCMA_CC_PMU_CHIPCTL_ADDR, 0); --+ bcma_cc_mask32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, ~0x4); --+ bcma_cc_set32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, 0x4); --+ bcma_cc_mask32(bcma_cc, BCMA_CC_PMU_CHIPCTL_DATA, ~0x4); -- break; -- #endif -- #ifdef CPTCFG_B43_SSB -diff --git a/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch b/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch -index 06c731fce677f7ea4a29652916c678f6de4dfc7d..f8f555f3e6ec510c333a97e76f47cca92e96a774 100644 ---- a/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch -+++ b/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch -@@ -9,7 +9,7 @@ - antenna = b43_antenna_to_phyctl(antenna); - ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL); - /* We can't send beacons with short preamble. Would get PHY errors. */ --@@ -3300,8 +3300,8 @@ static int b43_chip_init(struct b43_wlde -+@@ -3297,8 +3297,8 @@ static int b43_chip_init(struct b43_wlde - - /* Select the antennae */ - if (phy->ops->set_rx_antenna) -@@ -20,7 +20,7 @@ - - if (phy->type == B43_PHYTYPE_B) { - value16 = b43_read16(dev, 0x005E); --@@ -4001,7 +4001,6 @@ static int b43_op_config(struct ieee8021 -+@@ -3998,7 +3998,6 @@ static int b43_op_config(struct ieee8021 - struct b43_wldev *dev = wl->current_dev; - struct b43_phy *phy = &dev->phy; - struct ieee80211_conf *conf = &hw->conf; -@@ -28,7 +28,7 @@ - int err = 0; - - mutex_lock(&wl->mutex); --@@ -4044,11 +4043,9 @@ static int b43_op_config(struct ieee8021 -+@@ -4041,11 +4040,9 @@ static int b43_op_config(struct ieee8021 - } - - /* Antennas for RX and management frame TX. */ -@@ -42,7 +42,7 @@ - - if (wl->radio_enabled != phy->radio_on) { - if (wl->radio_enabled) { --@@ -5209,6 +5206,47 @@ static int b43_op_get_survey(struct ieee -+@@ -5189,6 +5186,47 @@ static int b43_op_get_survey(struct ieee - return 0; - } - -@@ -90,7 +90,7 @@ - static const struct ieee80211_ops b43_hw_ops = { - .tx = b43_op_tx, - .conf_tx = b43_op_conf_tx, --@@ -5230,6 +5268,8 @@ static const struct ieee80211_ops b43_hw -+@@ -5210,6 +5248,8 @@ static const struct ieee80211_ops b43_hw - .sw_scan_complete = b43_op_sw_scan_complete_notifier, - .get_survey = b43_op_get_survey, - .rfkill_poll = b43_rfkill_poll, -@@ -99,7 +99,7 @@ - }; - - /* Hard-reset the chip. Do not call this directly. --@@ -5538,6 +5578,8 @@ static int b43_one_core_attach(struct b4 -+@@ -5513,6 +5553,8 @@ static int b43_one_core_attach(struct b4 - if (!wldev) - goto out; - -@@ -108,7 +108,7 @@ - wldev->use_pio = b43_modparam_pio; - wldev->dev = dev; - wldev->wl = wl; --@@ -5628,6 +5670,9 @@ static struct b43_wl *b43_wireless_init( -+@@ -5603,6 +5645,9 @@ static struct b43_wl *b43_wireless_init( - - hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; - -diff --git a/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch b/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch -deleted file mode 100644 -index e2653542def01a708c6b3399a78484a322919a57..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/860-brcmfmac-add-missing-eth_type_trans-call.patch -+++ /dev/null -@@ -1,26 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Subject: [PATCH] brcmfmac: add missing eth_type_trans call --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --There are 2 protocols supported by brcmfmac and msgbuf one was missing a --proper skb setup before passing it to the netif. This was triggering --"NULL pointer dereference". -- --Fixes: 9c349892ccc9 ("brcmfmac: revise handling events in receive path") --Signed-off-by: Rafał Miłecki ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c --@@ -1157,6 +1157,9 @@ brcmf_msgbuf_process_rx_complete(struct -- brcmu_pkt_buf_free_skb(skb); -- return; -- } --+ --+ skb->protocol = eth_type_trans(skb, ifp->ndev); --+ -- brcmf_netif_rx(ifp, skb); -- } -- -diff --git a/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..ae571c99ab151245355d0080a6475bcabbb9a2fb ---- /dev/null -+++ b/package/kernel/mac80211/patches/860-brcmfmac-register-wiphy-s-during-module_init.patch -@@ -0,0 +1,97 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Mon, 8 Jun 2015 16:11:40 +0200 -+Subject: [PATCH] brcmfmac: register wiphy(s) during module_init -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+This is needed by OpenWrt which expects all PHYs to be created after -+module loads successfully. -+ -+Signed-off-by: Rafał Miłecki -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -+@@ -1213,6 +1213,7 @@ int __init brcmf_core_init(void) -+ { -+ if (!schedule_work(&brcmf_driver_work)) -+ return -EBUSY; -++ flush_work(&brcmf_driver_work); -+ -+ return 0; -+ } -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -+@@ -444,6 +444,7 @@ struct brcmf_fw { -+ u16 bus_nr; -+ void (*done)(struct device *dev, const struct firmware *fw, -+ void *nvram_image, u32 nvram_len); -++ struct completion *completion; -+ }; -+ -+ static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) -+@@ -478,6 +479,8 @@ static void brcmf_fw_request_nvram_done( -+ goto fail; -+ -+ fwctx->done(fwctx->dev, fwctx->code, nvram, nvram_length); -++ if (fwctx->completion) -++ complete(fwctx->completion); -+ kfree(fwctx); -+ return; -+ -+@@ -485,6 +488,8 @@ fail: -+ brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); -+ release_firmware(fwctx->code); -+ device_release_driver(fwctx->dev); -++ if (fwctx->completion) -++ complete(fwctx->completion); -+ kfree(fwctx); -+ } -+ -+@@ -500,6 +505,8 @@ static void brcmf_fw_request_code_done(c -+ /* only requested code so done here */ -+ if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) { -+ fwctx->done(fwctx->dev, fw, NULL, 0); -++ if (fwctx->completion) -++ complete(fwctx->completion); -+ kfree(fwctx); -+ return; -+ } -+@@ -517,6 +524,8 @@ static void brcmf_fw_request_code_done(c -+ fail: -+ brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); -+ device_release_driver(fwctx->dev); -++ if (fwctx->completion) -++ complete(fwctx->completion); -+ kfree(fwctx); -+ } -+ -+@@ -528,6 +537,8 @@ int brcmf_fw_get_firmwares_pcie(struct d -+ u16 domain_nr, u16 bus_nr) -+ { -+ struct brcmf_fw *fwctx; -++ struct completion completion; -++ int err; -+ -+ brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev)); -+ if (!fw_cb || !code) -+@@ -548,9 +559,17 @@ int brcmf_fw_get_firmwares_pcie(struct d -+ fwctx->domain_nr = domain_nr; -+ fwctx->bus_nr = bus_nr; -+ -+- return request_firmware_nowait(THIS_MODULE, true, code, dev, -++ init_completion(&completion); -++ fwctx->completion = &completion; -++ -++ err = request_firmware_nowait(THIS_MODULE, true, code, dev, -+ GFP_KERNEL, fwctx, -+ brcmf_fw_request_code_done); -++ if (!err) -++ wait_for_completion_timeout(fwctx->completion, -++ msecs_to_jiffies(5000)); -++ fwctx->completion = NULL; -++ return err; -+ } -+ -+ int brcmf_fw_get_firmwares(struct device *dev, u16 flags, -diff --git a/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch b/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch -deleted file mode 100644 -index f7f44f513f5e80f18f26c49073f916a435c6c534..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/861-brcmfmac-register-wiphy-s-during-module_init.patch -+++ /dev/null -@@ -1,97 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Mon, 8 Jun 2015 16:11:40 +0200 --Subject: [PATCH] brcmfmac: register wiphy(s) during module_init --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --This is needed by OpenWrt which expects all PHYs to be created after --module loads successfully. -- --Signed-off-by: Rafał Miłecki ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c --@@ -1200,6 +1200,7 @@ int __init brcmf_core_init(void) -- { -- if (!schedule_work(&brcmf_driver_work)) -- return -EBUSY; --+ flush_work(&brcmf_driver_work); -- -- return 0; -- } ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c --@@ -444,6 +444,7 @@ struct brcmf_fw { -- u16 bus_nr; -- void (*done)(struct device *dev, const struct firmware *fw, -- void *nvram_image, u32 nvram_len); --+ struct completion *completion; -- }; -- -- static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) --@@ -478,6 +479,8 @@ static void brcmf_fw_request_nvram_done( -- goto fail; -- -- fwctx->done(fwctx->dev, fwctx->code, nvram, nvram_length); --+ if (fwctx->completion) --+ complete(fwctx->completion); -- kfree(fwctx); -- return; -- --@@ -485,6 +488,8 @@ fail: -- brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); -- release_firmware(fwctx->code); -- device_release_driver(fwctx->dev); --+ if (fwctx->completion) --+ complete(fwctx->completion); -- kfree(fwctx); -- } -- --@@ -500,6 +505,8 @@ static void brcmf_fw_request_code_done(c -- /* only requested code so done here */ -- if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM)) { -- fwctx->done(fwctx->dev, fw, NULL, 0); --+ if (fwctx->completion) --+ complete(fwctx->completion); -- kfree(fwctx); -- return; -- } --@@ -517,6 +524,8 @@ static void brcmf_fw_request_code_done(c -- fail: -- brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); -- device_release_driver(fwctx->dev); --+ if (fwctx->completion) --+ complete(fwctx->completion); -- kfree(fwctx); -- } -- --@@ -528,6 +537,8 @@ int brcmf_fw_get_firmwares_pcie(struct d -- u16 domain_nr, u16 bus_nr) -- { -- struct brcmf_fw *fwctx; --+ struct completion completion; --+ int err; -- -- brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev)); -- if (!fw_cb || !code) --@@ -548,9 +559,17 @@ int brcmf_fw_get_firmwares_pcie(struct d -- fwctx->domain_nr = domain_nr; -- fwctx->bus_nr = bus_nr; -- --- return request_firmware_nowait(THIS_MODULE, true, code, dev, --+ init_completion(&completion); --+ fwctx->completion = &completion; --+ --+ err = request_firmware_nowait(THIS_MODULE, true, code, dev, -- GFP_KERNEL, fwctx, -- brcmf_fw_request_code_done); --+ if (!err) --+ wait_for_completion_timeout(fwctx->completion, --+ msecs_to_jiffies(5000)); --+ fwctx->completion = NULL; --+ return err; -- } -- -- int brcmf_fw_get_firmwares(struct device *dev, u16 flags, -diff --git a/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..87211550f77d6e06bef8f7124940ba30ac4222ef ---- /dev/null -+++ b/package/kernel/mac80211/patches/861-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch -@@ -0,0 +1,50 @@ -+From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= -+Date: Thu, 9 Jul 2015 00:07:59 +0200 -+Subject: [PATCH] brcmfmac: workaround bug with some inconsistent BSSes state -+MIME-Version: 1.0 -+Content-Type: text/plain; charset=UTF-8 -+Content-Transfer-Encoding: 8bit -+ -+Signed-off-by: Rafał Miłecki -+--- -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+@@ -665,9 +665,37 @@ static struct wireless_dev *brcmf_cfg802 -+ u32 *flags, -+ struct vif_params *params) -+ { -++ struct net_device *dev; -+ struct wireless_dev *wdev; -+ int err; -+ -++ /* -++ * There is a bug with in-firmware BSS management. When adding virtual -++ * interface brcmfmac first tells firmware to create new BSS and then -++ * it creates new struct net_device. -++ * -++ * If creating/registering netdev(ice) fails, BSS remains in some bugged -++ * state. It conflicts with existing BSSes by overtaking their auth -++ * requests. -++ * -++ * It results in one BSS (addresss X) sending beacons and another BSS -++ * (address Y) replying to authentication requests. This makes interface -++ * unusable as AP. -++ * -++ * To workaround this bug we may try to guess if register_netdev(ice) -++ * will fail. The most obvious case is using interface name that already -++ * exists. This is actually quite likely with brcmfmac & some user space -++ * scripts as brcmfmac doesn't allow deleting virtual interfaces. -++ * So this bug can be triggered even by something trivial like: -++ * iw dev wlan0 delete -++ * iw phy phy0 interface add wlan0 type __ap -++ */ -++ dev = dev_get_by_name(&init_net, name); -++ if (dev) { -++ dev_put(dev); -++ return ERR_PTR(-ENFILE); -++ } -++ -+ brcmf_dbg(TRACE, "enter: %s type %d\n", name, type); -+ err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type); -+ if (err) { -diff --git a/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..f301fe1e4e7daa2cabd73aaf869327e2a0fb7d22 ---- /dev/null -+++ b/package/kernel/mac80211/patches/862-brcmfmac-Disable-power-management.patch -@@ -0,0 +1,27 @@ -+From 66ae1b1750720a33e29792a177b1e696f4f005fb Mon Sep 17 00:00:00 2001 -+From: Phil Elwell -+Date: Wed, 9 Mar 2016 17:25:59 +0000 -+Subject: [PATCH] brcmfmac: Disable power management -+ -+Disable wireless power saving in the brcmfmac WLAN driver. This is a -+temporary measure until the connectivity loss resulting from power -+saving is resolved. -+ -+Signed-off-by: Phil Elwell -+--- -+ drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c | 2 ++ -+ 1 file changed, 2 insertions(+) -+ -+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -+@@ -2783,6 +2783,10 @@ brcmf_cfg80211_set_power_mgmt(struct wip -+ * preference in cfg struct to apply this to -+ * FW later while initializing the dongle -+ */ -++#if defined(CONFIG_BCM2708) || defined(CONFIG_BCM2709) -++ pr_info("power management disabled\n"); -++ enabled = false; -++#endif -+ cfg->pwr_save = enabled; -+ if (!check_vif_up(ifp->vif)) { -+ -diff --git a/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch b/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch -deleted file mode 100644 -index 1e440c02f33ffa7389837442fde8bdcb21002d61..0000000000000000000000000000000000000000 ---- a/package/kernel/mac80211/patches/862-brcmfmac-workaround-bug-with-some-inconsistent-BSSes.patch -+++ /dev/null -@@ -1,50 +0,0 @@ --From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= --Date: Thu, 9 Jul 2015 00:07:59 +0200 --Subject: [PATCH] brcmfmac: workaround bug with some inconsistent BSSes state --MIME-Version: 1.0 --Content-Type: text/plain; charset=UTF-8 --Content-Transfer-Encoding: 8bit -- --Signed-off-by: Rafał Miłecki ----- -- ----- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c --@@ -651,9 +651,37 @@ static struct wireless_dev *brcmf_cfg802 -- u32 *flags, -- struct vif_params *params) -- { --+ struct net_device *dev; -- struct wireless_dev *wdev; -- int err; -- --+ /* --+ * There is a bug with in-firmware BSS management. When adding virtual --+ * interface brcmfmac first tells firmware to create new BSS and then --+ * it creates new struct net_device. --+ * --+ * If creating/registering netdev(ice) fails, BSS remains in some bugged --+ * state. It conflicts with existing BSSes by overtaking their auth --+ * requests. --+ * --+ * It results in one BSS (addresss X) sending beacons and another BSS --+ * (address Y) replying to authentication requests. This makes interface --+ * unusable as AP. --+ * --+ * To workaround this bug we may try to guess if register_netdev(ice) --+ * will fail. The most obvious case is using interface name that already --+ * exists. This is actually quite likely with brcmfmac & some user space --+ * scripts as brcmfmac doesn't allow deleting virtual interfaces. --+ * So this bug can be triggered even by something trivial like: --+ * iw dev wlan0 delete --+ * iw phy phy0 interface add wlan0 type __ap --+ */ --+ dev = dev_get_by_name(&init_net, name); --+ if (dev) { --+ dev_put(dev); --+ return ERR_PTR(-ENFILE); --+ } --+ -- brcmf_dbg(TRACE, "enter: %s type %d\n", name, type); -- err = brcmf_vif_add_validate(wiphy_to_cfg(wiphy), type); -- if (err) { -diff --git a/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch b/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch -index f2e21ea49feafaf060846d95746ea6132819536f..be210f2d4bfc22a20b7473012000338e22622bd9 100644 ---- a/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch -+++ b/package/kernel/mac80211/patches/910-01-add-support-for-mt7620.patch -@@ -1184,7 +1184,7 @@ - break; - default: - rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n", --@@ -8423,6 +9363,7 @@ static int rt2800_probe_hw_mode(struct r -+@@ -8427,6 +9367,7 @@ static int rt2800_probe_hw_mode(struct r - case RF5372: - case RF5390: - case RF5392: -@@ -1192,7 +1192,7 @@ - spec->num_channels = 14; - if (spec->clk_is_20mhz) - spec->channels = rf_vals_xtal20mhz_3x; --@@ -8563,6 +9504,7 @@ static int rt2800_probe_hw_mode(struct r -+@@ -8567,6 +9508,7 @@ static int rt2800_probe_hw_mode(struct r - case RF5372: - case RF5390: - case RF5392: -diff --git a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch -index 8c6d720a73cf73e007eeede2829ec9019d5a2d40..e842d612b7b55caaa557c20836ca84e3cd21f906 100644 ---- a/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch -+++ b/package/kernel/mac80211/patches/921-ath10k_init_devices_synchronously.patch -@@ -14,7 +14,7 @@ Signed-off-by: Sven Eckelmann - - --- a/drivers/net/wireless/ath/ath10k/core.c - +++ b/drivers/net/wireless/ath/ath10k/core.c --@@ -1914,6 +1914,16 @@ int ath10k_core_register(struct ath10k * -+@@ -2107,6 +2107,16 @@ int ath10k_core_register(struct ath10k * - ar->chip_id = chip_id; - queue_work(ar->workqueue, &ar->register_work); - -diff --git a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch -index 281b4475ada3f4388292d930a9fd252b234ec0c5..a501b998d0f279eeac266df9a4cd03e5cb731f98 100644 ---- a/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch -+++ b/package/kernel/mac80211/patches/930-ath10k_add_tpt_led_trigger.patch -@@ -1,6 +1,6 @@ - --- a/drivers/net/wireless/ath/ath10k/mac.c - +++ b/drivers/net/wireless/ath/ath10k/mac.c --@@ -7141,6 +7141,21 @@ struct ath10k_vif *ath10k_get_arvif(stru -+@@ -7742,6 +7742,21 @@ struct ath10k_vif *ath10k_get_arvif(stru - return arvif_iter.arvif; - } - -@@ -22,11 +22,11 @@ - int ath10k_mac_register(struct ath10k *ar) - { - static const u32 cipher_suites[] = { --@@ -7357,6 +7372,12 @@ int ath10k_mac_register(struct ath10k *a -+@@ -7975,6 +7990,12 @@ int ath10k_mac_register(struct ath10k *a - ar->hw->wiphy->cipher_suites = cipher_suites; - ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites); - --+#if CPTCFG_MAC80211_LEDS -++#ifdef CPTCFG_MAC80211_LEDS - + ieee80211_create_tpt_led_trigger(ar->hw, - + IEEE80211_TPT_LEDTRIG_FL_RADIO, ath10k_tpt_blink, - + ARRAY_SIZE(ath10k_tpt_blink)); -diff --git a/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch b/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch -new file mode 100644 -index 0000000000000000000000000000000000000000..596ef9863902ecbbd3cdb394c7ffde3ba509414f ---- /dev/null -+++ b/package/kernel/mac80211/patches/936-ath10k_skip_otp_check.patch -@@ -0,0 +1,51 @@ -+--- a/drivers/net/wireless/ath/ath10k/core.c -++++ b/drivers/net/wireless/ath/ath10k/core.c -+@@ -1243,9 +1243,6 @@ static int ath10k_core_fetch_firmware_fi -+ { -+ int ret; -+ -+- /* calibration file is optional, don't check for any errors */ -+- ath10k_fetch_cal_file(ar); -+- -+ ar->fw_api = 5; -+ ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api); -+ -+@@ -1944,7 +1941,7 @@ EXPORT_SYMBOL(ath10k_core_stop); -+ static int ath10k_core_probe_fw(struct ath10k *ar) -+ { -+ struct bmi_target_info target_info; -+- int ret = 0; -++ int calret, ret = 0; -+ -+ ret = ath10k_hif_power_up(ar); -+ if (ret) { -+@@ -1968,6 +1965,9 @@ static int ath10k_core_probe_fw(struct a -+ goto err_power_down; -+ } -+ -++ /* calibration file is optional, don't check for any errors */ -++ calret = ath10k_fetch_cal_file(ar); -++ -+ ret = ath10k_core_fetch_firmware_files(ar); -+ if (ret) { -+ ath10k_err(ar, "could not fetch firmware files (%d)\n", ret); -+@@ -1990,11 +1990,14 @@ static int ath10k_core_probe_fw(struct a -+ "could not load pre cal data: %d\n", ret); -+ } -+ -+- ret = ath10k_core_get_board_id_from_otp(ar); -+- if (ret && ret != -EOPNOTSUPP) { -+- ath10k_err(ar, "failed to get board id from otp: %d\n", -+- ret); -+- goto err_free_firmware_files; -++ /* otp and board file not needed if calibration data is present */ -++ if (calret) { -++ ret = ath10k_core_get_board_id_from_otp(ar); -++ if (ret && ret != -EOPNOTSUPP) { -++ ath10k_err(ar, "failed to get board id from otp: %d\n", -++ ret); -++ goto err_free_firmware_files; -++ } -+ } -+ -+ ret = ath10k_core_fetch_board_file(ar); -diff --git a/package/kernel/mt76/Makefile b/package/kernel/mt76/Makefile -index e49dd486d2c952f3bc985a02bb131fdc7a03ce4a..bd851e61910c9a57ca45a570855ca22329c9ae4b 100644 ---- a/package/kernel/mt76/Makefile -+++ b/package/kernel/mt76/Makefile -@@ -1,7 +1,7 @@ - include $(TOPDIR)/rules.mk - - PKG_NAME:=mt76 --PKG_VERSION:=2016-03-03 -+PKG_VERSION:=2016-08-25 - PKG_RELEASE=1 - - PKG_LICENSE:=GPLv2 -@@ -10,23 +10,26 @@ PKG_LICENSE_FILES:= - PKG_SOURCE_URL:=https://github.com/openwrt/mt76 - PKG_SOURCE_PROTO:=git - PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) --PKG_SOURCE_VERSION:=310d420178c86e253a172413da30ecf479b64251 -+PKG_SOURCE_VERSION:=c3127d2acc354b4a27c8604716b0591093601971 - PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz - --PKG_MAINTAINER:=Felix Fietkau -+PKG_MAINTAINER:=Felix Fietkau - PKG_BUILD_PARALLEL:=1 - -+STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h -+ - include $(INCLUDE_DIR)/kernel.mk - include $(INCLUDE_DIR)/package.mk - - define KernelPackage/mt76 - SUBMENU:=Wireless Drivers -- TITLE:=MediaTek MT76x2 wireless driver -- DEPENDS:=+kmod-mac80211 +@DRIVER_11N_SUPPORT @PCI_SUPPORT -+ TITLE:=MediaTek MT76x2/MT7603 wireless driver -+ DEPENDS:=+kmod-mac80211 +@DRIVER_11N_SUPPORT @PCI_SUPPORT @!LINUX_3_18 - FILES:=\ - $(PKG_BUILD_DIR)/mt76.ko \ -- $(PKG_BUILD_DIR)/mt76x2e.ko -- AUTOLOAD:=$(call AutoLoad,50,mac80211 mt76 mt76x2e) -+ $(PKG_BUILD_DIR)/mt76x2e.ko \ -+ $(PKG_BUILD_DIR)/mt7603e.ko -+ AUTOLOAD:=$(call AutoLoad,50,mac80211 mt76 mt76x2e mt7603e) - endef - - NOSTDINC_FLAGS = \ -@@ -54,6 +57,12 @@ endef - define KernelPackage/mt76/install - $(INSTALL_DIR) $(1)/lib/firmware - cp \ -+ $(if $(CONFIG_TARGET_ramips_mt7628) || $(CONFIG_TARGET_ramips_mt7688), \ -+ $(PKG_BUILD_DIR)/firmware/mt7628_e1.bin \ -+ $(PKG_BUILD_DIR)/firmware/mt7628_e2.bin \ -+ ) \ -+ $(PKG_BUILD_DIR)/firmware/mt7603_e1.bin \ -+ $(PKG_BUILD_DIR)/firmware/mt7603_e2.bin \ - $(PKG_BUILD_DIR)/firmware/mt7662_rom_patch.bin \ - $(PKG_BUILD_DIR)/firmware/mt7662.bin \ - $(1)/lib/firmware -diff --git a/package/network/services/hostapd/Config.in b/package/network/services/hostapd/Config.in -index aee2a15fd314479ba4d5e29a8bb4ec5855a78342..645888e74510c5c42c21a7208ee0dcc884fb0e2a 100644 ---- a/package/network/services/hostapd/Config.in -+++ b/package/network/services/hostapd/Config.in -@@ -10,11 +10,10 @@ config WPA_SUPPLICANT_NO_TIMESTAMP_CHECK - choice - prompt "Choose TLS provider" - default WPA_SUPPLICANT_INTERNAL -- depends on PACKAGE_wpa-supplicant || PACKAGE_wpa-supplicant-mesh || PACKAGE_wpad || PACKAGE_wpad-mesh -+ depends on PACKAGE_wpa-supplicant || PACKAGE_wpad - - config WPA_SUPPLICANT_INTERNAL - bool "internal" -- depends on PACKAGE_wpa-supplicant || PACKAGE_wpad - - config WPA_SUPPLICANT_OPENSSL - bool "openssl" -diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile -index 8e706dc5a3dac630076e32eafbffbee2ba7e2976..5caf3e33786890b9c06a21365356fb39a7b4341d 100644 ---- a/package/network/services/hostapd/Makefile -+++ b/package/network/services/hostapd/Makefile -@@ -7,18 +7,18 @@ - include $(TOPDIR)/rules.mk - - PKG_NAME:=hostapd --PKG_VERSION:=2015-03-25 -+PKG_VERSION:=2016-06-15 - PKG_RELEASE:=1 --PKG_REV:=8278138e679174b1ec8af7f169c2810a8888e202 -+PKG_REV:=31d3692fe5d56c05753ed4a70c7943979e1d29e7 - - PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 --PKG_SOURCE_URL:=git://w1.fi/srv/git/hostap.git -+PKG_SOURCE_URL:=http://w1.fi/hostap.git - PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) - PKG_SOURCE_VERSION:=$(PKG_REV) - PKG_SOURCE_PROTO:=git - # PKG_MIRROR_MD5SUM:=4e7c1f97edd7514535056fce54ae053a - --PKG_MAINTAINER:=Felix Fietkau -+PKG_MAINTAINER:=Felix Fietkau - PKG_LICENSE:=BSD-3-Clause - - PKG_BUILD_PARALLEL:=1 -@@ -29,7 +29,6 @@ PKG_CONFIG_DEPENDS:= \ - CONFIG_PACKAGE_kmod-cfg80211 \ - CONFIG_PACKAGE_hostapd \ - CONFIG_PACKAGE_hostapd-mini \ -- CONFIG_PACKAGE_kmod-hostap \ - CONFIG_WPA_RFKILL_SUPPORT \ - CONFIG_DRIVER_WEXT_SUPPORT \ - CONFIG_DRIVER_11N_SUPPORT -@@ -40,6 +39,10 @@ LOCAL_TYPE=$(strip \ - hostapd \ - ))) - LOCAL_VARIANT=$(patsubst wpad-%,%,$(patsubst supplicant-%,%,$(BUILD_VARIANT))) -+CONFIG_VARIANT:=$(LOCAL_VARIANT) -+ifeq ($(LOCAL_VARIANT),mesh) -+ CONFIG_VARIANT:=full -+endif - - ifeq ($(LOCAL_TYPE),supplicant) - ifeq ($(LOCAL_VARIANT),full) -@@ -47,10 +50,6 @@ ifeq ($(LOCAL_TYPE),supplicant) - CONFIG_WPA_SUPPLICANT_INTERNAL \ - CONFIG_WPA_SUPPLICANT_OPENSSL - endif -- ifeq ($(LOCAL_VARIANT),mesh) -- PKG_CONFIG_DEPENDS += \ -- CONFIG_WPA_SUPPLICANT_OPENSSL -- endif - endif - - PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION) -@@ -66,7 +65,6 @@ endif - DRIVER_MAKEOPTS= \ - CONFIG_ACS=$(CONFIG_PACKAGE_kmod-cfg80211) \ - CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-cfg80211) \ -- CONFIG_DRIVER_HOSTAP=$(CONFIG_PACKAGE_kmod-hostap) \ - CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \ - CONFIG_DRIVER_WEXT=$(CONFIG_DRIVER_WEXT_SUPPORT) \ - -@@ -82,7 +80,7 @@ ifneq ($(LOCAL_TYPE),hostapd) - endif - endif - ifeq ($(LOCAL_VARIANT),mesh) -- DRIVER_MAKEOPTS += CONFIG_TLS=openssl -+ DRIVER_MAKEOPTS += CONFIG_TLS=openssl CONFIG_AP=y CONFIG_SAE=y CONFIG_MESH=y - TARGET_LDFLAGS += -lcrypto -lssl - endif - ifdef CONFIG_WPA_SUPPLICANT_NO_TIMESTAMP_CHECK -@@ -177,8 +175,7 @@ endef - define Package/wpad-mesh - $(call Package/wpad/Default) - TITLE+= (with 802.11s mesh and SAE support) -- DEPENDS:=$(DRV_DEPENDS) +libubus +libopenssl +@CONFIG_WPA_SUPPLICANT_OPENSSL @(!TARGET_uml||BROKEN) -- CONFLICTS:=@WPA_SUPPLICANT_INTERNAL -+ DEPENDS:=$(DRV_DEPENDS) +libubus +PACKAGE_wpad-mesh:libopenssl @(!TARGET_uml||BROKEN) - VARIANT:=wpad-mesh - endef - -@@ -257,12 +254,6 @@ define Package/hostapd-common - CATEGORY:=Network - endef - --define Package/hostapd-common-old -- TITLE:=hostapd/wpa_supplicant common support files (legacy drivers) -- SECTION:=net -- CATEGORY:=Network --endef -- - define Package/eapol-test - TITLE:=802.1x authentication test utility - SECTION:=net -@@ -284,10 +275,10 @@ endif - - define Build/Configure - $(Build/Configure/rebuild) -- $(if $(wildcard ./files/hostapd-$(LOCAL_VARIANT).config), \ -- $(CP) ./files/hostapd-$(LOCAL_VARIANT).config $(PKG_BUILD_DIR)/hostapd/.config \ -+ $(if $(wildcard ./files/hostapd-$(CONFIG_VARIANT).config), \ -+ $(CP) ./files/hostapd-$(CONFIG_VARIANT).config $(PKG_BUILD_DIR)/hostapd/.config \ - ) -- $(CP) ./files/wpa_supplicant-$(LOCAL_VARIANT).config $(PKG_BUILD_DIR)/wpa_supplicant/.config -+ $(CP) ./files/wpa_supplicant-$(CONFIG_VARIANT).config $(PKG_BUILD_DIR)/wpa_supplicant/.config - endef - - TARGET_CPPFLAGS := \ -@@ -379,12 +370,6 @@ define Package/hostapd-common/install - $(INSTALL_DATA) ./files/netifd.sh $(1)/lib/netifd/hostapd.sh - endef - --define Package/hostapd-common-old/install -- $(INSTALL_DIR) $(1)/lib/wifi -- $(INSTALL_DATA) ./files/hostapd.sh $(1)/lib/wifi/hostapd.sh -- $(INSTALL_DATA) ./files/wpa_supplicant.sh $(1)/lib/wifi/wpa_supplicant.sh --endef -- - define Package/hostapd/install - $(call Install/hostapd,$(1)) - $(INSTALL_BIN) $(PKG_BUILD_DIR)/hostapd/hostapd $(1)/usr/sbin/ -@@ -442,5 +427,4 @@ $(eval $(call BuildPackage,wpa-supplicant-p2p)) - $(eval $(call BuildPackage,wpa-cli)) - $(eval $(call BuildPackage,hostapd-utils)) - $(eval $(call BuildPackage,hostapd-common)) --$(eval $(call BuildPackage,hostapd-common-old)) - $(eval $(call BuildPackage,eapol-test)) -diff --git a/package/network/services/hostapd/files/hostapd-full.config b/package/network/services/hostapd/files/hostapd-full.config -index f1b2655cfcb7f8cbc61399eb3ffb886770b55a3f..e388109fbb6bac4b965e5fced6e2cc189f883255 100644 ---- a/package/network/services/hostapd/files/hostapd-full.config -+++ b/package/network/services/hostapd/files/hostapd-full.config -@@ -10,7 +10,7 @@ - # to override previous values of the variables. - - # Driver interface for Host AP driver --CONFIG_DRIVER_HOSTAP=y -+#CONFIG_DRIVER_HOSTAP=y - - # Driver interface for wired authenticator - CONFIG_DRIVER_WIRED=y -@@ -53,6 +53,9 @@ CONFIG_PEERKEY=y - # Integrated EAP server - CONFIG_EAP=y - -+# EAP-FAST for the integrated EAP server -+CONFIG_EAP_FAST=y -+ - # EAP-MD5 for the integrated EAP server - CONFIG_EAP_MD5=y - -diff --git a/package/network/services/hostapd/files/hostapd-mini.config b/package/network/services/hostapd/files/hostapd-mini.config -index 118d97cb3a21c195bc903fde2d4f885699b2425b..8baff18fe47a0322b2c6b3312581635ccf518143 100644 ---- a/package/network/services/hostapd/files/hostapd-mini.config -+++ b/package/network/services/hostapd/files/hostapd-mini.config -@@ -10,7 +10,7 @@ - # to override previous values of the variables. - - # Driver interface for Host AP driver --CONFIG_DRIVER_HOSTAP=y -+#CONFIG_DRIVER_HOSTAP=y - - # Driver interface for wired authenticator - CONFIG_DRIVER_WIRED=y -diff --git a/package/network/services/hostapd/files/hostapd.sh b/package/network/services/hostapd/files/hostapd.sh -deleted file mode 100644 -index 7aec7ad8a40ae843453e2c3e8f812a93c9635320..0000000000000000000000000000000000000000 ---- a/package/network/services/hostapd/files/hostapd.sh -+++ /dev/null -@@ -1,394 +0,0 @@ --hostapd_set_bss_options() { -- local var="$1" -- local vif="$2" -- local enc wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey wps_possible wpa_key_mgmt -- -- config_get enc "$vif" encryption "none" -- config_get wep_rekey "$vif" wep_rekey # 300 -- config_get wpa_group_rekey "$vif" wpa_group_rekey # 300 -- config_get wpa_pair_rekey "$vif" wpa_pair_rekey # 300 -- config_get wpa_master_rekey "$vif" wpa_master_rekey # 640 -- config_get_bool ap_isolate "$vif" isolate 0 -- config_get_bool disassoc_low_ack "$vif" disassoc_low_ack 1 -- config_get max_num_sta "$vif" max_num_sta 0 -- config_get max_inactivity "$vif" max_inactivity 0 -- config_get_bool preamble "$vif" short_preamble 1 -- -- config_get device "$vif" device -- config_get hwmode "$device" hwmode -- config_get phy "$device" phy -- -- append "$var" "ctrl_interface=/var/run/hostapd-$phy" "$N" -- -- if [ "$ap_isolate" -gt 0 ]; then -- append "$var" "ap_isolate=$ap_isolate" "$N" -- fi -- if [ "$max_num_sta" -gt 0 ]; then -- append "$var" "max_num_sta=$max_num_sta" "$N" -- fi -- if [ "$max_inactivity" -gt 0 ]; then -- append "$var" "ap_max_inactivity=$max_inactivity" "$N" -- fi -- append "$var" "disassoc_low_ack=$disassoc_low_ack" "$N" -- if [ "$preamble" -gt 0 ]; then -- append "$var" "preamble=$preamble" "$N" -- fi -- -- # Examples: -- # psk-mixed/tkip => WPA1+2 PSK, TKIP -- # wpa-psk2/tkip+aes => WPA2 PSK, CCMP+TKIP -- # wpa2/tkip+aes => WPA2 RADIUS, CCMP+TKIP -- # ... -- -- # TODO: move this parsing function somewhere generic, so that -- # later it can be reused by drivers that don't use hostapd -- -- # crypto defaults: WPA2 vs WPA1 -- case "$enc" in -- wpa2*|*psk2*) -- wpa=2 -- crypto="CCMP" -- ;; -- *mixed*) -- wpa=3 -- crypto="CCMP TKIP" -- ;; -- *) -- wpa=1 -- crypto="TKIP" -- ;; -- esac -- -- # explicit override for crypto setting -- case "$enc" in -- *tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip) crypto="CCMP TKIP";; -- *aes|*ccmp) crypto="CCMP";; -- *tkip) crypto="TKIP";; -- esac -- -- # enforce CCMP for 11ng and 11na -- case "$hwmode:$crypto" in -- *ng:TKIP|*na:TKIP) crypto="CCMP TKIP";; -- esac -- -- # use crypto/auth settings for building the hostapd config -- case "$enc" in -- none) -- wps_possible=1 -- wpa=0 -- crypto= -- # Here we make the assumption that if we're in open mode -- # with WPS enabled, we got to be in unconfigured state. -- wps_not_configured=1 -- ;; -- *psk*) -- config_get psk "$vif" key -- if [ ${#psk} -eq 64 ]; then -- append "$var" "wpa_psk=$psk" "$N" -- else -- append "$var" "wpa_passphrase=$psk" "$N" -- fi -- wps_possible=1 -- [ -n "$wpa_group_rekey" ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N" -- [ -n "$wpa_pair_rekey" ] && append "$var" "wpa_ptk_rekey=$wpa_pair_rekey" "$N" -- [ -n "$wpa_master_rekey" ] && append "$var" "wpa_gmk_rekey=$wpa_master_rekey" "$N" -- append wpa_key_mgmt "WPA-PSK" -- ;; -- *wpa*|*8021x*) -- # required fields? formats? -- # hostapd is particular, maybe a default configuration for failures -- config_get auth_server "$vif" auth_server -- [ -z "$auth_server" ] && config_get auth_server "$vif" server -- append "$var" "auth_server_addr=$auth_server" "$N" -- config_get auth_port "$vif" auth_port -- [ -z "$auth_port" ] && config_get auth_port "$vif" port -- auth_port=${auth_port:-1812} -- append "$var" "auth_server_port=$auth_port" "$N" -- config_get auth_secret "$vif" auth_secret -- [ -z "$auth_secret" ] && config_get auth_secret "$vif" key -- append "$var" "auth_server_shared_secret=$auth_secret" "$N" -- # You don't really want to enable this unless you are doing -- # some corner case testing or are using OpenWrt as a work around -- # for some systematic issues. -- config_get_bool auth_cache "$vif" auth_cache 0 -- config_get rsn_preauth "$vif" rsn_preauth -- [ "$auth_cache" -gt 0 ] || [[ "$rsn_preauth" = 1 ]] || append "$var" "disable_pmksa_caching=1" "$N" -- [ "$auth_cache" -gt 0 ] || [[ "$rsn_preauth" = 1 ]] || append "$var" "okc=0" "$N" -- config_get acct_server "$vif" acct_server -- [ -n "$acct_server" ] && append "$var" "acct_server_addr=$acct_server" "$N" -- config_get acct_port "$vif" acct_port -- [ -n "$acct_port" ] && acct_port=${acct_port:-1813} -- [ -n "$acct_port" ] && append "$var" "acct_server_port=$acct_port" "$N" -- config_get acct_secret "$vif" acct_secret -- [ -n "$acct_secret" ] && append "$var" "acct_server_shared_secret=$acct_secret" "$N" -- config_get eap_reauth_period "$vif" eap_reauth_period -- [ -n "$eap_reauth_period" ] && append "$var" "eap_reauth_period=$eap_reauth_period" "$N" -- config_get dae_client "$vif" dae_client -- config_get dae_secret "$vif" dae_secret -- [ -n "$dae_client" -a -n "$dae_secret" ] && { -- config_get dae_port "$vif" dae_port -- append "$var" "radius_das_port=${dae_port:-3799}" "$N" -- append "$var" "radius_das_client=$dae_client $dae_secret" "$N" -- } -- config_get ownip "$vif" ownip -- append "$var" "own_ip_addr=$ownip" "$N" -- append "$var" "eapol_key_index_workaround=1" "$N" -- append "$var" "ieee8021x=1" "$N" -- append wpa_key_mgmt "WPA-EAP" -- [ -n "$wpa_group_rekey" ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N" -- [ -n "$wpa_pair_rekey" ] && append "$var" "wpa_ptk_rekey=$wpa_pair_rekey" "$N" -- [ -n "$wpa_master_rekey" ] && append "$var" "wpa_gmk_rekey=$wpa_master_rekey" "$N" -- ;; -- *wep*) -- config_get key "$vif" key -- key="${key:-1}" -- case "$key" in -- [1234]) -- for idx in 1 2 3 4; do -- local zidx -- zidx=$(($idx - 1)) -- config_get ckey "$vif" "key${idx}" -- [ -n "$ckey" ] && \ -- append "$var" "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N" -- done -- append "$var" "wep_default_key=$((key - 1))" "$N" -- ;; -- *) -- append "$var" "wep_key0=$(prepare_key_wep "$key")" "$N" -- append "$var" "wep_default_key=0" "$N" -- [ -n "$wep_rekey" ] && append "$var" "wep_rekey_period=$wep_rekey" "$N" -- ;; -- esac -- case "$enc" in -- *shared*) -- auth_algs=2 -- ;; -- *mixed*) -- auth_algs=3 -- ;; -- esac -- wpa=0 -- crypto= -- ;; -- *) -- wpa=0 -- crypto= -- ;; -- esac -- append "$var" "auth_algs=${auth_algs:-1}" "$N" -- append "$var" "wpa=$wpa" "$N" -- [ -n "$crypto" ] && append "$var" "wpa_pairwise=$crypto" "$N" -- [ -n "$wpa_group_rekey" ] && append "$var" "wpa_group_rekey=$wpa_group_rekey" "$N" -- -- config_get ssid "$vif" ssid -- config_get bridge "$vif" bridge -- config_get ieee80211d "$vif" ieee80211d -- config_get iapp_interface "$vif" iapp_interface -- -- config_get_bool wps_pbc "$vif" wps_pushbutton 0 -- config_get_bool wps_label "$vif" wps_label 0 -- -- config_get config_methods "$vif" wps_config -- [ "$wps_pbc" -gt 0 ] && append config_methods push_button -- -- [ -n "$wps_possible" -a -n "$config_methods" ] && { -- config_get device_type "$vif" wps_device_type "6-0050F204-1" -- config_get device_name "$vif" wps_device_name "OpenWrt AP" -- config_get manufacturer "$vif" wps_manufacturer "openwrt.org" -- config_get wps_pin "$vif" wps_pin -- -- config_get_bool ext_registrar "$vif" ext_registrar 0 -- [ "$ext_registrar" -gt 0 -a -n "$bridge" ] && append "$var" "upnp_iface=$bridge" "$N" -- -- append "$var" "eap_server=1" "$N" -- [ -n "$wps_pin" ] && append "$var" "ap_pin=$wps_pin" "$N" -- append "$var" "wps_state=${wps_not_configured:-2}" "$N" -- append "$var" "ap_setup_locked=0" "$N" -- append "$var" "device_type=$device_type" "$N" -- append "$var" "device_name=$device_name" "$N" -- append "$var" "manufacturer=$manufacturer" "$N" -- append "$var" "config_methods=$config_methods" "$N" -- } -- -- append "$var" "ssid=$ssid" "$N" -- [ -n "$bridge" ] && append "$var" "bridge=$bridge" "$N" -- [ -n "$ieee80211d" ] && append "$var" "ieee80211d=$ieee80211d" "$N" -- [ -n "$iapp_interface" ] && append "$var" iapp_interface=$(uci_get_state network "$iapp_interface" ifname "$iapp_interface") "$N" -- -- if [ "$wpa" -ge "1" ] -- then -- config_get nasid "$vif" nasid -- [ -n "$nasid" ] && append "$var" "nas_identifier=$nasid" "$N" -- -- config_get_bool ieee80211r "$vif" ieee80211r 0 -- if [ "$ieee80211r" -gt 0 ] -- then -- config_get mobility_domain "$vif" mobility_domain "4f57" -- config_get r0_key_lifetime "$vif" r0_key_lifetime "10000" -- config_get r1_key_holder "$vif" r1_key_holder "00004f577274" -- config_get reassociation_deadline "$vif" reassociation_deadline "1000" -- config_get r0kh "$vif" r0kh -- config_get r1kh "$vif" r1kh -- config_get_bool pmk_r1_push "$vif" pmk_r1_push 0 -- -- append "$var" "mobility_domain=$mobility_domain" "$N" -- append "$var" "r0_key_lifetime=$r0_key_lifetime" "$N" -- append "$var" "r1_key_holder=$r1_key_holder" "$N" -- append "$var" "reassociation_deadline=$reassociation_deadline" "$N" -- append "$var" "pmk_r1_push=$pmk_r1_push" "$N" -- -- for kh in $r0kh; do -- "$var" "r0kh=${kh//,/ }" "$N" -- done -- for kh in $r1kh; do -- "$var" "r1kh=${kh//,/ }" "$N" -- done -- -- [ "$wpa_key_mgmt" != "${wpa_key_mgmt/EAP/}" ] && append wpa_key_mgmt "FT-EAP" -- [ "$wpa_key_mgmt" != "${wpa_key_mgmt/PSK/}" ] && append wpa_key_mgmt "FT-PSK" -- fi -- -- [ -n "wpa_key_mgmt" ] && append "$var" "wpa_key_mgmt=$wpa_key_mgmt" -- fi -- -- if [ "$wpa" -ge "2" ] -- then -- # RSN -> allow preauthentication. You have two -- # options, rsn_preauth for production or rsn_preauth_testing -- # for validation / testing. -- if [ -n "$bridge" -a "$rsn_preauth" = 1 ] -- then -- append "$var" "rsn_preauth=1" "$N" -- append "$var" "rsn_preauth_interfaces=$bridge" "$N" -- append "$var" "okc=1" "$N" -- else -- # RSN preauthentication testings hould disable -- # Opportunistic Key Caching (okc) as otherwise the PMKSA -- # entry for a test could come from the Opportunistic Key Caching -- config_get rsn_preauth_testing "$vif" rsn_preauth_testing -- if [ -n "$bridge" -a "$rsn_preauth_testing" = 1 ] -- then -- append "$var" "rsn_preauth=1" "$N" -- append "$var" "rsn_preauth_interfaces=$bridge" "$N" -- append "$var" "okc=0" "$N" -- fi -- fi -- -- # RSN -> allow management frame protection -- config_get ieee80211w "$vif" ieee80211w -- case "$ieee80211w" in -- [012]) -- append "$var" "ieee80211w=$ieee80211w" "$N" -- [ "$ieee80211w" -gt "0" ] && { -- config_get ieee80211w_max_timeout "$vif" ieee80211w_max_timeout -- config_get ieee80211w_retry_timeout "$vif" ieee80211w_retry_timeout -- [ -n "$ieee80211w_max_timeout" ] && \ -- append "$var" "assoc_sa_query_max_timeout=$ieee80211w_max_timeout" "$N" -- [ -n "$ieee80211w_retry_timeout" ] && \ -- append "$var" "assoc_sa_query_retry_timeout=$ieee80211w_retry_timeout" "$N" -- } -- ;; -- esac -- fi -- -- config_get macfile "$vif" macfile -- config_get maclist "$vif" maclist -- if [ -z "$macfile" ] -- then -- # if no macfile has been specified, fallback to the default name -- # and truncate file to avoid aggregating entries over time -- macfile="/var/run/hostapd-$ifname.maclist" -- echo "" > "$macfile" -- else -- if [ -n "$maclist" ] -- then -- # to avoid to overwrite the original file, make a copy -- # before appending the entries specified by the maclist -- # option -- cp $macfile $macfile.maclist -- macfile=$macfile.maclist -- fi -- fi -- -- if [ -n "$maclist" ] -- then -- for mac in $maclist; do -- echo "$mac" >> $macfile -- done -- fi -- -- config_get macfilter "$vif" macfilter -- case "$macfilter" in -- allow) -- append "$var" "macaddr_acl=1" "$N" -- append "$var" "accept_mac_file=$macfile" "$N" -- ;; -- deny) -- append "$var" "macaddr_acl=0" "$N" -- append "$var" "deny_mac_file=$macfile" "$N" -- ;; -- esac --} -- --hostapd_set_log_options() { -- local var="$1" -- local cfg="$2" -- local log_level log_80211 log_8021x log_radius log_wpa log_driver log_iapp log_mlme -- -- config_get log_level "$cfg" log_level 2 -- -- config_get_bool log_80211 "$cfg" log_80211 1 -- config_get_bool log_8021x "$cfg" log_8021x 1 -- config_get_bool log_radius "$cfg" log_radius 1 -- config_get_bool log_wpa "$cfg" log_wpa 1 -- config_get_bool log_driver "$cfg" log_driver 1 -- config_get_bool log_iapp "$cfg" log_iapp 1 -- config_get_bool log_mlme "$cfg" log_mlme 1 -- -- local log_mask=$(( \ -- ($log_80211 << 0) | \ -- ($log_8021x << 1) | \ -- ($log_radius << 2) | \ -- ($log_wpa << 3) | \ -- ($log_driver << 4) | \ -- ($log_iapp << 5) | \ -- ($log_mlme << 6) \ -- )) -- -- append "$var" "logger_syslog=$log_mask" "$N" -- append "$var" "logger_syslog_level=$log_level" "$N" -- append "$var" "logger_stdout=$log_mask" "$N" -- append "$var" "logger_stdout_level=$log_level" "$N" --} -- --hostapd_setup_vif() { -- local vif="$1" -- local driver="$2" -- local ifname device channel hwmode -- -- hostapd_cfg= -- -- config_get ifname "$vif" ifname -- config_get device "$vif" device -- config_get channel "$device" channel -- config_get hwmode "$device" hwmode -- -- hostapd_set_log_options hostapd_cfg "$device" -- hostapd_set_bss_options hostapd_cfg "$vif" -- -- case "$hwmode" in -- *bg|*gdt|*gst|*fh) hwmode=g;; -- *adt|*ast) hwmode=a;; -- esac -- [ "$channel" = auto ] && channel= -- [ -n "$channel" -a -z "$hwmode" ] && wifi_fixup_hwmode "$device" -- cat > /var/run/hostapd-$ifname.conf <