* mvm: flush fw_dump_wk when mvm fails to start
 * mvm: init card correctly on ctkill exit check
 * pci: add a few more PCI subvendor IDs for the 7265 series
 * fix firmware filename for 3160
 * mvm: clear csa countdown when AP is stopped
 * mvm: fix D3 firmware PN programming
 * dvm: fix D3 firmware PN programming
 * mvm: fix D3 CCMP TX PN assignment
 
 rtlwifi:
 
 * rtl8821ae: Fix system lockups on boot
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.11 (GNU/Linux)
 
 iQEcBAABAgAGBQJWIdlLAAoJEG4XJFUm622bCrEH/jgABInQDEHR2NBfj1n3dYzG
 W0jB3nxBR4EgRc7W73Fca8MWduhWxOJGJ8+awlvrsv2bLaLT4W228jB2BoYYzhxK
 rMWziGURcAN2x9BcWN30fIl7pLs23rQorSZZFhInJ1yuVqTViI2z872wix9qbQVj
 7BdgorH5EEHqBQMIn14nWUMNXl/m63SMQZf+aR+NSRs8KF6hgG4CEUDIFRU+IRHO
 +bH/z7xdzNK+QziOIeNBZQ0xBUXD7C32c7wIVuqf5Tx5Eku3rOVb+OSWpX/y0FRy
 CqTIaZuO4fEgyPQH8PAEmngAuM+7wGVdgRZEXxvYM/I2kpGFFnQraKg1Dmv93xI=
 =Dz9Y
 -----END PGP SIGNATURE-----

Merge tag 'wireless-drivers-for-davem-2015-10-17' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers

Kalle Valo says:

====================
iwlwifi:

* mvm: flush fw_dump_wk when mvm fails to start
* mvm: init card correctly on ctkill exit check
* pci: add a few more PCI subvendor IDs for the 7265 series
* fix firmware filename for 3160
* mvm: clear csa countdown when AP is stopped
* mvm: fix D3 firmware PN programming
* dvm: fix D3 firmware PN programming
* mvm: fix D3 CCMP TX PN assignment

rtlwifi:

* rtl8821ae: Fix system lockups on boot
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2015-10-18 23:05:56 -07:00
commit afc050dd8e
12 changed files with 54 additions and 20 deletions

View File

@ -1020,7 +1020,7 @@ static void iwlagn_wowlan_program_keys(struct ieee80211_hw *hw,
u8 *pn = seq.ccmp.pn; u8 *pn = seq.ccmp.pn;
ieee80211_get_key_rx_seq(key, i, &seq); ieee80211_get_key_rx_seq(key, i, &seq);
aes_sc->pn = cpu_to_le64( aes_sc[i].pn = cpu_to_le64(
(u64)pn[5] | (u64)pn[5] |
((u64)pn[4] << 8) | ((u64)pn[4] << 8) |
((u64)pn[3] << 16) | ((u64)pn[3] << 16) |

View File

@ -348,6 +348,6 @@ const struct iwl_cfg iwl7265d_n_cfg = {
}; };
MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); MODULE_FIRMWARE(IWL7265D_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));

View File

