GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / net / wireless / realtek / rtw89 / util.h
1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2  * Copyright(c) 2019-2020  Realtek Corporation
3  */
4 #ifndef __RTW89_UTIL_H__
5 #define __RTW89_UTIL_H__
6
7 #include "core.h"
8
9 #define rtw89_iterate_vifs_bh(rtwdev, iterator, data)                          \
10         ieee80211_iterate_active_interfaces_atomic((rtwdev)->hw,               \
11                         IEEE80211_IFACE_ITER_NORMAL, iterator, data)
12
13 /* call this function with rtwdev->mutex is held */
14 #define rtw89_for_each_rtwvif(rtwdev, rtwvif)                                  \
15         list_for_each_entry(rtwvif, &(rtwdev)->rtwvifs_list, list)
16
17 /* The result of negative dividend and positive divisor is undefined, but it
18  * should be one case of round-down or round-up. So, make it round-down if the
19  * result is round-up.
20  * Note: the maximum value of divisor is 0x7FFF_FFFF, because we cast it to
21  *       signed value to make compiler to use signed divide instruction.
22  */
23 static inline s32 s32_div_u32_round_down(s32 dividend, u32 divisor, s32 *remainder)
24 {
25         s32 i_divisor = (s32)divisor;
26         s32 i_remainder;
27         s32 quotient;
28
29         quotient = dividend / i_divisor;
30         i_remainder = dividend % i_divisor;
31
32         if (i_remainder < 0) {
33                 quotient--;
34                 i_remainder += i_divisor;
35         }
36
37         if (remainder)
38                 *remainder = i_remainder;
39         return quotient;
40 }
41
42 static inline s32 s32_div_u32_round_closest(s32 dividend, u32 divisor)
43 {
44         return s32_div_u32_round_down(dividend + divisor / 2, divisor, NULL);
45 }
46
47 #endif