msm_rmnet.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
  2. /*
  3. * Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #ifndef _UAPI_MSM_RMNET_H_
  7. #define _UAPI_MSM_RMNET_H_
  8. #include <linux/types.h>
  9. /* Bitmap macros for RmNET driver operation mode. */
  10. #define RMNET_MODE_NONE (0x00)
  11. #define RMNET_MODE_LLP_ETH (0x01)
  12. #define RMNET_MODE_LLP_IP (0x02)
  13. #define RMNET_MODE_QOS (0x04)
  14. #define RMNET_MODE_MASK (RMNET_MODE_LLP_ETH | \
  15. RMNET_MODE_LLP_IP | \
  16. RMNET_MODE_QOS)
  17. #define RMNET_IS_MODE_QOS(mode) \
  18. ((mode & RMNET_MODE_QOS) == RMNET_MODE_QOS)
  19. #define RMNET_IS_MODE_IP(mode) \
  20. ((mode & RMNET_MODE_LLP_IP) == RMNET_MODE_LLP_IP)
  21. /**
  22. * IOCTL commands
  23. * Values chosen to not conflict with other drivers in the ecosystem
  24. */
  25. #define RMNET_IOCTL_SET_LLP_ETHERNET 0x000089F1 /* Set Ethernet protocol */
  26. #define RMNET_IOCTL_SET_LLP_IP 0x000089F2 /* Set RAWIP protocol */
  27. #define RMNET_IOCTL_GET_LLP 0x000089F3 /* Get link protocol */
  28. #define RMNET_IOCTL_SET_QOS_ENABLE 0x000089F4 /* Set QoS header enabled */
  29. #define RMNET_IOCTL_SET_QOS_DISABLE 0x000089F5 /* Set QoS header disabled*/
  30. #define RMNET_IOCTL_GET_QOS 0x000089F6 /* Get QoS header state */
  31. #define RMNET_IOCTL_GET_OPMODE 0x000089F7 /* Get operation mode */
  32. #define RMNET_IOCTL_OPEN 0x000089F8 /* Open transport port */
  33. #define RMNET_IOCTL_CLOSE 0x000089F9 /* Close transport port */
  34. #define RMNET_IOCTL_FLOW_ENABLE 0x000089FA /* Flow enable */
  35. #define RMNET_IOCTL_FLOW_DISABLE 0x000089FB /* Flow disable */
  36. #define RMNET_IOCTL_FLOW_SET_HNDL 0x000089FC /* Set flow handle */
  37. #define RMNET_IOCTL_EXTENDED 0x000089FD /* Extended IOCTLs */
  38. #define RMNET_IOCTL_EXTENDED_V2 0x000089FE /* Extended V2 IOCTLs */
  39. /* RmNet Data Required IOCTLs */
  40. #define RMNET_IOCTL_GET_SUPPORTED_FEATURES 0x0000 /* Get features */
  41. #define RMNET_IOCTL_SET_MRU 0x0001 /* Set MRU */
  42. #define RMNET_IOCTL_GET_MRU 0x0002 /* Get MRU */
  43. #define RMNET_IOCTL_GET_EPID 0x0003 /* Get endpoint ID */
  44. #define RMNET_IOCTL_GET_DRIVER_NAME 0x0004 /* Get driver name */
  45. #define RMNET_IOCTL_ADD_MUX_CHANNEL 0x0005 /* Add MUX ID */
  46. #define RMNET_IOCTL_SET_EGRESS_DATA_FORMAT 0x0006 /* Set EDF */
  47. #define RMNET_IOCTL_SET_INGRESS_DATA_FORMAT 0x0007 /* Set IDF */
  48. #define RMNET_IOCTL_SET_AGGREGATION_COUNT 0x0008 /* Set agg count */
  49. #define RMNET_IOCTL_GET_AGGREGATION_COUNT 0x0009 /* Get agg count */
  50. #define RMNET_IOCTL_SET_AGGREGATION_SIZE 0x000A /* Set agg size */
  51. #define RMNET_IOCTL_GET_AGGREGATION_SIZE 0x000B /* Get agg size */
  52. #define RMNET_IOCTL_FLOW_CONTROL 0x000C /* Do flow control */
  53. #define RMNET_IOCTL_GET_DFLT_CONTROL_CHANNEL 0x000D /* For legacy use */
  54. #define RMNET_IOCTL_GET_HWSW_MAP 0x000E /* Get HW/SW map */
  55. #define RMNET_IOCTL_SET_RX_HEADROOM 0x000F /* RX Headroom */
  56. #define RMNET_IOCTL_GET_EP_PAIR 0x0010 /* Endpoint pair */
  57. #define RMNET_IOCTL_SET_QOS_VERSION 0x0011 /* 8/6 byte QoS hdr*/
  58. #define RMNET_IOCTL_GET_QOS_VERSION 0x0012 /* 8/6 byte QoS hdr*/
  59. #define RMNET_IOCTL_GET_SUPPORTED_QOS_MODES 0x0013 /* Get QoS modes */
  60. #define RMNET_IOCTL_SET_SLEEP_STATE 0x0014 /* Set sleep state */
  61. #define RMNET_IOCTL_SET_XLAT_DEV_INFO 0x0015 /* xlat dev name */
  62. #define RMNET_IOCTL_DEREGISTER_DEV 0x0016 /* Dereg a net dev */
  63. #define RMNET_IOCTL_GET_SG_SUPPORT 0x0017 /* Query sg support*/
  64. #define RMNET_IOCTL_SET_OFFLOAD 0x0018 /* Set IPA offload */
  65. #define RMNET_IOCTL_GET_MTU 0x0019 /* Get v4/v6 MTU */
  66. #define RMNET_IOCTL_SET_MTU 0x0020 /* Set v4/v6 MTU */
  67. #define RMNET_IOCTL_GET_EPID_LL 0x0021 /* Get LL ep ID */
  68. #define RMNET_IOCTL_GET_EP_PAIR_LL 0x0022 /* LL ep pair */
  69. /**
  70. * RMNET_IOCTL_EXTENDED_V2 ioctl types.
  71. * Should be sent through "extended_ioctl_type" variable.
  72. * Any number of new IOCTL type can be added.
  73. */
  74. /**
  75. * Set EDF with config values
  76. * Includes all the egress pipe's config in one single ioctl
  77. */
  78. #define RMNET_IOCTL_SET_EGRESS_DATA_FORMAT_V2 0x0000
  79. /**
  80. * Set IDF with config values
  81. * Includes all the ingress pipe's config in one single ioctl
  82. */
  83. #define RMNET_IOCTL_SET_INGRESS_DATA_FORMAT_V2 0x0001
  84. /* Return values for the RMNET_IOCTL_GET_SUPPORTED_FEATURES IOCTL */
  85. #define RMNET_IOCTL_FEAT_NOTIFY_MUX_CHANNEL (1<<0)
  86. #define RMNET_IOCTL_FEAT_SET_EGRESS_DATA_FORMAT (1<<1)
  87. #define RMNET_IOCTL_FEAT_SET_INGRESS_DATA_FORMAT (1<<2)
  88. #define RMNET_IOCTL_FEAT_SET_AGGREGATION_COUNT (1<<3)
  89. #define RMNET_IOCTL_FEAT_GET_AGGREGATION_COUNT (1<<4)
  90. #define RMNET_IOCTL_FEAT_SET_AGGREGATION_SIZE (1<<5)
  91. #define RMNET_IOCTL_FEAT_GET_AGGREGATION_SIZE (1<<6)
  92. #define RMNET_IOCTL_FEAT_FLOW_CONTROL (1<<7)
  93. #define RMNET_IOCTL_FEAT_GET_DFLT_CONTROL_CHANNEL (1<<8)
  94. #define RMNET_IOCTL_FEAT_GET_HWSW_MAP (1<<9)
  95. /* Input values for the RMNET_IOCTL_SET_EGRESS_DATA_FORMAT IOCTL */
  96. #define RMNET_IOCTL_EGRESS_FORMAT_MAP (1<<1)
  97. #define RMNET_IOCTL_EGRESS_FORMAT_AGGREGATION (1<<2)
  98. #define RMNET_IOCTL_EGRESS_FORMAT_MUXING (1<<3)
  99. #define RMNET_IOCTL_EGRESS_FORMAT_CHECKSUM (1<<4)
  100. /* Input values for the RMNET_IOCTL_SET_INGRESS_DATA_FORMAT IOCTL */
  101. #define RMNET_IOCTL_INGRESS_FORMAT_MAP (1<<1)
  102. #define RMNET_IOCTL_INGRESS_FORMAT_DEAGGREGATION (1<<2)
  103. #define RMNET_IOCTL_INGRESS_FORMAT_DEMUXING (1<<3)
  104. #define RMNET_IOCTL_INGRESS_FORMAT_CHECKSUM (1<<4)
  105. #define RMNET_IOCTL_INGRESS_FORMAT_AGG_DATA (1<<5)
  106. /* Input values for the RMNET_IOCTL_SET_OFFLOAD */
  107. #define RMNET_IOCTL_OFFLOAD_FORMAT_NONE (0)
  108. #define RMNET_IOCTL_COALESCING_FORMAT_TCP (1<<0)
  109. #define RMNET_IOCTL_COALESCING_FORMAT_UDP (1<<1)
  110. /* User space may not have this defined. */
  111. #ifndef IFNAMSIZ
  112. #define IFNAMSIZ 16
  113. #endif
  114. /**
  115. * enum rmnet_egress_ep_type - To specify pipe type for egress
  116. * @RMNET_EGRESS_DEFAULT: WAN Producer pipe
  117. * @RMNET_EGRESS_LOW_LAT_CTRL: Low latency ctrl producer pipe
  118. * @RMNET_EGRESS_LOW_LAT_DATA: Low latency data producer pipe
  119. * Add any number of pipes before max
  120. */
  121. enum rmnet_egress_ep_type {
  122. RMNET_EGRESS_DEFAULT = 0x0000,
  123. RMNET_EGRESS_LOW_LAT_CTRL = 0x0001,
  124. RMNET_EGRESS_LOW_LAT_DATA = 0x0002,
  125. RMNET_EGRESS_MAX = 0x0003,
  126. };
  127. /**
  128. * enum rmnet_ingress_ep_type - To specify pipe type for ingress
  129. * @RMNET_INGRESS_COALS: Coalescing Consumer pipe
  130. * @RMNET_INGRESS_DEFAULT: WAN Consumer pipe
  131. * @RMNET_INGRESS_LOW_LAT_CTRL: Low latency ctrl consumer pipe
  132. * @RMNET_INGRESS_LOW_LAT_DATA: Low latency data consumer pipe
  133. * Add any number of pipes before max
  134. */
  135. enum rmnet_ingress_ep_type {
  136. RMNET_INGRESS_COALS = 0x0000,
  137. RMNET_INGRESS_DEFAULT = 0x0001,
  138. RMNET_INGRESS_LOW_LAT_CTRL = 0x0002,
  139. RMNET_INGRESS_LOW_LAT_DATA = 0x0003,
  140. RMNET_INGRESS_MAX = 0x0004,
  141. };
  142. /**
  143. * enum rmnet_egress_ingress_pipe_setup_status - To give
  144. * back the pipe setup status info to netmngr
  145. * @IPA_PIPE_SETUP_SUCCESS: pipe setup successful
  146. * @IPA_PIPE_SETUP_FAILURE: pipe setup failure
  147. * @IPA_PIPE_SETUP_EXISTS: pipe already exists
  148. */
  149. enum rmnet_egress_ingress_pipe_setup_status {
  150. IPA_PIPE_SETUP_SUCCESS = 0x0000,
  151. IPA_PIPE_SETUP_FAILURE = 0x0001,
  152. IPA_PIPE_SETUP_EXISTS = 0x0002,
  153. };
  154. /**
  155. * struct rmnet_egress_param - Include all the egress params that
  156. * needs to be configured. Structure should have even
  157. * __u32 variables or add padding.
  158. * @egress_ep_type: Should be from rmnet_egress_ep_type
  159. * @pipe_setup_status: Out parameter.
  160. * Need to place below enum
  161. * rmnet_egress_ingress_pipe_setup_status
  162. * @cs_offload_en: Checksum offload (1 - Enable)
  163. * @aggr_en: Aggregation Enable (1 - Enable)
  164. * @ulso_en: (1 - Enable)
  165. * @ipid_min_max_idx(for ULSO): A value from the range [0, 2] determines
  166. * the registers pair from which to read the minimum and maximum of
  167. * IPv4 packets ID.
  168. * @int_modt: GSI event ring interrupt moderation time
  169. * cycles base interrupt moderation (32KHz clock)
  170. * @int_modc: GSI event ring interrupt moderation packet counter
  171. */
  172. struct rmnet_egress_param {
  173. __u32 egress_ep_type;
  174. __u32 pipe_setup_status;
  175. __u32 cs_offload_en;
  176. __u32 aggr_en;
  177. __u32 ulso_en;
  178. __u32 ipid_min_max_idx;
  179. __u32 int_modt;
  180. __u32 int_modc;
  181. };
  182. /**
  183. * struct rmnet_ingress_param - Include all the ingress params that
  184. * needs to be configured. Structure should have even
  185. * __u32 variables or add padding.
  186. * @ingress_ep_type: Should be from rmnet_ingress_ep_type
  187. * @pipe_setup_status: Out parameter.
  188. * Need to place below enum
  189. * rmnet_egress_ingress_pipe_setup_status
  190. * @cs_offload_en: Checksum offload (1 - Enable)
  191. * @buff_size: Actual buff size of rx_pkt
  192. * @agg_byte_limit: Aggregation byte limit
  193. * @agg_time_limit: Aggregation time limit
  194. * @agg_pkt_limit: Aggregation packet limit
  195. * @int_modt: GSI event ring interrupt moderation time
  196. * cycles base interrupt moderation (32KHz clock)
  197. * @int_modc: GSI event ring interrupt moderation packet counter
  198. * @padding: To make it 64 bit packed structure
  199. */
  200. struct rmnet_ingress_param {
  201. __u32 ingress_ep_type;
  202. __u32 pipe_setup_status;
  203. __u32 cs_offload_en;
  204. __u32 buff_size;
  205. __u32 agg_byte_limit;
  206. __u32 agg_time_limit;
  207. __u32 agg_pkt_limit;
  208. __u32 int_modt;
  209. __u32 int_modc;
  210. __u32 padding;
  211. };
  212. /**
  213. * Following uapi coding convention here
  214. * struct mystruct {
  215. * __u64 pointer;
  216. * };
  217. *
  218. * In userspace code:
  219. * mystruct.pointer = (__u64)(uintptr_t) &pointer;
  220. * In kernelspace code:
  221. * copy_from_user(&struct, u64_to_user_ptr(mystruct.pointer), size);
  222. */
  223. /**
  224. * struct ingress_format_v2 - To include all the ingress params that
  225. * needs to be configured. Structure should have even
  226. * __u32 variables or add padding.
  227. * @ingress_param_ptr: Should be rmnet_ingress_param pointer.
  228. * Array of ingress params for all the pipes.
  229. * @ingress_param_size: = sizeof(rmnet_ingress_param);
  230. * @number_of_eps: Number of ep_types, should be = RMNET_INGRESS_MAX
  231. */
  232. struct ingress_format_v2 {
  233. __u64 ingress_param_ptr;
  234. __u32 ingress_param_size;
  235. __u32 number_of_eps;
  236. };
  237. /**
  238. * struct egress_format_v2 - To include all the egress params that
  239. * needs to be configured. Structure should have even
  240. * __u32 variables or add padding.
  241. * @egress_param_ptr: Should be rmnet_egress_param pointer.
  242. * Array of egress params for all the pipes.
  243. * @egress_param_size: = sizeof(rmnet_egress_param);
  244. * @number_of_eps: Number of ep_types, should be = RMNET_EGRESS_MAX.
  245. */
  246. struct egress_format_v2 {
  247. __u64 egress_param_ptr;
  248. __u32 egress_param_size;
  249. __u32 number_of_eps;
  250. };
  251. /**
  252. * struct rmnet_ioctl_extended_s_v2: New structure to include any number of
  253. * ioctl of any size. Structure should have even
  254. * __u32 variables or add padding.
  255. * @ioctl_data_size: Eg: For egress ioctl
  256. * = sizeof(egress_format_v2)
  257. * @ioctl_ptr: Has to be typecasted to (__u64)(uintptr_t).
  258. * @extended_v2_ioctl_type: Should be hash defined above similar
  259. * to RMNET_IOCTL_SET_EGRESS_DATA_FORMAT_V2.
  260. */
  261. struct rmnet_ioctl_extended_s_v2 {
  262. __u64 ioctl_ptr;
  263. __u32 ioctl_data_size;
  264. __u32 extended_v2_ioctl_type;
  265. };
  266. struct rmnet_ioctl_extended_s {
  267. __u32 extended_ioctl;
  268. union {
  269. __u32 data; /* Generic data field for most extended IOCTLs */
  270. /* Return values for
  271. * RMNET_IOCTL_GET_DRIVER_NAME
  272. * RMNET_IOCTL_GET_DFLT_CONTROL_CHANNEL
  273. */
  274. __s8 if_name[IFNAMSIZ];
  275. /* Input values for the RMNET_IOCTL_ADD_MUX_CHANNEL IOCTL */
  276. struct {
  277. __u32 mux_id;
  278. __s8 vchannel_name[IFNAMSIZ];
  279. } rmnet_mux_val;
  280. /* Input values for the RMNET_IOCTL_FLOW_CONTROL IOCTL */
  281. struct {
  282. __u8 flow_mode;
  283. __u8 mux_id;
  284. } flow_control_prop;
  285. /* Return values for RMNET_IOCTL_GET_EP_PAIR */
  286. struct {
  287. __u32 consumer_pipe_num;
  288. __u32 producer_pipe_num;
  289. } ipa_ep_pair;
  290. struct {
  291. __u32 __data; /* Placeholder for legacy data*/
  292. __u32 agg_size;
  293. __u32 agg_count;
  294. } ingress_format;
  295. /* Input values for the RMNET_IOCTL_SET_OFFLOAD */
  296. struct {
  297. __u32 flags;
  298. __u8 mux_id;
  299. } offload_params;
  300. /* Input values for the RMNET_IOCTL_SET_MTU */
  301. struct {
  302. __s8 if_name[IFNAMSIZ];
  303. /* if given non-zero value, mtu has changed */
  304. __u16 mtu_v4;
  305. __u16 mtu_v6;
  306. } mtu_params;
  307. } u;
  308. };
  309. struct rmnet_ioctl_data_s {
  310. union {
  311. __u32 operation_mode;
  312. __u32 tcm_handle;
  313. } u;
  314. };
  315. #define RMNET_IOCTL_QOS_MODE_6 (1<<0)
  316. #define RMNET_IOCTL_QOS_MODE_8 (1<<1)
  317. /* QMI QoS header definition */
  318. struct QMI_QOS_HDR_S {
  319. unsigned char version;
  320. unsigned char flags;
  321. __u32 flow_id;
  322. } __attribute((__packed__));
  323. /* QMI QoS 8-byte header. */
  324. struct qmi_qos_hdr8_s {
  325. struct QMI_QOS_HDR_S hdr;
  326. __u8 reserved[2];
  327. } __attribute((__packed__));
  328. #endif /* _UAPI_MSM_RMNET_H_ */