<div dir="ltr"><div>In reference to bug # 18539 <br><a href="https://dev.openwrt.org/ticket/18539#comment:4">https://dev.openwrt.org/ticket/18539#comment:4</a><br></div><div>The deadlock appears that when the adapter is in AP mode and client negotiates into the HT modes.  I don't know if this effects the adapter used in client modes.  But without the patch the adapter is not usable in ap mode.  This adapter is integrated in the sunxi based bpi-r1 board.<br></div><div>I'd be interested in conversations to get this adapter up to some level of 802.11n HT mode.<br><br></div><div>The below patch I'd like to submit for evaluation for inclusion.  <br></div><div>Cheers<br></div><div>   Derek<br></div><div><br><br></div>DEBUGing and patch done by sbrown<br>Comment (by sbrown):<br>
<br>
 I found that the problem only occurs at HT rates.<br>
<br>
 After looking at some more wireshark output, the problem seems to be<br>
 that the aggregation sessions deadlock when a second one starts before<br>
 the first one completes. That would explain why it only occurs in HT<br>
 mode.<br>
<br>
 The sequence on the air before the deadlock is:<br>
<br>
 STA->AP block ack req<br>
 STA->AP ping req<br>
 AP->STA block ack resp<br>
 AP->STA ping resp<br>
 AP->STA block ack req<br>
 STA->AP block ack resp<br>
<br>
 The sequence on the air after the deadlock is:<br>
<br>
 AP->STA block ack req<br>
 STA->AP block ack req<br>
 AP->STA block ack resp<br>
 STA->AP block ack resp<br>
 STA->AP ping req<br>
 ...<br>
 STA->AP ping req (repeats)<br>
<br>
 If I disable aggregation in the driver with the attached patch, the<br>
 problem goes away with a performance loss.<br>
<br>
 {{{<br> 
diff -rupN a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c<br>--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c    2015-04-03 07:10:19.343543253 -0400<br>+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c    2015-04-03 07:11:51.323999358 -0400<br>@@ -59,7 +59,9 @@ static int rtl92cu_init_sw_vars(struct i<br> {<br>     struct rtl_priv *rtlpriv = rtl_priv(hw);<br>     int err;<br>-<br>+ /* disable aggregation until the deadlock is fixed */<br>+        hw->flags &= ~IEEE80211_HW_AMPDU_AGGREGATION;<br>+ <br>     rtlpriv->dm.dm_initialgain_enable = true;<br>     rtlpriv->dm.dm_flag = 0;<br>     rtlpriv->dm.disable_framebursting = false;<br><br>
 }}}<br></div>