mirror of
https://github.com/torvalds/linux.git
synced 2024-11-14 16:12:02 +00:00
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:
|
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;
|
||||||
|
@ -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,
|
||||||
|
@ -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))
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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(¶ms_le->ssid_le, ssid, sizeof(struct brcmf_ssid));
|
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
|
static s32
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user