aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl3945-base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c56
1 files changed, 3 insertions, 53 deletions
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;