diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-1000.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 55 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 16 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-helpers.h | 22 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 56 |
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 | } |
2711 | EXPORT_SYMBOL(iwl_bg_monitor_recover); | 2711 | EXPORT_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 | */ | ||
2720 | u32 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 | } | ||
2738 | EXPORT_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 | } | ||
2766 | EXPORT_SYMBOL(iwl_add_beacon_time); | ||
2767 | |||
2713 | #ifdef CONFIG_PM | 2768 | #ifdef CONFIG_PM |
2714 | 2769 | ||
2715 | int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state) | 2770 | int 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 | ||
593 | void iwl_bg_monitor_recover(unsigned long data); | 595 | void iwl_bg_monitor_recover(unsigned long data); |
596 | u32 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 |
596 | int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state); | 601 | int 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 | |||
1065 | struct iwl_priv { | 1081 | struct 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 | */ | ||
183 | static 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 | */ | ||
194 | static 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 | |||
679 | static 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 | |||
698 | static __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 | |||
717 | static int iwl3945_get_measurement(struct iwl_priv *priv, | 668 | static 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; |