Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless

John W. Linville says:

====================
This is a batch of fixes intended for the 3.6 stream.

Arend van Spriel sends a simple thinko fix to correct a constant,
preventing the setting of an invalid power level.

Colin Ian King gives us a simple allocation failure check to avoid a
NULL pointer dereference.

Felix Fietkau sends another ath9k tx power patch, this time disabling a
feature that has been reported to cause rx problems.

Hante Meuleman provides a pair of endian fixes for brcmfmac.

Larry Finger offers an rtlwifi fix that avoids a system lockup related
to loading the wrong firmware for RTL8188CE devices.

These have been in linux-next for a few days and I think they should be
included in the final 3.6 kernel if possible.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2012-09-17 01:28:58 -04:00
commit a1f6d8f771
12 changed files with 46 additions and 24 deletions

View File

@ -2982,6 +2982,10 @@ static u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah,
case EEP_RX_MASK: case EEP_RX_MASK:
return pBase->txrxMask & 0xf; return pBase->txrxMask & 0xf;
case EEP_PAPRD: case EEP_PAPRD:
if (AR_SREV_9462(ah))
return false;
if (!ah->config.enable_paprd);
return false;
return !!(pBase->featureEnable & BIT(5)); return !!(pBase->featureEnable & BIT(5));
case EEP_CHAIN_MASK_REDUCE: case EEP_CHAIN_MASK_REDUCE:
return (pBase->miscConfiguration >> 0x3) & 0x1; return (pBase->miscConfiguration >> 0x3) & 0x1;

View File

@ -1577,6 +1577,8 @@ int ath9k_init_debug(struct ath_hw *ah)
sc->debug.debugfs_phy, sc, &fops_tx_chainmask); sc->debug.debugfs_phy, sc, &fops_tx_chainmask);
debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR, debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR,
sc->debug.debugfs_phy, sc, &fops_disable_ani); sc->debug.debugfs_phy, sc, &fops_disable_ani);
debugfs_create_bool("paprd", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
&sc->sc_ah->config.enable_paprd);
debugfs_create_file("regidx", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, debugfs_create_file("regidx", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
sc, &fops_regidx); sc, &fops_regidx);
debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,

View File

