]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/b43/xmit.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-2.6-dm
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / b43 / xmit.c
index ec10a8e182f9889aa08a4d1528ca396915c963f8..19aefbfb2c930137d6ca8ea1d5a5532713a1f46f 100644 (file)
@@ -30,6 +30,7 @@
 #include "xmit.h"
 #include "phy.h"
 #include "dma.h"
+#include "pio.h"
 
 
 /* Extract the bitrate index out of a CCK PLCP header. */
@@ -512,7 +513,6 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
        u32 macstat;
        u16 chanid;
        u16 phytype;
-       u8 jssi;
        int padding;
 
        memset(&status, 0, sizeof(status));
@@ -520,7 +520,6 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
        /* Get metadata about the frame from the header. */
        phystat0 = le16_to_cpu(rxhdr->phy_status0);
        phystat3 = le16_to_cpu(rxhdr->phy_status3);
-       jssi = rxhdr->jssi;
        macstat = le32_to_cpu(rxhdr->mac_status);
        mactime = le16_to_cpu(rxhdr->mac_time);
        chanstat = le16_to_cpu(rxhdr->channel);
@@ -574,13 +573,22 @@ void b43_rx(struct b43_wldev *dev, struct sk_buff *skb, const void *_rxhdr)
                }
        }
 
-       status.ssi = b43_rssi_postprocess(dev, jssi,
-                                         (phystat0 & B43_RX_PHYST0_OFDM),
-                                         (phystat0 & B43_RX_PHYST0_GAINCTL),
-                                         (phystat3 & B43_RX_PHYST3_TRSTATE));
+       /* Link quality statistics */
        status.noise = dev->stats.link_noise;
-       /* the next line looks wrong, but is what mac80211 wants */
-       status.signal = (jssi * 100) / B43_RX_MAX_SSI;
+       if ((chanstat & B43_RX_CHAN_PHYTYPE) == B43_PHYTYPE_N) {
+//             s8 rssi = max(rxhdr->power0, rxhdr->power1);
+               //TODO: Find out what the rssi value is (dBm or percentage?)
+               //      and also find out what the maximum possible value is.
+               //      Fill status.ssi and status.signal fields.
+       } else {
+               status.ssi = b43_rssi_postprocess(dev, rxhdr->jssi,
+                                                 (phystat0 & B43_RX_PHYST0_OFDM),
+                                                 (phystat0 & B43_RX_PHYST0_GAINCTL),
+                                                 (phystat3 & B43_RX_PHYST3_TRSTATE));
+               /* the next line looks wrong, but is what mac80211 wants */
+               status.signal = (rxhdr->jssi * 100) / B43_RX_MAX_SSI;
+       }
+
        if (phystat0 & B43_RX_PHYST0_OFDM)
                status.rate_idx = b43_plcp_get_bitrate_idx_ofdm(plcp,
                                                phytype == B43_PHYTYPE_A);
@@ -668,40 +676,54 @@ void b43_handle_txstatus(struct b43_wldev *dev,
                        dev->wl->ieee_stats.dot11RTSSuccessCount++;
        }
 
-       b43_dma_handle_txstatus(dev, status);
+       if (b43_using_pio_transfers(dev))
+               b43_pio_handle_txstatus(dev, status);
+       else
+               b43_dma_handle_txstatus(dev, status);
 }
 
-/* Handle TX status report as received through DMA/PIO queues */
-void b43_handle_hwtxstatus(struct b43_wldev *dev,
-                          const struct b43_hwtxstatus *hw)
+/* Fill out the mac80211 TXstatus report based on the b43-specific
+ * txstatus report data. This returns a boolean whether the frame was
+ * successfully transmitted. */
+bool b43_fill_txstatus_report(struct ieee80211_tx_status *report,
+                             const struct b43_txstatus *status)
 {
-       struct b43_txstatus status;
-       u8 tmp;
-
-       status.cookie = le16_to_cpu(hw->cookie);
-       status.seq = le16_to_cpu(hw->seq);
-       status.phy_stat = hw->phy_stat;
-       tmp = hw->count;
-       status.frame_count = (tmp >> 4);
-       status.rts_count = (tmp & 0x0F);
-       tmp = hw->flags;
-       status.supp_reason = ((tmp & 0x1C) >> 2);
-       status.pm_indicated = !!(tmp & 0x80);
-       status.intermediate = !!(tmp & 0x40);
-       status.for_ampdu = !!(tmp & 0x20);
-       status.acked = !!(tmp & 0x02);
-
-       b43_handle_txstatus(dev, &status);
+       bool frame_success = 1;
+
+       if (status->acked) {
+               /* The frame was ACKed. */
+               report->flags |= IEEE80211_TX_STATUS_ACK;
+       } else {
+               /* The frame was not ACKed... */
+               if (!(report->control.flags & IEEE80211_TXCTL_NO_ACK)) {
+                       /* ...but we expected an ACK. */
+                       frame_success = 0;
+                       report->excessive_retries = 1;
+               }
+       }
+       if (status->frame_count == 0) {
+               /* The frame was not transmitted at all. */
+               report->retry_count = 0;
+       } else
+               report->retry_count = status->frame_count - 1;
+
+       return frame_success;
 }
 
 /* Stop any TX operation on the device (suspend the hardware queues) */
 void b43_tx_suspend(struct b43_wldev *dev)
 {
-       b43_dma_tx_suspend(dev);
+       if (b43_using_pio_transfers(dev))
+               b43_pio_tx_suspend(dev);
+       else
+               b43_dma_tx_suspend(dev);
 }
 
 /* Resume any TX operation on the device (resume the hardware queues) */
 void b43_tx_resume(struct b43_wldev *dev)
 {
-       b43_dma_tx_resume(dev);
+       if (b43_using_pio_transfers(dev))
+               b43_pio_tx_resume(dev);
+       else
+               b43_dma_tx_resume(dev);
 }