hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/******************************************************************************
 *
 * Copyright(c) 2007 - 2022 Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 *****************************************************************************/
#ifndef __RTW_CHSET_H__
#define __RTW_CHSET_H__
 
enum rtw_ch_type {
   RTW_CHT_DIS        = 0,
   RTW_CHT_NO_IR        = 1,
   RTW_CHT_DFS        = 2,
   RTW_CHT_NO_HT40U    = 3,
   RTW_CHT_NO_HT40L    = 4,
   RTW_CHT_NO_80MHZ    = 5,
   RTW_CHT_NO_160MHZ    = 6,
   RTW_CHT_NUM,
};
 
extern const char *const _rtw_ch_type_str[];
#define rtw_ch_type_str(type) (((type) >= RTW_CHT_NUM) ? _rtw_ch_type_str[RTW_CHT_NUM] : _rtw_ch_type_str[(type)])
 
enum rtw_ch_type get_ch_type_from_str(const char *str, size_t str_len);
 
enum {
   RTW_CHF_DIS         = BIT(RTW_CHT_DIS),
   RTW_CHF_NO_IR        = BIT(RTW_CHT_NO_IR),
   RTW_CHF_DFS        = BIT(RTW_CHT_DFS),
   RTW_CHF_NO_HT40U    = BIT(RTW_CHT_NO_HT40U),
   RTW_CHF_NO_HT40L    = BIT(RTW_CHT_NO_HT40L),
   RTW_CHF_NO_80MHZ    = BIT(RTW_CHT_NO_80MHZ),
   RTW_CHF_NO_160MHZ    = BIT(RTW_CHT_NO_160MHZ),
};
 
#define RTW_CH_FLAGS_STR_LEN (45)
char *rtw_get_ch_flags_str(char *buf, u8 flags, char delim);
 
/* The channel information about this channel including joining, scanning, and power constraints. */
typedef struct _RT_CHANNEL_INFO {
   u8 band; /* enum band_type */
   u8 ChannelNum; /* The channel number. */
 
   /*
   * Bitmap and its usage:
   * RTW_CHF_DIS, RTW_CHF_NO_IR, RTW_CHF_DFS: is used to check for status
   * RTW_CHF_NO_HT40U, RTW_CHF_NO_HT40L, RTW_CHF_NO_80MHZ, RTW_CHF_NO_160MHZ: extra bandwidth limitation (ex: from regulatory)
   */
   u8 flags;
 
   bool reg_no_ir;
   systime bcn_hint_end_time;
 
#ifdef CONFIG_FIND_BEST_CHANNEL
   u32 rx_count;
#endif
 
#if CONFIG_IEEE80211_BAND_5GHZ && CONFIG_DFS
   #ifdef CONFIG_DFS_MASTER
   bool cac_done;
   systime non_ocp_end_time;
   #endif
#endif
 
   u8 hidden_bss_cnt; /* per scan count */
 
#if defined(CONFIG_IOCTL_CFG80211) && !RTW_PER_ADAPTER_WIPHY
   void *os_chan;
#endif
} RT_CHANNEL_INFO, *PRT_CHANNEL_INFO;
 
#define RTW_BCN_HINT_STOPPED 0 /* used by bcn_hint_end_time time stamps */
#define CH_IS_BCN_HINT_STOPPED(rt_ch_info) ((rt_ch_info)->bcn_hint_end_time == RTW_BCN_HINT_STOPPED)
#define CH_IS_BCN_HINT(rt_ch_info) (!CH_IS_BCN_HINT_STOPPED(rt_ch_info) && rtw_time_after((rt_ch_info)->bcn_hint_end_time, rtw_get_current_time()))
 
struct rtw_chset {
   RT_CHANNEL_INFO chs[MAX_CHANNEL_NUM];
   u8 chs_len;
   RT_CHANNEL_INFO *chs_of_band[BAND_MAX];
   u8 chs_len_of_band[BAND_MAX];
   u8 enable_ch_num;
};
 
int rtw_chset_init(struct rtw_chset *chset, u8 band_bmp);
 
RTW_FUNC_2G_5G_ONLY int rtw_chset_search_ch(const struct rtw_chset *chset, u32 ch);
RTW_FUNC_2G_5G_ONLY u8 rtw_chset_is_chbw_valid(const struct rtw_chset *chset, u8 ch, u8 bw, u8 offset
   , bool allow_primary_passive, bool allow_passive);
RTW_FUNC_2G_5G_ONLY void rtw_chset_sync_chbw(const struct rtw_chset *chset, u8 *req_ch, u8 *req_bw, u8 *req_offset
   , u8 *g_ch, u8 *g_bw, u8 *g_offset, bool allow_primary_passive, bool allow_passive);
int rtw_chset_search_bch(const struct rtw_chset *chset, enum band_type band, u32 ch);
RT_CHANNEL_INFO *rtw_chset_get_chinfo_by_bch(struct rtw_chset *chset, enum band_type band, u32 ch, bool include_dis);
u8 rtw_chset_is_bchbw_valid(const struct rtw_chset *chset, enum band_type band, u8 ch, u8 bw, u8 offset
   , bool allow_primary_passive, bool allow_passive);
void rtw_chset_sync_bchbw(const struct rtw_chset *chset, enum band_type *req_band, u8 *req_ch, u8 *req_bw, u8 *req_offset
   , enum band_type *g_band, u8 *g_ch, u8 *g_bw, u8 *g_offset, bool allow_primary_passive, bool allow_passive);
 
u8 *rtw_chset_set_spt_chs_ie(struct rtw_chset *chset, u8 *buf_pos, uint *buf_len);
 
#ifdef CONFIG_PROC_DEBUG
void dump_chinfos(void *sel, const RT_CHANNEL_INFO *chinfos, u8 chinfo_num);
#endif
 
#endif /* __RTW_CHSET_H__ */