memset(&mcs[rx_mcs_supp], 0,
sizeof(struct ieee80211_mcs_info) - rx_mcs_supp);
- if (priv->bss_mode == MWIFIEX_BSS_MODE_INFRA ||
+ if (priv->bss_mode == NL80211_IFTYPE_STATION ||
(ht_cap_info & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
/* Set MCS32 for infra mode or ad-hoc mode with 40MHz support */
SETHT_MCS32(ht_cap->ht_cap.mcs.rx_mask);
}
if (bss_desc->bcn_ht_info) {
- if (priv->bss_mode == MWIFIEX_BSS_MODE_IBSS) {
+ if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
ht_info = (struct mwifiex_ie_types_htinfo *) *buffer;
memset(ht_info, 0,
sizeof(struct mwifiex_ie_types_htinfo));
int ret = 0;
int status = 0;
struct mwifiex_ds_band_cfg band_cfg;
- int mode;
- u8 wait_option = MWIFIEX_IOCTL_WAIT;
u32 config_bands = 0;
struct wiphy *wiphy = priv->wdev->wiphy;
- mode = mwifiex_drv_get_mode(priv, wait_option);
-
if (chan) {
memset(&band_cfg, 0, sizeof(band_cfg));
/* Set appropriate bands */
config_bands = BAND_B | BAND_G | BAND_GN;
else
config_bands = BAND_AN | BAND_A;
- if (mode == MWIFIEX_BSS_MODE_INFRA
- || mode == MWIFIEX_BSS_MODE_AUTO) {
+ if (priv->bss_mode == NL80211_IFTYPE_STATION
+ || priv->bss_mode == NL80211_IFTYPE_UNSPECIFIED) {
band_cfg.config_bands = config_bands;
- } else if (mode == MWIFIEX_BSS_MODE_IBSS) {
+ } else if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
band_cfg.config_bands = config_bands;
band_cfg.adhoc_start_band = config_bands;
}
}
wiphy_dbg(wiphy, "info: setting band %d, channel offset %d and "
- "mode %d\n", config_bands, band_cfg.sec_chan_offset, mode);
+ "mode %d\n", config_bands, band_cfg.sec_chan_offset,
+ priv->bss_mode);
if (!chan)
return ret;
/*
* CFG802.11 operation handler to change interface type.
- *
- * This function creates an IOCTL request, populates it accordingly
- * and issues an IOCTL.
- *
- * The function also maps the CFG802.11 mode type into driver mode type.
- * NL80211_IFTYPE_ADHOC -> MWIFIEX_BSS_MODE_IBSS
- * NL80211_IFTYPE_STATION -> MWIFIEX_BSS_MODE_INFRA
- * NL80211_IFTYPE_UNSPECIFIED -> MWIFIEX_BSS_MODE_AUTO
*/
static int
mwifiex_cfg80211_change_virtual_intf(struct wiphy *wiphy,
{
int ret = 0;
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
- int mode = -1;
struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
- wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
- if (!wait)
- return -ENOMEM;
+ if (priv->bss_mode == type) {
+ wiphy_warn(wiphy, "already set to required type\n");
+ return 0;
+ }
+
+ priv->bss_mode = type;
switch (type) {
case NL80211_IFTYPE_ADHOC:
- mode = MWIFIEX_BSS_MODE_IBSS;
dev->ieee80211_ptr->iftype = NL80211_IFTYPE_ADHOC;
wiphy_dbg(wiphy, "info: setting interface type to adhoc\n");
break;
case NL80211_IFTYPE_STATION:
- mode = MWIFIEX_BSS_MODE_INFRA;
dev->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION;
- wiphy_dbg(wiphy, "info: Setting interface type to managed\n");
+ wiphy_dbg(wiphy, "info: setting interface type to managed\n");
break;
case NL80211_IFTYPE_UNSPECIFIED:
- mode = MWIFIEX_BSS_MODE_AUTO;
dev->ieee80211_ptr->iftype = NL80211_IFTYPE_STATION;
wiphy_dbg(wiphy, "info: setting interface type to auto\n");
- break;
+ return 0;
default:
- ret = -EINVAL;
+ wiphy_err(wiphy, "unknown interface type: %d\n", type);
+ return -EINVAL;
}
- if (ret)
- goto done;
- status = mwifiex_bss_ioctl_mode(priv, wait, HostCmd_ACT_GEN_SET, &mode);
- if (mwifiex_request_ioctl(priv, wait, status, MWIFIEX_IOCTL_WAIT))
+ wait = mwifiex_alloc_fill_wait_queue(priv, MWIFIEX_IOCTL_WAIT);
+ if (!wait)
+ return -ENOMEM;
+
+ mwifiex_deauthenticate(priv, wait, NULL);
+
+ priv->sec_info.authentication_mode = MWIFIEX_AUTH_MODE_OPEN;
+
+ ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_SET_BSS_MODE,
+ HostCmd_ACT_GEN_SET, 0, wait, NULL);
+ if (!ret)
+ ret = -EINPROGRESS;
+
+ ret = mwifiex_request_ioctl(priv, wait, ret, MWIFIEX_IOCTL_WAIT);
+ if (ret)
ret = -EFAULT;
-done:
kfree(wait);
return ret;
}
ret = mwifiex_set_encode(priv, NULL, 0, 0, 1); /* Disable keys */
- if (mode == MWIFIEX_BSS_MODE_IBSS) {
+ if (mode == NL80211_IFTYPE_ADHOC) {
/* "privacy" is set only for ad-hoc mode */
if (privacy) {
/*
memcpy(&ssid_bssid.ssid, &req_ssid, sizeof(struct mwifiex_802_11_ssid));
- if (mode != MWIFIEX_BSS_MODE_IBSS) {
+ if (mode != NL80211_IFTYPE_ADHOC) {
if (mwifiex_find_best_bss(priv, MWIFIEX_IOCTL_WAIT,
&ssid_bssid))
return -EFAULT;
if (mwifiex_bss_start(priv, MWIFIEX_IOCTL_WAIT, &ssid_bssid))
return -EFAULT;
- if (mode == MWIFIEX_BSS_MODE_IBSS) {
+ if (mode == NL80211_IFTYPE_ADHOC) {
/* Inform the BSS information to kernel, otherwise
* kernel will give a panic after successful assoc */
if (mwifiex_cfg80211_inform_ibss_bss(priv))
{
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
int ret = 0;
- int mode = 0;
if (priv->assoc_request)
return -EBUSY;
- mode = mwifiex_drv_get_mode(priv, MWIFIEX_IOCTL_WAIT);
-
- if (mode == MWIFIEX_BSS_MODE_IBSS) {
+ if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
wiphy_err(wiphy, "received infra assoc request "
"when station is in ibss mode\n");
goto done;
(char *) sme->ssid, sme->bssid);
ret = mwifiex_cfg80211_assoc(priv, sme->ssid_len, sme->ssid, sme->bssid,
- mode, sme->channel, sme, 0);
+ priv->bss_mode, sme->channel, sme, 0);
done:
priv->assoc_result = ret;
{
struct mwifiex_private *priv = mwifiex_cfg80211_get_priv(wiphy);
int ret = 0;
- int mode = 0;
if (priv->ibss_join_request)
return -EBUSY;
- mode = mwifiex_drv_get_mode(priv, MWIFIEX_IOCTL_WAIT);
- if (mode != MWIFIEX_BSS_MODE_IBSS) {
+ if (priv->bss_mode != NL80211_IFTYPE_ADHOC) {
wiphy_err(wiphy, "request to join ibss received "
"when station is not in ibss mode\n");
goto done;
(char *) params->ssid, params->bssid);
ret = mwifiex_cfg80211_assoc(priv, params->ssid_len, params->ssid,
- params->bssid, mode, params->channel, NULL,
- params->privacy);
+ params->bssid, priv->bss_mode,
+ params->channel, NULL, params->privacy);
done:
priv->ibss_join_result = ret;
queue_work(priv->workqueue, &priv->cfg_workqueue);
/* Clear all the other values */
memset(&mcs[rx_mcs_supp], 0,
sizeof(struct ieee80211_mcs_info) - rx_mcs_supp);
- if (priv->bss_mode == MWIFIEX_BSS_MODE_INFRA ||
+ if (priv->bss_mode == NL80211_IFTYPE_STATION ||
ISSUPP_CHANWIDTH40(adapter->hw_dot_11n_dev_cap))
/* Set MCS32 for infra mode or ad-hoc mode with 40MHz support */
SETHT_MCS32(mcs_set.rx_mask);
{
u32 k = 0;
struct mwifiex_adapter *adapter = priv->adapter;
- if (priv->bss_mode == MWIFIEX_BSS_MODE_INFRA) {
- /* Infra. mode */
+ if (priv->bss_mode == NL80211_IFTYPE_STATION) {
switch (adapter->config_bands) {
case BAND_B:
dev_dbg(adapter->dev, "info: infra band=%d "
memset(priv->curr_addr, 0xff, ETH_ALEN);
priv->pkt_tx_ctrl = 0;
- priv->bss_mode = MWIFIEX_BSS_MODE_INFRA;
+ priv->bss_mode = NL80211_IFTYPE_STATION;
priv->data_rate = 0; /* Initially indicate the rate as auto */
priv->is_data_rate_auto = true;
priv->bcn_avg_factor = DEFAULT_BCN_AVG_FACTOR;
u8 *scan_table;
};
-enum {
- MWIFIEX_BSS_MODE_INFRA = 1,
- MWIFIEX_BSS_MODE_IBSS,
- MWIFIEX_BSS_MODE_AUTO
-};
-
#define MWIFIEX_PROMISC_MODE 1
#define MWIFIEX_MULTICAST_MODE 2
#define MWIFIEX_ALL_MULTI_MODE 4
/* Set the BSS mode */
adhoc_start->bss_mode = HostCmd_BSS_MODE_IBSS;
- bss_desc->bss_mode = MWIFIEX_BSS_MODE_IBSS;
+ bss_desc->bss_mode = NL80211_IFTYPE_ADHOC;
adhoc_start->beacon_period = cpu_to_le16(priv->beacon_period);
bss_desc->beacon_period = priv->beacon_period;
u8 current_bssid[ETH_ALEN];
/* Return error if the adapter or table entry is not marked as infra */
- if ((priv->bss_mode != MWIFIEX_BSS_MODE_INFRA) ||
- (bss_desc->bss_mode != MWIFIEX_BSS_MODE_INFRA))
+ if ((priv->bss_mode != NL80211_IFTYPE_STATION) ||
+ (bss_desc->bss_mode != NL80211_IFTYPE_STATION))
return -1;
memcpy(¤t_bssid,
!mwifiex_ssid_cmp(&bss_desc->ssid,
&priv->curr_bss_params.bss_descriptor.ssid) &&
(priv->curr_bss_params.bss_descriptor.bss_mode ==
- MWIFIEX_BSS_MODE_IBSS)) {
+ NL80211_IFTYPE_ADHOC)) {
dev_dbg(priv->adapter->dev, "info: ADHOC_J_CMD: new ad-hoc SSID"
" is the same as current; not attempting to re-join\n");
return -1;
int ret = 0;
if (priv->media_connected) {
- if (priv->bss_mode == MWIFIEX_BSS_MODE_INFRA) {
+ if (priv->bss_mode == NL80211_IFTYPE_STATION) {
ret = mwifiex_deauthenticate_infra(priv, wait, mac);
- } else if (priv->bss_mode == MWIFIEX_BSS_MODE_IBSS) {
+ } else if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
ret = mwifiex_prepare_cmd(priv,
HostCmd_CMD_802_11_AD_HOC_STOP,
HostCmd_ACT_GEN_SET, 0, wait, NULL);
* Currently we assume if we are in Infra, then DA=RA. This might not be
* true in the future
*/
- if ((priv->bss_mode == MWIFIEX_BSS_MODE_INFRA) &&
+ if ((priv->bss_mode == NL80211_IFTYPE_STATION) &&
(GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA))
return false;
int mwifiex_change_adhoc_chan(struct mwifiex_private *priv, int channel);
int mwifiex_set_radio(struct mwifiex_private *priv, u8 option);
-int mwifiex_drv_get_mode(struct mwifiex_private *priv, u8 wait_option);
-
int mwifiex_drv_change_adhoc_chan(struct mwifiex_private *priv, int channel);
int mwifiex_set_encode(struct mwifiex_private *priv, const u8 *key,
int mwifiex_main_process(struct mwifiex_adapter *);
-int mwifiex_bss_ioctl_mode(struct mwifiex_private *,
- struct mwifiex_wait_queue *,
- u16 action, int *mode);
int mwifiex_bss_ioctl_channel(struct mwifiex_private *,
u16 action,
struct mwifiex_chan_freq_power *cfp);
bss_desc->disable_11n = false;
/* Don't check for compatibility if roaming */
- if (priv->media_connected && (priv->bss_mode == MWIFIEX_BSS_MODE_INFRA)
- && (bss_desc->bss_mode == MWIFIEX_BSS_MODE_INFRA))
+ if (priv->media_connected && (priv->bss_mode == NL80211_IFTYPE_STATION)
+ && (bss_desc->bss_mode == NL80211_IFTYPE_STATION))
return index;
if (priv->wps.session_enable) {
for (i = 0; i < adapter->num_in_scan_table; i++) {
switch (mode) {
- case MWIFIEX_BSS_MODE_INFRA:
- case MWIFIEX_BSS_MODE_IBSS:
+ case NL80211_IFTYPE_STATION:
+ case NL80211_IFTYPE_ADHOC:
if (mwifiex_is_network_compatible(priv, i, mode) >= 0) {
if (SCAN_RSSI(adapter->scan_table[i].rssi) >
best_rssi) {
}
}
break;
- case MWIFIEX_BSS_MODE_AUTO:
+ case NL80211_IFTYPE_UNSPECIFIED:
default:
if (SCAN_RSSI(adapter->scan_table[i].rssi) >
best_rssi) {
}
if (bss_entry->cap_info_bitmap & WLAN_CAPABILITY_IBSS)
- bss_entry->bss_mode = MWIFIEX_BSS_MODE_IBSS;
+ bss_entry->bss_mode = NL80211_IFTYPE_ADHOC;
else
- bss_entry->bss_mode = MWIFIEX_BSS_MODE_INFRA;
+ bss_entry->bss_mode = NL80211_IFTYPE_STATION;
/* Process variable IE */
searching the table for multiple entires for the SSID until no
more are found */
while ((table_idx = mwifiex_find_ssid_in_list(priv, del_ssid, NULL,
- MWIFIEX_BSS_MODE_AUTO)) >=
- 0) {
+ NL80211_IFTYPE_UNSPECIFIED)) >= 0) {
dev_dbg(priv->adapter->dev,
"info: Scan: Delete SSID Entry: Found Idx = %d\n",
table_idx);
(priv, (u8) adapter->scan_table[i].bss_band,
(u16) adapter->scan_table[i].channel))) {
switch (mode) {
- case MWIFIEX_BSS_MODE_INFRA:
- case MWIFIEX_BSS_MODE_IBSS:
+ case NL80211_IFTYPE_STATION:
+ case NL80211_IFTYPE_ADHOC:
j = mwifiex_is_network_compatible(priv, i,
mode);
net = j;
}
break;
- case MWIFIEX_BSS_MODE_AUTO:
+ case NL80211_IFTYPE_UNSPECIFIED:
default:
/*
* Do not check compatibility if the mode
scan_table[i].
channel)) {
switch (mode) {
- case MWIFIEX_BSS_MODE_INFRA:
- case MWIFIEX_BSS_MODE_IBSS:
+ case NL80211_IFTYPE_STATION:
+ case NL80211_IFTYPE_ADHOC:
net = mwifiex_is_network_compatible(priv, i,
mode);
break;
(u8 *) &req_bss->mac_address, ETH_ALEN);
/* Make sure we are in the right mode */
- if (priv->bss_mode == MWIFIEX_BSS_MODE_AUTO)
+ if (priv->bss_mode == NL80211_IFTYPE_UNSPECIFIED)
priv->bss_mode = req_bss->bss_mode;
}
break;
case HostCmd_CMD_SET_BSS_MODE:
cmd_ptr->command = cpu_to_le16(cmd_no);
- if (priv->bss_mode == MWIFIEX_BSS_MODE_IBSS)
+ if (priv->bss_mode == NL80211_IFTYPE_ADHOC)
cmd_ptr->params.bss_mode.con_type =
CONNECTION_TYPE_ADHOC;
- else if (priv->bss_mode == MWIFIEX_BSS_MODE_INFRA)
+ else if (priv->bss_mode == NL80211_IFTYPE_STATION)
cmd_ptr->params.bss_mode.con_type =
CONNECTION_TYPE_INFRA;
cmd_ptr->size = cpu_to_le16(sizeof(struct
if (le16_to_cpu(pm->action) == EN_AUTO_PS &&
(le16_to_cpu(pm->params.auto_ps.ps_bitmap) &
BITMAP_STA_PS)
- && priv->bss_mode == MWIFIEX_BSS_MODE_IBSS)
+ && priv->bss_mode == NL80211_IFTYPE_ADHOC)
adapter->ps_mode =
MWIFIEX_802_11_POWER_MODE_CAM;
}
priv->is_data_rate_auto = true;
priv->data_rate = 0;
- if (priv->bss_mode == MWIFIEX_BSS_MODE_IBSS) {
+ if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
priv->adhoc_state = ADHOC_IDLE;
priv->adhoc_is_link_sensed = false;
}
if (!ssid_bssid)
return -1;
- if (priv->bss_mode == MWIFIEX_BSS_MODE_INFRA) {
+ if (priv->bss_mode == NL80211_IFTYPE_STATION) {
/* Infra mode */
ret = mwifiex_deauthenticate(priv, NULL, NULL);
if (ret)
/* Search for the requested SSID in the scan table */
if (ssid_bssid->ssid.ssid_len)
i = mwifiex_find_ssid_in_list(priv, &ssid_bssid->ssid,
- NULL, MWIFIEX_BSS_MODE_INFRA);
+ NULL, NL80211_IFTYPE_STATION);
else
i = mwifiex_find_bssid_in_list(priv,
(u8 *) &ssid_bssid->bssid,
- MWIFIEX_BSS_MODE_INFRA);
+ NL80211_IFTYPE_STATION);
if (i < 0)
return -1;
if (ssid_bssid->ssid.ssid_len)
i = mwifiex_find_ssid_in_list(priv,
&ssid_bssid->ssid, NULL,
- MWIFIEX_BSS_MODE_IBSS);
+ NL80211_IFTYPE_ADHOC);
else
i = mwifiex_find_bssid_in_list(priv,
(u8 *)&ssid_bssid->bssid,
- MWIFIEX_BSS_MODE_IBSS);
+ NL80211_IFTYPE_ADHOC);
if (i >= 0) {
dev_dbg(adapter->dev, "info: network found in scan"
return 0;
}
-/*
- * IOCTL request handler to set/get BSS mode.
- *
- * This function prepares the correct firmware command and
- * issues it to set or get the BSS mode.
- *
- * In case the mode is changed, a deauthentication is performed
- * first by the function automatically.
- */
-int mwifiex_bss_ioctl_mode(struct mwifiex_private *priv,
- struct mwifiex_wait_queue *wait,
- u16 action, int *mode)
-{
- int ret = 0;
-
- if (!mode)
- return -1;
-
- if (action == HostCmd_ACT_GEN_GET) {
- *mode = priv->bss_mode;
- return 0;
- }
-
- if ((priv->bss_mode == *mode) || (*mode == MWIFIEX_BSS_MODE_AUTO)) {
- dev_dbg(priv->adapter->dev,
- "info: Already set to required mode! No change!\n");
- priv->bss_mode = *mode;
- return 0;
- }
-
- ret = mwifiex_deauthenticate(priv, wait, NULL);
-
- priv->sec_info.authentication_mode = MWIFIEX_AUTH_MODE_OPEN;
- priv->bss_mode = *mode;
- if (priv->bss_mode != MWIFIEX_BSS_MODE_AUTO) {
- ret = mwifiex_prepare_cmd(priv, HostCmd_CMD_SET_BSS_MODE,
- HostCmd_ACT_GEN_SET, 0, wait, NULL);
- if (!ret)
- ret = -EINPROGRESS;
- }
-
- return ret;
-}
-
/*
* IOCTL request handler to set/get Ad-Hoc channel.
*
return ret;
}
-/*
- * IOCTL request handler to get current driver mode.
- *
- * This function allocates the IOCTL request buffer, fills it
- * with requisite parameters and calls the IOCTL handler.
- */
-int
-mwifiex_drv_get_mode(struct mwifiex_private *priv, u8 wait_option)
-{
- struct mwifiex_wait_queue *wait = NULL;
- int status = 0;
- int mode = -1;
-
- /* Allocate wait buffer */
- wait = mwifiex_alloc_fill_wait_queue(priv, wait_option);
- if (!wait)
- return -1;
-
- status = mwifiex_bss_ioctl_mode(priv, wait, HostCmd_ACT_GEN_GET, &mode);
-
- status = mwifiex_request_ioctl(priv, wait, status, wait_option);
-
- if (wait && (status != -EINPROGRESS))
- kfree(wait);
- return mode;
-}
-
/*
* IOCTL request handler to get rate.
*
return -1;
}
- if (priv->bss_mode == MWIFIEX_BSS_MODE_IBSS) {
+ if (priv->bss_mode == NL80211_IFTYPE_ADHOC) {
/*
* IBSS/WPA-None uses only one key (Group) for both receiving
* and sending unicast and multicast packets.