1 /****************************************************************************
3 * Copyright (c) 2012 - 2017 Samsung Electronics Co., Ltd. All rights reserved
5 ****************************************************************************/
10 #include <linux/kernel.h>
17 #define WLAN_OUI_CISCO 0x004096 /* Cisco systems OUI */
18 #define WLAN_OUI_TYPE_CISCO_EDCA 0x09
20 #define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
21 #define WMM_OUI_SUBTYPE_PARAMETER_ELEMENT 1
22 #define WMM_OUI_SUBTYPE_TSPEC_ELEMENT 2
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
30 #define WMM_ADDTS_STATUS_REFUSED 3
31 /* 4-255 - Reserved */
33 /* WMM TSPEC Direction Field Values */
34 #define WMM_TSPEC_DIRECTION_UPLINK 0
35 #define WMM_TSPEC_DIRECTION_DOWNLINK 1
37 #define WMM_TSPEC_DIRECTION_BI_DIRECTIONAL 3
39 /* WMM TSPEC PSB Field Values */
40 #define WMM_TSPEC_PSB_UNSPECIFIED 2
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
51 #define TSINFO_MASK 0x00FFFFFF
53 #define CCX_MAX_NUM_RATES 8
58 #define TSRS_RATE_PER_UNIT 500000
59 #define IEEE80211_HEADER_SIZE 24
61 #define MAX_TRANSMIT_MSDU_LIFETIME_NOT_VALID -1
62 #define BSS_CCX_DISABLED 0
63 #define BSS_CCX_ENABLED 1
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) \
69 (a)[1] = ((u16)(val)) >> 8; \
70 (a)[0] = ((u16)(val)) & 0xff; \
72 #define CAC_PUT_BE24(a, val) \
74 (a)[0] = (u8)((((u32)(val)) >> 16) & 0xff); \
75 (a)[1] = (u8)((((u32)(val)) >> 8) & 0xff); \
76 (a)[2] = (u8)(((u32)(val)) & 0xff); \
78 #define CAC_GET_LE24(a) ((((u32)(a)[2]) << 16) | (((u32)(a)[1]) << 8) | ((u32)(a)[0]))
79 #define CAC_PUT_LE24(a, val) \
81 (a)[2] = (u8)((((u32)(val)) >> 16) & 0xff); \
82 (a)[1] = (u8)((((u32)(val)) >> 8) & 0xff); \
83 (a)[0] = (u8)(((u32)(val)) & 0xff); \
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) \
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); \
95 #define IEEE80211_FC(type, stype) (u16)(type | stype)
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 */
103 u8 oui_subtype
; /* 2 */
105 /* WMM TSPEC body (55 octets): */
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
;
117 u32 maximum_burst_size
;
119 u32 minimum_phy_rate
;
120 u16 surplus_bandwidth_allowance
;
124 #define MSDU_LIFETIME_DEFAULT 512
126 struct cac_activated_tspec
{
127 struct wmm_tspec_element tspec
;
140 struct cac_tspec
*next
;
142 struct wmm_tspec_element tspec
;
149 #define OFFSETOF(m) ((size_t)&((struct wmm_tspec_element *)0)->m)
151 struct wmm_action_hdr
{
158 struct action_addts_req
{
159 struct wmm_action_hdr hdr
;
160 struct wmm_tspec_element tspec
;
163 struct action_addts_rsp
{
164 struct wmm_action_hdr hdr
;
167 struct action_delts_req
{
168 struct wmm_action_hdr hdr
;
169 struct wmm_tspec_element tspec
;
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
);