@ -274,18 +274,13 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
break; break;
case WLAN_CIPHER_SUITE_CCMP: case WLAN_CIPHER_SUITE_CCMP:
if (sta) { if (sta) {
u8 *pn = seq.ccmp.pn; u64 pn64;
aes_sc = data->rsc_tsc->all_tsc_rsc.aes.unicast_rsc; aes_sc = data->rsc_tsc->all_tsc_rsc.aes.unicast_rsc;
aes_tx_sc = &data->rsc_tsc->all_tsc_rsc.aes.tsc; aes_tx_sc = &data->rsc_tsc->all_tsc_rsc.aes.tsc;
ieee80211_get_key_tx_seq(key, &seq); pn64 = atomic64_read(&key->tx_pn);
aes_tx_sc->pn = cpu_to_le64((u64)pn[5] | aes_tx_sc->pn = cpu_to_le64(pn64);
((u64)pn[4] << 8) |
((u64)pn[3] << 16) |
((u64)pn[2] << 24) |
((u64)pn[1] << 32) |
((u64)pn[0] << 40));
} else { } else {
aes_sc = data->rsc_tsc->all_tsc_rsc.aes.multicast_rsc; aes_sc = data->rsc_tsc->all_tsc_rsc.aes.multicast_rsc;
} }
@ -298,7 +293,7 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
u8 *pn = seq.ccmp.pn; u8 *pn = seq.ccmp.pn;
ieee80211_get_key_rx_seq(key, i, &seq); ieee80211_get_key_rx_seq(key, i, &seq);
aes_sc->pn = cpu_to_le64((u64)pn[5] | aes_sc[i].pn = cpu_to_le64((u64)pn[5] |
((u64)pn[4] << 8) | ((u64)pn[4] << 8) |
((u64)pn[3] << 16) | ((u64)pn[3] << 16) |
((u64)pn[2] << 24) | ((u64)pn[2] << 24) |
@ -1453,15 +1448,15 @@ static void iwl_mvm_d3_update_gtks(struct ieee80211_hw *hw,
switch (key->cipher) { switch (key->cipher) {
case WLAN_CIPHER_SUITE_CCMP: case WLAN_CIPHER_SUITE_CCMP:
iwl_mvm_aes_sc_to_seq(&sc->aes.tsc, &seq);
iwl_mvm_set_aes_rx_seq(sc->aes.unicast_rsc, key); iwl_mvm_set_aes_rx_seq(sc->aes.unicast_rsc, key);
atomic64_set(&key->tx_pn, le64_to_cpu(sc->aes.tsc.pn));
break; break;
case WLAN_CIPHER_SUITE_TKIP: case WLAN_CIPHER_SUITE_TKIP:
iwl_mvm_tkip_sc_to_seq(&sc->tkip.tsc, &seq); iwl_mvm_tkip_sc_to_seq(&sc->tkip.tsc, &seq);
iwl_mvm_set_tkip_rx_seq(sc->tkip.unicast_rsc, key); iwl_mvm_set_tkip_rx_seq(sc->tkip.unicast_rsc, key);
ieee80211_set_key_tx_seq(key, &seq);
break; break;
} }
ieee80211_set_key_tx_seq(key, &seq);
/* that's it for this key */ /* that's it for this key */
return; return;

View File

@ -703,7 +703,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
* abort after reading the nvm in case RF Kill is on, we will complete * abort after reading the nvm in case RF Kill is on, we will complete
* the init seq later when RF kill will switch to off * the init seq later when RF kill will switch to off
*/ */
if (iwl_mvm_is_radio_killed(mvm)) { if (iwl_mvm_is_radio_hw_killed(mvm)) {
IWL_DEBUG_RF_KILL(mvm, IWL_DEBUG_RF_KILL(mvm,
"jump over all phy activities due to RF kill\n"); "jump over all phy activities due to RF kill\n");
iwl_remove_notification(&mvm->notif_wait, &calib_wait); iwl_remove_notification(&mvm->notif_wait, &calib_wait);
@ -736,7 +736,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait, ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait,
MVM_UCODE_CALIB_TIMEOUT); MVM_UCODE_CALIB_TIMEOUT);
if (ret && iwl_mvm_is_radio_killed(mvm)) { if (ret && iwl_mvm_is_radio_hw_killed(mvm)) {
IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n"); IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n");
ret = 1; ret = 1;
} }

View File

@ -2388,6 +2388,7 @@ static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
iwl_mvm_remove_time_event(mvm, mvmvif, iwl_mvm_remove_time_event(mvm, mvmvif,
&mvmvif->time_event_data); &mvmvif->time_event_data);
RCU_INIT_POINTER(mvm->csa_vif, NULL); RCU_INIT_POINTER(mvm->csa_vif, NULL);
mvmvif->csa_countdown = false;
} }
if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) { if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) {

View File

@ -860,6 +860,11 @@ static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm)
test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status); test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
} }
static inline bool iwl_mvm_is_radio_hw_killed(struct iwl_mvm *mvm)
{
return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
}
/* Must be called with rcu_read_lock() held and it can only be /* Must be called with rcu_read_lock() held and it can only be
* released when mvmsta is not needed anymore. * released when mvmsta is not needed anymore.
*/ */

View File

@ -590,6 +590,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
ieee80211_unregister_hw(mvm->hw); ieee80211_unregister_hw(mvm->hw);
iwl_mvm_leds_exit(mvm); iwl_mvm_leds_exit(mvm);
out_free: out_free:
flush_delayed_work(&mvm->fw_dump_wk);
iwl_phy_db_free(mvm->phy_db); iwl_phy_db_free(mvm->phy_db);
kfree(mvm->scan_cmd); kfree(mvm->scan_cmd);
if (!cfg->no_power_up_nic_in_init || !mvm->nvm_file_name) if (!cfg->no_power_up_nic_in_init || !mvm->nvm_file_name)

View File

