diff options
| author | gaolez <gaolez@codeaurora.org> | 2017-12-07 16:23:38 +0800 |
|---|---|---|
| committer | snandini <snandini@codeaurora.org> | 2017-12-15 03:27:23 -0800 |
| commit | 75fa4c5d052104dff46a110ae0602c0a1ef3fc91 (patch) | |
| tree | 0c39b7be54a97ff8d9d32c8fb1224b027d1c4539 | |
| parent | b5620fbe6c675bb540fee7586d689ca14a6f312b (diff) | |
qcacld-2.0: fix compatible issue for timestamping feature
Use do_div() for 64 bit division, because '/' can't be used for 64
bit division on arm32 platform.
In arm32 platform the pointer value is 32bit, so change the directly
assignment operation to memcpy.
Change-Id: I19a1db8adbc1fe7acaee0ec824f670b67284f628
CRs-Fixed: 2155143
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_tsf.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/CORE/HDD/src/wlan_hdd_tsf.c b/CORE/HDD/src/wlan_hdd_tsf.c index 4049f2bc6afa..7544b98dcb29 100644 --- a/CORE/HDD/src/wlan_hdd_tsf.c +++ b/CORE/HDD/src/wlan_hdd_tsf.c @@ -271,9 +271,6 @@ static enum hdd_tsf_op_result hdd_indicate_tsf_internal( */ #define WLAN_HDD_CAPTURE_TSF_INTERVAL_SEC 10 #define WLAN_HDD_CAPTURE_TSF_INIT_INTERVAL_MS 100 -#define NORMAL_INTERVAL_TARGET \ - ((int64_t)((int64_t)WLAN_HDD_CAPTURE_TSF_INTERVAL_SEC * \ - NSEC_PER_SEC / HOST_TO_TARGET_TIME_RATIO)) #define OVERFLOW_INDICATOR32 (((int64_t)0x1) << 32) #define MAX_UINT64 ((uint64_t)0xffffffffffffffff) #define MASK_UINT32 0xffffffff @@ -550,6 +547,7 @@ static inline int32_t hdd_get_hosttime_from_targettime( int32_t ret = -EINVAL; int64_t delta32_target; bool in_cap_state; + int64_t normal_interval_target_value; in_cap_state = hdd_tsf_is_in_cap(adapter); @@ -564,11 +562,15 @@ static inline int32_t hdd_get_hosttime_from_targettime( delta32_target = (int64_t)((target_time & MASK_UINT32) - (adapter->last_target_time & MASK_UINT32)); + normal_interval_target_value = + (int64_t)WLAN_HDD_CAPTURE_TSF_INTERVAL_SEC * NSEC_PER_SEC; + do_div(normal_interval_target_value, HOST_TO_TARGET_TIME_RATIO); + if (delta32_target < - (NORMAL_INTERVAL_TARGET - OVERFLOW_INDICATOR32)) + (normal_interval_target_value - OVERFLOW_INDICATOR32)) delta32_target += OVERFLOW_INDICATOR32; else if (delta32_target > - (OVERFLOW_INDICATOR32 - NORMAL_INTERVAL_TARGET)) + (OVERFLOW_INDICATOR32 - normal_interval_target_value)) delta32_target -= OVERFLOW_INDICATOR32; ret = hdd_64bit_plus(adapter->last_host_time, @@ -892,8 +894,13 @@ int hdd_stop_tsf_sync(hdd_adapter_t *adapter) int hdd_tx_timestamp(adf_nbuf_t netbuf, uint64_t target_time) { - struct sock *sk = - (netbuf->sk ? netbuf->sk : (struct sock *)netbuf->tstamp.tv64); + struct sock *sk = NULL; + + if (netbuf->sk != NULL) + sk = netbuf->sk; + else + memcpy((void *)(&sk), (void *)(&netbuf->tstamp.tv64), + sizeof(sk)); if (!sk) return -EINVAL; @@ -1050,7 +1057,8 @@ hdd_tsf_record_sk_for_skb(hdd_context_t *hdd_ctx, adf_nbuf_t nbuf) * be set to NULL in skb_orphan(). */ if (HDD_TSF_IS_TX_SET(hdd_ctx)) - nbuf->tstamp.tv64 = (s64)nbuf->sk; + memcpy((void *)(&nbuf->tstamp.tv64), (void *)(&nbuf->sk), + sizeof(nbuf->sk)); } #else static inline void hdd_update_tsf(hdd_adapter_t *adapter, uint64_t tsf) |
