mirror of https://gitee.com/openkylin/linux.git
iwl3945: use iwl_mac_config from iwlwifi
3945 can now use iwl_mac_config from iwlwifi Signed-off-by: Abhijeet Kolekar <abhijeet.kolekar@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
d8052319f2
commit
4808368dad
|
@ -2036,139 +2036,6 @@ static int iwl_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl_mac_config - mac80211 config callback
|
||||
*
|
||||
* We ignore conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME since it seems to
|
||||
* be set inappropriately and the driver currently sets the hardware up to
|
||||
* use it whenever needed.
|
||||
*/
|
||||
static int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
{
|
||||
struct iwl_priv *priv = hw->priv;
|
||||
const struct iwl_channel_info *ch_info;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
unsigned long flags = 0;
|
||||
int ret = 0;
|
||||
u16 ch;
|
||||
int scan_active = 0;
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
IWL_DEBUG_MAC80211(priv, "enter to channel %d changed 0x%X\n",
|
||||
conf->channel->hw_value, changed);
|
||||
|
||||
if (unlikely(!priv->cfg->mod_params->disable_hw_scan &&
|
||||
test_bit(STATUS_SCANNING, &priv->status))) {
|
||||
scan_active = 1;
|
||||
IWL_DEBUG_MAC80211(priv, "leave - scanning\n");
|
||||
}
|
||||
|
||||
|
||||
/* during scanning mac80211 will delay channel setting until
|
||||
* scan finish with changed = 0
|
||||
*/
|
||||
if (!changed || (changed & IEEE80211_CONF_CHANGE_CHANNEL)) {
|
||||
if (scan_active)
|
||||
goto set_ch_out;
|
||||
|
||||
ch = ieee80211_frequency_to_channel(conf->channel->center_freq);
|
||||
ch_info = iwl_get_channel_info(priv, conf->channel->band, ch);
|
||||
if (!is_channel_valid(ch_info)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - invalid channel\n");
|
||||
ret = -EINVAL;
|
||||
goto set_ch_out;
|
||||
}
|
||||
|
||||
if (priv->iw_mode == NL80211_IFTYPE_ADHOC &&
|
||||
!is_channel_ibss(ch_info)) {
|
||||
IWL_ERR(priv, "channel %d in band %d not "
|
||||
"IBSS channel\n",
|
||||
conf->channel->hw_value, conf->channel->band);
|
||||
ret = -EINVAL;
|
||||
goto set_ch_out;
|
||||
}
|
||||
|
||||
priv->current_ht_config.is_ht = conf_is_ht(conf);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
|
||||
/* if we are switching from ht to 2.4 clear flags
|
||||
* from any ht related info since 2.4 does not
|
||||
* support ht */
|
||||
if ((le16_to_cpu(priv->staging_rxon.channel) != ch))
|
||||
priv->staging_rxon.flags = 0;
|
||||
|
||||
iwl_set_rxon_channel(priv, conf->channel);
|
||||
|
||||
iwl_set_flags_for_band(priv, conf->channel->band);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
set_ch_out:
|
||||
/* The list of supported rates and rate mask can be different
|
||||
* for each band; since the band may have changed, reset
|
||||
* the rate mask to what mac80211 lists */
|
||||
iwl_set_rate(priv);
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_PS) {
|
||||
if (conf->flags & IEEE80211_CONF_PS)
|
||||
ret = iwl_power_set_user_mode(priv, IWL_POWER_INDEX_3);
|
||||
else
|
||||
ret = iwl_power_set_user_mode(priv, IWL_POWER_MODE_CAM);
|
||||
if (ret)
|
||||
IWL_DEBUG_MAC80211(priv, "Error setting power level\n");
|
||||
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
||||
IWL_DEBUG_MAC80211(priv, "TX Power old=%d new=%d\n",
|
||||
priv->tx_power_user_lmt, conf->power_level);
|
||||
|
||||
iwl_set_tx_power(priv, conf->power_level, false);
|
||||
}
|
||||
|
||||
/* call to ensure that 4965 rx_chain is set properly in monitor mode */
|
||||
if (priv->cfg->ops->hcmd->set_rxon_chain)
|
||||
priv->cfg->ops->hcmd->set_rxon_chain(priv);
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_RADIO_ENABLED) {
|
||||
if (conf->radio_enabled &&
|
||||
iwl_radio_kill_sw_enable_radio(priv)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - RF-KILL - "
|
||||
"waiting for uCode\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!conf->radio_enabled)
|
||||
iwl_radio_kill_sw_disable_radio(priv);
|
||||
}
|
||||
|
||||
if (!conf->radio_enabled) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - radio disabled\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!iwl_is_ready(priv)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (scan_active)
|
||||
goto out;
|
||||
|
||||
if (memcmp(&priv->active_rxon,
|
||||
&priv->staging_rxon, sizeof(priv->staging_rxon)))
|
||||
iwlcore_commit_rxon(priv);
|
||||
else
|
||||
IWL_DEBUG_INFO(priv, "No re-sending same RXON configuration.\n");
|
||||
|
||||
|
||||
out:
|
||||
IWL_DEBUG_MAC80211(priv, "leave\n");
|
||||
mutex_unlock(&priv->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void iwl_config_ap(struct iwl_priv *priv)
|
||||
{
|
||||
int ret = 0;
|
||||
|
|
|
@ -2443,6 +2443,142 @@ void iwl_mac_remove_interface(struct ieee80211_hw *hw,
|
|||
}
|
||||
EXPORT_SYMBOL(iwl_mac_remove_interface);
|
||||
|
||||
/**
|
||||
* iwl_mac_config - mac80211 config callback
|
||||
*
|
||||
* We ignore conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME since it seems to
|
||||
* be set inappropriately and the driver currently sets the hardware up to
|
||||
* use it whenever needed.
|
||||
*/
|
||||
int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
{
|
||||
struct iwl_priv *priv = hw->priv;
|
||||
const struct iwl_channel_info *ch_info;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
unsigned long flags = 0;
|
||||
int ret = 0;
|
||||
u16 ch;
|
||||
int scan_active = 0;
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
if (!iwl_is_ready(priv)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
IWL_DEBUG_MAC80211(priv, "enter to channel %d changed 0x%X\n",
|
||||
conf->channel->hw_value, changed);
|
||||
|
||||
if (unlikely(!priv->cfg->mod_params->disable_hw_scan &&
|
||||
test_bit(STATUS_SCANNING, &priv->status))) {
|
||||
scan_active = 1;
|
||||
IWL_DEBUG_MAC80211(priv, "leave - scanning\n");
|
||||
}
|
||||
|
||||
|
||||
/* during scanning mac80211 will delay channel setting until
|
||||
* scan finish with changed = 0
|
||||
*/
|
||||
if (!changed || (changed & IEEE80211_CONF_CHANGE_CHANNEL)) {
|
||||
if (scan_active)
|
||||
goto set_ch_out;
|
||||
|
||||
ch = ieee80211_frequency_to_channel(conf->channel->center_freq);
|
||||
ch_info = iwl_get_channel_info(priv, conf->channel->band, ch);
|
||||
if (!is_channel_valid(ch_info)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - invalid channel\n");
|
||||
ret = -EINVAL;
|
||||
goto set_ch_out;
|
||||
}
|
||||
|
||||
if (priv->iw_mode == NL80211_IFTYPE_ADHOC &&
|
||||
!is_channel_ibss(ch_info)) {
|
||||
IWL_ERR(priv, "channel %d in band %d not "
|
||||
"IBSS channel\n",
|
||||
conf->channel->hw_value, conf->channel->band);
|
||||
ret = -EINVAL;
|
||||
goto set_ch_out;
|
||||
}
|
||||
|
||||
priv->current_ht_config.is_ht = conf_is_ht(conf);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
|
||||
/* if we are switching from ht to 2.4 clear flags
|
||||
* from any ht related info since 2.4 does not
|
||||
* support ht */
|
||||
if ((le16_to_cpu(priv->staging_rxon.channel) != ch))
|
||||
priv->staging_rxon.flags = 0;
|
||||
|
||||
iwl_set_rxon_channel(priv, conf->channel);
|
||||
|
||||
iwl_set_flags_for_band(priv, conf->channel->band);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
set_ch_out:
|
||||
/* The list of supported rates and rate mask can be different
|
||||
* for each band; since the band may have changed, reset
|
||||
* the rate mask to what mac80211 lists */
|
||||
iwl_set_rate(priv);
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_PS) {
|
||||
if (conf->flags & IEEE80211_CONF_PS)
|
||||
ret = iwl_power_set_user_mode(priv, IWL_POWER_INDEX_3);
|
||||
else
|
||||
ret = iwl_power_set_user_mode(priv, IWL_POWER_MODE_CAM);
|
||||
if (ret)
|
||||
IWL_DEBUG_MAC80211(priv, "Error setting power level\n");
|
||||
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_POWER) {
|
||||
IWL_DEBUG_MAC80211(priv, "TX Power old=%d new=%d\n",
|
||||
priv->tx_power_user_lmt, conf->power_level);
|
||||
|
||||
iwl_set_tx_power(priv, conf->power_level, false);
|
||||
}
|
||||
|
||||
/* call to ensure that 4965 rx_chain is set properly in monitor mode */
|
||||
if (priv->cfg->ops->hcmd->set_rxon_chain)
|
||||
priv->cfg->ops->hcmd->set_rxon_chain(priv);
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_RADIO_ENABLED) {
|
||||
if (conf->radio_enabled &&
|
||||
iwl_radio_kill_sw_enable_radio(priv)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - RF-KILL - "
|
||||
"waiting for uCode\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!conf->radio_enabled)
|
||||
iwl_radio_kill_sw_disable_radio(priv);
|
||||
}
|
||||
|
||||
if (!conf->radio_enabled) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - radio disabled\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (scan_active)
|
||||
goto out;
|
||||
|
||||
if (memcmp(&priv->active_rxon,
|
||||
&priv->staging_rxon, sizeof(priv->staging_rxon)))
|
||||
iwlcore_commit_rxon(priv);
|
||||
else
|
||||
IWL_DEBUG_INFO(priv, "Not re-sending same RXON configuration.\n");
|
||||
|
||||
|
||||
out:
|
||||
IWL_DEBUG_MAC80211(priv, "leave\n");
|
||||
mutex_unlock(&priv->mutex);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(iwl_mac_config);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
|
|
|
@ -278,6 +278,7 @@ int iwl_mac_add_interface(struct ieee80211_hw *hw,
|
|||
struct ieee80211_if_init_conf *conf);
|
||||
void iwl_mac_remove_interface(struct ieee80211_hw *hw,
|
||||
struct ieee80211_if_init_conf *conf);
|
||||
int iwl_mac_config(struct ieee80211_hw *hw, u32 changed);
|
||||
|
||||
/*****************************************************
|
||||
* RX handlers.
|
||||
|
|
|
@ -3166,8 +3166,6 @@ static void iwl3945_bg_rx_replenish(struct work_struct *data)
|
|||
mutex_unlock(&priv->mutex);
|
||||
}
|
||||
|
||||
static int iwl3945_mac_config(struct ieee80211_hw *hw, u32 changed);
|
||||
|
||||
#define IWL_DELAY_NEXT_SCAN (HZ*2)
|
||||
|
||||
void iwl3945_post_associate(struct iwl_priv *priv)
|
||||
|
@ -3380,108 +3378,6 @@ static int iwl3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* iwl3945_mac_config - mac80211 config callback
|
||||
*
|
||||
* We ignore conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME since it seems to
|
||||
* be set inappropriately and the driver currently sets the hardware up to
|
||||
* use it whenever needed.
|
||||
*/
|
||||
static int iwl3945_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||
{
|
||||
struct iwl_priv *priv = hw->priv;
|
||||
const struct iwl_channel_info *ch_info;
|
||||
struct ieee80211_conf *conf = &hw->conf;
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
IWL_DEBUG_MAC80211(priv, "enter to channel %d\n",
|
||||
conf->channel->hw_value);
|
||||
|
||||
if (!iwl_is_ready(priv)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (unlikely(!iwl3945_mod_params.disable_hw_scan &&
|
||||
test_bit(STATUS_SCANNING, &priv->status))) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - scanning\n");
|
||||
set_bit(STATUS_CONF_PENDING, &priv->status);
|
||||
mutex_unlock(&priv->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
ch_info = iwl_get_channel_info(priv, conf->channel->band,
|
||||
conf->channel->hw_value);
|
||||
if (!is_channel_valid(ch_info)) {
|
||||
IWL_DEBUG_SCAN(priv,
|
||||
"Channel %d [%d] is INVALID for this band.\n",
|
||||
conf->channel->hw_value, conf->channel->band);
|
||||
IWL_DEBUG_MAC80211(priv, "leave - invalid channel\n");
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
iwl_set_rxon_channel(priv, conf->channel);
|
||||
|
||||
iwl_set_flags_for_band(priv, conf->channel->band);
|
||||
|
||||
/* The list of supported rates and rate mask can be different
|
||||
* for each phymode; since the phymode may have changed, reset
|
||||
* the rate mask to what mac80211 lists */
|
||||
iwl_set_rate(priv);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
#ifdef IEEE80211_CONF_CHANNEL_SWITCH
|
||||
if (conf->flags & IEEE80211_CONF_CHANNEL_SWITCH) {
|
||||
iwl3945_hw_channel_switch(priv, conf->channel);
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_RADIO_ENABLED) {
|
||||
if (conf->radio_enabled &&
|
||||
iwl_radio_kill_sw_enable_radio(priv)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - RF-KILL - "
|
||||
"waiting for uCode\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!conf->radio_enabled) {
|
||||
iwl_radio_kill_sw_disable_radio(priv);
|
||||
IWL_DEBUG_MAC80211(priv, "leave - radio disabled\n");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if (iwl_is_rfkill(priv)) {
|
||||
IWL_DEBUG_MAC80211(priv, "leave - RF kill\n");
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
iwl_set_rate(priv);
|
||||
|
||||
if (memcmp(&priv->active_rxon,
|
||||
&priv->staging_rxon, sizeof(priv->staging_rxon)))
|
||||
iwlcore_commit_rxon(priv);
|
||||
else
|
||||
IWL_DEBUG_INFO(priv, "Not re-sending same RXON configuration\n");
|
||||
|
||||
IWL_DEBUG_MAC80211(priv, "leave\n");
|
||||
|
||||
out:
|
||||
clear_bit(STATUS_CONF_PENDING, &priv->status);
|
||||
mutex_unlock(&priv->mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void iwl3945_config_ap(struct iwl_priv *priv)
|
||||
{
|
||||
int rc = 0;
|
||||
|
@ -4316,7 +4212,7 @@ static struct ieee80211_ops iwl3945_hw_ops = {
|
|||
.stop = iwl3945_mac_stop,
|
||||
.add_interface = iwl_mac_add_interface,
|
||||
.remove_interface = iwl_mac_remove_interface,
|
||||
.config = iwl3945_mac_config,
|
||||
.config = iwl_mac_config,
|
||||
.config_interface = iwl3945_mac_config_interface,
|
||||
.configure_filter = iwl_configure_filter,
|
||||
.set_key = iwl3945_mac_set_key,
|
||||
|
|
Loading…
Reference in New Issue