diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00pci.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 63cfe33e95da..764147dd5aea 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -38,20 +38,14 @@ int rt2x00pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
38 | struct ieee80211_tx_control *control) | 38 | struct ieee80211_tx_control *control) |
39 | { | 39 | { |
40 | struct rt2x00_dev *rt2x00dev = hw->priv; | 40 | struct rt2x00_dev *rt2x00dev = hw->priv; |
41 | struct rt2x00_intf *intf = vif_to_intf(control->vif); | ||
41 | struct queue_entry_priv_pci_tx *priv_tx; | 42 | struct queue_entry_priv_pci_tx *priv_tx; |
42 | struct skb_frame_desc *skbdesc; | 43 | struct skb_frame_desc *skbdesc; |
43 | struct data_queue *queue; | ||
44 | struct queue_entry *entry; | ||
45 | 44 | ||
46 | /* | 45 | if (unlikely(!intf->beacon)) |
47 | * Just in case mac80211 doesn't set this correctly, | 46 | return -ENOBUFS; |
48 | * but we need this queue set for the descriptor | 47 | |
49 | * initialization. | 48 | priv_tx = intf->beacon->priv_data; |
50 | */ | ||
51 | control->queue = IEEE80211_TX_QUEUE_BEACON; | ||
52 | queue = rt2x00queue_get_queue(rt2x00dev, control->queue); | ||
53 | entry = rt2x00queue_get_entry(queue, Q_INDEX); | ||
54 | priv_tx = entry->priv_data; | ||
55 | 49 | ||
56 | /* | 50 | /* |
57 | * Fill in skb descriptor | 51 | * Fill in skb descriptor |
@@ -59,17 +53,25 @@ int rt2x00pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
59 | skbdesc = get_skb_frame_desc(skb); | 53 | skbdesc = get_skb_frame_desc(skb); |
60 | memset(skbdesc, 0, sizeof(*skbdesc)); | 54 | memset(skbdesc, 0, sizeof(*skbdesc)); |
61 | skbdesc->data = skb->data; | 55 | skbdesc->data = skb->data; |
62 | skbdesc->data_len = queue->data_size; | 56 | skbdesc->data_len = skb->len; |
63 | skbdesc->desc = priv_tx->desc; | 57 | skbdesc->desc = priv_tx->desc; |
64 | skbdesc->desc_len = queue->desc_size; | 58 | skbdesc->desc_len = intf->beacon->queue->desc_size; |
65 | skbdesc->entry = entry; | 59 | skbdesc->entry = intf->beacon; |
66 | 60 | ||
67 | memcpy(priv_tx->data, skb->data, skb->len); | 61 | /* |
62 | * Just in case mac80211 doesn't set this correctly, | ||
63 | * but we need this queue set for the descriptor | ||
64 | * initialization. | ||
65 | */ | ||
66 | control->queue = IEEE80211_TX_QUEUE_BEACON; | ||
68 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | 67 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); |
69 | 68 | ||
70 | /* | 69 | /* |
71 | * Enable beacon generation. | 70 | * Enable beacon generation. |
71 | * Write entire beacon with descriptor to register, | ||
72 | * and kick the beacon generator. | ||
72 | */ | 73 | */ |
74 | memcpy(priv_tx->data, skb->data, skb->len); | ||
73 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, control->queue); | 75 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, control->queue); |
74 | 76 | ||
75 | return 0; | 77 | return 0; |