forked from Minki/linux
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:
commit
a1f6d8f771
@ -2982,6 +2982,10 @@ static u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah,
|
||||
case EEP_RX_MASK:
|
||||
return pBase->txrxMask & 0xf;
|
||||
case EEP_PAPRD:
|
||||
if (AR_SREV_9462(ah))
|
||||
return false;
|
||||
if (!ah->config.enable_paprd);
|
||||
return false;
|
||||
return !!(pBase->featureEnable & BIT(5));
|
||||
case EEP_CHAIN_MASK_REDUCE:
|
||||
return (pBase->miscConfiguration >> 0x3) & 0x1;
|
||||
|
@ -1577,6 +1577,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
sc->debug.debugfs_phy, sc, &fops_tx_chainmask);
|
||||
debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR,
|
||||
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,
|
||||
sc, &fops_regidx);
|
||||
debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
|
@ -2497,10 +2497,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
|
||||
pCap->rx_status_len = sizeof(struct ar9003_rxs);
|
||||
pCap->tx_desc_len = sizeof(struct ar9003_txc);
|
||||
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 {
|
||||
pCap->tx_desc_len = sizeof(struct ath_desc);
|
||||
if (AR_SREV_9280_20(ah))
|
||||
|
@ -236,7 +236,6 @@ enum ath9k_hw_caps {
|
||||
ATH9K_HW_CAP_LDPC = BIT(6),
|
||||
ATH9K_HW_CAP_FASTCLOCK = BIT(7),
|
||||
ATH9K_HW_CAP_SGI_20 = BIT(8),
|
||||
ATH9K_HW_CAP_PAPRD = BIT(9),
|
||||
ATH9K_HW_CAP_ANT_DIV_COMB = BIT(10),
|
||||
ATH9K_HW_CAP_2GHZ = BIT(11),
|
||||
ATH9K_HW_CAP_5GHZ = BIT(12),
|
||||
@ -287,12 +286,12 @@ struct ath9k_ops_config {
|
||||
u8 pcie_clock_req;
|
||||
u32 pcie_waen;
|
||||
u8 analog_shiftreg;
|
||||
u8 paprd_disable;
|
||||
u32 ofdm_trig_low;
|
||||
u32 ofdm_trig_high;
|
||||
u32 cck_trig_high;
|
||||
u32 cck_trig_low;
|
||||
u32 enable_ani;
|
||||
u32 enable_paprd;
|
||||
int serialize_regmode;
|
||||
bool rx_intr_mitigation;
|
||||
bool tx_intr_mitigation;
|
||||
|
@ -423,7 +423,7 @@ set_timer:
|
||||
cal_interval = min(cal_interval, (u32)short_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)
|
||||
ieee80211_queue_work(sc->hw, &sc->paprd_work);
|
||||
else if (!ah->paprd_table_write_done)
|
||||
|
@ -638,6 +638,8 @@ static int brcmf_sdio_pd_probe(struct platform_device *pdev)
|
||||
|
||||
oobirq_entry = kzalloc(sizeof(struct brcmf_sdio_oobirq),
|
||||
GFP_KERNEL);
|
||||
if (!oobirq_entry)
|
||||
return -ENOMEM;
|
||||
oobirq_entry->irq = res->start;
|
||||
oobirq_entry->flags = res->flags & IRQF_TRIGGER_MASK;
|
||||
list_add_tail(&oobirq_entry->list, &oobirq_lh);
|
||||
|
@ -764,8 +764,11 @@ static void brcmf_c_arp_offload_set(struct brcmf_pub *drvr, int arp_mode)
|
||||
{
|
||||
char iovbuf[32];
|
||||
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,
|
||||
iovbuf, sizeof(iovbuf));
|
||||
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];
|
||||
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));
|
||||
retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR,
|
||||
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
|
||||
"event_msgs" + '\0' + bitvec */
|
||||
char buf[128], *ptr;
|
||||
u32 roaming = 1;
|
||||
uint bcn_timeout = 3;
|
||||
int scan_assoc_time = 40;
|
||||
int scan_unassoc_time = 40;
|
||||
__le32 roaming_le = cpu_to_le32(1);
|
||||
__le32 bcn_timeout_le = cpu_to_le32(3);
|
||||
__le32 scan_assoc_time_le = cpu_to_le32(40);
|
||||
__le32 scan_unassoc_time_le = cpu_to_le32(40);
|
||||
int i;
|
||||
struct brcmf_bus_dcmd *cmdlst;
|
||||
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
|
||||
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));
|
||||
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf,
|
||||
sizeof(iovbuf));
|
||||
|
||||
/* Enable/Disable build-in roaming to allowed ext supplicant to take
|
||||
of romaing */
|
||||
brcmf_c_mkiovar("roam_off", (char *)&roaming, 4,
|
||||
brcmf_c_mkiovar("roam_off", (char *)&roaming_le, 4,
|
||||
iovbuf, sizeof(iovbuf));
|
||||
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf,
|
||||
sizeof(iovbuf));
|
||||
@ -848,9 +854,9 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
|
||||
sizeof(iovbuf));
|
||||
|
||||
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,
|
||||
(char *)&scan_unassoc_time, sizeof(scan_unassoc_time));
|
||||
(char *)&scan_unassoc_time_le, sizeof(scan_unassoc_time_le));
|
||||
|
||||
/* Set and enable ARP offload feature */
|
||||
brcmf_c_arp_offload_set(drvr, BRCMF_ARPOL_MODE);
|
||||
|
@ -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->passive_time = cpu_to_le32(-1);
|
||||
params_le->home_time = cpu_to_le32(-1);
|
||||
if (ssid && ssid->SSID_len)
|
||||
memcpy(¶ms_le->ssid_le, ssid, sizeof(struct brcmf_ssid));
|
||||
if (ssid && ssid->SSID_len) {
|
||||
params_le->ssid_le.SSID_len = cpu_to_le32(ssid->SSID_len);
|
||||
memcpy(¶ms_le->ssid_le.SSID, ssid->SSID, ssid->SSID_len);
|
||||
}
|
||||
}
|
||||
|
||||
static s32
|
||||
|
@ -77,7 +77,7 @@
|
||||
NL80211_RRF_NO_IBSS)
|
||||
|
||||
static const struct ieee80211_regdomain brcms_regdom_x2 = {
|
||||
.n_reg_rules = 7,
|
||||
.n_reg_rules = 6,
|
||||
.alpha2 = "X2",
|
||||
.reg_rules = {
|
||||
BRCM_2GHZ_2412_2462,
|
||||
|
@ -117,6 +117,7 @@
|
||||
|
||||
#define CHIP_VER_B BIT(4)
|
||||
#define CHIP_92C_BITMASK BIT(0)
|
||||
#define CHIP_UNKNOWN BIT(7)
|
||||
#define CHIP_92C_1T2R 0x03
|
||||
#define CHIP_92C 0x01
|
||||
#define CHIP_88C 0x00
|
||||
|
@ -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_A_CHIP_88C;
|
||||
} else {
|
||||
version = (value32 & TYPE_ID) ? VERSION_B_CHIP_92C :
|
||||
VERSION_B_CHIP_88C;
|
||||
version = (enum version_8192c) (CHIP_VER_B |
|
||||
((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) {
|
||||
|
@ -162,10 +162,12 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
|
||||
|
||||
/* request fw */
|
||||
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";
|
||||
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";
|
||||
pr_info("****** This B_CUT device may not work with kernels 3.6 and earlier\n");
|
||||
}
|
||||
|
||||
rtlpriv->max_fw_size = 0x4000;
|
||||
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
|
||||
|
Loading…
Reference in New Issue
Block a user