Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Этот коммит содержится в:
@@ -1436,6 +1436,10 @@ struct mac_iveiv_entry {
|
||||
#define MAC_WCID_ATTRIBUTE_CIPHER FIELD32(0x0000000e)
|
||||
#define MAC_WCID_ATTRIBUTE_BSS_IDX FIELD32(0x00000070)
|
||||
#define MAC_WCID_ATTRIBUTE_RX_WIUDF FIELD32(0x00000380)
|
||||
#define MAC_WCID_ATTRIBUTE_CIPHER_EXT FIELD32(0x00000400)
|
||||
#define MAC_WCID_ATTRIBUTE_BSS_IDX_EXT FIELD32(0x00000800)
|
||||
#define MAC_WCID_ATTRIBUTE_WAPI_MCBC FIELD32(0x00008000)
|
||||
#define MAC_WCID_ATTRIBUTE_WAPI_KEY_IDX FIELD32(0xff000000)
|
||||
|
||||
/*
|
||||
* SHARED_KEY_MODE:
|
||||
@@ -1557,7 +1561,9 @@ struct mac_iveiv_entry {
|
||||
*/
|
||||
|
||||
/*
|
||||
* BBP 1: TX Antenna
|
||||
* BBP 1: TX Antenna & Power
|
||||
* POWER: 0 - normal, 1 - drop tx power by 6dBm, 2 - drop tx power by 12dBm,
|
||||
* 3 - increase tx power by 6dBm
|
||||
*/
|
||||
#define BBP1_TX_POWER FIELD8(0x07)
|
||||
#define BBP1_TX_ANTENNA FIELD8(0x18)
|
||||
|
@@ -1,9 +1,9 @@
|
||||
/*
|
||||
Copyright (C) 2010 Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Copyright (C) 2009 Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
|
||||
Copyright (C) 2009 Gertjan van Wingerde <gwingerde@gmail.com>
|
||||
|
||||
Based on the original rt2800pci.c and rt2800usb.c.
|
||||
Copyright (C) 2009 Ivo van Doorn <IvDoorn@gmail.com>
|
||||
Copyright (C) 2009 Alban Browaeys <prahal@yahoo.com>
|
||||
Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org>
|
||||
Copyright (C) 2009 Luis Correia <luis.f.correia@gmail.com>
|
||||
@@ -41,10 +41,6 @@
|
||||
#include "rt2800lib.h"
|
||||
#include "rt2800.h"
|
||||
|
||||
MODULE_AUTHOR("Bartlomiej Zolnierkiewicz");
|
||||
MODULE_DESCRIPTION("rt2800 library");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/*
|
||||
* Register access.
|
||||
* All access to the CSR registers will go through the methods
|
||||
@@ -558,15 +554,28 @@ static void rt2800_config_wcid_attr(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx);
|
||||
|
||||
rt2800_register_read(rt2x00dev, offset, ®);
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_KEYTAB,
|
||||
!!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE));
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_CIPHER,
|
||||
(crypto->cmd == SET_KEY) * crypto->cipher);
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_BSS_IDX,
|
||||
(crypto->cmd == SET_KEY) * crypto->bssidx);
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_RX_WIUDF, crypto->cipher);
|
||||
rt2800_register_write(rt2x00dev, offset, reg);
|
||||
if (crypto->cmd == SET_KEY) {
|
||||
rt2800_register_read(rt2x00dev, offset, ®);
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_KEYTAB,
|
||||
!!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE));
|
||||
/*
|
||||
* Both the cipher as the BSS Idx numbers are split in a main
|
||||
* value of 3 bits, and a extended field for adding one additional
|
||||
* bit to the value.
|
||||
*/
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_CIPHER,
|
||||
(crypto->cipher & 0x7));
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_CIPHER_EXT,
|
||||
(crypto->cipher & 0x8) >> 3);
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_BSS_IDX,
|
||||
(crypto->bssidx & 0x7));
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_BSS_IDX_EXT,
|
||||
(crypto->bssidx & 0x8) >> 3);
|
||||
rt2x00_set_field32(®, MAC_WCID_ATTRIBUTE_RX_WIUDF, crypto->cipher);
|
||||
rt2800_register_write(rt2x00dev, offset, reg);
|
||||
} else {
|
||||
rt2800_register_write(rt2x00dev, offset, 0);
|
||||
}
|
||||
|
||||
offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
|
||||
|
||||
@@ -1079,7 +1088,7 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
|
||||
u8 r1;
|
||||
|
||||
rt2800_bbp_read(rt2x00dev, 1, &r1);
|
||||
rt2x00_set_field8(®, BBP1_TX_POWER, 0);
|
||||
rt2x00_set_field8(&r1, BBP1_TX_POWER, 0);
|
||||
rt2800_bbp_write(rt2x00dev, 1, r1);
|
||||
|
||||
rt2800_register_read(rt2x00dev, TX_PWR_CFG_0, ®);
|
||||
@@ -2497,6 +2506,18 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_eeprom_addr(rt2x00dev,
|
||||
EEPROM_MAC_ADDR_0));
|
||||
|
||||
/*
|
||||
* As rt2800 has a global fallback table we cannot specify
|
||||
* more then one tx rate per frame but since the hw will
|
||||
* try several rates (based on the fallback table) we should
|
||||
* still initialize max_rates to the maximum number of rates
|
||||
* we are going to try. Otherwise mac80211 will truncate our
|
||||
* reported tx rates and the rc algortihm will end up with
|
||||
* incorrect data.
|
||||
*/
|
||||
rt2x00dev->hw->max_rates = 7;
|
||||
rt2x00dev->hw->max_rate_tries = 1;
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &eeprom);
|
||||
|
||||
/*
|
||||
@@ -2749,3 +2770,8 @@ const struct ieee80211_ops rt2800_mac80211_ops = {
|
||||
.rfkill_poll = rt2x00mac_rfkill_poll,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(rt2800_mac80211_ops);
|
||||
|
||||
MODULE_AUTHOR(DRV_PROJECT ", Bartlomiej Zolnierkiewicz");
|
||||
MODULE_VERSION(DRV_VERSION);
|
||||
MODULE_DESCRIPTION("Ralink RT2800 library");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@@ -51,7 +51,7 @@
|
||||
/*
|
||||
* Allow hardware encryption to be disabled.
|
||||
*/
|
||||
static int modparam_nohwcrypt = 1;
|
||||
static int modparam_nohwcrypt = 0;
|
||||
module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
|
||||
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
|
||||
|
||||
@@ -813,29 +813,24 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
struct txdone_entry_desc txdesc;
|
||||
u32 word;
|
||||
u32 reg;
|
||||
u32 old_reg;
|
||||
int wcid, ack, pid, tx_wcid, tx_ack, tx_pid;
|
||||
u16 mcs, real_mcs;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* During each loop we will compare the freshly read
|
||||
* TX_STA_FIFO register value with the value read from
|
||||
* the previous loop. If the 2 values are equal then
|
||||
* we should stop processing because the chance it
|
||||
* quite big that the device has been unplugged and
|
||||
* we risk going into an endless loop.
|
||||
* TX_STA_FIFO is a stack of X entries, hence read TX_STA_FIFO
|
||||
* at most X times and also stop processing once the TX_STA_FIFO_VALID
|
||||
* flag is not set anymore.
|
||||
*
|
||||
* The legacy drivers use X=TX_RING_SIZE but state in a comment
|
||||
* that the TX_STA_FIFO stack has a size of 16. We stick to our
|
||||
* tx ring size for now.
|
||||
*/
|
||||
old_reg = 0;
|
||||
|
||||
while (1) {
|
||||
for (i = 0; i < TX_ENTRIES; i++) {
|
||||
rt2800_register_read(rt2x00dev, TX_STA_FIFO, ®);
|
||||
if (!rt2x00_get_field32(reg, TX_STA_FIFO_VALID))
|
||||
break;
|
||||
|
||||
if (old_reg == reg)
|
||||
break;
|
||||
old_reg = reg;
|
||||
|
||||
wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
|
||||
ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
|
||||
pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
|
||||
@@ -903,8 +898,12 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
txdesc.retry = 7;
|
||||
}
|
||||
|
||||
__set_bit(TXDONE_FALLBACK, &txdesc.flags);
|
||||
|
||||
/*
|
||||
* the frame was retried at least once
|
||||
* -> hw used fallback rates
|
||||
*/
|
||||
if (txdesc.retry)
|
||||
__set_bit(TXDONE_FALLBACK, &txdesc.flags);
|
||||
|
||||
rt2x00pci_txdone(entry, &txdesc);
|
||||
}
|
||||
|
@@ -45,7 +45,7 @@
|
||||
/*
|
||||
* Allow hardware encryption to be disabled.
|
||||
*/
|
||||
static int modparam_nohwcrypt = 1;
|
||||
static int modparam_nohwcrypt = 0;
|
||||
module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
|
||||
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
|
||||
|
||||
|
@@ -236,8 +236,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,
|
||||
*/
|
||||
success =
|
||||
test_bit(TXDONE_SUCCESS, &txdesc->flags) ||
|
||||
test_bit(TXDONE_UNKNOWN, &txdesc->flags) ||
|
||||
test_bit(TXDONE_FALLBACK, &txdesc->flags);
|
||||
test_bit(TXDONE_UNKNOWN, &txdesc->flags);
|
||||
|
||||
/*
|
||||
* Update TX statistics.
|
||||
@@ -259,11 +258,22 @@ void rt2x00lib_txdone(struct queue_entry *entry,
|
||||
/*
|
||||
* Frame was send with retries, hardware tried
|
||||
* different rates to send out the frame, at each
|
||||
* retry it lowered the rate 1 step.
|
||||
* retry it lowered the rate 1 step except when the
|
||||
* lowest rate was used.
|
||||
*/
|
||||
for (i = 0; i < retry_rates && i < IEEE80211_TX_MAX_RATES; i++) {
|
||||
tx_info->status.rates[i].idx = rate_idx - i;
|
||||
tx_info->status.rates[i].flags = rate_flags;
|
||||
|
||||
if (rate_idx - i == 0) {
|
||||
/*
|
||||
* The lowest rate (index 0) was used until the
|
||||
* number of max retries was reached.
|
||||
*/
|
||||
tx_info->status.rates[i].count = retry_rates - i;
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
tx_info->status.rates[i].count = 1;
|
||||
}
|
||||
if (i < (IEEE80211_TX_MAX_RATES - 1))
|
||||
|
@@ -353,12 +353,17 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry,
|
||||
/*
|
||||
* Check if more fragments are pending
|
||||
*/
|
||||
if (ieee80211_has_morefrags(hdr->frame_control) ||
|
||||
(tx_info->flags & IEEE80211_TX_CTL_MORE_FRAMES)) {
|
||||
if (ieee80211_has_morefrags(hdr->frame_control)) {
|
||||
__set_bit(ENTRY_TXD_BURST, &txdesc->flags);
|
||||
__set_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if more frames (!= fragments) are pending
|
||||
*/
|
||||
if (tx_info->flags & IEEE80211_TX_CTL_MORE_FRAMES)
|
||||
__set_bit(ENTRY_TXD_BURST, &txdesc->flags);
|
||||
|
||||
/*
|
||||
* Beacons and probe responses require the tsf timestamp
|
||||
* to be inserted into the frame, except for a frame that has been injected
|
||||
|
@@ -213,9 +213,16 @@ struct rxdone_entry_desc {
|
||||
/**
|
||||
* enum txdone_entry_desc_flags: Flags for &struct txdone_entry_desc
|
||||
*
|
||||
* Every txdone report has to contain the basic result of the
|
||||
* transmission, either &TXDONE_UNKNOWN, &TXDONE_SUCCESS or
|
||||
* &TXDONE_FAILURE. The flag &TXDONE_FALLBACK can be used in
|
||||
* conjunction with all of these flags but should only be set
|
||||
* if retires > 0. The flag &TXDONE_EXCESSIVE_RETRY can only be used
|
||||
* in conjunction with &TXDONE_FAILURE.
|
||||
*
|
||||
* @TXDONE_UNKNOWN: Hardware could not determine success of transmission.
|
||||
* @TXDONE_SUCCESS: Frame was successfully send
|
||||
* @TXDONE_FALLBACK: Frame was successfully send using a fallback rate.
|
||||
* @TXDONE_FALLBACK: Hardware used fallback rates for retries
|
||||
* @TXDONE_FAILURE: Frame was not successfully send
|
||||
* @TXDONE_EXCESSIVE_RETRY: In addition to &TXDONE_FAILURE, the
|
||||
* frame transmission failed due to excessive retries.
|
||||
|
@@ -931,6 +931,9 @@ static void rt61pci_config_retry_limit(struct rt2x00_dev *rt2x00dev,
|
||||
u32 reg;
|
||||
|
||||
rt2x00pci_register_read(rt2x00dev, TXRX_CSR4, ®);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_OFDM_TX_RATE_DOWN, 1);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_OFDM_TX_RATE_STEP, 0);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_OFDM_TX_FALLBACK_CCK, 0);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_LONG_RETRY_LIMIT,
|
||||
libconf->conf->long_frame_max_tx_count);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_SHORT_RETRY_LIMIT,
|
||||
@@ -2049,29 +2052,24 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
struct txdone_entry_desc txdesc;
|
||||
u32 word;
|
||||
u32 reg;
|
||||
u32 old_reg;
|
||||
int type;
|
||||
int index;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* During each loop we will compare the freshly read
|
||||
* STA_CSR4 register value with the value read from
|
||||
* the previous loop. If the 2 values are equal then
|
||||
* we should stop processing because the chance is
|
||||
* quite big that the device has been unplugged and
|
||||
* we risk going into an endless loop.
|
||||
* TX_STA_FIFO is a stack of X entries, hence read TX_STA_FIFO
|
||||
* at most X times and also stop processing once the TX_STA_FIFO_VALID
|
||||
* flag is not set anymore.
|
||||
*
|
||||
* The legacy drivers use X=TX_RING_SIZE but state in a comment
|
||||
* that the TX_STA_FIFO stack has a size of 16. We stick to our
|
||||
* tx ring size for now.
|
||||
*/
|
||||
old_reg = 0;
|
||||
|
||||
while (1) {
|
||||
for (i = 0; i < TX_ENTRIES; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, STA_CSR4, ®);
|
||||
if (!rt2x00_get_field32(reg, STA_CSR4_VALID))
|
||||
break;
|
||||
|
||||
if (old_reg == reg)
|
||||
break;
|
||||
old_reg = reg;
|
||||
|
||||
/*
|
||||
* Skip this entry when it contains an invalid
|
||||
* queue identication number.
|
||||
@@ -2130,6 +2128,13 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
|
||||
}
|
||||
txdesc.retry = rt2x00_get_field32(reg, STA_CSR4_RETRY_COUNT);
|
||||
|
||||
/*
|
||||
* the frame was retried at least once
|
||||
* -> hw used fallback rates
|
||||
*/
|
||||
if (txdesc.retry)
|
||||
__set_bit(TXDONE_FALLBACK, &txdesc.flags);
|
||||
|
||||
rt2x00pci_txdone(entry, &txdesc);
|
||||
}
|
||||
}
|
||||
@@ -2586,6 +2591,18 @@ static int rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_eeprom_addr(rt2x00dev,
|
||||
EEPROM_MAC_ADDR_0));
|
||||
|
||||
/*
|
||||
* As rt61 has a global fallback table we cannot specify
|
||||
* more then one tx rate per frame but since the hw will
|
||||
* try several rates (based on the fallback table) we should
|
||||
* still initialize max_rates to the maximum number of rates
|
||||
* we are going to try. Otherwise mac80211 will truncate our
|
||||
* reported tx rates and the rc algortihm will end up with
|
||||
* incorrect data.
|
||||
*/
|
||||
rt2x00dev->hw->max_rates = 7;
|
||||
rt2x00dev->hw->max_rate_tries = 1;
|
||||
|
||||
/*
|
||||
* Initialize hw_mode information.
|
||||
*/
|
||||
|
@@ -816,6 +816,9 @@ static void rt73usb_config_retry_limit(struct rt2x00_dev *rt2x00dev,
|
||||
u32 reg;
|
||||
|
||||
rt2x00usb_register_read(rt2x00dev, TXRX_CSR4, ®);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_OFDM_TX_RATE_DOWN, 1);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_OFDM_TX_RATE_STEP, 0);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_OFDM_TX_FALLBACK_CCK, 0);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_LONG_RETRY_LIMIT,
|
||||
libconf->conf->long_frame_max_tx_count);
|
||||
rt2x00_set_field32(®, TXRX_CSR4_SHORT_RETRY_LIMIT,
|
||||
|
Ссылка в новой задаче
Block a user