|
@@ -90,153 +90,6 @@ MODULE_ALIAS("iwl4965");
|
|
|
static int iwlagn_ant_coupling;
|
|
|
static bool iwlagn_bt_ch_announce = 1;
|
|
|
|
|
|
-/**
|
|
|
- * iwlagn_commit_rxon - commit staging_rxon to hardware
|
|
|
- *
|
|
|
- * The RXON command in staging_rxon is committed to the hardware and
|
|
|
- * the active_rxon structure is updated with the new data. This
|
|
|
- * function correctly transitions out of the RXON_ASSOC_MSK state if
|
|
|
- * a HW tune is required based on the RXON structure changes.
|
|
|
- */
|
|
|
-int iwlagn_commit_rxon(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
|
|
-{
|
|
|
- /* cast away the const for active_rxon in this function */
|
|
|
- struct iwl_rxon_cmd *active_rxon = (void *)&ctx->active;
|
|
|
- int ret;
|
|
|
- bool new_assoc =
|
|
|
- !!(ctx->staging.filter_flags & RXON_FILTER_ASSOC_MSK);
|
|
|
-
|
|
|
- if (!iwl_is_alive(priv))
|
|
|
- return -EBUSY;
|
|
|
-
|
|
|
- if (!ctx->is_active)
|
|
|
- return 0;
|
|
|
-
|
|
|
- /* always get timestamp with Rx frame */
|
|
|
- ctx->staging.flags |= RXON_FLG_TSF2HOST_MSK;
|
|
|
-
|
|
|
- ret = iwl_check_rxon_cmd(priv, ctx);
|
|
|
- if (ret) {
|
|
|
- IWL_ERR(priv, "Invalid RXON configuration. Not committing.\n");
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * receive commit_rxon request
|
|
|
- * abort any previous channel switch if still in process
|
|
|
- */
|
|
|
- if (priv->switch_rxon.switch_in_progress &&
|
|
|
- (priv->switch_rxon.channel != ctx->staging.channel)) {
|
|
|
- IWL_DEBUG_11H(priv, "abort channel switch on %d\n",
|
|
|
- le16_to_cpu(priv->switch_rxon.channel));
|
|
|
- iwl_chswitch_done(priv, false);
|
|
|
- }
|
|
|
-
|
|
|
- /* If we don't need to send a full RXON, we can use
|
|
|
- * iwl_rxon_assoc_cmd which is used to reconfigure filter
|
|
|
- * and other flags for the current radio configuration. */
|
|
|
- if (!iwl_full_rxon_required(priv, ctx)) {
|
|
|
- ret = iwl_send_rxon_assoc(priv, ctx);
|
|
|
- if (ret) {
|
|
|
- IWL_ERR(priv, "Error setting RXON_ASSOC (%d)\n", ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon));
|
|
|
- iwl_print_rx_config_cmd(priv, ctx);
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- /* If we are currently associated and the new config requires
|
|
|
- * an RXON_ASSOC and the new config wants the associated mask enabled,
|
|
|
- * we must clear the associated from the active configuration
|
|
|
- * before we apply the new config */
|
|
|
- if (iwl_is_associated_ctx(ctx) && new_assoc) {
|
|
|
- IWL_DEBUG_INFO(priv, "Toggling associated bit on current RXON\n");
|
|
|
- active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
-
|
|
|
- ret = iwl_send_cmd_pdu(priv, ctx->rxon_cmd,
|
|
|
- sizeof(struct iwl_rxon_cmd),
|
|
|
- active_rxon);
|
|
|
-
|
|
|
- /* If the mask clearing failed then we set
|
|
|
- * active_rxon back to what it was previously */
|
|
|
- if (ret) {
|
|
|
- active_rxon->filter_flags |= RXON_FILTER_ASSOC_MSK;
|
|
|
- IWL_ERR(priv, "Error clearing ASSOC_MSK (%d)\n", ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
- iwl_clear_ucode_stations(priv, ctx);
|
|
|
- iwl_restore_stations(priv, ctx);
|
|
|
- ret = iwl_restore_default_wep_keys(priv, ctx);
|
|
|
- if (ret) {
|
|
|
- IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- IWL_DEBUG_INFO(priv, "Sending RXON\n"
|
|
|
- "* with%s RXON_FILTER_ASSOC_MSK\n"
|
|
|
- "* channel = %d\n"
|
|
|
- "* bssid = %pM\n",
|
|
|
- (new_assoc ? "" : "out"),
|
|
|
- le16_to_cpu(ctx->staging.channel),
|
|
|
- ctx->staging.bssid_addr);
|
|
|
-
|
|
|
- iwl_set_rxon_hwcrypto(priv, ctx, !priv->cfg->mod_params->sw_crypto);
|
|
|
-
|
|
|
- if (priv->cfg->ops->hcmd->set_pan_params) {
|
|
|
- ret = priv->cfg->ops->hcmd->set_pan_params(priv);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- /* Apply the new configuration
|
|
|
- * RXON unassoc clears the station table in uCode so restoration of
|
|
|
- * stations is needed after it (the RXON command) completes
|
|
|
- */
|
|
|
- if (!new_assoc) {
|
|
|
- ret = iwl_send_cmd_pdu(priv, ctx->rxon_cmd,
|
|
|
- sizeof(struct iwl_rxon_cmd), &ctx->staging);
|
|
|
- if (ret) {
|
|
|
- IWL_ERR(priv, "Error setting new RXON (%d)\n", ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
- IWL_DEBUG_INFO(priv, "Return from !new_assoc RXON.\n");
|
|
|
- memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon));
|
|
|
- iwl_clear_ucode_stations(priv, ctx);
|
|
|
- iwl_restore_stations(priv, ctx);
|
|
|
- ret = iwl_restore_default_wep_keys(priv, ctx);
|
|
|
- if (ret) {
|
|
|
- IWL_ERR(priv, "Failed to restore WEP keys (%d)\n", ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
- }
|
|
|
- if (new_assoc) {
|
|
|
- priv->start_calib = 0;
|
|
|
- /* Apply the new configuration
|
|
|
- * RXON assoc doesn't clear the station table in uCode,
|
|
|
- */
|
|
|
- ret = iwl_send_cmd_pdu(priv, ctx->rxon_cmd,
|
|
|
- sizeof(struct iwl_rxon_cmd), &ctx->staging);
|
|
|
- if (ret) {
|
|
|
- IWL_ERR(priv, "Error setting new RXON (%d)\n", ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
- memcpy(active_rxon, &ctx->staging, sizeof(*active_rxon));
|
|
|
- }
|
|
|
- iwl_print_rx_config_cmd(priv, ctx);
|
|
|
-
|
|
|
- iwl_init_sensitivity(priv);
|
|
|
-
|
|
|
- /* If we issue a new RXON command which required a tune then we must
|
|
|
- * send a new TXPOWER command or we won't be able to Tx any frames */
|
|
|
- ret = priv->cfg->ops->lib->send_tx_power(priv);
|
|
|
- if (ret)
|
|
|
- IWL_ERR(priv, "Error sending TX power (%d)\n", ret);
|
|
|
- return ret;
|
|
|
-}
|
|
|
-
|
|
|
void iwl_update_chain_flags(struct iwl_priv *priv)
|
|
|
{
|
|
|
struct iwl_rxon_context *ctx;
|
|
@@ -394,7 +247,8 @@ static unsigned int iwl_hw_get_beacon_cmd(struct iwl_priv *priv,
|
|
|
|
|
|
return sizeof(*tx_beacon_cmd) + frame_size;
|
|
|
}
|
|
|
-static int iwl_send_beacon_cmd(struct iwl_priv *priv)
|
|
|
+
|
|
|
+int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
|
|
|
{
|
|
|
struct iwl_frame *frame;
|
|
|
unsigned int frame_size;
|
|
@@ -644,7 +498,7 @@ static void iwl_bg_beacon_update(struct work_struct *work)
|
|
|
|
|
|
priv->beacon_skb = beacon;
|
|
|
|
|
|
- iwl_send_beacon_cmd(priv);
|
|
|
+ iwlagn_send_beacon_cmd(priv);
|
|
|
out:
|
|
|
mutex_unlock(&priv->mutex);
|
|
|
}
|
|
@@ -3292,92 +3146,6 @@ static void iwl_bg_rx_replenish(struct work_struct *data)
|
|
|
mutex_unlock(&priv->mutex);
|
|
|
}
|
|
|
|
|
|
-#define IWL_DELAY_NEXT_SCAN (HZ*2)
|
|
|
-
|
|
|
-void iwl_post_associate(struct iwl_priv *priv, struct ieee80211_vif *vif)
|
|
|
-{
|
|
|
- struct iwl_rxon_context *ctx;
|
|
|
- struct ieee80211_conf *conf = NULL;
|
|
|
- int ret = 0;
|
|
|
-
|
|
|
- if (!vif || !priv->is_open)
|
|
|
- return;
|
|
|
-
|
|
|
- ctx = iwl_rxon_ctx_from_vif(vif);
|
|
|
-
|
|
|
- if (vif->type == NL80211_IFTYPE_AP) {
|
|
|
- IWL_ERR(priv, "%s Should not be called in AP mode\n", __func__);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
|
|
- return;
|
|
|
-
|
|
|
- iwl_scan_cancel_timeout(priv, 200);
|
|
|
-
|
|
|
- conf = ieee80211_get_hw_conf(priv->hw);
|
|
|
-
|
|
|
- ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
- iwlcore_commit_rxon(priv, ctx);
|
|
|
-
|
|
|
- ret = iwl_send_rxon_timing(priv, ctx);
|
|
|
- if (ret)
|
|
|
- IWL_WARN(priv, "RXON timing - "
|
|
|
- "Attempting to continue.\n");
|
|
|
-
|
|
|
- ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
|
|
|
-
|
|
|
- iwl_set_rxon_ht(priv, &priv->current_ht_config);
|
|
|
-
|
|
|
- if (priv->cfg->ops->hcmd->set_rxon_chain)
|
|
|
- priv->cfg->ops->hcmd->set_rxon_chain(priv, ctx);
|
|
|
-
|
|
|
- ctx->staging.assoc_id = cpu_to_le16(vif->bss_conf.aid);
|
|
|
-
|
|
|
- IWL_DEBUG_ASSOC(priv, "assoc id %d beacon interval %d\n",
|
|
|
- vif->bss_conf.aid, vif->bss_conf.beacon_int);
|
|
|
-
|
|
|
- if (vif->bss_conf.use_short_preamble)
|
|
|
- ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
- else
|
|
|
- ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
-
|
|
|
- if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK) {
|
|
|
- if (vif->bss_conf.use_short_slot)
|
|
|
- ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK;
|
|
|
- else
|
|
|
- ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK;
|
|
|
- }
|
|
|
-
|
|
|
- iwlcore_commit_rxon(priv, ctx);
|
|
|
-
|
|
|
- IWL_DEBUG_ASSOC(priv, "Associated as %d to: %pM\n",
|
|
|
- vif->bss_conf.aid, ctx->active.bssid_addr);
|
|
|
-
|
|
|
- switch (vif->type) {
|
|
|
- case NL80211_IFTYPE_STATION:
|
|
|
- break;
|
|
|
- case NL80211_IFTYPE_ADHOC:
|
|
|
- iwl_send_beacon_cmd(priv);
|
|
|
- break;
|
|
|
- default:
|
|
|
- IWL_ERR(priv, "%s Should not be called in %d mode\n",
|
|
|
- __func__, vif->type);
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- /* the chain noise calibration will enabled PM upon completion
|
|
|
- * If chain noise has already been run, then we need to enable
|
|
|
- * power management here */
|
|
|
- if (priv->chain_noise_data.state == IWL_CHAIN_NOISE_DONE)
|
|
|
- iwl_power_update_mode(priv, false);
|
|
|
-
|
|
|
- /* Enable Rx differential gain and sensitivity calibrations */
|
|
|
- iwl_chain_noise_reset(priv);
|
|
|
- priv->start_calib = 1;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
/*****************************************************************************
|
|
|
*
|
|
|
* mac80211 entry point functions
|
|
@@ -3457,7 +3225,7 @@ static int iwl_mac_setup_register(struct iwl_priv *priv,
|
|
|
}
|
|
|
|
|
|
|
|
|
-static int iwl_mac_start(struct ieee80211_hw *hw)
|
|
|
+int iwlagn_mac_start(struct ieee80211_hw *hw)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
int ret;
|
|
@@ -3498,7 +3266,7 @@ out:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void iwl_mac_stop(struct ieee80211_hw *hw)
|
|
|
+void iwlagn_mac_stop(struct ieee80211_hw *hw)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
|
|
@@ -3520,7 +3288,7 @@ static void iwl_mac_stop(struct ieee80211_hw *hw)
|
|
|
IWL_DEBUG_MAC80211(priv, "leave\n");
|
|
|
}
|
|
|
|
|
|
-static int iwl_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|
|
+int iwlagn_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
|
|
@@ -3536,73 +3304,12 @@ static int iwl_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|
|
return NETDEV_TX_OK;
|
|
|
}
|
|
|
|
|
|
-void iwl_config_ap(struct iwl_priv *priv, struct ieee80211_vif *vif)
|
|
|
-{
|
|
|
- struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
|
|
|
- int ret = 0;
|
|
|
-
|
|
|
- lockdep_assert_held(&priv->mutex);
|
|
|
-
|
|
|
- if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
|
|
- return;
|
|
|
-
|
|
|
- /* The following should be done only at AP bring up */
|
|
|
- if (!iwl_is_associated_ctx(ctx)) {
|
|
|
-
|
|
|
- /* RXON - unassoc (to set timing command) */
|
|
|
- ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
|
|
- iwlcore_commit_rxon(priv, ctx);
|
|
|
-
|
|
|
- /* RXON Timing */
|
|
|
- ret = iwl_send_rxon_timing(priv, ctx);
|
|
|
- if (ret)
|
|
|
- IWL_WARN(priv, "RXON timing failed - "
|
|
|
- "Attempting to continue.\n");
|
|
|
-
|
|
|
- /* AP has all antennas */
|
|
|
- priv->chain_noise_data.active_chains =
|
|
|
- priv->hw_params.valid_rx_ant;
|
|
|
- iwl_set_rxon_ht(priv, &priv->current_ht_config);
|
|
|
- if (priv->cfg->ops->hcmd->set_rxon_chain)
|
|
|
- priv->cfg->ops->hcmd->set_rxon_chain(priv, ctx);
|
|
|
-
|
|
|
- ctx->staging.assoc_id = 0;
|
|
|
-
|
|
|
- if (vif->bss_conf.use_short_preamble)
|
|
|
- ctx->staging.flags |=
|
|
|
- RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
- else
|
|
|
- ctx->staging.flags &=
|
|
|
- ~RXON_FLG_SHORT_PREAMBLE_MSK;
|
|
|
-
|
|
|
- if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK) {
|
|
|
- if (vif->bss_conf.use_short_slot)
|
|
|
- ctx->staging.flags |=
|
|
|
- RXON_FLG_SHORT_SLOT_MSK;
|
|
|
- else
|
|
|
- ctx->staging.flags &=
|
|
|
- ~RXON_FLG_SHORT_SLOT_MSK;
|
|
|
- }
|
|
|
- /* need to send beacon cmd before committing assoc RXON! */
|
|
|
- iwl_send_beacon_cmd(priv);
|
|
|
- /* restore RXON assoc */
|
|
|
- ctx->staging.filter_flags |= RXON_FILTER_ASSOC_MSK;
|
|
|
- iwlcore_commit_rxon(priv, ctx);
|
|
|
- }
|
|
|
- iwl_send_beacon_cmd(priv);
|
|
|
-
|
|
|
- /* FIXME - we need to add code here to detect a totally new
|
|
|
- * configuration, reset the AP, unassoc, rxon timing, assoc,
|
|
|
- * clear sta table, add BCAST sta... */
|
|
|
-}
|
|
|
-
|
|
|
-static void iwl_mac_update_tkip_key(struct ieee80211_hw *hw,
|
|
|
- struct ieee80211_vif *vif,
|
|
|
- struct ieee80211_key_conf *keyconf,
|
|
|
- struct ieee80211_sta *sta,
|
|
|
- u32 iv32, u16 *phase1key)
|
|
|
+void iwlagn_mac_update_tkip_key(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
+ struct ieee80211_key_conf *keyconf,
|
|
|
+ struct ieee80211_sta *sta,
|
|
|
+ u32 iv32, u16 *phase1key)
|
|
|
{
|
|
|
-
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
|
|
|
|
|
@@ -3614,10 +3321,9 @@ static void iwl_mac_update_tkip_key(struct ieee80211_hw *hw,
|
|
|
IWL_DEBUG_MAC80211(priv, "leave\n");
|
|
|
}
|
|
|
|
|
|
-static int iwl_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|
|
- struct ieee80211_vif *vif,
|
|
|
- struct ieee80211_sta *sta,
|
|
|
- struct ieee80211_key_conf *key)
|
|
|
+int iwlagn_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|
|
+ struct ieee80211_vif *vif, struct ieee80211_sta *sta,
|
|
|
+ struct ieee80211_key_conf *key)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv;
|
|
@@ -3684,10 +3390,10 @@ static int iwl_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
|
|
|
- struct ieee80211_vif *vif,
|
|
|
- enum ieee80211_ampdu_mlme_action action,
|
|
|
- struct ieee80211_sta *sta, u16 tid, u16 *ssn)
|
|
|
+int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
+ enum ieee80211_ampdu_mlme_action action,
|
|
|
+ struct ieee80211_sta *sta, u16 tid, u16 *ssn)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
int ret = -EINVAL;
|
|
@@ -3768,10 +3474,10 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static void iwl_mac_sta_notify(struct ieee80211_hw *hw,
|
|
|
- struct ieee80211_vif *vif,
|
|
|
- enum sta_notify_cmd cmd,
|
|
|
- struct ieee80211_sta *sta)
|
|
|
+static void iwlagn_mac_sta_notify(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
+ enum sta_notify_cmd cmd,
|
|
|
+ struct ieee80211_sta *sta)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
|
|
@@ -3798,9 +3504,9 @@ static void iwl_mac_sta_notify(struct ieee80211_hw *hw,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
|
|
|
- struct ieee80211_vif *vif,
|
|
|
- struct ieee80211_sta *sta)
|
|
|
+int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_vif *vif,
|
|
|
+ struct ieee80211_sta *sta)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
struct iwl_station_priv *sta_priv = (void *)sta->drv_priv;
|
|
@@ -3841,8 +3547,8 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void iwl_mac_channel_switch(struct ieee80211_hw *hw,
|
|
|
- struct ieee80211_channel_switch *ch_switch)
|
|
|
+void iwlagn_mac_channel_switch(struct ieee80211_hw *hw,
|
|
|
+ struct ieee80211_channel_switch *ch_switch)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
const struct iwl_channel_info *ch_info;
|
|
@@ -3939,10 +3645,10 @@ out_exit:
|
|
|
IWL_DEBUG_MAC80211(priv, "leave\n");
|
|
|
}
|
|
|
|
|
|
-static void iwlagn_configure_filter(struct ieee80211_hw *hw,
|
|
|
- unsigned int changed_flags,
|
|
|
- unsigned int *total_flags,
|
|
|
- u64 multicast)
|
|
|
+void iwlagn_configure_filter(struct ieee80211_hw *hw,
|
|
|
+ unsigned int changed_flags,
|
|
|
+ unsigned int *total_flags,
|
|
|
+ u64 multicast)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
__le32 filter_or = 0, filter_nand = 0;
|
|
@@ -3988,7 +3694,7 @@ static void iwlagn_configure_filter(struct ieee80211_hw *hw,
|
|
|
FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
|
|
|
}
|
|
|
|
|
|
-static void iwl_mac_flush(struct ieee80211_hw *hw, bool drop)
|
|
|
+void iwlagn_mac_flush(struct ieee80211_hw *hw, bool drop)
|
|
|
{
|
|
|
struct iwl_priv *priv = hw->priv;
|
|
|
|
|
@@ -4198,25 +3904,24 @@ static void iwl_uninit_drv(struct iwl_priv *priv)
|
|
|
}
|
|
|
|
|
|
struct ieee80211_ops iwlagn_hw_ops = {
|
|
|
- .tx = iwl_mac_tx,
|
|
|
- .start = iwl_mac_start,
|
|
|
- .stop = iwl_mac_stop,
|
|
|
+ .tx = iwlagn_mac_tx,
|
|
|
+ .start = iwlagn_mac_start,
|
|
|
+ .stop = iwlagn_mac_stop,
|
|
|
.add_interface = iwl_mac_add_interface,
|
|
|
.remove_interface = iwl_mac_remove_interface,
|
|
|
- .config = iwl_mac_config,
|
|
|
+ .config = iwlagn_mac_config,
|
|
|
.configure_filter = iwlagn_configure_filter,
|
|
|
- .set_key = iwl_mac_set_key,
|
|
|
- .update_tkip_key = iwl_mac_update_tkip_key,
|
|
|
+ .set_key = iwlagn_mac_set_key,
|
|
|
+ .update_tkip_key = iwlagn_mac_update_tkip_key,
|
|
|
.conf_tx = iwl_mac_conf_tx,
|
|
|
- .reset_tsf = iwl_mac_reset_tsf,
|
|
|
- .bss_info_changed = iwl_bss_info_changed,
|
|
|
- .ampdu_action = iwl_mac_ampdu_action,
|
|
|
+ .bss_info_changed = iwlagn_bss_info_changed,
|
|
|
+ .ampdu_action = iwlagn_mac_ampdu_action,
|
|
|
.hw_scan = iwl_mac_hw_scan,
|
|
|
- .sta_notify = iwl_mac_sta_notify,
|
|
|
+ .sta_notify = iwlagn_mac_sta_notify,
|
|
|
.sta_add = iwlagn_mac_sta_add,
|
|
|
.sta_remove = iwl_mac_sta_remove,
|
|
|
- .channel_switch = iwl_mac_channel_switch,
|
|
|
- .flush = iwl_mac_flush,
|
|
|
+ .channel_switch = iwlagn_mac_channel_switch,
|
|
|
+ .flush = iwlagn_mac_flush,
|
|
|
.tx_last_beacon = iwl_mac_tx_last_beacon,
|
|
|
};
|
|
|
|
|
@@ -4287,6 +3992,9 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
dev_printk(KERN_DEBUG, &(pdev->dev),
|
|
|
"sw scan support is deprecated\n");
|
|
|
iwlagn_hw_ops.hw_scan = NULL;
|
|
|
+#ifdef CONFIG_IWL4965
|
|
|
+ iwl4965_hw_ops.hw_scan = NULL;
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
hw = iwl_alloc_all(cfg);
|
|
@@ -4321,6 +4029,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
BIT(NL80211_IFTYPE_ADHOC);
|
|
|
priv->contexts[IWL_RXON_CTX_BSS].interface_modes =
|
|
|
BIT(NL80211_IFTYPE_STATION);
|
|
|
+ priv->contexts[IWL_RXON_CTX_BSS].ap_devtype = RXON_DEV_TYPE_AP;
|
|
|
priv->contexts[IWL_RXON_CTX_BSS].ibss_devtype = RXON_DEV_TYPE_IBSS;
|
|
|
priv->contexts[IWL_RXON_CTX_BSS].station_devtype = RXON_DEV_TYPE_ESS;
|
|
|
priv->contexts[IWL_RXON_CTX_BSS].unused_devtype = RXON_DEV_TYPE_ESS;
|