[RAMEN9610-20413][9610] wlbt: SCSC Driver version 10.6.1.0
[GitHub/MotorolaMobilityLLC/kernel-slsi.git] / drivers / net / wireless / scsc / cac.h
1 /****************************************************************************
2 *
3 * Copyright (c) 2012 - 2017 Samsung Electronics Co., Ltd. All rights reserved
4 *
5 ****************************************************************************/
6
7 #ifndef CAC_H
8 #define CAC_H
9
10 #include <linux/kernel.h>
11 #include "dev.h"
12 #include "debug.h"
13 #include "mlme.h"
14 #include "mgt.h"
15
16 /* management */
17 #define WLAN_OUI_CISCO 0x004096 /* Cisco systems OUI */
18 #define WLAN_OUI_TYPE_CISCO_EDCA 0x09
19
20 #define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
21 #define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1
22 #define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2
23 #define WMM_VERSION 1
24 #define WMM_ACTION_CODE_ADDTS_REQ 0
25 #define WMM_ACTION_CODE_ADDTS_RESP 1
26 #define WMM_ACTION_CODE_DELTS 2
27 #define WMM_ADDTS_STATUS_ADMISSION_ACCEPTED 0
28 #define WMM_ADDTS_STATUS_INVALID_PARAMETERS 1
29 /* 2 - Reserved */
30 #define WMM_ADDTS_STATUS_REFUSED 3
31 /* 4-255 - Reserved */
32
33 /* WMM TSPEC Direction Field Values */
34 #define WMM_TSPEC_DIRECTION_UPLINK 0
35 #define WMM_TSPEC_DIRECTION_DOWNLINK 1
36 /* 2 - Reserved */
37 #define WMM_TSPEC_DIRECTION_BI_DIRECTIONAL 3
38
39 /* WMM TSPEC PSB Field Values */
40 #define WMM_TSPEC_PSB_UNSPECIFIED 2
41
42 #define ADDTS_STATUS_ACCEPTED 0x00
43 #define ADDTS_STATUS_INVALID_PARAM 0x01
44 #define ADDTS_STATUS_REFUSED 0x03
45 #define ADDTS_STATUS_DELAY 0x2F
46 #define ADDTS_STATUS_UNSPECIFIED 0xC8
47 #define ADDTS_STATUS_POLICY_CONFIG 0xC9
48 #define ADDTS_STATUS_ASSOC_DENIED 0xCA
49 #define ADDTS_STATUS_INVALID_PARAM2 0xCB
50
51 #define TSINFO_MASK 0x00FFFFFF
52
53 #define CCX_MAX_NUM_RATES 8
54
55 #define TSID_MIN 0
56 #define TSID_MAX 7
57
58 #define TSRS_RATE_PER_UNIT 500000
59 #define IEEE80211_HEADER_SIZE 24
60
61 #define MAX_TRANSMIT_MSDU_LIFETIME_NOT_VALID -1
62 #define BSS_CCX_DISABLED 0
63 #define BSS_CCX_ENABLED 1
64
65 /* Macros for handling unaligned memory accesses */
66 #define CAC_GET_LE16(a) ((u16)(((a)[1] << 8) | (a)[0]))
67 #define CAC_PUT_LE16(a, val) \
68 do { \
69 (a)[1] = ((u16)(val)) >> 8; \
70 (a)[0] = ((u16)(val)) & 0xff; \
71 } while (0)
72 #define CAC_PUT_BE24(a, val) \
73 do { \
74 (a)[0] = (u8)((((u32)(val)) >> 16) & 0xff); \
75 (a)[1] = (u8)((((u32)(val)) >> 8) & 0xff); \
76 (a)[2] = (u8)(((u32)(val)) & 0xff); \
77 } while (0)
78 #define CAC_GET_LE24(a) ((((u32)(a)[2]) << 16) | (((u32)(a)[1]) << 8) | ((u32)(a)[0]))
79 #define CAC_PUT_LE24(a, val) \
80 do { \
81 (a)[2] = (u8)((((u32)(val)) >> 16) & 0xff); \
82 (a)[1] = (u8)((((u32)(val)) >> 8) & 0xff); \
83 (a)[0] = (u8)(((u32)(val)) & 0xff); \
84 } while (0)
85 #define CAC_GET_LE32(a) ((((u32)(a)[3]) << 24) | (((u32)(a)[2]) << 16) | \
86 (((u32)(a)[1]) << 8) | ((u32)(a)[0]))
87 #define CAC_PUT_LE32(a, val) \
88 do { \
89 (a)[3] = (u8)((((u32)(val)) >> 24) & 0xff); \
90 (a)[2] = (u8)((((u32)(val)) >> 16) & 0xff); \
91 (a)[1] = (u8)((((u32)(val)) >> 8) & 0xff); \
92 (a)[0] = (u8)(((u32)(val)) & 0xff); \
93 } while (0)
94
95 #define IEEE80211_FC(type, stype) (u16)(type | stype)
96
97 /* WMM TSPEC Element */
98 struct wmm_tspec_element {
99 char eid; /* 221 = 0xdd */
100 u8 length; /* 6 + 55 = 61 */
101 u8 oui[3]; /* 00:50:f2 */
102 u8 oui_type; /* 2 */
103 u8 oui_subtype; /* 2 */
104 u8 version; /* 1 */
105 /* WMM TSPEC body (55 octets): */
106 u8 ts_info[3];
107 u16 nominal_msdu_size;
108 u16 maximum_msdu_size;
109 u32 minimum_service_interval;
110 u32 maximum_service_interval;
111 u32 inactivity_interval;
112 u32 suspension_interval;
113 u32 service_start_time;
114 u32 minimum_data_rate;
115 u32 mean_data_rate;
116 u32 peak_data_rate;
117 u32 maximum_burst_size;
118 u32 delay_bound;
119 u32 minimum_phy_rate;
120 u16 surplus_bandwidth_allowance;
121 u16 medium_time;
122 } __packed;
123
124 #define MSDU_LIFETIME_DEFAULT 512
125
126 struct cac_activated_tspec {
127 struct wmm_tspec_element tspec;
128 int ebw;
129 };
130
131 struct tspec_field {
132 const char *name;
133 int read_only;
134 int is_tsinfo_field;
135 u8 size;
136 u32 offset;
137 };
138
139 struct cac_tspec {
140 struct cac_tspec *next;
141 int id;
142 struct wmm_tspec_element tspec;
143 u8 psb_specified;
144 int ebw;
145 int accepted;
146 u8 dialog_token;
147 };
148
149 #define OFFSETOF(m) ((size_t)&((struct wmm_tspec_element *)0)->m)
150
151 struct wmm_action_hdr {
152 u8 category;
153 u8 action;
154 u8 dialog_token;
155 u8 status_code;
156 } __packed;
157
158 struct action_addts_req {
159 struct wmm_action_hdr hdr;
160 struct wmm_tspec_element tspec;
161 } __packed;
162
163 struct action_addts_rsp {
164 struct wmm_action_hdr hdr;
165 } __packed;
166
167 struct action_delts_req {
168 struct wmm_action_hdr hdr;
169 struct wmm_tspec_element tspec;
170 } __packed;
171 /* prototypes for public functions */
172 int cac_ctrl_create_tspec(struct slsi_dev *sdev, char *args);
173 int cac_ctrl_config_tspec(struct slsi_dev *sdev, char *args);
174 int cac_ctrl_send_addts(struct slsi_dev *sdev, char *args);
175 int cac_ctrl_send_delts(struct slsi_dev *sdev, char *args);
176 int cac_update_local_tspec(struct slsi_dev *sdev, u16 msdu_lifetime, struct wmm_tspec_element *tspec);
177 int cac_get_active_tspecs(struct cac_activated_tspec **tspecs);
178 void cac_delete_tspec_list(struct slsi_dev *sdev);
179 int cac_ctrl_delete_tspec(struct slsi_dev *sdev, char *args);
180 void cac_rx_wmm_action(struct slsi_dev *sdev, struct net_device *netdev, struct ieee80211_mgmt *data, size_t len);
181 void cac_update_roam_traffic_params(struct slsi_dev *sdev, struct net_device *dev);
182 #endif /* CAC_H */