1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0 */ 27612a43dSVitaly Kuzmichev /* 37612a43dSVitaly Kuzmichev * RNDIS Definitions for Remote NDIS 47612a43dSVitaly Kuzmichev * 57612a43dSVitaly Kuzmichev * Authors: Benedikt Spranger, Pengutronix 67612a43dSVitaly Kuzmichev * Robert Schwebel, Pengutronix 77612a43dSVitaly Kuzmichev * 87612a43dSVitaly Kuzmichev * This software was originally developed in conformance with 97612a43dSVitaly Kuzmichev * Microsoft's Remote NDIS Specification License Agreement. 107612a43dSVitaly Kuzmichev */ 117612a43dSVitaly Kuzmichev 127612a43dSVitaly Kuzmichev #ifndef _USBGADGET_RNDIS_H 137612a43dSVitaly Kuzmichev #define _USBGADGET_RNDIS_H 147612a43dSVitaly Kuzmichev 157612a43dSVitaly Kuzmichev #include "ndis.h" 167612a43dSVitaly Kuzmichev 17e4ae6660SVitaly Kuzmichev /* 18e4ae6660SVitaly Kuzmichev * By default rndis_signal_disconnect does not send status message about 19e4ae6660SVitaly Kuzmichev * RNDIS disconnection to USB host (indicated as cable disconnected). 20e4ae6660SVitaly Kuzmichev * Define RNDIS_COMPLETE_SIGNAL_DISCONNECT to send it. 21e4ae6660SVitaly Kuzmichev * However, this will cause 1 sec delay on Ethernet device halt. 22e4ae6660SVitaly Kuzmichev * Usually you do not need to define it. Mostly usable for debugging. 23e4ae6660SVitaly Kuzmichev */ 24e4ae6660SVitaly Kuzmichev 257612a43dSVitaly Kuzmichev #define RNDIS_MAXIMUM_FRAME_SIZE 1518 267612a43dSVitaly Kuzmichev #define RNDIS_MAX_TOTAL_SIZE 1558 277612a43dSVitaly Kuzmichev 287612a43dSVitaly Kuzmichev /* Remote NDIS Versions */ 297612a43dSVitaly Kuzmichev #define RNDIS_MAJOR_VERSION 1 307612a43dSVitaly Kuzmichev #define RNDIS_MINOR_VERSION 0 317612a43dSVitaly Kuzmichev 327612a43dSVitaly Kuzmichev /* Status Values */ 337612a43dSVitaly Kuzmichev #define RNDIS_STATUS_SUCCESS 0x00000000U /* Success */ 347612a43dSVitaly Kuzmichev #define RNDIS_STATUS_FAILURE 0xC0000001U /* Unspecified error */ 357612a43dSVitaly Kuzmichev #define RNDIS_STATUS_INVALID_DATA 0xC0010015U /* Invalid data */ 367612a43dSVitaly Kuzmichev #define RNDIS_STATUS_NOT_SUPPORTED 0xC00000BBU /* Unsupported request */ 377612a43dSVitaly Kuzmichev #define RNDIS_STATUS_MEDIA_CONNECT 0x4001000BU /* Device connected */ 387612a43dSVitaly Kuzmichev #define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000CU /* Device disconnected */ 397612a43dSVitaly Kuzmichev /* 407612a43dSVitaly Kuzmichev * For all not specified status messages: 417612a43dSVitaly Kuzmichev * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx 427612a43dSVitaly Kuzmichev */ 437612a43dSVitaly Kuzmichev 447612a43dSVitaly Kuzmichev /* Message Set for Connectionless (802.3) Devices */ 457612a43dSVitaly Kuzmichev #define REMOTE_NDIS_PACKET_MSG 0x00000001U 467612a43dSVitaly Kuzmichev #define REMOTE_NDIS_INITIALIZE_MSG 0x00000002U /* Initialize device */ 477612a43dSVitaly Kuzmichev #define REMOTE_NDIS_HALT_MSG 0x00000003U 487612a43dSVitaly Kuzmichev #define REMOTE_NDIS_QUERY_MSG 0x00000004U 497612a43dSVitaly Kuzmichev #define REMOTE_NDIS_SET_MSG 0x00000005U 507612a43dSVitaly Kuzmichev #define REMOTE_NDIS_RESET_MSG 0x00000006U 517612a43dSVitaly Kuzmichev #define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007U 527612a43dSVitaly Kuzmichev #define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008U 537612a43dSVitaly Kuzmichev 547612a43dSVitaly Kuzmichev /* Message completion */ 557612a43dSVitaly Kuzmichev #define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002U 567612a43dSVitaly Kuzmichev #define REMOTE_NDIS_QUERY_CMPLT 0x80000004U 577612a43dSVitaly Kuzmichev #define REMOTE_NDIS_SET_CMPLT 0x80000005U 587612a43dSVitaly Kuzmichev #define REMOTE_NDIS_RESET_CMPLT 0x80000006U 597612a43dSVitaly Kuzmichev #define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008U 607612a43dSVitaly Kuzmichev 617612a43dSVitaly Kuzmichev /* Device Flags */ 627612a43dSVitaly Kuzmichev #define RNDIS_DF_CONNECTIONLESS 0x00000001U 637612a43dSVitaly Kuzmichev #define RNDIS_DF_CONNECTION_ORIENTED 0x00000002U 647612a43dSVitaly Kuzmichev 657612a43dSVitaly Kuzmichev #define RNDIS_MEDIUM_802_3 0x00000000U 667612a43dSVitaly Kuzmichev 677612a43dSVitaly Kuzmichev /* from drivers/net/sk98lin/h/skgepnmi.h */ 687612a43dSVitaly Kuzmichev #define OID_PNP_CAPABILITIES 0xFD010100 697612a43dSVitaly Kuzmichev #define OID_PNP_SET_POWER 0xFD010101 707612a43dSVitaly Kuzmichev #define OID_PNP_QUERY_POWER 0xFD010102 717612a43dSVitaly Kuzmichev #define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103 727612a43dSVitaly Kuzmichev #define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104 737612a43dSVitaly Kuzmichev #define OID_PNP_ENABLE_WAKE_UP 0xFD010106 747612a43dSVitaly Kuzmichev 757612a43dSVitaly Kuzmichev 767612a43dSVitaly Kuzmichev typedef struct rndis_init_msg_type { 777612a43dSVitaly Kuzmichev __le32 MessageType; 787612a43dSVitaly Kuzmichev __le32 MessageLength; 797612a43dSVitaly Kuzmichev __le32 RequestID; 807612a43dSVitaly Kuzmichev __le32 MajorVersion; 817612a43dSVitaly Kuzmichev __le32 MinorVersion; 827612a43dSVitaly Kuzmichev __le32 MaxTransferSize; 837612a43dSVitaly Kuzmichev } rndis_init_msg_type; 847612a43dSVitaly Kuzmichev 857612a43dSVitaly Kuzmichev typedef struct rndis_init_cmplt_type { 867612a43dSVitaly Kuzmichev __le32 MessageType; 877612a43dSVitaly Kuzmichev __le32 MessageLength; 887612a43dSVitaly Kuzmichev __le32 RequestID; 897612a43dSVitaly Kuzmichev __le32 Status; 907612a43dSVitaly Kuzmichev __le32 MajorVersion; 917612a43dSVitaly Kuzmichev __le32 MinorVersion; 927612a43dSVitaly Kuzmichev __le32 DeviceFlags; 937612a43dSVitaly Kuzmichev __le32 Medium; 947612a43dSVitaly Kuzmichev __le32 MaxPacketsPerTransfer; 957612a43dSVitaly Kuzmichev __le32 MaxTransferSize; 967612a43dSVitaly Kuzmichev __le32 PacketAlignmentFactor; 977612a43dSVitaly Kuzmichev __le32 AFListOffset; 987612a43dSVitaly Kuzmichev __le32 AFListSize; 997612a43dSVitaly Kuzmichev } rndis_init_cmplt_type; 1007612a43dSVitaly Kuzmichev 1017612a43dSVitaly Kuzmichev typedef struct rndis_halt_msg_type { 1027612a43dSVitaly Kuzmichev __le32 MessageType; 1037612a43dSVitaly Kuzmichev __le32 MessageLength; 1047612a43dSVitaly Kuzmichev __le32 RequestID; 1057612a43dSVitaly Kuzmichev } rndis_halt_msg_type; 1067612a43dSVitaly Kuzmichev 1077612a43dSVitaly Kuzmichev typedef struct rndis_query_msg_type { 1087612a43dSVitaly Kuzmichev __le32 MessageType; 1097612a43dSVitaly Kuzmichev __le32 MessageLength; 1107612a43dSVitaly Kuzmichev __le32 RequestID; 1117612a43dSVitaly Kuzmichev __le32 OID; 1127612a43dSVitaly Kuzmichev __le32 InformationBufferLength; 1137612a43dSVitaly Kuzmichev __le32 InformationBufferOffset; 1147612a43dSVitaly Kuzmichev __le32 DeviceVcHandle; 1157612a43dSVitaly Kuzmichev } rndis_query_msg_type; 1167612a43dSVitaly Kuzmichev 1177612a43dSVitaly Kuzmichev typedef struct rndis_query_cmplt_type { 1187612a43dSVitaly Kuzmichev __le32 MessageType; 1197612a43dSVitaly Kuzmichev __le32 MessageLength; 1207612a43dSVitaly Kuzmichev __le32 RequestID; 1217612a43dSVitaly Kuzmichev __le32 Status; 1227612a43dSVitaly Kuzmichev __le32 InformationBufferLength; 1237612a43dSVitaly Kuzmichev __le32 InformationBufferOffset; 1247612a43dSVitaly Kuzmichev } rndis_query_cmplt_type; 1257612a43dSVitaly Kuzmichev 1267612a43dSVitaly Kuzmichev typedef struct rndis_set_msg_type { 1277612a43dSVitaly Kuzmichev __le32 MessageType; 1287612a43dSVitaly Kuzmichev __le32 MessageLength; 1297612a43dSVitaly Kuzmichev __le32 RequestID; 1307612a43dSVitaly Kuzmichev __le32 OID; 1317612a43dSVitaly Kuzmichev __le32 InformationBufferLength; 1327612a43dSVitaly Kuzmichev __le32 InformationBufferOffset; 1337612a43dSVitaly Kuzmichev __le32 DeviceVcHandle; 1347612a43dSVitaly Kuzmichev } rndis_set_msg_type; 1357612a43dSVitaly Kuzmichev 1367612a43dSVitaly Kuzmichev typedef struct rndis_set_cmplt_type { 1377612a43dSVitaly Kuzmichev __le32 MessageType; 1387612a43dSVitaly Kuzmichev __le32 MessageLength; 1397612a43dSVitaly Kuzmichev __le32 RequestID; 1407612a43dSVitaly Kuzmichev __le32 Status; 1417612a43dSVitaly Kuzmichev } rndis_set_cmplt_type; 1427612a43dSVitaly Kuzmichev 1437612a43dSVitaly Kuzmichev typedef struct rndis_reset_msg_type { 1447612a43dSVitaly Kuzmichev __le32 MessageType; 1457612a43dSVitaly Kuzmichev __le32 MessageLength; 1467612a43dSVitaly Kuzmichev __le32 Reserved; 1477612a43dSVitaly Kuzmichev } rndis_reset_msg_type; 1487612a43dSVitaly Kuzmichev 1497612a43dSVitaly Kuzmichev typedef struct rndis_reset_cmplt_type { 1507612a43dSVitaly Kuzmichev __le32 MessageType; 1517612a43dSVitaly Kuzmichev __le32 MessageLength; 1527612a43dSVitaly Kuzmichev __le32 Status; 1537612a43dSVitaly Kuzmichev __le32 AddressingReset; 1547612a43dSVitaly Kuzmichev } rndis_reset_cmplt_type; 1557612a43dSVitaly Kuzmichev 1567612a43dSVitaly Kuzmichev typedef struct rndis_indicate_status_msg_type { 1577612a43dSVitaly Kuzmichev __le32 MessageType; 1587612a43dSVitaly Kuzmichev __le32 MessageLength; 1597612a43dSVitaly Kuzmichev __le32 Status; 1607612a43dSVitaly Kuzmichev __le32 StatusBufferLength; 1617612a43dSVitaly Kuzmichev __le32 StatusBufferOffset; 1627612a43dSVitaly Kuzmichev } rndis_indicate_status_msg_type; 1637612a43dSVitaly Kuzmichev 1647612a43dSVitaly Kuzmichev typedef struct rndis_keepalive_msg_type { 1657612a43dSVitaly Kuzmichev __le32 MessageType; 1667612a43dSVitaly Kuzmichev __le32 MessageLength; 1677612a43dSVitaly Kuzmichev __le32 RequestID; 1687612a43dSVitaly Kuzmichev } rndis_keepalive_msg_type; 1697612a43dSVitaly Kuzmichev 1707612a43dSVitaly Kuzmichev typedef struct rndis_keepalive_cmplt_type { 1717612a43dSVitaly Kuzmichev __le32 MessageType; 1727612a43dSVitaly Kuzmichev __le32 MessageLength; 1737612a43dSVitaly Kuzmichev __le32 RequestID; 1747612a43dSVitaly Kuzmichev __le32 Status; 1757612a43dSVitaly Kuzmichev } rndis_keepalive_cmplt_type; 1767612a43dSVitaly Kuzmichev 1777612a43dSVitaly Kuzmichev struct rndis_packet_msg_type { 1787612a43dSVitaly Kuzmichev __le32 MessageType; 1797612a43dSVitaly Kuzmichev __le32 MessageLength; 1807612a43dSVitaly Kuzmichev __le32 DataOffset; 1817612a43dSVitaly Kuzmichev __le32 DataLength; 1827612a43dSVitaly Kuzmichev __le32 OOBDataOffset; 1837612a43dSVitaly Kuzmichev __le32 OOBDataLength; 1847612a43dSVitaly Kuzmichev __le32 NumOOBDataElements; 1857612a43dSVitaly Kuzmichev __le32 PerPacketInfoOffset; 1867612a43dSVitaly Kuzmichev __le32 PerPacketInfoLength; 1877612a43dSVitaly Kuzmichev __le32 VcHandle; 1887612a43dSVitaly Kuzmichev __le32 Reserved; 1897612a43dSVitaly Kuzmichev } __attribute__ ((packed)); 1907612a43dSVitaly Kuzmichev 1917612a43dSVitaly Kuzmichev struct rndis_config_parameter { 1927612a43dSVitaly Kuzmichev __le32 ParameterNameOffset; 1937612a43dSVitaly Kuzmichev __le32 ParameterNameLength; 1947612a43dSVitaly Kuzmichev __le32 ParameterType; 1957612a43dSVitaly Kuzmichev __le32 ParameterValueOffset; 1967612a43dSVitaly Kuzmichev __le32 ParameterValueLength; 1977612a43dSVitaly Kuzmichev }; 1987612a43dSVitaly Kuzmichev 1997612a43dSVitaly Kuzmichev /* implementation specific */ 2007612a43dSVitaly Kuzmichev enum rndis_state { 2017612a43dSVitaly Kuzmichev RNDIS_UNINITIALIZED, 2027612a43dSVitaly Kuzmichev RNDIS_INITIALIZED, 2037612a43dSVitaly Kuzmichev RNDIS_DATA_INITIALIZED, 2047612a43dSVitaly Kuzmichev }; 2057612a43dSVitaly Kuzmichev 2067612a43dSVitaly Kuzmichev typedef struct rndis_resp_t { 2077612a43dSVitaly Kuzmichev struct list_head list; 2087612a43dSVitaly Kuzmichev u8 *buf; 2097612a43dSVitaly Kuzmichev u32 length; 2107612a43dSVitaly Kuzmichev int send; 2117612a43dSVitaly Kuzmichev } rndis_resp_t; 2127612a43dSVitaly Kuzmichev 2137612a43dSVitaly Kuzmichev typedef struct rndis_params { 2147612a43dSVitaly Kuzmichev u8 confignr; 2157612a43dSVitaly Kuzmichev u8 used; 2167612a43dSVitaly Kuzmichev u16 saved_filter; 2177612a43dSVitaly Kuzmichev enum rndis_state state; 2187612a43dSVitaly Kuzmichev u32 medium; 2197612a43dSVitaly Kuzmichev u32 speed; 2207612a43dSVitaly Kuzmichev u32 media_state; 2217612a43dSVitaly Kuzmichev 2227612a43dSVitaly Kuzmichev const u8 *host_mac; 2237612a43dSVitaly Kuzmichev u16 *filter; 2247612a43dSVitaly Kuzmichev struct net_device_stats *stats; 2257612a43dSVitaly Kuzmichev int mtu; 2267612a43dSVitaly Kuzmichev 2277612a43dSVitaly Kuzmichev u32 vendorID; 2287612a43dSVitaly Kuzmichev const char *vendorDescr; 229d4a37553SMugunthan V N #ifndef CONFIG_DM_ETH 230d4a37553SMugunthan V N struct eth_device *dev; 2317612a43dSVitaly Kuzmichev int (*ack)(struct eth_device *); 232d4a37553SMugunthan V N #else 233d4a37553SMugunthan V N struct udevice *dev; 234d4a37553SMugunthan V N int (*ack)(struct udevice *); 235d4a37553SMugunthan V N #endif 2367612a43dSVitaly Kuzmichev struct list_head resp_queue; 2377612a43dSVitaly Kuzmichev } rndis_params; 2387612a43dSVitaly Kuzmichev 2397612a43dSVitaly Kuzmichev /* RNDIS Message parser and other useless functions */ 2407612a43dSVitaly Kuzmichev int rndis_msg_parser(u8 configNr, u8 *buf); 2417612a43dSVitaly Kuzmichev enum rndis_state rndis_get_state(int configNr); 2427612a43dSVitaly Kuzmichev void rndis_deregister(int configNr); 243d4a37553SMugunthan V N #ifndef CONFIG_DM_ETH 244d4a37553SMugunthan V N int rndis_register(int (*rndis_control_ack)(struct eth_device *)); 2457612a43dSVitaly Kuzmichev int rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu, 2467612a43dSVitaly Kuzmichev struct net_device_stats *stats, u16 *cdc_filter); 247d4a37553SMugunthan V N #else 248d4a37553SMugunthan V N int rndis_register(int (*rndis_control_ack)(struct udevice *)); 249d4a37553SMugunthan V N int rndis_set_param_dev(u8 configNr, struct udevice *dev, int mtu, 250d4a37553SMugunthan V N struct net_device_stats *stats, u16 *cdc_filter); 251d4a37553SMugunthan V N #endif 2527612a43dSVitaly Kuzmichev int rndis_set_param_vendor(u8 configNr, u32 vendorID, 2537612a43dSVitaly Kuzmichev const char *vendorDescr); 2547612a43dSVitaly Kuzmichev int rndis_set_param_medium(u8 configNr, u32 medium, u32 speed); 2557612a43dSVitaly Kuzmichev void rndis_add_hdr(void *bug, int length); 2567612a43dSVitaly Kuzmichev int rndis_rm_hdr(void *bug, int length); 2577612a43dSVitaly Kuzmichev u8 *rndis_get_next_response(int configNr, u32 *length); 2587612a43dSVitaly Kuzmichev void rndis_free_response(int configNr, u8 *buf); 2597612a43dSVitaly Kuzmichev 2607612a43dSVitaly Kuzmichev void rndis_uninit(int configNr); 2617612a43dSVitaly Kuzmichev int rndis_signal_connect(int configNr); 2627612a43dSVitaly Kuzmichev int rndis_signal_disconnect(int configNr); 2637612a43dSVitaly Kuzmichev extern void rndis_set_host_mac(int configNr, const u8 *addr); 2647612a43dSVitaly Kuzmichev 2657612a43dSVitaly Kuzmichev int rndis_init(void); 2667612a43dSVitaly Kuzmichev void rndis_exit(void); 2677612a43dSVitaly Kuzmichev 2687612a43dSVitaly Kuzmichev #endif /* _USBGADGET_RNDIS_H */ 269