ath9k_common: clarify and correct jumbogram processing
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Thu, 5 Nov 2009 22:10:07 +0000 (14:10 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 11 Nov 2009 22:09:11 +0000 (17:09 -0500)
Jumbograms are frames put together linked together through
more than one descriptor. For example ath9k_htc will use this
to send from the target a large frame split up into 2 or more
segments. The driver then would be in charge of putting the
frame back together.

When jumbograms are constructed the rx_stats->rs_more will
bet set and rx_stats->rs_status will not have any valid content
as the actual status will only be avialable at the end of
the chained descriptors.

Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/common.c

index 80edf7a302cab3716b4e56d7720533e1a706d508..acd4bb503dfc4e7761bf0dc3bab32544a2437c6f 100644 (file)
@@ -53,16 +53,17 @@ static bool ath9k_rx_accept(struct ath_common *common,
        if (rx_stats->rs_datalen > common->rx_bufsize)
                return false;
 
-       if (rx_stats->rs_more) {
-               /*
-                * Frame spans multiple descriptors; this cannot happen yet
-                * as we don't support jumbograms. If not in monitor mode,
-                * discard the frame. Enable this if you want to see
-                * error frames in Monitor mode.
-                */
-               if (ah->opmode != NL80211_IFTYPE_MONITOR)
-                       return false;
-       } else if (rx_stats->rs_status != 0) {
+       /*
+        * rs_more indicates chained descriptors which can be used
+        * to link buffers together for a sort of scatter-gather
+        * operation.
+        *
+        * The rx_stats->rs_status will not be set until the end of the
+        * chained descriptors so it can be ignored if rs_more is set. The
+        * rs_more will be false at the last element of the chained
+        * descriptors.
+        */
+       if (!rx_stats->rs_more && rx_stats->rs_status != 0) {
                if (rx_stats->rs_status & ATH9K_RXERR_CRC)
                        rxs->flag |= RX_FLAG_FAILED_FCS_CRC;
                if (rx_stats->rs_status & ATH9K_RXERR_PHY)