aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-1000.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-3945.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-6000.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c55
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h16
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-helpers.h22
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c56
10 files changed, 113 insertions, 53 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c
index 6be2992f8f21..dba91e0233b6 100644
--- a/drivers/net/wireless/iwlwifi/iwl-1000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-1000.c
@@ -158,6 +158,8 @@ static int iwl1000_hw_set_hw_params(struct iwl_priv *priv)
158 BIT(IWL_CALIB_TX_IQ_PERD) | 158 BIT(IWL_CALIB_TX_IQ_PERD) |
159 BIT(IWL_CALIB_BASE_BAND); 159 BIT(IWL_CALIB_BASE_BAND);
160 160
161 priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
162
161 return 0; 163 return 0;
162} 164}
163 165
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
index 7a34ef66c7ff..295b67ac8169 100644
--- a/drivers/net/wireless/iwlwifi/iwl-3945.c
+++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
@@ -2433,6 +2433,7 @@ int iwl3945_hw_set_hw_params(struct iwl_priv *priv)
2433 2433
2434 priv->hw_params.rx_wrt_ptr_reg = FH39_RSCSR_CHNL0_WPTR; 2434 priv->hw_params.rx_wrt_ptr_reg = FH39_RSCSR_CHNL0_WPTR;
2435 priv->hw_params.max_beacon_itrvl = IWL39_MAX_UCODE_BEACON_INTERVAL; 2435 priv->hw_params.max_beacon_itrvl = IWL39_MAX_UCODE_BEACON_INTERVAL;
2436 priv->hw_params.beacon_time_tsf_bits = IWL3945_EXT_BEACON_TIME_POS;
2436 2437
2437 return 0; 2438 return 0;
2438} 2439}
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index a0669ea42790..fe7aa73cc0eb 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -672,6 +672,7 @@ static int iwl4965_hw_set_hw_params(struct iwl_priv *priv)
672 priv->cfg->ops->lib->temp_ops.set_ct_kill(priv); 672 priv->cfg->ops->lib->temp_ops.set_ct_kill(priv);
673 673
674 priv->hw_params.sens = &iwl4965_sensitivity; 674 priv->hw_params.sens = &iwl4965_sensitivity;
675 priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
675 676
676 return 0; 677 return 0;
677} 678}
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index a28af7eb67eb..c320d4110fef 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -208,6 +208,8 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
208 BIT(IWL_CALIB_TX_IQ_PERD) | 208 BIT(IWL_CALIB_TX_IQ_PERD) |
209 BIT(IWL_CALIB_BASE_BAND); 209 BIT(IWL_CALIB_BASE_BAND);
210 210
211 priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
212
211 return 0; 213 return 0;
212} 214}
213 215
@@ -252,6 +254,8 @@ static int iwl5150_hw_set_hw_params(struct iwl_priv *priv)
252 BIT(IWL_CALIB_TX_IQ) | 254 BIT(IWL_CALIB_TX_IQ) |
253 BIT(IWL_CALIB_BASE_BAND); 255 BIT(IWL_CALIB_BASE_BAND);
254 256
257 priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
258
255 return 0; 259 return 0;
256} 260}
257 261
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c
index 73713f6a8df4..5f6dbd9561d7 100644
--- a/drivers/net/wireless/iwlwifi/iwl-6000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-6000.c
@@ -187,6 +187,8 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)
187 BIT(IWL_CALIB_TX_IQ) | 187 BIT(IWL_CALIB_TX_IQ) |
188 BIT(IWL_CALIB_BASE_BAND); 188 BIT(IWL_CALIB_BASE_BAND);
189 189
190 priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
191
190 return 0; 192 return 0;
191} 193}
192 194
@@ -232,6 +234,8 @@ static int iwl6050_hw_set_hw_params(struct iwl_priv *priv)
232 BIT(IWL_CALIB_TX_IQ) | 234 BIT(IWL_CALIB_TX_IQ) |
233 BIT(IWL_CALIB_BASE_BAND); 235 BIT(IWL_CALIB_BASE_BAND);
234 236
237 priv->hw_params.beacon_time_tsf_bits = IWLAGN_EXT_BEACON_TIME_POS;
238
235 return 0; 239 return 0;
236} 240}
237 241
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 245cb906c39e..b05b813413fd 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -2710,6 +2710,61 @@ void iwl_bg_monitor_recover(unsigned long data)
2710} 2710}
2711EXPORT_SYMBOL(iwl_bg_monitor_recover); 2711EXPORT_SYMBOL(iwl_bg_monitor_recover);
2712 2712
2713
2714/*
2715 * extended beacon time format
2716 * time in usec will be changed into a 32-bit value in extended:internal format
2717 * the extended part is the beacon counts
2718 * the internal part is the time in usec within one beacon interval
2719 */
2720u32 iwl_usecs_to_beacons(struct iwl_priv *priv, u32 usec, u32 beacon_interval)
2721{
2722 u32 quot;
2723 u32 rem;
2724 u32 interval = beacon_interval * TIME_UNIT;
2725
2726 if (!interval || !usec)
2727 return 0;
2728
2729 quot = (usec / interval) &
2730 (iwl_beacon_time_mask_high(priv,
2731 priv->hw_params.beacon_time_tsf_bits) >>
2732 priv->hw_params.beacon_time_tsf_bits);
2733 rem = (usec % interval) & iwl_beacon_time_mask_low(priv,
2734 priv->hw_params.beacon_time_tsf_bits);
2735
2736 return (quot << priv->hw_params.beacon_time_tsf_bits) + rem;
2737}
2738EXPORT_SYMBOL(iwl_usecs_to_beacons);
2739
2740/* base is usually what we get from ucode with each received frame,
2741 * the same as HW timer counter counting down
2742 */
2743__le32 iwl_add_beacon_time(struct iwl_priv *priv, u32 base,
2744 u32 addon, u32 beacon_interval)
2745{
2746 u32 base_low = base & iwl_beacon_time_mask_low(priv,
2747 priv->hw_params.beacon_time_tsf_bits);
2748 u32 addon_low = addon & iwl_beacon_time_mask_low(priv,
2749 priv->hw_params.beacon_time_tsf_bits);
2750 u32 interval = beacon_interval * TIME_UNIT;
2751 u32 res = (base & iwl_beacon_time_mask_high(priv,
2752 priv->hw_params.beacon_time_tsf_bits)) +
2753 (addon & iwl_beacon_time_mask_high(priv,
2754 priv->hw_params.beacon_time_tsf_bits));
2755
2756 if (base_low > addon_low)
2757 res += base_low - addon_low;
2758 else if (base_low < addon_low) {
2759 res += interval + base_low - addon_low;
2760 res += (1 << priv->hw_params.beacon_time_tsf_bits);
2761 } else
2762 res += (1 << priv->hw_params.beacon_time_tsf_bits);
2763
2764 return cpu_to_le32(res);
2765}
2766EXPORT_SYMBOL(iwl_add_beacon_time);
2767
2713#ifdef CONFIG_PM 2768#ifdef CONFIG_PM
2714 2769
2715int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state) 2770int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 69738f1e5416..48d96fda431c 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -79,6 +79,8 @@ struct iwl_cmd;
79 .subvendor = PCI_ANY_ID, .subdevice = (subdev), \ 79 .subvendor = PCI_ANY_ID, .subdevice = (subdev), \
80 .driver_data = (kernel_ulong_t)&(cfg) 80 .driver_data = (kernel_ulong_t)&(cfg)
81 81
82#define TIME_UNIT 1024
83
82#define IWL_SKU_G 0x1 84#define IWL_SKU_G 0x1
83#define IWL_SKU_A 0x2 85#define IWL_SKU_A 0x2
84#define IWL_SKU_N 0x8 86#define IWL_SKU_N 0x8
@@ -591,6 +593,9 @@ static inline u16 iwl_pcie_link_ctl(struct iwl_priv *priv)
591} 593}
592 594
593void iwl_bg_monitor_recover(unsigned long data); 595void iwl_bg_monitor_recover(unsigned long data);
596u32 iwl_usecs_to_beacons(struct iwl_priv *priv, u32 usec, u32 beacon_interval);
597__le32 iwl_add_beacon_time(struct iwl_priv *priv, u32 base,
598 u32 addon, u32 beacon_interval);
594 599
595#ifdef CONFIG_PM 600#ifdef CONFIG_PM
596int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state); 601int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state);
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 8b7731a9a20c..6663df24a0c4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -662,6 +662,7 @@ struct iwl_sensitivity_ranges {
662 * @sw_crypto: 0 for hw, 1 for sw 662 * @sw_crypto: 0 for hw, 1 for sw
663 * @max_xxx_size: for ucode uses 663 * @max_xxx_size: for ucode uses
664 * @ct_kill_threshold: temperature threshold 664 * @ct_kill_threshold: temperature threshold
665 * @beacon_time_tsf_bits: number of valid tsf bits for beacon time
665 * @calib_init_cfg: setup initial calibrations for the hw 666 * @calib_init_cfg: setup initial calibrations for the hw
666 * @struct iwl_sensitivity_ranges: range of sensitivity values 667 * @struct iwl_sensitivity_ranges: range of sensitivity values
667 */ 668 */
@@ -688,6 +689,7 @@ struct iwl_hw_params {
688 u32 ct_kill_threshold; /* value in hw-dependent units */ 689 u32 ct_kill_threshold; /* value in hw-dependent units */
689 u32 ct_kill_exit_threshold; /* value in hw-dependent units */ 690 u32 ct_kill_exit_threshold; /* value in hw-dependent units */
690 /* for 1000, 6000 series and up */ 691 /* for 1000, 6000 series and up */
692 u16 beacon_time_tsf_bits;
691 u32 calib_init_cfg; 693 u32 calib_init_cfg;
692 const struct iwl_sensitivity_ranges *sens; 694 const struct iwl_sensitivity_ranges *sens;
693}; 695};
@@ -1062,6 +1064,20 @@ struct iwl_force_reset {
1062 unsigned long last_force_reset_jiffies; 1064 unsigned long last_force_reset_jiffies;
1063}; 1065};
1064 1066
1067/* extend beacon time format bit shifting */
1068/*
1069 * for _3945 devices
1070 * bits 31:24 - extended
1071 * bits 23:0 - interval
1072 */
1073#define IWL3945_EXT_BEACON_TIME_POS 24
1074/*
1075 * for _agn devices
1076 * bits 31:22 - extended
1077 * bits 21:0 - interval
1078 */
1079#define IWLAGN_EXT_BEACON_TIME_POS 22
1080
1065struct iwl_priv { 1081struct iwl_priv {
1066 1082
1067 /* ieee device used by generic ieee processing code */ 1083 /* ieee device used by generic ieee processing code */
diff --git a/drivers/net/wireless/iwlwifi/iwl-helpers.h b/drivers/net/wireless/iwlwifi/iwl-helpers.h
index 69846395763b..621abe3c5afc 100644
--- a/drivers/net/wireless/iwlwifi/iwl-helpers.h
+++ b/drivers/net/wireless/iwlwifi/iwl-helpers.h
@@ -175,4 +175,26 @@ static inline void iwl_enable_interrupts(struct iwl_priv *priv)
175 iwl_write32(priv, CSR_INT_MASK, priv->inta_mask); 175 iwl_write32(priv, CSR_INT_MASK, priv->inta_mask);
176} 176}
177 177
178/**
179 * iwl_beacon_time_mask_low - mask of lower 32 bit of beacon time
180 * @priv -- pointer to iwl_priv data structure
181 * @tsf_bits -- number of bits need to shift for masking)
182 */
183static inline u32 iwl_beacon_time_mask_low(struct iwl_priv *priv,
184 u16 tsf_bits)
185{
186 return (1 << tsf_bits) - 1;
187}
188
189/**
190 * iwl_beacon_time_mask_high - mask of higher 32 bit of beacon time
191 * @priv -- pointer to iwl_priv data structure
192 * @tsf_bits -- number of bits need to shift for masking)
193 */
194static inline u32 iwl_beacon_time_mask_high(struct iwl_priv *priv,
195 u16 tsf_bits)
196{
197 return ((1 << (32 - tsf_bits)) - 1) << tsf_bits;
198}
199
178#endif /* __iwl_helpers_h__ */ 200#endif /* __iwl_helpers_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index f2ec752c6697..eeeb6e8cd1de 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -665,55 +665,6 @@ drop:
665 return -1; 665 return -1;
666} 666}
667 667
668#define BEACON_TIME_MASK_LOW 0x00FFFFFF
669#define BEACON_TIME_MASK_HIGH 0xFF000000
670#define TIME_UNIT 1024
671
672/*
673 * extended beacon time format
674 * time in usec will be changed into a 32-bit value in 8:24 format
675 * the high 1 byte is the beacon counts
676 * the lower 3 bytes is the time in usec within one beacon interval
677 */
678
679static u32 iwl3945_usecs_to_beacons(u32 usec, u32 beacon_interval)
680{
681 u32 quot;
682 u32 rem;
683 u32 interval = beacon_interval * 1024;
684
685 if (!interval || !usec)
686 return 0;
687
688 quot = (usec / interval) & (BEACON_TIME_MASK_HIGH >> 24);
689 rem = (usec % interval) & BEACON_TIME_MASK_LOW;
690
691 return (quot << 24) + rem;
692}
693
694/* base is usually what we get from ucode with each received frame,
695 * the same as HW timer counter counting down
696 */
697
698static __le32 iwl3945_add_beacon_time(u32 base, u32 addon, u32 beacon_interval)
699{
700 u32 base_low = base & BEACON_TIME_MASK_LOW;
701 u32 addon_low = addon & BEACON_TIME_MASK_LOW;
702 u32 interval = beacon_interval * TIME_UNIT;
703 u32 res = (base & BEACON_TIME_MASK_HIGH) +
704 (addon & BEACON_TIME_MASK_HIGH);
705
706 if (base_low > addon_low)
707 res += base_low - addon_low;
708 else if (base_low < addon_low) {
709 res += interval + base_low - addon_low;
710 res += (1 << 24);
711 } else
712 res += (1 << 24);
713
714 return cpu_to_le32(res);
715}
716
717static int iwl3945_get_measurement(struct iwl_priv *priv, 668static int iwl3945_get_measurement(struct iwl_priv *priv,
718 struct ieee80211_measurement_params *params, 669 struct ieee80211_measurement_params *params,
719 u8 type) 670 u8 type)
@@ -731,8 +682,7 @@ static int iwl3945_get_measurement(struct iwl_priv *priv,
731 int duration = le16_to_cpu(params->duration); 682 int duration = le16_to_cpu(params->duration);
732 683
733 if (iwl_is_associated(priv)) 684 if (iwl_is_associated(priv))
734 add_time = 685 add_time = iwl_usecs_to_beacons(priv,
735 iwl3945_usecs_to_beacons(
736 le64_to_cpu(params->start_time) - priv->_3945.last_tsf, 686 le64_to_cpu(params->start_time) - priv->_3945.last_tsf,
737 le16_to_cpu(priv->rxon_timing.beacon_interval)); 687 le16_to_cpu(priv->rxon_timing.beacon_interval));
738 688
@@ -747,8 +697,8 @@ static int iwl3945_get_measurement(struct iwl_priv *priv,
747 697
748 if (iwl_is_associated(priv)) 698 if (iwl_is_associated(priv))
749 spectrum.start_time = 699 spectrum.start_time =
750 iwl3945_add_beacon_time(priv->_3945.last_beacon_time, 700 iwl_add_beacon_time(priv,
751 add_time, 701 priv->_3945.last_beacon_time, add_time,
752 le16_to_cpu(priv->rxon_timing.beacon_interval)); 702 le16_to_cpu(priv->rxon_timing.beacon_interval));
753 else 703 else
754 spectrum.start_time = 0; 704 spectrum.start_time = 0;