@ -2497,10 +2497,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
pCap->rx_status_len = sizeof(struct ar9003_rxs); pCap->rx_status_len = sizeof(struct ar9003_rxs);
pCap->tx_desc_len = sizeof(struct ar9003_txc); pCap->tx_desc_len = sizeof(struct ar9003_txc);
pCap->txs_len = sizeof(struct ar9003_txs); pCap->txs_len = sizeof(struct ar9003_txs);
if (!ah->config.paprd_disable &&
ah->eep_ops->get_eeprom(ah, EEP_PAPRD) &&
!AR_SREV_9462(ah))
pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;
} else { } else {
pCap->tx_desc_len = sizeof(struct ath_desc); pCap->tx_desc_len = sizeof(struct ath_desc);
if (AR_SREV_9280_20(ah)) if (AR_SREV_9280_20(ah))

View File

@ -236,7 +236,6 @@ enum ath9k_hw_caps {
ATH9K_HW_CAP_LDPC = BIT(6), ATH9K_HW_CAP_LDPC = BIT(6),
ATH9K_HW_CAP_FASTCLOCK = BIT(7), ATH9K_HW_CAP_FASTCLOCK = BIT(7),
ATH9K_HW_CAP_SGI_20 = BIT(8), ATH9K_HW_CAP_SGI_20 = BIT(8),
ATH9K_HW_CAP_PAPRD = BIT(9),
ATH9K_HW_CAP_ANT_DIV_COMB = BIT(10), ATH9K_HW_CAP_ANT_DIV_COMB = BIT(10),
ATH9K_HW_CAP_2GHZ = BIT(11), ATH9K_HW_CAP_2GHZ = BIT(11),
ATH9K_HW_CAP_5GHZ = BIT(12), ATH9K_HW_CAP_5GHZ = BIT(12),
@ -287,12 +286,12 @@ struct ath9k_ops_config {
u8 pcie_clock_req; u8 pcie_clock_req;
u32 pcie_waen; u32 pcie_waen;
u8 analog_shiftreg; u8 analog_shiftreg;
u8 paprd_disable;
u32 ofdm_trig_low; u32 ofdm_trig_low;
u32 ofdm_trig_high; u32 ofdm_trig_high;
u32 cck_trig_high; u32 cck_trig_high;
u32 cck_trig_low; u32 cck_trig_low;
u32 enable_ani; u32 enable_ani;
u32 enable_paprd;
int serialize_regmode; int serialize_regmode;
bool rx_intr_mitigation; bool rx_intr_mitigation;
bool tx_intr_mitigation; bool tx_intr_mitigation;

View File

@ -423,7 +423,7 @@ set_timer:
cal_interval = min(cal_interval, (u32)short_cal_interval); cal_interval = min(cal_interval, (u32)short_cal_interval);
mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval)); mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval));
if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) { if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD) && ah->caldata) {
if (!ah->caldata->paprd_done) if (!ah->caldata->paprd_done)
ieee80211_queue_work(sc->hw, &sc->paprd_work); ieee80211_queue_work(sc->hw, &sc->paprd_work);
else if (!ah->paprd_table_write_done) else if (!ah->paprd_table_write_done)

View File

@ -638,6 +638,8 @@ static int brcmf_sdio_pd_probe(struct platform_device *pdev)
oobirq_entry = kzalloc(sizeof(struct brcmf_sdio_oobirq), oobirq_entry = kzalloc(sizeof(struct brcmf_sdio_oobirq),
GFP_KERNEL); GFP_KERNEL);
if (!oobirq_entry)
return -ENOMEM;
oobirq_entry->irq = res->start; oobirq_entry->irq = res->start;
oobirq_entry->flags = res->flags & IRQF_TRIGGER_MASK; oobirq_entry->flags = res->flags & IRQF_TRIGGER_MASK;
list_add_tail(&oobirq_entry->list, &oobirq_lh); list_add_tail(&oobirq_entry->list, &oobirq_lh);

View File

@ -764,8 +764,11 @@ static void brcmf_c_arp_offload_set(struct brcmf_pub *drvr, int arp_mode)
{ {
char iovbuf[32]; char iovbuf[32];
int retcode; int retcode;
__le32 arp_mode_le;
brcmf_c_mkiovar("arp_ol", (char *)&arp_mode, 4, iovbuf, sizeof(iovbuf)); arp_mode_le = cpu_to_le32(arp_mode);
brcmf_c_mkiovar("arp_ol", (char *)&arp_mode_le, 4, iovbuf,
sizeof(iovbuf));
retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR,
iovbuf, sizeof(iovbuf)); iovbuf, sizeof(iovbuf));
retcode = retcode >= 0 ? 0 : retcode; retcode = retcode >= 0 ? 0 : retcode;
@ -781,8 +784,11 @@ static void brcmf_c_arp_offload_enable(struct brcmf_pub *drvr, int arp_enable)
{ {
char iovbuf[32]; char iovbuf[32];
int retcode; int retcode;
__le32 arp_enable_le;
brcmf_c_mkiovar("arpoe", (char *)&arp_enable, 4, arp_enable_le = cpu_to_le32(arp_enable);
brcmf_c_mkiovar("arpoe", (char *)&arp_enable_le, 4,
iovbuf, sizeof(iovbuf)); iovbuf, sizeof(iovbuf));
retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR,
iovbuf, sizeof(iovbuf)); iovbuf, sizeof(iovbuf));
@ -800,10 +806,10 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
char iovbuf[BRCMF_EVENTING_MASK_LEN + 12]; /* Room for char iovbuf[BRCMF_EVENTING_MASK_LEN + 12]; /* Room for
"event_msgs" + '\0' + bitvec */ "event_msgs" + '\0' + bitvec */
char buf[128], *ptr; char buf[128], *ptr;
u32 roaming = 1; __le32 roaming_le = cpu_to_le32(1);
uint bcn_timeout = 3; __le32 bcn_timeout_le = cpu_to_le32(3);
int scan_assoc_time = 40; __le32 scan_assoc_time_le = cpu_to_le32(40);
int scan_unassoc_time = 40; __le32 scan_unassoc_time_le = cpu_to_le32(40);
int i; int i;
struct brcmf_bus_dcmd *cmdlst; struct brcmf_bus_dcmd *cmdlst;
struct list_head *cur, *q; struct list_head *cur, *q;
@ -829,14 +835,14 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
/* Setup timeout if Beacons are lost and roam is off to report /* Setup timeout if Beacons are lost and roam is off to report
link down */ link down */
brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout, 4, iovbuf, brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout_le, 4, iovbuf,
sizeof(iovbuf)); sizeof(iovbuf));
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf, brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf,
sizeof(iovbuf)); sizeof(iovbuf));
/* Enable/Disable build-in roaming to allowed ext supplicant to take /* Enable/Disable build-in roaming to allowed ext supplicant to take
of romaing */ of romaing */
brcmf_c_mkiovar("roam_off", (char *)&roaming, 4, brcmf_c_mkiovar("roam_off", (char *)&roaming_le, 4,
iovbuf, sizeof(iovbuf)); iovbuf, sizeof(iovbuf));
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf, brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf,
sizeof(iovbuf)); sizeof(iovbuf));
@ -848,9 +854,9 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
sizeof(iovbuf)); sizeof(iovbuf));
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_CHANNEL_TIME, brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_CHANNEL_TIME,
(char *)&scan_assoc_time, sizeof(scan_assoc_time)); (char *)&scan_assoc_time_le, sizeof(scan_assoc_time_le));
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_UNASSOC_TIME, brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_UNASSOC_TIME,
(char *)&scan_unassoc_time, sizeof(scan_unassoc_time)); (char *)&scan_unassoc_time_le, sizeof(scan_unassoc_time_le));
/* Set and enable ARP offload feature */ /* Set and enable ARP offload feature */
brcmf_c_arp_offload_set(drvr, BRCMF_ARPOL_MODE); brcmf_c_arp_offload_set(drvr, BRCMF_ARPOL_MODE);

