mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 12:44:11 +08:00
iwlwifi:
* fix firmware API for -13.ucode * fix RSSI handling that avoid bad roaming decision * fix firmware debug * fix MFUART operation * fix ASSERT while restart the hardware (because of another ASSERT e.g) ath9k: * fix per-packet tx power configuration rtlwifi: * rtl8192cu: Fix kernel deadlock -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQEcBAABAgAGBQJVSPPDAAoJEG4XJFUm622bt7YIAI3OJuvLd/5uY0MddqKKJg8f G4LiNVFv6giD5KmH7vi0U3mic4iHGyUGOnC/7rmE31ZXxVWfFKRvALU8pR1wm8H3 yMaEr1DabGIiGtJvHr9GDBCO4ALN3pAigzwCfV4L/NHKq0zui8Liz5fY33KhO7+p qnALX1stCXpy7aPSelysJqBWwc+JgipnKkkZbR3efrpWTNLMR69vsXXX/Kyj903x otYRbL9dRuOWrTvauyyTEbZ//Os1c78YG/nq7cT5COI/OP0Ao3W6p3QiHCz0Y3RE o4ACEHqxxziAY13bokyYEdlPjdl/xXORc5hi7qPAEsZbMW+7rtmZk6YIwUMFrxI= =H7p4 -----END PGP SIGNATURE----- Merge tag 'wireless-drivers-for-davem-2015-05-05' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers Kalle Valo says: ==================== iwlwifi: * fix firmware API for -13.ucode * fix RSSI handling that avoid bad roaming decision * fix firmware debug * fix MFUART operation * fix ASSERT while restart the hardware (because of another ASSERT e.g) ath9k: * fix per-packet tx power configuration rtlwifi: * rtl8192cu: Fix kernel deadlock ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
53ee1033ac
@ -1103,28 +1103,14 @@ static u8 ath_get_rate_txpower(struct ath_softc *sc, struct ath_buf *bf,
|
||||
struct sk_buff *skb;
|
||||
struct ath_frame_info *fi;
|
||||
struct ieee80211_tx_info *info;
|
||||
struct ieee80211_vif *vif;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
|
||||
if (sc->tx99_state || !ah->tpc_enabled)
|
||||
return MAX_RATE_POWER;
|
||||
|
||||
skb = bf->bf_mpdu;
|
||||
info = IEEE80211_SKB_CB(skb);
|
||||
vif = info->control.vif;
|
||||
|
||||
if (!vif) {
|
||||
max_power = sc->cur_chan->cur_txpower;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (vif->bss_conf.txpower_type != NL80211_TX_POWER_LIMITED) {
|
||||
max_power = min_t(u8, sc->cur_chan->cur_txpower,
|
||||
2 * vif->bss_conf.txpower);
|
||||
goto out;
|
||||
}
|
||||
|
||||
fi = get_frame_info(skb);
|
||||
info = IEEE80211_SKB_CB(skb);
|
||||
|
||||
if (!AR_SREV_9300_20_OR_LATER(ah)) {
|
||||
int txpower = fi->tx_power;
|
||||
@ -1161,25 +1147,26 @@ static u8 ath_get_rate_txpower(struct ath_softc *sc, struct ath_buf *bf,
|
||||
txpower -= 2;
|
||||
|
||||
txpower = max(txpower, 0);
|
||||
max_power = min_t(u8, ah->tx_power[rateidx],
|
||||
2 * vif->bss_conf.txpower);
|
||||
max_power = min_t(u8, max_power, txpower);
|
||||
max_power = min_t(u8, ah->tx_power[rateidx], txpower);
|
||||
|
||||
/* XXX: clamp minimum TX power at 1 for AR9160 since if
|
||||
* max_power is set to 0, frames are transmitted at max
|
||||
* TX power
|
||||
*/
|
||||
if (!max_power && !AR_SREV_9280_20_OR_LATER(ah))
|
||||
max_power = 1;
|
||||
} else if (!bf->bf_state.bfs_paprd) {
|
||||
if (rateidx < 8 && (info->flags & IEEE80211_TX_CTL_STBC))
|
||||
max_power = min_t(u8, ah->tx_power_stbc[rateidx],
|
||||
2 * vif->bss_conf.txpower);
|
||||
fi->tx_power);
|
||||
else
|
||||
max_power = min_t(u8, ah->tx_power[rateidx],
|
||||
2 * vif->bss_conf.txpower);
|
||||
max_power = min(max_power, fi->tx_power);
|
||||
fi->tx_power);
|
||||
} else {
|
||||
max_power = ah->paprd_training_power;
|
||||
}
|
||||
out:
|
||||
/* XXX: clamp minimum TX power at 1 for AR9160 since if max_power
|
||||
* is set to 0, frames are transmitted at max TX power
|
||||
*/
|
||||
return (!max_power && !AR_SREV_9280_20_OR_LATER(ah)) ? 1 : max_power;
|
||||
|
||||
return max_power;
|
||||
}
|
||||
|
||||
static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
||||
@ -2129,6 +2116,7 @@ static void setup_frame_info(struct ieee80211_hw *hw,
|
||||
struct ath_node *an = NULL;
|
||||
enum ath9k_key_type keytype;
|
||||
bool short_preamble = false;
|
||||
u8 txpower;
|
||||
|
||||
/*
|
||||
* We check if Short Preamble is needed for the CTS rate by
|
||||
@ -2145,6 +2133,16 @@ static void setup_frame_info(struct ieee80211_hw *hw,
|
||||
if (sta)
|
||||
an = (struct ath_node *) sta->drv_priv;
|
||||
|
||||
if (tx_info->control.vif) {
|
||||
struct ieee80211_vif *vif = tx_info->control.vif;
|
||||
|
||||
txpower = 2 * vif->bss_conf.txpower;
|
||||
} else {
|
||||
struct ath_softc *sc = hw->priv;
|
||||
|
||||
txpower = sc->cur_chan->cur_txpower;
|
||||
}
|
||||
|
||||
memset(fi, 0, sizeof(*fi));
|
||||
fi->txq = -1;
|
||||
if (hw_key)
|
||||
@ -2155,7 +2153,7 @@ static void setup_frame_info(struct ieee80211_hw *hw,
|
||||
fi->keyix = ATH9K_TXKEYIX_INVALID;
|
||||
fi->keytype = keytype;
|
||||
fi->framelen = framelen;
|
||||
fi->tx_power = MAX_RATE_POWER;
|
||||
fi->tx_power = txpower;
|
||||
|
||||
if (!rate)
|
||||
return;
|
||||
|
@ -244,6 +244,7 @@ enum iwl_ucode_tlv_flag {
|
||||
* longer than the passive one, which is essential for fragmented scan.
|
||||
* @IWL_UCODE_TLV_API_WIFI_MCC_UPDATE: ucode supports MCC updates with source.
|
||||
* IWL_UCODE_TLV_API_HDC_PHASE_0: ucode supports finer configuration of LTR
|
||||
* @IWL_UCODE_TLV_API_TX_POWER_DEV: new API for tx power.
|
||||
* @IWL_UCODE_TLV_API_BASIC_DWELL: use only basic dwell time in scan command,
|
||||
* regardless of the band or the number of the probes. FW will calculate
|
||||
* the actual dwell time.
|
||||
@ -260,6 +261,7 @@ enum iwl_ucode_tlv_api {
|
||||
IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8),
|
||||
IWL_UCODE_TLV_API_WIFI_MCC_UPDATE = BIT(9),
|
||||
IWL_UCODE_TLV_API_HDC_PHASE_0 = BIT(10),
|
||||
IWL_UCODE_TLV_API_TX_POWER_DEV = BIT(11),
|
||||
IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13),
|
||||
IWL_UCODE_TLV_API_SCD_CFG = BIT(15),
|
||||
IWL_UCODE_TLV_API_SINGLE_SCAN_EBS = BIT(16),
|
||||
|
@ -6,7 +6,7 @@
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@ -32,7 +32,7 @@
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -421,8 +421,9 @@ struct iwl_trans_txq_scd_cfg {
|
||||
*
|
||||
* All the handlers MUST be implemented
|
||||
*
|
||||
* @start_hw: starts the HW- from that point on, the HW can send interrupts
|
||||
* May sleep
|
||||
* @start_hw: starts the HW. If low_power is true, the NIC needs to be taken
|
||||
* out of a low power state. From that point on, the HW can send
|
||||
* interrupts. May sleep.
|
||||
* @op_mode_leave: Turn off the HW RF kill indication if on
|
||||
* May sleep
|
||||
* @start_fw: allocates and inits all the resources for the transport
|
||||
@ -432,10 +433,11 @@ struct iwl_trans_txq_scd_cfg {
|
||||
* the SCD base address in SRAM, then provide it here, or 0 otherwise.
|
||||
* May sleep
|
||||
* @stop_device: stops the whole device (embedded CPU put to reset) and stops
|
||||
* the HW. From that point on, the HW will be in low power but will still
|
||||
* issue interrupt if the HW RF kill is triggered. This callback must do
|
||||
* the right thing and not crash even if start_hw() was called but not
|
||||
* start_fw(). May sleep
|
||||
* the HW. If low_power is true, the NIC will be put in low power state.
|
||||
* From that point on, the HW will be stopped but will still issue an
|
||||
* interrupt if the HW RF kill switch is triggered.
|
||||
* This callback must do the right thing and not crash even if %start_hw()
|
||||
* was called but not &start_fw(). May sleep.
|
||||
* @d3_suspend: put the device into the correct mode for WoWLAN during
|
||||
* suspend. This is optional, if not implemented WoWLAN will not be
|
||||
* supported. This callback may sleep.
|
||||
@ -491,14 +493,14 @@ struct iwl_trans_txq_scd_cfg {
|
||||
*/
|
||||
struct iwl_trans_ops {
|
||||
|
||||
int (*start_hw)(struct iwl_trans *iwl_trans);
|
||||
int (*start_hw)(struct iwl_trans *iwl_trans, bool low_power);
|
||||
void (*op_mode_leave)(struct iwl_trans *iwl_trans);
|
||||
int (*start_fw)(struct iwl_trans *trans, const struct fw_img *fw,
|
||||
bool run_in_rfkill);
|
||||
int (*update_sf)(struct iwl_trans *trans,
|
||||
struct iwl_sf_region *st_fwrd_space);
|
||||
void (*fw_alive)(struct iwl_trans *trans, u32 scd_addr);
|
||||
void (*stop_device)(struct iwl_trans *trans);
|
||||
void (*stop_device)(struct iwl_trans *trans, bool low_power);
|
||||
|
||||
void (*d3_suspend)(struct iwl_trans *trans, bool test);
|
||||
int (*d3_resume)(struct iwl_trans *trans, enum iwl_d3_status *status,
|
||||
@ -652,11 +654,16 @@ static inline void iwl_trans_configure(struct iwl_trans *trans,
|
||||
trans->ops->configure(trans, trans_cfg);
|
||||
}
|
||||
|
||||
static inline int iwl_trans_start_hw(struct iwl_trans *trans)
|
||||
static inline int _iwl_trans_start_hw(struct iwl_trans *trans, bool low_power)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
return trans->ops->start_hw(trans);
|
||||
return trans->ops->start_hw(trans, low_power);
|
||||
}
|
||||
|
||||
static inline int iwl_trans_start_hw(struct iwl_trans *trans)
|
||||
{
|
||||
return trans->ops->start_hw(trans, true);
|
||||
}
|
||||
|
||||
static inline void iwl_trans_op_mode_leave(struct iwl_trans *trans)
|
||||
@ -703,15 +710,21 @@ static inline int iwl_trans_update_sf(struct iwl_trans *trans,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void iwl_trans_stop_device(struct iwl_trans *trans)
|
||||
static inline void _iwl_trans_stop_device(struct iwl_trans *trans,
|
||||
bool low_power)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
trans->ops->stop_device(trans);
|
||||
trans->ops->stop_device(trans, low_power);
|
||||
|
||||
trans->state = IWL_TRANS_NO_FW;
|
||||
}
|
||||
|
||||
static inline void iwl_trans_stop_device(struct iwl_trans *trans)
|
||||
{
|
||||
_iwl_trans_stop_device(trans, true);
|
||||
}
|
||||
|
||||
static inline void iwl_trans_d3_suspend(struct iwl_trans *trans, bool test)
|
||||
{
|
||||
might_sleep();
|
||||
|
@ -1726,7 +1726,7 @@ iwl_mvm_netdetect_query_results(struct iwl_mvm *mvm,
|
||||
results->matched_profiles = le32_to_cpu(query->matched_profiles);
|
||||
memcpy(results->matches, query->matches, sizeof(results->matches));
|
||||
|
||||
#ifdef CPTCFG_IWLWIFI_DEBUGFS
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
mvm->last_netdetect_scans = le32_to_cpu(query->n_scans_done);
|
||||
#endif
|
||||
|
||||
|
@ -297,6 +297,40 @@ struct iwl_uapsd_misbehaving_ap_notif {
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct iwl_reduce_tx_power_cmd - TX power reduction command
|
||||
* REDUCE_TX_POWER_CMD = 0x9f
|
||||
* @flags: (reserved for future implementation)
|
||||
* @mac_context_id: id of the mac ctx for which we are reducing TX power.
|
||||
* @pwr_restriction: TX power restriction in dBms.
|
||||
*/
|
||||
struct iwl_reduce_tx_power_cmd {
|
||||
u8 flags;
|
||||
u8 mac_context_id;
|
||||
__le16 pwr_restriction;
|
||||
} __packed; /* TX_REDUCED_POWER_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_dev_tx_power_cmd - TX power reduction command
|
||||
* REDUCE_TX_POWER_CMD = 0x9f
|
||||
* @set_mode: 0 - MAC tx power, 1 - device tx power
|
||||
* @mac_context_id: id of the mac ctx for which we are reducing TX power.
|
||||
* @pwr_restriction: TX power restriction in 1/8 dBms.
|
||||
* @dev_24: device TX power restriction in 1/8 dBms
|
||||
* @dev_52_low: device TX power restriction upper band - low
|
||||
* @dev_52_high: device TX power restriction upper band - high
|
||||
*/
|
||||
struct iwl_dev_tx_power_cmd {
|
||||
__le32 set_mode;
|
||||
__le32 mac_context_id;
|
||||
__le16 pwr_restriction;
|
||||
__le16 dev_24;
|
||||
__le16 dev_52_low;
|
||||
__le16 dev_52_high;
|
||||
} __packed; /* TX_REDUCED_POWER_API_S_VER_2 */
|
||||
|
||||
#define IWL_DEV_MAX_TX_POWER 0x7FFF
|
||||
|
||||
/**
|
||||
* struct iwl_beacon_filter_cmd
|
||||
* REPLY_BEACON_FILTERING_CMD = 0xd2 (command)
|
||||
|
@ -122,46 +122,6 @@ enum iwl_scan_complete_status {
|
||||
SCAN_COMP_STATUS_ERR_ALLOC_TE = 0x0C,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iwl_scan_results_notif - scan results for one channel
|
||||
* ( SCAN_RESULTS_NOTIFICATION = 0x83 )
|
||||
* @channel: which channel the results are from
|
||||
* @band: 0 for 5.2 GHz, 1 for 2.4 GHz
|
||||
* @probe_status: SCAN_PROBE_STATUS_*, indicates success of probe request
|
||||
* @num_probe_not_sent: # of request that weren't sent due to not enough time
|
||||
* @duration: duration spent in channel, in usecs
|
||||
* @statistics: statistics gathered for this channel
|
||||
*/
|
||||
struct iwl_scan_results_notif {
|
||||
u8 channel;
|
||||
u8 band;
|
||||
u8 probe_status;
|
||||
u8 num_probe_not_sent;
|
||||
__le32 duration;
|
||||
__le32 statistics[SCAN_RESULTS_STATISTICS];
|
||||
} __packed; /* SCAN_RESULT_NTF_API_S_VER_2 */
|
||||
|
||||
/**
|
||||
* struct iwl_scan_complete_notif - notifies end of scanning (all channels)
|
||||
* ( SCAN_COMPLETE_NOTIFICATION = 0x84 )
|
||||
* @scanned_channels: number of channels scanned (and number of valid results)
|
||||
* @status: one of SCAN_COMP_STATUS_*
|
||||
* @bt_status: BT on/off status
|
||||
* @last_channel: last channel that was scanned
|
||||
* @tsf_low: TSF timer (lower half) in usecs
|
||||
* @tsf_high: TSF timer (higher half) in usecs
|
||||
* @results: array of scan results, only "scanned_channels" of them are valid
|
||||
*/
|
||||
struct iwl_scan_complete_notif {
|
||||
u8 scanned_channels;
|
||||
u8 status;
|
||||
u8 bt_status;
|
||||
u8 last_channel;
|
||||
__le32 tsf_low;
|
||||
__le32 tsf_high;
|
||||
struct iwl_scan_results_notif results[];
|
||||
} __packed; /* SCAN_COMPLETE_NTF_API_S_VER_2 */
|
||||
|
||||
/* scan offload */
|
||||
#define IWL_SCAN_MAX_BLACKLIST_LEN 64
|
||||
#define IWL_SCAN_SHORT_BLACKLIST_LEN 16
|
||||
@ -554,7 +514,7 @@ struct iwl_scan_req_unified_lmac {
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct iwl_lmac_scan_results_notif - scan results for one channel -
|
||||
* struct iwl_scan_results_notif - scan results for one channel -
|
||||
* SCAN_RESULT_NTF_API_S_VER_3
|
||||
* @channel: which channel the results are from
|
||||
* @band: 0 for 5.2 GHz, 1 for 2.4 GHz
|
||||
@ -562,7 +522,7 @@ struct iwl_scan_req_unified_lmac {
|
||||
* @num_probe_not_sent: # of request that weren't sent due to not enough time
|
||||
* @duration: duration spent in channel, in usecs
|
||||
*/
|
||||
struct iwl_lmac_scan_results_notif {
|
||||
struct iwl_scan_results_notif {
|
||||
u8 channel;
|
||||
u8 band;
|
||||
u8 probe_status;
|
||||
|
@ -281,19 +281,6 @@ struct iwl_tx_ant_cfg_cmd {
|
||||
__le32 valid;
|
||||
} __packed;
|
||||
|
||||
/**
|
||||
* struct iwl_reduce_tx_power_cmd - TX power reduction command
|
||||
* REDUCE_TX_POWER_CMD = 0x9f
|
||||
* @flags: (reserved for future implementation)
|
||||
* @mac_context_id: id of the mac ctx for which we are reducing TX power.
|
||||
* @pwr_restriction: TX power restriction in dBms.
|
||||
*/
|
||||
struct iwl_reduce_tx_power_cmd {
|
||||
u8 flags;
|
||||
u8 mac_context_id;
|
||||
__le16 pwr_restriction;
|
||||
} __packed; /* TX_REDUCED_POWER_API_S_VER_1 */
|
||||
|
||||
/*
|
||||
* Calibration control struct.
|
||||
* Sent as part of the phy configuration command.
|
||||
|
@ -6,7 +6,7 @@
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@ -32,7 +32,7 @@
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -322,7 +322,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
|
||||
|
||||
lockdep_assert_held(&mvm->mutex);
|
||||
|
||||
if (WARN_ON_ONCE(mvm->init_ucode_complete || mvm->calibrating))
|
||||
if (WARN_ON_ONCE(mvm->calibrating))
|
||||
return 0;
|
||||
|
||||
iwl_init_notification_wait(&mvm->notif_wait,
|
||||
@ -396,8 +396,6 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
|
||||
*/
|
||||
ret = iwl_wait_notification(&mvm->notif_wait, &calib_wait,
|
||||
MVM_UCODE_CALIB_TIMEOUT);
|
||||
if (!ret)
|
||||
mvm->init_ucode_complete = true;
|
||||
|
||||
if (ret && iwl_mvm_is_radio_killed(mvm)) {
|
||||
IWL_DEBUG_RF_KILL(mvm, "RFKILL while calibrating.\n");
|
||||
@ -494,15 +492,6 @@ int iwl_mvm_fw_dbg_collect_desc(struct iwl_mvm *mvm,
|
||||
|
||||
mvm->fw_dump_desc = desc;
|
||||
|
||||
/* stop recording */
|
||||
if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000) {
|
||||
iwl_set_bits_prph(mvm->trans, MON_BUFF_SAMPLE_CTL, 0x100);
|
||||
} else {
|
||||
iwl_write_prph(mvm->trans, DBGC_IN_SAMPLE, 0);
|
||||
/* wait before we collect the data till the DBGC stop */
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
queue_delayed_work(system_wq, &mvm->fw_dump_wk, delay);
|
||||
|
||||
return 0;
|
||||
@ -658,25 +647,24 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
|
||||
* module loading, load init ucode now
|
||||
* (for example, if we were in RFKILL)
|
||||
*/
|
||||
if (!mvm->init_ucode_complete) {
|
||||
ret = iwl_run_init_mvm_ucode(mvm, false);
|
||||
if (ret && !iwlmvm_mod_params.init_dbg) {
|
||||
IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret);
|
||||
/* this can't happen */
|
||||
if (WARN_ON(ret > 0))
|
||||
ret = -ERFKILL;
|
||||
goto error;
|
||||
}
|
||||
if (!iwlmvm_mod_params.init_dbg) {
|
||||
/*
|
||||
* should stop and start HW since that INIT
|
||||
* image just loaded
|
||||
*/
|
||||
iwl_trans_stop_device(mvm->trans);
|
||||
ret = iwl_trans_start_hw(mvm->trans);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
ret = iwl_run_init_mvm_ucode(mvm, false);
|
||||
if (ret && !iwlmvm_mod_params.init_dbg) {
|
||||
IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret);
|
||||
/* this can't happen */
|
||||
if (WARN_ON(ret > 0))
|
||||
ret = -ERFKILL;
|
||||
goto error;
|
||||
}
|
||||
if (!iwlmvm_mod_params.init_dbg) {
|
||||
/*
|
||||
* Stop and start the transport without entering low power
|
||||
* mode. This will save the state of other components on the
|
||||
* device that are triggered by the INIT firwmare (MFUART).
|
||||
*/
|
||||
_iwl_trans_stop_device(mvm->trans, false);
|
||||
_iwl_trans_start_hw(mvm->trans, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (iwlmvm_mod_params.init_dbg)
|
||||
|
@ -1322,7 +1322,7 @@ static void iwl_mvm_restart_complete(struct iwl_mvm *mvm)
|
||||
|
||||
clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
|
||||
iwl_mvm_d0i3_enable_tx(mvm, NULL);
|
||||
ret = iwl_mvm_update_quotas(mvm, false, NULL);
|
||||
ret = iwl_mvm_update_quotas(mvm, true, NULL);
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "Failed to update quotas after restart (%d)\n",
|
||||
ret);
|
||||
@ -1471,8 +1471,8 @@ static struct iwl_mvm_phy_ctxt *iwl_mvm_get_free_phy_ctxt(struct iwl_mvm *mvm)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
s8 tx_power)
|
||||
static int iwl_mvm_set_tx_power_old(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif, s8 tx_power)
|
||||
{
|
||||
/* FW is in charge of regulatory enforcement */
|
||||
struct iwl_reduce_tx_power_cmd reduce_txpwr_cmd = {
|
||||
@ -1485,6 +1485,26 @@ static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
&reduce_txpwr_cmd);
|
||||
}
|
||||
|
||||
static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
s16 tx_power)
|
||||
{
|
||||
struct iwl_dev_tx_power_cmd cmd = {
|
||||
.set_mode = 0,
|
||||
.mac_context_id =
|
||||
cpu_to_le32(iwl_mvm_vif_from_mac80211(vif)->id),
|
||||
.pwr_restriction = cpu_to_le16(8 * tx_power),
|
||||
};
|
||||
|
||||
if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_TX_POWER_DEV))
|
||||
return iwl_mvm_set_tx_power_old(mvm, vif, tx_power);
|
||||
|
||||
if (tx_power == IWL_DEFAULT_MAX_TX_POWER)
|
||||
cmd.pwr_restriction = cpu_to_le16(IWL_DEV_MAX_TX_POWER);
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
}
|
||||
|
||||
static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
|
@ -603,7 +603,6 @@ struct iwl_mvm {
|
||||
|
||||
enum iwl_ucode_type cur_ucode;
|
||||
bool ucode_loaded;
|
||||
bool init_ucode_complete;
|
||||
bool calibrating;
|
||||
u32 error_event_table;
|
||||
u32 log_event_table;
|
||||
|
@ -865,6 +865,16 @@ static void iwl_mvm_fw_error_dump_wk(struct work_struct *work)
|
||||
return;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
||||
/* stop recording */
|
||||
if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000) {
|
||||
iwl_set_bits_prph(mvm->trans, MON_BUFF_SAMPLE_CTL, 0x100);
|
||||
} else {
|
||||
iwl_write_prph(mvm->trans, DBGC_IN_SAMPLE, 0);
|
||||
/* wait before we collect the data till the DBGC stop */
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
iwl_mvm_fw_error_dump(mvm);
|
||||
|
||||
/* start recording again if the firmware is not crashed */
|
||||
|
@ -478,6 +478,11 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
|
||||
if (vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
|
||||
if (sig == 0) {
|
||||
IWL_DEBUG_RX(mvm, "RSSI is 0 - skip signal based decision\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mvmvif->bf_data.ave_beacon_signal = sig;
|
||||
|
||||
/* BT Coex */
|
||||
|
@ -319,7 +319,7 @@ int iwl_mvm_rx_scan_offload_iter_complete_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_device_cmd *cmd)
|
||||
{
|
||||
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||
struct iwl_scan_complete_notif *notif = (void *)pkt->data;
|
||||
struct iwl_lmac_scan_complete_notif *notif = (void *)pkt->data;
|
||||
|
||||
IWL_DEBUG_SCAN(mvm,
|
||||
"Scan offload iteration complete: status=0x%x scanned channels=%d\n",
|
||||
|
@ -5,8 +5,8 @@
|
||||
*
|
||||
* GPL LICENSE SUMMARY
|
||||
*
|
||||
* Copyright(c) 2007 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2007 - 2015 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@ -31,8 +31,8 @@
|
||||
*
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2005 - 2015 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -104,7 +104,7 @@ static void iwl_pcie_free_fw_monitor(struct iwl_trans *trans)
|
||||
static void iwl_pcie_alloc_fw_monitor(struct iwl_trans *trans)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
struct page *page;
|
||||
struct page *page = NULL;
|
||||
dma_addr_t phys;
|
||||
u32 size;
|
||||
u8 power;
|
||||
@ -131,6 +131,7 @@ static void iwl_pcie_alloc_fw_monitor(struct iwl_trans *trans)
|
||||
DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(trans->dev, phys)) {
|
||||
__free_pages(page, order);
|
||||
page = NULL;
|
||||
continue;
|
||||
}
|
||||
IWL_INFO(trans,
|
||||
@ -1020,7 +1021,7 @@ static void iwl_trans_pcie_fw_alive(struct iwl_trans *trans, u32 scd_addr)
|
||||
iwl_pcie_tx_start(trans, scd_addr);
|
||||
}
|
||||
|
||||
static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
|
||||
static void iwl_trans_pcie_stop_device(struct iwl_trans *trans, bool low_power)
|
||||
{
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
bool hw_rfkill, was_hw_rfkill;
|
||||
@ -1115,7 +1116,7 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
|
||||
void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state)
|
||||
{
|
||||
if (iwl_op_mode_hw_rf_kill(trans->op_mode, state))
|
||||
iwl_trans_pcie_stop_device(trans);
|
||||
iwl_trans_pcie_stop_device(trans, true);
|
||||
}
|
||||
|
||||
static void iwl_trans_pcie_d3_suspend(struct iwl_trans *trans, bool test)
|
||||
@ -1200,7 +1201,7 @@ static int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
|
||||
static int iwl_trans_pcie_start_hw(struct iwl_trans *trans, bool low_power)
|
||||
{
|
||||
bool hw_rfkill;
|
||||
int err;
|
||||
|
@ -126,7 +126,7 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request,
|
||||
|
||||
do {
|
||||
status = usb_control_msg(udev, pipe, request, reqtype, value,
|
||||
index, pdata, len, 0); /*max. timeout*/
|
||||
index, pdata, len, 1000);
|
||||
if (status < 0) {
|
||||
/* firmware download is checksumed, don't retry */
|
||||
if ((value >= FW_8192C_START_ADDRESS &&
|
||||
|
Loading…
Reference in New Issue
Block a user