{
int i;
+ /* XXX: currently broken due to cb/requeue use */
+ return -EPERM;
+
/* prepare the filter and save it for the SW queue
* matching the received HW queue */
ieee80211_requeue(local, agg_queue);
} else {
struct netdev_queue *txq;
+ spinlock_t *root_lock;
txq = netdev_get_tx_queue(local->mdev, agg_queue);
+ root_lock = qdisc_root_lock(txq->qdisc);
- spin_lock_bh(&txq->lock);
+ spin_lock_bh(root_lock);
qdisc_reset(txq->qdisc);
- spin_unlock_bh(&txq->lock);
+ spin_unlock_bh(root_lock);
}
}
{
struct netdev_queue *txq = netdev_get_tx_queue(local->mdev, queue);
struct sk_buff_head list;
+ spinlock_t *root_lock;
struct Qdisc *qdisc;
u32 len;
skb_queue_head_init(&list);
- spin_lock(&txq->lock);
+ root_lock = qdisc_root_lock(qdisc);
+ spin_lock(root_lock);
for (len = qdisc->q.qlen; len > 0; len--) {
struct sk_buff *skb = qdisc->dequeue(qdisc);
if (skb)
__skb_queue_tail(&list, skb);
}
- spin_unlock(&txq->lock);
+ spin_unlock(root_lock);
for (len = list.qlen; len > 0; len--) {
struct sk_buff *skb = __skb_dequeue(&list);
txq = netdev_get_tx_queue(local->mdev, new_queue);
- spin_lock(&txq->lock);
qdisc = rcu_dereference(txq->qdisc);
- qdisc->enqueue(skb, qdisc);
+ root_lock = qdisc_root_lock(qdisc);
- spin_unlock(&txq->lock);
+ spin_lock(root_lock);
+ qdisc_enqueue_root(skb, qdisc);
+ spin_unlock(root_lock);
}
out_unlock: