<!DOCTYPE html>
<html lang='en'>
<head>
<title>openwrt/upstream - upstream openwrt</title>
<meta name='generator' content='cgit v1.2.3'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='http://git.panaceas.org/cgit.cgi/openwrt/upstream/atom/?h=master' type='application/atom+xml'/>
<link rel='vcs-git' href='git://git.panaceas.org/openwrt/upstream' title='openwrt/upstream Git repository'/>
<link rel='vcs-git' href='ssh://git@git.panaceas.org/git/openwrt/upstream' title='openwrt/upstream Git repository'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/cgit.cgi/'><img src='/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/cgit.cgi/'>index</a> : <a title='openwrt/upstream' href='/cgit.cgi/openwrt/upstream/'>openwrt/upstream</a></td><td class='form'><form method='get'>
<input type='hidden' name='id' value='f9022964cfa0a44984d2efa2dafe3452899acfdf'/><select name='h' onchange='this.form.submit();'>
<option value='attitude_adjustment'>attitude_adjustment</option>
<option value='barrier_breaker'>barrier_breaker</option>
<option value='chaos_calmer'>chaos_calmer</option>
<option value='lede-17.01'>lede-17.01</option>
<option value='less-old-master'>less-old-master</option>
<option value='master' selected='selected'>master</option>
<option value='old-master'>old-master</option>
<option value='openwrt-18.06'>openwrt-18.06</option>
<option value='openwrt-19.07'>openwrt-19.07</option>
<option value='upstream'>upstream</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>upstream openwrt</td><td class='sub right'>James</td></tr></table>
<table class='tabs'><tr><td>
<a href='/cgit.cgi/openwrt/upstream/about/'>about</a><a href='/cgit.cgi/openwrt/upstream/'>summary</a><a href='/cgit.cgi/openwrt/upstream/refs/?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>refs</a><a href='/cgit.cgi/openwrt/upstream/log/'>log</a><a href='/cgit.cgi/openwrt/upstream/tree/?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>tree</a><a href='/cgit.cgi/openwrt/upstream/commit/?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>commit</a><a class='active' href='/cgit.cgi/openwrt/upstream/diff/?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>diff</a><a href='/cgit.cgi/openwrt/upstream/stats/'>stats</a></td><td class='form'><form class='right' method='get' action='/cgit.cgi/openwrt/upstream/log/'>
<input type='hidden' name='id' value='f9022964cfa0a44984d2efa2dafe3452899acfdf'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id' value='f9022964cfa0a44984d2efa2dafe3452899acfdf'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><div class='diffstat-header'><a href='/cgit.cgi/openwrt/upstream/diff/?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>Diffstat</a></div><table summary='diffstat' class='diffstat'><tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit.cgi/openwrt/upstream/diff/package/kernel/mac80211/patches/354-ath9k-rename-tx_complete_work-to-hw_check_work.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/354-ath9k-rename-tx_complete_work-to-hw_check_work.patch</a></td><td class='right'>175</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 100.0%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 0.0%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit.cgi/openwrt/upstream/diff/package/kernel/mac80211/patches/355-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/355-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch</a></td><td class='right'>30</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class='add' style='width: 17.1%;'/><td class='rem' style='width: 0.0%;'/><td class='none' style='width: 82.9%;'/></tr></table></td></tr>
<tr><td class='mode'>-rw-r--r--</td><td class='add'><a href='/cgit.cgi/openwrt/upstream/diff/package/kernel/mac80211/patches/356-ath9k-check-for-deaf-rx-path-state.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/356-ath9k-check-for-deaf-rx-path-state.patch</a></td><td class='right'>100</td><td class='graph'><table summary='file diffstat' width='100%'><tr><td class=<style>pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="k">\subsection</span><span class="nb">{</span>How to contribute<span class="nb">}</span>
OpenWrt is constantly being improved.  We&#39;d like as many people to contribute
to this as we can get. If you find a change useful, by all means try to get
it incorporated into the project. This should improve OpenWrt and it should
help carry your changes forward into future versions

This section tries to lay out a procedure to enable people to submit patches
in a way that is most effective for all concerned.

It is important to do all these steps repeatedly:

