diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-4965.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index f0a47f42d4b8..1d6a46d4db59 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -347,7 +347,7 @@ static void iwl4965_chain_noise_reset(struct iwl_priv *priv) | |||
347 | struct iwl_chain_noise_data *data = &(priv->chain_noise_data); | 347 | struct iwl_chain_noise_data *data = &(priv->chain_noise_data); |
348 | 348 | ||
349 | if ((data->state == IWL_CHAIN_NOISE_ALIVE) && | 349 | if ((data->state == IWL_CHAIN_NOISE_ALIVE) && |
350 | iwl_is_associated(priv)) { | 350 | iwl_is_any_associated(priv)) { |
351 | struct iwl_calib_diff_gain_cmd cmd; | 351 | struct iwl_calib_diff_gain_cmd cmd; |
352 | 352 | ||
353 | /* clear data for chain noise calibration algorithm */ | 353 | /* clear data for chain noise calibration algorithm */ |
@@ -576,7 +576,7 @@ static int iwl4965_alive_notify(struct iwl_priv *priv) | |||
576 | /* Activate all Tx DMA/FIFO channels */ | 576 | /* Activate all Tx DMA/FIFO channels */ |
577 | priv->cfg->ops->lib->txq_set_sched(priv, IWL_MASK(0, 6)); | 577 | priv->cfg->ops->lib->txq_set_sched(priv, IWL_MASK(0, 6)); |
578 | 578 | ||
579 | iwl4965_set_wr_ptrs(priv, IWL_CMD_QUEUE_NUM, 0); | 579 | iwl4965_set_wr_ptrs(priv, IWL_DEFAULT_CMD_QUEUE_NUM, 0); |
580 | 580 | ||
581 | /* make sure all queue are not stopped */ | 581 | /* make sure all queue are not stopped */ |
582 | memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped)); | 582 | memset(&priv->queue_stopped[0], 0, sizeof(priv->queue_stopped)); |
@@ -587,6 +587,7 @@ static int iwl4965_alive_notify(struct iwl_priv *priv) | |||
587 | priv->txq_ctx_active_msk = 0; | 587 | priv->txq_ctx_active_msk = 0; |
588 | /* Map each Tx/cmd queue to its corresponding fifo */ | 588 | /* Map each Tx/cmd queue to its corresponding fifo */ |
589 | BUILD_BUG_ON(ARRAY_SIZE(default_queue_to_tx_fifo) != 7); | 589 | BUILD_BUG_ON(ARRAY_SIZE(default_queue_to_tx_fifo) != 7); |
590 | |||
590 | for (i = 0; i < ARRAY_SIZE(default_queue_to_tx_fifo); i++) { | 591 | for (i = 0; i < ARRAY_SIZE(default_queue_to_tx_fifo); i++) { |
591 | int ac = default_queue_to_tx_fifo[i]; | 592 | int ac = default_queue_to_tx_fifo[i]; |
592 | 593 | ||
@@ -656,7 +657,7 @@ static int iwl4965_hw_set_hw_params(struct iwl_priv *priv) | |||
656 | sizeof(struct iwl4965_scd_bc_tbl); | 657 | sizeof(struct iwl4965_scd_bc_tbl); |
657 | priv->hw_params.tfd_size = sizeof(struct iwl_tfd); | 658 | priv->hw_params.tfd_size = sizeof(struct iwl_tfd); |
658 | priv->hw_params.max_stations = IWL4965_STATION_COUNT; | 659 | priv->hw_params.max_stations = IWL4965_STATION_COUNT; |
659 | priv->hw_params.bcast_sta_id = IWL4965_BROADCAST_ID; | 660 | priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id = IWL4965_BROADCAST_ID; |
660 | priv->hw_params.max_data_size = IWL49_RTC_DATA_SIZE; | 661 | priv->hw_params.max_data_size = IWL49_RTC_DATA_SIZE; |
661 | priv->hw_params.max_inst_size = IWL49_RTC_INST_SIZE; | 662 | priv->hw_params.max_inst_size = IWL49_RTC_INST_SIZE; |
662 | priv->hw_params.max_bsm_size = BSM_SRAM_SIZE; | 663 | priv->hw_params.max_bsm_size = BSM_SRAM_SIZE; |
@@ -1374,6 +1375,7 @@ static int iwl4965_send_tx_power(struct iwl_priv *priv) | |||
1374 | u8 band = 0; | 1375 | u8 band = 0; |
1375 | bool is_ht40 = false; | 1376 | bool is_ht40 = false; |
1376 | u8 ctrl_chan_high = 0; | 1377 | u8 ctrl_chan_high = 0; |
1378 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; | ||
1377 | 1379 | ||
1378 | if (test_bit(STATUS_SCANNING, &priv->status)) { | 1380 | if (test_bit(STATUS_SCANNING, &priv->status)) { |
1379 | /* If this gets hit a lot, switch it to a BUG() and catch | 1381 | /* If this gets hit a lot, switch it to a BUG() and catch |
@@ -1385,17 +1387,16 @@ static int iwl4965_send_tx_power(struct iwl_priv *priv) | |||
1385 | 1387 | ||
1386 | band = priv->band == IEEE80211_BAND_2GHZ; | 1388 | band = priv->band == IEEE80211_BAND_2GHZ; |
1387 | 1389 | ||
1388 | is_ht40 = is_ht40_channel(priv->active_rxon.flags); | 1390 | is_ht40 = is_ht40_channel(ctx->active.flags); |
1389 | 1391 | ||
1390 | if (is_ht40 && | 1392 | if (is_ht40 && (ctx->active.flags & RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK)) |
1391 | (priv->active_rxon.flags & RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK)) | ||
1392 | ctrl_chan_high = 1; | 1393 | ctrl_chan_high = 1; |
1393 | 1394 | ||
1394 | cmd.band = band; | 1395 | cmd.band = band; |
1395 | cmd.channel = priv->active_rxon.channel; | 1396 | cmd.channel = ctx->active.channel; |
1396 | 1397 | ||
1397 | ret = iwl4965_fill_txpower_tbl(priv, band, | 1398 | ret = iwl4965_fill_txpower_tbl(priv, band, |
1398 | le16_to_cpu(priv->active_rxon.channel), | 1399 | le16_to_cpu(ctx->active.channel), |
1399 | is_ht40, ctrl_chan_high, &cmd.tx_power); | 1400 | is_ht40, ctrl_chan_high, &cmd.tx_power); |
1400 | if (ret) | 1401 | if (ret) |
1401 | goto out; | 1402 | goto out; |
@@ -1406,12 +1407,13 @@ out: | |||
1406 | return ret; | 1407 | return ret; |
1407 | } | 1408 | } |
1408 | 1409 | ||
1409 | static int iwl4965_send_rxon_assoc(struct iwl_priv *priv) | 1410 | static int iwl4965_send_rxon_assoc(struct iwl_priv *priv, |
1411 | struct iwl_rxon_context *ctx) | ||
1410 | { | 1412 | { |
1411 | int ret = 0; | 1413 | int ret = 0; |
1412 | struct iwl4965_rxon_assoc_cmd rxon_assoc; | 1414 | struct iwl4965_rxon_assoc_cmd rxon_assoc; |
1413 | const struct iwl_rxon_cmd *rxon1 = &priv->staging_rxon; | 1415 | const struct iwl_rxon_cmd *rxon1 = &ctx->staging; |
1414 | const struct iwl_rxon_cmd *rxon2 = &priv->active_rxon; | 1416 | const struct iwl_rxon_cmd *rxon2 = &ctx->active; |
1415 | 1417 | ||
1416 | if ((rxon1->flags == rxon2->flags) && | 1418 | if ((rxon1->flags == rxon2->flags) && |
1417 | (rxon1->filter_flags == rxon2->filter_flags) && | 1419 | (rxon1->filter_flags == rxon2->filter_flags) && |
@@ -1426,16 +1428,16 @@ static int iwl4965_send_rxon_assoc(struct iwl_priv *priv) | |||
1426 | return 0; | 1428 | return 0; |
1427 | } | 1429 | } |
1428 | 1430 | ||
1429 | rxon_assoc.flags = priv->staging_rxon.flags; | 1431 | rxon_assoc.flags = ctx->staging.flags; |
1430 | rxon_assoc.filter_flags = priv->staging_rxon.filter_flags; | 1432 | rxon_assoc.filter_flags = ctx->staging.filter_flags; |
1431 | rxon_assoc.ofdm_basic_rates = priv->staging_rxon.ofdm_basic_rates; | 1433 | rxon_assoc.ofdm_basic_rates = ctx->staging.ofdm_basic_rates; |
1432 | rxon_assoc.cck_basic_rates = priv->staging_rxon.cck_basic_rates; | 1434 | rxon_assoc.cck_basic_rates = ctx->staging.cck_basic_rates; |
1433 | rxon_assoc.reserved = 0; | 1435 | rxon_assoc.reserved = 0; |
1434 | rxon_assoc.ofdm_ht_single_stream_basic_rates = | 1436 | rxon_assoc.ofdm_ht_single_stream_basic_rates = |
1435 | priv->staging_rxon.ofdm_ht_single_stream_basic_rates; | 1437 | ctx->staging.ofdm_ht_single_stream_basic_rates; |
1436 | rxon_assoc.ofdm_ht_dual_stream_basic_rates = | 1438 | rxon_assoc.ofdm_ht_dual_stream_basic_rates = |
1437 | priv->staging_rxon.ofdm_ht_dual_stream_basic_rates; | 1439 | ctx->staging.ofdm_ht_dual_stream_basic_rates; |
1438 | rxon_assoc.rx_chain_select_flags = priv->staging_rxon.rx_chain; | 1440 | rxon_assoc.rx_chain_select_flags = ctx->staging.rx_chain; |
1439 | 1441 | ||
1440 | ret = iwl_send_cmd_pdu_async(priv, REPLY_RXON_ASSOC, | 1442 | ret = iwl_send_cmd_pdu_async(priv, REPLY_RXON_ASSOC, |
1441 | sizeof(rxon_assoc), &rxon_assoc, NULL); | 1443 | sizeof(rxon_assoc), &rxon_assoc, NULL); |
@@ -1448,6 +1450,7 @@ static int iwl4965_send_rxon_assoc(struct iwl_priv *priv) | |||
1448 | static int iwl4965_hw_channel_switch(struct iwl_priv *priv, | 1450 | static int iwl4965_hw_channel_switch(struct iwl_priv *priv, |
1449 | struct ieee80211_channel_switch *ch_switch) | 1451 | struct ieee80211_channel_switch *ch_switch) |
1450 | { | 1452 | { |
1453 | struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; | ||
1451 | int rc; | 1454 | int rc; |
1452 | u8 band = 0; | 1455 | u8 band = 0; |
1453 | bool is_ht40 = false; | 1456 | bool is_ht40 = false; |
@@ -1458,22 +1461,22 @@ static int iwl4965_hw_channel_switch(struct iwl_priv *priv, | |||
1458 | u16 ch; | 1461 | u16 ch; |
1459 | u32 tsf_low; | 1462 | u32 tsf_low; |
1460 | u8 switch_count; | 1463 | u8 switch_count; |
1461 | u16 beacon_interval = le16_to_cpu(priv->rxon_timing.beacon_interval); | 1464 | u16 beacon_interval = le16_to_cpu(ctx->timing.beacon_interval); |
1462 | struct ieee80211_vif *vif = priv->vif; | 1465 | struct ieee80211_vif *vif = ctx->vif; |
1463 | band = priv->band == IEEE80211_BAND_2GHZ; | 1466 | band = priv->band == IEEE80211_BAND_2GHZ; |
1464 | 1467 | ||
1465 | is_ht40 = is_ht40_channel(priv->staging_rxon.flags); | 1468 | is_ht40 = is_ht40_channel(ctx->staging.flags); |
1466 | 1469 | ||
1467 | if (is_ht40 && | 1470 | if (is_ht40 && |
1468 | (priv->staging_rxon.flags & RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK)) | 1471 | (ctx->staging.flags & RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK)) |
1469 | ctrl_chan_high = 1; | 1472 | ctrl_chan_high = 1; |
1470 | 1473 | ||
1471 | cmd.band = band; | 1474 | cmd.band = band; |
1472 | cmd.expect_beacon = 0; | 1475 | cmd.expect_beacon = 0; |
1473 | ch = ch_switch->channel->hw_value; | 1476 | ch = ch_switch->channel->hw_value; |
1474 | cmd.channel = cpu_to_le16(ch); | 1477 | cmd.channel = cpu_to_le16(ch); |
1475 | cmd.rxon_flags = priv->staging_rxon.flags; | 1478 | cmd.rxon_flags = ctx->staging.flags; |
1476 | cmd.rxon_filter_flags = priv->staging_rxon.filter_flags; | 1479 | cmd.rxon_filter_flags = ctx->staging.filter_flags; |
1477 | switch_count = ch_switch->count; | 1480 | switch_count = ch_switch->count; |
1478 | tsf_low = ch_switch->timestamp & 0x0ffffffff; | 1481 | tsf_low = ch_switch->timestamp & 0x0ffffffff; |
1479 | /* | 1482 | /* |
@@ -1508,7 +1511,7 @@ static int iwl4965_hw_channel_switch(struct iwl_priv *priv, | |||
1508 | cmd.expect_beacon = is_channel_radar(ch_info); | 1511 | cmd.expect_beacon = is_channel_radar(ch_info); |
1509 | else { | 1512 | else { |
1510 | IWL_ERR(priv, "invalid channel switch from %u to %u\n", | 1513 | IWL_ERR(priv, "invalid channel switch from %u to %u\n", |
1511 | priv->active_rxon.channel, ch); | 1514 | ctx->active.channel, ch); |
1512 | return -EFAULT; | 1515 | return -EFAULT; |
1513 | } | 1516 | } |
1514 | 1517 | ||
@@ -2007,7 +2010,7 @@ static u8 iwl_find_station(struct iwl_priv *priv, const u8 *addr) | |||
2007 | start = IWL_STA_ID; | 2010 | start = IWL_STA_ID; |
2008 | 2011 | ||
2009 | if (is_broadcast_ether_addr(addr)) | 2012 | if (is_broadcast_ether_addr(addr)) |
2010 | return priv->hw_params.bcast_sta_id; | 2013 | return priv->contexts[IWL_RXON_CTX_BSS].bcast_sta_id; |
2011 | 2014 | ||
2012 | spin_lock_irqsave(&priv->sta_lock, flags); | 2015 | spin_lock_irqsave(&priv->sta_lock, flags); |
2013 | for (i = start; i < priv->hw_params.max_stations; i++) | 2016 | for (i = start; i < priv->hw_params.max_stations; i++) |
@@ -2280,7 +2283,7 @@ static struct iwl_lib_ops iwl4965_lib = { | |||
2280 | .set_ct_kill = iwl4965_set_ct_threshold, | 2283 | .set_ct_kill = iwl4965_set_ct_threshold, |
2281 | }, | 2284 | }, |
2282 | .manage_ibss_station = iwlagn_manage_ibss_station, | 2285 | .manage_ibss_station = iwlagn_manage_ibss_station, |
2283 | .update_bcast_station = iwl_update_bcast_station, | 2286 | .update_bcast_stations = iwl_update_bcast_stations, |
2284 | .debugfs_ops = { | 2287 | .debugfs_ops = { |
2285 | .rx_stats_read = iwl_ucode_rx_stats_read, | 2288 | .rx_stats_read = iwl_ucode_rx_stats_read, |
2286 | .tx_stats_read = iwl_ucode_tx_stats_read, | 2289 | .tx_stats_read = iwl_ucode_tx_stats_read, |