On Sat, Dec 07, 2013 at 09:41:22PM +0200, Emmanuel Grumbach wrote: > From: Emmanuel Grumbach <emmanuel.grumbach@xxxxxxxxx> > > commit f6b129527ca15bae29ffb9417ddaa1c9d99ffc5d upstream. Thank you, I'm queuing this for the 3.5 and 3.11 kernels. Cheers, -- Luis > > Since we set IEEE80211_HW_QUEUE_CONTROL, we can let mac80211 do the > queue assignement and don't need to override its decisions. While > reassiging the same values is harmless of course, it triggered a > WARNING when iwlwifi and mac80211 came to different > conclusions. This happened when mac80211 set > IEEE80211_TX_CTL_SEND_AFTER_DTIM, but didn't route the packet to the > cab_queue because no stations were asleep. > > iwlwifi should not override mac80211's decicions for > offchannel packets and packets to be sent after DTIM, > but it should override mac80211's decision for AMPDUs > since we have a special queue for them. So for AMPDU, > we still override info->hw_queue by the AMPDU queue. > > This avoids: > ------------[ cut here ]------------ > WARNING: CPU: 0 PID: 2531 at drivers/net/wireless/iwlwifi/dvm/tx.c:456 iwlagn_tx_skb+0x6c5/0x883() > Modules linked in: > CPU: 0 PID: 2531 Comm: hostapd Not tainted 3.12.0-rc5+ #1 > Hardware name: /D53427RKE, BIOS RKPPT10H.86A.0017.2013.0425.1251 04/25/2013 > 0000000000000000 0000000000000009 ffffffff8189aa62 0000000000000000 > ffffffff8105a4f2 ffff880058339a48 ffffffff815f8a04 0000000000000000 > ffff8800560097b0 0000000000000208 0000000000000000 ffff8800561a9e5e > Call Trace: > [<ffffffff8189aa62>] ? dump_stack+0x41/0x51 > [<ffffffff8105a4f2>] ? warn_slowpath_common+0x78/0x90 > [<ffffffff815f8a04>] ? iwlagn_tx_skb+0x6c5/0x883 > [<ffffffff815f8a04>] ? iwlagn_tx_skb+0x6c5/0x883 > [<ffffffff818a0040>] ? put_cred+0x15/0x15 > [<ffffffff815f6db4>] ? iwlagn_mac_tx+0x19/0x2f > [<ffffffff8186cc45>] ? __ieee80211_tx+0x226/0x29b > [<ffffffff8186e6bd>] ? ieee80211_tx+0xa6/0xb5 > [<ffffffff8186e98b>] ? ieee80211_monitor_start_xmit+0x1e9/0x204 > [<ffffffff8171ce5f>] ? dev_hard_start_xmit+0x271/0x3ec > [<ffffffff817351ac>] ? sch_direct_xmit+0x66/0x164 > [<ffffffff8171d1bf>] ? dev_queue_xmit+0x1e5/0x3c8 > [<ffffffff817fac5a>] ? packet_sendmsg+0xac5/0xb3d > [<ffffffff81709a09>] ? sock_sendmsg+0x37/0x52 > [<ffffffff810f9e0c>] ? __do_fault+0x338/0x36b > [<ffffffff81713820>] ? verify_iovec+0x44/0x94 > [<ffffffff81709e63>] ? ___sys_sendmsg+0x1f1/0x283 > [<ffffffff81140a73>] ? __inode_wait_for_writeback+0x67/0xae > [<ffffffff8111735e>] ? __cache_free.isra.46+0x178/0x187 > [<ffffffff811173b1>] ? kmem_cache_free+0x44/0x84 > [<ffffffff81132c22>] ? dentry_kill+0x13d/0x149 > [<ffffffff81132f6f>] ? dput+0xe5/0xef > [<ffffffff81136e04>] ? fget_light+0x2e/0x7c > [<ffffffff8170ae62>] ? __sys_sendmsg+0x39/0x57 > [<ffffffff818a7e39>] ? system_call_fastpath+0x16/0x1b > ---[ end trace 1b3eb79359c1d1e6 ]--- > > Reported-by: Sander Eikelenboom <linux@xxxxxxxxxxxxxx> > Reviewed-by: Johannes Berg <johannes.berg@xxxxxxxxx> > Signed-off-by: Johannes Berg <johannes.berg@xxxxxxxxx> > Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@xxxxxxxxx> > --- > drivers/net/wireless/iwlwifi/dvm/tx.c | 14 +++----------- > 1 file changed, 3 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c > index 5ee983f..42f64b5 100644 > --- a/drivers/net/wireless/iwlwifi/dvm/tx.c > +++ b/drivers/net/wireless/iwlwifi/dvm/tx.c > @@ -433,27 +433,19 @@ int iwlagn_tx_skb(struct iwl_priv *priv, > /* Copy MAC header from skb into command buffer */ > memcpy(tx_cmd->hdr, hdr, hdr_len); > > + txq_id = info->hw_queue; > + > if (is_agg) > txq_id = priv->tid_data[sta_id][tid].agg.txq_id; > else if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) { > /* > - * Send this frame after DTIM -- there's a special queue > - * reserved for this for contexts that support AP mode. > - */ > - txq_id = ctx->mcast_queue; > - > - /* > * The microcode will clear the more data > * bit in the last frame it transmits. > */ > hdr->frame_control |= > cpu_to_le16(IEEE80211_FCTL_MOREDATA); > - } else if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) > - txq_id = IWL_AUX_QUEUE; > - else > - txq_id = ctx->ac_to_queue[skb_get_queue_mapping(skb)]; > + } > > - WARN_ON_ONCE(!is_agg && txq_id != info->hw_queue); > WARN_ON_ONCE(is_agg && > priv->queue_to_mac80211[txq_id] != info->hw_queue); > > -- > 1.7.9.5 > > -- > To unsubscribe from this list: send the line "unsubscribe stable" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html