summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/staging/cw1200/txrx.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/staging/cw1200/txrx.c b/drivers/staging/cw1200/txrx.c
index a87743b453a..8531994d3da 100644
--- a/drivers/staging/cw1200/txrx.c
+++ b/drivers/staging/cw1200/txrx.c
@@ -595,7 +595,20 @@ void cw1200_tx_confirm_cb(struct cw1200_common *priv,
.multicast = !arg->link_id,
};
cw1200_suspend_resume(priv, &suspend);
- WARN_ON(cw1200_queue_requeue(queue, arg->packetID));
+ if (suspend.multicast) {
+ /* HACK!!! WSM324 firmware has tendency to requeue
+ * multicast frames in a loop, causing performance
+ * drop and high power consumption of the driver.
+ * In this situation it is better just to drop
+ * the problematic frame. */
+ wiphy_warn(priv->hw->wiphy, "Attempt to requeue a "
+ "multicat frame. Frame is dropped\n");
+ WARN_ON(cw1200_queue_remove(queue, priv,
+ arg->packetID));
+ } else {
+ WARN_ON(cw1200_queue_requeue(queue,
+ arg->packetID));
+ }
} else if (!WARN_ON(cw1200_queue_get_skb(
queue, arg->packetID, &skb))) {
struct ieee80211_tx_info *tx = IEEE80211_SKB_CB(skb);