Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Conflicts: drivers/net/wireless/iwlwifi/iwl-agn.c drivers/net/wireless/libertas/cfg.c
这个提交包含在:
@@ -1967,7 +1967,8 @@ static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)
|
||||
}
|
||||
|
||||
/* Clear Bit 14 of AR_WA after putting chip into Full Sleep mode. */
|
||||
REG_WRITE(ah, AR_WA, ah->WARegVal & ~AR_WA_D3_L1_DISABLE);
|
||||
if (AR_SREV_9300_20_OR_LATER(ah))
|
||||
REG_WRITE(ah, AR_WA, ah->WARegVal & ~AR_WA_D3_L1_DISABLE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -182,6 +182,7 @@ static struct iwl_base_params iwl1000_base_params = {
|
||||
.chain_noise_scale = 1000,
|
||||
.wd_timeout = IWL_DEF_WD_TIMEOUT,
|
||||
.max_event_log_size = 128,
|
||||
.wd_disable = true,
|
||||
};
|
||||
static struct iwl_ht_params iwl1000_ht_params = {
|
||||
.ht_greenfield_support = true,
|
||||
|
@@ -350,6 +350,7 @@ static struct iwl_base_params iwl5000_base_params = {
|
||||
.wd_timeout = IWL_LONG_WD_TIMEOUT,
|
||||
.max_event_log_size = 512,
|
||||
.no_idle_support = true,
|
||||
.wd_disable = true,
|
||||
};
|
||||
static struct iwl_ht_params iwl5000_ht_params = {
|
||||
.ht_greenfield_support = true,
|
||||
|
@@ -529,6 +529,24 @@ int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void iwlagn_config_ht40(struct ieee80211_conf *conf,
|
||||
struct iwl_rxon_context *ctx)
|
||||
{
|
||||
if (conf_is_ht40_minus(conf)) {
|
||||
ctx->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_BELOW;
|
||||
ctx->ht.is_40mhz = true;
|
||||
} else if (conf_is_ht40_plus(conf)) {
|
||||
ctx->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
|
||||
ctx->ht.is_40mhz = true;
|
||||
} else {
|
||||
ctx->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_NONE;
|
||||
ctx->ht.is_40mhz = false;
|
||||
}
|
||||
}
|
||||
|
||||
int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
{
|
||||
struct iwl_priv *priv = hw->priv;
|
||||
@@ -590,19 +608,11 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
ctx->ht.enabled = conf_is_ht(conf);
|
||||
|
||||
if (ctx->ht.enabled) {
|
||||
if (conf_is_ht40_minus(conf)) {
|
||||
ctx->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_BELOW;
|
||||
ctx->ht.is_40mhz = true;
|
||||
} else if (conf_is_ht40_plus(conf)) {
|
||||
ctx->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
|
||||
ctx->ht.is_40mhz = true;
|
||||
} else {
|
||||
ctx->ht.extension_chan_offset =
|
||||
IEEE80211_HT_PARAM_CHA_SEC_NONE;
|
||||
ctx->ht.is_40mhz = false;
|
||||
}
|
||||
/* if HT40 is used, it should not change
|
||||
* after associated except channel switch */
|
||||
if (iwl_is_associated_ctx(ctx) &&
|
||||
!ctx->ht.is_40mhz)
|
||||
iwlagn_config_ht40(conf, ctx);
|
||||
} else
|
||||
ctx->ht.is_40mhz = false;
|
||||
|
||||
|
@@ -1250,9 +1250,6 @@ int iwl_set_dynamic_key(struct iwl_priv *priv,
|
||||
|
||||
switch (keyconf->cipher) {
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
|
||||
keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
|
||||
if (sta)
|
||||
addr = sta->addr;
|
||||
else /* station mode case only */
|
||||
@@ -1265,8 +1262,6 @@ int iwl_set_dynamic_key(struct iwl_priv *priv,
|
||||
seq.tkip.iv32, p1k, CMD_SYNC);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
keyconf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
|
||||
/* fall through */
|
||||
case WLAN_CIPHER_SUITE_WEP40:
|
||||
case WLAN_CIPHER_SUITE_WEP104:
|
||||
ret = iwlagn_send_sta_key(priv, keyconf, sta_id,
|
||||
|
@@ -2022,9 +2022,10 @@ MODULE_PARM_DESC(plcp_check, "Check plcp health (default: 1 [enabled])");
|
||||
module_param_named(ack_check, iwlagn_mod_params.ack_check, bool, S_IRUGO);
|
||||
MODULE_PARM_DESC(ack_check, "Check ack health (default: 0 [disabled])");
|
||||
|
||||
module_param_named(wd_disable, iwlagn_mod_params.wd_disable, bool, S_IRUGO);
|
||||
module_param_named(wd_disable, iwlagn_mod_params.wd_disable, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(wd_disable,
|
||||
"Disable stuck queue watchdog timer (default: 0 [enabled])");
|
||||
"Disable stuck queue watchdog timer 0=system default, "
|
||||
"1=disable, 2=enable (default: 0)");
|
||||
|
||||
/*
|
||||
* set bt_coex_active to true, uCode will do kill/defer
|
||||
|
@@ -101,6 +101,8 @@ void iwlagn_bss_info_changed(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *bss_conf,
|
||||
u32 changes);
|
||||
void iwlagn_config_ht40(struct ieee80211_conf *conf,
|
||||
struct iwl_rxon_context *ctx);
|
||||
|
||||
/* uCode */
|
||||
int iwlagn_rx_calib_result(struct iwl_priv *priv,
|
||||
|
@@ -1505,11 +1505,23 @@ void iwl_setup_watchdog(struct iwl_priv *priv)
|
||||
{
|
||||
unsigned int timeout = priv->cfg->base_params->wd_timeout;
|
||||
|
||||
if (timeout && !iwlagn_mod_params.wd_disable)
|
||||
mod_timer(&priv->watchdog,
|
||||
jiffies + msecs_to_jiffies(IWL_WD_TICK(timeout)));
|
||||
else
|
||||
del_timer(&priv->watchdog);
|
||||
if (!iwlagn_mod_params.wd_disable) {
|
||||
/* use system default */
|
||||
if (timeout && !priv->cfg->base_params->wd_disable)
|
||||
mod_timer(&priv->watchdog,
|
||||
jiffies +
|
||||
msecs_to_jiffies(IWL_WD_TICK(timeout)));
|
||||
else
|
||||
del_timer(&priv->watchdog);
|
||||
} else {
|
||||
/* module parameter overwrite default configuration */
|
||||
if (timeout && iwlagn_mod_params.wd_disable == 2)
|
||||
mod_timer(&priv->watchdog,
|
||||
jiffies +
|
||||
msecs_to_jiffies(IWL_WD_TICK(timeout)));
|
||||
else
|
||||
del_timer(&priv->watchdog);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -113,6 +113,7 @@ struct iwl_lib_ops {
|
||||
* @shadow_reg_enable: HW shadhow register bit
|
||||
* @no_idle_support: do not support idle mode
|
||||
* @hd_v2: v2 of enhanced sensitivity value, used for 2000 series and up
|
||||
* wd_disable: disable watchdog timer
|
||||
*/
|
||||
struct iwl_base_params {
|
||||
int eeprom_size;
|
||||
@@ -134,6 +135,7 @@ struct iwl_base_params {
|
||||
const bool shadow_reg_enable;
|
||||
const bool no_idle_support;
|
||||
const bool hd_v2;
|
||||
const bool wd_disable;
|
||||
};
|
||||
/*
|
||||
* @advanced_bt_coexist: support advanced bt coexist
|
||||
|
@@ -120,7 +120,7 @@ extern struct iwl_mod_params iwlagn_mod_params;
|
||||
* @restart_fw: restart firmware, default = 1
|
||||
* @plcp_check: enable plcp health check, default = true
|
||||
* @ack_check: disable ack health check, default = false
|
||||
* @wd_disable: enable stuck queue check, default = false
|
||||
* @wd_disable: enable stuck queue check, default = 0
|
||||
* @bt_coex_active: enable bt coex, default = true
|
||||
* @led_mode: system default, default = 0
|
||||
* @no_sleep_autoadjust: disable autoadjust, default = true
|
||||
@@ -141,7 +141,7 @@ struct iwl_mod_params {
|
||||
int restart_fw;
|
||||
bool plcp_check;
|
||||
bool ack_check;
|
||||
bool wd_disable;
|
||||
int wd_disable;
|
||||
bool bt_coex_active;
|
||||
int led_mode;
|
||||
bool no_sleep_autoadjust;
|
||||
|
@@ -990,29 +990,16 @@ static int iwl_trans_tx_stop(struct iwl_trans *trans)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void iwl_trans_pcie_disable_sync_irq(struct iwl_trans *trans)
|
||||
static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct iwl_trans_pcie *trans_pcie =
|
||||
IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
|
||||
|
||||
/* tell the device to stop sending interrupts */
|
||||
spin_lock_irqsave(&trans->shrd->lock, flags);
|
||||
iwl_disable_interrupts(trans);
|
||||
spin_unlock_irqrestore(&trans->shrd->lock, flags);
|
||||
|
||||
/* wait to make sure we flush pending tasklet*/
|
||||
synchronize_irq(bus(trans)->irq);
|
||||
tasklet_kill(&trans_pcie->irq_tasklet);
|
||||
}
|
||||
|
||||
static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
|
||||
{
|
||||
/* stop and reset the on-board processor */
|
||||
iwl_write32(bus(trans), CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
|
||||
|
||||
/* tell the device to stop sending interrupts */
|
||||
iwl_trans_pcie_disable_sync_irq(trans);
|
||||
|
||||
/* device going down, Stop using ICT table */
|
||||
iwl_disable_ict(trans);
|
||||
|
||||
@@ -1039,6 +1026,20 @@ static void iwl_trans_pcie_stop_device(struct iwl_trans *trans)
|
||||
|
||||
/* Stop the device, and put it in low power state */
|
||||
iwl_apm_stop(priv(trans));
|
||||
|
||||
/* Upon stop, the APM issues an interrupt if HW RF kill is set.
|
||||
* Clean again the interrupt here
|
||||
*/
|
||||
spin_lock_irqsave(&trans->shrd->lock, flags);
|
||||
iwl_disable_interrupts(trans);
|
||||
spin_unlock_irqrestore(&trans->shrd->lock, flags);
|
||||
|
||||
/* wait to make sure we flush pending tasklet*/
|
||||
synchronize_irq(bus(trans)->irq);
|
||||
tasklet_kill(&trans_pcie->irq_tasklet);
|
||||
|
||||
/* stop and reset the on-board processor */
|
||||
iwl_write32(bus(trans), CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
|
||||
}
|
||||
|
||||
static int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
|
||||
|
@@ -635,7 +635,7 @@ static int lbs_ret_scan(struct lbs_private *priv, unsigned long dummy,
|
||||
if (channel &&
|
||||
!(channel->flags & IEEE80211_CHAN_DISABLED)) {
|
||||
bss = cfg80211_inform_bss(wiphy, channel,
|
||||
bssid, le64_to_cpu(*(__le64 *)tsfdesc),
|
||||
bssid, get_unaligned_le64(tsfdesc),
|
||||
capa, intvl, ie, ielen,
|
||||
LBS_SCAN_RSSI_TO_MBM(rssi),
|
||||
GFP_KERNEL);
|
||||
|
@@ -995,6 +995,7 @@ static int if_spi_host_to_card(struct lbs_private *priv,
|
||||
spin_unlock_irqrestore(&card->buffer_lock, flags);
|
||||
break;
|
||||
default:
|
||||
kfree(packet);
|
||||
netdev_err(priv->dev, "can't transfer buffer of type %d\n",
|
||||
type);
|
||||
err = -EINVAL;
|
||||
|
@@ -819,8 +819,10 @@ mwifiex_scan_setup_scan_config(struct mwifiex_private *priv,
|
||||
wildcard_ssid_tlv->header.len = cpu_to_le16(
|
||||
(u16) (ssid_len + sizeof(wildcard_ssid_tlv->
|
||||
max_ssid_length)));
|
||||
wildcard_ssid_tlv->max_ssid_length =
|
||||
user_scan_in->ssid_list[ssid_idx].max_len;
|
||||
|
||||
/* max_ssid_length = 0 tells firmware to perform
|
||||
specific scan for the SSID filled */
|
||||
wildcard_ssid_tlv->max_ssid_length = 0;
|
||||
|
||||
memcpy(wildcard_ssid_tlv->ssid,
|
||||
user_scan_in->ssid_list[ssid_idx].ssid,
|
||||
|
@@ -584,8 +584,6 @@ static void p54spi_op_stop(struct ieee80211_hw *dev)
|
||||
mutex_lock(&priv->mutex);
|
||||
WARN_ON(priv->fw_state != FW_STATE_READY);
|
||||
|
||||
cancel_work_sync(&priv->work);
|
||||
|
||||
p54spi_power_off(priv);
|
||||
spin_lock_irqsave(&priv->tx_lock, flags);
|
||||
INIT_LIST_HEAD(&priv->tx_pending);
|
||||
@@ -593,6 +591,8 @@ static void p54spi_op_stop(struct ieee80211_hw *dev)
|
||||
|
||||
priv->fw_state = FW_STATE_OFF;
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
cancel_work_sync(&priv->work);
|
||||
}
|
||||
|
||||
static int __devinit p54spi_probe(struct spi_device *spi)
|
||||
@@ -652,6 +652,7 @@ static int __devinit p54spi_probe(struct spi_device *spi)
|
||||
init_completion(&priv->fw_comp);
|
||||
INIT_LIST_HEAD(&priv->tx_pending);
|
||||
mutex_init(&priv->mutex);
|
||||
spin_lock_init(&priv->tx_lock);
|
||||
SET_IEEE80211_DEV(hw, &spi->dev);
|
||||
priv->common.open = p54spi_op_start;
|
||||
priv->common.stop = p54spi_op_stop;
|
||||
|
@@ -778,7 +778,7 @@ prism54_get_essid(struct net_device *ndev, struct iw_request_info *info,
|
||||
dwrq->flags = 0;
|
||||
dwrq->length = 0;
|
||||
}
|
||||
essid->octets[essid->length] = '\0';
|
||||
essid->octets[dwrq->length] = '\0';
|
||||
memcpy(extra, essid->octets, dwrq->length);
|
||||
kfree(essid);
|
||||
|
||||
|
@@ -3773,7 +3773,7 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
|
||||
/* Apparently the data is read from end to start */
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3, ®);
|
||||
/* The returned value is in CPU order, but eeprom is le */
|
||||
rt2x00dev->eeprom[i] = cpu_to_le32(reg);
|
||||
*(u32 *)&rt2x00dev->eeprom[i] = cpu_to_le32(reg);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2, ®);
|
||||
*(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg);
|
||||
rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1, ®);
|
||||
|
@@ -919,6 +919,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
{ USB_DEVICE(0x050d, 0x935b) },
|
||||
/* Buffalo */
|
||||
{ USB_DEVICE(0x0411, 0x00e8) },
|
||||
{ USB_DEVICE(0x0411, 0x0158) },
|
||||
{ USB_DEVICE(0x0411, 0x016f) },
|
||||
{ USB_DEVICE(0x0411, 0x01a2) },
|
||||
/* Corega */
|
||||
|
@@ -943,6 +943,7 @@ struct rt2x00_dev {
|
||||
* Powersaving work
|
||||
*/
|
||||
struct delayed_work autowakeup_work;
|
||||
struct work_struct sleep_work;
|
||||
|
||||
/*
|
||||
* Data queue arrays for RX, TX, Beacon and ATIM.
|
||||
|
@@ -465,6 +465,23 @@ static u8 *rt2x00lib_find_ie(u8 *data, unsigned int len, u8 ie)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void rt2x00lib_sleep(struct work_struct *work)
|
||||
{
|
||||
struct rt2x00_dev *rt2x00dev =
|
||||
container_of(work, struct rt2x00_dev, sleep_work);
|
||||
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Check again is powersaving is enabled, to prevent races from delayed
|
||||
* work execution.
|
||||
*/
|
||||
if (!test_bit(CONFIG_POWERSAVING, &rt2x00dev->flags))
|
||||
rt2x00lib_config(rt2x00dev, &rt2x00dev->hw->conf,
|
||||
IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
|
||||
static void rt2x00lib_rxdone_check_ps(struct rt2x00_dev *rt2x00dev,
|
||||
struct sk_buff *skb,
|
||||
struct rxdone_entry_desc *rxdesc)
|
||||
@@ -512,8 +529,7 @@ static void rt2x00lib_rxdone_check_ps(struct rt2x00_dev *rt2x00dev,
|
||||
cam |= (tim_ie->bitmap_ctrl & 0x01);
|
||||
|
||||
if (!cam && !test_bit(CONFIG_POWERSAVING, &rt2x00dev->flags))
|
||||
rt2x00lib_config(rt2x00dev, &rt2x00dev->hw->conf,
|
||||
IEEE80211_CONF_CHANGE_PS);
|
||||
queue_work(rt2x00dev->workqueue, &rt2x00dev->sleep_work);
|
||||
}
|
||||
|
||||
static int rt2x00lib_rxdone_read_signal(struct rt2x00_dev *rt2x00dev,
|
||||
@@ -1141,6 +1157,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)
|
||||
|
||||
INIT_WORK(&rt2x00dev->intf_work, rt2x00lib_intf_scheduled);
|
||||
INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
|
||||
INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
|
||||
|
||||
/*
|
||||
* Let the driver probe the device to detect the capabilities.
|
||||
@@ -1197,6 +1214,7 @@ void rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev)
|
||||
*/
|
||||
cancel_work_sync(&rt2x00dev->intf_work);
|
||||
cancel_delayed_work_sync(&rt2x00dev->autowakeup_work);
|
||||
cancel_work_sync(&rt2x00dev->sleep_work);
|
||||
if (rt2x00_is_usb(rt2x00dev)) {
|
||||
del_timer_sync(&rt2x00dev->txstatus_timer);
|
||||
cancel_work_sync(&rt2x00dev->rxdone_work);
|
||||
|
@@ -395,7 +395,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
|
||||
if (mac->link_state != MAC80211_LINKED)
|
||||
return;
|
||||
|
||||
spin_lock(&rtlpriv->locks.lps_lock);
|
||||
spin_lock_irq(&rtlpriv->locks.lps_lock);
|
||||
|
||||
/* Idle for a while if we connect to AP a while ago. */
|
||||
if (mac->cnt_after_linked >= 2) {
|
||||
@@ -407,7 +407,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock(&rtlpriv->locks.lps_lock);
|
||||
spin_unlock_irq(&rtlpriv->locks.lps_lock);
|
||||
}
|
||||
|
||||
/*Leave the leisure power save mode.*/
|
||||
@@ -416,8 +416,9 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&rtlpriv->locks.lps_lock);
|
||||
spin_lock_irqsave(&rtlpriv->locks.lps_lock, flags);
|
||||
|
||||
if (ppsc->fwctrl_lps) {
|
||||
if (ppsc->dot11_psmode != EACTIVE) {
|
||||
@@ -438,7 +439,7 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
|
||||
rtl_lps_set_psmode(hw, EACTIVE);
|
||||
}
|
||||
}
|
||||
spin_unlock(&rtlpriv->locks.lps_lock);
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flags);
|
||||
}
|
||||
|
||||
/* For sw LPS*/
|
||||
@@ -539,9 +540,9 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
|
||||
RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
|
||||
}
|
||||
|
||||
spin_lock(&rtlpriv->locks.lps_lock);
|
||||
spin_lock_irq(&rtlpriv->locks.lps_lock);
|
||||
rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS);
|
||||
spin_unlock(&rtlpriv->locks.lps_lock);
|
||||
spin_unlock_irq(&rtlpriv->locks.lps_lock);
|
||||
}
|
||||
|
||||
void rtl_swlps_rfon_wq_callback(void *data)
|
||||
@@ -574,9 +575,9 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
|
||||
if (rtlpriv->link_info.busytraffic)
|
||||
return;
|
||||
|
||||
spin_lock(&rtlpriv->locks.lps_lock);
|
||||
spin_lock_irq(&rtlpriv->locks.lps_lock);
|
||||
rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS);
|
||||
spin_unlock(&rtlpriv->locks.lps_lock);
|
||||
spin_unlock_irq(&rtlpriv->locks.lps_lock);
|
||||
|
||||
if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM &&
|
||||
!RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
|
||||
|
在新工单中引用
屏蔽一个用户