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