aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2010-05-06 11:54:10 -0400
committerReinette Chatre <reinette.chatre@intel.com>2010-06-06 02:15:49 -0400
commita0ee74cf080389aee4fbf198ffa7e85b3480b661 (patch)
tree8b7d1d442d7d5a82a6bfe92e6123650b7751c9ff /drivers
parentae0bce029e3b96d3ba2cc868bc6a65a125666ab8 (diff)
iwlwifi: beacon format related helper function
Move the ucode beacon formation related helper function from 3945 to iwlcore, so both _3945 and _agn devices can utilize those functions. When driver pass the beacon related timing information to uCode in both spectrum measurement and channel switch commands, the beacon timing parameter require in uCode beacon format; those helper functions will do the conversation from uSec to the correct uCode format Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Diffstat (limited to 'drivers')
-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;