diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 777cd74..cbff186 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c @@ -1374,34 +1374,23 @@ static inline int should_inject_overflow(struct b43_dmaring *ring) } /* Static mapping of mac80211's queues (priorities) to b43 DMA rings. */ -static struct b43_dmaring *select_ring_by_priority(struct b43_wldev *dev, - u8 queue_prio) +static struct b43_dmaring *select_ring_by_priority(struct b43_wldev *dev, u8 q) { - struct b43_dmaring *ring; - - if (dev->qos_enabled) { - /* 0 = highest priority */ - switch (queue_prio) { - default: - B43_WARN_ON(1); - /* fallthrough */ - case 0: - ring = dev->dma.tx_ring_AC_VO; - break; - case 1: - ring = dev->dma.tx_ring_AC_VI; - break; - case 2: - ring = dev->dma.tx_ring_AC_BE; - break; - case 3: - ring = dev->dma.tx_ring_AC_BK; - break; - } - } else - ring = dev->dma.tx_ring_AC_BE; - - return ring; + switch (q) { + case 0: + return dev->dma.tx_ring_AC_VO; + case 1: + return dev->dma.tx_ring_AC_VI; + default: + WARN_ON_ONCE(1); + /* fall through */ + case 2: + return dev->dma.tx_ring_AC_BE; + case 3: + return dev->dma.tx_ring_AC_BK; + case 4: + return dev->dma.tx_ring_mcast; + } } int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) @@ -1409,20 +1398,9 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) struct b43_dmaring *ring; struct ieee80211_hdr *hdr; int err = 0; - struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); hdr = (struct ieee80211_hdr *)skb->data; - if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) { - /* The multicast ring will be sent after the DTIM */ - ring = dev->dma.tx_ring_mcast; - /* Set the more-data bit. Ucode will clear it on - * the last frame for us. */ - hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA); - } else { - /* Decide by priority where to put this frame. */ - ring = select_ring_by_priority( - dev, skb_get_queue_mapping(skb)); - } + ring = select_ring_by_priority(dev, skb_get_queue_mapping(skb)); B43_WARN_ON(!ring->tx); @@ -1445,11 +1423,6 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) goto out; } - /* Assign the queue number to the ring (if not already done before) - * so TX status handling can use it. The queue to ring mapping is - * static, so we don't need to store it per frame. */ - ring->queue_prio = skb_get_queue_mapping(skb); - err = dma_tx_fragment(ring, skb); if (unlikely(err == -ENOKEY)) { /* Drop this packet, as we don't have the encryption key @@ -1589,12 +1562,12 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev, ring->stopped = false; } - if (dev->wl->tx_queue_stopped[ring->queue_prio]) { - dev->wl->tx_queue_stopped[ring->queue_prio] = 0; + if (dev->wl->tx_queue_stopped[ring->index]) { + dev->wl->tx_queue_stopped[ring->index] = 0; } else { /* If the driver queue is running wake the corresponding * mac80211 queue. */ - ieee80211_wake_queue(dev->wl->hw, ring->queue_prio); + ieee80211_wake_queue(dev->wl->hw, ring->index); if (b43_debug(dev, B43_DBG_DMAVERBOSE)) { b43dbg(dev->wl, "Woke up TX ring %d\n", ring->index); } diff --git a/drivers/net/wireless/b43/dma.h b/drivers/net/wireless/b43/dma.h index 315b96e..78c8634 100644 --- a/drivers/net/wireless/b43/dma.h +++ b/drivers/net/wireless/b43/dma.h @@ -256,9 +256,6 @@ struct b43_dmaring { enum b43_dmatype type; /* Boolean. Is this ring stopped at ieee80211 level? */ bool stopped; - /* The QOS priority assigned to this ring. Only used for TX rings. - * This is the mac80211 "queue" value. */ - u8 queue_prio; struct b43_wldev *dev; #ifdef CONFIG_B43_DEBUG /* Maximum number of used slots. */ diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 5a39b22..a431b93 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c @@ -4737,6 +4737,7 @@ static int b43_op_add_interface(struct ieee80211_hw *hw, struct b43_wl *wl = hw_to_b43_wl(hw); struct b43_wldev *dev; int err = -EOPNOTSUPP; + int i; /* TODO: allow WDS/AP devices to coexist */ @@ -4764,6 +4765,16 @@ static int b43_op_add_interface(struct ieee80211_hw *hw, b43_set_synth_pu_delay(dev, 0); b43_upload_card_macaddress(dev); + for (i = 0; i < IEEE80211_NUM_ACS; i++) { + if (hw->queues > 1) + vif->hw_queue[i] = i; + else /* use BE queue for all */ + vif->hw_queue[i] = 2; + } + + /* 0-3 for ACs, 4 for CAB */ + vif->cab_queue = 4; + err = 0; out_mutex_unlock: mutex_unlock(&wl->mutex); @@ -5286,6 +5297,7 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev) /* fill hw info */ hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | + IEEE80211_HW_QUEUE_CONTROL | IEEE80211_HW_SIGNAL_DBM; hw->wiphy->interface_modes = diff --git a/drivers/net/wireless/b43/pio.c b/drivers/net/wireless/b43/pio.c index 3533ab8..0dabad2 100644 --- a/drivers/net/wireless/b43/pio.c +++ b/drivers/net/wireless/b43/pio.c @@ -298,33 +298,23 @@ err_destroy_bk: /* Static mapping of mac80211's queues (priorities) to b43 PIO queues. */ static struct b43_pio_txqueue *select_queue_by_priority(struct b43_wldev *dev, - u8 queue_prio) + u8 q) { - struct b43_pio_txqueue *q; - - if (dev->qos_enabled) { - /* 0 = highest priority */ - switch (queue_prio) { - default: - B43_WARN_ON(1); - /* fallthrough */ - case 0: - q = dev->pio.tx_queue_AC_VO; - break; - case 1: - q = dev->pio.tx_queue_AC_VI; - break; - case 2: - q = dev->pio.tx_queue_AC_BE; - break; - case 3: - q = dev->pio.tx_queue_AC_BK; - break; - } - } else - q = dev->pio.tx_queue_AC_BE; - - return q; + switch (q) { + case 0: + return dev->pio.tx_queue_AC_VO; + case 1: + return dev->pio.tx_queue_AC_VI; + default: + WARN_ON_ONCE(1); + /* fall through */ + case 2: + return dev->pio.tx_queue_AC_BE; + case 3: + return dev->pio.tx_queue_AC_BK; + case 4: + return dev->pio.tx_queue_mcast; + } } static u16 tx_write_2byte_queue(struct b43_pio_txqueue *q, @@ -505,20 +495,10 @@ int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb) struct ieee80211_hdr *hdr; unsigned int hdrlen, total_len; int err = 0; - struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); hdr = (struct ieee80211_hdr *)skb->data; - if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) { - /* The multicast queue will be sent after the DTIM. */ - q = dev->pio.tx_queue_mcast; - /* Set the frame More-Data bit. Ucode will clear it - * for us on the last frame. */ - hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA); - } else { - /* Decide by priority where to put this frame. */ - q = select_queue_by_priority(dev, skb_get_queue_mapping(skb)); - } + q = select_queue_by_priority(dev, skb_get_queue_mapping(skb)); hdrlen = b43_txhdr_size(dev); total_len = roundup(skb->len + hdrlen, 4); @@ -543,11 +523,6 @@ int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb) goto out; } - /* Assign the queue number to the ring (if not already done before) - * so TX status handling can use it. The mac80211-queue to b43-queue - * mapping is static, so we don't need to store it per frame. */ - q->queue_prio = skb_get_queue_mapping(skb); - err = pio_tx_frame(q, skb); if (unlikely(err == -ENOKEY)) { /* Drop this packet, as we don't have the encryption key @@ -600,7 +575,7 @@ void b43_pio_handle_txstatus(struct b43_wldev *dev, list_add(&pack->list, &q->packets_list); if (q->stopped) { - ieee80211_wake_queue(dev->wl->hw, q->queue_prio); + ieee80211_wake_queue(dev->wl->hw, q->index); q->stopped = false; } } diff --git a/drivers/net/wireless/b43/pio.h b/drivers/net/wireless/b43/pio.h index 1e51614..35f195c 100644 --- a/drivers/net/wireless/b43/pio.h +++ b/drivers/net/wireless/b43/pio.h @@ -83,8 +83,6 @@ struct b43_pio_txqueue { bool stopped; /* Our b43 queue index number */ u8 index; - /* The mac80211 QoS queue priority. */ - u8 queue_prio; /* Buffer for TX packet meta data. */ struct b43_pio_txpacket packets[B43_PIO_MAX_NR_TXPACKETS];