View File

@ -500,8 +500,10 @@ static void wl_iscan_prep(struct brcmf_scan_params_le *params_le,
params_le->active_time = cpu_to_le32(-1); params_le->active_time = cpu_to_le32(-1);
params_le->passive_time = cpu_to_le32(-1); params_le->passive_time = cpu_to_le32(-1);
params_le->home_time = cpu_to_le32(-1); params_le->home_time = cpu_to_le32(-1);
if (ssid && ssid->SSID_len) if (ssid && ssid->SSID_len) {
memcpy(&params_le->ssid_le, ssid, sizeof(struct brcmf_ssid)); params_le->ssid_le.SSID_len = cpu_to_le32(ssid->SSID_len);
memcpy(&params_le->ssid_le.SSID, ssid->SSID, ssid->SSID_len);
}
} }
static s32 static s32

View File

@ -77,7 +77,7 @@
NL80211_RRF_NO_IBSS) NL80211_RRF_NO_IBSS)
static const struct ieee80211_regdomain brcms_regdom_x2 = { static const struct ieee80211_regdomain brcms_regdom_x2 = {
.n_reg_rules = 7, .n_reg_rules = 6,
.alpha2 = "X2", .alpha2 = "X2",
.reg_rules = { .reg_rules = {
BRCM_2GHZ_2412_2462, BRCM_2GHZ_2412_2462,

View File

@ -117,6 +117,7 @@
#define CHIP_VER_B BIT(4) #define CHIP_VER_B BIT(4)
#define CHIP_92C_BITMASK BIT(0) #define CHIP_92C_BITMASK BIT(0)
#define CHIP_UNKNOWN BIT(7)
#define CHIP_92C_1T2R 0x03 #define CHIP_92C_1T2R 0x03
#define CHIP_92C 0x01 #define CHIP_92C 0x01
#define CHIP_88C 0x00 #define CHIP_88C 0x00

View File

@ -994,8 +994,16 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw)
version = (value32 & TYPE_ID) ? VERSION_A_CHIP_92C : version = (value32 & TYPE_ID) ? VERSION_A_CHIP_92C :
VERSION_A_CHIP_88C; VERSION_A_CHIP_88C;
} else { } else {
version = (value32 & TYPE_ID) ? VERSION_B_CHIP_92C : version = (enum version_8192c) (CHIP_VER_B |
VERSION_B_CHIP_88C; ((value32 & TYPE_ID) ? CHIP_92C_BITMASK : 0) |
((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0));
if ((!IS_CHIP_VENDOR_UMC(version)) && (value32 &
CHIP_VER_RTL_MASK)) {
version = (enum version_8192c)(version |
((((value32 & CHIP_VER_RTL_MASK) == BIT(12))
? CHIP_VENDOR_UMC_B_CUT : CHIP_UNKNOWN) |
CHIP_VENDOR_UMC));
}
} }
switch (version) { switch (version) {

View File

@ -162,10 +162,12 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
/* request fw */ /* request fw */
if (IS_VENDOR_UMC_A_CUT(rtlhal->version) && if (IS_VENDOR_UMC_A_CUT(rtlhal->version) &&
!IS_92C_SERIAL(rtlhal->version)) !IS_92C_SERIAL(rtlhal->version)) {
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin"; rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin";
else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) {
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin"; rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin";
pr_info("****** This B_CUT device may not work with kernels 3.6 and earlier\n");
}
rtlpriv->max_fw_size = 0x4000; rtlpriv->max_fw_size = 0x4000;
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name); pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);