]> err.no Git - linux-2.6/blobdiff - drivers/net/wireless/p54/p54common.c
Merge branches 'x86/urgent', 'x86/amd-iommu', 'x86/apic', 'x86/cleanups', 'x86/core...
[linux-2.6] / drivers / net / wireless / p54 / p54common.c
index 850857932e29fabc97e09261487eaaefa4923c0a..ffaf7a6b681021af9a572bf729ba8739852b91b9 100644 (file)
@@ -357,6 +357,7 @@ static void p54_rx_data(struct ieee80211_hw *dev, struct sk_buff *skb)
 
        rx_status.signal = hdr->rssi;
        /* XX correct? */
+       rx_status.qual = (100 * hdr->rssi) / 127;
        rx_status.rate_idx = hdr->rate & 0xf;
        rx_status.freq = freq;
        rx_status.band = IEEE80211_BAND_2GHZ;
@@ -392,22 +393,27 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb)
        u32 last_addr = priv->rx_start;
 
        while (entry != (struct sk_buff *)&priv->tx_queue) {
-               range = (struct memrecord *)&entry->cb;
+               struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
+               range = (void *)info->driver_data;
                if (range->start_addr == addr) {
-                       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(entry);
                        struct p54_control_hdr *entry_hdr;
                        struct p54_tx_control_allocdata *entry_data;
                        int pad = 0;
 
-                       if (entry->next != (struct sk_buff *)&priv->tx_queue)
-                               freed = ((struct memrecord *)&entry->next->cb)->start_addr - last_addr;
-                       else
+                       if (entry->next != (struct sk_buff *)&priv->tx_queue) {
+                               struct ieee80211_tx_info *ni;
+                               struct memrecord *mr;
+
+                               ni = IEEE80211_SKB_CB(entry->next);
+                               mr = (struct memrecord *)ni->driver_data;
+                               freed = mr->start_addr - last_addr;
+                       } else
                                freed = priv->rx_end - last_addr;
 
                        last_addr = range->end_addr;
                        __skb_unlink(entry, &priv->tx_queue);
                        memset(&info->status, 0, sizeof(info->status));
-                       priv->tx_stats[info->queue].len--;
+                       priv->tx_stats[skb_get_queue_mapping(skb)].len--;
                        entry_hdr = (struct p54_control_hdr *) entry->data;
                        entry_data = (struct p54_tx_control_allocdata *) entry_hdr->data;
                        if ((entry_hdr->magic1 & cpu_to_le16(0x4000)) != 0)
@@ -551,13 +557,13 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
        size_t padding, len;
        u8 rate;
 
-       current_queue = &priv->tx_stats[info->queue];
+       current_queue = &priv->tx_stats[skb_get_queue_mapping(skb)];
        if (unlikely(current_queue->len > current_queue->limit))
                return NETDEV_TX_BUSY;
        current_queue->len++;
        current_queue->count++;
        if (current_queue->len == current_queue->limit)
-               ieee80211_stop_queue(dev, info->queue);
+               ieee80211_stop_queue(dev, skb_get_queue_mapping(skb));
 
        padding = (unsigned long)(skb->data - (sizeof(*hdr) + sizeof(*txhdr))) & 3;
        len = skb->len;
@@ -589,7 +595,7 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
        memset(txhdr->rateset, rate, 8);
        txhdr->wep_key_present = 0;
        txhdr->wep_key_len = 0;
-       txhdr->frame_type = cpu_to_le32(info->queue + 4);
+       txhdr->frame_type = cpu_to_le32(skb_get_queue_mapping(skb) + 4);
        txhdr->magic4 = 0;
        txhdr->antenna = (info->antenna_sel_tx == 0) ?
                2 : info->antenna_sel_tx - 1;