diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 56 |
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 | |||
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; |