Merge tag 'wireless-drivers-next-for-davem-2016-11-25' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next
Kalle Valo says: ==================== wireless-drivers-next patches for 4.10 Major changes: iwlwifi * finalize and enable dynamic queue allocation * use dev_coredumpmsg() to prevent locking the driver * small fix to pass the AID to the FW * use FW PS decisions with multi-queue ath9k * add device tree bindings * switch to use mac80211 intermediate software queues to reduce latency and fix bufferbloat wl18xx * allow scanning in AP mode ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1459,10 +1459,7 @@ static int rt2400pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* Start validation of the data that has been read.
|
||||
*/
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
rt2x00lib_set_mac_address(rt2x00dev, mac);
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
if (word == 0xffff) {
|
||||
|
@@ -1585,10 +1585,7 @@ static int rt2500pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* Start validation of the data that has been read.
|
||||
*/
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
rt2x00lib_set_mac_address(rt2x00dev, mac);
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
if (word == 0xffff) {
|
||||
|
@@ -1349,10 +1349,7 @@ static int rt2500usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* Start validation of the data that has been read.
|
||||
*/
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
rt2x00lib_set_mac_address(rt2x00dev, mac);
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
if (word == 0xffff) {
|
||||
|
@@ -1621,7 +1621,7 @@ static void rt2800_config_ht_opmode(struct rt2x00_dev *rt2x00dev,
|
||||
* => Protect all HT40 transmissions.
|
||||
*/
|
||||
mm20_mode = gf20_mode = 0;
|
||||
mm40_mode = gf40_mode = 2;
|
||||
mm40_mode = gf40_mode = 1;
|
||||
|
||||
break;
|
||||
case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
|
||||
@@ -1644,7 +1644,7 @@ static void rt2800_config_ht_opmode(struct rt2x00_dev *rt2x00dev,
|
||||
* Legacy STAs are present
|
||||
* => Protect all HT transmissions.
|
||||
*/
|
||||
mm20_mode = mm40_mode = gf20_mode = gf40_mode = 2;
|
||||
mm20_mode = mm40_mode = gf20_mode = gf40_mode = 1;
|
||||
|
||||
/*
|
||||
* If erp protection is needed we have to protect HT
|
||||
@@ -1660,7 +1660,7 @@ static void rt2800_config_ht_opmode(struct rt2x00_dev *rt2x00dev,
|
||||
|
||||
/* check for STAs not supporting greenfield mode */
|
||||
if (any_sta_nongf)
|
||||
gf20_mode = gf40_mode = 2;
|
||||
gf20_mode = gf40_mode = 1;
|
||||
|
||||
/* Update HT protection config */
|
||||
rt2800_register_read(rt2x00dev, MM20_PROT_CFG, ®);
|
||||
@@ -1691,8 +1691,6 @@ void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp,
|
||||
|
||||
if (changed & BSS_CHANGED_ERP_PREAMBLE) {
|
||||
rt2800_register_read(rt2x00dev, AUTO_RSP_CFG, ®);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_BAC_ACK_POLICY,
|
||||
!!erp->short_preamble);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_AR_PREAMBLE,
|
||||
!!erp->short_preamble);
|
||||
rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
|
||||
@@ -1707,7 +1705,7 @@ void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp,
|
||||
|
||||
if (changed & BSS_CHANGED_BASIC_RATES) {
|
||||
rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE,
|
||||
erp->basic_rates);
|
||||
0xff0 | erp->basic_rates);
|
||||
rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
|
||||
}
|
||||
|
||||
@@ -4672,11 +4670,14 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
0x00000000);
|
||||
}
|
||||
} else if (rt2x00_rt(rt2x00dev, RT5390) ||
|
||||
rt2x00_rt(rt2x00dev, RT5392) ||
|
||||
rt2x00_rt(rt2x00dev, RT5592)) {
|
||||
rt2x00_rt(rt2x00dev, RT5392)) {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
|
||||
} else if (rt2x00_rt(rt2x00dev, RT5592)) {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
|
||||
} else {
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
|
||||
rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
|
||||
@@ -4735,9 +4736,9 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
rt2800_register_read(rt2x00dev, AUTO_RSP_CFG, ®);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_AUTORESPONDER, 1);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_BAC_ACK_POLICY, 1);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_CTS_40_MMODE, 0);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_CTS_40_MMODE, 1);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_CTS_40_MREF, 0);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_AR_PREAMBLE, 1);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_AR_PREAMBLE, 0);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_DUAL_CTS_EN, 0);
|
||||
rt2x00_set_field32(®, AUTO_RSP_CFG_ACK_CTS_PSM_BIT, 0);
|
||||
rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
|
||||
@@ -4770,9 +4771,9 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
rt2800_register_read(rt2x00dev, MM20_PROT_CFG, ®);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_RATE, 0x4004);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_CTRL, 0);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_CTRL, 1);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_PROTECT_NAV_SHORT, 1);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_CCK, 1);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_CCK, 0);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_MM20, 1);
|
||||
rt2x00_set_field32(®, MM20_PROT_CFG_TX_OP_ALLOW_MM40, 0);
|
||||
@@ -4783,9 +4784,9 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
rt2800_register_read(rt2x00dev, MM40_PROT_CFG, ®);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_RATE, 0x4084);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_CTRL, 0);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_CTRL, 1);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_PROTECT_NAV_SHORT, 1);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_CCK, 1);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_CCK, 0);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_MM20, 1);
|
||||
rt2x00_set_field32(®, MM40_PROT_CFG_TX_OP_ALLOW_MM40, 1);
|
||||
@@ -4796,9 +4797,9 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
rt2800_register_read(rt2x00dev, GF20_PROT_CFG, ®);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_RATE, 0x4004);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_CTRL, 0);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_CTRL, 1);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_PROTECT_NAV_SHORT, 1);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_CCK, 1);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_CCK, 0);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_MM20, 1);
|
||||
rt2x00_set_field32(®, GF20_PROT_CFG_TX_OP_ALLOW_MM40, 0);
|
||||
@@ -4809,9 +4810,9 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
rt2800_register_read(rt2x00dev, GF40_PROT_CFG, ®);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_RATE, 0x4084);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_CTRL, 0);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_CTRL, 1);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_PROTECT_NAV_SHORT, 1);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_CCK, 1);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_CCK, 0);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_MM20, 1);
|
||||
rt2x00_set_field32(®, GF40_PROT_CFG_TX_OP_ALLOW_MM40, 1);
|
||||
@@ -6756,7 +6757,6 @@ int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev)
|
||||
rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®);
|
||||
rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_TX_DMA, 1);
|
||||
rt2x00_set_field32(®, WPDMA_GLO_CFG_ENABLE_RX_DMA, 1);
|
||||
rt2x00_set_field32(®, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 2);
|
||||
rt2x00_set_field32(®, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
|
||||
rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
|
||||
|
||||
@@ -6919,10 +6919,7 @@ static int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* Start validation of the data that has been read.
|
||||
*/
|
||||
mac = rt2800_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
rt2x00lib_set_mac_address(rt2x00dev, mac);
|
||||
|
||||
rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0, &word);
|
||||
if (word == 0xffff) {
|
||||
@@ -7464,7 +7461,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
char *default_power1;
|
||||
char *default_power2;
|
||||
char *default_power3;
|
||||
unsigned int i;
|
||||
unsigned int i, tx_chains, rx_chains;
|
||||
u32 reg;
|
||||
|
||||
/*
|
||||
@@ -7475,7 +7472,6 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
/*
|
||||
* Initialize all hw fields.
|
||||
*/
|
||||
ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_HT_CCK_RATES);
|
||||
ieee80211_hw_set(rt2x00dev->hw, REPORTS_TX_ACK_STATUS);
|
||||
ieee80211_hw_set(rt2x00dev->hw, AMPDU_AGGREGATION);
|
||||
ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK);
|
||||
@@ -7589,21 +7585,24 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||
IEEE80211_HT_CAP_SGI_20 |
|
||||
IEEE80211_HT_CAP_SGI_40;
|
||||
|
||||
if (rt2x00dev->default_ant.tx_chain_num >= 2)
|
||||
tx_chains = rt2x00dev->default_ant.tx_chain_num;
|
||||
rx_chains = rt2x00dev->default_ant.rx_chain_num;
|
||||
|
||||
if (tx_chains >= 2)
|
||||
spec->ht.cap |= IEEE80211_HT_CAP_TX_STBC;
|
||||
|
||||
spec->ht.cap |= rt2x00dev->default_ant.rx_chain_num <<
|
||||
IEEE80211_HT_CAP_RX_STBC_SHIFT;
|
||||
spec->ht.cap |= rx_chains << IEEE80211_HT_CAP_RX_STBC_SHIFT;
|
||||
|
||||
spec->ht.ampdu_factor = 3;
|
||||
spec->ht.ampdu_density = 4;
|
||||
spec->ht.mcs.tx_params =
|
||||
IEEE80211_HT_MCS_TX_DEFINED |
|
||||
IEEE80211_HT_MCS_TX_RX_DIFF |
|
||||
((rt2x00dev->default_ant.tx_chain_num - 1) <<
|
||||
IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
|
||||
spec->ht.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||
if (tx_chains != rx_chains) {
|
||||
spec->ht.mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
|
||||
spec->ht.mcs.tx_params |=
|
||||
(tx_chains - 1) << IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT;
|
||||
}
|
||||
|
||||
switch (rt2x00dev->default_ant.rx_chain_num) {
|
||||
switch (rx_chains) {
|
||||
case 3:
|
||||
spec->ht.mcs.rx_mask[2] = 0xff;
|
||||
case 2:
|
||||
|
@@ -341,8 +341,6 @@ static int rt2800usb_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
rt2x00_set_field32(®, MAC_SYS_CTRL_RESET_BBP, 1);
|
||||
rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
|
||||
|
||||
rt2x00usb_register_write(rt2x00dev, USB_DMA_CFG, 0x00000000);
|
||||
|
||||
rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
|
||||
USB_MODE_RESET, REGISTER_TIMEOUT);
|
||||
|
||||
@@ -353,12 +351,11 @@ static int rt2800usb_init_registers(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev)
|
||||
{
|
||||
u32 reg;
|
||||
u32 reg = 0;
|
||||
|
||||
if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev)))
|
||||
return -EIO;
|
||||
|
||||
rt2x00usb_register_read(rt2x00dev, USB_DMA_CFG, ®);
|
||||
rt2x00_set_field32(®, USB_DMA_CFG_PHY_CLEAR, 0);
|
||||
rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_AGG_EN, 0);
|
||||
rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_AGG_TIMEOUT, 128);
|
||||
|
@@ -1403,6 +1403,7 @@ static inline void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
|
||||
*/
|
||||
u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
|
||||
struct ieee80211_vif *vif);
|
||||
void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr);
|
||||
|
||||
/*
|
||||
* Interrupt context handlers.
|
||||
|
@@ -26,6 +26,8 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_net.h>
|
||||
|
||||
#include "rt2x00.h"
|
||||
#include "rt2x00lib.h"
|
||||
@@ -931,6 +933,21 @@ static void rt2x00lib_rate(struct ieee80211_rate *entry,
|
||||
entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE;
|
||||
}
|
||||
|
||||
void rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr)
|
||||
{
|
||||
const char *mac_addr;
|
||||
|
||||
mac_addr = of_get_mac_address(rt2x00dev->dev->of_node);
|
||||
if (mac_addr)
|
||||
ether_addr_copy(eeprom_mac_addr, mac_addr);
|
||||
|
||||
if (!is_valid_ether_addr(eeprom_mac_addr)) {
|
||||
eth_random_addr(eeprom_mac_addr);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", eeprom_mac_addr);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00lib_set_mac_address);
|
||||
|
||||
static int rt2x00lib_probe_hw_modes(struct rt2x00_dev *rt2x00dev,
|
||||
struct hw_mode_spec *spec)
|
||||
{
|
||||
@@ -1424,7 +1441,7 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
|
||||
cancel_work_sync(&rt2x00dev->intf_work);
|
||||
cancel_delayed_work_sync(&rt2x00dev->autowakeup_work);
|
||||
cancel_work_sync(&rt2x00dev->sleep_work);
|
||||
#ifdef CONFIG_RT2X00_LIB_USB
|
||||
#if IS_ENABLED(CONFIG_RT2X00_LIB_USB)
|
||||
if (rt2x00_is_usb(rt2x00dev)) {
|
||||
usb_kill_anchored_urbs(rt2x00dev->anchor);
|
||||
hrtimer_cancel(&rt2x00dev->txstatus_timer);
|
||||
|
@@ -2413,10 +2413,7 @@ static int rt61pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* Start validation of the data that has been read.
|
||||
*/
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
rt2x00lib_set_mac_address(rt2x00dev, mac);
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
if (word == 0xffff) {
|
||||
|
@@ -1766,10 +1766,7 @@ static int rt73usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
|
||||
* Start validation of the data that has been read.
|
||||
*/
|
||||
mac = rt2x00_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
|
||||
if (!is_valid_ether_addr(mac)) {
|
||||
eth_random_addr(mac);
|
||||
rt2x00_eeprom_dbg(rt2x00dev, "MAC: %pM\n", mac);
|
||||
}
|
||||
rt2x00lib_set_mac_address(rt2x00dev, mac);
|
||||
|
||||
rt2x00_eeprom_read(rt2x00dev, EEPROM_ANTENNA, &word);
|
||||
if (word == 0xffff) {
|
||||
|
Reference in New Issue
Block a user