1 /******************************************************************************
3 * Copyright(c) 2003 - 2007 Intel Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
21 * Contact Information:
22 * James P. Ketrenos <ipw2100-admin@linux.intel.com>
23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25 *****************************************************************************/
27 #include <linux/kernel.h>
28 #include <linux/module.h>
29 #include <linux/version.h>
30 #include <linux/init.h>
31 #include <linux/pci.h>
32 #include <linux/dma-mapping.h>
33 #include <linux/delay.h>
34 #include <linux/skbuff.h>
35 #include <linux/netdevice.h>
36 #include <linux/wireless.h>
37 #include <net/mac80211.h>
38 #include <linux/etherdevice.h>
39 #include <asm/unaligned.h>
42 #include "iwl-helpers.h"
44 static void iwl4965_hw_card_show_info(struct iwl4965_priv
*priv
);
46 #define IWL_DECLARE_RATE_INFO(r, s, ip, in, rp, rn, pp, np) \
47 [IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP, \
48 IWL_RATE_SISO_##s##M_PLCP, \
49 IWL_RATE_MIMO_##s##M_PLCP, \
50 IWL_RATE_##r##M_IEEE, \
51 IWL_RATE_##ip##M_INDEX, \
52 IWL_RATE_##in##M_INDEX, \
53 IWL_RATE_##rp##M_INDEX, \
54 IWL_RATE_##rn##M_INDEX, \
55 IWL_RATE_##pp##M_INDEX, \
56 IWL_RATE_##np##M_INDEX }
60 * rate, ht rate, prev rate, next rate, prev tgg rate, next tgg rate
62 * If there isn't a valid next or previous rate then INV is used which
63 * maps to IWL_RATE_INVALID
66 const struct iwl4965_rate_info iwl4965_rates
[IWL_RATE_COUNT
] = {
67 IWL_DECLARE_RATE_INFO(1, INV
, INV
, 2, INV
, 2, INV
, 2), /* 1mbps */
68 IWL_DECLARE_RATE_INFO(2, INV
, 1, 5, 1, 5, 1, 5), /* 2mbps */
69 IWL_DECLARE_RATE_INFO(5, INV
, 2, 6, 2, 11, 2, 11), /*5.5mbps */
70 IWL_DECLARE_RATE_INFO(11, INV
, 9, 12, 9, 12, 5, 18), /* 11mbps */
71 IWL_DECLARE_RATE_INFO(6, 6, 5, 9, 5, 11, 5, 11), /* 6mbps */
72 IWL_DECLARE_RATE_INFO(9, 6, 6, 11, 6, 11, 5, 11), /* 9mbps */
73 IWL_DECLARE_RATE_INFO(12, 12, 11, 18, 11, 18, 11, 18), /* 12mbps */
74 IWL_DECLARE_RATE_INFO(18, 18, 12, 24, 12, 24, 11, 24), /* 18mbps */
75 IWL_DECLARE_RATE_INFO(24, 24, 18, 36, 18, 36, 18, 36), /* 24mbps */
76 IWL_DECLARE_RATE_INFO(36, 36, 24, 48, 24, 48, 24, 48), /* 36mbps */
77 IWL_DECLARE_RATE_INFO(48, 48, 36, 54, 36, 54, 36, 54), /* 48mbps */
78 IWL_DECLARE_RATE_INFO(54, 54, 48, INV
, 48, INV
, 48, INV
),/* 54mbps */
79 IWL_DECLARE_RATE_INFO(60, 60, 48, INV
, 48, INV
, 48, INV
),/* 60mbps */
82 static int is_fat_channel(__le32 rxon_flags
)
84 return (rxon_flags
& RXON_FLG_CHANNEL_MODE_PURE_40_MSK
) ||
85 (rxon_flags
& RXON_FLG_CHANNEL_MODE_MIXED_MSK
);
88 static u8
is_single_stream(struct iwl4965_priv
*priv
)
90 #ifdef CONFIG_IWL4965_HT
91 if (!priv
->current_ht_config
.is_ht
||
92 (priv
->current_ht_config
.supp_mcs_set
[1] == 0) ||
93 (priv
->ps_mode
== IWL_MIMO_PS_STATIC
))
97 #endif /*CONFIG_IWL4965_HT */
102 * Determine how many receiver/antenna chains to use.
103 * More provides better reception via diversity. Fewer saves power.
104 * MIMO (dual stream) requires at least 2, but works better with 3.
105 * This does not determine *which* chains to use, just how many.
107 static int iwl4965_get_rx_chain_counter(struct iwl4965_priv
*priv
,
108 u8
*idle_state
, u8
*rx_state
)
110 u8 is_single
= is_single_stream(priv
);
111 u8 is_cam
= test_bit(STATUS_POWER_PMI
, &priv
->status
) ? 0 : 1;
113 /* # of Rx chains to use when expecting MIMO. */
114 if (is_single
|| (!is_cam
&& (priv
->ps_mode
== IWL_MIMO_PS_STATIC
)))
119 /* # Rx chains when idling and maybe trying to save power */
120 switch (priv
->ps_mode
) {
121 case IWL_MIMO_PS_STATIC
:
122 case IWL_MIMO_PS_DYNAMIC
:
123 *idle_state
= (is_cam
) ? 2 : 1;
125 case IWL_MIMO_PS_NONE
:
126 *idle_state
= (is_cam
) ? *rx_state
: 1;
136 int iwl4965_hw_rxq_stop(struct iwl4965_priv
*priv
)
141 spin_lock_irqsave(&priv
->lock
, flags
);
142 rc
= iwl4965_grab_nic_access(priv
);
144 spin_unlock_irqrestore(&priv
->lock
, flags
);
149 iwl4965_write_direct32(priv
, FH_MEM_RCSR_CHNL0_CONFIG_REG
, 0);
150 rc
= iwl4965_poll_direct_bit(priv
, FH_MEM_RSSR_RX_STATUS_REG
,
153 IWL_ERROR("Can't stop Rx DMA.\n");
155 iwl4965_release_nic_access(priv
);
156 spin_unlock_irqrestore(&priv
->lock
, flags
);
161 u8
iwl4965_hw_find_station(struct iwl4965_priv
*priv
, const u8
*addr
)
165 int ret
= IWL_INVALID_STATION
;
167 DECLARE_MAC_BUF(mac
);
169 if ((priv
->iw_mode
== IEEE80211_IF_TYPE_IBSS
) ||
170 (priv
->iw_mode
== IEEE80211_IF_TYPE_AP
))
173 if (is_broadcast_ether_addr(addr
))
174 return IWL4965_BROADCAST_ID
;
176 spin_lock_irqsave(&priv
->sta_lock
, flags
);
177 for (i
= start
; i
< priv
->hw_setting
.max_stations
; i
++)
178 if ((priv
->stations
[i
].used
) &&
180 (priv
->stations
[i
].sta
.sta
.addr
, addr
))) {
185 IWL_DEBUG_ASSOC_LIMIT("can not find STA %s total %d\n",
186 print_mac(mac
, addr
), priv
->num_stations
);
189 spin_unlock_irqrestore(&priv
->sta_lock
, flags
);
193 static int iwl4965_nic_set_pwr_src(struct iwl4965_priv
*priv
, int pwr_max
)
198 spin_lock_irqsave(&priv
->lock
, flags
);
199 ret
= iwl4965_grab_nic_access(priv
);
201 spin_unlock_irqrestore(&priv
->lock
, flags
);
208 ret
= pci_read_config_dword(priv
->pci_dev
, PCI_POWER_SOURCE
,
211 if (val
& PCI_CFG_PMC_PME_FROM_D3COLD_SUPPORT
)
212 iwl4965_set_bits_mask_prph(priv
, APMG_PS_CTRL_REG
,
213 APMG_PS_CTRL_VAL_PWR_SRC_VAUX
,
214 ~APMG_PS_CTRL_MSK_PWR_SRC
);
216 iwl4965_set_bits_mask_prph(priv
, APMG_PS_CTRL_REG
,
217 APMG_PS_CTRL_VAL_PWR_SRC_VMAIN
,
218 ~APMG_PS_CTRL_MSK_PWR_SRC
);
220 iwl4965_release_nic_access(priv
);
221 spin_unlock_irqrestore(&priv
->lock
, flags
);
226 static int iwl4965_rx_init(struct iwl4965_priv
*priv
, struct iwl4965_rx_queue
*rxq
)
230 unsigned int rb_size
;
232 spin_lock_irqsave(&priv
->lock
, flags
);
233 rc
= iwl4965_grab_nic_access(priv
);
235 spin_unlock_irqrestore(&priv
->lock
, flags
);
239 if (iwl4965_param_amsdu_size_8K
)
240 rb_size
= FH_RCSR_RX_CONFIG_REG_VAL_RB_SIZE_8K
;
242 rb_size
= FH_RCSR_RX_CONFIG_REG_VAL_RB_SIZE_4K
;
245 iwl4965_write_direct32(priv
, FH_MEM_RCSR_CHNL0_CONFIG_REG
, 0);
247 /* Reset driver's Rx queue write index */
248 iwl4965_write_direct32(priv
, FH_RSCSR_CHNL0_RBDCB_WPTR_REG
, 0);
250 /* Tell device where to find RBD circular buffer in DRAM */
251 iwl4965_write_direct32(priv
, FH_RSCSR_CHNL0_RBDCB_BASE_REG
,
254 /* Tell device where in DRAM to update its Rx status */
255 iwl4965_write_direct32(priv
, FH_RSCSR_CHNL0_STTS_WPTR_REG
,
256 (priv
->hw_setting
.shared_phys
+
257 offsetof(struct iwl4965_shared
, val0
)) >> 4);
259 /* Enable Rx DMA, enable host interrupt, Rx buffer size 4k, 256 RBDs */
260 iwl4965_write_direct32(priv
, FH_MEM_RCSR_CHNL0_CONFIG_REG
,
261 FH_RCSR_RX_CONFIG_CHNL_EN_ENABLE_VAL
|
262 FH_RCSR_CHNL0_RX_CONFIG_IRQ_DEST_INT_HOST_VAL
|
265 (RX_QUEUE_SIZE_LOG
<<
266 FH_RCSR_RX_CONFIG_RBDCB_SIZE_BITSHIFT
));
269 * iwl4965_write32(priv,CSR_INT_COAL_REG,0);
272 iwl4965_release_nic_access(priv
);
273 spin_unlock_irqrestore(&priv
->lock
, flags
);
278 /* Tell 4965 where to find the "keep warm" buffer */
279 static int iwl4965_kw_init(struct iwl4965_priv
*priv
)
284 spin_lock_irqsave(&priv
->lock
, flags
);
285 rc
= iwl4965_grab_nic_access(priv
);
289 iwl4965_write_direct32(priv
, IWL_FH_KW_MEM_ADDR_REG
,
290 priv
->kw
.dma_addr
>> 4);
291 iwl4965_release_nic_access(priv
);
293 spin_unlock_irqrestore(&priv
->lock
, flags
);
297 static int iwl4965_kw_alloc(struct iwl4965_priv
*priv
)
299 struct pci_dev
*dev
= priv
->pci_dev
;
300 struct iwl4965_kw
*kw
= &priv
->kw
;
302 kw
->size
= IWL4965_KW_SIZE
; /* TBW need set somewhere else */
303 kw
->v_addr
= pci_alloc_consistent(dev
, kw
->size
, &kw
->dma_addr
);
310 #define CHECK_AND_PRINT(x) ((eeprom_ch->flags & EEPROM_CHANNEL_##x) \
314 * iwl4965_set_fat_chan_info - Copy fat channel info into driver's priv.
316 * Does not set up a command, or touch hardware.
318 int iwl4965_set_fat_chan_info(struct iwl4965_priv
*priv
, int phymode
, u16 channel
,
319 const struct iwl4965_eeprom_channel
*eeprom_ch
,
320 u8 fat_extension_channel
)
322 struct iwl4965_channel_info
*ch_info
;
324 ch_info
= (struct iwl4965_channel_info
*)
325 iwl4965_get_channel_info(priv
, phymode
, channel
);
327 if (!is_channel_valid(ch_info
))
330 IWL_DEBUG_INFO("FAT Ch. %d [%sGHz] %s%s%s%s%s%s(0x%02x"
331 " %ddBm): Ad-Hoc %ssupported\n",
333 is_channel_a_band(ch_info
) ?
335 CHECK_AND_PRINT(IBSS
),
336 CHECK_AND_PRINT(ACTIVE
),
337 CHECK_AND_PRINT(RADAR
),
338 CHECK_AND_PRINT(WIDE
),
339 CHECK_AND_PRINT(NARROW
),
340 CHECK_AND_PRINT(DFS
),
342 eeprom_ch
->max_power_avg
,
343 ((eeprom_ch
->flags
& EEPROM_CHANNEL_IBSS
)
344 && !(eeprom_ch
->flags
& EEPROM_CHANNEL_RADAR
)) ?
347 ch_info
->fat_eeprom
= *eeprom_ch
;
348 ch_info
->fat_max_power_avg
= eeprom_ch
->max_power_avg
;
349 ch_info
->fat_curr_txpow
= eeprom_ch
->max_power_avg
;
350 ch_info
->fat_min_power
= 0;
351 ch_info
->fat_scan_power
= eeprom_ch
->max_power_avg
;
352 ch_info
->fat_flags
= eeprom_ch
->flags
;
353 ch_info
->fat_extension_channel
= fat_extension_channel
;
359 * iwl4965_kw_free - Free the "keep warm" buffer
361 static void iwl4965_kw_free(struct iwl4965_priv
*priv
)
363 struct pci_dev
*dev
= priv
->pci_dev
;
364 struct iwl4965_kw
*kw
= &priv
->kw
;
367 pci_free_consistent(dev
, kw
->size
, kw
->v_addr
, kw
->dma_addr
);
368 memset(kw
, 0, sizeof(*kw
));
373 * iwl4965_txq_ctx_reset - Reset TX queue context
374 * Destroys all DMA structures and initialise them again
379 static int iwl4965_txq_ctx_reset(struct iwl4965_priv
*priv
)
382 int txq_id
, slots_num
;
385 iwl4965_kw_free(priv
);
387 /* Free all tx/cmd queues and keep-warm buffer */
388 iwl4965_hw_txq_ctx_free(priv
);
390 /* Alloc keep-warm buffer */
391 rc
= iwl4965_kw_alloc(priv
);
393 IWL_ERROR("Keep Warm allocation failed");
397 spin_lock_irqsave(&priv
->lock
, flags
);
399 rc
= iwl4965_grab_nic_access(priv
);
401 IWL_ERROR("TX reset failed");
402 spin_unlock_irqrestore(&priv
->lock
, flags
);
406 /* Turn off all Tx DMA channels */
407 iwl4965_write_prph(priv
, KDR_SCD_TXFACT
, 0);
408 iwl4965_release_nic_access(priv
);
409 spin_unlock_irqrestore(&priv
->lock
, flags
);
411 /* Tell 4965 where to find the keep-warm buffer */
412 rc
= iwl4965_kw_init(priv
);
414 IWL_ERROR("kw_init failed\n");
418 /* Alloc and init all (default 16) Tx queues,
419 * including the command queue (#4) */
420 for (txq_id
= 0; txq_id
< priv
->hw_setting
.max_txq_num
; txq_id
++) {
421 slots_num
= (txq_id
== IWL_CMD_QUEUE_NUM
) ?
422 TFD_CMD_SLOTS
: TFD_TX_CMD_SLOTS
;
423 rc
= iwl4965_tx_queue_init(priv
, &priv
->txq
[txq_id
], slots_num
,
426 IWL_ERROR("Tx %d queue init failed\n", txq_id
);
434 iwl4965_hw_txq_ctx_free(priv
);
436 iwl4965_kw_free(priv
);
441 int iwl4965_hw_nic_init(struct iwl4965_priv
*priv
)
445 struct iwl4965_rx_queue
*rxq
= &priv
->rxq
;
450 iwl4965_power_init_handle(priv
);
453 spin_lock_irqsave(&priv
->lock
, flags
);
455 iwl4965_set_bit(priv
, CSR_GIO_CHICKEN_BITS
,
456 CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER
);
458 iwl4965_set_bit(priv
, CSR_GP_CNTRL
, CSR_GP_CNTRL_REG_FLAG_INIT_DONE
);
459 rc
= iwl4965_poll_bit(priv
, CSR_GP_CNTRL
,
460 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY
,
461 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY
, 25000);
463 spin_unlock_irqrestore(&priv
->lock
, flags
);
464 IWL_DEBUG_INFO("Failed to init the card\n");
468 rc
= iwl4965_grab_nic_access(priv
);
470 spin_unlock_irqrestore(&priv
->lock
, flags
);
474 iwl4965_read_prph(priv
, APMG_CLK_CTRL_REG
);
476 iwl4965_write_prph(priv
, APMG_CLK_CTRL_REG
,
477 APMG_CLK_VAL_DMA_CLK_RQT
|
478 APMG_CLK_VAL_BSM_CLK_RQT
);
479 iwl4965_read_prph(priv
, APMG_CLK_CTRL_REG
);
483 iwl4965_set_bits_prph(priv
, APMG_PCIDEV_STT_REG
,
484 APMG_PCIDEV_STT_VAL_L1_ACT_DIS
);
486 iwl4965_release_nic_access(priv
);
487 iwl4965_write32(priv
, CSR_INT_COALESCING
, 512 / 32);
488 spin_unlock_irqrestore(&priv
->lock
, flags
);
490 /* Determine HW type */
491 rc
= pci_read_config_byte(priv
->pci_dev
, PCI_REVISION_ID
, &rev_id
);
495 IWL_DEBUG_INFO("HW Revision ID = 0x%X\n", rev_id
);
497 iwl4965_nic_set_pwr_src(priv
, 1);
498 spin_lock_irqsave(&priv
->lock
, flags
);
500 if ((rev_id
& 0x80) == 0x80 && (rev_id
& 0x7f) < 8) {
501 pci_read_config_dword(priv
->pci_dev
, PCI_REG_WUM8
, &val
);
502 /* Enable No Snoop field */
503 pci_write_config_dword(priv
->pci_dev
, PCI_REG_WUM8
,
507 spin_unlock_irqrestore(&priv
->lock
, flags
);
509 if (priv
->eeprom
.calib_version
< EEPROM_TX_POWER_VERSION_NEW
) {
510 IWL_ERROR("Older EEPROM detected! Aborting.\n");
514 pci_read_config_byte(priv
->pci_dev
, PCI_LINK_CTRL
, &val_link
);
516 /* disable L1 entry -- workaround for pre-B1 */
517 pci_write_config_byte(priv
->pci_dev
, PCI_LINK_CTRL
, val_link
& ~0x02);
519 spin_lock_irqsave(&priv
->lock
, flags
);
521 /* set CSR_HW_CONFIG_REG for uCode use */
523 iwl4965_set_bit(priv
, CSR_SW_VER
, CSR_HW_IF_CONFIG_REG_BIT_KEDRON_R
|
524 CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI
|
525 CSR_HW_IF_CONFIG_REG_BIT_MAC_SI
);
527 rc
= iwl4965_grab_nic_access(priv
);
529 spin_unlock_irqrestore(&priv
->lock
, flags
);
530 IWL_DEBUG_INFO("Failed to init the card\n");
534 iwl4965_read_prph(priv
, APMG_PS_CTRL_REG
);
535 iwl4965_set_bits_prph(priv
, APMG_PS_CTRL_REG
,
536 APMG_PS_CTRL_VAL_RESET_REQ
);
538 iwl4965_clear_bits_prph(priv
, APMG_PS_CTRL_REG
,
539 APMG_PS_CTRL_VAL_RESET_REQ
);
541 iwl4965_release_nic_access(priv
);
542 spin_unlock_irqrestore(&priv
->lock
, flags
);
544 iwl4965_hw_card_show_info(priv
);
548 /* Allocate the RX queue, or reset if it is already allocated */
550 rc
= iwl4965_rx_queue_alloc(priv
);
552 IWL_ERROR("Unable to initialize Rx queue\n");
556 iwl4965_rx_queue_reset(priv
, rxq
);
558 iwl4965_rx_replenish(priv
);
560 iwl4965_rx_init(priv
, rxq
);
562 spin_lock_irqsave(&priv
->lock
, flags
);
564 rxq
->need_update
= 1;
565 iwl4965_rx_queue_update_write_ptr(priv
, rxq
);
567 spin_unlock_irqrestore(&priv
->lock
, flags
);
569 /* Allocate and init all Tx and Command queues */
570 rc
= iwl4965_txq_ctx_reset(priv
);
574 if (priv
->eeprom
.sku_cap
& EEPROM_SKU_CAP_SW_RF_KILL_ENABLE
)
575 IWL_DEBUG_RF_KILL("SW RF KILL supported in EEPROM.\n");
577 if (priv
->eeprom
.sku_cap
& EEPROM_SKU_CAP_HW_RF_KILL_ENABLE
)
578 IWL_DEBUG_RF_KILL("HW RF KILL supported in EEPROM.\n");
580 set_bit(STATUS_INIT
, &priv
->status
);
585 int iwl4965_hw_nic_stop_master(struct iwl4965_priv
*priv
)
591 spin_lock_irqsave(&priv
->lock
, flags
);
593 /* set stop master bit */
594 iwl4965_set_bit(priv
, CSR_RESET
, CSR_RESET_REG_FLAG_STOP_MASTER
);
596 reg_val
= iwl4965_read32(priv
, CSR_GP_CNTRL
);
598 if (CSR_GP_CNTRL_REG_FLAG_MAC_POWER_SAVE
==
599 (reg_val
& CSR_GP_CNTRL_REG_MSK_POWER_SAVE_TYPE
))
600 IWL_DEBUG_INFO("Card in power save, master is already "
603 rc
= iwl4965_poll_bit(priv
, CSR_RESET
,
604 CSR_RESET_REG_FLAG_MASTER_DISABLED
,
605 CSR_RESET_REG_FLAG_MASTER_DISABLED
, 100);
607 spin_unlock_irqrestore(&priv
->lock
, flags
);
612 spin_unlock_irqrestore(&priv
->lock
, flags
);
613 IWL_DEBUG_INFO("stop master\n");
619 * iwl4965_hw_txq_ctx_stop - Stop all Tx DMA channels, free Tx queue memory
621 void iwl4965_hw_txq_ctx_stop(struct iwl4965_priv
*priv
)
627 /* Stop each Tx DMA channel, and wait for it to be idle */
628 for (txq_id
= 0; txq_id
< priv
->hw_setting
.max_txq_num
; txq_id
++) {
629 spin_lock_irqsave(&priv
->lock
, flags
);
630 if (iwl4965_grab_nic_access(priv
)) {
631 spin_unlock_irqrestore(&priv
->lock
, flags
);
635 iwl4965_write_direct32(priv
,
636 IWL_FH_TCSR_CHNL_TX_CONFIG_REG(txq_id
),
638 iwl4965_poll_direct_bit(priv
, IWL_FH_TSSR_TX_STATUS_REG
,
639 IWL_FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE
641 iwl4965_release_nic_access(priv
);
642 spin_unlock_irqrestore(&priv
->lock
, flags
);
645 /* Deallocate memory for all Tx queues */
646 iwl4965_hw_txq_ctx_free(priv
);
649 int iwl4965_hw_nic_reset(struct iwl4965_priv
*priv
)
654 iwl4965_hw_nic_stop_master(priv
);
656 spin_lock_irqsave(&priv
->lock
, flags
);
658 iwl4965_set_bit(priv
, CSR_RESET
, CSR_RESET_REG_FLAG_SW_RESET
);
662 iwl4965_set_bit(priv
, CSR_GP_CNTRL
, CSR_GP_CNTRL_REG_FLAG_INIT_DONE
);
663 rc
= iwl4965_poll_bit(priv
, CSR_RESET
,
664 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY
,
665 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY
, 25);
669 rc
= iwl4965_grab_nic_access(priv
);
671 iwl4965_write_prph(priv
, APMG_CLK_EN_REG
,
672 APMG_CLK_VAL_DMA_CLK_RQT
|
673 APMG_CLK_VAL_BSM_CLK_RQT
);
677 iwl4965_set_bits_prph(priv
, APMG_PCIDEV_STT_REG
,
678 APMG_PCIDEV_STT_VAL_L1_ACT_DIS
);
680 iwl4965_release_nic_access(priv
);
683 clear_bit(STATUS_HCMD_ACTIVE
, &priv
->status
);
684 wake_up_interruptible(&priv
->wait_command_queue
);
686 spin_unlock_irqrestore(&priv
->lock
, flags
);
692 #define REG_RECALIB_PERIOD (60)
695 * iwl4965_bg_statistics_periodic - Timer callback to queue statistics
697 * This callback is provided in order to queue the statistics_work
698 * in work_queue context (v. softirq)
700 * This timer function is continually reset to execute within
701 * REG_RECALIB_PERIOD seconds since the last STATISTICS_NOTIFICATION
702 * was received. We need to ensure we receive the statistics in order
703 * to update the temperature used for calibrating the TXPOWER. However,
704 * we can't send the statistics command from softirq context (which
705 * is the context which timers run at) so we have to queue off the
706 * statistics_work to actually send the command to the hardware.
708 static void iwl4965_bg_statistics_periodic(unsigned long data
)
710 struct iwl4965_priv
*priv
= (struct iwl4965_priv
*)data
;
712 queue_work(priv
->workqueue
, &priv
->statistics_work
);
716 * iwl4965_bg_statistics_work - Send the statistics request to the hardware.
718 * This is queued by iwl4965_bg_statistics_periodic.
720 static void iwl4965_bg_statistics_work(struct work_struct
*work
)
722 struct iwl4965_priv
*priv
= container_of(work
, struct iwl4965_priv
,
725 if (test_bit(STATUS_EXIT_PENDING
, &priv
->status
))
728 mutex_lock(&priv
->mutex
);
729 iwl4965_send_statistics_request(priv
);
730 mutex_unlock(&priv
->mutex
);
733 #define CT_LIMIT_CONST 259
734 #define TM_CT_KILL_THRESHOLD 110
736 void iwl4965_rf_kill_ct_config(struct iwl4965_priv
*priv
)
738 struct iwl4965_ct_kill_config cmd
;
741 u32 crit_temperature
;
745 spin_lock_irqsave(&priv
->lock
, flags
);
746 iwl4965_write32(priv
, CSR_UCODE_DRV_GP1_CLR
,
747 CSR_UCODE_DRV_GP1_REG_BIT_CT_KILL_EXIT
);
748 spin_unlock_irqrestore(&priv
->lock
, flags
);
750 if (priv
->statistics
.flag
& STATISTICS_REPLY_FLG_FAT_MODE_MSK
) {
751 R1
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r1
[1]);
752 R2
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r2
[1]);
753 R3
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r3
[1]);
755 R1
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r1
[0]);
756 R2
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r2
[0]);
757 R3
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r3
[0]);
760 temp_th
= CELSIUS_TO_KELVIN(TM_CT_KILL_THRESHOLD
);
762 crit_temperature
= ((temp_th
* (R3
-R1
))/CT_LIMIT_CONST
) + R2
;
763 cmd
.critical_temperature_R
= cpu_to_le32(crit_temperature
);
764 rc
= iwl4965_send_cmd_pdu(priv
,
765 REPLY_CT_KILL_CONFIG_CMD
, sizeof(cmd
), &cmd
);
767 IWL_ERROR("REPLY_CT_KILL_CONFIG_CMD failed\n");
769 IWL_DEBUG_INFO("REPLY_CT_KILL_CONFIG_CMD succeeded\n");
772 #ifdef CONFIG_IWL4965_SENSITIVITY
774 /* "false alarms" are signals that our DSP tries to lock onto,
775 * but then determines that they are either noise, or transmissions
776 * from a distant wireless network (also "noise", really) that get
777 * "stepped on" by stronger transmissions within our own network.
778 * This algorithm attempts to set a sensitivity level that is high
779 * enough to receive all of our own network traffic, but not so
780 * high that our DSP gets too busy trying to lock onto non-network
782 static int iwl4965_sens_energy_cck(struct iwl4965_priv
*priv
,
785 struct statistics_general_data
*rx_info
)
789 u8 max_silence_rssi
= 0;
791 u8 silence_rssi_a
= 0;
792 u8 silence_rssi_b
= 0;
793 u8 silence_rssi_c
= 0;
796 /* "false_alarms" values below are cross-multiplications to assess the
797 * numbers of false alarms within the measured period of actual Rx
798 * (Rx is off when we're txing), vs the min/max expected false alarms
799 * (some should be expected if rx is sensitive enough) in a
800 * hypothetical listening period of 200 time units (TU), 204.8 msec:
802 * MIN_FA/fixed-time < false_alarms/actual-rx-time < MAX_FA/beacon-time
805 u32 false_alarms
= norm_fa
* 200 * 1024;
806 u32 max_false_alarms
= MAX_FA_CCK
* rx_enable_time
;
807 u32 min_false_alarms
= MIN_FA_CCK
* rx_enable_time
;
808 struct iwl4965_sensitivity_data
*data
= NULL
;
810 data
= &(priv
->sensitivity_data
);
812 data
->nrg_auto_corr_silence_diff
= 0;
814 /* Find max silence rssi among all 3 receivers.
815 * This is background noise, which may include transmissions from other
816 * networks, measured during silence before our network's beacon */
817 silence_rssi_a
= (u8
)((rx_info
->beacon_silence_rssi_a
&
818 ALL_BAND_FILTER
) >> 8);
819 silence_rssi_b
= (u8
)((rx_info
->beacon_silence_rssi_b
&
820 ALL_BAND_FILTER
) >> 8);
821 silence_rssi_c
= (u8
)((rx_info
->beacon_silence_rssi_c
&
822 ALL_BAND_FILTER
) >> 8);
824 val
= max(silence_rssi_b
, silence_rssi_c
);
825 max_silence_rssi
= max(silence_rssi_a
, (u8
) val
);
827 /* Store silence rssi in 20-beacon history table */
828 data
->nrg_silence_rssi
[data
->nrg_silence_idx
] = max_silence_rssi
;
829 data
->nrg_silence_idx
++;
830 if (data
->nrg_silence_idx
>= NRG_NUM_PREV_STAT_L
)
831 data
->nrg_silence_idx
= 0;
833 /* Find max silence rssi across 20 beacon history */
834 for (i
= 0; i
< NRG_NUM_PREV_STAT_L
; i
++) {
835 val
= data
->nrg_silence_rssi
[i
];
836 silence_ref
= max(silence_ref
, val
);
838 IWL_DEBUG_CALIB("silence a %u, b %u, c %u, 20-bcn max %u\n",
839 silence_rssi_a
, silence_rssi_b
, silence_rssi_c
,
842 /* Find max rx energy (min value!) among all 3 receivers,
843 * measured during beacon frame.
844 * Save it in 10-beacon history table. */
845 i
= data
->nrg_energy_idx
;
846 val
= min(rx_info
->beacon_energy_b
, rx_info
->beacon_energy_c
);
847 data
->nrg_value
[i
] = min(rx_info
->beacon_energy_a
, val
);
849 data
->nrg_energy_idx
++;
850 if (data
->nrg_energy_idx
>= 10)
851 data
->nrg_energy_idx
= 0;
853 /* Find min rx energy (max value) across 10 beacon history.
854 * This is the minimum signal level that we want to receive well.
855 * Add backoff (margin so we don't miss slightly lower energy frames).
856 * This establishes an upper bound (min value) for energy threshold. */
857 max_nrg_cck
= data
->nrg_value
[0];
858 for (i
= 1; i
< 10; i
++)
859 max_nrg_cck
= (u32
) max(max_nrg_cck
, (data
->nrg_value
[i
]));
862 IWL_DEBUG_CALIB("rx energy a %u, b %u, c %u, 10-bcn max/min %u\n",
863 rx_info
->beacon_energy_a
, rx_info
->beacon_energy_b
,
864 rx_info
->beacon_energy_c
, max_nrg_cck
- 6);
866 /* Count number of consecutive beacons with fewer-than-desired
868 if (false_alarms
< min_false_alarms
)
869 data
->num_in_cck_no_fa
++;
871 data
->num_in_cck_no_fa
= 0;
872 IWL_DEBUG_CALIB("consecutive bcns with few false alarms = %u\n",
873 data
->num_in_cck_no_fa
);
875 /* If we got too many false alarms this time, reduce sensitivity */
876 if (false_alarms
> max_false_alarms
) {
877 IWL_DEBUG_CALIB("norm FA %u > max FA %u\n",
878 false_alarms
, max_false_alarms
);
879 IWL_DEBUG_CALIB("... reducing sensitivity\n");
880 data
->nrg_curr_state
= IWL_FA_TOO_MANY
;
882 if (data
->auto_corr_cck
> AUTO_CORR_MAX_TH_CCK
) {
883 /* Store for "fewer than desired" on later beacon */
884 data
->nrg_silence_ref
= silence_ref
;
886 /* increase energy threshold (reduce nrg value)
887 * to decrease sensitivity */
888 if (data
->nrg_th_cck
> (NRG_MAX_CCK
+ NRG_STEP_CCK
))
889 data
->nrg_th_cck
= data
->nrg_th_cck
893 /* increase auto_corr values to decrease sensitivity */
894 if (data
->auto_corr_cck
< AUTO_CORR_MAX_TH_CCK
)
895 data
->auto_corr_cck
= AUTO_CORR_MAX_TH_CCK
+ 1;
897 val
= data
->auto_corr_cck
+ AUTO_CORR_STEP_CCK
;
898 data
->auto_corr_cck
= min((u32
)AUTO_CORR_MAX_CCK
, val
);
900 val
= data
->auto_corr_cck_mrc
+ AUTO_CORR_STEP_CCK
;
901 data
->auto_corr_cck_mrc
= min((u32
)AUTO_CORR_MAX_CCK_MRC
, val
);
903 /* Else if we got fewer than desired, increase sensitivity */
904 } else if (false_alarms
< min_false_alarms
) {
905 data
->nrg_curr_state
= IWL_FA_TOO_FEW
;
907 /* Compare silence level with silence level for most recent
908 * healthy number or too many false alarms */
909 data
->nrg_auto_corr_silence_diff
= (s32
)data
->nrg_silence_ref
-
912 IWL_DEBUG_CALIB("norm FA %u < min FA %u, silence diff %d\n",
913 false_alarms
, min_false_alarms
,
914 data
->nrg_auto_corr_silence_diff
);
916 /* Increase value to increase sensitivity, but only if:
917 * 1a) previous beacon did *not* have *too many* false alarms
918 * 1b) AND there's a significant difference in Rx levels
919 * from a previous beacon with too many, or healthy # FAs
920 * OR 2) We've seen a lot of beacons (100) with too few
922 if ((data
->nrg_prev_state
!= IWL_FA_TOO_MANY
) &&
923 ((data
->nrg_auto_corr_silence_diff
> NRG_DIFF
) ||
924 (data
->num_in_cck_no_fa
> MAX_NUMBER_CCK_NO_FA
))) {
926 IWL_DEBUG_CALIB("... increasing sensitivity\n");
927 /* Increase nrg value to increase sensitivity */
928 val
= data
->nrg_th_cck
+ NRG_STEP_CCK
;
929 data
->nrg_th_cck
= min((u32
)NRG_MIN_CCK
, val
);
931 /* Decrease auto_corr values to increase sensitivity */
932 val
= data
->auto_corr_cck
- AUTO_CORR_STEP_CCK
;
933 data
->auto_corr_cck
= max((u32
)AUTO_CORR_MIN_CCK
, val
);
935 val
= data
->auto_corr_cck_mrc
- AUTO_CORR_STEP_CCK
;
936 data
->auto_corr_cck_mrc
=
937 max((u32
)AUTO_CORR_MIN_CCK_MRC
, val
);
940 IWL_DEBUG_CALIB("... but not changing sensitivity\n");
942 /* Else we got a healthy number of false alarms, keep status quo */
944 IWL_DEBUG_CALIB(" FA in safe zone\n");
945 data
->nrg_curr_state
= IWL_FA_GOOD_RANGE
;
947 /* Store for use in "fewer than desired" with later beacon */
948 data
->nrg_silence_ref
= silence_ref
;
950 /* If previous beacon had too many false alarms,
951 * give it some extra margin by reducing sensitivity again
952 * (but don't go below measured energy of desired Rx) */
953 if (IWL_FA_TOO_MANY
== data
->nrg_prev_state
) {
954 IWL_DEBUG_CALIB("... increasing margin\n");
955 data
->nrg_th_cck
-= NRG_MARGIN
;
959 /* Make sure the energy threshold does not go above the measured
960 * energy of the desired Rx signals (reduced by backoff margin),
961 * or else we might start missing Rx frames.
962 * Lower value is higher energy, so we use max()!
964 data
->nrg_th_cck
= max(max_nrg_cck
, data
->nrg_th_cck
);
965 IWL_DEBUG_CALIB("new nrg_th_cck %u\n", data
->nrg_th_cck
);
967 data
->nrg_prev_state
= data
->nrg_curr_state
;
973 static int iwl4965_sens_auto_corr_ofdm(struct iwl4965_priv
*priv
,
978 u32 false_alarms
= norm_fa
* 200 * 1024;
979 u32 max_false_alarms
= MAX_FA_OFDM
* rx_enable_time
;
980 u32 min_false_alarms
= MIN_FA_OFDM
* rx_enable_time
;
981 struct iwl4965_sensitivity_data
*data
= NULL
;
983 data
= &(priv
->sensitivity_data
);
985 /* If we got too many false alarms this time, reduce sensitivity */
986 if (false_alarms
> max_false_alarms
) {
988 IWL_DEBUG_CALIB("norm FA %u > max FA %u)\n",
989 false_alarms
, max_false_alarms
);
991 val
= data
->auto_corr_ofdm
+ AUTO_CORR_STEP_OFDM
;
992 data
->auto_corr_ofdm
=
993 min((u32
)AUTO_CORR_MAX_OFDM
, val
);
995 val
= data
->auto_corr_ofdm_mrc
+ AUTO_CORR_STEP_OFDM
;
996 data
->auto_corr_ofdm_mrc
=
997 min((u32
)AUTO_CORR_MAX_OFDM_MRC
, val
);
999 val
= data
->auto_corr_ofdm_x1
+ AUTO_CORR_STEP_OFDM
;
1000 data
->auto_corr_ofdm_x1
=
1001 min((u32
)AUTO_CORR_MAX_OFDM_X1
, val
);
1003 val
= data
->auto_corr_ofdm_mrc_x1
+ AUTO_CORR_STEP_OFDM
;
1004 data
->auto_corr_ofdm_mrc_x1
=
1005 min((u32
)AUTO_CORR_MAX_OFDM_MRC_X1
, val
);
1008 /* Else if we got fewer than desired, increase sensitivity */
1009 else if (false_alarms
< min_false_alarms
) {
1011 IWL_DEBUG_CALIB("norm FA %u < min FA %u\n",
1012 false_alarms
, min_false_alarms
);
1014 val
= data
->auto_corr_ofdm
- AUTO_CORR_STEP_OFDM
;
1015 data
->auto_corr_ofdm
=
1016 max((u32
)AUTO_CORR_MIN_OFDM
, val
);
1018 val
= data
->auto_corr_ofdm_mrc
- AUTO_CORR_STEP_OFDM
;
1019 data
->auto_corr_ofdm_mrc
=
1020 max((u32
)AUTO_CORR_MIN_OFDM_MRC
, val
);
1022 val
= data
->auto_corr_ofdm_x1
- AUTO_CORR_STEP_OFDM
;
1023 data
->auto_corr_ofdm_x1
=
1024 max((u32
)AUTO_CORR_MIN_OFDM_X1
, val
);
1026 val
= data
->auto_corr_ofdm_mrc_x1
- AUTO_CORR_STEP_OFDM
;
1027 data
->auto_corr_ofdm_mrc_x1
=
1028 max((u32
)AUTO_CORR_MIN_OFDM_MRC_X1
, val
);
1032 IWL_DEBUG_CALIB("min FA %u < norm FA %u < max FA %u OK\n",
1033 min_false_alarms
, false_alarms
, max_false_alarms
);
1038 static int iwl4965_sensitivity_callback(struct iwl4965_priv
*priv
,
1039 struct iwl4965_cmd
*cmd
, struct sk_buff
*skb
)
1041 /* We didn't cache the SKB; let the caller free it */
1045 /* Prepare a SENSITIVITY_CMD, send to uCode if values have changed */
1046 static int iwl4965_sensitivity_write(struct iwl4965_priv
*priv
, u8 flags
)
1049 struct iwl4965_sensitivity_cmd cmd
;
1050 struct iwl4965_sensitivity_data
*data
= NULL
;
1051 struct iwl4965_host_cmd cmd_out
= {
1052 .id
= SENSITIVITY_CMD
,
1053 .len
= sizeof(struct iwl4965_sensitivity_cmd
),
1054 .meta
.flags
= flags
,
1058 data
= &(priv
->sensitivity_data
);
1060 memset(&cmd
, 0, sizeof(cmd
));
1062 cmd
.table
[HD_AUTO_CORR32_X4_TH_ADD_MIN_INDEX
] =
1063 cpu_to_le16((u16
)data
->auto_corr_ofdm
);
1064 cmd
.table
[HD_AUTO_CORR32_X4_TH_ADD_MIN_MRC_INDEX
] =
1065 cpu_to_le16((u16
)data
->auto_corr_ofdm_mrc
);
1066 cmd
.table
[HD_AUTO_CORR32_X1_TH_ADD_MIN_INDEX
] =
1067 cpu_to_le16((u16
)data
->auto_corr_ofdm_x1
);
1068 cmd
.table
[HD_AUTO_CORR32_X1_TH_ADD_MIN_MRC_INDEX
] =
1069 cpu_to_le16((u16
)data
->auto_corr_ofdm_mrc_x1
);
1071 cmd
.table
[HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX
] =
1072 cpu_to_le16((u16
)data
->auto_corr_cck
);
1073 cmd
.table
[HD_AUTO_CORR40_X4_TH_ADD_MIN_MRC_INDEX
] =
1074 cpu_to_le16((u16
)data
->auto_corr_cck_mrc
);
1076 cmd
.table
[HD_MIN_ENERGY_CCK_DET_INDEX
] =
1077 cpu_to_le16((u16
)data
->nrg_th_cck
);
1078 cmd
.table
[HD_MIN_ENERGY_OFDM_DET_INDEX
] =
1079 cpu_to_le16((u16
)data
->nrg_th_ofdm
);
1081 cmd
.table
[HD_BARKER_CORR_TH_ADD_MIN_INDEX
] =
1082 __constant_cpu_to_le16(190);
1083 cmd
.table
[HD_BARKER_CORR_TH_ADD_MIN_MRC_INDEX
] =
1084 __constant_cpu_to_le16(390);
1085 cmd
.table
[HD_OFDM_ENERGY_TH_IN_INDEX
] =
1086 __constant_cpu_to_le16(62);
1088 IWL_DEBUG_CALIB("ofdm: ac %u mrc %u x1 %u mrc_x1 %u thresh %u\n",
1089 data
->auto_corr_ofdm
, data
->auto_corr_ofdm_mrc
,
1090 data
->auto_corr_ofdm_x1
, data
->auto_corr_ofdm_mrc_x1
,
1093 IWL_DEBUG_CALIB("cck: ac %u mrc %u thresh %u\n",
1094 data
->auto_corr_cck
, data
->auto_corr_cck_mrc
,
1097 /* Update uCode's "work" table, and copy it to DSP */
1098 cmd
.control
= SENSITIVITY_CMD_CONTROL_WORK_TABLE
;
1100 if (flags
& CMD_ASYNC
)
1101 cmd_out
.meta
.u
.callback
= iwl4965_sensitivity_callback
;
1103 /* Don't send command to uCode if nothing has changed */
1104 if (!memcmp(&cmd
.table
[0], &(priv
->sensitivity_tbl
[0]),
1105 sizeof(u16
)*HD_TABLE_SIZE
)) {
1106 IWL_DEBUG_CALIB("No change in SENSITIVITY_CMD\n");
1110 /* Copy table for comparison next time */
1111 memcpy(&(priv
->sensitivity_tbl
[0]), &(cmd
.table
[0]),
1112 sizeof(u16
)*HD_TABLE_SIZE
);
1114 rc
= iwl4965_send_cmd(priv
, &cmd_out
);
1116 IWL_DEBUG_CALIB("SENSITIVITY_CMD succeeded\n");
1123 void iwl4965_init_sensitivity(struct iwl4965_priv
*priv
, u8 flags
, u8 force
)
1127 struct iwl4965_sensitivity_data
*data
= NULL
;
1129 IWL_DEBUG_CALIB("Start iwl4965_init_sensitivity\n");
1132 memset(&(priv
->sensitivity_tbl
[0]), 0,
1133 sizeof(u16
)*HD_TABLE_SIZE
);
1135 /* Clear driver's sensitivity algo data */
1136 data
= &(priv
->sensitivity_data
);
1137 memset(data
, 0, sizeof(struct iwl4965_sensitivity_data
));
1139 data
->num_in_cck_no_fa
= 0;
1140 data
->nrg_curr_state
= IWL_FA_TOO_MANY
;
1141 data
->nrg_prev_state
= IWL_FA_TOO_MANY
;
1142 data
->nrg_silence_ref
= 0;
1143 data
->nrg_silence_idx
= 0;
1144 data
->nrg_energy_idx
= 0;
1146 for (i
= 0; i
< 10; i
++)
1147 data
->nrg_value
[i
] = 0;
1149 for (i
= 0; i
< NRG_NUM_PREV_STAT_L
; i
++)
1150 data
->nrg_silence_rssi
[i
] = 0;
1152 data
->auto_corr_ofdm
= 90;
1153 data
->auto_corr_ofdm_mrc
= 170;
1154 data
->auto_corr_ofdm_x1
= 105;
1155 data
->auto_corr_ofdm_mrc_x1
= 220;
1156 data
->auto_corr_cck
= AUTO_CORR_CCK_MIN_VAL_DEF
;
1157 data
->auto_corr_cck_mrc
= 200;
1158 data
->nrg_th_cck
= 100;
1159 data
->nrg_th_ofdm
= 100;
1161 data
->last_bad_plcp_cnt_ofdm
= 0;
1162 data
->last_fa_cnt_ofdm
= 0;
1163 data
->last_bad_plcp_cnt_cck
= 0;
1164 data
->last_fa_cnt_cck
= 0;
1166 /* Clear prior Sensitivity command data to force send to uCode */
1168 memset(&(priv
->sensitivity_tbl
[0]), 0,
1169 sizeof(u16
)*HD_TABLE_SIZE
);
1171 rc
|= iwl4965_sensitivity_write(priv
, flags
);
1172 IWL_DEBUG_CALIB("<<return 0x%X\n", rc
);
1178 /* Reset differential Rx gains in NIC to prepare for chain noise calibration.
1179 * Called after every association, but this runs only once!
1180 * ... once chain noise is calibrated the first time, it's good forever. */
1181 void iwl4965_chain_noise_reset(struct iwl4965_priv
*priv
)
1183 struct iwl4965_chain_noise_data
*data
= NULL
;
1186 data
= &(priv
->chain_noise_data
);
1187 if ((data
->state
== IWL_CHAIN_NOISE_ALIVE
) && iwl4965_is_associated(priv
)) {
1188 struct iwl4965_calibration_cmd cmd
;
1190 memset(&cmd
, 0, sizeof(cmd
));
1191 cmd
.opCode
= PHY_CALIBRATE_DIFF_GAIN_CMD
;
1192 cmd
.diff_gain_a
= 0;
1193 cmd
.diff_gain_b
= 0;
1194 cmd
.diff_gain_c
= 0;
1195 rc
= iwl4965_send_cmd_pdu(priv
, REPLY_PHY_CALIBRATION_CMD
,
1198 data
->state
= IWL_CHAIN_NOISE_ACCUMULATE
;
1199 IWL_DEBUG_CALIB("Run chain_noise_calibrate\n");
1205 * Accumulate 20 beacons of signal and noise statistics for each of
1206 * 3 receivers/antennas/rx-chains, then figure out:
1207 * 1) Which antennas are connected.
1208 * 2) Differential rx gain settings to balance the 3 receivers.
1210 static void iwl4965_noise_calibration(struct iwl4965_priv
*priv
,
1211 struct iwl4965_notif_statistics
*stat_resp
)
1213 struct iwl4965_chain_noise_data
*data
= NULL
;
1222 u32 average_sig
[NUM_RX_CHAINS
] = {INITIALIZATION_VALUE
};
1223 u32 average_noise
[NUM_RX_CHAINS
] = {INITIALIZATION_VALUE
};
1224 u32 max_average_sig
;
1225 u16 max_average_sig_antenna_i
;
1226 u32 min_average_noise
= MIN_AVERAGE_NOISE_MAX_VALUE
;
1227 u16 min_average_noise_antenna_i
= INITIALIZATION_VALUE
;
1229 u16 chan_num
= INITIALIZATION_VALUE
;
1230 u32 band
= INITIALIZATION_VALUE
;
1231 u32 active_chains
= 0;
1232 unsigned long flags
;
1233 struct statistics_rx_non_phy
*rx_info
= &(stat_resp
->rx
.general
);
1235 data
= &(priv
->chain_noise_data
);
1237 /* Accumulate just the first 20 beacons after the first association,
1238 * then we're done forever. */
1239 if (data
->state
!= IWL_CHAIN_NOISE_ACCUMULATE
) {
1240 if (data
->state
== IWL_CHAIN_NOISE_ALIVE
)
1241 IWL_DEBUG_CALIB("Wait for noise calib reset\n");
1245 spin_lock_irqsave(&priv
->lock
, flags
);
1246 if (rx_info
->interference_data_flag
!= INTERFERENCE_DATA_AVAILABLE
) {
1247 IWL_DEBUG_CALIB(" << Interference data unavailable\n");
1248 spin_unlock_irqrestore(&priv
->lock
, flags
);
1252 band
= (priv
->staging_rxon
.flags
& RXON_FLG_BAND_24G_MSK
) ? 0 : 1;
1253 chan_num
= le16_to_cpu(priv
->staging_rxon
.channel
);
1255 /* Make sure we accumulate data for just the associated channel
1256 * (even if scanning). */
1257 if ((chan_num
!= (le32_to_cpu(stat_resp
->flag
) >> 16)) ||
1258 ((STATISTICS_REPLY_FLG_BAND_24G_MSK
==
1259 (stat_resp
->flag
& STATISTICS_REPLY_FLG_BAND_24G_MSK
)) && band
)) {
1260 IWL_DEBUG_CALIB("Stats not from chan=%d, band=%d\n",
1262 spin_unlock_irqrestore(&priv
->lock
, flags
);
1266 /* Accumulate beacon statistics values across 20 beacons */
1267 chain_noise_a
= le32_to_cpu(rx_info
->beacon_silence_rssi_a
) &
1269 chain_noise_b
= le32_to_cpu(rx_info
->beacon_silence_rssi_b
) &
1271 chain_noise_c
= le32_to_cpu(rx_info
->beacon_silence_rssi_c
) &
1274 chain_sig_a
= le32_to_cpu(rx_info
->beacon_rssi_a
) & IN_BAND_FILTER
;
1275 chain_sig_b
= le32_to_cpu(rx_info
->beacon_rssi_b
) & IN_BAND_FILTER
;
1276 chain_sig_c
= le32_to_cpu(rx_info
->beacon_rssi_c
) & IN_BAND_FILTER
;
1278 spin_unlock_irqrestore(&priv
->lock
, flags
);
1280 data
->beacon_count
++;
1282 data
->chain_noise_a
= (chain_noise_a
+ data
->chain_noise_a
);
1283 data
->chain_noise_b
= (chain_noise_b
+ data
->chain_noise_b
);
1284 data
->chain_noise_c
= (chain_noise_c
+ data
->chain_noise_c
);
1286 data
->chain_signal_a
= (chain_sig_a
+ data
->chain_signal_a
);
1287 data
->chain_signal_b
= (chain_sig_b
+ data
->chain_signal_b
);
1288 data
->chain_signal_c
= (chain_sig_c
+ data
->chain_signal_c
);
1290 IWL_DEBUG_CALIB("chan=%d, band=%d, beacon=%d\n", chan_num
, band
,
1291 data
->beacon_count
);
1292 IWL_DEBUG_CALIB("chain_sig: a %d b %d c %d\n",
1293 chain_sig_a
, chain_sig_b
, chain_sig_c
);
1294 IWL_DEBUG_CALIB("chain_noise: a %d b %d c %d\n",
1295 chain_noise_a
, chain_noise_b
, chain_noise_c
);
1297 /* If this is the 20th beacon, determine:
1298 * 1) Disconnected antennas (using signal strengths)
1299 * 2) Differential gain (using silence noise) to balance receivers */
1300 if (data
->beacon_count
== CAL_NUM_OF_BEACONS
) {
1302 /* Analyze signal for disconnected antenna */
1303 average_sig
[0] = (data
->chain_signal_a
) / CAL_NUM_OF_BEACONS
;
1304 average_sig
[1] = (data
->chain_signal_b
) / CAL_NUM_OF_BEACONS
;
1305 average_sig
[2] = (data
->chain_signal_c
) / CAL_NUM_OF_BEACONS
;
1307 if (average_sig
[0] >= average_sig
[1]) {
1308 max_average_sig
= average_sig
[0];
1309 max_average_sig_antenna_i
= 0;
1310 active_chains
= (1 << max_average_sig_antenna_i
);
1312 max_average_sig
= average_sig
[1];
1313 max_average_sig_antenna_i
= 1;
1314 active_chains
= (1 << max_average_sig_antenna_i
);
1317 if (average_sig
[2] >= max_average_sig
) {
1318 max_average_sig
= average_sig
[2];
1319 max_average_sig_antenna_i
= 2;
1320 active_chains
= (1 << max_average_sig_antenna_i
);
1323 IWL_DEBUG_CALIB("average_sig: a %d b %d c %d\n",
1324 average_sig
[0], average_sig
[1], average_sig
[2]);
1325 IWL_DEBUG_CALIB("max_average_sig = %d, antenna %d\n",
1326 max_average_sig
, max_average_sig_antenna_i
);
1328 /* Compare signal strengths for all 3 receivers. */
1329 for (i
= 0; i
< NUM_RX_CHAINS
; i
++) {
1330 if (i
!= max_average_sig_antenna_i
) {
1331 s32 rssi_delta
= (max_average_sig
-
1334 /* If signal is very weak, compared with
1335 * strongest, mark it as disconnected. */
1336 if (rssi_delta
> MAXIMUM_ALLOWED_PATHLOSS
)
1337 data
->disconn_array
[i
] = 1;
1339 active_chains
|= (1 << i
);
1340 IWL_DEBUG_CALIB("i = %d rssiDelta = %d "
1341 "disconn_array[i] = %d\n",
1342 i
, rssi_delta
, data
->disconn_array
[i
]);
1346 /*If both chains A & B are disconnected -
1347 * connect B and leave A as is */
1348 if (data
->disconn_array
[CHAIN_A
] &&
1349 data
->disconn_array
[CHAIN_B
]) {
1350 data
->disconn_array
[CHAIN_B
] = 0;
1351 active_chains
|= (1 << CHAIN_B
);
1352 IWL_DEBUG_CALIB("both A & B chains are disconnected! "
1353 "W/A - declare B as connected\n");
1356 IWL_DEBUG_CALIB("active_chains (bitwise) = 0x%x\n",
1359 /* Save for use within RXON, TX, SCAN commands, etc. */
1360 priv
->valid_antenna
= active_chains
;
1362 /* Analyze noise for rx balance */
1363 average_noise
[0] = ((data
->chain_noise_a
)/CAL_NUM_OF_BEACONS
);
1364 average_noise
[1] = ((data
->chain_noise_b
)/CAL_NUM_OF_BEACONS
);
1365 average_noise
[2] = ((data
->chain_noise_c
)/CAL_NUM_OF_BEACONS
);
1367 for (i
= 0; i
< NUM_RX_CHAINS
; i
++) {
1368 if (!(data
->disconn_array
[i
]) &&
1369 (average_noise
[i
] <= min_average_noise
)) {
1370 /* This means that chain i is active and has
1371 * lower noise values so far: */
1372 min_average_noise
= average_noise
[i
];
1373 min_average_noise_antenna_i
= i
;
1377 data
->delta_gain_code
[min_average_noise_antenna_i
] = 0;
1379 IWL_DEBUG_CALIB("average_noise: a %d b %d c %d\n",
1380 average_noise
[0], average_noise
[1],
1383 IWL_DEBUG_CALIB("min_average_noise = %d, antenna %d\n",
1384 min_average_noise
, min_average_noise_antenna_i
);
1386 for (i
= 0; i
< NUM_RX_CHAINS
; i
++) {
1389 if (!(data
->disconn_array
[i
]) &&
1390 (data
->delta_gain_code
[i
] ==
1391 CHAIN_NOISE_DELTA_GAIN_INIT_VAL
)) {
1392 delta_g
= average_noise
[i
] - min_average_noise
;
1393 data
->delta_gain_code
[i
] = (u8
)((delta_g
*
1395 if (CHAIN_NOISE_MAX_DELTA_GAIN_CODE
<
1396 data
->delta_gain_code
[i
])
1397 data
->delta_gain_code
[i
] =
1398 CHAIN_NOISE_MAX_DELTA_GAIN_CODE
;
1400 data
->delta_gain_code
[i
] =
1401 (data
->delta_gain_code
[i
] | (1 << 2));
1403 data
->delta_gain_code
[i
] = 0;
1405 IWL_DEBUG_CALIB("delta_gain_codes: a %d b %d c %d\n",
1406 data
->delta_gain_code
[0],
1407 data
->delta_gain_code
[1],
1408 data
->delta_gain_code
[2]);
1410 /* Differential gain gets sent to uCode only once */
1411 if (!data
->radio_write
) {
1412 struct iwl4965_calibration_cmd cmd
;
1413 data
->radio_write
= 1;
1415 memset(&cmd
, 0, sizeof(cmd
));
1416 cmd
.opCode
= PHY_CALIBRATE_DIFF_GAIN_CMD
;
1417 cmd
.diff_gain_a
= data
->delta_gain_code
[0];
1418 cmd
.diff_gain_b
= data
->delta_gain_code
[1];
1419 cmd
.diff_gain_c
= data
->delta_gain_code
[2];
1420 rc
= iwl4965_send_cmd_pdu(priv
, REPLY_PHY_CALIBRATION_CMD
,
1423 IWL_DEBUG_CALIB("fail sending cmd "
1424 "REPLY_PHY_CALIBRATION_CMD \n");
1426 /* TODO we might want recalculate
1427 * rx_chain in rxon cmd */
1429 /* Mark so we run this algo only once! */
1430 data
->state
= IWL_CHAIN_NOISE_CALIBRATED
;
1432 data
->chain_noise_a
= 0;
1433 data
->chain_noise_b
= 0;
1434 data
->chain_noise_c
= 0;
1435 data
->chain_signal_a
= 0;
1436 data
->chain_signal_b
= 0;
1437 data
->chain_signal_c
= 0;
1438 data
->beacon_count
= 0;
1443 static void iwl4965_sensitivity_calibration(struct iwl4965_priv
*priv
,
1444 struct iwl4965_notif_statistics
*resp
)
1454 struct iwl4965_sensitivity_data
*data
= NULL
;
1455 struct statistics_rx_non_phy
*rx_info
= &(resp
->rx
.general
);
1456 struct statistics_rx
*statistics
= &(resp
->rx
);
1457 unsigned long flags
;
1458 struct statistics_general_data statis
;
1460 data
= &(priv
->sensitivity_data
);
1462 if (!iwl4965_is_associated(priv
)) {
1463 IWL_DEBUG_CALIB("<< - not associated\n");
1467 spin_lock_irqsave(&priv
->lock
, flags
);
1468 if (rx_info
->interference_data_flag
!= INTERFERENCE_DATA_AVAILABLE
) {
1469 IWL_DEBUG_CALIB("<< invalid data.\n");
1470 spin_unlock_irqrestore(&priv
->lock
, flags
);
1474 /* Extract Statistics: */
1475 rx_enable_time
= le32_to_cpu(rx_info
->channel_load
);
1476 fa_cck
= le32_to_cpu(statistics
->cck
.false_alarm_cnt
);
1477 fa_ofdm
= le32_to_cpu(statistics
->ofdm
.false_alarm_cnt
);
1478 bad_plcp_cck
= le32_to_cpu(statistics
->cck
.plcp_err
);
1479 bad_plcp_ofdm
= le32_to_cpu(statistics
->ofdm
.plcp_err
);
1481 statis
.beacon_silence_rssi_a
=
1482 le32_to_cpu(statistics
->general
.beacon_silence_rssi_a
);
1483 statis
.beacon_silence_rssi_b
=
1484 le32_to_cpu(statistics
->general
.beacon_silence_rssi_b
);
1485 statis
.beacon_silence_rssi_c
=
1486 le32_to_cpu(statistics
->general
.beacon_silence_rssi_c
);
1487 statis
.beacon_energy_a
=
1488 le32_to_cpu(statistics
->general
.beacon_energy_a
);
1489 statis
.beacon_energy_b
=
1490 le32_to_cpu(statistics
->general
.beacon_energy_b
);
1491 statis
.beacon_energy_c
=
1492 le32_to_cpu(statistics
->general
.beacon_energy_c
);
1494 spin_unlock_irqrestore(&priv
->lock
, flags
);
1496 IWL_DEBUG_CALIB("rx_enable_time = %u usecs\n", rx_enable_time
);
1498 if (!rx_enable_time
) {
1499 IWL_DEBUG_CALIB("<< RX Enable Time == 0! \n");
1503 /* These statistics increase monotonically, and do not reset
1504 * at each beacon. Calculate difference from last value, or just
1505 * use the new statistics value if it has reset or wrapped around. */
1506 if (data
->last_bad_plcp_cnt_cck
> bad_plcp_cck
)
1507 data
->last_bad_plcp_cnt_cck
= bad_plcp_cck
;
1509 bad_plcp_cck
-= data
->last_bad_plcp_cnt_cck
;
1510 data
->last_bad_plcp_cnt_cck
+= bad_plcp_cck
;
1513 if (data
->last_bad_plcp_cnt_ofdm
> bad_plcp_ofdm
)
1514 data
->last_bad_plcp_cnt_ofdm
= bad_plcp_ofdm
;
1516 bad_plcp_ofdm
-= data
->last_bad_plcp_cnt_ofdm
;
1517 data
->last_bad_plcp_cnt_ofdm
+= bad_plcp_ofdm
;
1520 if (data
->last_fa_cnt_ofdm
> fa_ofdm
)
1521 data
->last_fa_cnt_ofdm
= fa_ofdm
;
1523 fa_ofdm
-= data
->last_fa_cnt_ofdm
;
1524 data
->last_fa_cnt_ofdm
+= fa_ofdm
;
1527 if (data
->last_fa_cnt_cck
> fa_cck
)
1528 data
->last_fa_cnt_cck
= fa_cck
;
1530 fa_cck
-= data
->last_fa_cnt_cck
;
1531 data
->last_fa_cnt_cck
+= fa_cck
;
1534 /* Total aborted signal locks */
1535 norm_fa_ofdm
= fa_ofdm
+ bad_plcp_ofdm
;
1536 norm_fa_cck
= fa_cck
+ bad_plcp_cck
;
1538 IWL_DEBUG_CALIB("cck: fa %u badp %u ofdm: fa %u badp %u\n", fa_cck
,
1539 bad_plcp_cck
, fa_ofdm
, bad_plcp_ofdm
);
1541 iwl4965_sens_auto_corr_ofdm(priv
, norm_fa_ofdm
, rx_enable_time
);
1542 iwl4965_sens_energy_cck(priv
, norm_fa_cck
, rx_enable_time
, &statis
);
1543 rc
|= iwl4965_sensitivity_write(priv
, CMD_ASYNC
);
1548 static void iwl4965_bg_sensitivity_work(struct work_struct
*work
)
1550 struct iwl4965_priv
*priv
= container_of(work
, struct iwl4965_priv
,
1553 mutex_lock(&priv
->mutex
);
1555 if (test_bit(STATUS_EXIT_PENDING
, &priv
->status
) ||
1556 test_bit(STATUS_SCANNING
, &priv
->status
)) {
1557 mutex_unlock(&priv
->mutex
);
1561 if (priv
->start_calib
) {
1562 iwl4965_noise_calibration(priv
, &priv
->statistics
);
1564 if (priv
->sensitivity_data
.state
==
1565 IWL_SENS_CALIB_NEED_REINIT
) {
1566 iwl4965_init_sensitivity(priv
, CMD_ASYNC
, 0);
1567 priv
->sensitivity_data
.state
= IWL_SENS_CALIB_ALLOWED
;
1569 iwl4965_sensitivity_calibration(priv
,
1573 mutex_unlock(&priv
->mutex
);
1576 #endif /*CONFIG_IWL4965_SENSITIVITY*/
1578 static void iwl4965_bg_txpower_work(struct work_struct
*work
)
1580 struct iwl4965_priv
*priv
= container_of(work
, struct iwl4965_priv
,
1583 /* If a scan happened to start before we got here
1584 * then just return; the statistics notification will
1585 * kick off another scheduled work to compensate for
1586 * any temperature delta we missed here. */
1587 if (test_bit(STATUS_EXIT_PENDING
, &priv
->status
) ||
1588 test_bit(STATUS_SCANNING
, &priv
->status
))
1591 mutex_lock(&priv
->mutex
);
1593 /* Regardless of if we are assocaited, we must reconfigure the
1594 * TX power since frames can be sent on non-radar channels while
1596 iwl4965_hw_reg_send_txpower(priv
);
1598 /* Update last_temperature to keep is_calib_needed from running
1599 * when it isn't needed... */
1600 priv
->last_temperature
= priv
->temperature
;
1602 mutex_unlock(&priv
->mutex
);
1606 * Acquire priv->lock before calling this function !
1608 static void iwl4965_set_wr_ptrs(struct iwl4965_priv
*priv
, int txq_id
, u32 index
)
1610 iwl4965_write_direct32(priv
, HBUS_TARG_WRPTR
,
1611 (index
& 0xff) | (txq_id
<< 8));
1612 iwl4965_write_prph(priv
, KDR_SCD_QUEUE_RDPTR(txq_id
), index
);
1616 * iwl4965_tx_queue_set_status - (optionally) start Tx/Cmd queue
1617 * @tx_fifo_id: Tx DMA/FIFO channel (range 0-7) that the queue will feed
1618 * @scd_retry: (1) Indicates queue will be used in aggregation mode
1620 * NOTE: Acquire priv->lock before calling this function !
1622 static void iwl4965_tx_queue_set_status(struct iwl4965_priv
*priv
,
1623 struct iwl4965_tx_queue
*txq
,
1624 int tx_fifo_id
, int scd_retry
)
1626 int txq_id
= txq
->q
.id
;
1628 /* Find out whether to activate Tx queue */
1629 int active
= test_bit(txq_id
, &priv
->txq_ctx_active_msk
)?1:0;
1631 /* Set up and activate */
1632 iwl4965_write_prph(priv
, KDR_SCD_QUEUE_STATUS_BITS(txq_id
),
1633 (active
<< SCD_QUEUE_STTS_REG_POS_ACTIVE
) |
1634 (tx_fifo_id
<< SCD_QUEUE_STTS_REG_POS_TXF
) |
1635 (scd_retry
<< SCD_QUEUE_STTS_REG_POS_WSL
) |
1636 (scd_retry
<< SCD_QUEUE_STTS_REG_POS_SCD_ACK
) |
1637 SCD_QUEUE_STTS_REG_MSK
);
1639 txq
->sched_retry
= scd_retry
;
1641 IWL_DEBUG_INFO("%s %s Queue %d on AC %d\n",
1642 active
? "Activate" : "Deactivate",
1643 scd_retry
? "BA" : "AC", txq_id
, tx_fifo_id
);
1646 static const u16 default_queue_to_tx_fifo
[] = {
1656 static inline void iwl4965_txq_ctx_activate(struct iwl4965_priv
*priv
, int txq_id
)
1658 set_bit(txq_id
, &priv
->txq_ctx_active_msk
);
1661 static inline void iwl4965_txq_ctx_deactivate(struct iwl4965_priv
*priv
, int txq_id
)
1663 clear_bit(txq_id
, &priv
->txq_ctx_active_msk
);
1666 int iwl4965_alive_notify(struct iwl4965_priv
*priv
)
1670 unsigned long flags
;
1673 spin_lock_irqsave(&priv
->lock
, flags
);
1675 #ifdef CONFIG_IWL4965_SENSITIVITY
1676 memset(&(priv
->sensitivity_data
), 0,
1677 sizeof(struct iwl4965_sensitivity_data
));
1678 memset(&(priv
->chain_noise_data
), 0,
1679 sizeof(struct iwl4965_chain_noise_data
));
1680 for (i
= 0; i
< NUM_RX_CHAINS
; i
++)
1681 priv
->chain_noise_data
.delta_gain_code
[i
] =
1682 CHAIN_NOISE_DELTA_GAIN_INIT_VAL
;
1683 #endif /* CONFIG_IWL4965_SENSITIVITY*/
1684 rc
= iwl4965_grab_nic_access(priv
);
1686 spin_unlock_irqrestore(&priv
->lock
, flags
);
1690 /* Clear 4965's internal Tx Scheduler data base */
1691 priv
->scd_base_addr
= iwl4965_read_prph(priv
, KDR_SCD_SRAM_BASE_ADDR
);
1692 a
= priv
->scd_base_addr
+ SCD_CONTEXT_DATA_OFFSET
;
1693 for (; a
< priv
->scd_base_addr
+ SCD_TX_STTS_BITMAP_OFFSET
; a
+= 4)
1694 iwl4965_write_targ_mem(priv
, a
, 0);
1695 for (; a
< priv
->scd_base_addr
+ SCD_TRANSLATE_TBL_OFFSET
; a
+= 4)
1696 iwl4965_write_targ_mem(priv
, a
, 0);
1697 for (; a
< sizeof(u16
) * priv
->hw_setting
.max_txq_num
; a
+= 4)
1698 iwl4965_write_targ_mem(priv
, a
, 0);
1700 /* Tel 4965 where to find Tx byte count tables */
1701 iwl4965_write_prph(priv
, KDR_SCD_DRAM_BASE_ADDR
,
1702 (priv
->hw_setting
.shared_phys
+
1703 offsetof(struct iwl4965_shared
, queues_byte_cnt_tbls
)) >> 10);
1705 /* Disable chain mode for all queues */
1706 iwl4965_write_prph(priv
, KDR_SCD_QUEUECHAIN_SEL
, 0);
1708 /* Initialize each Tx queue (including the command queue) */
1709 for (i
= 0; i
< priv
->hw_setting
.max_txq_num
; i
++) {
1711 /* TFD circular buffer read/write indexes */
1712 iwl4965_write_prph(priv
, KDR_SCD_QUEUE_RDPTR(i
), 0);
1713 iwl4965_write_direct32(priv
, HBUS_TARG_WRPTR
, 0 | (i
<< 8));
1715 /* Max Tx Window size for Scheduler-ACK mode */
1716 iwl4965_write_targ_mem(priv
, priv
->scd_base_addr
+
1717 SCD_CONTEXT_QUEUE_OFFSET(i
),
1719 SCD_QUEUE_CTX_REG1_WIN_SIZE_POS
) &
1720 SCD_QUEUE_CTX_REG1_WIN_SIZE_MSK
);
1723 iwl4965_write_targ_mem(priv
, priv
->scd_base_addr
+
1724 SCD_CONTEXT_QUEUE_OFFSET(i
) +
1727 SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS
) &
1728 SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK
);
1731 iwl4965_write_prph(priv
, KDR_SCD_INTERRUPT_MASK
,
1732 (1 << priv
->hw_setting
.max_txq_num
) - 1);
1734 /* Activate all Tx DMA/FIFO channels */
1735 iwl4965_write_prph(priv
, KDR_SCD_TXFACT
,
1736 SCD_TXFACT_REG_TXFIFO_MASK(0, 7));
1738 iwl4965_set_wr_ptrs(priv
, IWL_CMD_QUEUE_NUM
, 0);
1740 /* Map each Tx/cmd queue to its corresponding fifo */
1741 for (i
= 0; i
< ARRAY_SIZE(default_queue_to_tx_fifo
); i
++) {
1742 int ac
= default_queue_to_tx_fifo
[i
];
1743 iwl4965_txq_ctx_activate(priv
, i
);
1744 iwl4965_tx_queue_set_status(priv
, &priv
->txq
[i
], ac
, 0);
1747 iwl4965_release_nic_access(priv
);
1748 spin_unlock_irqrestore(&priv
->lock
, flags
);
1754 * iwl4965_hw_set_hw_setting
1756 * Called when initializing driver
1758 int iwl4965_hw_set_hw_setting(struct iwl4965_priv
*priv
)
1760 /* Allocate area for Tx byte count tables and Rx queue status */
1761 priv
->hw_setting
.shared_virt
=
1762 pci_alloc_consistent(priv
->pci_dev
,
1763 sizeof(struct iwl4965_shared
),
1764 &priv
->hw_setting
.shared_phys
);
1766 if (!priv
->hw_setting
.shared_virt
)
1769 memset(priv
->hw_setting
.shared_virt
, 0, sizeof(struct iwl4965_shared
));
1771 priv
->hw_setting
.max_txq_num
= iwl4965_param_queues_num
;
1772 priv
->hw_setting
.ac_queue_count
= AC_NUM
;
1773 priv
->hw_setting
.tx_cmd_len
= sizeof(struct iwl4965_tx_cmd
);
1774 priv
->hw_setting
.max_rxq_size
= RX_QUEUE_SIZE
;
1775 priv
->hw_setting
.max_rxq_log
= RX_QUEUE_SIZE_LOG
;
1776 if (iwl4965_param_amsdu_size_8K
)
1777 priv
->hw_setting
.rx_buf_size
= IWL_RX_BUF_SIZE_8K
;
1779 priv
->hw_setting
.rx_buf_size
= IWL_RX_BUF_SIZE_4K
;
1780 priv
->hw_setting
.max_pkt_size
= priv
->hw_setting
.rx_buf_size
- 256;
1781 priv
->hw_setting
.max_stations
= IWL4965_STATION_COUNT
;
1782 priv
->hw_setting
.bcast_sta_id
= IWL4965_BROADCAST_ID
;
1787 * iwl4965_hw_txq_ctx_free - Free TXQ Context
1789 * Destroy all TX DMA queues and structures
1791 void iwl4965_hw_txq_ctx_free(struct iwl4965_priv
*priv
)
1796 for (txq_id
= 0; txq_id
< priv
->hw_setting
.max_txq_num
; txq_id
++)
1797 iwl4965_tx_queue_free(priv
, &priv
->txq
[txq_id
]);
1799 /* Keep-warm buffer */
1800 iwl4965_kw_free(priv
);
1804 * iwl4965_hw_txq_free_tfd - Free all chunks referenced by TFD [txq->q.read_ptr]
1806 * Does NOT advance any TFD circular buffer read/write indexes
1807 * Does NOT free the TFD itself (which is within circular buffer)
1809 int iwl4965_hw_txq_free_tfd(struct iwl4965_priv
*priv
, struct iwl4965_tx_queue
*txq
)
1811 struct iwl4965_tfd_frame
*bd_tmp
= (struct iwl4965_tfd_frame
*)&txq
->bd
[0];
1812 struct iwl4965_tfd_frame
*bd
= &bd_tmp
[txq
->q
.read_ptr
];
1813 struct pci_dev
*dev
= priv
->pci_dev
;
1818 /* Host command buffers stay mapped in memory, nothing to clean */
1819 if (txq
->q
.id
== IWL_CMD_QUEUE_NUM
)
1822 /* Sanity check on number of chunks */
1823 counter
= IWL_GET_BITS(*bd
, num_tbs
);
1824 if (counter
> MAX_NUM_OF_TBS
) {
1825 IWL_ERROR("Too many chunks: %i\n", counter
);
1826 /* @todo issue fatal error, it is quite serious situation */
1830 /* Unmap chunks, if any.
1831 * TFD info for odd chunks is different format than for even chunks. */
1832 for (i
= 0; i
< counter
; i
++) {
1839 IWL_GET_BITS(bd
->pa
[index
], tb2_addr_lo16
) |
1840 (IWL_GET_BITS(bd
->pa
[index
],
1841 tb2_addr_hi20
) << 16),
1842 IWL_GET_BITS(bd
->pa
[index
], tb2_len
),
1846 pci_unmap_single(dev
,
1847 le32_to_cpu(bd
->pa
[index
].tb1_addr
),
1848 IWL_GET_BITS(bd
->pa
[index
], tb1_len
),
1851 /* Free SKB, if any, for this chunk */
1852 if (txq
->txb
[txq
->q
.read_ptr
].skb
[i
]) {
1853 struct sk_buff
*skb
= txq
->txb
[txq
->q
.read_ptr
].skb
[i
];
1856 txq
->txb
[txq
->q
.read_ptr
].skb
[i
] = NULL
;
1862 int iwl4965_hw_reg_set_txpower(struct iwl4965_priv
*priv
, s8 power
)
1864 IWL_ERROR("TODO: Implement iwl4965_hw_reg_set_txpower!\n");
1868 static s32
iwl4965_math_div_round(s32 num
, s32 denom
, s32
*res
)
1881 *res
= ((num
* 2 + denom
) / (denom
* 2)) * sign
;
1887 * iwl4965_get_voltage_compensation - Power supply voltage comp for txpower
1889 * Determines power supply voltage compensation for txpower calculations.
1890 * Returns number of 1/2-dB steps to subtract from gain table index,
1891 * to compensate for difference between power supply voltage during
1892 * factory measurements, vs. current power supply voltage.
1894 * Voltage indication is higher for lower voltage.
1895 * Lower voltage requires more gain (lower gain table index).
1897 static s32
iwl4965_get_voltage_compensation(s32 eeprom_voltage
,
1898 s32 current_voltage
)
1902 if ((TX_POWER_IWL_ILLEGAL_VOLTAGE
== eeprom_voltage
) ||
1903 (TX_POWER_IWL_ILLEGAL_VOLTAGE
== current_voltage
))
1906 iwl4965_math_div_round(current_voltage
- eeprom_voltage
,
1907 TX_POWER_IWL_VOLTAGE_CODES_PER_03V
, &comp
);
1909 if (current_voltage
> eeprom_voltage
)
1911 if ((comp
< -2) || (comp
> 2))
1917 static const struct iwl4965_channel_info
*
1918 iwl4965_get_channel_txpower_info(struct iwl4965_priv
*priv
, u8 phymode
, u16 channel
)
1920 const struct iwl4965_channel_info
*ch_info
;
1922 ch_info
= iwl4965_get_channel_info(priv
, phymode
, channel
);
1924 if (!is_channel_valid(ch_info
))
1930 static s32
iwl4965_get_tx_atten_grp(u16 channel
)
1932 if (channel
>= CALIB_IWL_TX_ATTEN_GR5_FCH
&&
1933 channel
<= CALIB_IWL_TX_ATTEN_GR5_LCH
)
1934 return CALIB_CH_GROUP_5
;
1936 if (channel
>= CALIB_IWL_TX_ATTEN_GR1_FCH
&&
1937 channel
<= CALIB_IWL_TX_ATTEN_GR1_LCH
)
1938 return CALIB_CH_GROUP_1
;
1940 if (channel
>= CALIB_IWL_TX_ATTEN_GR2_FCH
&&
1941 channel
<= CALIB_IWL_TX_ATTEN_GR2_LCH
)
1942 return CALIB_CH_GROUP_2
;
1944 if (channel
>= CALIB_IWL_TX_ATTEN_GR3_FCH
&&
1945 channel
<= CALIB_IWL_TX_ATTEN_GR3_LCH
)
1946 return CALIB_CH_GROUP_3
;
1948 if (channel
>= CALIB_IWL_TX_ATTEN_GR4_FCH
&&
1949 channel
<= CALIB_IWL_TX_ATTEN_GR4_LCH
)
1950 return CALIB_CH_GROUP_4
;
1952 IWL_ERROR("Can't find txatten group for channel %d.\n", channel
);
1956 static u32
iwl4965_get_sub_band(const struct iwl4965_priv
*priv
, u32 channel
)
1960 for (b
= 0; b
< EEPROM_TX_POWER_BANDS
; b
++) {
1961 if (priv
->eeprom
.calib_info
.band_info
[b
].ch_from
== 0)
1964 if ((channel
>= priv
->eeprom
.calib_info
.band_info
[b
].ch_from
)
1965 && (channel
<= priv
->eeprom
.calib_info
.band_info
[b
].ch_to
))
1972 static s32
iwl4965_interpolate_value(s32 x
, s32 x1
, s32 y1
, s32 x2
, s32 y2
)
1979 iwl4965_math_div_round((x2
- x
) * (y1
- y2
), (x2
- x1
), &val
);
1985 * iwl4965_interpolate_chan - Interpolate factory measurements for one channel
1987 * Interpolates factory measurements from the two sample channels within a
1988 * sub-band, to apply to channel of interest. Interpolation is proportional to
1989 * differences in channel frequencies, which is proportional to differences
1990 * in channel number.
1992 static int iwl4965_interpolate_chan(struct iwl4965_priv
*priv
, u32 channel
,
1993 struct iwl4965_eeprom_calib_ch_info
*chan_info
)
1998 const struct iwl4965_eeprom_calib_measure
*m1
;
1999 const struct iwl4965_eeprom_calib_measure
*m2
;
2000 struct iwl4965_eeprom_calib_measure
*omeas
;
2004 s
= iwl4965_get_sub_band(priv
, channel
);
2005 if (s
>= EEPROM_TX_POWER_BANDS
) {
2006 IWL_ERROR("Tx Power can not find channel %d ", channel
);
2010 ch_i1
= priv
->eeprom
.calib_info
.band_info
[s
].ch1
.ch_num
;
2011 ch_i2
= priv
->eeprom
.calib_info
.band_info
[s
].ch2
.ch_num
;
2012 chan_info
->ch_num
= (u8
) channel
;
2014 IWL_DEBUG_TXPOWER("channel %d subband %d factory cal ch %d & %d\n",
2015 channel
, s
, ch_i1
, ch_i2
);
2017 for (c
= 0; c
< EEPROM_TX_POWER_TX_CHAINS
; c
++) {
2018 for (m
= 0; m
< EEPROM_TX_POWER_MEASUREMENTS
; m
++) {
2019 m1
= &(priv
->eeprom
.calib_info
.band_info
[s
].ch1
.
2020 measurements
[c
][m
]);
2021 m2
= &(priv
->eeprom
.calib_info
.band_info
[s
].ch2
.
2022 measurements
[c
][m
]);
2023 omeas
= &(chan_info
->measurements
[c
][m
]);
2026 (u8
) iwl4965_interpolate_value(channel
, ch_i1
,
2031 (u8
) iwl4965_interpolate_value(channel
, ch_i1
,
2032 m1
->gain_idx
, ch_i2
,
2034 omeas
->temperature
=
2035 (u8
) iwl4965_interpolate_value(channel
, ch_i1
,
2040 (s8
) iwl4965_interpolate_value(channel
, ch_i1
,
2045 ("chain %d meas %d AP1=%d AP2=%d AP=%d\n", c
, m
,
2046 m1
->actual_pow
, m2
->actual_pow
, omeas
->actual_pow
);
2048 ("chain %d meas %d NI1=%d NI2=%d NI=%d\n", c
, m
,
2049 m1
->gain_idx
, m2
->gain_idx
, omeas
->gain_idx
);
2051 ("chain %d meas %d PA1=%d PA2=%d PA=%d\n", c
, m
,
2052 m1
->pa_det
, m2
->pa_det
, omeas
->pa_det
);
2054 ("chain %d meas %d T1=%d T2=%d T=%d\n", c
, m
,
2055 m1
->temperature
, m2
->temperature
,
2056 omeas
->temperature
);
2063 /* bit-rate-dependent table to prevent Tx distortion, in half-dB units,
2064 * for OFDM 6, 12, 18, 24, 36, 48, 54, 60 MBit, and CCK all rates. */
2065 static s32 back_off_table
[] = {
2066 10, 10, 10, 10, 10, 15, 17, 20, /* OFDM SISO 20 MHz */
2067 10, 10, 10, 10, 10, 15, 17, 20, /* OFDM MIMO 20 MHz */
2068 10, 10, 10, 10, 10, 15, 17, 20, /* OFDM SISO 40 MHz */
2069 10, 10, 10, 10, 10, 15, 17, 20, /* OFDM MIMO 40 MHz */
2073 /* Thermal compensation values for txpower for various frequency ranges ...
2074 * ratios from 3:1 to 4.5:1 of degrees (Celsius) per half-dB gain adjust */
2075 static struct iwl4965_txpower_comp_entry
{
2076 s32 degrees_per_05db_a
;
2077 s32 degrees_per_05db_a_denom
;
2078 } tx_power_cmp_tble
[CALIB_CH_GROUP_MAX
] = {
2079 {9, 2}, /* group 0 5.2, ch 34-43 */
2080 {4, 1}, /* group 1 5.2, ch 44-70 */
2081 {4, 1}, /* group 2 5.2, ch 71-124 */
2082 {4, 1}, /* group 3 5.2, ch 125-200 */
2083 {3, 1} /* group 4 2.4, ch all */
2086 static s32
get_min_power_index(s32 rate_power_index
, u32 band
)
2089 if ((rate_power_index
& 7) <= 4)
2090 return MIN_TX_GAIN_INDEX_52GHZ_EXT
;
2092 return MIN_TX_GAIN_INDEX
;
2100 static const struct gain_entry gain_table
[2][108] = {
2101 /* 5.2GHz power gain index table */
2103 {123, 0x3F}, /* highest txpower */
2212 /* 2.4GHz power gain index table */
2214 {110, 0x3f}, /* highest txpower */
2325 static int iwl4965_fill_txpower_tbl(struct iwl4965_priv
*priv
, u8 band
, u16 channel
,
2326 u8 is_fat
, u8 ctrl_chan_high
,
2327 struct iwl4965_tx_power_db
*tx_power_tbl
)
2329 u8 saturation_power
;
2331 s32 user_target_power
;
2335 s32 current_regulatory
;
2336 s32 txatten_grp
= CALIB_CH_GROUP_MAX
;
2339 const struct iwl4965_channel_info
*ch_info
= NULL
;
2340 struct iwl4965_eeprom_calib_ch_info ch_eeprom_info
;
2341 const struct iwl4965_eeprom_calib_measure
*measurement
;
2344 s32 voltage_compensation
;
2345 s32 degrees_per_05db_num
;
2346 s32 degrees_per_05db_denom
;
2348 s32 temperature_comp
[2];
2349 s32 factory_gain_index
[2];
2350 s32 factory_actual_pwr
[2];
2353 /* Sanity check requested level (dBm) */
2354 if (priv
->user_txpower_limit
< IWL_TX_POWER_TARGET_POWER_MIN
) {
2355 IWL_WARNING("Requested user TXPOWER %d below limit.\n",
2356 priv
->user_txpower_limit
);
2359 if (priv
->user_txpower_limit
> IWL_TX_POWER_TARGET_POWER_MAX
) {
2360 IWL_WARNING("Requested user TXPOWER %d above limit.\n",
2361 priv
->user_txpower_limit
);
2365 /* user_txpower_limit is in dBm, convert to half-dBm (half-dB units
2366 * are used for indexing into txpower table) */
2367 user_target_power
= 2 * priv
->user_txpower_limit
;
2369 /* Get current (RXON) channel, band, width */
2371 iwl4965_get_channel_txpower_info(priv
, priv
->phymode
, channel
);
2373 IWL_DEBUG_TXPOWER("chan %d band %d is_fat %d\n", channel
, band
,
2379 /* get txatten group, used to select 1) thermal txpower adjustment
2380 * and 2) mimo txpower balance between Tx chains. */
2381 txatten_grp
= iwl4965_get_tx_atten_grp(channel
);
2382 if (txatten_grp
< 0)
2385 IWL_DEBUG_TXPOWER("channel %d belongs to txatten group %d\n",
2386 channel
, txatten_grp
);
2395 /* hardware txpower limits ...
2396 * saturation (clipping distortion) txpowers are in half-dBm */
2398 saturation_power
= priv
->eeprom
.calib_info
.saturation_power24
;
2400 saturation_power
= priv
->eeprom
.calib_info
.saturation_power52
;
2402 if (saturation_power
< IWL_TX_POWER_SATURATION_MIN
||
2403 saturation_power
> IWL_TX_POWER_SATURATION_MAX
) {
2405 saturation_power
= IWL_TX_POWER_DEFAULT_SATURATION_24
;
2407 saturation_power
= IWL_TX_POWER_DEFAULT_SATURATION_52
;
2410 /* regulatory txpower limits ... reg_limit values are in half-dBm,
2411 * max_power_avg values are in dBm, convert * 2 */
2413 reg_limit
= ch_info
->fat_max_power_avg
* 2;
2415 reg_limit
= ch_info
->max_power_avg
* 2;
2417 if ((reg_limit
< IWL_TX_POWER_REGULATORY_MIN
) ||
2418 (reg_limit
> IWL_TX_POWER_REGULATORY_MAX
)) {
2420 reg_limit
= IWL_TX_POWER_DEFAULT_REGULATORY_24
;
2422 reg_limit
= IWL_TX_POWER_DEFAULT_REGULATORY_52
;
2425 /* Interpolate txpower calibration values for this channel,
2426 * based on factory calibration tests on spaced channels. */
2427 iwl4965_interpolate_chan(priv
, channel
, &ch_eeprom_info
);
2429 /* calculate tx gain adjustment based on power supply voltage */
2430 voltage
= priv
->eeprom
.calib_info
.voltage
;
2431 init_voltage
= (s32
)le32_to_cpu(priv
->card_alive_init
.voltage
);
2432 voltage_compensation
=
2433 iwl4965_get_voltage_compensation(voltage
, init_voltage
);
2435 IWL_DEBUG_TXPOWER("curr volt %d eeprom volt %d volt comp %d\n",
2437 voltage
, voltage_compensation
);
2439 /* get current temperature (Celsius) */
2440 current_temp
= max(priv
->temperature
, IWL_TX_POWER_TEMPERATURE_MIN
);
2441 current_temp
= min(priv
->temperature
, IWL_TX_POWER_TEMPERATURE_MAX
);
2442 current_temp
= KELVIN_TO_CELSIUS(current_temp
);
2444 /* select thermal txpower adjustment params, based on channel group
2445 * (same frequency group used for mimo txatten adjustment) */
2446 degrees_per_05db_num
=
2447 tx_power_cmp_tble
[txatten_grp
].degrees_per_05db_a
;
2448 degrees_per_05db_denom
=
2449 tx_power_cmp_tble
[txatten_grp
].degrees_per_05db_a_denom
;
2451 /* get per-chain txpower values from factory measurements */
2452 for (c
= 0; c
< 2; c
++) {
2453 measurement
= &ch_eeprom_info
.measurements
[c
][1];
2455 /* txgain adjustment (in half-dB steps) based on difference
2456 * between factory and current temperature */
2457 factory_temp
= measurement
->temperature
;
2458 iwl4965_math_div_round((current_temp
- factory_temp
) *
2459 degrees_per_05db_denom
,
2460 degrees_per_05db_num
,
2461 &temperature_comp
[c
]);
2463 factory_gain_index
[c
] = measurement
->gain_idx
;
2464 factory_actual_pwr
[c
] = measurement
->actual_pow
;
2466 IWL_DEBUG_TXPOWER("chain = %d\n", c
);
2467 IWL_DEBUG_TXPOWER("fctry tmp %d, "
2468 "curr tmp %d, comp %d steps\n",
2469 factory_temp
, current_temp
,
2470 temperature_comp
[c
]);
2472 IWL_DEBUG_TXPOWER("fctry idx %d, fctry pwr %d\n",
2473 factory_gain_index
[c
],
2474 factory_actual_pwr
[c
]);
2477 /* for each of 33 bit-rates (including 1 for CCK) */
2478 for (i
= 0; i
< POWER_TABLE_NUM_ENTRIES
; i
++) {
2480 union iwl4965_tx_power_dual_stream tx_power
;
2482 /* for mimo, reduce each chain's txpower by half
2483 * (3dB, 6 steps), so total output power is regulatory
2486 current_regulatory
= reg_limit
-
2487 IWL_TX_POWER_MIMO_REGULATORY_COMPENSATION
;
2490 current_regulatory
= reg_limit
;
2494 /* find txpower limit, either hardware or regulatory */
2495 power_limit
= saturation_power
- back_off_table
[i
];
2496 if (power_limit
> current_regulatory
)
2497 power_limit
= current_regulatory
;
2499 /* reduce user's txpower request if necessary
2500 * for this rate on this channel */
2501 target_power
= user_target_power
;
2502 if (target_power
> power_limit
)
2503 target_power
= power_limit
;
2505 IWL_DEBUG_TXPOWER("rate %d sat %d reg %d usr %d tgt %d\n",
2506 i
, saturation_power
- back_off_table
[i
],
2507 current_regulatory
, user_target_power
,
2510 /* for each of 2 Tx chains (radio transmitters) */
2511 for (c
= 0; c
< 2; c
++) {
2516 (s32
)le32_to_cpu(priv
->card_alive_init
.
2517 tx_atten
[txatten_grp
][c
]);
2521 /* calculate index; higher index means lower txpower */
2522 power_index
= (u8
) (factory_gain_index
[c
] -
2524 factory_actual_pwr
[c
]) -
2525 temperature_comp
[c
] -
2526 voltage_compensation
+
2529 /* IWL_DEBUG_TXPOWER("calculated txpower index %d\n",
2532 if (power_index
< get_min_power_index(i
, band
))
2533 power_index
= get_min_power_index(i
, band
);
2535 /* adjust 5 GHz index to support negative indexes */
2539 /* CCK, rate 32, reduce txpower for CCK */
2540 if (i
== POWER_TABLE_CCK_ENTRY
)
2542 IWL_TX_POWER_CCK_COMPENSATION_C_STEP
;
2544 /* stay within the table! */
2545 if (power_index
> 107) {
2546 IWL_WARNING("txpower index %d > 107\n",
2550 if (power_index
< 0) {
2551 IWL_WARNING("txpower index %d < 0\n",
2556 /* fill txpower command for this rate/chain */
2557 tx_power
.s
.radio_tx_gain
[c
] =
2558 gain_table
[band
][power_index
].radio
;
2559 tx_power
.s
.dsp_predis_atten
[c
] =
2560 gain_table
[band
][power_index
].dsp
;
2562 IWL_DEBUG_TXPOWER("chain %d mimo %d index %d "
2563 "gain 0x%02x dsp %d\n",
2564 c
, atten_value
, power_index
,
2565 tx_power
.s
.radio_tx_gain
[c
],
2566 tx_power
.s
.dsp_predis_atten
[c
]);
2567 }/* for each chain */
2569 tx_power_tbl
->power_tbl
[i
].dw
= cpu_to_le32(tx_power
.dw
);
2571 }/* for each rate */
2577 * iwl4965_hw_reg_send_txpower - Configure the TXPOWER level user limit
2579 * Uses the active RXON for channel, band, and characteristics (fat, high)
2580 * The power limit is taken from priv->user_txpower_limit.
2582 int iwl4965_hw_reg_send_txpower(struct iwl4965_priv
*priv
)
2584 struct iwl4965_txpowertable_cmd cmd
= { 0 };
2588 u8 ctrl_chan_high
= 0;
2590 if (test_bit(STATUS_SCANNING
, &priv
->status
)) {
2591 /* If this gets hit a lot, switch it to a BUG() and catch
2592 * the stack trace to find out who is calling this during
2594 IWL_WARNING("TX Power requested while scanning!\n");
2598 band
= ((priv
->phymode
== MODE_IEEE80211B
) ||
2599 (priv
->phymode
== MODE_IEEE80211G
));
2601 is_fat
= is_fat_channel(priv
->active_rxon
.flags
);
2604 (priv
->active_rxon
.flags
& RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK
))
2608 cmd
.channel
= priv
->active_rxon
.channel
;
2610 rc
= iwl4965_fill_txpower_tbl(priv
, band
,
2611 le16_to_cpu(priv
->active_rxon
.channel
),
2612 is_fat
, ctrl_chan_high
, &cmd
.tx_power
);
2616 rc
= iwl4965_send_cmd_pdu(priv
, REPLY_TX_PWR_TABLE_CMD
, sizeof(cmd
), &cmd
);
2620 int iwl4965_hw_channel_switch(struct iwl4965_priv
*priv
, u16 channel
)
2625 u8 ctrl_chan_high
= 0;
2626 struct iwl4965_channel_switch_cmd cmd
= { 0 };
2627 const struct iwl4965_channel_info
*ch_info
;
2629 band
= ((priv
->phymode
== MODE_IEEE80211B
) ||
2630 (priv
->phymode
== MODE_IEEE80211G
));
2632 ch_info
= iwl4965_get_channel_info(priv
, priv
->phymode
, channel
);
2634 is_fat
= is_fat_channel(priv
->staging_rxon
.flags
);
2637 (priv
->active_rxon
.flags
& RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK
))
2641 cmd
.expect_beacon
= 0;
2642 cmd
.channel
= cpu_to_le16(channel
);
2643 cmd
.rxon_flags
= priv
->active_rxon
.flags
;
2644 cmd
.rxon_filter_flags
= priv
->active_rxon
.filter_flags
;
2645 cmd
.switch_time
= cpu_to_le32(priv
->ucode_beacon_time
);
2647 cmd
.expect_beacon
= is_channel_radar(ch_info
);
2649 cmd
.expect_beacon
= 1;
2651 rc
= iwl4965_fill_txpower_tbl(priv
, band
, channel
, is_fat
,
2652 ctrl_chan_high
, &cmd
.tx_power
);
2654 IWL_DEBUG_11H("error:%d fill txpower_tbl\n", rc
);
2658 rc
= iwl4965_send_cmd_pdu(priv
, REPLY_CHANNEL_SWITCH
, sizeof(cmd
), &cmd
);
2662 #define RTS_HCCA_RETRY_LIMIT 3
2663 #define RTS_DFAULT_RETRY_LIMIT 60
2665 void iwl4965_hw_build_tx_cmd_rate(struct iwl4965_priv
*priv
,
2666 struct iwl4965_cmd
*cmd
,
2667 struct ieee80211_tx_control
*ctrl
,
2668 struct ieee80211_hdr
*hdr
, int sta_id
,
2671 struct iwl4965_tx_cmd
*tx
= &cmd
->cmd
.tx
;
2672 u8 rts_retry_limit
= 0;
2673 u8 data_retry_limit
= 0;
2674 u16 fc
= le16_to_cpu(hdr
->frame_control
);
2677 int rate_idx
= min(ctrl
->tx_rate
& 0xffff, IWL_RATE_COUNT
- 1);
2679 rate_plcp
= iwl4965_rates
[rate_idx
].plcp
;
2681 rts_retry_limit
= (is_hcca
) ?
2682 RTS_HCCA_RETRY_LIMIT
: RTS_DFAULT_RETRY_LIMIT
;
2684 if ((rate_idx
>= IWL_FIRST_CCK_RATE
) && (rate_idx
<= IWL_LAST_CCK_RATE
))
2685 rate_flags
|= RATE_MCS_CCK_MSK
;
2688 if (ieee80211_is_probe_response(fc
)) {
2689 data_retry_limit
= 3;
2690 if (data_retry_limit
< rts_retry_limit
)
2691 rts_retry_limit
= data_retry_limit
;
2693 data_retry_limit
= IWL_DEFAULT_TX_RETRY
;
2695 if (priv
->data_retry_limit
!= -1)
2696 data_retry_limit
= priv
->data_retry_limit
;
2699 if (ieee80211_is_data(fc
)) {
2700 tx
->initial_rate_index
= 0;
2701 tx
->tx_flags
|= TX_CMD_FLG_STA_RATE_MSK
;
2703 switch (fc
& IEEE80211_FCTL_STYPE
) {
2704 case IEEE80211_STYPE_AUTH
:
2705 case IEEE80211_STYPE_DEAUTH
:
2706 case IEEE80211_STYPE_ASSOC_REQ
:
2707 case IEEE80211_STYPE_REASSOC_REQ
:
2708 if (tx
->tx_flags
& TX_CMD_FLG_RTS_MSK
) {
2709 tx
->tx_flags
&= ~TX_CMD_FLG_RTS_MSK
;
2710 tx
->tx_flags
|= TX_CMD_FLG_CTS_MSK
;
2717 /* Alternate between antenna A and B for successive frames */
2718 if (priv
->use_ant_b_for_management_frame
) {
2719 priv
->use_ant_b_for_management_frame
= 0;
2720 rate_flags
|= RATE_MCS_ANT_B_MSK
;
2722 priv
->use_ant_b_for_management_frame
= 1;
2723 rate_flags
|= RATE_MCS_ANT_A_MSK
;
2727 tx
->rts_retry_limit
= rts_retry_limit
;
2728 tx
->data_retry_limit
= data_retry_limit
;
2729 tx
->rate_n_flags
= iwl4965_hw_set_rate_n_flags(rate_plcp
, rate_flags
);
2732 int iwl4965_hw_get_rx_read(struct iwl4965_priv
*priv
)
2734 struct iwl4965_shared
*shared_data
= priv
->hw_setting
.shared_virt
;
2736 return IWL_GET_BITS(*shared_data
, rb_closed_stts_rb_num
);
2739 int iwl4965_hw_get_temperature(struct iwl4965_priv
*priv
)
2741 return priv
->temperature
;
2744 unsigned int iwl4965_hw_get_beacon_cmd(struct iwl4965_priv
*priv
,
2745 struct iwl4965_frame
*frame
, u8 rate
)
2747 struct iwl4965_tx_beacon_cmd
*tx_beacon_cmd
;
2748 unsigned int frame_size
;
2750 tx_beacon_cmd
= &frame
->u
.beacon
;
2751 memset(tx_beacon_cmd
, 0, sizeof(*tx_beacon_cmd
));
2753 tx_beacon_cmd
->tx
.sta_id
= IWL4965_BROADCAST_ID
;
2754 tx_beacon_cmd
->tx
.stop_time
.life_time
= TX_CMD_LIFE_TIME_INFINITE
;
2756 frame_size
= iwl4965_fill_beacon_frame(priv
,
2757 tx_beacon_cmd
->frame
,
2758 iwl4965_broadcast_addr
,
2759 sizeof(frame
->u
) - sizeof(*tx_beacon_cmd
));
2761 BUG_ON(frame_size
> MAX_MPDU_SIZE
);
2762 tx_beacon_cmd
->tx
.len
= cpu_to_le16((u16
)frame_size
);
2764 if ((rate
== IWL_RATE_1M_PLCP
) || (rate
>= IWL_RATE_2M_PLCP
))
2765 tx_beacon_cmd
->tx
.rate_n_flags
=
2766 iwl4965_hw_set_rate_n_flags(rate
, RATE_MCS_CCK_MSK
);
2768 tx_beacon_cmd
->tx
.rate_n_flags
=
2769 iwl4965_hw_set_rate_n_flags(rate
, 0);
2771 tx_beacon_cmd
->tx
.tx_flags
= (TX_CMD_FLG_SEQ_CTL_MSK
|
2772 TX_CMD_FLG_TSF_MSK
| TX_CMD_FLG_STA_RATE_MSK
);
2773 return (sizeof(*tx_beacon_cmd
) + frame_size
);
2777 * Tell 4965 where to find circular buffer of Tx Frame Descriptors for
2778 * given Tx queue, and enable the DMA channel used for that queue.
2780 * 4965 supports up to 16 Tx queues in DRAM, mapped to up to 8 Tx DMA
2781 * channels supported in hardware.
2783 int iwl4965_hw_tx_queue_init(struct iwl4965_priv
*priv
, struct iwl4965_tx_queue
*txq
)
2786 unsigned long flags
;
2787 int txq_id
= txq
->q
.id
;
2789 spin_lock_irqsave(&priv
->lock
, flags
);
2790 rc
= iwl4965_grab_nic_access(priv
);
2792 spin_unlock_irqrestore(&priv
->lock
, flags
);
2796 /* Circular buffer (TFD queue in DRAM) physical base address */
2797 iwl4965_write_direct32(priv
, FH_MEM_CBBC_QUEUE(txq_id
),
2798 txq
->q
.dma_addr
>> 8);
2800 /* Enable DMA channel, using same id as for TFD queue */
2801 iwl4965_write_direct32(
2802 priv
, IWL_FH_TCSR_CHNL_TX_CONFIG_REG(txq_id
),
2803 IWL_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE
|
2804 IWL_FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE_VAL
);
2805 iwl4965_release_nic_access(priv
);
2806 spin_unlock_irqrestore(&priv
->lock
, flags
);
2811 int iwl4965_hw_txq_attach_buf_to_tfd(struct iwl4965_priv
*priv
, void *ptr
,
2812 dma_addr_t addr
, u16 len
)
2815 struct iwl4965_tfd_frame
*tfd
= ptr
;
2816 u32 num_tbs
= IWL_GET_BITS(*tfd
, num_tbs
);
2818 /* Each TFD can point to a maximum 20 Tx buffers */
2819 if ((num_tbs
>= MAX_NUM_OF_TBS
) || (num_tbs
< 0)) {
2820 IWL_ERROR("Error can not send more than %d chunks\n",
2825 index
= num_tbs
/ 2;
2826 is_odd
= num_tbs
& 0x1;
2829 tfd
->pa
[index
].tb1_addr
= cpu_to_le32(addr
);
2830 IWL_SET_BITS(tfd
->pa
[index
], tb1_addr_hi
,
2831 iwl_get_dma_hi_address(addr
));
2832 IWL_SET_BITS(tfd
->pa
[index
], tb1_len
, len
);
2834 IWL_SET_BITS(tfd
->pa
[index
], tb2_addr_lo16
,
2835 (u32
) (addr
& 0xffff));
2836 IWL_SET_BITS(tfd
->pa
[index
], tb2_addr_hi20
, addr
>> 16);
2837 IWL_SET_BITS(tfd
->pa
[index
], tb2_len
, len
);
2840 IWL_SET_BITS(*tfd
, num_tbs
, num_tbs
+ 1);
2845 static void iwl4965_hw_card_show_info(struct iwl4965_priv
*priv
)
2847 u16 hw_version
= priv
->eeprom
.board_revision_4965
;
2849 IWL_DEBUG_INFO("4965ABGN HW Version %u.%u.%u\n",
2850 ((hw_version
>> 8) & 0x0F),
2851 ((hw_version
>> 8) >> 4), (hw_version
& 0x00FF));
2853 IWL_DEBUG_INFO("4965ABGN PBA Number %.16s\n",
2854 priv
->eeprom
.board_pba_number_4965
);
2857 #define IWL_TX_CRC_SIZE 4
2858 #define IWL_TX_DELIMITER_SIZE 4
2861 * iwl4965_tx_queue_update_wr_ptr - Set up entry in Tx byte-count array
2863 int iwl4965_tx_queue_update_wr_ptr(struct iwl4965_priv
*priv
,
2864 struct iwl4965_tx_queue
*txq
, u16 byte_cnt
)
2867 int txq_id
= txq
->q
.id
;
2868 struct iwl4965_shared
*shared_data
= priv
->hw_setting
.shared_virt
;
2870 if (txq
->need_update
== 0)
2873 len
= byte_cnt
+ IWL_TX_CRC_SIZE
+ IWL_TX_DELIMITER_SIZE
;
2875 /* Set up byte count within first 256 entries */
2876 IWL_SET_BITS16(shared_data
->queues_byte_cnt_tbls
[txq_id
].
2877 tfd_offset
[txq
->q
.write_ptr
], byte_cnt
, len
);
2879 /* If within first 64 entries, duplicate at end */
2880 if (txq
->q
.write_ptr
< IWL4965_MAX_WIN_SIZE
)
2881 IWL_SET_BITS16(shared_data
->queues_byte_cnt_tbls
[txq_id
].
2882 tfd_offset
[IWL4965_QUEUE_SIZE
+ txq
->q
.write_ptr
],
2889 * iwl4965_set_rxon_chain - Set up Rx chain usage in "staging" RXON image
2891 * Selects how many and which Rx receivers/antennas/chains to use.
2892 * This should not be used for scan command ... it puts data in wrong place.
2894 void iwl4965_set_rxon_chain(struct iwl4965_priv
*priv
)
2896 u8 is_single
= is_single_stream(priv
);
2897 u8 idle_state
, rx_state
;
2899 priv
->staging_rxon
.rx_chain
= 0;
2900 rx_state
= idle_state
= 3;
2902 /* Tell uCode which antennas are actually connected.
2903 * Before first association, we assume all antennas are connected.
2904 * Just after first association, iwl4965_noise_calibration()
2905 * checks which antennas actually *are* connected. */
2906 priv
->staging_rxon
.rx_chain
|=
2907 cpu_to_le16(priv
->valid_antenna
<< RXON_RX_CHAIN_VALID_POS
);
2909 /* How many receivers should we use? */
2910 iwl4965_get_rx_chain_counter(priv
, &idle_state
, &rx_state
);
2911 priv
->staging_rxon
.rx_chain
|=
2912 cpu_to_le16(rx_state
<< RXON_RX_CHAIN_MIMO_CNT_POS
);
2913 priv
->staging_rxon
.rx_chain
|=
2914 cpu_to_le16(idle_state
<< RXON_RX_CHAIN_CNT_POS
);
2916 if (!is_single
&& (rx_state
>= 2) &&
2917 !test_bit(STATUS_POWER_PMI
, &priv
->status
))
2918 priv
->staging_rxon
.rx_chain
|= RXON_RX_CHAIN_MIMO_FORCE_MSK
;
2920 priv
->staging_rxon
.rx_chain
&= ~RXON_RX_CHAIN_MIMO_FORCE_MSK
;
2922 IWL_DEBUG_ASSOC("rx chain %X\n", priv
->staging_rxon
.rx_chain
);
2925 #ifdef CONFIG_IWL4965_HT
2926 #ifdef CONFIG_IWL4965_HT_AGG
2928 get the traffic load value for tid
2930 static u32
iwl4965_tl_get_load(struct iwl4965_priv
*priv
, u8 tid
)
2933 u32 current_time
= jiffies_to_msecs(jiffies
);
2936 unsigned long flags
;
2937 struct iwl4965_traffic_load
*tid_ptr
= NULL
;
2939 if (tid
>= TID_MAX_LOAD_COUNT
)
2942 tid_ptr
= &(priv
->lq_mngr
.agg_ctrl
.traffic_load
[tid
]);
2944 current_time
-= current_time
% TID_ROUND_VALUE
;
2946 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
2947 if (!(tid_ptr
->queue_count
))
2950 time_diff
= TIME_WRAP_AROUND(tid_ptr
->time_stamp
, current_time
);
2951 index
= time_diff
/ TID_QUEUE_CELL_SPACING
;
2953 if (index
>= TID_QUEUE_MAX_SIZE
) {
2954 u32 oldest_time
= current_time
- TID_MAX_TIME_DIFF
;
2956 while (tid_ptr
->queue_count
&&
2957 (tid_ptr
->time_stamp
< oldest_time
)) {
2958 tid_ptr
->total
-= tid_ptr
->packet_count
[tid_ptr
->head
];
2959 tid_ptr
->packet_count
[tid_ptr
->head
] = 0;
2960 tid_ptr
->time_stamp
+= TID_QUEUE_CELL_SPACING
;
2961 tid_ptr
->queue_count
--;
2963 if (tid_ptr
->head
>= TID_QUEUE_MAX_SIZE
)
2967 load
= tid_ptr
->total
;
2970 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
2975 increment traffic load value for tid and also remove
2976 any old values if passed the certian time period
2978 static void iwl4965_tl_add_packet(struct iwl4965_priv
*priv
, u8 tid
)
2980 u32 current_time
= jiffies_to_msecs(jiffies
);
2983 unsigned long flags
;
2984 struct iwl4965_traffic_load
*tid_ptr
= NULL
;
2986 if (tid
>= TID_MAX_LOAD_COUNT
)
2989 tid_ptr
= &(priv
->lq_mngr
.agg_ctrl
.traffic_load
[tid
]);
2991 current_time
-= current_time
% TID_ROUND_VALUE
;
2993 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
2994 if (!(tid_ptr
->queue_count
)) {
2996 tid_ptr
->time_stamp
= current_time
;
2997 tid_ptr
->queue_count
= 1;
2999 tid_ptr
->packet_count
[0] = 1;
3003 time_diff
= TIME_WRAP_AROUND(tid_ptr
->time_stamp
, current_time
);
3004 index
= time_diff
/ TID_QUEUE_CELL_SPACING
;
3006 if (index
>= TID_QUEUE_MAX_SIZE
) {
3007 u32 oldest_time
= current_time
- TID_MAX_TIME_DIFF
;
3009 while (tid_ptr
->queue_count
&&
3010 (tid_ptr
->time_stamp
< oldest_time
)) {
3011 tid_ptr
->total
-= tid_ptr
->packet_count
[tid_ptr
->head
];
3012 tid_ptr
->packet_count
[tid_ptr
->head
] = 0;
3013 tid_ptr
->time_stamp
+= TID_QUEUE_CELL_SPACING
;
3014 tid_ptr
->queue_count
--;
3016 if (tid_ptr
->head
>= TID_QUEUE_MAX_SIZE
)
3021 index
= (tid_ptr
->head
+ index
) % TID_QUEUE_MAX_SIZE
;
3022 tid_ptr
->packet_count
[index
] = tid_ptr
->packet_count
[index
] + 1;
3023 tid_ptr
->total
= tid_ptr
->total
+ 1;
3025 if ((index
+ 1) > tid_ptr
->queue_count
)
3026 tid_ptr
->queue_count
= index
+ 1;
3028 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3032 #define MMAC_SCHED_MAX_NUMBER_OF_HT_BACK_FLOWS 7
3034 BA_STATUS_FAILURE
= 0,
3035 BA_STATUS_INITIATOR_DELBA
,
3036 BA_STATUS_RECIPIENT_DELBA
,
3037 BA_STATUS_RENEW_ADDBA_REQUEST
,
3042 * iwl4964_tl_ba_avail - Find out if an unused aggregation queue is available
3044 static u8
iwl4964_tl_ba_avail(struct iwl4965_priv
*priv
)
3047 struct iwl4965_lq_mngr
*lq
;
3051 lq
= (struct iwl4965_lq_mngr
*)&(priv
->lq_mngr
);
3053 /* Find out how many agg queues are in use */
3054 for (i
= 0; i
< TID_MAX_LOAD_COUNT
; i
++) {
3056 if ((lq
->agg_ctrl
.granted_ba
& msk
) ||
3057 (lq
->agg_ctrl
.wait_for_agg_status
& msk
))
3061 if (count
< MMAC_SCHED_MAX_NUMBER_OF_HT_BACK_FLOWS
)
3067 static void iwl4965_ba_status(struct iwl4965_priv
*priv
,
3068 u8 tid
, enum HT_STATUS status
);
3070 static int iwl4965_perform_addba(struct iwl4965_priv
*priv
, u8 tid
, u32 length
,
3075 rc
= ieee80211_start_BA_session(priv
->hw
, priv
->bssid
, tid
);
3077 iwl4965_ba_status(priv
, tid
, BA_STATUS_FAILURE
);
3082 static int iwl4965_perform_delba(struct iwl4965_priv
*priv
, u8 tid
)
3086 rc
= ieee80211_stop_BA_session(priv
->hw
, priv
->bssid
, tid
);
3088 iwl4965_ba_status(priv
, tid
, BA_STATUS_FAILURE
);
3093 static void iwl4965_turn_on_agg_for_tid(struct iwl4965_priv
*priv
,
3094 struct iwl4965_lq_mngr
*lq
,
3095 u8 auto_agg
, u8 tid
)
3097 u32 tid_msk
= (1 << tid
);
3098 unsigned long flags
;
3100 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3102 if ((auto_agg) && (!lq->enable_counter)){
3103 lq->agg_ctrl.next_retry = 0;
3104 lq->agg_ctrl.tid_retry = 0;
3105 spin_unlock_irqrestore(&priv->lq_mngr.lock, flags);
3109 if (!(lq
->agg_ctrl
.granted_ba
& tid_msk
) &&
3110 (lq
->agg_ctrl
.requested_ba
& tid_msk
)) {
3111 u8 available_queues
;
3114 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3115 available_queues
= iwl4964_tl_ba_avail(priv
);
3116 load
= iwl4965_tl_get_load(priv
, tid
);
3118 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3119 if (!available_queues
) {
3121 lq
->agg_ctrl
.tid_retry
|= tid_msk
;
3123 lq
->agg_ctrl
.requested_ba
&= ~tid_msk
;
3124 lq
->agg_ctrl
.wait_for_agg_status
&= ~tid_msk
;
3126 } else if ((auto_agg
) &&
3127 ((load
<= lq
->agg_ctrl
.tid_traffic_load_threshold
) ||
3128 ((lq
->agg_ctrl
.wait_for_agg_status
& tid_msk
))))
3129 lq
->agg_ctrl
.tid_retry
|= tid_msk
;
3131 lq
->agg_ctrl
.wait_for_agg_status
|= tid_msk
;
3132 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3133 iwl4965_perform_addba(priv
, tid
, 0x40,
3134 lq
->agg_ctrl
.ba_timeout
);
3135 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3138 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3141 static void iwl4965_turn_on_agg(struct iwl4965_priv
*priv
, u8 tid
)
3143 struct iwl4965_lq_mngr
*lq
;
3144 unsigned long flags
;
3146 lq
= (struct iwl4965_lq_mngr
*)&(priv
->lq_mngr
);
3148 if ((tid
< TID_MAX_LOAD_COUNT
))
3149 iwl4965_turn_on_agg_for_tid(priv
, lq
, lq
->agg_ctrl
.auto_agg
,
3151 else if (tid
== TID_ALL_SPECIFIED
) {
3152 if (lq
->agg_ctrl
.requested_ba
) {
3153 for (tid
= 0; tid
< TID_MAX_LOAD_COUNT
; tid
++)
3154 iwl4965_turn_on_agg_for_tid(priv
, lq
,
3155 lq
->agg_ctrl
.auto_agg
, tid
);
3157 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3158 lq
->agg_ctrl
.tid_retry
= 0;
3159 lq
->agg_ctrl
.next_retry
= 0;
3160 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3166 void iwl4965_turn_off_agg(struct iwl4965_priv
*priv
, u8 tid
)
3169 struct iwl4965_lq_mngr
*lq
;
3170 unsigned long flags
;
3172 lq
= (struct iwl4965_lq_mngr
*)&(priv
->lq_mngr
);
3174 if ((tid
< TID_MAX_LOAD_COUNT
)) {
3176 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3177 lq
->agg_ctrl
.wait_for_agg_status
|= tid_msk
;
3178 lq
->agg_ctrl
.requested_ba
&= ~tid_msk
;
3179 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3180 iwl4965_perform_delba(priv
, tid
);
3181 } else if (tid
== TID_ALL_SPECIFIED
) {
3182 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3183 for (tid
= 0; tid
< TID_MAX_LOAD_COUNT
; tid
++) {
3185 lq
->agg_ctrl
.wait_for_agg_status
|= tid_msk
;
3186 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3187 iwl4965_perform_delba(priv
, tid
);
3188 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3190 lq
->agg_ctrl
.requested_ba
= 0;
3191 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3196 * iwl4965_ba_status - Update driver's link quality mgr with tid's HT status
3198 static void iwl4965_ba_status(struct iwl4965_priv
*priv
,
3199 u8 tid
, enum HT_STATUS status
)
3201 struct iwl4965_lq_mngr
*lq
;
3202 u32 tid_msk
= (1 << tid
);
3203 unsigned long flags
;
3205 lq
= (struct iwl4965_lq_mngr
*)&(priv
->lq_mngr
);
3207 if ((tid
>= TID_MAX_LOAD_COUNT
))
3210 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3212 case BA_STATUS_ACTIVE
:
3213 if (!(lq
->agg_ctrl
.granted_ba
& tid_msk
))
3214 lq
->agg_ctrl
.granted_ba
|= tid_msk
;
3217 if ((lq
->agg_ctrl
.granted_ba
& tid_msk
))
3218 lq
->agg_ctrl
.granted_ba
&= ~tid_msk
;
3222 lq
->agg_ctrl
.wait_for_agg_status
&= ~tid_msk
;
3223 if (status
!= BA_STATUS_ACTIVE
) {
3224 if (lq
->agg_ctrl
.auto_agg
) {
3225 lq
->agg_ctrl
.tid_retry
|= tid_msk
;
3226 lq
->agg_ctrl
.next_retry
=
3227 jiffies
+ msecs_to_jiffies(500);
3229 lq
->agg_ctrl
.requested_ba
&= ~tid_msk
;
3231 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3236 static void iwl4965_bg_agg_work(struct work_struct
*work
)
3238 struct iwl4965_priv
*priv
= container_of(work
, struct iwl4965_priv
,
3244 unsigned long flags
;
3245 struct iwl4965_lq_mngr
*lq
= (struct iwl4965_lq_mngr
*)&(priv
->lq_mngr
);
3247 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3248 retry_tid
= lq
->agg_ctrl
.tid_retry
;
3249 lq
->agg_ctrl
.tid_retry
= 0;
3250 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3252 if (retry_tid
== TID_ALL_SPECIFIED
)
3253 iwl4965_turn_on_agg(priv
, TID_ALL_SPECIFIED
);
3255 for (tid
= 0; tid
< TID_MAX_LOAD_COUNT
; tid
++) {
3256 tid_msk
= (1 << tid
);
3257 if (retry_tid
& tid_msk
)
3258 iwl4965_turn_on_agg(priv
, tid
);
3262 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3263 if (lq
->agg_ctrl
.tid_retry
)
3264 lq
->agg_ctrl
.next_retry
= jiffies
+ msecs_to_jiffies(500);
3265 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3269 /* TODO: move this functionality to rate scaling */
3270 void iwl4965_tl_get_stats(struct iwl4965_priv
*priv
,
3271 struct ieee80211_hdr
*hdr
)
3273 __le16
*qc
= ieee80211_get_qos_ctrl(hdr
);
3276 (priv
->iw_mode
!= IEEE80211_IF_TYPE_IBSS
)) {
3278 tid
= (u8
) (le16_to_cpu(*qc
) & 0xF);
3279 if (tid
< TID_MAX_LOAD_COUNT
)
3280 iwl4965_tl_add_packet(priv
, tid
);
3283 if (priv
->lq_mngr
.agg_ctrl
.next_retry
&&
3284 (time_after(priv
->lq_mngr
.agg_ctrl
.next_retry
, jiffies
))) {
3285 unsigned long flags
;
3287 spin_lock_irqsave(&priv
->lq_mngr
.lock
, flags
);
3288 priv
->lq_mngr
.agg_ctrl
.next_retry
= 0;
3289 spin_unlock_irqrestore(&priv
->lq_mngr
.lock
, flags
);
3290 schedule_work(&priv
->agg_work
);
3294 #endif /*CONFIG_IWL4965_HT_AGG */
3295 #endif /* CONFIG_IWL4965_HT */
3298 * sign_extend - Sign extend a value using specified bit as sign-bit
3300 * Example: sign_extend(9, 3) would return -7 as bit3 of 1001b is 1
3301 * and bit0..2 is 001b which when sign extended to 1111111111111001b is -7.
3303 * @param oper value to sign extend
3304 * @param index 0 based bit index (0<=index<32) to sign bit
3306 static s32
sign_extend(u32 oper
, int index
)
3308 u8 shift
= 31 - index
;
3310 return (s32
)(oper
<< shift
) >> shift
;
3314 * iwl4965_get_temperature - return the calibrated temperature (in Kelvin)
3315 * @statistics: Provides the temperature reading from the uCode
3317 * A return of <0 indicates bogus data in the statistics
3319 int iwl4965_get_temperature(const struct iwl4965_priv
*priv
)
3326 if (test_bit(STATUS_TEMPERATURE
, &priv
->status
) &&
3327 (priv
->statistics
.flag
& STATISTICS_REPLY_FLG_FAT_MODE_MSK
)) {
3328 IWL_DEBUG_TEMP("Running FAT temperature calibration\n");
3329 R1
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r1
[1]);
3330 R2
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r2
[1]);
3331 R3
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r3
[1]);
3332 R4
= le32_to_cpu(priv
->card_alive_init
.therm_r4
[1]);
3334 IWL_DEBUG_TEMP("Running temperature calibration\n");
3335 R1
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r1
[0]);
3336 R2
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r2
[0]);
3337 R3
= (s32
)le32_to_cpu(priv
->card_alive_init
.therm_r3
[0]);
3338 R4
= le32_to_cpu(priv
->card_alive_init
.therm_r4
[0]);
3342 * Temperature is only 23 bits, so sign extend out to 32.
3344 * NOTE If we haven't received a statistics notification yet
3345 * with an updated temperature, use R4 provided to us in the
3346 * "initialize" ALIVE response.
3348 if (!test_bit(STATUS_TEMPERATURE
, &priv
->status
))
3349 vt
= sign_extend(R4
, 23);
3352 le32_to_cpu(priv
->statistics
.general
.temperature
), 23);
3354 IWL_DEBUG_TEMP("Calib values R[1-3]: %d %d %d R4: %d\n",
3358 IWL_ERROR("Calibration conflict R1 == R3\n");
3362 /* Calculate temperature in degrees Kelvin, adjust by 97%.
3363 * Add offset to center the adjustment around 0 degrees Centigrade. */
3364 temperature
= TEMPERATURE_CALIB_A_VAL
* (vt
- R2
);
3365 temperature
/= (R3
- R1
);
3366 temperature
= (temperature
* 97) / 100 +
3367 TEMPERATURE_CALIB_KELVIN_OFFSET
;
3369 IWL_DEBUG_TEMP("Calibrated temperature: %dK, %dC\n", temperature
,
3370 KELVIN_TO_CELSIUS(temperature
));
3375 /* Adjust Txpower only if temperature variance is greater than threshold. */
3376 #define IWL_TEMPERATURE_THRESHOLD 3
3379 * iwl4965_is_temp_calib_needed - determines if new calibration is needed
3381 * If the temperature changed has changed sufficiently, then a recalibration
3384 * Assumes caller will replace priv->last_temperature once calibration
3387 static int iwl4965_is_temp_calib_needed(struct iwl4965_priv
*priv
)
3391 if (!test_bit(STATUS_STATISTICS
, &priv
->status
)) {
3392 IWL_DEBUG_TEMP("Temperature not updated -- no statistics.\n");
3396 temp_diff
= priv
->temperature
- priv
->last_temperature
;
3398 /* get absolute value */
3399 if (temp_diff
< 0) {
3400 IWL_DEBUG_POWER("Getting cooler, delta %d, \n", temp_diff
);
3401 temp_diff
= -temp_diff
;
3402 } else if (temp_diff
== 0)
3403 IWL_DEBUG_POWER("Same temp, \n");
3405 IWL_DEBUG_POWER("Getting warmer, delta %d, \n", temp_diff
);
3407 if (temp_diff
< IWL_TEMPERATURE_THRESHOLD
) {
3408 IWL_DEBUG_POWER("Thermal txpower calib not needed\n");
3412 IWL_DEBUG_POWER("Thermal txpower calib needed\n");
3417 /* Calculate noise level, based on measurements during network silence just
3418 * before arriving beacon. This measurement can be done only if we know
3419 * exactly when to expect beacons, therefore only when we're associated. */
3420 static void iwl4965_rx_calc_noise(struct iwl4965_priv
*priv
)
3422 struct statistics_rx_non_phy
*rx_info
3423 = &(priv
->statistics
.rx
.general
);
3424 int num_active_rx
= 0;
3425 int total_silence
= 0;
3427 le32_to_cpu(rx_info
->beacon_silence_rssi_a
) & IN_BAND_FILTER
;
3429 le32_to_cpu(rx_info
->beacon_silence_rssi_b
) & IN_BAND_FILTER
;
3431 le32_to_cpu(rx_info
->beacon_silence_rssi_c
) & IN_BAND_FILTER
;
3433 if (bcn_silence_a
) {
3434 total_silence
+= bcn_silence_a
;
3437 if (bcn_silence_b
) {
3438 total_silence
+= bcn_silence_b
;
3441 if (bcn_silence_c
) {
3442 total_silence
+= bcn_silence_c
;
3446 /* Average among active antennas */
3448 priv
->last_rx_noise
= (total_silence
/ num_active_rx
) - 107;
3450 priv
->last_rx_noise
= IWL_NOISE_MEAS_NOT_AVAILABLE
;
3452 IWL_DEBUG_CALIB("inband silence a %u, b %u, c %u, dBm %d\n",
3453 bcn_silence_a
, bcn_silence_b
, bcn_silence_c
,
3454 priv
->last_rx_noise
);
3457 void iwl4965_hw_rx_statistics(struct iwl4965_priv
*priv
, struct iwl4965_rx_mem_buffer
*rxb
)
3459 struct iwl4965_rx_packet
*pkt
= (void *)rxb
->skb
->data
;
3463 IWL_DEBUG_RX("Statistics notification received (%d vs %d).\n",
3464 (int)sizeof(priv
->statistics
), pkt
->len
);
3466 change
= ((priv
->statistics
.general
.temperature
!=
3467 pkt
->u
.stats
.general
.temperature
) ||
3468 ((priv
->statistics
.flag
&
3469 STATISTICS_REPLY_FLG_FAT_MODE_MSK
) !=
3470 (pkt
->u
.stats
.flag
& STATISTICS_REPLY_FLG_FAT_MODE_MSK
)));
3472 memcpy(&priv
->statistics
, &pkt
->u
.stats
, sizeof(priv
->statistics
));
3474 set_bit(STATUS_STATISTICS
, &priv
->status
);
3476 /* Reschedule the statistics timer to occur in
3477 * REG_RECALIB_PERIOD seconds to ensure we get a
3478 * thermal update even if the uCode doesn't give
3480 mod_timer(&priv
->statistics_periodic
, jiffies
+
3481 msecs_to_jiffies(REG_RECALIB_PERIOD
* 1000));
3483 if (unlikely(!test_bit(STATUS_SCANNING
, &priv
->status
)) &&
3484 (pkt
->hdr
.cmd
== STATISTICS_NOTIFICATION
)) {
3485 iwl4965_rx_calc_noise(priv
);
3486 #ifdef CONFIG_IWL4965_SENSITIVITY
3487 queue_work(priv
->workqueue
, &priv
->sensitivity_work
);
3491 /* If the hardware hasn't reported a change in
3492 * temperature then don't bother computing a
3493 * calibrated temperature value */
3497 temp
= iwl4965_get_temperature(priv
);
3501 if (priv
->temperature
!= temp
) {
3502 if (priv
->temperature
)
3503 IWL_DEBUG_TEMP("Temperature changed "
3504 "from %dC to %dC\n",
3505 KELVIN_TO_CELSIUS(priv
->temperature
),
3506 KELVIN_TO_CELSIUS(temp
));
3508 IWL_DEBUG_TEMP("Temperature "
3509 "initialized to %dC\n",
3510 KELVIN_TO_CELSIUS(temp
));
3513 priv
->temperature
= temp
;
3514 set_bit(STATUS_TEMPERATURE
, &priv
->status
);
3516 if (unlikely(!test_bit(STATUS_SCANNING
, &priv
->status
)) &&
3517 iwl4965_is_temp_calib_needed(priv
))
3518 queue_work(priv
->workqueue
, &priv
->txpower_work
);
3521 static void iwl4965_add_radiotap(struct iwl4965_priv
*priv
,
3522 struct sk_buff
*skb
,
3523 struct iwl4965_rx_phy_res
*rx_start
,
3524 struct ieee80211_rx_status
*stats
,
3527 s8 signal
= stats
->ssi
;
3529 int rate
= stats
->rate
;
3530 u64 tsf
= stats
->mactime
;
3531 __le16 phy_flags_hw
= rx_start
->phy_flags
;
3532 struct iwl4965_rt_rx_hdr
{
3533 struct ieee80211_radiotap_header rt_hdr
;
3534 __le64 rt_tsf
; /* TSF */
3535 u8 rt_flags
; /* radiotap packet flags */
3536 u8 rt_rate
; /* rate in 500kb/s */
3537 __le16 rt_channelMHz
; /* channel in MHz */
3538 __le16 rt_chbitmask
; /* channel bitfield */
3539 s8 rt_dbmsignal
; /* signal in dBm, kluged to signed */
3541 u8 rt_antenna
; /* antenna number */
3542 } __attribute__ ((packed
)) *iwl4965_rt
;
3544 /* TODO: We won't have enough headroom for HT frames. Fix it later. */
3545 if (skb_headroom(skb
) < sizeof(*iwl4965_rt
)) {
3546 if (net_ratelimit())
3547 printk(KERN_ERR
"not enough headroom [%d] for "
3548 "radiotap head [%zd]\n",
3549 skb_headroom(skb
), sizeof(*iwl4965_rt
));
3553 /* put radiotap header in front of 802.11 header and data */
3554 iwl4965_rt
= (void *)skb_push(skb
, sizeof(*iwl4965_rt
));
3556 /* initialise radiotap header */
3557 iwl4965_rt
->rt_hdr
.it_version
= PKTHDR_RADIOTAP_VERSION
;
3558 iwl4965_rt
->rt_hdr
.it_pad
= 0;
3560 /* total header + data */
3561 put_unaligned(cpu_to_le16(sizeof(*iwl4965_rt
)),
3562 &iwl4965_rt
->rt_hdr
.it_len
);
3564 /* Indicate all the fields we add to the radiotap header */
3565 put_unaligned(cpu_to_le32((1 << IEEE80211_RADIOTAP_TSFT
) |
3566 (1 << IEEE80211_RADIOTAP_FLAGS
) |
3567 (1 << IEEE80211_RADIOTAP_RATE
) |
3568 (1 << IEEE80211_RADIOTAP_CHANNEL
) |
3569 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL
) |
3570 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE
) |
3571 (1 << IEEE80211_RADIOTAP_ANTENNA
)),
3572 &iwl4965_rt
->rt_hdr
.it_present
);
3574 /* Zero the flags, we'll add to them as we go */
3575 iwl4965_rt
->rt_flags
= 0;
3577 put_unaligned(cpu_to_le64(tsf
), &iwl4965_rt
->rt_tsf
);
3579 iwl4965_rt
->rt_dbmsignal
= signal
;
3580 iwl4965_rt
->rt_dbmnoise
= noise
;
3582 /* Convert the channel frequency and set the flags */
3583 put_unaligned(cpu_to_le16(stats
->freq
), &iwl4965_rt
->rt_channelMHz
);
3584 if (!(phy_flags_hw
& RX_RES_PHY_FLAGS_BAND_24_MSK
))
3585 put_unaligned(cpu_to_le16(IEEE80211_CHAN_OFDM
|
3586 IEEE80211_CHAN_5GHZ
),
3587 &iwl4965_rt
->rt_chbitmask
);
3588 else if (phy_flags_hw
& RX_RES_PHY_FLAGS_MOD_CCK_MSK
)
3589 put_unaligned(cpu_to_le16(IEEE80211_CHAN_CCK
|
3590 IEEE80211_CHAN_2GHZ
),
3591 &iwl4965_rt
->rt_chbitmask
);
3593 put_unaligned(cpu_to_le16(IEEE80211_CHAN_OFDM
|
3594 IEEE80211_CHAN_2GHZ
),
3595 &iwl4965_rt
->rt_chbitmask
);
3597 rate
= iwl4965_rate_index_from_plcp(rate
);
3599 iwl4965_rt
->rt_rate
= 0;
3601 iwl4965_rt
->rt_rate
= iwl4965_rates
[rate
].ieee
;
3606 * It seems that the antenna field in the phy flags value
3607 * is actually a bitfield. This is undefined by radiotap,
3608 * it wants an actual antenna number but I always get "7"
3609 * for most legacy frames I receive indicating that the
3610 * same frame was received on all three RX chains.
3612 * I think this field should be removed in favour of a
3613 * new 802.11n radiotap field "RX chains" that is defined
3616 iwl4965_rt
->rt_antenna
=
3617 le16_to_cpu(phy_flags_hw
& RX_RES_PHY_FLAGS_ANTENNA_MSK
) >> 4;
3619 /* set the preamble flag if appropriate */
3620 if (phy_flags_hw
& RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK
)
3621 iwl4965_rt
->rt_flags
|= IEEE80211_RADIOTAP_F_SHORTPRE
;
3623 stats
->flag
|= RX_FLAG_RADIOTAP
;
3626 static void iwl4965_handle_data_packet(struct iwl4965_priv
*priv
, int is_data
,
3628 struct iwl4965_rx_mem_buffer
*rxb
,
3629 struct ieee80211_rx_status
*stats
)
3631 struct iwl4965_rx_packet
*pkt
= (struct iwl4965_rx_packet
*)rxb
->skb
->data
;
3632 struct iwl4965_rx_phy_res
*rx_start
= (include_phy
) ?
3633 (struct iwl4965_rx_phy_res
*)&(pkt
->u
.raw
[0]) : NULL
;
3634 struct ieee80211_hdr
*hdr
;
3637 unsigned int skblen
;
3640 if (!include_phy
&& priv
->last_phy_res
[0])
3641 rx_start
= (struct iwl4965_rx_phy_res
*)&priv
->last_phy_res
[1];
3644 IWL_ERROR("MPDU frame without a PHY data\n");
3648 hdr
= (struct ieee80211_hdr
*)((u8
*) & rx_start
[1] +
3649 rx_start
->cfg_phy_cnt
);
3651 len
= le16_to_cpu(rx_start
->byte_count
);
3653 rx_end
= (__le32
*) ((u8
*) & pkt
->u
.raw
[0] +
3654 sizeof(struct iwl4965_rx_phy_res
) +
3655 rx_start
->cfg_phy_cnt
+ len
);
3658 struct iwl4965_rx_mpdu_res_start
*amsdu
=
3659 (struct iwl4965_rx_mpdu_res_start
*)pkt
->u
.raw
;
3661 hdr
= (struct ieee80211_hdr
*)(pkt
->u
.raw
+
3662 sizeof(struct iwl4965_rx_mpdu_res_start
));
3663 len
= le16_to_cpu(amsdu
->byte_count
);
3664 rx_start
->byte_count
= amsdu
->byte_count
;
3665 rx_end
= (__le32
*) (((u8
*) hdr
) + len
);
3667 if (len
> priv
->hw_setting
.max_pkt_size
|| len
< 16) {
3668 IWL_WARNING("byte count out of range [16,4K] : %d\n", len
);
3672 ampdu_status
= le32_to_cpu(*rx_end
);
3673 skblen
= ((u8
*) rx_end
- (u8
*) & pkt
->u
.raw
[0]) + sizeof(u32
);
3675 /* start from MAC */
3676 skb_reserve(rxb
->skb
, (void *)hdr
- (void *)pkt
);
3677 skb_put(rxb
->skb
, len
); /* end where data ends */
3679 /* We only process data packets if the interface is open */
3680 if (unlikely(!priv
->is_open
)) {
3681 IWL_DEBUG_DROP_LIMIT
3682 ("Dropping packet while interface is not open.\n");
3687 hdr
= (struct ieee80211_hdr
*)rxb
->skb
->data
;
3689 if (iwl4965_param_hwcrypto
)
3690 iwl4965_set_decrypted_flag(priv
, rxb
->skb
, ampdu_status
, stats
);
3692 if (priv
->add_radiotap
)
3693 iwl4965_add_radiotap(priv
, rxb
->skb
, rx_start
, stats
, ampdu_status
);
3695 ieee80211_rx_irqsafe(priv
->hw
, rxb
->skb
, stats
);
3696 priv
->alloc_rxb_skb
--;
3699 priv
->led_packets
+= len
;
3700 iwl4965_setup_activity_timer(priv
);
3704 /* Calc max signal level (dBm) among 3 possible receivers */
3705 static int iwl4965_calc_rssi(struct iwl4965_rx_phy_res
*rx_resp
)
3707 /* data from PHY/DSP regarding signal strength, etc.,
3708 * contents are always there, not configurable by host. */
3709 struct iwl4965_rx_non_cfg_phy
*ncphy
=
3710 (struct iwl4965_rx_non_cfg_phy
*)rx_resp
->non_cfg_phy
;
3711 u32 agc
= (le16_to_cpu(ncphy
->agc_info
) & IWL_AGC_DB_MASK
)
3714 u32 valid_antennae
=
3715 (le16_to_cpu(rx_resp
->phy_flags
) & RX_PHY_FLAGS_ANTENNAE_MASK
)
3716 >> RX_PHY_FLAGS_ANTENNAE_OFFSET
;
3720 /* Find max rssi among 3 possible receivers.
3721 * These values are measured by the digital signal processor (DSP).
3722 * They should stay fairly constant even as the signal strength varies,
3723 * if the radio's automatic gain control (AGC) is working right.
3724 * AGC value (see below) will provide the "interesting" info. */
3725 for (i
= 0; i
< 3; i
++)
3726 if (valid_antennae
& (1 << i
))
3727 max_rssi
= max(ncphy
->rssi_info
[i
<< 1], max_rssi
);
3729 IWL_DEBUG_STATS("Rssi In A %d B %d C %d Max %d AGC dB %d\n",
3730 ncphy
->rssi_info
[0], ncphy
->rssi_info
[2], ncphy
->rssi_info
[4],
3733 /* dBm = max_rssi dB - agc dB - constant.
3734 * Higher AGC (higher radio gain) means lower signal. */
3735 return (max_rssi
- agc
- IWL_RSSI_OFFSET
);
3738 #ifdef CONFIG_IWL4965_HT
3740 /* Parsed Information Elements */
3741 struct ieee802_11_elems
{
3751 u8 ht_cap_param_len
;
3753 u8 ht_extra_param_len
;
3756 static int parse_elems(u8
*start
, size_t len
, struct ieee802_11_elems
*elems
)
3762 memset(elems
, 0, sizeof(*elems
));
3775 case WLAN_EID_DS_PARAMS
:
3776 elems
->ds_params
= pos
;
3777 elems
->ds_params_len
= elen
;
3781 elems
->tim_len
= elen
;
3783 case WLAN_EID_IBSS_PARAMS
:
3784 elems
->ibss_params
= pos
;
3785 elems
->ibss_params_len
= elen
;
3787 case WLAN_EID_ERP_INFO
:
3788 elems
->erp_info
= pos
;
3789 elems
->erp_info_len
= elen
;
3791 case WLAN_EID_HT_CAPABILITY
:
3792 elems
->ht_cap_param
= pos
;
3793 elems
->ht_cap_param_len
= elen
;
3795 case WLAN_EID_HT_EXTRA_INFO
:
3796 elems
->ht_extra_param
= pos
;
3797 elems
->ht_extra_param_len
= elen
;
3811 void iwl4965_init_ht_hw_capab(struct ieee80211_ht_info
*ht_info
, int mode
)
3814 memset(ht_info
->supp_mcs_set
, 0, 16);
3816 ht_info
->ht_supported
= 1;
3818 if (mode
== MODE_IEEE80211A
) {
3819 ht_info
->cap
|= (u16
)IEEE80211_HT_CAP_SUP_WIDTH
;
3820 ht_info
->cap
|= (u16
)IEEE80211_HT_CAP_SGI_40
;
3821 ht_info
->supp_mcs_set
[4] = 0x01;
3823 ht_info
->cap
|= (u16
)IEEE80211_HT_CAP_GRN_FLD
;
3824 ht_info
->cap
|= (u16
)IEEE80211_HT_CAP_SGI_20
;
3825 ht_info
->cap
|= (u16
)(IEEE80211_HT_CAP_MIMO_PS
&
3826 (IWL_MIMO_PS_NONE
<< 2));
3827 if (iwl4965_param_amsdu_size_8K
) {
3828 printk(KERN_DEBUG
"iwl4965 in A-MSDU 8K support mode\n");
3829 ht_info
->cap
|= (u16
)IEEE80211_HT_CAP_MAX_AMSDU
;
3832 ht_info
->ampdu_factor
= CFG_HT_RX_AMPDU_FACTOR_DEF
;
3833 ht_info
->ampdu_density
= CFG_HT_MPDU_DENSITY_DEF
;
3835 ht_info
->supp_mcs_set
[0] = 0xFF;
3836 ht_info
->supp_mcs_set
[1] = 0xFF;
3838 #endif /* CONFIG_IWL4965_HT */
3840 static void iwl4965_sta_modify_ps_wake(struct iwl4965_priv
*priv
, int sta_id
)
3842 unsigned long flags
;
3844 spin_lock_irqsave(&priv
->sta_lock
, flags
);
3845 priv
->stations
[sta_id
].sta
.station_flags
&= ~STA_FLG_PWR_SAVE_MSK
;
3846 priv
->stations
[sta_id
].sta
.station_flags_msk
= STA_FLG_PWR_SAVE_MSK
;
3847 priv
->stations
[sta_id
].sta
.sta
.modify_mask
= 0;
3848 priv
->stations
[sta_id
].sta
.mode
= STA_CONTROL_MODIFY_MSK
;
3849 spin_unlock_irqrestore(&priv
->sta_lock
, flags
);
3851 iwl4965_send_add_station(priv
, &priv
->stations
[sta_id
].sta
, CMD_ASYNC
);
3854 static void iwl4965_update_ps_mode(struct iwl4965_priv
*priv
, u16 ps_bit
, u8
*addr
)
3856 /* FIXME: need locking over ps_status ??? */
3857 u8 sta_id
= iwl4965_hw_find_station(priv
, addr
);
3859 if (sta_id
!= IWL_INVALID_STATION
) {
3860 u8 sta_awake
= priv
->stations
[sta_id
].
3861 ps_status
== STA_PS_STATUS_WAKE
;
3863 if (sta_awake
&& ps_bit
)
3864 priv
->stations
[sta_id
].ps_status
= STA_PS_STATUS_SLEEP
;
3865 else if (!sta_awake
&& !ps_bit
) {
3866 iwl4965_sta_modify_ps_wake(priv
, sta_id
);
3867 priv
->stations
[sta_id
].ps_status
= STA_PS_STATUS_WAKE
;
3872 #define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6)
3874 /* Called for REPLY_4965_RX (legacy ABG frames), or
3875 * REPLY_RX_MPDU_CMD (HT high-throughput N frames). */
3876 static void iwl4965_rx_reply_rx(struct iwl4965_priv
*priv
,
3877 struct iwl4965_rx_mem_buffer
*rxb
)
3879 struct iwl4965_rx_packet
*pkt
= (void *)rxb
->skb
->data
;
3880 /* Use phy data (Rx signal strength, etc.) contained within
3881 * this rx packet for legacy frames,
3882 * or phy data cached from REPLY_RX_PHY_CMD for HT frames. */
3883 int include_phy
= (pkt
->hdr
.cmd
== REPLY_4965_RX
);
3884 struct iwl4965_rx_phy_res
*rx_start
= (include_phy
) ?
3885 (struct iwl4965_rx_phy_res
*)&(pkt
->u
.raw
[0]) :
3886 (struct iwl4965_rx_phy_res
*)&priv
->last_phy_res
[1];
3888 unsigned int len
= 0;
3889 struct ieee80211_hdr
*header
;
3891 struct ieee80211_rx_status stats
= {
3892 .mactime
= le64_to_cpu(rx_start
->timestamp
),
3893 .channel
= le16_to_cpu(rx_start
->channel
),
3895 (rx_start
->phy_flags
& RX_RES_PHY_FLAGS_BAND_24_MSK
) ?
3896 MODE_IEEE80211G
: MODE_IEEE80211A
,
3898 .rate
= iwl4965_hw_get_rate(rx_start
->rate_n_flags
),
3903 if ((unlikely(rx_start
->cfg_phy_cnt
> 20))) {
3905 ("dsp size out of range [0,20]: "
3906 "%d/n", rx_start
->cfg_phy_cnt
);
3910 if (priv
->last_phy_res
[0])
3911 rx_start
= (struct iwl4965_rx_phy_res
*)
3912 &priv
->last_phy_res
[1];
3918 IWL_ERROR("MPDU frame without a PHY data\n");
3923 header
= (struct ieee80211_hdr
*)((u8
*) & rx_start
[1]
3924 + rx_start
->cfg_phy_cnt
);
3926 len
= le16_to_cpu(rx_start
->byte_count
);
3927 rx_end
= (__le32
*) (pkt
->u
.raw
+ rx_start
->cfg_phy_cnt
+
3928 sizeof(struct iwl4965_rx_phy_res
) + len
);
3930 struct iwl4965_rx_mpdu_res_start
*amsdu
=
3931 (struct iwl4965_rx_mpdu_res_start
*)pkt
->u
.raw
;
3933 header
= (void *)(pkt
->u
.raw
+
3934 sizeof(struct iwl4965_rx_mpdu_res_start
));
3935 len
= le16_to_cpu(amsdu
->byte_count
);
3936 rx_end
= (__le32
*) (pkt
->u
.raw
+
3937 sizeof(struct iwl4965_rx_mpdu_res_start
) + len
);
3940 if (!(*rx_end
& RX_RES_STATUS_NO_CRC32_ERROR
) ||
3941 !(*rx_end
& RX_RES_STATUS_NO_RXE_OVERFLOW
)) {
3942 IWL_DEBUG_RX("Bad CRC or FIFO: 0x%08X.\n",
3943 le32_to_cpu(*rx_end
));
3947 priv
->ucode_beacon_time
= le32_to_cpu(rx_start
->beacon_time_stamp
);
3949 stats
.freq
= ieee80211chan2mhz(stats
.channel
);
3951 /* Find max signal strength (dBm) among 3 antenna/receiver chains */
3952 stats
.ssi
= iwl4965_calc_rssi(rx_start
);
3954 /* Meaningful noise values are available only from beacon statistics,
3955 * which are gathered only when associated, and indicate noise
3956 * only for the associated network channel ...
3957 * Ignore these noise values while scanning (other channels) */
3958 if (iwl4965_is_associated(priv
) &&
3959 !test_bit(STATUS_SCANNING
, &priv
->status
)) {
3960 stats
.noise
= priv
->last_rx_noise
;
3961 stats
.signal
= iwl4965_calc_sig_qual(stats
.ssi
, stats
.noise
);
3963 stats
.noise
= IWL_NOISE_MEAS_NOT_AVAILABLE
;
3964 stats
.signal
= iwl4965_calc_sig_qual(stats
.ssi
, 0);
3967 /* Reset beacon noise level if not associated. */
3968 if (!iwl4965_is_associated(priv
))
3969 priv
->last_rx_noise
= IWL_NOISE_MEAS_NOT_AVAILABLE
;
3971 #ifdef CONFIG_IWL4965_DEBUG
3972 /* TODO: Parts of iwl4965_report_frame are broken for 4965 */
3973 if (iwl4965_debug_level
& (IWL_DL_RX
))
3974 /* Set "1" to report good data frames in groups of 100 */
3975 iwl4965_report_frame(priv
, pkt
, header
, 1);
3977 if (iwl4965_debug_level
& (IWL_DL_RX
| IWL_DL_STATS
))
3978 IWL_DEBUG_RX("Rssi %d, noise %d, qual %d, TSF %lu\n",
3979 stats
.ssi
, stats
.noise
, stats
.signal
,
3980 (long unsigned int)le64_to_cpu(rx_start
->timestamp
));
3983 network_packet
= iwl4965_is_network_packet(priv
, header
);
3984 if (network_packet
) {
3985 priv
->last_rx_rssi
= stats
.ssi
;
3986 priv
->last_beacon_time
= priv
->ucode_beacon_time
;
3987 priv
->last_tsf
= le64_to_cpu(rx_start
->timestamp
);
3990 fc
= le16_to_cpu(header
->frame_control
);
3991 switch (fc
& IEEE80211_FCTL_FTYPE
) {
3992 case IEEE80211_FTYPE_MGMT
:
3994 if (priv
->iw_mode
== IEEE80211_IF_TYPE_AP
)
3995 iwl4965_update_ps_mode(priv
, fc
& IEEE80211_FCTL_PM
,
3997 switch (fc
& IEEE80211_FCTL_STYPE
) {
3998 case IEEE80211_STYPE_PROBE_RESP
:
3999 case IEEE80211_STYPE_BEACON
:
4000 if ((priv
->iw_mode
== IEEE80211_IF_TYPE_STA
&&
4001 !compare_ether_addr(header
->addr2
, priv
->bssid
)) ||
4002 (priv
->iw_mode
== IEEE80211_IF_TYPE_IBSS
&&
4003 !compare_ether_addr(header
->addr3
, priv
->bssid
))) {
4004 struct ieee80211_mgmt
*mgmt
=
4005 (struct ieee80211_mgmt
*)header
;
4007 le64_to_cpu(mgmt
->u
.beacon
.timestamp
);
4009 priv
->timestamp0
= timestamp
& 0xFFFFFFFF;
4011 (timestamp
>> 32) & 0xFFFFFFFF;
4012 priv
->beacon_int
= le16_to_cpu(
4013 mgmt
->u
.beacon
.beacon_int
);
4014 if (priv
->call_post_assoc_from_beacon
&&
4015 (priv
->iw_mode
== IEEE80211_IF_TYPE_STA
)) {
4016 priv
->call_post_assoc_from_beacon
= 0;
4017 queue_work(priv
->workqueue
,
4018 &priv
->post_associate
.work
);
4023 case IEEE80211_STYPE_ACTION
:
4027 * TODO: Use the new callback function from
4028 * mac80211 instead of sniffing these packets.
4030 case IEEE80211_STYPE_ASSOC_RESP
:
4031 case IEEE80211_STYPE_REASSOC_RESP
:
4032 if (network_packet
) {
4033 #ifdef CONFIG_IWL4965_HT
4035 struct ieee802_11_elems elems
;
4036 #endif /*CONFIG_IWL4965_HT */
4037 struct ieee80211_mgmt
*mgnt
=
4038 (struct ieee80211_mgmt
*)header
;
4040 /* We have just associated, give some
4041 * time for the 4-way handshake if
4042 * any. Don't start scan too early. */
4043 priv
->next_scan_jiffies
= jiffies
+
4044 IWL_DELAY_NEXT_SCAN_AFTER_ASSOC
;
4046 priv
->assoc_id
= (~((1 << 15) | (1 << 14))
4047 & le16_to_cpu(mgnt
->u
.assoc_resp
.aid
));
4048 priv
->assoc_capability
=
4050 mgnt
->u
.assoc_resp
.capab_info
);
4051 #ifdef CONFIG_IWL4965_HT
4052 pos
= mgnt
->u
.assoc_resp
.variable
;
4053 if (!parse_elems(pos
,
4054 len
- (pos
- (u8
*) mgnt
),
4056 if (elems
.ht_extra_param
&&
4060 #endif /*CONFIG_IWL4965_HT */
4061 /* assoc_id is 0 no association */
4062 if (!priv
->assoc_id
)
4064 if (priv
->beacon_int
)
4065 queue_work(priv
->workqueue
,
4066 &priv
->post_associate
.work
);
4068 priv
->call_post_assoc_from_beacon
= 1;
4073 case IEEE80211_STYPE_PROBE_REQ
:
4074 if ((priv
->iw_mode
== IEEE80211_IF_TYPE_IBSS
) &&
4075 !iwl4965_is_associated(priv
)) {
4076 DECLARE_MAC_BUF(mac1
);
4077 DECLARE_MAC_BUF(mac2
);
4078 DECLARE_MAC_BUF(mac3
);
4080 IWL_DEBUG_DROP("Dropping (non network): "
4082 print_mac(mac1
, header
->addr1
),
4083 print_mac(mac2
, header
->addr2
),
4084 print_mac(mac3
, header
->addr3
));
4088 iwl4965_handle_data_packet(priv
, 0, include_phy
, rxb
, &stats
);
4091 case IEEE80211_FTYPE_CTL
:
4092 #ifdef CONFIG_IWL4965_HT
4093 switch (fc
& IEEE80211_FCTL_STYPE
) {
4094 case IEEE80211_STYPE_BACK_REQ
:
4095 IWL_DEBUG_HT("IEEE80211_STYPE_BACK_REQ arrived\n");
4096 iwl4965_handle_data_packet(priv
, 0, include_phy
,
4105 case IEEE80211_FTYPE_DATA
: {
4106 DECLARE_MAC_BUF(mac1
);
4107 DECLARE_MAC_BUF(mac2
);
4108 DECLARE_MAC_BUF(mac3
);
4110 if (priv
->iw_mode
== IEEE80211_IF_TYPE_AP
)
4111 iwl4965_update_ps_mode(priv
, fc
& IEEE80211_FCTL_PM
,
4114 if (unlikely(!network_packet
))
4115 IWL_DEBUG_DROP("Dropping (non network): "
4117 print_mac(mac1
, header
->addr1
),
4118 print_mac(mac2
, header
->addr2
),
4119 print_mac(mac3
, header
->addr3
));
4120 else if (unlikely(iwl4965_is_duplicate_packet(priv
, header
)))
4121 IWL_DEBUG_DROP("Dropping (dup): %s, %s, %s\n",
4122 print_mac(mac1
, header
->addr1
),
4123 print_mac(mac2
, header
->addr2
),
4124 print_mac(mac3
, header
->addr3
));
4126 iwl4965_handle_data_packet(priv
, 1, include_phy
, rxb
,
4136 /* Cache phy data (Rx signal strength, etc) for HT frame (REPLY_RX_PHY_CMD).
4137 * This will be used later in iwl4965_rx_reply_rx() for REPLY_RX_MPDU_CMD. */
4138 static void iwl4965_rx_reply_rx_phy(struct iwl4965_priv
*priv
,
4139 struct iwl4965_rx_mem_buffer
*rxb
)
4141 struct iwl4965_rx_packet
*pkt
= (void *)rxb
->skb
->data
;
4142 priv
->last_phy_res
[0] = 1;
4143 memcpy(&priv
->last_phy_res
[1], &(pkt
->u
.raw
[0]),
4144 sizeof(struct iwl4965_rx_phy_res
));
4147 static void iwl4965_rx_missed_beacon_notif(struct iwl4965_priv
*priv
,
4148 struct iwl4965_rx_mem_buffer
*rxb
)
4151 #ifdef CONFIG_IWL4965_SENSITIVITY
4152 struct iwl4965_rx_packet
*pkt
= (void *)rxb
->skb
->data
;
4153 struct iwl4965_missed_beacon_notif
*missed_beacon
;
4155 missed_beacon
= &pkt
->u
.missed_beacon
;
4156 if (le32_to_cpu(missed_beacon
->consequtive_missed_beacons
) > 5) {
4157 IWL_DEBUG_CALIB("missed bcn cnsq %d totl %d rcd %d expctd %d\n",
4158 le32_to_cpu(missed_beacon
->consequtive_missed_beacons
),
4159 le32_to_cpu(missed_beacon
->total_missed_becons
),
4160 le32_to_cpu(missed_beacon
->num_recvd_beacons
),
4161 le32_to_cpu(missed_beacon
->num_expected_beacons
));
4162 priv
->sensitivity_data
.state
= IWL_SENS_CALIB_NEED_REINIT
;
4163 if (unlikely(!test_bit(STATUS_SCANNING
, &priv
->status
)))
4164 queue_work(priv
->workqueue
, &priv
->sensitivity_work
);
4166 #endif /*CONFIG_IWL4965_SENSITIVITY*/
4169 #ifdef CONFIG_IWL4965_HT
4170 #ifdef CONFIG_IWL4965_HT_AGG
4173 * iwl4965_set_tx_status - Update driver's record of one Tx frame's status
4175 * This will get sent to mac80211.
4177 static void iwl4965_set_tx_status(struct iwl4965_priv
*priv
, int txq_id
, int idx
,
4178 u32 status
, u32 retry_count
, u32 rate
)
4180 struct ieee80211_tx_status
*tx_status
=
4181 &(priv
->txq
[txq_id
].txb
[idx
].status
);
4183 tx_status
->flags
= status
? IEEE80211_TX_STATUS_ACK
: 0;
4184 tx_status
->retry_count
+= retry_count
;
4185 tx_status
->control
.tx_rate
= rate
;
4190 * iwl4965_sta_modify_enable_tid_tx - Enable Tx for this TID in station table
4192 static void iwl4965_sta_modify_enable_tid_tx(struct iwl4965_priv
*priv
,
4193 int sta_id
, int tid
)
4195 unsigned long flags
;
4197 /* Remove "disable" flag, to enable Tx for this TID */
4198 spin_lock_irqsave(&priv
->sta_lock
, flags
);
4199 priv
->stations
[sta_id
].sta
.sta
.modify_mask
= STA_MODIFY_TID_DISABLE_TX
;
4200 priv
->stations
[sta_id
].sta
.tid_disable_tx
&= cpu_to_le16(~(1 << tid
));
4201 priv
->stations
[sta_id
].sta
.mode
= STA_CONTROL_MODIFY_MSK
;
4202 spin_unlock_irqrestore(&priv
->sta_lock
, flags
);
4204 iwl4965_send_add_station(priv
, &priv
->stations
[sta_id
].sta
, CMD_ASYNC
);
4209 * iwl4965_tx_status_reply_compressed_ba - Update tx status from block-ack
4211 * Go through block-ack's bitmap of ACK'd frames, update driver's record of
4212 * ACK vs. not. This gets sent to mac80211, then to rate scaling algo.
4214 static int iwl4965_tx_status_reply_compressed_ba(struct iwl4965_priv
*priv
,
4215 struct iwl4965_ht_agg
*agg
,
4216 struct iwl4965_compressed_ba_resp
*
4221 u16 ba_seq_ctl
= le16_to_cpu(ba_resp
->ba_seq_ctl
);
4222 u32 bitmap0
, bitmap1
;
4223 u32 resp_bitmap0
= le32_to_cpu(ba_resp
->ba_bitmap0
);
4224 u32 resp_bitmap1
= le32_to_cpu(ba_resp
->ba_bitmap1
);
4226 if (unlikely(!agg
->wait_for_ba
)) {
4227 IWL_ERROR("Received BA when not expected\n");
4231 /* Mark that the expected block-ack response arrived */
4232 agg
->wait_for_ba
= 0;
4233 IWL_DEBUG_TX_REPLY("BA %d %d\n", agg
->start_idx
, ba_resp
->ba_seq_ctl
);
4235 /* Calculate shift to align block-ack bits with our Tx window bits */
4236 sh
= agg
->start_idx
- SEQ_TO_INDEX(ba_seq_ctl
>> 4);
4237 if (sh
< 0) /* tbw something is wrong with indices */
4240 /* don't use 64-bit values for now */
4241 bitmap0
= resp_bitmap0
>> sh
;
4242 bitmap1
= resp_bitmap1
>> sh
;
4243 bitmap0
|= (resp_bitmap1
& ((1 << sh
) | ((1 << sh
) - 1))) << (32 - sh
);
4245 if (agg
->frame_count
> (64 - sh
)) {
4246 IWL_DEBUG_TX_REPLY("more frames than bitmap size");
4250 /* check for success or failure according to the
4251 * transmitted bitmap and block-ack bitmap */
4252 bitmap0
&= agg
->bitmap0
;
4253 bitmap1
&= agg
->bitmap1
;
4255 /* For each frame attempted in aggregation,
4256 * update driver's record of tx frame's status. */
4257 for (i
= 0; i
< agg
->frame_count
; i
++) {
4258 int idx
= (agg
->start_idx
+ i
) & 0xff;
4259 ack
= bitmap0
& (1 << i
);
4260 IWL_DEBUG_TX_REPLY("%s ON i=%d idx=%d raw=%d\n",
4261 ack
? "ACK":"NACK", i
, idx
, agg
->start_idx
+ i
);
4262 iwl4965_set_tx_status(priv
, agg
->txq_id
, idx
, ack
, 0,
4267 IWL_DEBUG_TX_REPLY("Bitmap %x%x\n", bitmap0
, bitmap1
);
4273 * iwl4965_queue_dec_wrap - Decrement queue index, wrap back to end if needed
4274 * @index -- current index
4275 * @n_bd -- total number of entries in queue (s/b power of 2)
4277 static inline int iwl4965_queue_dec_wrap(int index
, int n_bd
)
4279 return (index
== 0) ? n_bd
- 1 : index
- 1;
4283 * iwl4965_rx_reply_compressed_ba - Handler for REPLY_COMPRESSED_BA
4285 * Handles block-acknowledge notification from device, which reports success
4286 * of frames sent via aggregation.
4288 static void iwl4965_rx_reply_compressed_ba(struct iwl4965_priv
*priv
,
4289 struct iwl4965_rx_mem_buffer
*rxb
)
4291 struct iwl4965_rx_packet
*pkt
= (void *)rxb
->skb
->data
;
4292 struct iwl4965_compressed_ba_resp
*ba_resp
= &pkt
->u
.compressed_ba
;
4294 struct iwl4965_tx_queue
*txq
= NULL
;
4295 struct iwl4965_ht_agg
*agg
;
4297 /* "flow" corresponds to Tx queue */
4298 u16 ba_resp_scd_flow
= le16_to_cpu(ba_resp
->scd_flow
);
4300 /* "ssn" is start of block-ack Tx window, corresponds to index
4301 * (in Tx queue's circular buffer) of first TFD/frame in window */
4302 u16 ba_resp_scd_ssn
= le16_to_cpu(ba_resp
->scd_ssn
);
4304 if (ba_resp_scd_flow
>= ARRAY_SIZE(priv
->txq
)) {
4305 IWL_ERROR("BUG_ON scd_flow is bigger than number of queues");
4309 txq
= &priv
->txq
[ba_resp_scd_flow
];
4310 agg
= &priv
->stations
[ba_resp
->sta_id
].tid
[ba_resp
->tid
].agg
;
4312 /* Find index just before block-ack window */
4313 index
= iwl4965_queue_dec_wrap(ba_resp_scd_ssn
& 0xff, txq
->q
.n_bd
);
4315 /* TODO: Need to get this copy more safely - now good for debug */
4318 DECLARE_MAC_BUF(mac);
4319 IWL_DEBUG_TX_REPLY("REPLY_COMPRESSED_BA [%d]Received from %s, "
4322 print_mac(mac, (u8*) &ba_resp->sta_addr_lo32),
4324 IWL_DEBUG_TX_REPLY("TID = %d, SeqCtl = %d, bitmap = 0x%X%X, scd_flow = "
4325 "%d, scd_ssn = %d\n",
4327 ba_resp->ba_seq_ctl,
4328 ba_resp->ba_bitmap1,
4329 ba_resp->ba_bitmap0,
4332 IWL_DEBUG_TX_REPLY("DAT start_idx = %d, bitmap = 0x%X%X \n",
4339 /* Update driver's record of ACK vs. not for each frame in window */
4340 iwl4965_tx_status_reply_compressed_ba(priv
, agg
, ba_resp
);
4342 /* Release all TFDs before the SSN, i.e. all TFDs in front of
4343 * block-ack window (we assume that they've been successfully
4344 * transmitted ... if not, it's too late anyway). */
4345 if (txq
->q
.read_ptr
!= (ba_resp_scd_ssn
& 0xff))
4346 iwl4965_tx_queue_reclaim(priv
, ba_resp_scd_flow
, index
);
4352 * iwl4965_tx_queue_stop_scheduler - Stop queue, but keep configuration
4354 static void iwl4965_tx_queue_stop_scheduler(struct iwl4965_priv
*priv
, u16 txq_id
)
4356 /* Simply stop the queue, but don't change any configuration;
4357 * the SCD_ACT_EN bit is the write-enable mask for the ACTIVE bit. */
4358 iwl4965_write_prph(priv
,
4359 KDR_SCD_QUEUE_STATUS_BITS(txq_id
),
4360 (0 << SCD_QUEUE_STTS_REG_POS_ACTIVE
)|
4361 (1 << SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN
));
4365 * iwl4965_tx_queue_set_q2ratid - Map unique receiver/tid combination to a queue
4367 static int iwl4965_tx_queue_set_q2ratid(struct iwl4965_priv
*priv
, u16 ra_tid
,
4374 scd_q2ratid
= ra_tid
& SCD_QUEUE_RA_TID_MAP_RATID_MSK
;
4376 tbl_dw_addr
= priv
->scd_base_addr
+
4377 SCD_TRANSLATE_TBL_OFFSET_QUEUE(txq_id
);
4379 tbl_dw
= iwl4965_read_targ_mem(priv
, tbl_dw_addr
);
4382 tbl_dw
= (scd_q2ratid
<< 16) | (tbl_dw
& 0x0000FFFF);
4384 tbl_dw
= scd_q2ratid
| (tbl_dw
& 0xFFFF0000);
4386 iwl4965_write_targ_mem(priv
, tbl_dw_addr
, tbl_dw
);
4392 * iwl4965_tx_queue_agg_enable - Set up & enable aggregation for selected queue
4394 * NOTE: txq_id must be greater than IWL_BACK_QUEUE_FIRST_ID,
4395 * i.e. it must be one of the higher queues used for aggregation
4397 static int iwl4965_tx_queue_agg_enable(struct iwl4965_priv
*priv
, int txq_id
,
4398 int tx_fifo
, int sta_id
, int tid
,
4401 unsigned long flags
;
4405 if (IWL_BACK_QUEUE_FIRST_ID
> txq_id
)
4406 IWL_WARNING("queue number too small: %d, must be > %d\n",
4407 txq_id
, IWL_BACK_QUEUE_FIRST_ID
);
4409 ra_tid
= BUILD_RAxTID(sta_id
, tid
);
4411 /* Modify device's station table to Tx this TID */
4412 iwl4965_sta_modify_enable_tid_tx(priv
, sta_id
, tid
);
4414 spin_lock_irqsave(&priv
->lock
, flags
);
4415 rc
= iwl4965_grab_nic_access(priv
);
4417 spin_unlock_irqrestore(&priv
->lock
, flags
);
4421 /* Stop this Tx queue before configuring it */
4422 iwl4965_tx_queue_stop_scheduler(priv
, txq_id
);
4424 /* Map receiver-address / traffic-ID to this queue */
4425 iwl4965_tx_queue_set_q2ratid(priv
, ra_tid
, txq_id
);
4427 /* Set this queue as a chain-building queue */
4428 iwl4965_set_bits_prph(priv
, KDR_SCD_QUEUECHAIN_SEL
, (1 << txq_id
));
4430 /* Place first TFD at index corresponding to start sequence number.
4431 * Assumes that ssn_idx is valid (!= 0xFFF) */
4432 priv
->txq
[txq_id
].q
.read_ptr
= (ssn_idx
& 0xff);
4433 priv
->txq
[txq_id
].q
.write_ptr
= (ssn_idx
& 0xff);
4434 iwl4965_set_wr_ptrs(priv
, txq_id
, ssn_idx
);
4436 /* Set up Tx window size and frame limit for this queue */
4437 iwl4965_write_targ_mem(priv
,
4438 priv
->scd_base_addr
+ SCD_CONTEXT_QUEUE_OFFSET(txq_id
),
4439 (SCD_WIN_SIZE
<< SCD_QUEUE_CTX_REG1_WIN_SIZE_POS
) &
4440 SCD_QUEUE_CTX_REG1_WIN_SIZE_MSK
);
4442 iwl4965_write_targ_mem(priv
, priv
->scd_base_addr
+
4443 SCD_CONTEXT_QUEUE_OFFSET(txq_id
) + sizeof(u32
),
4444 (SCD_FRAME_LIMIT
<< SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS
)
4445 & SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK
);
4447 iwl4965_set_bits_prph(priv
, KDR_SCD_INTERRUPT_MASK
, (1 << txq_id
));
4449 /* Set up Status area in SRAM, map to Tx DMA/FIFO, activate the queue */
4450 iwl4965_tx_queue_set_status(priv
, &priv
->txq
[txq_id
], tx_fifo
, 1);
4452 iwl4965_release_nic_access(priv
);
4453 spin_unlock_irqrestore(&priv
->lock
, flags
);
4459 * txq_id must be greater than IWL_BACK_QUEUE_FIRST_ID
4461 static int iwl4965_tx_queue_agg_disable(struct iwl4965_priv
*priv
, u16 txq_id
,
4462 u16 ssn_idx
, u8 tx_fifo
)
4464 unsigned long flags
;
4467 if (IWL_BACK_QUEUE_FIRST_ID
> txq_id
) {
4468 IWL_WARNING("queue number too small: %d, must be > %d\n",
4469 txq_id
, IWL_BACK_QUEUE_FIRST_ID
);
4473 spin_lock_irqsave(&priv
->lock
, flags
);
4474 rc
= iwl4965_grab_nic_access(priv
);
4476 spin_unlock_irqrestore(&priv
->lock
, flags
);
4480 iwl4965_tx_queue_stop_scheduler(priv
, txq_id
);
4482 iwl4965_clear_bits_prph(priv
, KDR_SCD_QUEUECHAIN_SEL
, (1 << txq_id
));
4484 priv
->txq
[txq_id
].q
.read_ptr
= (ssn_idx
& 0xff);
4485 priv
->txq
[txq_id
].q
.write_ptr
= (ssn_idx
& 0xff);
4486 /* supposes that ssn_idx is valid (!= 0xFFF) */
4487 iwl4965_set_wr_ptrs(priv
, txq_id
, ssn_idx
);
4489 iwl4965_clear_bits_prph(priv
, KDR_SCD_INTERRUPT_MASK
, (1 << txq_id
));
4490 iwl4965_txq_ctx_deactivate(priv
, txq_id
);
4491 iwl4965_tx_queue_set_status(priv
, &priv
->txq
[txq_id
], tx_fifo
, 0);
4493 iwl4965_release_nic_access(priv
);
4494 spin_unlock_irqrestore(&priv
->lock
, flags
);
4499 #endif/* CONFIG_IWL4965_HT_AGG */
4500 #endif /* CONFIG_IWL4965_HT */
4503 * iwl4965_add_station - Initialize a station's hardware rate table
4505 * The uCode's station table contains a table of fallback rates
4506 * for automatic fallback during transmission.
4508 * NOTE: This sets up a default set of values. These will be replaced later
4509 * if the driver's iwl-4965-rs rate scaling algorithm is used, instead of
4512 * NOTE: Run REPLY_ADD_STA command to set up station table entry, before
4513 * calling this function (which runs REPLY_TX_LINK_QUALITY_CMD,
4514 * which requires station table entry to exist).
4516 void iwl4965_add_station(struct iwl4965_priv
*priv
, const u8
*addr
, int is_ap
)
4519 struct iwl4965_link_quality_cmd link_cmd
= {
4524 /* Set up the rate scaling to start at selected rate, fall back
4525 * all the way down to 1M in IEEE order, and then spin on 1M */
4527 r
= IWL_RATE_54M_INDEX
;
4528 else if (priv
->phymode
== MODE_IEEE80211A
)
4529 r
= IWL_RATE_6M_INDEX
;
4531 r
= IWL_RATE_1M_INDEX
;
4533 for (i
= 0; i
< LINK_QUAL_MAX_RETRY_NUM
; i
++) {
4535 if (r
>= IWL_FIRST_CCK_RATE
&& r
<= IWL_LAST_CCK_RATE
)
4536 rate_flags
|= RATE_MCS_CCK_MSK
;
4538 /* Use Tx antenna B only */
4539 rate_flags
|= RATE_MCS_ANT_B_MSK
;
4540 rate_flags
&= ~RATE_MCS_ANT_A_MSK
;
4542 link_cmd
.rs_table
[i
].rate_n_flags
=
4543 iwl4965_hw_set_rate_n_flags(iwl4965_rates
[r
].plcp
, rate_flags
);
4544 r
= iwl4965_get_prev_ieee_rate(r
);
4547 link_cmd
.general_params
.single_stream_ant_msk
= 2;
4548 link_cmd
.general_params
.dual_stream_ant_msk
= 3;
4549 link_cmd
.agg_params
.agg_dis_start_th
= 3;
4550 link_cmd
.agg_params
.agg_time_limit
= cpu_to_le16(4000);
4552 /* Update the rate scaling for control frame Tx to AP */
4553 link_cmd
.sta_id
= is_ap
? IWL_AP_ID
: IWL4965_BROADCAST_ID
;
4555 iwl4965_send_cmd_pdu(priv
, REPLY_TX_LINK_QUALITY_CMD
, sizeof(link_cmd
),
4559 #ifdef CONFIG_IWL4965_HT
4561 static u8
iwl4965_is_channel_extension(struct iwl4965_priv
*priv
, int phymode
,
4562 u16 channel
, u8 extension_chan_offset
)
4564 const struct iwl4965_channel_info
*ch_info
;
4566 ch_info
= iwl4965_get_channel_info(priv
, phymode
, channel
);
4567 if (!is_channel_valid(ch_info
))
4570 if (extension_chan_offset
== IWL_EXT_CHANNEL_OFFSET_AUTO
)
4573 if ((ch_info
->fat_extension_channel
== extension_chan_offset
) ||
4574 (ch_info
->fat_extension_channel
== HT_IE_EXT_CHANNEL_MAX
))
4580 static u8
iwl4965_is_fat_tx_allowed(struct iwl4965_priv
*priv
,
4581 struct ieee80211_ht_info
*sta_ht_inf
)
4583 struct iwl_ht_info
*iwl_ht_conf
= &priv
->current_ht_config
;
4585 if ((!iwl_ht_conf
->is_ht
) ||
4586 (iwl_ht_conf
->supported_chan_width
!= IWL_CHANNEL_WIDTH_40MHZ
) ||
4587 (iwl_ht_conf
->extension_chan_offset
== IWL_EXT_CHANNEL_OFFSET_AUTO
))
4591 if ((!sta_ht_inf
->ht_supported
) ||
4592 (!sta_ht_inf
->cap
& IEEE80211_HT_CAP_SUP_WIDTH
))
4596 return (iwl4965_is_channel_extension(priv
, priv
->phymode
,
4597 iwl_ht_conf
->control_channel
,
4598 iwl_ht_conf
->extension_chan_offset
));
4601 void iwl4965_set_rxon_ht(struct iwl4965_priv
*priv
, struct iwl_ht_info
*ht_info
)
4603 struct iwl4965_rxon_cmd
*rxon
= &priv
->staging_rxon
;
4606 if (!ht_info
->is_ht
)
4609 /* Set up channel bandwidth: 20 MHz only, or 20/40 mixed if fat ok */
4610 if (iwl4965_is_fat_tx_allowed(priv
, NULL
))
4611 rxon
->flags
|= RXON_FLG_CHANNEL_MODE_MIXED_MSK
;
4613 rxon
->flags
&= ~(RXON_FLG_CHANNEL_MODE_MIXED_MSK
|
4614 RXON_FLG_CHANNEL_MODE_PURE_40_MSK
);
4616 if (le16_to_cpu(rxon
->channel
) != ht_info
->control_channel
) {
4617 IWL_DEBUG_ASSOC("control diff than current %d %d\n",
4618 le16_to_cpu(rxon
->channel
),
4619 ht_info
->control_channel
);
4620 rxon
->channel
= cpu_to_le16(ht_info
->control_channel
);
4624 /* Note: control channel is opposite of extension channel */
4625 switch (ht_info
->extension_chan_offset
) {
4626 case IWL_EXT_CHANNEL_OFFSET_ABOVE
:
4627 rxon
->flags
&= ~(RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK
);
4629 case IWL_EXT_CHANNEL_OFFSET_BELOW
:
4630 rxon
->flags
|= RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK
;
4632 case IWL_EXT_CHANNEL_OFFSET_AUTO
:
4633 rxon
->flags
&= ~RXON_FLG_CHANNEL_MODE_MIXED_MSK
;
4636 rxon
->flags
&= ~RXON_FLG_CHANNEL_MODE_MIXED_MSK
;
4640 val
= ht_info
->ht_protection
;
4642 rxon
->flags
|= cpu_to_le32(val
<< RXON_FLG_HT_OPERATING_MODE_POS
);
4644 iwl4965_set_rxon_chain(priv
);
4646 IWL_DEBUG_ASSOC("supported HT rate 0x%X %X "
4647 "rxon flags 0x%X operation mode :0x%X "
4648 "extension channel offset 0x%x "
4649 "control chan %d\n",
4650 ht_info
->supp_mcs_set
[0], ht_info
->supp_mcs_set
[1],
4651 le32_to_cpu(rxon
->flags
), ht_info
->ht_protection
,
4652 ht_info
->extension_chan_offset
,
4653 ht_info
->control_channel
);
4657 void iwl4965_set_ht_add_station(struct iwl4965_priv
*priv
, u8 index
,
4658 struct ieee80211_ht_info
*sta_ht_inf
)
4663 if (!sta_ht_inf
|| !sta_ht_inf
->ht_supported
)
4666 mimo_ps_mode
= (sta_ht_inf
->cap
& IEEE80211_HT_CAP_MIMO_PS
) >> 2;
4668 sta_flags
= priv
->stations
[index
].sta
.station_flags
;
4670 sta_flags
&= ~(STA_FLG_RTS_MIMO_PROT_MSK
| STA_FLG_MIMO_DIS_MSK
);
4672 switch (mimo_ps_mode
) {
4673 case WLAN_HT_CAP_MIMO_PS_STATIC
:
4674 sta_flags
|= STA_FLG_MIMO_DIS_MSK
;
4676 case WLAN_HT_CAP_MIMO_PS_DYNAMIC
:
4677 sta_flags
|= STA_FLG_RTS_MIMO_PROT_MSK
;
4679 case WLAN_HT_CAP_MIMO_PS_DISABLED
:
4682 IWL_WARNING("Invalid MIMO PS mode %d", mimo_ps_mode
);
4686 sta_flags
|= cpu_to_le32(
4687 (u32
)sta_ht_inf
->ampdu_factor
<< STA_FLG_MAX_AGG_SIZE_POS
);
4689 sta_flags
|= cpu_to_le32(
4690 (u32
)sta_ht_inf
->ampdu_density
<< STA_FLG_AGG_MPDU_DENSITY_POS
);
4692 if (iwl4965_is_fat_tx_allowed(priv
, sta_ht_inf
))
4693 sta_flags
|= STA_FLG_FAT_EN_MSK
;
4695 sta_flags
&= ~STA_FLG_FAT_EN_MSK
;
4697 priv
->stations
[index
].sta
.station_flags
= sta_flags
;
4702 static void iwl4965_sta_modify_add_ba_tid(struct iwl4965_priv
*priv
,
4703 int sta_id
, int tid
, u16 ssn
)
4705 unsigned long flags
;
4707 spin_lock_irqsave(&priv
->sta_lock
, flags
);
4708 priv
->stations
[sta_id
].sta
.station_flags_msk
= 0;
4709 priv
->stations
[sta_id
].sta
.sta
.modify_mask
= STA_MODIFY_ADDBA_TID_MSK
;
4710 priv
->stations
[sta_id
].sta
.add_immediate_ba_tid
= (u8
)tid
;
4711 priv
->stations
[sta_id
].sta
.add_immediate_ba_ssn
= cpu_to_le16(ssn
);
4712 priv
->stations
[sta_id
].sta
.mode
= STA_CONTROL_MODIFY_MSK
;
4713 spin_unlock_irqrestore(&priv
->sta_lock
, flags
);
4715 iwl4965_send_add_station(priv
, &priv
->stations
[sta_id
].sta
, CMD_ASYNC
);
4718 static void iwl4965_sta_modify_del_ba_tid(struct iwl4965_priv
*priv
,
4719 int sta_id
, int tid
)
4721 unsigned long flags
;
4723 spin_lock_irqsave(&priv
->sta_lock
, flags
);
4724 priv
->stations
[sta_id
].sta
.station_flags_msk
= 0;
4725 priv
->stations
[sta_id
].sta
.sta
.modify_mask
= STA_MODIFY_DELBA_TID_MSK
;
4726 priv
->stations
[sta_id
].sta
.remove_immediate_ba_tid
= (u8
)tid
;
4727 priv
->stations
[sta_id
].sta
.mode
= STA_CONTROL_MODIFY_MSK
;
4728 spin_unlock_irqrestore(&priv
->sta_lock
, flags
);
4730 iwl4965_send_add_station(priv
, &priv
->stations
[sta_id
].sta
, CMD_ASYNC
);
4733 int iwl4965_mac_ampdu_action(struct ieee80211_hw
*hw
,
4734 enum ieee80211_ampdu_mlme_action action
,
4735 const u8
*addr
, u16 tid
, u16 ssn
)
4737 struct iwl4965_priv
*priv
= hw
->priv
;
4739 DECLARE_MAC_BUF(mac
);
4741 IWL_DEBUG_HT("A-MPDU action on da=%s tid=%d ",
4742 print_mac(mac
, addr
), tid
);
4743 sta_id
= iwl4965_hw_find_station(priv
, addr
);
4745 case IEEE80211_AMPDU_RX_START
:
4746 IWL_DEBUG_HT("start Rx\n");
4747 iwl4965_sta_modify_add_ba_tid(priv
, sta_id
, tid
, ssn
);
4749 case IEEE80211_AMPDU_RX_STOP
:
4750 IWL_DEBUG_HT("stop Rx\n");
4751 iwl4965_sta_modify_del_ba_tid(priv
, sta_id
, tid
);
4754 IWL_DEBUG_HT("unknown\n");
4761 #ifdef CONFIG_IWL4965_HT_AGG
4763 static const u16 default_tid_to_tx_fifo
[] = {
4784 * Find first available (lowest unused) Tx Queue, mark it "active".
4785 * Called only when finding queue for aggregation.
4786 * Should never return anything < 7, because they should already
4787 * be in use as EDCA AC (0-3), Command (4), HCCA (5, 6).
4789 static int iwl4965_txq_ctx_activate_free(struct iwl4965_priv
*priv
)
4793 for (txq_id
= 0; txq_id
< priv
->hw_setting
.max_txq_num
; txq_id
++)
4794 if (!test_and_set_bit(txq_id
, &priv
->txq_ctx_active_msk
))
4799 int iwl4965_mac_ht_tx_agg_start(struct ieee80211_hw
*hw
, u8
*da
, u16 tid
,
4803 struct iwl4965_priv
*priv
= hw
->priv
;
4808 unsigned long flags
;
4809 struct iwl4965_tid_data
*tid_data
;
4810 DECLARE_MAC_BUF(mac
);
4812 /* Determine Tx DMA/FIFO channel for this Traffic ID */
4813 if (likely(tid
< ARRAY_SIZE(default_tid_to_tx_fifo
)))
4814 tx_fifo
= default_tid_to_tx_fifo
[tid
];
4818 IWL_WARNING("iwl-AGG iwl4965_mac_ht_tx_agg_start on da=%s"
4819 " tid=%d\n", print_mac(mac
, da
), tid
);
4821 /* Get index into station table */
4822 sta_id
= iwl4965_hw_find_station(priv
, da
);
4823 if (sta_id
== IWL_INVALID_STATION
)
4826 /* Find available Tx queue for aggregation */
4827 txq_id
= iwl4965_txq_ctx_activate_free(priv
);
4831 spin_lock_irqsave(&priv
->sta_lock
, flags
);
4832 tid_data
= &priv
->stations
[sta_id
].tid
[tid
];
4834 /* Get starting sequence number for 1st frame in block ack window.
4835 * We'll use least signif byte as 1st frame's index into Tx queue. */
4836 ssn
= SEQ_TO_SN(tid_data
->seq_number
);
4837 tid_data
->agg
.txq_id
= txq_id
;
4838 spin_unlock_irqrestore(&priv
->sta_lock
, flags
);
4840 *start_seq_num
= ssn
;
4842 /* Update driver's link quality manager */
4843 iwl4965_ba_status(priv
, tid
, BA_STATUS_ACTIVE
);
4845 /* Set up and enable aggregation for selected Tx queue and FIFO */
4846 return iwl4965_tx_queue_agg_enable(priv
, txq_id
, tx_fifo
,
4851 int iwl4965_mac_ht_tx_agg_stop(struct ieee80211_hw
*hw
, u8
*da
, u16 tid
,
4855 struct iwl4965_priv
*priv
= hw
->priv
;
4856 int tx_fifo_id
, txq_id
, sta_id
, ssn
= -1;
4857 struct iwl4965_tid_data
*tid_data
;
4859 DECLARE_MAC_BUF(mac
);
4862 IWL_ERROR("%s: da = NULL\n", __func__
);
4866 if (likely(tid
< ARRAY_SIZE(default_tid_to_tx_fifo
)))
4867 tx_fifo_id
= default_tid_to_tx_fifo
[tid
];
4871 sta_id
= iwl4965_hw_find_station(priv
, da
);
4873 if (sta_id
== IWL_INVALID_STATION
)
4876 tid_data
= &priv
->stations
[sta_id
].tid
[tid
];
4877 ssn
= (tid_data
->seq_number
& IEEE80211_SCTL_SEQ
) >> 4;
4878 txq_id
= tid_data
->agg
.txq_id
;
4880 rc
= iwl4965_tx_queue_agg_disable(priv
, txq_id
, ssn
, tx_fifo_id
);
4881 /* FIXME: need more safe way to handle error condition */
4885 iwl4965_ba_status(priv
, tid
, BA_STATUS_INITIATOR_DELBA
);
4886 IWL_DEBUG_INFO("iwl4965_mac_ht_tx_agg_stop on da=%s tid=%d\n",
4887 print_mac(mac
, da
), tid
);
4893 #endif /* CONFIG_IWL4965_HT_AGG */
4894 #endif /* CONFIG_IWL4965_HT */
4896 /* Set up 4965-specific Rx frame reply handlers */
4897 void iwl4965_hw_rx_handler_setup(struct iwl4965_priv
*priv
)
4899 /* Legacy Rx frames */
4900 priv
->rx_handlers
[REPLY_4965_RX
] = iwl4965_rx_reply_rx
;
4902 /* High-throughput (HT) Rx frames */
4903 priv
->rx_handlers
[REPLY_RX_PHY_CMD
] = iwl4965_rx_reply_rx_phy
;
4904 priv
->rx_handlers
[REPLY_RX_MPDU_CMD
] = iwl4965_rx_reply_rx
;
4906 priv
->rx_handlers
[MISSED_BEACONS_NOTIFICATION
] =
4907 iwl4965_rx_missed_beacon_notif
;
4909 #ifdef CONFIG_IWL4965_HT
4910 #ifdef CONFIG_IWL4965_HT_AGG
4911 priv
->rx_handlers
[REPLY_COMPRESSED_BA
] = iwl4965_rx_reply_compressed_ba
;
4912 #endif /* CONFIG_IWL4965_HT_AGG */
4913 #endif /* CONFIG_IWL4965_HT */
4916 void iwl4965_hw_setup_deferred_work(struct iwl4965_priv
*priv
)
4918 INIT_WORK(&priv
->txpower_work
, iwl4965_bg_txpower_work
);
4919 INIT_WORK(&priv
->statistics_work
, iwl4965_bg_statistics_work
);
4920 #ifdef CONFIG_IWL4965_SENSITIVITY
4921 INIT_WORK(&priv
->sensitivity_work
, iwl4965_bg_sensitivity_work
);
4923 #ifdef CONFIG_IWL4965_HT
4924 #ifdef CONFIG_IWL4965_HT_AGG
4925 INIT_WORK(&priv
->agg_work
, iwl4965_bg_agg_work
);
4926 #endif /* CONFIG_IWL4965_HT_AGG */
4927 #endif /* CONFIG_IWL4965_HT */
4928 init_timer(&priv
->statistics_periodic
);
4929 priv
->statistics_periodic
.data
= (unsigned long)priv
;
4930 priv
->statistics_periodic
.function
= iwl4965_bg_statistics_periodic
;
4933 void iwl4965_hw_cancel_deferred_work(struct iwl4965_priv
*priv
)
4935 del_timer_sync(&priv
->statistics_periodic
);
4937 cancel_delayed_work(&priv
->init_alive_start
);
4940 struct pci_device_id iwl4965_hw_card_ids
[] = {
4941 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, 0x4229)},
4942 {PCI_DEVICE(PCI_VENDOR_ID_INTEL
, 0x4230)},
4947 * The device's EEPROM semaphore prevents conflicts between driver and uCode
4948 * when accessing the EEPROM; each access is a series of pulses to/from the
4949 * EEPROM chip, not a single event, so even reads could conflict if they
4950 * weren't arbitrated by the semaphore.
4952 int iwl4965_eeprom_acquire_semaphore(struct iwl4965_priv
*priv
)
4957 for (count
= 0; count
< EEPROM_SEM_RETRY_LIMIT
; count
++) {
4958 /* Request semaphore */
4959 iwl4965_set_bit(priv
, CSR_HW_IF_CONFIG_REG
,
4960 CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM
);
4962 /* See if we got it */
4963 rc
= iwl4965_poll_bit(priv
, CSR_HW_IF_CONFIG_REG
,
4964 CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM
,
4965 CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM
,
4966 EEPROM_SEM_TIMEOUT
);
4968 IWL_DEBUG_IO("Acquired semaphore after %d tries.\n",
4977 MODULE_DEVICE_TABLE(pci
, iwl4965_hw_card_ids
);