aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-agn.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-agn.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c308
1 files changed, 102 insertions, 206 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 7db39866bdc4..b53852dcdbfd 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -46,13 +46,13 @@
46 46
47#include "iwl-eeprom.h" 47#include "iwl-eeprom.h"
48#include "iwl-dev.h" 48#include "iwl-dev.h"
49#include "iwl-core.h"
50#include "iwl-io.h" 49#include "iwl-io.h"
51#include "iwl-agn-calib.h" 50#include "iwl-agn-calib.h"
52#include "iwl-agn.h" 51#include "iwl-agn.h"
53#include "iwl-shared.h"
54#include "iwl-trans.h" 52#include "iwl-trans.h"
55#include "iwl-op-mode.h" 53#include "iwl-op-mode.h"
54#include "iwl-drv.h"
55#include "iwl-modparams.h"
56 56
57/****************************************************************************** 57/******************************************************************************
58 * 58 *
@@ -348,14 +348,14 @@ static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
348 ptr = base + (4 * sizeof(u32)) + (start_idx * 3 * sizeof(u32)); 348 ptr = base + (4 * sizeof(u32)) + (start_idx * 3 * sizeof(u32));
349 349
350 /* Make sure device is powered up for SRAM reads */ 350 /* Make sure device is powered up for SRAM reads */
351 spin_lock_irqsave(&trans(priv)->reg_lock, reg_flags); 351 spin_lock_irqsave(&priv->trans->reg_lock, reg_flags);
352 if (unlikely(!iwl_grab_nic_access(trans(priv)))) { 352 if (unlikely(!iwl_grab_nic_access(priv->trans))) {
353 spin_unlock_irqrestore(&trans(priv)->reg_lock, reg_flags); 353 spin_unlock_irqrestore(&priv->trans->reg_lock, reg_flags);
354 return; 354 return;
355 } 355 }
356 356
357 /* Set starting address; reads will auto-increment */ 357 /* Set starting address; reads will auto-increment */
358 iwl_write32(trans(priv), HBUS_TARG_MEM_RADDR, ptr); 358 iwl_write32(priv->trans, HBUS_TARG_MEM_RADDR, ptr);
359 359
360 /* 360 /*
361 * Refuse to read more than would have fit into the log from 361 * Refuse to read more than would have fit into the log from
@@ -371,20 +371,20 @@ static void iwl_print_cont_event_trace(struct iwl_priv *priv, u32 base,
371 * place event id # at far right for easier visual parsing. 371 * place event id # at far right for easier visual parsing.
372 */ 372 */
373 for (i = 0; i < num_events; i++) { 373 for (i = 0; i < num_events; i++) {
374 ev = iwl_read32(trans(priv), HBUS_TARG_MEM_RDAT); 374 ev = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
375 time = iwl_read32(trans(priv), HBUS_TARG_MEM_RDAT); 375 time = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
376 if (mode == 0) { 376 if (mode == 0) {
377 trace_iwlwifi_dev_ucode_cont_event( 377 trace_iwlwifi_dev_ucode_cont_event(
378 trans(priv)->dev, 0, time, ev); 378 priv->trans->dev, 0, time, ev);
379 } else { 379 } else {
380 data = iwl_read32(trans(priv), HBUS_TARG_MEM_RDAT); 380 data = iwl_read32(priv->trans, HBUS_TARG_MEM_RDAT);
381 trace_iwlwifi_dev_ucode_cont_event( 381 trace_iwlwifi_dev_ucode_cont_event(
382 trans(priv)->dev, time, data, ev); 382 priv->trans->dev, time, data, ev);
383 } 383 }
384 } 384 }
385 /* Allow device to power down */ 385 /* Allow device to power down */
386 iwl_release_nic_access(trans(priv)); 386 iwl_release_nic_access(priv->trans);
387 spin_unlock_irqrestore(&trans(priv)->reg_lock, reg_flags); 387 spin_unlock_irqrestore(&priv->trans->reg_lock, reg_flags);
388} 388}
389 389
390static void iwl_continuous_event_trace(struct iwl_priv *priv) 390static void iwl_continuous_event_trace(struct iwl_priv *priv)
@@ -403,8 +403,7 @@ static void iwl_continuous_event_trace(struct iwl_priv *priv)
403 403
404 base = priv->device_pointers.log_event_table; 404 base = priv->device_pointers.log_event_table;
405 if (iwlagn_hw_valid_rtc_data_addr(base)) { 405 if (iwlagn_hw_valid_rtc_data_addr(base)) {
406 iwl_read_targ_mem_words(trans(priv), base, &read, sizeof(read)); 406 iwl_read_targ_mem_words(priv->trans, base, &read, sizeof(read));
407
408 capacity = read.capacity; 407 capacity = read.capacity;
409 mode = read.mode; 408 mode = read.mode;
410 num_wraps = read.wrap_counter; 409 num_wraps = read.wrap_counter;
@@ -444,7 +443,7 @@ static void iwl_continuous_event_trace(struct iwl_priv *priv)
444 else 443 else
445 priv->event_log.wraps_once_count++; 444 priv->event_log.wraps_once_count++;
446 445
447 trace_iwlwifi_dev_ucode_wrap_event(trans(priv)->dev, 446 trace_iwlwifi_dev_ucode_wrap_event(priv->trans->dev,
448 num_wraps - priv->event_log.num_wraps, 447 num_wraps - priv->event_log.num_wraps,
449 next_entry, priv->event_log.next_entry); 448 next_entry, priv->event_log.next_entry);
450 449
@@ -579,24 +578,6 @@ static const u8 iwlagn_pan_ac_to_queue[] = {
579 7, 6, 5, 4, 578 7, 6, 5, 4,
580}; 579};
581 580
582static const u8 iwlagn_bss_queue_to_ac[] = {
583 IEEE80211_AC_VO,
584 IEEE80211_AC_VI,
585 IEEE80211_AC_BE,
586 IEEE80211_AC_BK,
587};
588
589static const u8 iwlagn_pan_queue_to_ac[] = {
590 IEEE80211_AC_VO,
591 IEEE80211_AC_VI,
592 IEEE80211_AC_BE,
593 IEEE80211_AC_BK,
594 IEEE80211_AC_BK,
595 IEEE80211_AC_BE,
596 IEEE80211_AC_VI,
597 IEEE80211_AC_VO,
598};
599
600void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags) 581void iwl_init_context(struct iwl_priv *priv, u32 ucode_flags)
601{ 582{
602 int i; 583 int i;
@@ -670,12 +651,12 @@ void iwl_rf_kill_ct_config(struct iwl_priv *priv)
670 struct iwl_ct_kill_throttling_config adv_cmd; 651 struct iwl_ct_kill_throttling_config adv_cmd;
671 int ret = 0; 652 int ret = 0;
672 653
673 iwl_write32(trans(priv), CSR_UCODE_DRV_GP1_CLR, 654 iwl_write32(priv->trans, CSR_UCODE_DRV_GP1_CLR,
674 CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT); 655 CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT);
675 656
676 priv->thermal_throttle.ct_kill_toggle = false; 657 priv->thermal_throttle.ct_kill_toggle = false;
677 658
678 if (cfg(priv)->base_params->support_ct_kill_exit) { 659 if (priv->cfg->base_params->support_ct_kill_exit) {
679 adv_cmd.critical_temperature_enter = 660 adv_cmd.critical_temperature_enter =
680 cpu_to_le32(priv->hw_params.ct_kill_threshold); 661 cpu_to_le32(priv->hw_params.ct_kill_threshold);
681 adv_cmd.critical_temperature_exit = 662 adv_cmd.critical_temperature_exit =
@@ -754,7 +735,7 @@ void iwl_send_bt_config(struct iwl_priv *priv)
754 .kill_cts_mask = 0, 735 .kill_cts_mask = 0,
755 }; 736 };
756 737
757 if (!iwlagn_mod_params.bt_coex_active) 738 if (!iwlwifi_mod_params.bt_coex_active)
758 bt_cmd.flags = BT_COEX_DISABLE; 739 bt_cmd.flags = BT_COEX_DISABLE;
759 else 740 else
760 bt_cmd.flags = BT_COEX_ENABLE; 741 bt_cmd.flags = BT_COEX_ENABLE;
@@ -792,10 +773,10 @@ int iwl_alive_start(struct iwl_priv *priv)
792 } 773 }
793 774
794 /* download priority table before any calibration request */ 775 /* download priority table before any calibration request */
795 if (cfg(priv)->bt_params && 776 if (priv->cfg->bt_params &&
796 cfg(priv)->bt_params->advanced_bt_coexist) { 777 priv->cfg->bt_params->advanced_bt_coexist) {
797 /* Configure Bluetooth device coexistence support */ 778 /* Configure Bluetooth device coexistence support */
798 if (cfg(priv)->bt_params->bt_sco_disable) 779 if (priv->cfg->bt_params->bt_sco_disable)
799 priv->bt_enable_pspoll = false; 780 priv->bt_enable_pspoll = false;
800 else 781 else
801 priv->bt_enable_pspoll = true; 782 priv->bt_enable_pspoll = true;
@@ -932,9 +913,9 @@ void iwl_down(struct iwl_priv *priv)
932 priv->bt_status = 0; 913 priv->bt_status = 0;
933 priv->cur_rssi_ctx = NULL; 914 priv->cur_rssi_ctx = NULL;
934 priv->bt_is_sco = 0; 915 priv->bt_is_sco = 0;
935 if (cfg(priv)->bt_params) 916 if (priv->cfg->bt_params)
936 priv->bt_traffic_load = 917 priv->bt_traffic_load =
937 cfg(priv)->bt_params->bt_init_traffic_load; 918 priv->cfg->bt_params->bt_init_traffic_load;
938 else 919 else
939 priv->bt_traffic_load = 0; 920 priv->bt_traffic_load = 0;
940 priv->bt_full_concurrent = false; 921 priv->bt_full_concurrent = false;
@@ -949,7 +930,7 @@ void iwl_down(struct iwl_priv *priv)
949 ieee80211_stop_queues(priv->hw); 930 ieee80211_stop_queues(priv->hw);
950 931
951 priv->ucode_loaded = false; 932 priv->ucode_loaded = false;
952 iwl_trans_stop_device(trans(priv)); 933 iwl_trans_stop_device(priv->trans);
953 934
954 /* Clear out all status bits but a few that are stable across reset */ 935 /* Clear out all status bits but a few that are stable across reset */
955 priv->status &= test_bit(STATUS_RF_KILL_HW, &priv->status) << 936 priv->status &= test_bit(STATUS_RF_KILL_HW, &priv->status) <<
@@ -1031,12 +1012,12 @@ void iwlagn_prepare_restart(struct iwl_priv *priv)
1031 priv->bt_status = bt_status; 1012 priv->bt_status = bt_status;
1032 priv->bt_is_sco = bt_is_sco; 1013 priv->bt_is_sco = bt_is_sco;
1033 1014
1034 /* reset all queues */ 1015 /* reset aggregation queues */
1035 for (i = 0; i < IEEE80211_NUM_ACS; i++)
1036 atomic_set(&priv->ac_stop_count[i], 0);
1037
1038 for (i = IWLAGN_FIRST_AMPDU_QUEUE; i < IWL_MAX_HW_QUEUES; i++) 1016 for (i = IWLAGN_FIRST_AMPDU_QUEUE; i < IWL_MAX_HW_QUEUES; i++)
1039 priv->queue_to_ac[i] = IWL_INVALID_AC; 1017 priv->queue_to_mac80211[i] = IWL_INVALID_MAC80211_QUEUE;
1018 /* and stop counts */
1019 for (i = 0; i < IWL_MAX_HW_QUEUES; i++)
1020 atomic_set(&priv->queue_stop_count[i], 0);
1040 1021
1041 memset(priv->agg_q_alloc, 0, sizeof(priv->agg_q_alloc)); 1022 memset(priv->agg_q_alloc, 0, sizeof(priv->agg_q_alloc));
1042} 1023}
@@ -1115,7 +1096,7 @@ void iwl_setup_deferred_work(struct iwl_priv *priv)
1115 1096
1116 iwl_setup_scan_deferred_work(priv); 1097 iwl_setup_scan_deferred_work(priv);
1117 1098
1118 if (cfg(priv)->bt_params) 1099 if (priv->cfg->bt_params)
1119 iwlagn_bt_setup_deferred_work(priv); 1100 iwlagn_bt_setup_deferred_work(priv);
1120 1101
1121 init_timer(&priv->statistics_periodic); 1102 init_timer(&priv->statistics_periodic);
@@ -1129,7 +1110,7 @@ void iwl_setup_deferred_work(struct iwl_priv *priv)
1129 1110
1130void iwl_cancel_deferred_work(struct iwl_priv *priv) 1111void iwl_cancel_deferred_work(struct iwl_priv *priv)
1131{ 1112{
1132 if (cfg(priv)->bt_params) 1113 if (priv->cfg->bt_params)
1133 iwlagn_bt_cancel_deferred_work(priv); 1114 iwlagn_bt_cancel_deferred_work(priv);
1134 1115
1135 cancel_work_sync(&priv->run_time_calib_work); 1116 cancel_work_sync(&priv->run_time_calib_work);
@@ -1180,8 +1161,8 @@ static void iwl_init_ht_hw_capab(const struct iwl_priv *priv,
1180 1161
1181 ht_info->ht_supported = true; 1162 ht_info->ht_supported = true;
1182 1163
1183 if (cfg(priv)->ht_params && 1164 if (priv->cfg->ht_params &&
1184 cfg(priv)->ht_params->ht_greenfield_support) 1165 priv->cfg->ht_params->ht_greenfield_support)
1185 ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD; 1166 ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD;
1186 ht_info->cap |= IEEE80211_HT_CAP_SGI_20; 1167 ht_info->cap |= IEEE80211_HT_CAP_SGI_20;
1187 max_bit_rate = MAX_BIT_RATE_20_MHZ; 1168 max_bit_rate = MAX_BIT_RATE_20_MHZ;
@@ -1192,7 +1173,7 @@ static void iwl_init_ht_hw_capab(const struct iwl_priv *priv,
1192 max_bit_rate = MAX_BIT_RATE_40_MHZ; 1173 max_bit_rate = MAX_BIT_RATE_40_MHZ;
1193 } 1174 }
1194 1175
1195 if (iwlagn_mod_params.amsdu_size_8K) 1176 if (iwlwifi_mod_params.amsdu_size_8K)
1196 ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU; 1177 ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU;
1197 1178
1198 ht_info->ampdu_factor = CFG_HT_RX_AMPDU_FACTOR_DEF; 1179 ht_info->ampdu_factor = CFG_HT_RX_AMPDU_FACTOR_DEF;
@@ -1325,7 +1306,7 @@ static int iwl_init_geos(struct iwl_priv *priv)
1325 priv->hw_params.sku & EEPROM_SKU_CAP_BAND_52GHZ) { 1306 priv->hw_params.sku & EEPROM_SKU_CAP_BAND_52GHZ) {
1326 IWL_INFO(priv, "Incorrectly detected BG card as ABG. " 1307 IWL_INFO(priv, "Incorrectly detected BG card as ABG. "
1327 "Please send your %s to maintainer.\n", 1308 "Please send your %s to maintainer.\n",
1328 trans(priv)->hw_id_str); 1309 priv->trans->hw_id_str);
1329 priv->hw_params.sku &= ~EEPROM_SKU_CAP_BAND_52GHZ; 1310 priv->hw_params.sku &= ~EEPROM_SKU_CAP_BAND_52GHZ;
1330 } 1311 }
1331 1312
@@ -1363,7 +1344,7 @@ int iwl_init_drv(struct iwl_priv *priv)
1363 priv->band = IEEE80211_BAND_2GHZ; 1344 priv->band = IEEE80211_BAND_2GHZ;
1364 1345
1365 priv->plcp_delta_threshold = 1346 priv->plcp_delta_threshold =
1366 cfg(priv)->base_params->plcp_delta_threshold; 1347 priv->cfg->base_params->plcp_delta_threshold;
1367 1348
1368 priv->iw_mode = NL80211_IFTYPE_STATION; 1349 priv->iw_mode = NL80211_IFTYPE_STATION;
1369 priv->current_ht_config.smps = IEEE80211_SMPS_STATIC; 1350 priv->current_ht_config.smps = IEEE80211_SMPS_STATIC;
@@ -1380,8 +1361,8 @@ int iwl_init_drv(struct iwl_priv *priv)
1380 iwl_init_scan_params(priv); 1361 iwl_init_scan_params(priv);
1381 1362
1382 /* init bt coex */ 1363 /* init bt coex */
1383 if (cfg(priv)->bt_params && 1364 if (priv->cfg->bt_params &&
1384 cfg(priv)->bt_params->advanced_bt_coexist) { 1365 priv->cfg->bt_params->advanced_bt_coexist) {
1385 priv->kill_ack_mask = IWLAGN_BT_KILL_ACK_MASK_DEFAULT; 1366 priv->kill_ack_mask = IWLAGN_BT_KILL_ACK_MASK_DEFAULT;
1386 priv->kill_cts_mask = IWLAGN_BT_KILL_CTS_MASK_DEFAULT; 1367 priv->kill_cts_mask = IWLAGN_BT_KILL_CTS_MASK_DEFAULT;
1387 priv->bt_valid = IWLAGN_BT_ALL_VALID_MSK; 1368 priv->bt_valid = IWLAGN_BT_ALL_VALID_MSK;
@@ -1426,11 +1407,11 @@ void iwl_uninit_drv(struct iwl_priv *priv)
1426 1407
1427void iwl_set_hw_params(struct iwl_priv *priv) 1408void iwl_set_hw_params(struct iwl_priv *priv)
1428{ 1409{
1429 if (cfg(priv)->ht_params) 1410 if (priv->cfg->ht_params)
1430 priv->hw_params.use_rts_for_aggregation = 1411 priv->hw_params.use_rts_for_aggregation =
1431 cfg(priv)->ht_params->use_rts_for_aggregation; 1412 priv->cfg->ht_params->use_rts_for_aggregation;
1432 1413
1433 if (iwlagn_mod_params.disable_11n & IWL_DISABLE_HT_ALL) 1414 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL)
1434 priv->hw_params.sku &= ~EEPROM_SKU_CAP_11N_ENABLE; 1415 priv->hw_params.sku &= ~EEPROM_SKU_CAP_11N_ENABLE;
1435 1416
1436 /* Device-specific setup */ 1417 /* Device-specific setup */
@@ -1441,32 +1422,32 @@ void iwl_set_hw_params(struct iwl_priv *priv)
1441 1422
1442void iwl_debug_config(struct iwl_priv *priv) 1423void iwl_debug_config(struct iwl_priv *priv)
1443{ 1424{
1444 dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_DEBUG " 1425 dev_printk(KERN_INFO, priv->trans->dev, "CONFIG_IWLWIFI_DEBUG "
1445#ifdef CONFIG_IWLWIFI_DEBUG 1426#ifdef CONFIG_IWLWIFI_DEBUG
1446 "enabled\n"); 1427 "enabled\n");
1447#else 1428#else
1448 "disabled\n"); 1429 "disabled\n");
1449#endif 1430#endif
1450 dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_DEBUGFS " 1431 dev_printk(KERN_INFO, priv->trans->dev, "CONFIG_IWLWIFI_DEBUGFS "
1451#ifdef CONFIG_IWLWIFI_DEBUGFS 1432#ifdef CONFIG_IWLWIFI_DEBUGFS
1452 "enabled\n"); 1433 "enabled\n");
1453#else 1434#else
1454 "disabled\n"); 1435 "disabled\n");
1455#endif 1436#endif
1456 dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_DEVICE_TRACING " 1437 dev_printk(KERN_INFO, priv->trans->dev, "CONFIG_IWLWIFI_DEVICE_TRACING "
1457#ifdef CONFIG_IWLWIFI_DEVICE_TRACING 1438#ifdef CONFIG_IWLWIFI_DEVICE_TRACING
1458 "enabled\n"); 1439 "enabled\n");
1459#else 1440#else
1460 "disabled\n"); 1441 "disabled\n");
1461#endif 1442#endif
1462 1443
1463 dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_DEVICE_TESTMODE " 1444 dev_printk(KERN_INFO, priv->trans->dev, "CONFIG_IWLWIFI_DEVICE_TESTMODE "
1464#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE 1445#ifdef CONFIG_IWLWIFI_DEVICE_TESTMODE
1465 "enabled\n"); 1446 "enabled\n");
1466#else 1447#else
1467 "disabled\n"); 1448 "disabled\n");
1468#endif 1449#endif
1469 dev_printk(KERN_INFO, trans(priv)->dev, "CONFIG_IWLWIFI_P2P " 1450 dev_printk(KERN_INFO, priv->trans->dev, "CONFIG_IWLWIFI_P2P "
1470#ifdef CONFIG_IWLWIFI_P2P 1451#ifdef CONFIG_IWLWIFI_P2P
1471 "enabled\n"); 1452 "enabled\n");
1472#else 1453#else
@@ -1475,6 +1456,7 @@ void iwl_debug_config(struct iwl_priv *priv)
1475} 1456}
1476 1457
1477static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, 1458static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1459 const struct iwl_cfg *cfg,
1478 const struct iwl_fw *fw) 1460 const struct iwl_fw *fw)
1479{ 1461{
1480 struct iwl_priv *priv; 1462 struct iwl_priv *priv;
@@ -1491,8 +1473,6 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1491 STATISTICS_NOTIFICATION, 1473 STATISTICS_NOTIFICATION,
1492 REPLY_TX, 1474 REPLY_TX,
1493 }; 1475 };
1494 const u8 *q_to_ac;
1495 int n_q_to_ac;
1496 int i; 1476 int i;
1497 1477
1498 /************************ 1478 /************************
@@ -1500,18 +1480,19 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1500 ************************/ 1480 ************************/
1501 hw = iwl_alloc_all(); 1481 hw = iwl_alloc_all();
1502 if (!hw) { 1482 if (!hw) {
1503 pr_err("%s: Cannot allocate network device\n", 1483 pr_err("%s: Cannot allocate network device\n", cfg->name);
1504 cfg(trans)->name);
1505 goto out; 1484 goto out;
1506 } 1485 }
1507 1486
1508 op_mode = hw->priv; 1487 op_mode = hw->priv;
1509 op_mode->ops = &iwl_dvm_ops; 1488 op_mode->ops = &iwl_dvm_ops;
1510 priv = IWL_OP_MODE_GET_DVM(op_mode); 1489 priv = IWL_OP_MODE_GET_DVM(op_mode);
1511 priv->shrd = trans->shrd; 1490 priv->trans = trans;
1491 priv->dev = trans->dev;
1492 priv->cfg = cfg;
1512 priv->fw = fw; 1493 priv->fw = fw;
1513 1494
1514 switch (cfg(priv)->device_family) { 1495 switch (priv->cfg->device_family) {
1515 case IWL_DEVICE_FAMILY_1000: 1496 case IWL_DEVICE_FAMILY_1000:
1516 case IWL_DEVICE_FAMILY_100: 1497 case IWL_DEVICE_FAMILY_100:
1517 priv->lib = &iwl1000_lib; 1498 priv->lib = &iwl1000_lib;
@@ -1545,7 +1526,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1545 } 1526 }
1546 1527
1547 if (WARN_ON(!priv->lib)) 1528 if (WARN_ON(!priv->lib))
1548 goto out_free_traffic_mem; 1529 goto out_free_hw;
1549 1530
1550 /* 1531 /*
1551 * Populate the state variables that the transport layer needs 1532 * Populate the state variables that the transport layer needs
@@ -1554,10 +1535,10 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1554 trans_cfg.op_mode = op_mode; 1535 trans_cfg.op_mode = op_mode;
1555 trans_cfg.no_reclaim_cmds = no_reclaim_cmds; 1536 trans_cfg.no_reclaim_cmds = no_reclaim_cmds;
1556 trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds); 1537 trans_cfg.n_no_reclaim_cmds = ARRAY_SIZE(no_reclaim_cmds);
1557 trans_cfg.rx_buf_size_8k = iwlagn_mod_params.amsdu_size_8K; 1538 trans_cfg.rx_buf_size_8k = iwlwifi_mod_params.amsdu_size_8K;
1558 if (!iwlagn_mod_params.wd_disable) 1539 if (!iwlwifi_mod_params.wd_disable)
1559 trans_cfg.queue_watchdog_timeout = 1540 trans_cfg.queue_watchdog_timeout =
1560 cfg(priv)->base_params->wd_timeout; 1541 priv->cfg->base_params->wd_timeout;
1561 else 1542 else
1562 trans_cfg.queue_watchdog_timeout = IWL_WATCHHDOG_DISABLED; 1543 trans_cfg.queue_watchdog_timeout = IWL_WATCHHDOG_DISABLED;
1563 trans_cfg.command_names = iwl_dvm_cmd_strings; 1544 trans_cfg.command_names = iwl_dvm_cmd_strings;
@@ -1574,24 +1555,20 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1574 trans_cfg.queue_to_fifo = iwlagn_ipan_queue_to_tx_fifo; 1555 trans_cfg.queue_to_fifo = iwlagn_ipan_queue_to_tx_fifo;
1575 trans_cfg.n_queue_to_fifo = 1556 trans_cfg.n_queue_to_fifo =
1576 ARRAY_SIZE(iwlagn_ipan_queue_to_tx_fifo); 1557 ARRAY_SIZE(iwlagn_ipan_queue_to_tx_fifo);
1577 q_to_ac = iwlagn_pan_queue_to_ac;
1578 n_q_to_ac = ARRAY_SIZE(iwlagn_pan_queue_to_ac);
1579 } else { 1558 } else {
1580 priv->sta_key_max_num = STA_KEY_MAX_NUM; 1559 priv->sta_key_max_num = STA_KEY_MAX_NUM;
1581 trans_cfg.cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM; 1560 trans_cfg.cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM;
1582 trans_cfg.queue_to_fifo = iwlagn_default_queue_to_tx_fifo; 1561 trans_cfg.queue_to_fifo = iwlagn_default_queue_to_tx_fifo;
1583 trans_cfg.n_queue_to_fifo = 1562 trans_cfg.n_queue_to_fifo =
1584 ARRAY_SIZE(iwlagn_default_queue_to_tx_fifo); 1563 ARRAY_SIZE(iwlagn_default_queue_to_tx_fifo);
1585 q_to_ac = iwlagn_bss_queue_to_ac;
1586 n_q_to_ac = ARRAY_SIZE(iwlagn_bss_queue_to_ac);
1587 } 1564 }
1588 1565
1589 /* Configure transport layer */ 1566 /* Configure transport layer */
1590 iwl_trans_configure(trans(priv), &trans_cfg); 1567 iwl_trans_configure(priv->trans, &trans_cfg);
1591 1568
1592 /* At this point both hw and priv are allocated. */ 1569 /* At this point both hw and priv are allocated. */
1593 1570
1594 SET_IEEE80211_DEV(priv->hw, trans(priv)->dev); 1571 SET_IEEE80211_DEV(priv->hw, priv->trans->dev);
1595 1572
1596 /* show what debugging capabilities we have */ 1573 /* show what debugging capabilities we have */
1597 iwl_debug_config(priv); 1574 iwl_debug_config(priv);
@@ -1600,40 +1577,37 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1600 1577
1601 /* is antenna coupling more than 35dB ? */ 1578 /* is antenna coupling more than 35dB ? */
1602 priv->bt_ant_couple_ok = 1579 priv->bt_ant_couple_ok =
1603 (iwlagn_mod_params.ant_coupling > 1580 (iwlwifi_mod_params.ant_coupling >
1604 IWL_BT_ANTENNA_COUPLING_THRESHOLD) ? 1581 IWL_BT_ANTENNA_COUPLING_THRESHOLD) ?
1605 true : false; 1582 true : false;
1606 1583
1607 /* enable/disable bt channel inhibition */ 1584 /* enable/disable bt channel inhibition */
1608 priv->bt_ch_announce = iwlagn_mod_params.bt_ch_announce; 1585 priv->bt_ch_announce = iwlwifi_mod_params.bt_ch_announce;
1609 IWL_DEBUG_INFO(priv, "BT channel inhibition is %s\n", 1586 IWL_DEBUG_INFO(priv, "BT channel inhibition is %s\n",
1610 (priv->bt_ch_announce) ? "On" : "Off"); 1587 (priv->bt_ch_announce) ? "On" : "Off");
1611 1588
1612 if (iwl_alloc_traffic_mem(priv))
1613 IWL_ERR(priv, "Not enough memory to generate traffic log\n");
1614
1615 /* these spin locks will be used in apm_ops.init and EEPROM access 1589 /* these spin locks will be used in apm_ops.init and EEPROM access
1616 * we should init now 1590 * we should init now
1617 */ 1591 */
1618 spin_lock_init(&trans(priv)->reg_lock); 1592 spin_lock_init(&priv->trans->reg_lock);
1619 spin_lock_init(&priv->statistics.lock); 1593 spin_lock_init(&priv->statistics.lock);
1620 1594
1621 /*********************** 1595 /***********************
1622 * 2. Read REV register 1596 * 2. Read REV register
1623 ***********************/ 1597 ***********************/
1624 IWL_INFO(priv, "Detected %s, REV=0x%X\n", 1598 IWL_INFO(priv, "Detected %s, REV=0x%X\n",
1625 cfg(priv)->name, trans(priv)->hw_rev); 1599 priv->cfg->name, priv->trans->hw_rev);
1626 1600
1627 if (iwl_trans_start_hw(trans(priv))) 1601 if (iwl_trans_start_hw(priv->trans))
1628 goto out_free_traffic_mem; 1602 goto out_free_hw;
1629 1603
1630 /* Read the EEPROM */ 1604 /* Read the EEPROM */
1631 if (iwl_eeprom_init(priv, trans(priv)->hw_rev)) { 1605 if (iwl_eeprom_init(priv, priv->trans->hw_rev)) {
1632 IWL_ERR(priv, "Unable to init EEPROM\n"); 1606 IWL_ERR(priv, "Unable to init EEPROM\n");
1633 goto out_free_traffic_mem; 1607 goto out_free_hw;
1634 } 1608 }
1635 /* Reset chip to save power until we load uCode during "up". */ 1609 /* Reset chip to save power until we load uCode during "up". */
1636 iwl_trans_stop_hw(trans(priv)); 1610 iwl_trans_stop_hw(priv->trans, false);
1637 1611
1638 if (iwl_eeprom_check_version(priv)) 1612 if (iwl_eeprom_check_version(priv))
1639 goto out_free_eeprom; 1613 goto out_free_eeprom;
@@ -1672,24 +1646,21 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1672 trans_cfg.queue_to_fifo = iwlagn_default_queue_to_tx_fifo; 1646 trans_cfg.queue_to_fifo = iwlagn_default_queue_to_tx_fifo;
1673 trans_cfg.n_queue_to_fifo = 1647 trans_cfg.n_queue_to_fifo =
1674 ARRAY_SIZE(iwlagn_default_queue_to_tx_fifo); 1648 ARRAY_SIZE(iwlagn_default_queue_to_tx_fifo);
1675 q_to_ac = iwlagn_bss_queue_to_ac;
1676 n_q_to_ac = ARRAY_SIZE(iwlagn_bss_queue_to_ac);
1677 1649
1678 /* Configure transport layer again*/ 1650 /* Configure transport layer again*/
1679 iwl_trans_configure(trans(priv), &trans_cfg); 1651 iwl_trans_configure(priv->trans, &trans_cfg);
1680 } 1652 }
1681 1653
1682 /******************* 1654 /*******************
1683 * 5. Setup priv 1655 * 5. Setup priv
1684 *******************/ 1656 *******************/
1685 for (i = 0; i < IEEE80211_NUM_ACS; i++)
1686 atomic_set(&priv->ac_stop_count[i], 0);
1687
1688 for (i = 0; i < IWL_MAX_HW_QUEUES; i++) { 1657 for (i = 0; i < IWL_MAX_HW_QUEUES; i++) {
1689 if (i < n_q_to_ac) 1658 priv->queue_to_mac80211[i] = IWL_INVALID_MAC80211_QUEUE;
1690 priv->queue_to_ac[i] = q_to_ac[i]; 1659 if (i < IWLAGN_FIRST_AMPDU_QUEUE &&
1691 else 1660 i != IWL_DEFAULT_CMD_QUEUE_NUM &&
1692 priv->queue_to_ac[i] = IWL_INVALID_AC; 1661 i != IWL_IPAN_CMD_QUEUE_NUM)
1662 priv->queue_to_mac80211[i] = i;
1663 atomic_set(&priv->queue_stop_count[i], 0);
1693 } 1664 }
1694 1665
1695 WARN_ON(trans_cfg.queue_to_fifo[trans_cfg.cmd_queue] != 1666 WARN_ON(trans_cfg.queue_to_fifo[trans_cfg.cmd_queue] !=
@@ -1745,8 +1716,7 @@ out_destroy_workqueue:
1745 iwl_uninit_drv(priv); 1716 iwl_uninit_drv(priv);
1746out_free_eeprom: 1717out_free_eeprom:
1747 iwl_eeprom_free(priv); 1718 iwl_eeprom_free(priv);
1748out_free_traffic_mem: 1719out_free_hw:
1749 iwl_free_traffic_mem(priv);
1750 ieee80211_free_hw(priv->hw); 1720 ieee80211_free_hw(priv->hw);
1751out: 1721out:
1752 op_mode = NULL; 1722 op_mode = NULL;
@@ -1768,7 +1738,7 @@ void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode)
1768 1738
1769 /*This will stop the queues, move the device to low power state */ 1739 /*This will stop the queues, move the device to low power state */
1770 priv->ucode_loaded = false; 1740 priv->ucode_loaded = false;
1771 iwl_trans_stop_device(trans(priv)); 1741 iwl_trans_stop_device(priv->trans);
1772 1742
1773 iwl_eeprom_free(priv); 1743 iwl_eeprom_free(priv);
1774 1744
@@ -1780,12 +1750,12 @@ void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode)
1780 * until now... */ 1750 * until now... */
1781 destroy_workqueue(priv->workqueue); 1751 destroy_workqueue(priv->workqueue);
1782 priv->workqueue = NULL; 1752 priv->workqueue = NULL;
1783 iwl_free_traffic_mem(priv);
1784 1753
1785 iwl_uninit_drv(priv); 1754 iwl_uninit_drv(priv);
1786 1755
1787 dev_kfree_skb(priv->beacon_skb); 1756 dev_kfree_skb(priv->beacon_skb);
1788 1757
1758 iwl_trans_stop_hw(priv->trans, true);
1789 ieee80211_free_hw(priv->hw); 1759 ieee80211_free_hw(priv->hw);
1790} 1760}
1791 1761
@@ -1860,7 +1830,7 @@ static const char *desc_lookup(u32 num)
1860 1830
1861static void iwl_dump_nic_error_log(struct iwl_priv *priv) 1831static void iwl_dump_nic_error_log(struct iwl_priv *priv)
1862{ 1832{
1863 struct iwl_trans *trans = trans(priv); 1833 struct iwl_trans *trans = priv->trans;
1864 u32 base; 1834 u32 base;
1865 struct iwl_error_event_table table; 1835 struct iwl_error_event_table table;
1866 1836
@@ -1950,7 +1920,7 @@ static int iwl_print_event_log(struct iwl_priv *priv, u32 start_idx,
1950 u32 ev, time, data; /* event log data */ 1920 u32 ev, time, data; /* event log data */
1951 unsigned long reg_flags; 1921 unsigned long reg_flags;
1952 1922
1953 struct iwl_trans *trans = trans(priv); 1923 struct iwl_trans *trans = priv->trans;
1954 1924
1955 if (num_events == 0) 1925 if (num_events == 0)
1956 return pos; 1926 return pos;
@@ -2068,7 +2038,7 @@ int iwl_dump_nic_event_log(struct iwl_priv *priv, bool full_log,
2068 u32 logsize; 2038 u32 logsize;
2069 int pos = 0; 2039 int pos = 0;
2070 size_t bufsz = 0; 2040 size_t bufsz = 0;
2071 struct iwl_trans *trans = trans(priv); 2041 struct iwl_trans *trans = priv->trans;
2072 2042
2073 base = priv->device_pointers.log_event_table; 2043 base = priv->device_pointers.log_event_table;
2074 if (priv->cur_ucode == IWL_UCODE_INIT) { 2044 if (priv->cur_ucode == IWL_UCODE_INIT) {
@@ -2184,7 +2154,7 @@ static void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
2184 * commands by clearing the ready bit */ 2154 * commands by clearing the ready bit */
2185 clear_bit(STATUS_READY, &priv->status); 2155 clear_bit(STATUS_READY, &priv->status);
2186 2156
2187 wake_up(&trans(priv)->wait_command_queue); 2157 wake_up(&priv->trans->wait_command_queue);
2188 2158
2189 if (!ondemand) { 2159 if (!ondemand) {
2190 /* 2160 /*
@@ -2208,7 +2178,7 @@ static void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
2208 } 2178 }
2209 2179
2210 if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) { 2180 if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) {
2211 if (iwlagn_mod_params.restart_fw) { 2181 if (iwlwifi_mod_params.restart_fw) {
2212 IWL_DEBUG_FW_ERRORS(priv, 2182 IWL_DEBUG_FW_ERRORS(priv,
2213 "Restarting adapter due to uCode error.\n"); 2183 "Restarting adapter due to uCode error.\n");
2214 queue_work(priv->workqueue, &priv->restart); 2184 queue_work(priv->workqueue, &priv->restart);
@@ -2259,56 +2229,56 @@ static void iwl_wimax_active(struct iwl_op_mode *op_mode)
2259void iwl_stop_sw_queue(struct iwl_op_mode *op_mode, int queue) 2229void iwl_stop_sw_queue(struct iwl_op_mode *op_mode, int queue)
2260{ 2230{
2261 struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode); 2231 struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2262 int ac = priv->queue_to_ac[queue]; 2232 int mq = priv->queue_to_mac80211[queue];
2263 2233
2264 if (WARN_ON_ONCE(ac == IWL_INVALID_AC)) 2234 if (WARN_ON_ONCE(mq == IWL_INVALID_MAC80211_QUEUE))
2265 return; 2235 return;
2266 2236
2267 if (atomic_inc_return(&priv->ac_stop_count[ac]) > 1) { 2237 if (atomic_inc_return(&priv->queue_stop_count[mq]) > 1) {
2268 IWL_DEBUG_TX_QUEUES(priv, 2238 IWL_DEBUG_TX_QUEUES(priv,
2269 "queue %d (AC %d) already stopped\n", 2239 "queue %d (mac80211 %d) already stopped\n",
2270 queue, ac); 2240 queue, mq);
2271 return; 2241 return;
2272 } 2242 }
2273 2243
2274 set_bit(ac, &priv->transport_queue_stop); 2244 set_bit(mq, &priv->transport_queue_stop);
2275 ieee80211_stop_queue(priv->hw, ac); 2245 ieee80211_stop_queue(priv->hw, mq);
2276} 2246}
2277 2247
2278void iwl_wake_sw_queue(struct iwl_op_mode *op_mode, int queue) 2248void iwl_wake_sw_queue(struct iwl_op_mode *op_mode, int queue)
2279{ 2249{
2280 struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode); 2250 struct iwl_priv *priv = IWL_OP_MODE_GET_DVM(op_mode);
2281 int ac = priv->queue_to_ac[queue]; 2251 int mq = priv->queue_to_mac80211[queue];
2282 2252
2283 if (WARN_ON_ONCE(ac == IWL_INVALID_AC)) 2253 if (WARN_ON_ONCE(mq == IWL_INVALID_MAC80211_QUEUE))
2284 return; 2254 return;
2285 2255
2286 if (atomic_dec_return(&priv->ac_stop_count[ac]) > 0) { 2256 if (atomic_dec_return(&priv->queue_stop_count[mq]) > 0) {
2287 IWL_DEBUG_TX_QUEUES(priv, 2257 IWL_DEBUG_TX_QUEUES(priv,
2288 "queue %d (AC %d) already awake\n", 2258 "queue %d (mac80211 %d) already awake\n",
2289 queue, ac); 2259 queue, mq);
2290 return; 2260 return;
2291 } 2261 }
2292 2262
2293 clear_bit(ac, &priv->transport_queue_stop); 2263 clear_bit(mq, &priv->transport_queue_stop);
2294 2264
2295 if (!priv->passive_no_rx) 2265 if (!priv->passive_no_rx)
2296 ieee80211_wake_queue(priv->hw, ac); 2266 ieee80211_wake_queue(priv->hw, mq);
2297} 2267}
2298 2268
2299void iwlagn_lift_passive_no_rx(struct iwl_priv *priv) 2269void iwlagn_lift_passive_no_rx(struct iwl_priv *priv)
2300{ 2270{
2301 int ac; 2271 int mq;
2302 2272
2303 if (!priv->passive_no_rx) 2273 if (!priv->passive_no_rx)
2304 return; 2274 return;
2305 2275
2306 for (ac = IEEE80211_AC_VO; ac < IEEE80211_NUM_ACS; ac++) { 2276 for (mq = 0; mq < IWLAGN_FIRST_AMPDU_QUEUE; mq++) {
2307 if (!test_bit(ac, &priv->transport_queue_stop)) { 2277 if (!test_bit(mq, &priv->transport_queue_stop)) {
2308 IWL_DEBUG_TX_QUEUES(priv, "Wake queue %d"); 2278 IWL_DEBUG_TX_QUEUES(priv, "Wake queue %d", mq);
2309 ieee80211_wake_queue(priv->hw, ac); 2279 ieee80211_wake_queue(priv->hw, mq);
2310 } else { 2280 } else {
2311 IWL_DEBUG_TX_QUEUES(priv, "Don't wake queue %d"); 2281 IWL_DEBUG_TX_QUEUES(priv, "Don't wake queue %d", mq);
2312 } 2282 }
2313 } 2283 }
2314 2284
@@ -2398,77 +2368,3 @@ static void __exit iwl_exit(void)
2398 2368
2399module_exit(iwl_exit); 2369module_exit(iwl_exit);
2400module_init(iwl_init); 2370module_init(iwl_init);
2401
2402#ifdef CONFIG_IWLWIFI_DEBUG
2403module_param_named(debug, iwlagn_mod_params.debug_level, uint,
2404 S_IRUGO | S_IWUSR);
2405MODULE_PARM_DESC(debug, "debug output mask");
2406#endif
2407
2408module_param_named(swcrypto, iwlagn_mod_params.sw_crypto, int, S_IRUGO);
2409MODULE_PARM_DESC(swcrypto, "using crypto in software (default 0 [hardware])");
2410module_param_named(11n_disable, iwlagn_mod_params.disable_11n, uint, S_IRUGO);
2411MODULE_PARM_DESC(11n_disable,
2412 "disable 11n functionality, bitmap: 1: full, 2: agg TX, 4: agg RX");
2413module_param_named(amsdu_size_8K, iwlagn_mod_params.amsdu_size_8K,
2414 int, S_IRUGO);
2415MODULE_PARM_DESC(amsdu_size_8K, "enable 8K amsdu size");
2416module_param_named(fw_restart, iwlagn_mod_params.restart_fw, int, S_IRUGO);
2417MODULE_PARM_DESC(fw_restart, "restart firmware in case of error");
2418
2419module_param_named(antenna_coupling, iwlagn_mod_params.ant_coupling,
2420 int, S_IRUGO);
2421MODULE_PARM_DESC(antenna_coupling,
2422 "specify antenna coupling in dB (defualt: 0 dB)");
2423
2424module_param_named(bt_ch_inhibition, iwlagn_mod_params.bt_ch_announce,
2425 bool, S_IRUGO);
2426MODULE_PARM_DESC(bt_ch_inhibition,
2427 "Enable BT channel inhibition (default: enable)");
2428
2429module_param_named(plcp_check, iwlagn_mod_params.plcp_check, bool, S_IRUGO);
2430MODULE_PARM_DESC(plcp_check, "Check plcp health (default: 1 [enabled])");
2431
2432module_param_named(wd_disable, iwlagn_mod_params.wd_disable, int, S_IRUGO);
2433MODULE_PARM_DESC(wd_disable,
2434 "Disable stuck queue watchdog timer 0=system default, "
2435 "1=disable, 2=enable (default: 0)");
2436
2437/*
2438 * set bt_coex_active to true, uCode will do kill/defer
2439 * every time the priority line is asserted (BT is sending signals on the
2440 * priority line in the PCIx).
2441 * set bt_coex_active to false, uCode will ignore the BT activity and
2442 * perform the normal operation
2443 *
2444 * User might experience transmit issue on some platform due to WiFi/BT
2445 * co-exist problem. The possible behaviors are:
2446 * Able to scan and finding all the available AP
2447 * Not able to associate with any AP
2448 * On those platforms, WiFi communication can be restored by set
2449 * "bt_coex_active" module parameter to "false"
2450 *
2451 * default: bt_coex_active = true (BT_COEX_ENABLE)
2452 */
2453module_param_named(bt_coex_active, iwlagn_mod_params.bt_coex_active,
2454 bool, S_IRUGO);
2455MODULE_PARM_DESC(bt_coex_active, "enable wifi/bt co-exist (default: enable)");
2456
2457module_param_named(led_mode, iwlagn_mod_params.led_mode, int, S_IRUGO);
2458MODULE_PARM_DESC(led_mode, "0=system default, "
2459 "1=On(RF On)/Off(RF Off), 2=blinking, 3=Off (default: 0)");
2460
2461module_param_named(power_save, iwlagn_mod_params.power_save,
2462 bool, S_IRUGO);
2463MODULE_PARM_DESC(power_save,
2464 "enable WiFi power management (default: disable)");
2465
2466module_param_named(power_level, iwlagn_mod_params.power_level,
2467 int, S_IRUGO);
2468MODULE_PARM_DESC(power_level,
2469 "default power save level (range from 1 - 5, default: 1)");
2470
2471module_param_named(auto_agg, iwlagn_mod_params.auto_agg,
2472 bool, S_IRUGO);
2473MODULE_PARM_DESC(auto_agg,
2474 "enable agg w/o check traffic load (default: enable)");