Skip to content
Snippets Groups Projects
Commit 398f9e76 authored by Assaf Krauss's avatar Assaf Krauss Committed by John W. Linville
Browse files

iwlwifi: Fix mode changes (ad-hoc <--> managed)


This fix allows to move between modes (ad-hoc to managed, and vice versa).
Since mode changes can only be done while driver is down, check for ibss
support can only be made when the channel is set (afte the driver goes up).

Signed-off-by: default avatarAssaf Krauss <assaf.krauss@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c46fbefa
Branches
Tags
No related merge requests found
...@@ -1176,22 +1176,11 @@ static void iwl4965_connection_init_rx_config(struct iwl_priv *priv) ...@@ -1176,22 +1176,11 @@ static void iwl4965_connection_init_rx_config(struct iwl_priv *priv)
static int iwl4965_set_mode(struct iwl_priv *priv, int mode) static int iwl4965_set_mode(struct iwl_priv *priv, int mode)
{ {
if (mode == IEEE80211_IF_TYPE_IBSS) {
const struct iwl_channel_info *ch_info;
ch_info = iwl_get_channel_info(priv,
priv->band,
le16_to_cpu(priv->staging_rxon.channel));
if (!ch_info || !is_channel_ibss(ch_info)) {
IWL_ERROR("channel %d not IBSS channel\n",
le16_to_cpu(priv->staging_rxon.channel));
return -EINVAL;
}
}
priv->iw_mode = mode; priv->iw_mode = mode;
/* init channel/phymode to values given at driver init */
iwl_set_rxon_channel(priv, IEEE80211_BAND_2GHZ, 6);
iwl4965_connection_init_rx_config(priv); iwl4965_connection_init_rx_config(priv);
memcpy(priv->staging_rxon.node_addr, priv->mac_addr, ETH_ALEN); memcpy(priv->staging_rxon.node_addr, priv->mac_addr, ETH_ALEN);
...@@ -3892,6 +3881,14 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co ...@@ -3892,6 +3881,14 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *co
goto out; goto out;
} }
if (priv->iw_mode == IEEE80211_IF_TYPE_IBSS &&
!is_channel_ibss(ch_info)) {
IWL_ERROR("channel %d in band %d not IBSS channel\n",
conf->channel->hw_value, conf->channel->band);
ret = -EINVAL;
goto out;
}
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
/* if we are switching from ht to 2.4 clear flags /* if we are switching from ht to 2.4 clear flags
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment