Make b43 hwrng optional
[openwrt/svn-archive/archive.git] / package / mac80211 / patches / 301-rt2x00-Implement-support-for-802.11n.patch
index a6e76bce37fee86325fbf7749822d7346323348f..6106789c3ff82df28348cdc4aa9f3dad0f92653c 100644 (file)
@@ -1,6 +1,6 @@
-From 42d5399c2743dbd1ddaaadc8cb04adbfc65cc970 Mon Sep 17 00:00:00 2001
+From 827327792c4b0d4d4909ec27bd56cb3ba8f2b754 Mon Sep 17 00:00:00 2001
 From: Ivo van Doorn <IvDoorn@gmail.com>
-Date: Sat, 10 Jan 2009 11:01:10 +0100
+Date: Sat, 14 Mar 2009 20:06:48 +0100
 Subject: [PATCH] rt2x00: Implement support for 802.11n
 
 Extend rt2x00lib capabilities to support 802.11n,
@@ -11,14 +11,14 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
 ---
  drivers/net/wireless/rt2x00/Kconfig        |    3 +
  drivers/net/wireless/rt2x00/Makefile       |    1 +
- drivers/net/wireless/rt2x00/rt2x00.h       |    5 ++
+ drivers/net/wireless/rt2x00/rt2x00.h       |    +
  drivers/net/wireless/rt2x00/rt2x00config.c |    5 ++
  drivers/net/wireless/rt2x00/rt2x00dev.c    |   91 ++++++++++++++++++++-------
  drivers/net/wireless/rt2x00/rt2x00ht.c     |   69 +++++++++++++++++++++
  drivers/net/wireless/rt2x00/rt2x00lib.h    |   24 +++++++
  drivers/net/wireless/rt2x00/rt2x00queue.c  |    1 +
- drivers/net/wireless/rt2x00/rt2x00queue.h  |   26 +++++++-
- 9 files changed, 197 insertions(+), 28 deletions(-)
+ drivers/net/wireless/rt2x00/rt2x00queue.h  |   33 ++++++++--
+ 9 files changed, 201 insertions(+), 30 deletions(-)
  create mode 100644 drivers/net/wireless/rt2x00/rt2x00ht.c
 
 --- a/drivers/net/wireless/rt2x00/Makefile
@@ -33,15 +33,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
  obj-$(CONFIG_RT2X00_LIB_PCI)          += rt2x00pci.o
 --- a/drivers/net/wireless/rt2x00/rt2x00.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00.h
-@@ -108,6 +108,7 @@
-  */
- #define ACK_SIZE              14
- #define IEEE80211_HEADER      24
-+#define AGGREGATION_SIZE      3840
- #define PLCP                  48
- #define BEACON                        100
- #define PREAMBLE              144
-@@ -357,6 +358,7 @@ static inline struct rt2x00_intf* vif_to
+@@ -357,6 +357,7 @@ static inline struct rt2x00_intf* vif_to
   *    for @tx_power_a, @tx_power_bg and @channels.
   * @channels: Device/chipset specific channel values (See &struct rf_channel).
   * @channels_info: Additional information for channels (See &struct channel_info).
