|
@@ -177,79 +177,6 @@ static int iwl2000_hw_set_hw_params(struct iwl_priv *priv)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int iwl2030_hw_channel_switch(struct iwl_priv *priv,
|
|
|
- struct ieee80211_channel_switch *ch_switch)
|
|
|
-{
|
|
|
- /*
|
|
|
- * MULTI-FIXME
|
|
|
- * See iwl_mac_channel_switch.
|
|
|
- */
|
|
|
- struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
|
|
|
- struct iwl6000_channel_switch_cmd cmd;
|
|
|
- const struct iwl_channel_info *ch_info;
|
|
|
- u32 switch_time_in_usec, ucode_switch_time;
|
|
|
- u16 ch;
|
|
|
- u32 tsf_low;
|
|
|
- u8 switch_count;
|
|
|
- u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval);
|
|
|
- struct ieee80211_vif *vif = ctx->vif;
|
|
|
- struct iwl_host_cmd hcmd = {
|
|
|
- .id = REPLY_CHANNEL_SWITCH,
|
|
|
- .len = { sizeof(cmd), },
|
|
|
- .flags = CMD_SYNC,
|
|
|
- .data = { &cmd, },
|
|
|
- };
|
|
|
-
|
|
|
- cmd.band = priv->band == IEEE80211_BAND_2GHZ;
|
|
|
- ch = ch_switch->channel->hw_value;
|
|
|
- IWL_DEBUG_11H(priv, "channel switch from %u to %u\n",
|
|
|
- ctx->active.channel, ch);
|
|
|
- cmd.channel = cpu_to_le16(ch);
|
|
|
- cmd.rxon_flags = ctx->staging.flags;
|
|
|
- cmd.rxon_filter_flags = ctx->staging.filter_flags;
|
|
|
- switch_count = ch_switch->count;
|
|
|
- tsf_low = ch_switch->timestamp & 0x0ffffffff;
|
|
|
- /*
|
|
|
- * calculate the ucode channel switch time
|
|
|
- * adding TSF as one of the factor for when to switch
|
|
|
- */
|
|
|
- if ((priv->ucode_beacon_time > tsf_low) && beacon_interval) {
|
|
|
- if (switch_count > ((priv->ucode_beacon_time - tsf_low) /
|
|
|
- beacon_interval)) {
|
|
|
- switch_count -= (priv->ucode_beacon_time -
|
|
|
- tsf_low) / beacon_interval;
|
|
|
- } else
|
|
|
- switch_count = 0;
|
|
|
- }
|
|
|
- if (switch_count <= 1)
|
|
|
- cmd.switch_time = cpu_to_le32(priv->ucode_beacon_time);
|
|
|
- else {
|
|
|
- switch_time_in_usec =
|
|
|
- vif->bss_conf.beacon_int * switch_count * TIME_UNIT;
|
|
|
- ucode_switch_time = iwl_usecs_to_beacons(priv,
|
|
|
- switch_time_in_usec,
|
|
|
- beacon_interval);
|
|
|
- cmd.switch_time = iwl_add_beacon_time(priv,
|
|
|
- priv->ucode_beacon_time,
|
|
|
- ucode_switch_time,
|
|
|
- beacon_interval);
|
|
|
- }
|
|
|
- IWL_DEBUG_11H(priv, "uCode time for the switch is 0x%x\n",
|
|
|
- cmd.switch_time);
|
|
|
- ch_info = iwl_get_channel_info(priv, priv->band, ch);
|
|
|
- if (ch_info)
|
|
|
- cmd.expect_beacon = is_channel_radar(ch_info);
|
|
|
- else {
|
|
|
- IWL_ERR(priv, "invalid channel switch from %u to %u\n",
|
|
|
- ctx->active.channel, ch);
|
|
|
- return -EFAULT;
|
|
|
- }
|
|
|
- priv->switch_rxon.channel = cmd.channel;
|
|
|
- priv->switch_rxon.switch_in_progress = true;
|
|
|
-
|
|
|
- return iwl_send_cmd_sync(priv, &hcmd);
|
|
|
-}
|
|
|
-
|
|
|
static struct iwl_lib_ops iwl2000_lib = {
|
|
|
.set_hw_params = iwl2000_hw_set_hw_params,
|
|
|
.rx_handler_setup = iwlagn_rx_handler_setup,
|
|
@@ -258,7 +185,6 @@ static struct iwl_lib_ops iwl2000_lib = {
|
|
|
.is_valid_rtc_data_addr = iwlagn_hw_valid_rtc_data_addr,
|
|
|
.send_tx_power = iwlagn_send_tx_power,
|
|
|
.update_chain_flags = iwl_update_chain_flags,
|
|
|
- .set_channel_switch = iwl2030_hw_channel_switch,
|
|
|
.apm_ops = {
|
|
|
.init = iwl_apm_init,
|
|
|
.config = iwl2000_nic_config,
|