@ -414,6 +414,11 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
{IWL_PCI_DEVICE(0x095A, 0x5590, iwl7265_2ac_cfg)}, {IWL_PCI_DEVICE(0x095A, 0x5590, iwl7265_2ac_cfg)},
{IWL_PCI_DEVICE(0x095B, 0x5290, iwl7265_2ac_cfg)}, {IWL_PCI_DEVICE(0x095B, 0x5290, iwl7265_2ac_cfg)},
{IWL_PCI_DEVICE(0x095A, 0x5490, iwl7265_2ac_cfg)}, {IWL_PCI_DEVICE(0x095A, 0x5490, iwl7265_2ac_cfg)},
{IWL_PCI_DEVICE(0x095A, 0x5F10, iwl7265_2ac_cfg)},
{IWL_PCI_DEVICE(0x095B, 0x5212, iwl7265_2ac_cfg)},
{IWL_PCI_DEVICE(0x095B, 0x520A, iwl7265_2ac_cfg)},
{IWL_PCI_DEVICE(0x095A, 0x9000, iwl7265_2ac_cfg)},
{IWL_PCI_DEVICE(0x095A, 0x9400, iwl7265_2ac_cfg)},
/* 8000 Series */ /* 8000 Series */
{IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)}, {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)},

View File

@ -247,6 +247,8 @@ struct rtl_pci {
/* MSI support */ /* MSI support */
bool msi_support; bool msi_support;
bool using_msi; bool using_msi;
/* interrupt clear before set */
bool int_clear;
}; };
struct mp_adapter { struct mp_adapter {

View File

@ -2253,11 +2253,28 @@ void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci)
} }
} }
static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw)
{
struct rtl_priv *rtlpriv = rtl_priv(hw);
u32 tmp = rtl_read_dword(rtlpriv, REG_HISR);
rtl_write_dword(rtlpriv, REG_HISR, tmp);
tmp = rtl_read_dword(rtlpriv, REG_HISRE);
rtl_write_dword(rtlpriv, REG_HISRE, tmp);
tmp = rtl_read_dword(rtlpriv, REG_HSISR);
rtl_write_dword(rtlpriv, REG_HSISR, tmp);
}
void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw) void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
if (!rtlpci->int_clear)
rtl8821ae_clear_interrupt(hw);/*clear it here first*/
rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
rtlpci->irq_enabled = true; rtlpci->irq_enabled = true;

View File

@ -96,6 +96,7 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
rtl8821ae_bt_reg_init(hw); rtl8821ae_bt_reg_init(hw);
rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
rtlpci->int_clear = rtlpriv->cfg->mod_params->int_clear;
rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer(); rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
rtlpriv->dm.dm_initialgain_enable = 1; rtlpriv->dm.dm_initialgain_enable = 1;
@ -167,6 +168,7 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
rtlpci->msi_support = rtlpriv->cfg->mod_params->int_clear;
if (rtlpriv->cfg->mod_params->disable_watchdog) if (rtlpriv->cfg->mod_params->disable_watchdog)
pr_info("watchdog disabled\n"); pr_info("watchdog disabled\n");
rtlpriv->psc.reg_fwctrl_lps = 3; rtlpriv->psc.reg_fwctrl_lps = 3;
@ -308,6 +310,7 @@ static struct rtl_mod_params rtl8821ae_mod_params = {
.swctrl_lps = false, .swctrl_lps = false,
.fwctrl_lps = true, .fwctrl_lps = true,
.msi_support = true, .msi_support = true,
.int_clear = true,
.debug = DBG_EMERG, .debug = DBG_EMERG,
.disable_watchdog = 0, .disable_watchdog = 0,
}; };
@ -437,6 +440,7 @@ module_param_named(fwlps, rtl8821ae_mod_params.fwctrl_lps, bool, 0444);
module_param_named(msi, rtl8821ae_mod_params.msi_support, bool, 0444); module_param_named(msi, rtl8821ae_mod_params.msi_support, bool, 0444);
module_param_named(disable_watchdog, rtl8821ae_mod_params.disable_watchdog, module_param_named(disable_watchdog, rtl8821ae_mod_params.disable_watchdog,
bool, 0444); bool, 0444);
module_param_named(int_clear, rtl8821ae_mod_params.int_clear, bool, 0444);
MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n"); MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
@ -444,6 +448,7 @@ MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n"); MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n"); MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
MODULE_PARM_DESC(int_clear, "Set to 1 to disable interrupt clear before set (default 0)\n");
static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume); static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);

View File

@ -2249,6 +2249,9 @@ struct rtl_mod_params {
/* default 0: 1 means disable */ /* default 0: 1 means disable */
bool disable_watchdog; bool disable_watchdog;
/* default 0: 1 means do not disable interrupts */
bool int_clear;
}; };
struct rtl_hal_usbint_cfg { struct rtl_hal_usbint_cfg {