@@ -49,7 +41,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
   */
  struct hw_mode_spec {
        unsigned int supported_bands;
-@@ -370,6 +372,8 @@ struct hw_mode_spec {
+@@ -370,6 +371,8 @@ struct hw_mode_spec {
        unsigned int num_channels;
        const struct rf_channel *channels;
        const struct channel_info *channels_info;
@@ -58,7 +50,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
  };
  
  /*
-@@ -604,6 +608,7 @@ enum rt2x00_flags {
+@@ -606,6 +609,7 @@ enum rt2x00_flags {
        CONFIG_EXTERNAL_LNA_BG,
        CONFIG_DOUBLE_ANTENNA,
        CONFIG_DISABLE_LINK_TUNING,
@@ -82,7 +74,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
                       sizeof(libconf.rf));
 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
-@@ -315,18 +315,54 @@ void rt2x00lib_txdone(struct queue_entry
+@@ -316,18 +316,54 @@ void rt2x00lib_txdone(struct queue_entry
  }
  EXPORT_SYMBOL_GPL(rt2x00lib_txdone);
  
@@ -141,7 +133,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
  
        /*
         * Allocate a new sk_buffer. If no new buffer available, drop the
-@@ -375,26 +411,17 @@ void rt2x00lib_rxdone(struct rt2x00_dev 
+@@ -376,26 +412,17 @@ void rt2x00lib_rxdone(struct rt2x00_dev 
        skb_trim(entry->skb, rxdesc.size);
  
        /*
@@ -179,7 +171,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
        }
  
        /*
-@@ -404,7 +431,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev 
+@@ -405,7 +432,7 @@ void rt2x00lib_rxdone(struct rt2x00_dev 
        rt2x00debug_update_crypto(rt2x00dev, &rxdesc);
  
        rx_status->mactime = rxdesc.timestamp;
@@ -188,7 +180,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
        rx_status->qual = rt2x00link_calculate_signal(rt2x00dev, rxdesc.rssi);
        rx_status->signal = rxdesc.rssi;
        rx_status->noise = rxdesc.noise;
-@@ -439,72 +466,84 @@ const struct rt2x00_rate rt2x00_supporte
+@@ -440,72 +467,84 @@ const struct rt2x00_rate rt2x00_supporte
                .bitrate = 10,
                .ratemask = BIT(0),
                .plcp = 0x00,
@@ -273,7 +265,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
        },
  };
  
-@@ -580,6 +619,8 @@ static int rt2x00lib_probe_hw_modes(stru
+@@ -581,6 +620,8 @@ static int rt2x00lib_probe_hw_modes(stru
                rt2x00dev->bands[IEEE80211_BAND_2GHZ].bitrates = rates;
                hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
                    &rt2x00dev->bands[IEEE80211_BAND_2GHZ];
@@ -282,7 +274,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
        }
  
        /*
-@@ -596,6 +637,8 @@ static int rt2x00lib_probe_hw_modes(stru
+@@ -597,6 +638,8 @@ static int rt2x00lib_probe_hw_modes(stru
                rt2x00dev->bands[IEEE80211_BAND_5GHZ].bitrates = &rates[4];
                hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
                    &rt2x00dev->bands[IEEE80211_BAND_5GHZ];
@@ -295,7 +287,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
 +++ b/drivers/net/wireless/rt2x00/rt2x00ht.c
 @@ -0,0 +1,69 @@
 +/*
-+      Copyright (C) 2004 - 2008 rt2x00 SourceForge Project
++      Copyright (C) 2004 - 2009 rt2x00 SourceForge Project
 +      <http://rt2x00.serialmonkey.com>
 +
 +      This program is free software; you can redistribute it and/or modify
@@ -327,10 +319,10 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
 +
 +void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
 +                                 struct txentry_desc *txdesc,
-+                                 struct ieee80211_rate *rate)
++                                 const struct rt2x00_rate *hwrate)
 +{
 +      struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb);
-+      const struct rt2x00_rate *hwrate = rt2x00_get_rate(rate->hw_value);
++      struct ieee80211_tx_rate *txrate = &tx_info->control.rates[0];
 +
 +      if (tx_info->control.sta)
 +              txdesc->mpdu_density =
@@ -338,11 +330,11 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
 +      else
 +              txdesc->mpdu_density = 0;
 +
-+      txdesc->ba_size = 0;    /* FIXME: What value is needed? */
++      txdesc->ba_size = 7;    /* FIXME: What value is needed? */
 +      txdesc->stbc = 0;       /* FIXME: What value is needed? */
 +
 +      txdesc->mcs = rt2x00_get_rate_mcs(hwrate->mcs);
-+      if (rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
++      if (txrate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
 +              txdesc->mcs |= 0x08;
 +
 +      /*
@@ -354,13 +346,13 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
 +      /*
 +       * Determine HT Mix/Greenfield rate mode
 +       */
-+      if (tx_info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
++      if (txrate->flags & IEEE80211_TX_RC_MCS)
 +              txdesc->rate_mode = RATE_MODE_HT_MIX;
-+      if (tx_info->control.rates[0].flags & IEEE80211_TX_RC_GREEN_FIELD)
++      if (txrate->flags & IEEE80211_TX_RC_GREEN_FIELD)
 +              txdesc->rate_mode = RATE_MODE_HT_GREENFIELD;
-+      if (tx_info->control.rates[0].flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
++      if (txrate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
 +              __set_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags);
-+      if (tx_info->control.rates[0].flags & IEEE80211_TX_RC_SHORT_GI)
++      if (txrate->flags & IEEE80211_TX_RC_SHORT_GI)
 +              __set_bit(ENTRY_TXD_HT_SHORT_GI, &txdesc->flags);
 +}
 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h
@@ -388,7 +380,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
  /*
   * Radio control handlers.
   */
-@@ -330,6 +339,21 @@ static inline void rt2x00crypto_rx_inser
+@@ -341,6 +350,21 @@ static inline void rt2x00crypto_rx_inser
  #endif /* CONFIG_RT2X00_LIB_CRYPTO */
  
  /*
@@ -397,11 +389,11 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
 +#ifdef CONFIG_RT2X00_LIB_HT
 +void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
 +                                 struct txentry_desc *txdesc,
-+                                 struct ieee80211_rate *rate);
++                                 const struct rt2x00_rate *hwrate);
 +#else
 +static inline void rt2x00ht_create_tx_descriptor(struct queue_entry *entry,
 +                                               struct txentry_desc *txdesc,
-+                                               struct ieee80211_rate *rate)
++                                               const struct rt2x00_rate *hwrate)
 +{
 +}
 +#endif /* CONFIG_RT2X00_LIB_HT */
@@ -412,17 +404,32 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
  #ifdef CONFIG_RT2X00_LIB_RFKILL
 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
 +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
-@@ -325,6 +325,7 @@ static void rt2x00queue_create_tx_descri
+@@ -326,6 +326,7 @@ static void rt2x00queue_create_tx_descri
         * Apply TX descriptor handling by components
         */
        rt2x00crypto_create_tx_descriptor(entry, txdesc);
-+      rt2x00ht_create_tx_descriptor(entry, txdesc, rate);
++      rt2x00ht_create_tx_descriptor(entry, txdesc, hwrate);
        rt2x00queue_create_tx_descriptor_seq(entry, txdesc);
-       rt2x00queue_create_tx_descriptor_plcp(entry, txdesc, rate);
+       rt2x00queue_create_tx_descriptor_plcp(entry, txdesc, hwrate);
  }
 --- a/drivers/net/wireless/rt2x00/rt2x00queue.h
 +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
-@@ -145,6 +145,7 @@ static inline struct skb_frame_desc* get
+@@ -35,9 +35,12 @@
+  * for USB devices this restriction does not apply, but the value of
+  * 2432 makes sense since it is big enough to contain the maximum fragment
+  * size according to the ieee802.11 specs.
++ * The aggregation size depends on support from the driver, but should
++ * be something around 3840 bytes.
+  */
+-#define DATA_FRAME_SIZE       2432
+-#define MGMT_FRAME_SIZE       256
++#define DATA_FRAME_SIZE               2432
++#define MGMT_FRAME_SIZE               256
++#define AGGREGATION_SIZE      3840
+ /**
+  * DOC: Number of entries per queue
+@@ -145,6 +148,7 @@ static inline struct skb_frame_desc* get
   *
   * @RXDONE_SIGNAL_PLCP: Signal field contains the plcp value.
   * @RXDONE_SIGNAL_BITRATE: Signal field contains the bitrate value.
@@ -430,7 +437,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
   * @RXDONE_MY_BSS: Does this frame originate from device's BSS.
   * @RXDONE_CRYPTO_IV: Driver provided IV/EIV data.
   * @RXDONE_CRYPTO_ICV: Driver provided ICV data.
-@@ -152,9 +153,10 @@ static inline struct skb_frame_desc* get
+@@ -152,9 +156,10 @@ static inline struct skb_frame_desc* get
  enum rxdone_entry_desc_flags {
        RXDONE_SIGNAL_PLCP = 1 << 0,
        RXDONE_SIGNAL_BITRATE = 1 << 1,
@@ -444,7 +451,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
  };
  
  /**
-@@ -163,7 +165,7 @@ enum rxdone_entry_desc_flags {
+@@ -163,7 +168,7 @@ enum rxdone_entry_desc_flags {
   * from &rxdone_entry_desc to a signal value type.
   */
  #define RXDONE_SIGNAL_MASK \
@@ -453,7 +460,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
  
  /**
   * struct rxdone_entry_desc: RX Entry descriptor
-@@ -177,6 +179,7 @@ enum rxdone_entry_desc_flags {
+@@ -177,6 +182,7 @@ enum rxdone_entry_desc_flags {
   * @size: Data size of the received frame.
   * @flags: MAC80211 receive flags (See &enum mac80211_rx_flags).
   * @dev_flags: Ralink receive flags (See &enum rxdone_entry_desc_flags).
@@ -461,7 +468,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
   * @cipher: Cipher type used during decryption.
   * @cipher_status: Decryption status.
   * @iv: IV/EIV data used during decryption.
-@@ -190,6 +193,7 @@ struct rxdone_entry_desc {
+@@ -190,6 +196,7 @@ struct rxdone_entry_desc {
        int size;
        int flags;
        int dev_flags;
@@ -469,7 +476,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
        u8 cipher;
        u8 cipher_status;
  
-@@ -243,6 +247,9 @@ struct txdone_entry_desc {
+@@ -243,6 +250,9 @@ struct txdone_entry_desc {
   * @ENTRY_TXD_ENCRYPT_PAIRWISE: Use pairwise key table (instead of shared).
   * @ENTRY_TXD_ENCRYPT_IV: Generate IV/EIV in hardware.
   * @ENTRY_TXD_ENCRYPT_MMIC: Generate MIC in hardware.
@@ -479,7 +486,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
   */
  enum txentry_desc_flags {
        ENTRY_TXD_RTS_FRAME,
-@@ -258,6 +265,9 @@ enum txentry_desc_flags {
+@@ -258,6 +268,9 @@ enum txentry_desc_flags {
        ENTRY_TXD_ENCRYPT_PAIRWISE,
        ENTRY_TXD_ENCRYPT_IV,
        ENTRY_TXD_ENCRYPT_MMIC,
@@ -489,7 +496,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
  };
  
  /**
-@@ -271,7 +281,11 @@ enum txentry_desc_flags {
+@@ -271,7 +284,11 @@ enum txentry_desc_flags {
   * @length_low: PLCP length low word.
   * @signal: PLCP signal.
   * @service: PLCP service.
@@ -501,7 +508,7 @@ Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
   * @retry_limit: Max number of retries.
   * @aifs: AIFS value.
   * @ifs: IFS value.
-@@ -291,7 +305,11 @@ struct txentry_desc {
+@@ -291,7 +308,11 @@ struct txentry_desc {
        u16 signal;
        u16 service;