<span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
	<span class="k">\item</span> <span class="k">\textit</span><span class="nb">{</span>listen<span class="nb">}</span> to what other people think.
	<span class="k">\item</span> <span class="k">\textit</span><span class="nb">{</span>talk<span class="nb">}</span> explaining what problem you are addressing and your
		proposed solution.
	<span class="k">\item</span> <span class="k">\textit</span><span class="nb">{</span>do<span class="nb">}</span> write useful patches including documentation.
    <span class="k">\item</span> <span class="k">\textit</span><span class="nb">{</span>test. test. test.<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

<span class="k">\subsection</span><span class="nb">{</span>Where to listen and talk<span class="nb">}</span>

<span class="k">\begin</span><span class="nb">{</span>itemize<span class="nb">}</span>
	<span class="k">\item</span> google to find things related to your problem
	<span class="k">\item</span> Mailing lists: <span class="k">\href</span><span class="nb">{</span>http://lists.openwrt.org/<span class="nb">}{</span>http://lists.openwrt.org/<span class="nb">}</span>
	<span class="k">\item</span> Wiki: check the wiki: <span class="k">\href</span><span class="nb">{</span>http://wiki.openwrt.org/OpenWrtDocs<span class="nb">}{</span>http://wiki.openwrt.org/OpenWrtDocs<span class="nb">}</span>
	<span class="k">\item</span> Forum: <span class="k">\href</span><span class="nb">{</span>http://forum.openwrt.org/<span class="nb">}{</span>http://forum.openwrt.org/<span class="nb">}</span>
	<span class="k">\item</span> IRC: <span class="k">\texttt</span><span class="nb">{</span>irc.freenode.net<span class="nb">}</span>, channels <span class="k">\texttt</span><span class="nb">{</span><span class="k">\#</span>openwrt<span class="nb">}</span> and 
		<span class="k">\texttt</span><span class="nb">{</span><span class="k">\#</span>openwrt-devel<span class="nb">}</span>
	<span class="k">\item</span> TRAC: <span class="k">\href</span><span class="nb">{</span>https://dev.openwrt.org/<span class="nb">}{</span>https://dev.openwrt.org/<span class="nb">}</span> the issue/bug/change tracking system
<span class="k">\end</span><span class="nb">{</span>itemize<span class="nb">}</span>

It is often best to document what you are doing before you do it.  The process
of documentation often exposes possible improvements.  Keep your documentation
up to date.

<span class="k">\subsection</span><span class="nb">{</span>Patch Submission Process<span class="nb">}</span>
<span class="k">\begin</span><span class="nb">{</span>enumerate<span class="nb">}</span>
	<span class="k">\item</span> Use git or svn to create a patch. Creating patches manually with 
		<span class="k">\textit</span><span class="nb">{</span>diff -urN<span class="nb">}</span> also works, but is usually unnecessary.
	<span class="k">\item</span> Send a mail to openwrt-devel@lists.openwrt.org with the following contents:
	<span class="k">\begin</span><span class="nb">{</span>enumerate<span class="nb">}</span>
		<span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>[PATCH] &lt;short description&gt;<span class="nb">}</span> in the Subject, followed by:
		<span class="k">\item</span> (optional) a longer description of your patch in the message body
        <span class="k">\item</span> <span class="k">\texttt</span><span class="nb">{</span>Signed-off-by: Your name &lt;your@email.address&gt;<span class="nb">}</span>
		<span class="k">\item</span> Your actual patch, inline, not word wrapped or whitespace mangled. 
	<span class="k">\end</span><span class="nb">{</span>enumerate<span class="nb">}</span>
	<span class="k">\item</span> Please read <span class="k">\href</span><span class="nb">{</span>http://kerneltrap.org/Linux/Email<span class="k">\_</span>Clients<span class="k">\_</span>and<span class="k">\_</span>Patches<span class="nb">}{</span>http://kerneltrap.org/Linux/Email<span class="k">\_</span>Clients<span class="k">\_</span>and<span class="k">\_</span>Patches<span class="nb">}</span>
		to find out how to make sure your email client doesn&#39;t destroy your patch.
	<span class="k">\item</span> Please use your real name and email address in the <span class="k">\texttt</span><span class="nb">{</span>Signed-off-by<span class="nb">}</span>
		line, following the same guidelines as in the <span class="k">\href</span><span class="nb">{</span>http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/SubmittingPatches;h=681e2b36195c98ea5271b76383b3a574b190b04f;hb=HEAD<span class="nb">}{</span>Linux Kernel patch submission guidelines<span class="nb">}</span>
	<span class="k">\item</span> Example of a properly formatted patch submission: <span class="k">\\</span>
	<span class="k">\href</span><span class="nb">{</span>http://lists.openwrt.org/pipermail/openwrt-devel/2007-November/001334.html<span class="nb">}{</span>http://lists.openwrt.org/pipermail/openwrt-devel/2007-November/001334.html<span class="nb">}</span>
<span class="k">\end</span><span class="nb">{</span>enumerate<span class="nb">}</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2024-09-30 22:40:02 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
<div class='add'>+ 	int i;</div><div class='add'>+-	bool needreset = false;</div><div class='add'>+-</div><div class='add'>+ </div><div class='add'>+-	if (sc-&gt;tx99_state) {</div><div class='add'>+-		ath_dbg(ath9k_hw_common(sc-&gt;sc_ah), RESET,</div><div class='add'>+-			"skip tx hung detection on tx99\n");</div><div class='add'>+-		return;</div><div class='add'>+-	}</div><div class='add'>++	if (sc-&gt;tx99_state)</div><div class='add'>++		return true;</div><div class='add'>+ </div><div class='add'>+ 	for (i = 0; i &lt; IEEE80211_NUM_ACS; i++) {</div><div class='add'>+ 		txq = sc-&gt;tx.txq_map[i];</div><div class='add'>+@@ -41,25 +34,36 @@ void ath_tx_complete_poll_work(struct wo</div><div class='add'>+ 		ath_txq_lock(sc, txq);</div><div class='add'>+ 		if (txq-&gt;axq_depth) {</div><div class='add'>+ 			if (txq-&gt;axq_tx_inprogress) {</div><div class='add'>+-				needreset = true;</div><div class='add'>+ 				ath_txq_unlock(sc, txq);</div><div class='add'>+-				break;</div><div class='add'>+-			} else {</div><div class='add'>+-				txq-&gt;axq_tx_inprogress = true;</div><div class='add'>++				goto reset;</div><div class='add'>+ 			}</div><div class='add'>++</div><div class='add'>++			txq-&gt;axq_tx_inprogress = true;</div><div class='add'>+ 		}</div><div class='add'>+ 		ath_txq_unlock(sc, txq);</div><div class='add'>+ 	}</div><div class='add'>+ </div><div class='add'>+-	if (needreset) {</div><div class='add'>+-		ath_dbg(ath9k_hw_common(sc-&gt;sc_ah), RESET,</div><div class='add'>+-			"tx hung, resetting the chip\n");</div><div class='add'>+-		ath9k_queue_reset(sc, RESET_TYPE_TX_HANG);</div><div class='add'>++	return true;</div><div class='add'>++</div><div class='add'>++reset:</div><div class='add'>++	ath_dbg(ath9k_hw_common(sc-&gt;sc_ah), RESET,</div><div class='add'>++		"tx hung, resetting the chip\n");</div><div class='add'>++	ath9k_queue_reset(sc, RESET_TYPE_TX_HANG);</div><div class='add'>++	return false;</div><div class='add'>++</div><div class='add'>++}</div><div class='add'>++</div><div class='add'>++void ath_hw_check_work(struct work_struct *work)</div><div class='add'>++{</div><div class='add'>++	struct ath_softc *sc = container_of(work, struct ath_softc,</div><div class='add'>++					    hw_check_work.work);</div><div class='add'>++</div><div class='add'>++	if (!ath_hw_check(sc) ||</div><div class='add'>++	    !ath_tx_complete_check(sc))</div><div class='add'>+ 		return;</div><div class='add'>+-	}</div><div class='add'>+ </div><div class='add'>+-	ieee80211_queue_delayed_work(sc-&gt;hw, &amp;sc-&gt;tx_complete_work,</div><div class='add'>+-				     msecs_to_jiffies(ATH_TX_COMPLETE_POLL_INT));</div><div class='add'>++	ieee80211_queue_delayed_work(sc-&gt;hw, &amp;sc-&gt;hw_check_work,</div><div class='add'>++				     msecs_to_jiffies(ATH_HW_CHECK_POLL_INT));</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ /*</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/main.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/main.c</div><div class='add'>+@@ -181,7 +181,7 @@ void ath9k_ps_restore(struct ath_softc *</div><div class='add'>+ static void __ath_cancel_work(struct ath_softc *sc)</div><div class='add'>+ {</div><div class='add'>+ 	cancel_work_sync(&amp;sc-&gt;paprd_work);</div><div class='add'>+-	cancel_delayed_work_sync(&amp;sc-&gt;tx_complete_work);</div><div class='add'>++	cancel_delayed_work_sync(&amp;sc-&gt;hw_check_work);</div><div class='add'>+ 	cancel_delayed_work_sync(&amp;sc-&gt;hw_pll_work);</div><div class='add'>+ </div><div class='add'>+ #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT</div><div class='add'>+@@ -198,7 +198,8 @@ void ath_cancel_work(struct ath_softc *s</div><div class='add'>+ </div><div class='add'>+ void ath_restart_work(struct ath_softc *sc)</div><div class='add'>+ {</div><div class='add'>+-	ieee80211_queue_delayed_work(sc-&gt;hw, &amp;sc-&gt;tx_complete_work, 0);</div><div class='add'>++	ieee80211_queue_delayed_work(sc-&gt;hw, &amp;sc-&gt;hw_check_work,</div><div class='add'>++				     ATH_HW_CHECK_POLL_INT);</div><div class='add'>+ </div><div class='add'>+ 	if (AR_SREV_9340(sc-&gt;sc_ah) || AR_SREV_9330(sc-&gt;sc_ah))</div><div class='add'>+ 		ieee80211_queue_delayed_work(sc-&gt;hw, &amp;sc-&gt;hw_pll_work,</div><div class='add'>+@@ -2091,7 +2092,7 @@ void __ath9k_flush(struct ieee80211_hw *</div><div class='add'>+ 	int timeout;</div><div class='add'>+ 	bool drain_txq;</div><div class='add'>+ </div><div class='add'>+-	cancel_delayed_work_sync(&amp;sc-&gt;tx_complete_work);</div><div class='add'>++	cancel_delayed_work_sync(&amp;sc-&gt;hw_check_work);</div><div class='add'>+ </div><div class='add'>+ 	if (ah-&gt;ah_flags &amp; AH_UNPLUGGED) {</div><div class='add'>+ 		ath_dbg(common, ANY, "Device has been unplugged!\n");</div><div class='add'>+@@ -2129,7 +2130,8 @@ void __ath9k_flush(struct ieee80211_hw *</div><div class='add'>+ 		ath9k_ps_restore(sc);</div><div class='add'>+ 	}</div><div class='add'>+ </div><div class='add'>+-	ieee80211_queue_delayed_work(hw, &amp;sc-&gt;tx_complete_work, 0);</div><div class='add'>++	ieee80211_queue_delayed_work(hw, &amp;sc-&gt;hw_check_work,</div><div class='add'>++				     ATH_HW_CHECK_POLL_INT);</div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>+ static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw)</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/xmit.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/xmit.c</div><div class='add'>+@@ -2915,8 +2915,6 @@ int ath_tx_init(struct ath_softc *sc, in</div><div class='add'>+ 		return error;</div><div class='add'>+ 	}</div><div class='add'>+ </div><div class='add'>+-	INIT_DELAYED_WORK(&amp;sc-&gt;tx_complete_work, ath_tx_complete_poll_work);</div><div class='add'>+-</div><div class='add'>+ 	if (sc-&gt;sc_ah-&gt;caps.hw_caps &amp; ATH9K_HW_CAP_EDMA)</div><div class='add'>+ 		error = ath_tx_edma_init(sc);</div><div class='add'>+ </div><div class='head'>diff --git a/package/kernel/mac80211/patches/355-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch b/package/kernel/mac80211/patches/355-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch<br/>new file mode 100644<br/>index 0000000000..b0cb74ad05<br/>--- /dev/null<br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/355-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/355-ath9k_hw-check-if-the-chip-failed-to-wake-up.patch</a></div><div class='hunk'>@@ -0,0 +1,30 @@</div><div class='add'>+From: Felix Fietkau &lt;nbd@nbd.name&gt;</div><div class='add'>+Date: Wed, 25 Jan 2017 12:58:17 +0100</div><div class='add'>+Subject: [PATCH] ath9k_hw: check if the chip failed to wake up</div><div class='add'>+</div><div class='add'>+In an RFC patch, Sven Eckelmann and Simon Wunderlich reported:</div><div class='add'>+</div><div class='add'>+"QCA 802.11n chips (especially AR9330/AR9340) sometimes end up in a</div><div class='add'>+state in which a read of AR_CFG always returns 0xdeadbeef.</div><div class='add'>+This should not happen when when the power_mode of the device is</div><div class='add'>+ATH9K_PM_AWAKE."</div><div class='add'>+</div><div class='add'>+Include the check for the default register state in the existing MAC</div><div class='add'>+hang check.</div><div class='add'>+</div><div class='add'>+Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;</div><div class='add'>+---</div><div class='add'>+</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/hw.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/hw.c</div><div class='add'>+@@ -1624,6 +1624,10 @@ bool ath9k_hw_check_alive(struct ath_hw</div><div class='add'>+ 	int count = 50;</div><div class='add'>+ 	u32 reg, last_val;</div><div class='add'>+ </div><div class='add'>++	/* Check if chip failed to wake up */</div><div class='add'>++	if (REG_READ(ah, AR_CFG) == 0xdeadbeef)</div><div class='add'>++		return false;</div><div class='add'>++</div><div class='add'>+ 	if (AR_SREV_9300(ah))</div><div class='add'>+ 		return !ath9k_hw_detect_mac_hang(ah);</div><div class='add'>+ </div><div class='head'>diff --git a/package/kernel/mac80211/patches/356-ath9k-check-for-deaf-rx-path-state.patch b/package/kernel/mac80211/patches/356-ath9k-check-for-deaf-rx-path-state.patch<br/>new file mode 100644<br/>index 0000000000..347d06ec88<br/>--- /dev/null<br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/356-ath9k-check-for-deaf-rx-path-state.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/356-ath9k-check-for-deaf-rx-path-state.patch</a></div><div class='hunk'>@@ -0,0 +1,100 @@</div><div class='add'>+From: Felix Fietkau &lt;nbd@nbd.name&gt;</div><div class='add'>+Date: Wed, 25 Jan 2017 13:00:58 +0100</div><div class='add'>+Subject: [PATCH] ath9k: check for deaf rx path state</div><div class='add'>+</div><div class='add'>+Various chips occasionally run into a state where the tx path still</div><div class='add'>+appears to be working normally, but the rx path is deaf.</div><div class='add'>+</div><div class='add'>+There is no known register signature to check for this state explicitly,</div><div class='add'>+so use the lack of rx interrupts as an indicator.</div><div class='add'>+</div><div class='add'>+This detection is prone to false positives, since a device could also</div><div class='add'>+simply be in an environment where there are no frames on the air.</div><div class='add'>+However, in this case doing a reset should be harmless since it's</div><div class='add'>+obviously not interrupting any real activity. To avoid confusion, call</div><div class='add'>+the reset counters in this case "Rx path inactive" instead of something</div><div class='add'>+like "Rx path deaf", since it may not be an indication of a real</div><div class='add'>+hardware failure.</div><div class='add'>+</div><div class='add'>+Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;</div><div class='add'>+---</div><div class='add'>+</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/ath9k.h</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/ath9k.h</div><div class='add'>+@@ -1027,6 +1027,7 @@ struct ath_softc {</div><div class='add'>+ </div><div class='add'>+ 	u8 gtt_cnt;</div><div class='add'>+ 	u32 intrstatus;</div><div class='add'>++	u32 rx_active;</div><div class='add'>+ 	u16 ps_flags; /* PS_* */</div><div class='add'>+ 	bool ps_enabled;</div><div class='add'>+ 	bool ps_idle;</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/debug.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/debug.c</div><div class='add'>+@@ -763,6 +763,7 @@ static int read_file_reset(struct seq_fi</div><div class='add'>+ 		[RESET_TYPE_BEACON_STUCK] = "Stuck Beacon",</div><div class='add'>+ 		[RESET_TYPE_MCI] = "MCI Reset",</div><div class='add'>+ 		[RESET_TYPE_CALIBRATION] = "Calibration error",</div><div class='add'>++		[RESET_TYPE_RX_INACTIVE] = "Rx path inactive",</div><div class='add'>+ 		[RESET_TX_DMA_ERROR] = "Tx DMA stop error",</div><div class='add'>+ 		[RESET_RX_DMA_ERROR] = "Rx DMA stop error",</div><div class='add'>+ 	};</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/debug.h</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/debug.h</div><div class='add'>+@@ -50,6 +50,7 @@ enum ath_reset_type {</div><div class='add'>+ 	RESET_TYPE_BEACON_STUCK,</div><div class='add'>+ 	RESET_TYPE_MCI,</div><div class='add'>+ 	RESET_TYPE_CALIBRATION,</div><div class='add'>++	RESET_TYPE_RX_INACTIVE,</div><div class='add'>+ 	RESET_TX_DMA_ERROR,</div><div class='add'>+ 	RESET_RX_DMA_ERROR,</div><div class='add'>+ 	__RESET_TYPE_MAX</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/link.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/link.c</div><div class='add'>+@@ -53,13 +53,27 @@ reset:</div><div class='add'>+ </div><div class='add'>+ }</div><div class='add'>+ </div><div class='add'>++static bool ath_rx_active_check(struct ath_softc *sc)</div><div class='add'>++{</div><div class='add'>++	if (sc-&gt;rx_active) {</div><div class='add'>++		sc-&gt;rx_active = 0;</div><div class='add'>++		return true;</div><div class='add'>++	}</div><div class='add'>++</div><div class='add'>++	ath_dbg(ath9k_hw_common(sc-&gt;sc_ah), RESET,</div><div class='add'>++		"rx path inactive, resetting the chip\n");</div><div class='add'>++	ath9k_queue_reset(sc, RESET_TYPE_RX_INACTIVE);</div><div class='add'>++	return false;</div><div class='add'>++}</div><div class='add'>++</div><div class='add'>+ void ath_hw_check_work(struct work_struct *work)</div><div class='add'>+ {</div><div class='add'>+ 	struct ath_softc *sc = container_of(work, struct ath_softc,</div><div class='add'>+ 					    hw_check_work.work);</div><div class='add'>+ </div><div class='add'>+ 	if (!ath_hw_check(sc) ||</div><div class='add'>+-	    !ath_tx_complete_check(sc))</div><div class='add'>++	    !ath_tx_complete_check(sc) ||</div><div class='add'>++	    !ath_rx_active_check(sc))</div><div class='add'>+ 		return;</div><div class='add'>+ </div><div class='add'>+ 	ieee80211_queue_delayed_work(sc-&gt;hw, &amp;sc-&gt;hw_check_work,</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/main.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/main.c</div><div class='add'>+@@ -269,6 +269,7 @@ static bool ath_complete_reset(struct at</div><div class='add'>+ 	}</div><div class='add'>+ </div><div class='add'>+ 	sc-&gt;gtt_cnt = 0;</div><div class='add'>++	sc-&gt;rx_active = 1;</div><div class='add'>+ </div><div class='add'>+ 	ath9k_hw_set_interrupts(ah);</div><div class='add'>+ 	ath9k_hw_enable_interrupts(ah);</div><div class='add'>+@@ -452,6 +453,7 @@ void ath9k_tasklet(unsigned long data)</div><div class='add'>+ 			ath_rx_tasklet(sc, 0, true);</div><div class='add'>+ </div><div class='add'>+ 		ath_rx_tasklet(sc, 0, false);</div><div class='add'>++		sc-&gt;rx_active = 1;</div><div class='add'>+ 	}</div><div class='add'>+ </div><div class='add'>+ 	if (status &amp; ATH9K_INT_TX) {</div><div class='head'>diff --git a/package/kernel/mac80211/patches/357-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch b/package/kernel/mac80211/patches/357-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch<br/>new file mode 100644<br/>index 0000000000..962a08ae36<br/>--- /dev/null<br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/357-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/357-ath9k-fix-race-condition-in-enabling-disabling-IRQs.patch</a></div><div class='hunk'>@@ -0,0 +1,165 @@</div><div class='add'>+From: Felix Fietkau &lt;nbd@nbd.name&gt;</div><div class='add'>+Date: Wed, 25 Jan 2017 15:10:37 +0100</div><div class='add'>+Subject: [PATCH] ath9k: fix race condition in enabling/disabling IRQs</div><div class='add'>+</div><div class='add'>+The code currently relies on refcounting to disable IRQs from within the</div><div class='add'>+IRQ handler and re-enabling them again after the tasklet has run.</div><div class='add'>+</div><div class='add'>+However, due to race conditions sometimes the IRQ handler might be</div><div class='add'>+called twice, or the tasklet may not run at all (if interrupted in the</div><div class='add'>+middle of a reset).</div><div class='add'>+</div><div class='add'>+This can cause nasty imbalances in the irq-disable refcount which will</div><div class='add'>+get the driver permanently stuck until the entire radio has been stopped</div><div class='add'>+and started again (ath_reset will not recover from this).</div><div class='add'>+</div><div class='add'>+Instead of using this fragile logic, change the code to ensure that</div><div class='add'>+running the irq handler during tasklet processing is safe, and leave the</div><div class='add'>+refcount untouched.</div><div class='add'>+</div><div class='add'>+Cc: stable@vger.kernel.org</div><div class='add'>+Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;</div><div class='add'>+---</div><div class='add'>+</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/ath9k.h</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/ath9k.h</div><div class='add'>+@@ -998,6 +998,7 @@ struct ath_softc {</div><div class='add'>+ 	struct survey_info *cur_survey;</div><div class='add'>+ 	struct survey_info survey[ATH9K_NUM_CHANNELS];</div><div class='add'>+ </div><div class='add'>++	spinlock_t intr_lock;</div><div class='add'>+ 	struct tasklet_struct intr_tq;</div><div class='add'>+ 	struct tasklet_struct bcon_tasklet;</div><div class='add'>+ 	struct ath_hw *sc_ah;</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/init.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/init.c</div><div class='add'>+@@ -669,6 +669,7 @@ static int ath9k_init_softc(u16 devid, s</div><div class='add'>+ 		common-&gt;bt_ant_diversity = 1;</div><div class='add'>+ </div><div class='add'>+ 	spin_lock_init(&amp;common-&gt;cc_lock);</div><div class='add'>++	spin_lock_init(&amp;sc-&gt;intr_lock);</div><div class='add'>+ 	spin_lock_init(&amp;sc-&gt;sc_serial_rw);</div><div class='add'>+ 	spin_lock_init(&amp;sc-&gt;sc_pm_lock);</div><div class='add'>+ 	spin_lock_init(&amp;sc-&gt;chan_lock);</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/mac.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/mac.c</div><div class='add'>+@@ -810,21 +810,12 @@ void ath9k_hw_disable_interrupts(struct</div><div class='add'>+ }</div><div class='add'>+ EXPORT_SYMBOL(ath9k_hw_disable_interrupts);</div><div class='add'>+ </div><div class='add'>+-void ath9k_hw_enable_interrupts(struct ath_hw *ah)</div><div class='add'>++static void __ath9k_hw_enable_interrupts(struct ath_hw *ah)</div><div class='add'>+ {</div><div class='add'>+ 	struct ath_common *common = ath9k_hw_common(ah);</div><div class='add'>+ 	u32 sync_default = AR_INTR_SYNC_DEFAULT;</div><div class='add'>+ 	u32 async_mask;</div><div class='add'>+ </div><div class='add'>+-	if (!(ah-&gt;imask &amp; ATH9K_INT_GLOBAL))</div><div class='add'>+-		return;</div><div class='add'>+-</div><div class='add'>+-	if (!atomic_inc_and_test(&amp;ah-&gt;intr_ref_cnt)) {</div><div class='add'>+-		ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n",</div><div class='add'>+-			atomic_read(&amp;ah-&gt;intr_ref_cnt));</div><div class='add'>+-		return;</div><div class='add'>+-	}</div><div class='add'>+-</div><div class='add'>+ 	if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah) ||</div><div class='add'>+ 	    AR_SREV_9561(ah))</div><div class='add'>+ 		sync_default &amp;= ~AR_INTR_SYNC_HOST1_FATAL;</div><div class='add'>+@@ -846,6 +837,39 @@ void ath9k_hw_enable_interrupts(struct a</div><div class='add'>+ 	ath_dbg(common, INTERRUPT, "AR_IMR 0x%x IER 0x%x\n",</div><div class='add'>+ 		REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER));</div><div class='add'>+ }</div><div class='add'>++</div><div class='add'>++void ath9k_hw_resume_interrupts(struct ath_hw *ah)</div><div class='add'>++{</div><div class='add'>++	struct ath_common *common = ath9k_hw_common(ah);</div><div class='add'>++</div><div class='add'>++	if (!(ah-&gt;imask &amp; ATH9K_INT_GLOBAL))</div><div class='add'>++		return;</div><div class='add'>++</div><div class='add'>++	if (atomic_read(&amp;ah-&gt;intr_ref_cnt) != 0) {</div><div class='add'>++		ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n",</div><div class='add'>++			atomic_read(&amp;ah-&gt;intr_ref_cnt));</div><div class='add'>++		return;</div><div class='add'>++	}</div><div class='add'>++</div><div class='add'>++	__ath9k_hw_enable_interrupts(ah);</div><div class='add'>++}</div><div class='add'>++EXPORT_SYMBOL(ath9k_hw_resume_interrupts);</div><div class='add'>++</div><div class='add'>++void ath9k_hw_enable_interrupts(struct ath_hw *ah)</div><div class='add'>++{</div><div class='add'>++	struct ath_common *common = ath9k_hw_common(ah);</div><div class='add'>++</div><div class='add'>++	if (!(ah-&gt;imask &amp; ATH9K_INT_GLOBAL))</div><div class='add'>++		return;</div><div class='add'>++</div><div class='add'>++	if (!atomic_inc_and_test(&amp;ah-&gt;intr_ref_cnt)) {</div><div class='add'>++		ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n",</div><div class='add'>++			atomic_read(&amp;ah-&gt;intr_ref_cnt));</div><div class='add'>++		return;</div><div class='add'>++	}</div><div class='add'>++</div><div class='add'>++	__ath9k_hw_enable_interrupts(ah);</div><div class='add'>++}</div><div class='add'>+ EXPORT_SYMBOL(ath9k_hw_enable_interrupts);</div><div class='add'>+ </div><div class='add'>+ void ath9k_hw_set_interrupts(struct ath_hw *ah)</div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/mac.h</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/mac.h</div><div class='add'>+@@ -744,6 +744,7 @@ void ath9k_hw_set_interrupts(struct ath_</div><div class='add'>+ void ath9k_hw_enable_interrupts(struct ath_hw *ah);</div><div class='add'>+ void ath9k_hw_disable_interrupts(struct ath_hw *ah);</div><div class='add'>+ void ath9k_hw_kill_interrupts(struct ath_hw *ah);</div><div class='add'>++void ath9k_hw_resume_interrupts(struct ath_hw *ah);</div><div class='add'>+ </div><div class='add'>+ void ar9002_hw_attach_mac_ops(struct ath_hw *ah);</div><div class='add'>+ </div><div class='add'>+--- a/drivers/net/wireless/ath/ath9k/main.c</div><div class='add'>++++ b/drivers/net/wireless/ath/ath9k/main.c</div><div class='add'>+@@ -375,9 +375,14 @@ void ath9k_tasklet(unsigned long data)</div><div class='add'>+ 	struct ath_common *common = ath9k_hw_common(ah);</div><div class='add'>+ 	enum ath_reset_type type;</div><div class='add'>+ 	unsigned long flags;</div><div class='add'>+-	u32 status = sc-&gt;intrstatus;</div><div class='add'>++	u32 status;</div><div class='add'>+ 	u32 rxmask;</div><div class='add'>+ </div><div class='add'>++	spin_lock_irqsave(&amp;sc-&gt;intr_lock, flags);</div><div class='add'>++	status = sc-&gt;intrstatus;</div><div class='add'>++	sc-&gt;intrstatus = 0;</div><div class='add'>++	spin_unlock_irqrestore(&amp;sc-&gt;intr_lock, flags);</div><div class='add'>++</div><div class='add'>+ 	ath9k_ps_wakeup(sc);</div><div class='add'>+ 	spin_lock(&amp;sc-&gt;sc_pcu_lock);</div><div class='add'>+ </div><div class='add'>+@@ -480,7 +485,7 @@ void ath9k_tasklet(unsigned long data)</div><div class='add'>+ 	ath9k_btcoex_handle_interrupt(sc, status);</div><div class='add'>+ </div><div class='add'>+ 	/* re-enable hardware interrupt */</div><div class='add'>+-	ath9k_hw_enable_interrupts(ah);</div><div class='add'>++	ath9k_hw_resume_interrupts(ah);</div><div class='add'>+ out:</div><div class='add'>+ 	spin_unlock(&amp;sc-&gt;sc_pcu_lock);</div><div class='add'>+ 	ath9k_ps_restore(sc);</div><div class='add'>+@@ -544,7 +549,9 @@ irqreturn_t ath_isr(int irq, void *dev)</div><div class='add'>+ 		return IRQ_NONE;</div><div class='add'>+ </div><div class='add'>+ 	/* Cache the status */</div><div class='add'>+-	sc-&gt;intrstatus = status;</div><div class='add'>++	spin_lock(&amp;sc-&gt;intr_lock);</div><div class='add'>++	sc-&gt;intrstatus |= status;</div><div class='add'>++	spin_unlock(&amp;sc-&gt;intr_lock);</div><div class='add'>+ </div><div class='add'>+ 	if (status &amp; SCHED_INTR)</div><div class='add'>+ 		sched = true;</div><div class='add'>+@@ -590,7 +597,7 @@ chip_reset:</div><div class='add'>+ </div><div class='add'>+ 	if (sched) {</div><div class='add'>+ 		/* turn off every interrupt */</div><div class='add'>+-		ath9k_hw_disable_interrupts(ah);</div><div class='add'>++		ath9k_hw_kill_interrupts(ah);</div><div class='add'>+ 		tasklet_schedule(&amp;sc-&gt;intr_tq);</div><div class='add'>+ 	}</div><div class='add'>+ </div><div class='head'>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<br/>index f15c451e50..1d3e4bea13 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch</a></div><div class='hunk'>@@ -1,6 +1,6 @@</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/init.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/init.c</div><div class='del'>-@@ -775,6 +775,7 @@ static const struct ieee80211_iface_limi</div><div class='add'>+@@ -777,6 +777,7 @@ static const struct ieee80211_iface_limi</div><div class='ctx'>  				 BIT(NL80211_IFTYPE_AP) },</div><div class='ctx'>  	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |</div><div class='ctx'>  				 BIT(NL80211_IFTYPE_P2P_GO) },</div><div class='head'>diff --git a/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch<br/>index f21eed18c3..73523437d7 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/500-ath9k_eeprom_debugfs.patch</a></div><div class='hunk'>@@ -1,6 +1,6 @@</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/debug.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/debug.c</div><div class='del'>-@@ -1315,6 +1315,53 @@ void ath9k_deinit_debug(struct ath_softc</div><div class='add'>+@@ -1316,6 +1316,53 @@ void ath9k_deinit_debug(struct ath_softc</div><div class='ctx'>  	ath9k_cmn_spectral_deinit_debug(&amp;sc-&gt;spec_priv);</div><div class='ctx'>  }</div><div class='ctx'>  </div><div class='hunk'>@@ -54,7 +54,7 @@</div><div class='ctx'>  int ath9k_init_debug(struct ath_hw *ah)</div><div class='ctx'>  {</div><div class='ctx'>  	struct ath_common *common = ath9k_hw_common(ah);</div><div class='del'>-@@ -1334,6 +1381,8 @@ int ath9k_init_debug(struct ath_hw *ah)</div><div class='add'>+@@ -1335,6 +1382,8 @@ int ath9k_init_debug(struct ath_hw *ah)</div><div class='ctx'>  	ath9k_tx99_init_debug(sc);</div><div class='ctx'>  	ath9k_cmn_spectral_init_debug(&amp;sc-&gt;spec_priv, sc-&gt;debug.debugfs_phy);</div><div class='ctx'>  </div><div class='head'>diff --git a/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch b/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch<br/>index 5c357cfcda..59bc5fc577 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/501-ath9k_ahb_init.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/501-ath9k_ahb_init.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/501-ath9k_ahb_init.patch</a></div><div class='hunk'>@@ -1,6 +1,6 @@</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/init.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/init.c</div><div class='del'>-@@ -1078,23 +1078,23 @@ static int __init ath9k_init(void)</div><div class='add'>+@@ -1080,23 +1080,23 @@ static int __init ath9k_init(void)</div><div class='ctx'>  {</div><div class='ctx'>  	int error;</div><div class='ctx'>  </div><div class='head'>diff --git a/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch b/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch<br/>index c98072bac9..d6eb5f1d24 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/512-ath9k_channelbw_debugfs.patch</a></div><div class='hunk'>@@ -1,6 +1,6 @@</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/debug.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/debug.c</div><div class='del'>-@@ -1362,6 +1362,52 @@ static const struct file_operations fops</div><div class='add'>+@@ -1363,6 +1363,52 @@ static const struct file_operations fops</div><div class='ctx'>  	.owner = THIS_MODULE</div><div class='ctx'>  };</div><div class='ctx'>  </div><div class='hunk'>@@ -53,7 +53,7 @@</div><div class='ctx'>  int ath9k_init_debug(struct ath_hw *ah)</div><div class='ctx'>  {</div><div class='ctx'>  	struct ath_common *common = ath9k_hw_common(ah);</div><div class='del'>-@@ -1383,6 +1429,8 @@ int ath9k_init_debug(struct ath_hw *ah)</div><div class='add'>+@@ -1384,6 +1430,8 @@ int ath9k_init_debug(struct ath_hw *ah)</div><div class='ctx'>  </div><div class='ctx'>  	debugfs_create_file("eeprom", S_IRUSR, sc-&gt;debug.debugfs_phy, sc,</div><div class='ctx'>  			    &amp;fops_eeprom);</div><div class='head'>diff --git a/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch b/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch<br/>index bbef79d9f6..061288dd87 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/530-ath9k_extra_leds.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/530-ath9k_extra_leds.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/530-ath9k_extra_leds.patch</a></div><div class='hunk'>@@ -24,7 +24,7 @@</div><div class='ctx'>  struct ath_softc {</div><div class='ctx'>  	struct ieee80211_hw *hw;</div><div class='ctx'>  	struct device *dev;</div><div class='del'>-@@ -1045,9 +1055,8 @@ struct ath_softc {</div><div class='add'>+@@ -1047,9 +1057,8 @@ struct ath_softc {</div><div class='ctx'>  	spinlock_t chan_lock;</div><div class='ctx'>  </div><div class='ctx'>  #ifdef CPTCFG_MAC80211_LEDS</div><div class='hunk'>@@ -103,7 +103,8 @@</div><div class='ctx'> +		      GFP_KERNEL);</div><div class='ctx'> +	if (!led)</div><div class='ctx'> +		return -ENOMEM;</div><div class='del'>-+</div><div class='add'>+ </div><div class='add'>+-	ath9k_hw_set_gpio(sc-&gt;sc_ah, sc-&gt;sc_ah-&gt;led_pin, val);</div><div class='ctx'> +	led-&gt;gpio = gpio = (struct gpio_led *) (led + 1);</div><div class='ctx'> +	_name = (char *) (led-&gt;gpio + 1);</div><div class='ctx'> +</div><div class='hunk'>@@ -116,8 +117,7 @@</div><div class='ctx'> +	ret = ath_add_led(sc, led);</div><div class='ctx'> +	if (unlikely(ret &lt; 0))</div><div class='ctx'> +		kfree(led);</div><div class='del'>- </div><div class='del'>--	ath9k_hw_set_gpio(sc-&gt;sc_ah, sc-&gt;sc_ah-&gt;led_pin, val);</div><div class='add'>++</div><div class='ctx'> +	return ret;</div><div class='ctx'>  }</div><div class='ctx'>  </div><div class='hunk'>@@ -125,11 +125,11 @@</div><div class='ctx'>  {</div><div class='ctx'> -	if (!sc-&gt;led_registered)</div><div class='ctx'> -		return;</div><div class='del'>-+	struct ath_led *led;</div><div class='del'>- </div><div class='add'>+-</div><div class='ctx'> -	ath_led_brightness(&amp;sc-&gt;led_cdev, LED_OFF);</div><div class='ctx'> -	led_classdev_unregister(&amp;sc-&gt;led_cdev);</div><div class='del'>--</div><div class='add'>++	struct ath_led *led;</div><div class='add'>+ </div><div class='ctx'> -	ath9k_hw_gpio_free(sc-&gt;sc_ah, sc-&gt;sc_ah-&gt;led_pin);</div><div class='ctx'> +	while (!list_empty(&amp;sc-&gt;leds)) {</div><div class='ctx'> +		led = list_first_entry(&amp;sc-&gt;leds, struct ath_led, list);</div><div class='hunk'>@@ -181,7 +181,7 @@</div><div class='ctx'>  </div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/init.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/init.c</div><div class='del'>-@@ -990,7 +990,7 @@ int ath9k_init_device(u16 devid, struct</div><div class='add'>+@@ -992,7 +992,7 @@ int ath9k_init_device(u16 devid, struct</div><div class='ctx'>  </div><div class='ctx'>  #ifdef CPTCFG_MAC80211_LEDS</div><div class='ctx'>  	/* must be initialized before ieee80211_register_hw */</div><div class='hunk'>@@ -192,7 +192,7 @@</div><div class='ctx'>  #endif</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/debug.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/debug.c</div><div class='del'>-@@ -1407,6 +1407,61 @@ static const struct file_operations fops</div><div class='add'>+@@ -1408,6 +1408,61 @@ static const struct file_operations fops</div><div class='ctx'>  	.llseek = default_llseek,</div><div class='ctx'>  };</div><div class='ctx'>  </div><div class='hunk'>@@ -254,7 +254,7 @@</div><div class='ctx'>  </div><div class='ctx'>  int ath9k_init_debug(struct ath_hw *ah)</div><div class='ctx'>  {</div><div class='del'>-@@ -1431,6 +1486,10 @@ int ath9k_init_debug(struct ath_hw *ah)</div><div class='add'>+@@ -1432,6 +1487,10 @@ int ath9k_init_debug(struct ath_hw *ah)</div><div class='ctx'>  			    &amp;fops_eeprom);</div><div class='ctx'>  	debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc-&gt;debug.debugfs_phy,</div><div class='ctx'>  			    sc, &amp;fops_chanbw);</div><div class='head'>diff --git a/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch<br/>index 08acc0e0c9..ea73e6a000 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/542-ath9k_debugfs_diag.patch</a></div><div class='hunk'>@@ -1,6 +1,6 @@</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/debug.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/debug.c</div><div class='del'>-@@ -1463,6 +1463,50 @@ static const struct file_operations fops</div><div class='add'>+@@ -1464,6 +1464,50 @@ static const struct file_operations fops</div><div class='ctx'>  #endif</div><div class='ctx'>  </div><div class='ctx'>  </div><div class='hunk'>@@ -51,7 +51,7 @@</div><div class='ctx'>  int ath9k_init_debug(struct ath_hw *ah)</div><div class='ctx'>  {</div><div class='ctx'>  	struct ath_common *common = ath9k_hw_common(ah);</div><div class='del'>-@@ -1490,6 +1534,8 @@ int ath9k_init_debug(struct ath_hw *ah)</div><div class='add'>+@@ -1491,6 +1535,8 @@ int ath9k_init_debug(struct ath_hw *ah)</div><div class='ctx'>  	debugfs_create_file("gpio_led", S_IWUSR,</div><div class='ctx'>  			   sc-&gt;debug.debugfs_phy, sc, &amp;fops_gpio_led);</div><div class='ctx'>  #endif</div><div class='hunk'>@@ -94,7 +94,7 @@</div><div class='ctx'>  struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/hw.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/hw.c</div><div class='del'>-@@ -1838,6 +1838,20 @@ u32 ath9k_hw_get_tsf_offset(struct times</div><div class='add'>+@@ -1842,6 +1842,20 @@ u32 ath9k_hw_get_tsf_offset(struct times</div><div class='ctx'>  }</div><div class='ctx'>  EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);</div><div class='ctx'>  </div><div class='hunk'>@@ -115,7 +115,7 @@</div><div class='ctx'>  int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,</div><div class='ctx'>  		   struct ath9k_hw_cal_data *caldata, bool fastcc)</div><div class='ctx'>  {</div><div class='del'>-@@ -2046,6 +2060,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st</div><div class='add'>+@@ -2050,6 +2064,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st</div><div class='ctx'>  		ar9003_hw_disable_phy_restart(ah);</div><div class='ctx'>  </div><div class='ctx'>  	ath9k_hw_apply_gpio_override(ah);</div><div class='hunk'>@@ -125,7 +125,7 @@</div><div class='ctx'>  		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/main.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/main.c</div><div class='del'>-@@ -533,6 +533,11 @@ irqreturn_t ath_isr(int irq, void *dev)</div><div class='add'>+@@ -541,6 +541,11 @@ irqreturn_t ath_isr(int irq, void *dev)</div><div class='ctx'>  	if (test_bit(ATH_OP_HW_RESET, &amp;common-&gt;op_flags))</div><div class='ctx'>  		return IRQ_HANDLED;</div><div class='ctx'>  </div><div class='head'>diff --git a/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch b/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch<br/>index 77824795d6..bca23d3d3d 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/543-ath9k_entropy_from_adc.patch</a></div><div class='hunk'>@@ -55,7 +55,7 @@</div><div class='ctx'>  	ops-&gt;spectral_scan_config = ar9003_hw_spectral_scan_config;</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/init.c</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/init.c</div><div class='del'>-@@ -763,7 +763,8 @@ static void ath9k_init_txpower_limits(st</div><div class='add'>+@@ -765,7 +765,8 @@ static void ath9k_init_txpower_limits(st</div><div class='ctx'>  	if (ah-&gt;caps.hw_caps &amp; ATH9K_HW_CAP_5GHZ)</div><div class='ctx'>  		ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ);</div><div class='ctx'>  </div><div class='hunk'>@@ -65,7 +65,7 @@</div><div class='ctx'>  }</div><div class='ctx'>  </div><div class='ctx'>  static const struct ieee80211_iface_limit if_limits[] = {</div><div class='del'>-@@ -950,6 +951,18 @@ static void ath9k_set_hw_capab(struct at</div><div class='add'>+@@ -952,6 +953,18 @@ static void ath9k_set_hw_capab(struct at</div><div class='ctx'>  	SET_IEEE80211_PERM_ADDR(hw, common-&gt;macaddr);</div><div class='ctx'>  }</div><div class='ctx'>  </div><div class='hunk'>@@ -84,7 +84,7 @@</div><div class='ctx'>  int ath9k_init_device(u16 devid, struct ath_softc *sc,</div><div class='ctx'>  		    const struct ath_bus_ops *bus_ops)</div><div class='ctx'>  {</div><div class='del'>-@@ -995,6 +1008,8 @@ int ath9k_init_device(u16 devid, struct</div><div class='add'>+@@ -997,6 +1010,8 @@ int ath9k_init_device(u16 devid, struct</div><div class='ctx'>  		ARRAY_SIZE(ath9k_tpt_blink));</div><div class='ctx'>  #endif</div><div class='ctx'>  </div><div class='head'>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<br/>index 200a3a28f6..680bb6d590 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/544-ath9k-ar933x-usb-hang-workaround.patch</a></div><div class='hunk'>@@ -40,7 +40,7 @@</div><div class='ctx'>  	return true;</div><div class='ctx'>  }</div><div class='ctx'>  </div><div class='del'>-@@ -1816,8 +1835,14 @@ static int ath9k_hw_do_fastcc(struct ath</div><div class='add'>+@@ -1820,8 +1839,14 @@ static int ath9k_hw_do_fastcc(struct ath</div><div class='ctx'>  	if (AR_SREV_9271(ah))</div><div class='ctx'>  		ar9002_hw_load_ani_reg(ah, chan);</div><div class='ctx'>  </div><div class='hunk'>@@ -55,7 +55,7 @@</div><div class='ctx'>  	return -EINVAL;</div><div class='ctx'>  }</div><div class='ctx'>  </div><div class='del'>-@@ -2071,6 +2096,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st</div><div class='add'>+@@ -2075,6 +2100,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st</div><div class='ctx'>  		ath9k_hw_set_radar_params(ah);</div><div class='ctx'>  	}</div><div class='ctx'>  </div><div class='head'>diff --git a/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch b/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch<br/>index 666622d416..0b9b7f3db0 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/548-ath9k_enable_gpio_chip.patch</a></div><div class='hunk'>@@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;</div><div class='ctx'>  struct ath_softc {</div><div class='ctx'>  	struct ieee80211_hw *hw;</div><div class='ctx'>  	struct device *dev;</div><div class='del'>-@@ -1057,6 +1066,9 @@ struct ath_softc {</div><div class='add'>+@@ -1059,6 +1068,9 @@ struct ath_softc {</div><div class='ctx'>  #ifdef CPTCFG_MAC80211_LEDS</div><div class='ctx'>  	const char *led_default_trigger;</div><div class='ctx'>  	struct list_head leds;</div><div class='head'>diff --git a/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch b/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch<br/>index b8dd2639f8..0a266999e0 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/549-ath9k_enable_gpio_buttons.patch</a></div><div class='hunk'>@@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau &lt;nbd@nbd.name&gt;</div><div class='ctx'> ---</div><div class='ctx'> --- a/drivers/net/wireless/ath/ath9k/ath9k.h</div><div class='ctx'> +++ b/drivers/net/wireless/ath/ath9k/ath9k.h</div><div class='del'>-@@ -1068,6 +1068,7 @@ struct ath_softc {</div><div class='add'>+@@ -1070,6 +1070,7 @@ struct ath_softc {</div><div class='ctx'>  	struct list_head leds;</div><div class='ctx'>  #ifdef CONFIG_GPIOLIB</div><div class='ctx'>  	struct ath9k_gpio_chip *gpiochip;</div><div class='head'>diff --git a/package/kernel/mac80211/patches/556-ath9k-define-all-EEPROM-fields-in-Little-Endian-form.patch b/package/kernel/mac80211/patches/556-ath9k-define-all-EEPROM-fields-in-Little-Endian-form.patch<br/>index 04714f8169..292ea8a558 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/556-ath9k-define-all-EEPROM-fields-in-Little-Endian-form.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/556-ath9k-define-all-EEPROM-fields-in-Little-Endian-form.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/556-ath9k-define-all-EEPROM-fields-in-Little-Endian-form.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/556-ath9k-define-all-EEPROM-fields-in-Little-Endian-form.patch</a></div><div class='hunk'>@@ -349,16 +349,6 @@ Signed-off-by: Martin Blumenstingl &lt;martin.blumenstingl@googlemail.com&gt;</div><div class='ctx'> -</div><div class='ctx'> -		integer = swab32(eep-&gt;modalHeader.antCtrlCommon);</div><div class='ctx'> -		eep-&gt;modalHeader.antCtrlCommon = integer;</div><div class='del'>--</div><div class='del'>--		for (i = 0; i &lt; AR5416_EEP4K_MAX_CHAINS; i++) {</div><div class='del'>--			integer = swab32(eep-&gt;modalHeader.antCtrlChain[i]);</div><div class='del'>--			eep-&gt;modalHeader.antCtrlChain[i] = integer;</div><div class='del'>--		}</div><div class='del'>--</div><div class='del'>--		for (i = 0; i &lt; AR_EEPROM_MODAL_SPURS; i++) {</div><div class='del'>--			word = swab16(eep-&gt;modalHeader.spurChans[i].spurChan);</div><div class='del'>--			eep-&gt;modalHeader.spurChans[i].spurChan = word;</div><div class='del'>--		}</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.length);</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.checksum);</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.version);</div><div class='hunk'>@@ -368,10 +358,18 @@ Signed-off-by: Martin Blumenstingl &lt;martin.blumenstingl@googlemail.com&gt;</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.blueToothOptions);</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.deviceCap);</div><div class='ctx'> +		EEPROM_FIELD_SWAB32(eep-&gt;modalHeader.antCtrlCommon);</div><div class='del'>-+</div><div class='add'>+ </div><div class='add'>+-		for (i = 0; i &lt; AR5416_EEP4K_MAX_CHAINS; i++) {</div><div class='add'>+-			integer = swab32(eep-&gt;modalHeader.antCtrlChain[i]);</div><div class='add'>+-			eep-&gt;modalHeader.antCtrlChain[i] = integer;</div><div class='add'>+-		}</div><div class='ctx'> +		for (i = 0; i &lt; AR5416_EEP4K_MAX_CHAINS; i++)</div><div class='ctx'> +			EEPROM_FIELD_SWAB32(eep-&gt;modalHeader.antCtrlChain[i]);</div><div class='del'>-+</div><div class='add'>+ </div><div class='add'>+-		for (i = 0; i &lt; AR_EEPROM_MODAL_SPURS; i++) {</div><div class='add'>+-			word = swab16(eep-&gt;modalHeader.spurChans[i].spurChan);</div><div class='add'>+-			eep-&gt;modalHeader.spurChans[i].spurChan = word;</div><div class='add'>+-		}</div><div class='ctx'> +		for (i = 0; i &lt; AR_EEPROM_MODAL_SPURS; i++)</div><div class='ctx'> +			EEPROM_FIELD_SWAB16(</div><div class='ctx'> +				eep-&gt;modalHeader.spurChans[i].spurChan);</div><div class='hunk'>@@ -542,16 +540,6 @@ Signed-off-by: Martin Blumenstingl &lt;martin.blumenstingl@googlemail.com&gt;</div><div class='ctx'> -</div><div class='ctx'> -		integer = swab32(eep-&gt;modalHeader.antCtrlCommon);</div><div class='ctx'> -		eep-&gt;modalHeader.antCtrlCommon = integer;</div><div class='del'>--</div><div class='del'>--		for (i = 0; i &lt; AR9287_MAX_CHAINS; i++) {</div><div class='del'>--			integer = swab32(eep-&gt;modalHeader.antCtrlChain[i]);</div><div class='del'>--			eep-&gt;modalHeader.antCtrlChain[i] = integer;</div><div class='del'>--		}</div><div class='del'>--</div><div class='del'>--		for (i = 0; i &lt; AR_EEPROM_MODAL_SPURS; i++) {</div><div class='del'>--			word = swab16(eep-&gt;modalHeader.spurChans[i].spurChan);</div><div class='del'>--			eep-&gt;modalHeader.spurChans[i].spurChan = word;</div><div class='del'>--		}</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.length);</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.checksum);</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.version);</div><div class='hunk'>@@ -561,10 +549,18 @@ Signed-off-by: Martin Blumenstingl &lt;martin.blumenstingl@googlemail.com&gt;</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.blueToothOptions);</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.deviceCap);</div><div class='ctx'> +		EEPROM_FIELD_SWAB32(eep-&gt;modalHeader.antCtrlCommon);</div><div class='del'>-+</div><div class='add'>+ </div><div class='add'>+-		for (i = 0; i &lt; AR9287_MAX_CHAINS; i++) {</div><div class='add'>+-			integer = swab32(eep-&gt;modalHeader.antCtrlChain[i]);</div><div class='add'>+-			eep-&gt;modalHeader.antCtrlChain[i] = integer;</div><div class='add'>+-		}</div><div class='ctx'> +		for (i = 0; i &lt; AR9287_MAX_CHAINS; i++)</div><div class='ctx'> +			EEPROM_FIELD_SWAB32(eep-&gt;modalHeader.antCtrlChain[i]);</div><div class='del'>-+</div><div class='add'>+ </div><div class='add'>+-		for (i = 0; i &lt; AR_EEPROM_MODAL_SPURS; i++) {</div><div class='add'>+-			word = swab16(eep-&gt;modalHeader.spurChans[i].spurChan);</div><div class='add'>+-			eep-&gt;modalHeader.spurChans[i].spurChan = word;</div><div class='add'>+-		}</div><div class='ctx'> +		for (i = 0; i &lt; AR_EEPROM_MODAL_SPURS; i++)</div><div class='ctx'> +			EEPROM_FIELD_SWAB16(</div><div class='ctx'> +				eep-&gt;modalHeader.spurChans[i].spurChan);</div><div class='hunk'>@@ -716,8 +712,7 @@ Signed-off-by: Martin Blumenstingl &lt;martin.blumenstingl@googlemail.com&gt;</div><div class='ctx'>  	if (need_swap) {</div><div class='ctx'> -		u32 integer, j;</div><div class='ctx'> -		u16 word;</div><div class='del'>-+		u32 j;</div><div class='del'>- </div><div class='add'>+-</div><div class='ctx'> -		word = swab16(eep-&gt;baseEepHeader.length);</div><div class='ctx'> -		eep-&gt;baseEepHeader.length = word;</div><div class='ctx'> -</div><div class='hunk'>@@ -738,7 +733,8 @@ Signed-off-by: Martin Blumenstingl &lt;martin.blumenstingl@googlemail.com&gt;</div><div class='ctx'> -</div><div class='ctx'> -		word = swab16(eep-&gt;baseEepHeader.blueToothOptions);</div><div class='ctx'> -		eep-&gt;baseEepHeader.blueToothOptions = word;</div><div class='del'>--</div><div class='add'>++		u32 j;</div><div class='add'>+ </div><div class='ctx'> -		word = swab16(eep-&gt;baseEepHeader.deviceCap);</div><div class='ctx'> -		eep-&gt;baseEepHeader.deviceCap = word;</div><div class='ctx'> +		EEPROM_FIELD_SWAB16(eep-&gt;baseEepHeader.length);</div><div class='head'>diff --git a/package/kernel/mac80211/patches/560-ath9k_ubnt_uap_plus_hsr.patch b/package/kernel/mac80211/patches/560-ath9k_ubnt_uap_plus_hsr.patch<br/>index 723749259c..51fe1bd6cc 100644<br/>--- a/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/560-ath9k_ubnt_uap_plus_hsr.patch?id=acd1795a60ce85baae2817b78b8de683b14cb519'>package/kernel/mac80211/patches/560-ath9k_ubnt_uap_plus_hsr.patch</a><br/>+++ b/<a href='/cgit.cgi/openwrt/upstream/tree/package/kernel/mac80211/patches/560-ath9k_ubnt_uap_plus_hsr.patch?id=f9022964cfa0a44984d2efa2dafe3452899acfdf'>package/kernel/mac80211/patches/560-ath9k_ubnt_uap_plus_hsr.patch</a></div><div class='hunk'>@@ -343,7 +343,7 @@</div><div class='ctx'>  </div><div class='ctx'>  u8 ath9k_parse_mpdudensity(u8 mpdudensity)</div><div class='ctx'>  {</div><div class='del'>-@@ -652,6 +654,7 @@ void ath_reset_work(struct work_struct *</div><div class='add'>+@@ -662,6 +664,7 @@ void ath_reset_work(struct work_struct *</div><div class='ctx'>  static int ath9k_start(struct ieee80211_hw *hw)</div><div class='ctx'>  {</div><div class='ctx'>  	struct ath_softc *sc = hw-&gt;priv;</div><div class='hunk'>@@ -351,7 +351,7 @@</div><div class='ctx'>  	struct ath_hw *ah = sc-&gt;sc_ah;</div><div class='ctx'>  	struct ath_common *common = ath9k_hw_common(ah);</div><div class='ctx'>  	struct ieee80211_channel *curchan = sc-&gt;cur_chan-&gt;chandef.chan;</div><div class='del'>-@@ -730,6 +733,11 @@ static int ath9k_start(struct ieee80211_</div><div class='add'>+@@ -740,6 +743,11 @@ static int ath9k_start(struct ieee80211_</div><div class='ctx'>  					  AR_GPIO_OUTPUT_MUX_AS_OUTPUT);</div><div class='ctx'>  	}</div><div class='ctx'>  </div></td></tr></table></div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2024-09-30 22:40:02 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
