Changeset 27275


Ignore:
Timestamp:
2011-06-24T21:53:13+02:00 (7 years ago)
Author:
nbd
Message:

mac80211: update to wireless-testing 2011-06-22

Location:
trunk/package/mac80211
Files:
2 added
33 deleted
26 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/Makefile

    r27273 r27275  
    1111PKG_NAME:=mac80211 
    1212 
    13 PKG_VERSION:=2011-05-27 
    14 PKG_RELEASE:=2 
     13PKG_VERSION:=2011-06-22 
     14PKG_RELEASE:=1 
    1515PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources 
    16 PKG_MD5SUM:=3a382b03333aff304dbe8ee94fce6b5a 
     16PKG_MD5SUM:=3ffdd5cecedcf4236f599bdbc55ba10d 
    1717 
    1818PKG_SOURCE:=compat-wireless-$(PKG_VERSION).tar.bz2 
  • trunk/package/mac80211/patches/001-disable_b44.patch

    r27187 r27275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -327,8 +327,8 @@ endif #CONFIG_SSB 
     3@@ -337,8 +337,8 @@ CONFIG_BCMA_HOST_PCI=y 
    44  
    55 CONFIG_P54_PCI=m 
  • trunk/package/mac80211/patches/002-disable_rfkill.patch

    r27187 r27275  
    1010 ifeq ($(CONFIG_MAC80211),y) 
    1111 $(error "ERROR: you have MAC80211 compiled into the kernel, CONFIG_MAC80211=y, as such you cannot replace its mac80211 driver. You need this set to CONFIG_MAC80211=m. If you are using Fedora upgrade your kernel as later version should this set as modular. For further information on Fedora see https://bugzilla.redhat.com/show_bug.cgi?id=470143. If you are using your own kernel recompile it and make mac80211 modular") 
    12 @@ -635,10 +635,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27 
     12@@ -646,10 +646,10 @@ endif #CONFIG_COMPAT_KERNEL_2_6_27 
    1313 # We need the backported rfkill module on kernel < 2.6.31. 
    1414 # In more recent kernel versions use the in kernel rfkill module. 
  • trunk/package/mac80211/patches/005-disable_ssb_build.patch

    r27187 r27275  
    55  
    66 obj-$(CONFIG_COMPAT_NETWORK_MODULES) += drivers/net/ 
    7 -obj-$(CONFIG_COMPAT_VAR_MODULES) +=  drivers/ssb/ drivers/misc/eeprom/ 
    8 +obj-$(CONFIG_COMPAT_VAR_MODULES) +=  drivers/misc/eeprom/ 
     7-obj-$(CONFIG_COMPAT_VAR_MODULES) +=  drivers/ssb/ drivers/bcma/ drivers/misc/eeprom/ 
     8+obj-$(CONFIG_COMPAT_VAR_MODULES) +=  drivers/bcma/ drivers/misc/eeprom/ 
    99  
    1010 ifeq ($(CONFIG_STAGING_EXCLUDE_BUILD),) 
     
    2020 include $(KLIB_BUILD)/.config 
    2121 endif 
    22 @@ -311,19 +310,18 @@ CONFIG_IPW2200_QOS=y 
     22@@ -314,7 +313,8 @@ CONFIG_IPW2200_QOS=y 
    2323 # % echo 1 > /sys/bus/pci/drivers/ipw2200/*/rtap_iface 
    2424 endif #CONFIG_WIRELESS_EXT 
    2525  
    2626-ifdef CONFIG_SSB 
    27 -# Sonics Silicon Backplane 
    28 -CONFIG_SSB_SPROM=y 
    29 - 
    30 -CONFIG_SSB_BLOCKIO=y 
    31 -CONFIG_SSB_PCIHOST=y 
    32 -CONFIG_SSB_B43_PCI_BRIDGE=y 
    33 -ifdef CONFIG_PCMCIA 
    34 -CONFIG_SSB_PCMCIAHOST=y 
    35 -endif #CONFIG_PCMCIA 
    36 -# CONFIG_SSB_DEBUG=y 
    37 -CONFIG_SSB_DRIVER_PCICORE=y 
     27+# disabled 
     28+ifdef __CONFIG_SSB 
     29 # Sonics Silicon Backplane 
     30 CONFIG_SSB_SPROM=y 
     31  
     32@@ -327,7 +327,7 @@ endif #CONFIG_PCMCIA 
     33 # CONFIG_SSB_DEBUG=y 
     34 CONFIG_SSB_DRIVER_PCICORE=y 
     35 CONFIG_B43_SSB=y 
    3836-endif #CONFIG_SSB 
    39 +# ifdef CONFIG_SSB 
    40 +# # Sonics Silicon Backplane 
    41 +# CONFIG_SSB_SPROM=y 
    42 +# CONFIG_SSB_BLOCKIO=y 
    43 +# CONFIG_SSB_PCIHOST=y 
    44 +# CONFIG_SSB_B43_PCI_BRIDGE=y 
    45 +# ifdef CONFIG_PCMCIA 
    46 +# CONFIG_SSB_PCMCIAHOST=y 
    47 +# endif #CONFIG_PCMCIA 
    48 +# # CONFIG_SSB_DEBUG=y 
    49 +# CONFIG_SSB_DRIVER_PCICORE=y 
    50 +# endif #CONFIG_SSB 
     37+endif #__CONFIG_SSB 
    5138  
    52  CONFIG_P54_PCI=m 
    53   
    54 @@ -524,7 +522,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
     39 CONFIG_BCMA=m 
     40 CONFIG_BCMA_BLOCKIO=y 
     41@@ -534,7 +534,6 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
    5542  
    5643 ifdef CONFIG_MMC 
  • trunk/package/mac80211/patches/007-remove_misc_drivers.patch

    r27187 r27275  
    1010  
    1111 # mac80211 test driver 
    12 @@ -353,13 +353,13 @@ endif #CONFIG_CRC_ITU_T 
     12@@ -365,13 +365,13 @@ endif #CONFIG_CRC_ITU_T 
    1313 CONFIG_MWL8K=m 
    1414  
     
    2929  
    3030 ifdef CONFIG_WIRELESS_EXT 
    31 @@ -419,21 +419,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
     31@@ -431,21 +431,21 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
    3232 # Note: this depends on CONFIG_USB_NET_RNDIS_HOST and CONFIG_USB_NET_CDCETHER 
    3333 # it also requires new RNDIS_HOST and CDC_ETHER modules which we add 
  • trunk/package/mac80211/patches/010-no_pcmcia.patch

    r27187 r27275  
    1010 include $(KLIB_BUILD)/.config 
    1111 endif 
    12 @@ -245,7 +245,7 @@ CONFIG_B43=m 
     12@@ -247,7 +247,7 @@ CONFIG_B43=m 
    1313 CONFIG_B43_HWRNG=y 
    1414 CONFIG_B43_PCI_AUTOSELECT=y 
  • trunk/package/mac80211/patches/011-no_sdio.patch

    r27187 r27275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -505,7 +505,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
     3@@ -517,7 +517,7 @@ endif #CONFIG_SPI_MASTER end of SPI driv 
    44  
    55 ifdef CONFIG_MMC 
  • trunk/package/mac80211/patches/013-disable_b43_nphy.patch

    r27187 r27275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -251,7 +251,7 @@ ifdef CONFIG_MAC80211_LEDS 
     3@@ -253,7 +253,7 @@ ifdef CONFIG_MAC80211_LEDS 
    44 CONFIG_B43_LEDS=y 
    55 endif #CONFIG_MAC80211_LEDS 
     
    77-CONFIG_B43_PHY_N=y 
    88+# CONFIG_B43_PHY_N=y 
     9 # CONFIG_B43_PHY_HT=y 
    910 # CONFIG_B43_FORCE_PIO=y 
    1011 # CONFIG_B43_DEBUG=y 
    11   
  • trunk/package/mac80211/patches/015-remove-rt2x00-options.patch

    r27187 r27275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -315,7 +315,7 @@ CONFIG_RTL8180=m 
     3@@ -327,7 +327,7 @@ CONFIG_RTL8180=m 
    44  
    55 CONFIG_ADM8211=m 
     
    1010 CONFIG_RT2500PCI=m 
    1111 ifdef CONFIG_CRC_CCITT 
    12 @@ -454,7 +454,7 @@ CONFIG_RT2800USB_RT33XX=y 
     12@@ -466,7 +466,7 @@ CONFIG_RT2800USB_RT35XX=y 
    1313 # CONFIG_RT2800USB_RT53XX=y 
    1414 CONFIG_RT2800USB_UNKNOWN=y 
  • trunk/package/mac80211/patches/017-remove_ath9k_rc.patch

    r27187 r27275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -218,7 +218,7 @@ CONFIG_ATH9K_COMMON=m 
     3@@ -219,7 +219,7 @@ CONFIG_ATH9K_COMMON=m 
    44 # as default once we get minstrel properly tested and blessed by 
    55 # our systems engineering team. CCK rates also need to be used 
  • trunk/package/mac80211/patches/018-revert_printk_va_format.patch

    r26912 r27275  
    11--- a/drivers/net/wireless/b43/main.c 
    22+++ b/drivers/net/wireless/b43/main.c 
    3 @@ -323,83 +323,59 @@ static int b43_ratelimit(struct b43_wl * 
     3@@ -334,83 +334,59 @@ static int b43_ratelimit(struct b43_wl * 
    44  
    55 void b43info(struct b43_wl *wl, const char *fmt, ...) 
  • trunk/package/mac80211/patches/019-remove_ath5k_pci_option.patch

    r27187 r27275  
    11--- a/config.mk 
    22+++ b/config.mk 
    3 @@ -223,7 +223,7 @@ CONFIG_ATH9K_COMMON=m 
     3@@ -224,7 +224,7 @@ CONFIG_ATH9K_COMMON=m 
    44 # PCI Drivers 
    55 ifdef CONFIG_PCI 
  • trunk/package/mac80211/patches/110-disable_usb_compat.patch

    r27187 r27275  
    3434--- a/config.mk 
    3535+++ b/config.mk 
    36 @@ -440,7 +440,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
     36@@ -452,7 +452,7 @@ endif #CONFIG_COMPAT_KERNEL_2_6_29 
    3737 # This activates a threading fix for usb urb. 
    3838 # this is mainline commit: b3e670443b7fb8a2d29831b62b44a039c283e351 
  • trunk/package/mac80211/patches/300-pending_work.patch

    r27187 r27275  
    1 --- a/drivers/net/wireless/ath/ath9k/hw.h 
    2 +++ b/drivers/net/wireless/ath/ath9k/hw.h 
    3 @@ -603,7 +603,6 @@ struct ath_hw_ops { 
    4                                      int power_off); 
    5         void (*rx_enable)(struct ath_hw *ah); 
    6         void (*set_desc_link)(void *ds, u32 link); 
    7 -       void (*get_desc_link)(void *ds, u32 **link); 
    8         bool (*calibrate)(struct ath_hw *ah, 
    9                           struct ath9k_channel *chan, 
    10                           u8 rxchainmask, 
    11 --- a/drivers/net/wireless/ath/ath9k/main.c 
    12 +++ b/drivers/net/wireless/ath/ath9k/main.c 
    13 @@ -62,8 +62,6 @@ static bool ath9k_has_pending_frames(str 
    14   
    15         if (txq->axq_depth || !list_empty(&txq->axq_acq)) 
    16                 pending = true; 
    17 -       else if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 
    18 -               pending = !list_empty(&txq->txq_fifo_pending); 
    19   
    20         spin_unlock_bh(&txq->axq_lock); 
    21         return pending; 
    22 --- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c 
    23 +++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c 
    24 @@ -28,11 +28,6 @@ static void ar9002_hw_set_desc_link(void 
    25         ((struct ath_desc*) ds)->ds_link = ds_link; 
    26  } 
    27   
    28 -static void ar9002_hw_get_desc_link(void *ds, u32 **ds_link) 
    29 -{ 
    30 -       *ds_link = &((struct ath_desc *)ds)->ds_link; 
    31 -} 
    32 - 
    33  static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) 
    34  { 
    35         u32 isr = 0; 
    36 @@ -437,7 +432,6 @@ void ar9002_hw_attach_mac_ops(struct ath 
    37   
    38         ops->rx_enable = ar9002_hw_rx_enable; 
    39         ops->set_desc_link = ar9002_hw_set_desc_link; 
    40 -       ops->get_desc_link = ar9002_hw_get_desc_link; 
    41         ops->get_isr = ar9002_hw_get_isr; 
    42         ops->fill_txdesc = ar9002_hw_fill_txdesc; 
    43         ops->proc_txdesc = ar9002_hw_proc_txdesc; 
    44 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    45 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c 
    46 @@ -43,13 +43,6 @@ static void ar9003_hw_set_desc_link(void 
    47         ads->ctl10 |= ar9003_calc_ptr_chksum(ads); 
    48  } 
    49   
    50 -static void ar9003_hw_get_desc_link(void *ds, u32 **ds_link) 
    51 -{ 
    52 -       struct ar9003_txc *ads = ds; 
    53 - 
    54 -       *ds_link = &ads->link; 
    55 -} 
    56 - 
    57  static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) 
    58  { 
    59         u32 isr = 0; 
    60 @@ -498,7 +491,6 @@ void ar9003_hw_attach_mac_ops(struct ath 
    61   
    62         ops->rx_enable = ar9003_hw_rx_enable; 
    63         ops->set_desc_link = ar9003_hw_set_desc_link; 
    64 -       ops->get_desc_link = ar9003_hw_get_desc_link; 
    65         ops->get_isr = ar9003_hw_get_isr; 
    66         ops->fill_txdesc = ar9003_hw_fill_txdesc; 
    67         ops->proc_txdesc = ar9003_hw_proc_txdesc; 
    68 --- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    69 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    70 @@ -179,7 +179,7 @@ enum ATH_AGGR_STATUS { 
    71  struct ath_txq { 
    72         int mac80211_qnum; /* mac80211 queue number, -1 means not mac80211 Q */ 
    73         u32 axq_qnum; /* ath9k hardware queue number */ 
    74 -       u32 *axq_link; 
    75 +       void *axq_link; 
    76         struct list_head axq_q; 
    77         spinlock_t axq_lock; 
    78         u32 axq_depth; 
    79 @@ -188,7 +188,6 @@ struct ath_txq { 
    80         bool axq_tx_inprogress; 
    81         struct list_head axq_acq; 
    82         struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; 
    83 -       struct list_head txq_fifo_pending; 
    84         u8 txq_headidx; 
    85         u8 txq_tailidx; 
    86         int pending_frames; 
    87 --- a/drivers/net/wireless/ath/ath9k/debug.c 
    88 +++ b/drivers/net/wireless/ath/ath9k/debug.c 
    89 @@ -550,6 +550,7 @@ static ssize_t read_file_xmit(struct fil 
    90   
    91         PR("MPDUs Queued:    ", queued); 
    92         PR("MPDUs Completed: ", completed); 
    93 +       PR("MPDUs XRetried:  ", xretries); 
    94         PR("Aggregates:      ", a_aggr); 
    95         PR("AMPDUs Queued HW:", a_queued_hw); 
    96         PR("AMPDUs Queued SW:", a_queued_sw); 
    97 @@ -587,7 +588,6 @@ static ssize_t read_file_xmit(struct fil 
    98   
    99         PRQLE("axq_q empty:       ", axq_q); 
    100         PRQLE("axq_acq empty:     ", axq_acq); 
    101 -       PRQLE("txq_fifo_pending:  ", txq_fifo_pending); 
    102         for (i = 0; i < ATH_TXFIFO_DEPTH; i++) { 
    103                 snprintf(tmp, sizeof(tmp) - 1, "txq_fifo[%i] empty: ", i); 
    104                 PRQLE(tmp, txq_fifo[i]); 
    105 @@ -807,7 +807,10 @@ void ath_debug_stat_tx(struct ath_softc 
    106                 else 
    107                         TX_STAT_INC(qnum, a_completed); 
    108         } else { 
    109 -               TX_STAT_INC(qnum, completed); 
    110 +               if (bf_isxretried(bf)) 
    111 +                       TX_STAT_INC(qnum, xretries); 
    112 +               else 
    113 +                       TX_STAT_INC(qnum, completed); 
    114         } 
    115   
    116         if (ts->ts_status & ATH9K_TXERR_FIFO) 
    117 --- a/drivers/net/wireless/ath/ath9k/hw-ops.h 
    118 +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h 
    119 @@ -39,11 +39,6 @@ static inline void ath9k_hw_set_desc_lin 
    120         ath9k_hw_ops(ah)->set_desc_link(ds, link); 
    121  } 
    122   
    123 -static inline void ath9k_hw_get_desc_link(struct ath_hw *ah, void *ds, 
    124 -                                         u32 **link) 
    125 -{ 
    126 -       ath9k_hw_ops(ah)->get_desc_link(ds, link); 
    127 -} 
    128  static inline bool ath9k_hw_calibrate(struct ath_hw *ah, 
    129                                       struct ath9k_channel *chan, 
    130                                       u8 rxchainmask, 
    131 --- a/drivers/net/wireless/ath/ath9k/xmit.c 
    132 +++ b/drivers/net/wireless/ath/ath9k/xmit.c 
    133 @@ -53,7 +53,7 @@ static void ath_tx_complete_buf(struct a 
    134                                 struct ath_txq *txq, struct list_head *bf_q, 
    135                                 struct ath_tx_status *ts, int txok, int sendbar); 
    136  static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq, 
    137 -                            struct list_head *head); 
    138 +                            struct list_head *head, bool internal); 
    139  static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, int len); 
    140  static void ath_tx_rc_status(struct ath_softc *sc, struct ath_buf *bf, 
    141                              struct ath_tx_status *ts, int nframes, int nbad, 
    142 @@ -377,8 +377,7 @@ static void ath_tx_complete_aggr(struct 
    143                         bf_next = bf->bf_next; 
    144   
    145                         bf->bf_state.bf_type |= BUF_XRETRY; 
    146 -                       if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) || 
    147 -                           !bf->bf_stale || bf_next != NULL) 
    148 +                       if (!bf->bf_stale || bf_next != NULL) 
    149                                 list_move_tail(&bf->list, &bf_head); 
    150   
    151                         ath_tx_rc_status(sc, bf, ts, 1, 1, 0, false); 
    152 @@ -463,20 +462,14 @@ static void ath_tx_complete_aggr(struct 
    153                         } 
    154                 } 
    155   
    156 -               if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) && 
    157 -                   bf_next == NULL) { 
    158 -                       /* 
    159 -                        * Make sure the last desc is reclaimed if it 
    160 -                        * not a holding desc. 
    161 -                        */ 
    162 -                       if (!bf_last->bf_stale) 
    163 -                               list_move_tail(&bf->list, &bf_head); 
    164 -                       else 
    165 -                               INIT_LIST_HEAD(&bf_head); 
    166 -               } else { 
    167 -                       BUG_ON(list_empty(bf_q)); 
    168 +               /* 
    169 +                * Make sure the last desc is reclaimed if it 
    170 +                * not a holding desc. 
    171 +                */ 
    172 +               if (!bf_last->bf_stale || bf_next != NULL) 
    173                         list_move_tail(&bf->list, &bf_head); 
    174 -               } 
    175 +               else 
    176 +                       INIT_LIST_HEAD(&bf_head); 
    177   
    178                 if (!txpending || (tid->state & AGGR_CLEANUP)) { 
    179                         /* 
    180 @@ -837,7 +830,7 @@ static void ath_tx_sched_aggr(struct ath 
    181                         bf->bf_state.bf_type &= ~BUF_AGGR; 
    182                         ath9k_hw_clr11n_aggr(sc->sc_ah, bf->bf_desc); 
    183                         ath_buf_set_rate(sc, bf, fi->framelen); 
    184 -                       ath_tx_txqaddbuf(sc, txq, &bf_q); 
    185 +                       ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
    186                         continue; 
    187                 } 
    188   
    189 @@ -849,7 +842,7 @@ static void ath_tx_sched_aggr(struct ath 
    190                 /* anchor last desc of aggregate */ 
    191                 ath9k_hw_set11n_aggr_last(sc->sc_ah, bf->bf_lastbf->bf_desc); 
    192   
    193 -               ath_tx_txqaddbuf(sc, txq, &bf_q); 
    194 +               ath_tx_txqaddbuf(sc, txq, &bf_q, false); 
    195                 TX_STAT_INC(txq->axq_qnum, a_aggr); 
    196   
    197         } while (txq->axq_ampdu_depth < ATH_AGGR_MIN_QDEPTH && 
    198 @@ -1085,7 +1078,6 @@ struct ath_txq *ath_txq_setup(struct ath 
    199                 txq->txq_headidx = txq->txq_tailidx = 0; 
    200                 for (i = 0; i < ATH_TXFIFO_DEPTH; i++) 
    201                         INIT_LIST_HEAD(&txq->txq_fifo[i]); 
    202 -               INIT_LIST_HEAD(&txq->txq_fifo_pending); 
    203         } 
    204         return &sc->tx.txq[axq_qnum]; 
    205  } 
    206 @@ -1155,13 +1147,8 @@ static bool bf_is_ampdu_not_probing(stru 
    207      return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE); 
    208  } 
    209   
    210 -/* 
    211 - * Drain a given TX queue (could be Beacon or Data) 
    212 - * 
    213 - * This assumes output has been stopped and 
    214 - * we do not need to block ath_tx_tasklet. 
    215 - */ 
    216 -void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx) 
    217 +static void ath_drain_txq_list(struct ath_softc *sc, struct ath_txq *txq, 
    218 +                              struct list_head *list, bool retry_tx) 
    219  { 
    220         struct ath_buf *bf, *lastbf; 
    221         struct list_head bf_head; 
    222 @@ -1170,93 +1157,63 @@ void ath_draintxq(struct ath_softc *sc, 
    223         memset(&ts, 0, sizeof(ts)); 
    224         INIT_LIST_HEAD(&bf_head); 
    225   
    226 -       for (;;) { 
    227 -               spin_lock_bh(&txq->axq_lock); 
    228 +       while (!list_empty(list)) { 
    229 +               bf = list_first_entry(list, struct ath_buf, list); 
    230   
    231 -               if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 
    232 -                       if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) { 
    233 -                               txq->txq_headidx = txq->txq_tailidx = 0; 
    234 -                               spin_unlock_bh(&txq->axq_lock); 
    235 -                               break; 
    236 -                       } else { 
    237 -                               bf = list_first_entry(&txq->txq_fifo[txq->txq_tailidx], 
    238 -                                                     struct ath_buf, list); 
    239 -                       } 
    240 -               } else { 
    241 -                       if (list_empty(&txq->axq_q)) { 
    242 -                               txq->axq_link = NULL; 
    243 -                               spin_unlock_bh(&txq->axq_lock); 
    244 -                               break; 
    245 -                       } 
    246 -                       bf = list_first_entry(&txq->axq_q, struct ath_buf, 
    247 -                                             list); 
    248 - 
    249 -                       if (bf->bf_stale) { 
    250 -                               list_del(&bf->list); 
    251 -                               spin_unlock_bh(&txq->axq_lock); 
    252 +               if (bf->bf_stale) { 
    253 +                       list_del(&bf->list); 
    254   
    255 -                               ath_tx_return_buffer(sc, bf); 
    256 -                               continue; 
    257 -                       } 
    258 +                       ath_tx_return_buffer(sc, bf); 
    259 +                       continue; 
    260                 } 
    261   
    262                 lastbf = bf->bf_lastbf; 
    263 - 
    264 -               if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 
    265 -                       list_cut_position(&bf_head, 
    266 -                                         &txq->txq_fifo[txq->txq_tailidx], 
    267 -                                         &lastbf->list); 
    268 -                       INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH); 
    269 -               } else { 
    270 -                       /* remove ath_buf's of the same mpdu from txq */ 
    271 -                       list_cut_position(&bf_head, &txq->axq_q, &lastbf->list); 
    272 -               } 
    273 +               list_cut_position(&bf_head, list, &lastbf->list); 
    274   
    275                 txq->axq_depth--; 
    276                 if (bf_is_ampdu_not_probing(bf)) 
    277                         txq->axq_ampdu_depth--; 
    278 -               spin_unlock_bh(&txq->axq_lock); 
    279   
    280 +               spin_unlock_bh(&txq->axq_lock); 
    281                 if (bf_isampdu(bf)) 
    282                         ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, 0, 
    283                                              retry_tx); 
    284                 else 
    285                         ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0, 0); 
    286 +               spin_lock_bh(&txq->axq_lock); 
    287         } 
    288 +} 
    289   
    290 +/* 
    291 + * Drain a given TX queue (could be Beacon or Data) 
    292 + * 
    293 + * This assumes output has been stopped and 
    294 + * we do not need to block ath_tx_tasklet. 
    295 + */ 
    296 +void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx) 
    297 +{ 
    298         spin_lock_bh(&txq->axq_lock); 
    299 -       txq->axq_tx_inprogress = false; 
    300 -       spin_unlock_bh(&txq->axq_lock); 
    301 - 
    302         if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 
    303 -               spin_lock_bh(&txq->axq_lock); 
    304 -               while (!list_empty(&txq->txq_fifo_pending)) { 
    305 -                       bf = list_first_entry(&txq->txq_fifo_pending, 
    306 -                                             struct ath_buf, list); 
    307 -                       list_cut_position(&bf_head, 
    308 -                                         &txq->txq_fifo_pending, 
    309 -                                         &bf->bf_lastbf->list); 
    310 -                       spin_unlock_bh(&txq->axq_lock); 
    311 +               int idx = txq->txq_tailidx; 
    312   
    313 -                       if (bf_isampdu(bf)) 
    314 -                               ath_tx_complete_aggr(sc, txq, bf, &bf_head, 
    315 -                                                    &ts, 0, retry_tx); 
    316 -                       else 
    317 -                               ath_tx_complete_buf(sc, bf, txq, &bf_head, 
    318 -                                                   &ts, 0, 0); 
    319 -                       spin_lock_bh(&txq->axq_lock); 
    320 +               while (!list_empty(&txq->txq_fifo[idx])) { 
    321 +                       ath_drain_txq_list(sc, txq, &txq->txq_fifo[idx], 
    322 +                                          retry_tx); 
    323 + 
    324 +                       INCR(idx, ATH_TXFIFO_DEPTH); 
    325                 } 
    326 -               spin_unlock_bh(&txq->axq_lock); 
    327 +               txq->txq_tailidx = idx; 
    328         } 
    329   
    330 +       txq->axq_link = NULL; 
    331 +       txq->axq_tx_inprogress = false; 
    332 +       ath_drain_txq_list(sc, txq, &txq->axq_q, retry_tx); 
    333 + 
    334         /* flush any pending frames if aggregation is enabled */ 
    335 -       if (sc->sc_flags & SC_OP_TXAGGR) { 
    336 -               if (!retry_tx) { 
    337 -                       spin_lock_bh(&txq->axq_lock); 
    338 -                       ath_txq_drain_pending_buffers(sc, txq); 
    339 -                       spin_unlock_bh(&txq->axq_lock); 
    340 -               } 
    341 -       } 
    342 +       if ((sc->sc_flags & SC_OP_TXAGGR) && !retry_tx) 
    343 +               ath_txq_drain_pending_buffers(sc, txq); 
    344 + 
    345 +       spin_unlock_bh(&txq->axq_lock); 
    346  } 
    347   
    348  bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx) 
    349 @@ -1370,11 +1327,13 @@ void ath_txq_schedule(struct ath_softc * 
    350   * assume the descriptors are already chained together by caller. 
    351   */ 
    352  static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq, 
    353 -                            struct list_head *head) 
    354 +                            struct list_head *head, bool internal) 
    355  { 
    356         struct ath_hw *ah = sc->sc_ah; 
    357         struct ath_common *common = ath9k_hw_common(ah); 
    358 -       struct ath_buf *bf; 
    359 +       struct ath_buf *bf, *bf_last; 
    360 +       bool puttxbuf = false; 
    361 +       bool edma; 
    362   
    363         /* 
    364          * Insert the frame on the outbound list and 
    365 @@ -1384,51 +1343,49 @@ static void ath_tx_txqaddbuf(struct ath_ 
    366         if (list_empty(head)) 
    367                 return; 
    368   
    369 +       edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA); 
    370         bf = list_first_entry(head, struct ath_buf, list); 
    371 +       bf_last = list_entry(head->prev, struct ath_buf, list); 
    372   
    373         ath_dbg(common, ATH_DBG_QUEUE, 
    374                 "qnum: %d, txq depth: %d\n", txq->axq_qnum, txq->axq_depth); 
    375   
    376 -       if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { 
    377 -               if (txq->axq_depth >= ATH_TXFIFO_DEPTH) { 
    378 -                       list_splice_tail_init(head, &txq->txq_fifo_pending); 
    379 -                       return; 
    380 -               } 
    381 -               if (!list_empty(&txq->txq_fifo[txq->txq_headidx])) 
    382 -                       ath_dbg(common, ATH_DBG_XMIT, 
    383 -                               "Initializing tx fifo %d which is non-empty\n", 
    384 -                               txq->txq_headidx); 
    385 -               INIT_LIST_HEAD(&txq->txq_fifo[txq->txq_headidx]); 
    386 -               list_splice_init(head, &txq->txq_fifo[txq->txq_headidx]); 
    387 +       if (edma && list_empty(&txq->txq_fifo[txq->txq_headidx])) { 
    388 +               list_splice_tail_init(head, &txq->txq_fifo[txq->txq_headidx]); 
    389                 INCR(txq->txq_headidx, ATH_TXFIFO_DEPTH); 
    390 -               TX_STAT_INC(txq->axq_qnum, puttxbuf); 
    391 -               ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr); 
    392 -               ath_dbg(common, ATH_DBG_XMIT, "TXDP[%u] = %llx (%p)\n", 
    393 -                       txq->axq_qnum, ito64(bf->bf_daddr), bf->bf_desc); 
    394 +               puttxbuf = true; 
    395         } else { 
    396                 list_splice_tail_init(head, &txq->axq_q); 
    397   
    398 -               if (txq->axq_link == NULL) { 
    399 -                       TX_STAT_INC(txq->axq_qnum, puttxbuf); 
    400 -                       ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr); 
    401 -                       ath_dbg(common, ATH_DBG_XMIT, "TXDP[%u] = %llx (%p)\n", 
    402 -                               txq->axq_qnum, ito64(bf->bf_daddr), 
    403 -                               bf->bf_desc); 
    404 -               } else { 
    405 -                       *txq->axq_link = bf->bf_daddr; 
    406 +               if (txq->axq_link) { 
    407 +                       ath9k_hw_set_desc_link(ah, txq->axq_link, bf->bf_daddr); 
    408                         ath_dbg(common, ATH_DBG_XMIT, 
    409                                 "link[%u] (%p)=%llx (%p)\n", 
    410                                 txq->axq_qnum, txq->axq_link, 
    411                                 ito64(bf->bf_daddr), bf->bf_desc); 
    412 -               } 
    413 -               ath9k_hw_get_desc_link(ah, bf->bf_lastbf->bf_desc, 
    414 -                                      &txq->axq_link); 
    415 +               } else if (!edma) 
    416 +                       puttxbuf = true; 
    417 + 
    418 +               txq->axq_link = bf_last->bf_desc; 
    419 +       } 
    420 + 
    421 +       if (puttxbuf) { 
    422 +               TX_STAT_INC(txq->axq_qnum, puttxbuf); 
    423 +               ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr); 
    424 +               ath_dbg(common, ATH_DBG_XMIT, "TXDP[%u] = %llx (%p)\n", 
    425 +                       txq->axq_qnum, ito64(bf->bf_daddr), bf->bf_desc); 
    426 +       } 
    427 + 
    428 +       if (!edma) { 
    429                 TX_STAT_INC(txq->axq_qnum, txstart); 
    430                 ath9k_hw_txstart(ah, txq->axq_qnum); 
    431         } 
    432 -       txq->axq_depth++; 
    433 -       if (bf_is_ampdu_not_probing(bf)) 
    434 -               txq->axq_ampdu_depth++; 
    435 + 
    436 +       if (!internal) { 
    437 +               txq->axq_depth++; 
    438 +               if (bf_is_ampdu_not_probing(bf)) 
    439 +                       txq->axq_ampdu_depth++; 
    440 +       } 
    441  } 
    442   
    443  static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid, 
    444 @@ -1470,7 +1427,7 @@ static void ath_tx_send_ampdu(struct ath 
    445         TX_STAT_INC(txctl->txq->axq_qnum, a_queued_hw); 
    446         bf->bf_lastbf = bf; 
    447         ath_buf_set_rate(sc, bf, fi->framelen); 
    448 -       ath_tx_txqaddbuf(sc, txctl->txq, &bf_head); 
    449 +       ath_tx_txqaddbuf(sc, txctl->txq, &bf_head, false); 
    450  } 
    451   
    452  static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq, 
    453 @@ -1490,7 +1447,7 @@ static void ath_tx_send_normal(struct at 
    454         bf->bf_lastbf = bf; 
    455         fi = get_frame_info(bf->bf_mpdu); 
    456         ath_buf_set_rate(sc, bf, fi->framelen); 
    457 -       ath_tx_txqaddbuf(sc, txq, bf_head); 
    458 +       ath_tx_txqaddbuf(sc, txq, bf_head, false); 
    459         TX_STAT_INC(txq->axq_qnum, queued); 
    460  } 
    461   
    462 @@ -2077,6 +2034,38 @@ static void ath_tx_rc_status(struct ath_ 
    463         tx_info->status.rates[tx_rateindex].count = ts->ts_longretry + 1; 
    464  } 
    465   
    466 +static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, 
    467 +                                 struct ath_tx_status *ts, struct ath_buf *bf, 
    468 +                                 struct list_head *bf_head) 
    469 +{ 
    470 +       int txok; 
    471 + 
    472 +       txq->axq_depth--; 
    473 +       txok = !(ts->ts_status & ATH9K_TXERR_MASK); 
    474 +       txq->axq_tx_inprogress = false; 
    475 +       if (bf_is_ampdu_not_probing(bf)) 
    476 +               txq->axq_ampdu_depth--; 
    477 + 
    478 +       spin_unlock_bh(&txq->axq_lock); 
    479 + 
    480 +       if (!bf_isampdu(bf)) { 
    481 +               /* 
    482 +                * This frame is sent out as a single frame. 
    483 +                * Use hardware retry status for this frame. 
    484 +                */ 
    485 +               if (ts->ts_status & ATH9K_TXERR_XRETRY) 
    486 +                       bf->bf_state.bf_type |= BUF_XRETRY; 
    487 +               ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok, true); 
    488 +               ath_tx_complete_buf(sc, bf, txq, bf_head, ts, txok, 0); 
    489 +       } else 
    490 +               ath_tx_complete_aggr(sc, txq, bf, bf_head, ts, txok, true); 
    491 + 
    492 +       spin_lock_bh(&txq->axq_lock); 
    493 + 
    494 +       if (sc->sc_flags & SC_OP_TXAGGR) 
    495 +               ath_txq_schedule(sc, txq); 
    496 +} 
    497 + 
    498  static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq) 
    499  { 
    500         struct ath_hw *ah = sc->sc_ah; 
    501 @@ -2085,20 +2074,18 @@ static void ath_tx_processq(struct ath_s 
    502         struct list_head bf_head; 
    503         struct ath_desc *ds; 
    504         struct ath_tx_status ts; 
    505 -       int txok; 
    506         int status; 
    507   
    508         ath_dbg(common, ATH_DBG_QUEUE, "tx queue %d (%x), link %p\n", 
    509                 txq->axq_qnum, ath9k_hw_gettxbuf(sc->sc_ah, txq->axq_qnum), 
    510                 txq->axq_link); 
    511   
    512 +       spin_lock_bh(&txq->axq_lock); 
    513         for (;;) { 
    514 -               spin_lock_bh(&txq->axq_lock); 
    515                 if (list_empty(&txq->axq_q)) { 
    516                         txq->axq_link = NULL; 
    517                         if (sc->sc_flags & SC_OP_TXAGGR) 
    518                                 ath_txq_schedule(sc, txq); 
    519 -                       spin_unlock_bh(&txq->axq_lock); 
    520                         break; 
    521                 } 
    522                 bf = list_first_entry(&txq->axq_q, struct ath_buf, list); 
    523 @@ -2114,13 +2101,11 @@ static void ath_tx_processq(struct ath_s 
    524                 bf_held = NULL; 
    525                 if (bf->bf_stale) { 
    526                         bf_held = bf; 
    527 -                       if (list_is_last(&bf_held->list, &txq->axq_q)) { 
    528 -                               spin_unlock_bh(&txq->axq_lock); 
    529 +                       if (list_is_last(&bf_held->list, &txq->axq_q)) 
    530                                 break; 
    531 -                       } else { 
    532 -                               bf = list_entry(bf_held->list.next, 
    533 -                                               struct ath_buf, list); 
    534 -                       } 
    535 + 
    536 +                       bf = list_entry(bf_held->list.next, struct ath_buf, 
    537 +                                       list); 
    538                 } 
    539   
    540                 lastbf = bf->bf_lastbf; 
    541 @@ -2128,10 +2113,9 @@ static void ath_tx_processq(struct ath_s 
    542   
    543                 memset(&ts, 0, sizeof(ts)); 
    544                 status = ath9k_hw_txprocdesc(ah, ds, &ts); 
    545 -               if (status == -EINPROGRESS) { 
    546 -                       spin_unlock_bh(&txq->axq_lock); 
    547 +               if (status == -EINPROGRESS) 
    548                         break; 
    549 -               } 
    550 + 
    551                 TX_STAT_INC(txq->axq_qnum, txprocdesc); 
    552   
    553                 /* 
    554 @@ -2145,42 +2129,14 @@ static void ath_tx_processq(struct ath_s 
    555                         list_cut_position(&bf_head, 
    556                                 &txq->axq_q, lastbf->list.prev); 
    557   
    558 -               txq->axq_depth--; 
    559 -               txok = !(ts.ts_status & ATH9K_TXERR_MASK); 
    560 -               txq->axq_tx_inprogress = false; 
    561 -               if (bf_held) 
    562 +               if (bf_held) { 
    563                         list_del(&bf_held->list); 
    564 - 
    565 -               if (bf_is_ampdu_not_probing(bf)) 
    566 -                       txq->axq_ampdu_depth--; 
    567 - 
    568 -               spin_unlock_bh(&txq->axq_lock); 
    569 - 
    570 -               if (bf_held) 
    571                         ath_tx_return_buffer(sc, bf_held); 
    572 - 
    573 -               if (!bf_isampdu(bf)) { 
    574 -                       /* 
    575 -                        * This frame is sent out as a single frame. 
    576 -                        * Use hardware retry status for this frame. 
    577 -                        */ 
    578 -                       if (ts.ts_status & ATH9K_TXERR_XRETRY) 
    579 -                               bf->bf_state.bf_type |= BUF_XRETRY; 
    580 -                       ath_tx_rc_status(sc, bf, &ts, 1, txok ? 0 : 1, txok, true); 
    581                 } 
    582   
    583 -               if (bf_isampdu(bf)) 
    584 -                       ath_tx_complete_aggr(sc, txq, bf, &bf_head, &ts, txok, 
    585 -                                            true); 
    586 -               else 
    587 -                       ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, txok, 0); 
    588 - 
    589 -               spin_lock_bh(&txq->axq_lock); 
    590 - 
    591 -               if (sc->sc_flags & SC_OP_TXAGGR) 
    592 -                       ath_txq_schedule(sc, txq); 
    593 -               spin_unlock_bh(&txq->axq_lock); 
    594 +               ath_tx_process_buffer(sc, txq, &ts, bf, &bf_head); 
    595         } 
    596 +       spin_unlock_bh(&txq->axq_lock); 
    597  } 
    598   
    599  static void ath_tx_complete_poll_work(struct work_struct *work) 
    600 @@ -2237,17 +2193,16 @@ void ath_tx_tasklet(struct ath_softc *sc 
    601   
    602  void ath_tx_edma_tasklet(struct ath_softc *sc) 
    603  { 
    604 -       struct ath_tx_status txs; 
    605 +       struct ath_tx_status ts; 
    606         struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
    607         struct ath_hw *ah = sc->sc_ah; 
    608         struct ath_txq *txq; 
    609         struct ath_buf *bf, *lastbf; 
    610         struct list_head bf_head; 
    611         int status; 
    612 -       int txok; 
    613   
    614         for (;;) { 
    615 -               status = ath9k_hw_txprocdesc(ah, NULL, (void *)&txs); 
    616 +               status = ath9k_hw_txprocdesc(ah, NULL, (void *)&ts); 
    617                 if (status == -EINPROGRESS) 
    618                         break; 
    619                 if (status == -EIO) { 
    620 @@ -2257,12 +2212,13 @@ void ath_tx_edma_tasklet(struct ath_soft 
    621                 } 
    622   
    623                 /* Skip beacon completions */ 
    624 -               if (txs.qid == sc->beacon.beaconq) 
    625 +               if (ts.qid == sc->beacon.beaconq) 
    626                         continue; 
    627   
    628 -               txq = &sc->tx.txq[txs.qid]; 
    629 +               txq = &sc->tx.txq[ts.qid]; 
    630   
    631                 spin_lock_bh(&txq->axq_lock); 
    632 + 
    633                 if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) { 
    634                         spin_unlock_bh(&txq->axq_lock); 
    635                         return; 
    636 @@ -2275,41 +2231,21 @@ void ath_tx_edma_tasklet(struct ath_soft 
    637                 INIT_LIST_HEAD(&bf_head); 
    638                 list_cut_position(&bf_head, &txq->txq_fifo[txq->txq_tailidx], 
    639                                   &lastbf->list); 
    640 -               INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH); 
    641 -               txq->axq_depth--; 
    642 -               txq->axq_tx_inprogress = false; 
    643 -               if (bf_is_ampdu_not_probing(bf)) 
    644 -                       txq->axq_ampdu_depth--; 
    645 -               spin_unlock_bh(&txq->axq_lock); 
    646   
    647 -               txok = !(txs.ts_status & ATH9K_TXERR_MASK); 
    648 - 
    649 -               if (!bf_isampdu(bf)) { 
    650 -                       if (txs.ts_status & ATH9K_TXERR_XRETRY) 
    651 -                               bf->bf_state.bf_type |= BUF_XRETRY; 
    652 -                       ath_tx_rc_status(sc, bf, &txs, 1, txok ? 0 : 1, txok, true); 
    653 -               } 
    654 - 
    655 -               if (bf_isampdu(bf)) 
    656 -                       ath_tx_complete_aggr(sc, txq, bf, &bf_head, &txs, 
    657 -                                            txok, true); 
    658 -               else 
    659 -                       ath_tx_complete_buf(sc, bf, txq, &bf_head, 
    660 -                                           &txs, txok, 0); 
    661 +               if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) { 
    662 +                       INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH); 
    663   
    664 -               spin_lock_bh(&txq->axq_lock); 
    665 +                       if (!list_empty(&txq->axq_q)) { 
    666 +                               struct list_head bf_q; 
    667   
    668 -               if (!list_empty(&txq->txq_fifo_pending)) { 
    669 -                       INIT_LIST_HEAD(&bf_head); 
    670 -                       bf = list_first_entry(&txq->txq_fifo_pending, 
    671 -                                             struct ath_buf, list); 
    672 -                       list_cut_position(&bf_head, 
    673 -                                         &txq->txq_fifo_pending, 
    674 -                                         &bf->bf_lastbf->list); 
    675 -                       ath_tx_txqaddbuf(sc, txq, &bf_head); 
    676 -               } else if (sc->sc_flags & SC_OP_TXAGGR) 
    677 -                       ath_txq_schedule(sc, txq); 
    678 +                               INIT_LIST_HEAD(&bf_q); 
    679 +                               txq->axq_link = NULL; 
    680 +                               list_splice_tail_init(&txq->axq_q, &bf_q); 
    681 +                               ath_tx_txqaddbuf(sc, txq, &bf_q, true); 
    682 +                       } 
    683 +               } 
    684   
    685 +               ath_tx_process_buffer(sc, txq, &ts, bf, &bf_head); 
    686                 spin_unlock_bh(&txq->axq_lock); 
    687         } 
    688  } 
    6891--- a/net/mac80211/agg-rx.c 
    6902+++ b/net/mac80211/agg-rx.c 
    691 @@ -161,6 +161,8 @@ static void ieee80211_send_addba_resp(st 
     3@@ -176,6 +176,8 @@ static void ieee80211_send_addba_resp(st 
    6924                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN); 
    6935        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
     
    71022        else if (sdata->vif.type == NL80211_IFTYPE_STATION) 
    71123                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN); 
    712 @@ -388,7 +389,8 @@ int ieee80211_start_tx_ba_session(struct 
     24@@ -398,7 +399,8 @@ int ieee80211_start_tx_ba_session(struct 
    71325         */ 
    71426        if (sdata->vif.type != NL80211_IFTYPE_STATION && 
     
    858170 { 
    859171        struct ieee80211_sub_if_data *sdata = 
    860 @@ -822,6 +863,9 @@ static void ieee80211_iface_work(struct 
     172@@ -822,6 +863,9 @@ static void ieee80211_iface_work(struct  
    861173                                break; 
    862174                        ieee80211_mesh_rx_queued_mgmt(sdata, skb); 
     
    934246        WLAN_STA_MFP            = 1<<10, 
    935247        WLAN_STA_BLOCK_BA       = 1<<11, 
    936 --- a/drivers/net/wireless/ath/ath9k/debug.h 
    937 +++ b/drivers/net/wireless/ath/ath9k/debug.h 
    938 @@ -116,6 +116,7 @@ struct ath_tx_stats { 
    939         u32 tx_bytes_all; 
    940         u32 queued; 
    941         u32 completed; 
    942 +       u32 xretries; 
    943         u32 a_aggr; 
    944         u32 a_queued_hw; 
    945         u32 a_queued_sw; 
    946 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c 
    947 +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c 
    948 @@ -4645,10 +4645,16 @@ static void ar9003_hw_set_power_per_rate 
    949         case 1: 
    950                 break; 
    951         case 2: 
    952 -               scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; 
    953 +               if (scaledPower > REDUCE_SCALED_POWER_BY_TWO_CHAIN) 
    954 +                       scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; 
    955 +               else 
    956 +                       scaledPower = 0; 
    957                 break; 
    958         case 3: 
    959 -               scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; 
    960 +               if (scaledPower > REDUCE_SCALED_POWER_BY_THREE_CHAIN) 
    961 +                       scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; 
    962 +               else 
    963 +                       scaledPower = 0; 
    964                 break; 
    965         } 
    966   
    967 --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c 
    968 +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c 
    969 @@ -524,10 +524,16 @@ static void ath9k_hw_set_ar9287_power_pe 
    970         case 1: 
    971                 break; 
    972         case 2: 
    973 -               scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; 
    974 +               if (scaledPower > REDUCE_SCALED_POWER_BY_TWO_CHAIN) 
    975 +                       scaledPower -= REDUCE_SCALED_POWER_BY_TWO_CHAIN; 
    976 +               else 
    977 +                       scaledPower = 0; 
    978                 break; 
    979         case 3: 
    980 -               scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; 
    981 +               if (scaledPower > REDUCE_SCALED_POWER_BY_THREE_CHAIN) 
    982 +                       scaledPower -= REDUCE_SCALED_POWER_BY_THREE_CHAIN; 
    983 +               else 
    984 +                       scaledPower = 0; 
    985                 break; 
    986         } 
    987         scaledPower = max((u16)0, scaledPower); 
  • trunk/package/mac80211/patches/403-ath9k-fix-invalid-mac-address-handling.patch

    r27187 r27275  
    99  
    1010 #include "hw.h" 
    11 @@ -434,8 +435,16 @@ static int ath9k_hw_init_macaddr(struct 
     11@@ -443,8 +444,16 @@ static int ath9k_hw_init_macaddr(struct  
    1212                common->macaddr[2 * i] = eeval >> 8; 
    1313                common->macaddr[2 * i + 1] = eeval & 0xff; 
  • trunk/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch

    r27071 r27275  
    11--- a/drivers/net/wireless/ath/ath9k/main.c 
    22+++ b/drivers/net/wireless/ath/ath9k/main.c 
    3 @@ -1480,15 +1480,6 @@ static int ath9k_add_interface(struct ie 
     3@@ -1490,15 +1490,6 @@ static int ath9k_add_interface(struct ie 
    44                } 
    55        } 
     
    1717                "Attach a VIF of type: %d\n", vif->type); 
    1818  
    19 @@ -1514,15 +1505,6 @@ static int ath9k_change_interface(struct 
     19@@ -1524,15 +1515,6 @@ static int ath9k_change_interface(struct 
    2020        mutex_lock(&sc->mutex); 
    2121        ath9k_ps_wakeup(sc); 
  • trunk/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch

    r27187 r27275  
    11--- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    22+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c 
    3 @@ -97,13 +97,8 @@ ath5k_add_interface(struct ieee80211_hw 
     3@@ -95,13 +95,8 @@ ath5k_add_interface(struct ieee80211_hw  
    44                goto end; 
    55        } 
     
    1919--- a/drivers/net/wireless/ath/ath5k/base.c 
    2020+++ b/drivers/net/wireless/ath/ath5k/base.c 
    21 @@ -1880,7 +1880,7 @@ ath5k_beacon_send(struct ath5k_softc *sc 
     21@@ -1883,7 +1883,7 @@ ath5k_beacon_send(struct ath5k_softc *sc 
    2222                sc->bmisscount = 0; 
    2323        } 
     
    2828                u64 tsf = ath5k_hw_get_tsf64(ah); 
    2929                u32 tsftu = TSF_TO_TU(tsf); 
    30 @@ -1958,7 +1958,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
     30@@ -1961,7 +1961,7 @@ ath5k_beacon_update_timers(struct ath5k_ 
    3131        u64 hw_tsf; 
    3232  
  • trunk/package/mac80211/patches/430-ath5k_disable_fast_cc.patch

    r27187 r27275  
    11--- a/drivers/net/wireless/ath/ath5k/reset.c 
    22+++ b/drivers/net/wireless/ath/ath5k/reset.c 
    3 @@ -1035,6 +1035,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, 
     3@@ -1035,6 +1035,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah,  
    44        tsf_lo = 0; 
    55        mode = 0; 
     
    99         * Sanity check for fast flag 
    1010         * Fast channel change only available 
    11 @@ -1042,6 +1043,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah, 
     11@@ -1042,6 +1043,7 @@ int ath5k_hw_reset(struct ath5k_hw *ah,  
    1212         */ 
    1313        if (fast && (ah->ah_radio != AR5K_RF2413) && 
  • trunk/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch

    r27071 r27275  
    11--- a/drivers/net/wireless/ath/ath9k/debug.c 
    22+++ b/drivers/net/wireless/ath/ath9k/debug.c 
    3 @@ -1131,6 +1131,53 @@ static const struct file_operations fops 
     3@@ -1181,6 +1181,53 @@ static const struct file_operations fops 
    44        .llseek = default_llseek,/* read accesses f_pos */ 
    55 }; 
     
    5555 { 
    5656        struct ath_common *common = ath9k_hw_common(ah); 
    57 @@ -1179,6 +1226,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
     57@@ -1231,6 +1278,9 @@ int ath9k_init_debug(struct ath_hw *ah) 
    5858        debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR, 
    5959                           sc->debug.debugfs_phy, &sc->sc_ah->gpio_val); 
  • trunk/package/mac80211/patches/510-ath9k_intr_mitigation_tweak.patch

    r26912 r27275  
    11--- a/drivers/net/wireless/ath/ath9k/hw.c 
    22+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    3 @@ -1508,8 +1508,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     3@@ -1591,8 +1591,8 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    44        REG_WRITE(ah, AR_OBS, 8); 
    55  
  • trunk/package/mac80211/patches/511-ath9k_increase_bcbuf.patch

    r27187 r27275  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -365,7 +365,7 @@ struct ath_vif { 
     3@@ -363,7 +363,7 @@ struct ath_vif { 
    44  * number of beacon intervals, the game's up. 
    55  */ 
     
    1212--- a/drivers/net/wireless/ath/ath9k/hw.c 
    1313+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    14 @@ -355,8 +355,8 @@ static void ath9k_hw_init_config(struct 
     14@@ -364,8 +364,8 @@ static void ath9k_hw_init_config(struct  
    1515 { 
    1616        int i; 
  • trunk/package/mac80211/patches/512-ath9k_reduce_rxbuf.patch

    r27029 r27275  
    11--- a/drivers/net/wireless/ath/ath9k/ath9k.h 
    22+++ b/drivers/net/wireless/ath/ath9k/ath9k.h 
    3 @@ -119,7 +119,7 @@ void ath_descdma_cleanup(struct ath_soft 
     3@@ -117,7 +117,7 @@ void ath_descdma_cleanup(struct ath_soft 
    44 /* RX / TX */ 
    55 /***********/ 
  • trunk/package/mac80211/patches/530-ath9k_noise_dbm_fixup.patch

    r27187 r27275  
    3939--- a/drivers/net/wireless/ath/ath9k/hw.c 
    4040+++ b/drivers/net/wireless/ath/ath9k/hw.c 
    41 @@ -1344,6 +1344,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
     41@@ -1427,6 +1427,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st 
    4242                memset(caldata, 0, sizeof(*caldata)); 
    4343                ath9k_init_nfcal_hist_buffer(ah, chan); 
     
    4949--- a/drivers/net/wireless/ath/ath9k/hw.h 
    5050+++ b/drivers/net/wireless/ath/ath9k/hw.h 
    51 @@ -687,6 +687,7 @@ struct ath_hw { 
     51@@ -688,6 +688,7 @@ struct ath_hw { 
    5252        enum nl80211_iftype opmode; 
    5353        enum ath9k_power_mode power_mode; 
     
    5959--- a/drivers/net/wireless/ath/ath9k/main.c 
    6060+++ b/drivers/net/wireless/ath/ath9k/main.c 
    61 @@ -163,7 +163,7 @@ static void ath_update_survey_nf(struct 
     61@@ -163,7 +163,7 @@ static void ath_update_survey_nf(struct  
    6262  
    6363        if (chan->noisefloor) { 
     
    7070--- a/drivers/net/wireless/ath/ath9k/recv.c 
    7171+++ b/drivers/net/wireless/ath/ath9k/recv.c 
    72 @@ -985,6 +985,8 @@ static int ath9k_rx_skb_preprocess(struc 
     72@@ -986,6 +986,8 @@ static int ath9k_rx_skb_preprocess(struc 
    7373                                   struct ieee80211_rx_status *rx_status, 
    7474                                   bool *decrypt_error) 
     
    7979  
    8080        /* 
    81 @@ -1005,7 +1007,7 @@ static int ath9k_rx_skb_preprocess(struc 
     81@@ -1006,7 +1008,7 @@ static int ath9k_rx_skb_preprocess(struc 
    8282  
    8383        rx_status->band = hw->conf.channel->band; 
  • trunk/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch

    r26912 r27275  
    11--- a/drivers/net/wireless/mwl8k.c 
    22+++ b/drivers/net/wireless/mwl8k.c 
    3 @@ -5192,6 +5192,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") 
     3@@ -5194,6 +5194,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw") 
    44 MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API)); 
    55  
  • trunk/package/mac80211/patches/800-b43-gpio-mask-module-option.patch

    r27071 r27275  
    11--- a/drivers/net/wireless/b43/b43.h 
    22+++ b/drivers/net/wireless/b43/b43.h 
    3 @@ -720,6 +720,7 @@ struct b43_wldev { 
     3@@ -740,6 +740,7 @@ struct b43_wldev { 
    44        bool qos_enabled;               /* TRUE, if QoS is used. */ 
    55        bool hwcrypto_enabled;          /* TRUE, if HW crypto acceleration is enabled. */ 
     
    2323 module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); 
    2424 MODULE_PARM_DESC(bad_frames_preempt, 
    25 @@ -2560,10 +2565,10 @@ static int b43_gpio_init(struct b43_wlde 
     25@@ -2575,10 +2580,10 @@ static int b43_gpio_init(struct b43_wlde 
    2626                    & ~B43_MACCTL_GPOUTSMSK); 
    2727  
     
    3333-       set = 0x0000000F; 
    3434+       set = modparam_gpiomask; 
    35         if (dev->sdev->bus->chip_id == 0x4301) { 
     35        if (dev->dev->chip_id == 0x4301) { 
    3636                mask |= 0x0060; 
    3737                set |= 0x0060; 
    38 @@ -5084,10 +5089,10 @@ static void b43_print_driverinfo(void) 
     38@@ -5137,10 +5142,10 @@ static void b43_print_driverinfo(void) 
    3939        feat_sdio = "S"; 
    4040 #endif 
  • trunk/package/mac80211/patches/810-b43_no_pio.patch

    r27071 r27275  
    11--- a/drivers/net/wireless/b43/Makefile 
    22+++ b/drivers/net/wireless/b43/Makefile 
    3 @@ -14,7 +14,7 @@ b43-y                         += xmit.o 
     3@@ -17,7 +17,7 @@ b43-y                         += xmit.o 
    44 b43-y                          += lo.o 
    55 b43-y                          += wa.o 
     
    1212--- a/drivers/net/wireless/b43/main.c 
    1313+++ b/drivers/net/wireless/b43/main.c 
    14 @@ -1819,9 +1819,11 @@ static void b43_do_interrupt_thread(stru 
     14@@ -1834,9 +1834,11 @@ static void b43_do_interrupt_thread(stru 
    1515                               dma_reason[4], dma_reason[5]); 
    1616                        b43err(dev->wl, "This device does not support DMA " 
Note: See TracChangeset for help on using the changeset viewer.