1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * RNDIS Definitions for Remote NDIS 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Authors: Benedikt Spranger, Pengutronix 5*4882a593Smuzhiyun * Robert Schwebel, Pengutronix 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This software was originally developed in conformance with 8*4882a593Smuzhiyun * Microsoft's Remote NDIS Specification License Agreement. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifndef _USBGADGET_RNDIS_H 14*4882a593Smuzhiyun #define _USBGADGET_RNDIS_H 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include "ndis.h" 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* 19*4882a593Smuzhiyun * By default rndis_signal_disconnect does not send status message about 20*4882a593Smuzhiyun * RNDIS disconnection to USB host (indicated as cable disconnected). 21*4882a593Smuzhiyun * Define RNDIS_COMPLETE_SIGNAL_DISCONNECT to send it. 22*4882a593Smuzhiyun * However, this will cause 1 sec delay on Ethernet device halt. 23*4882a593Smuzhiyun * Usually you do not need to define it. Mostly usable for debugging. 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define RNDIS_MAXIMUM_FRAME_SIZE 1518 27*4882a593Smuzhiyun #define RNDIS_MAX_TOTAL_SIZE 1558 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* Remote NDIS Versions */ 30*4882a593Smuzhiyun #define RNDIS_MAJOR_VERSION 1 31*4882a593Smuzhiyun #define RNDIS_MINOR_VERSION 0 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* Status Values */ 34*4882a593Smuzhiyun #define RNDIS_STATUS_SUCCESS 0x00000000U /* Success */ 35*4882a593Smuzhiyun #define RNDIS_STATUS_FAILURE 0xC0000001U /* Unspecified error */ 36*4882a593Smuzhiyun #define RNDIS_STATUS_INVALID_DATA 0xC0010015U /* Invalid data */ 37*4882a593Smuzhiyun #define RNDIS_STATUS_NOT_SUPPORTED 0xC00000BBU /* Unsupported request */ 38*4882a593Smuzhiyun #define RNDIS_STATUS_MEDIA_CONNECT 0x4001000BU /* Device connected */ 39*4882a593Smuzhiyun #define RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000CU /* Device disconnected */ 40*4882a593Smuzhiyun /* 41*4882a593Smuzhiyun * For all not specified status messages: 42*4882a593Smuzhiyun * RNDIS_STATUS_Xxx -> NDIS_STATUS_Xxx 43*4882a593Smuzhiyun */ 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* Message Set for Connectionless (802.3) Devices */ 46*4882a593Smuzhiyun #define REMOTE_NDIS_PACKET_MSG 0x00000001U 47*4882a593Smuzhiyun #define REMOTE_NDIS_INITIALIZE_MSG 0x00000002U /* Initialize device */ 48*4882a593Smuzhiyun #define REMOTE_NDIS_HALT_MSG 0x00000003U 49*4882a593Smuzhiyun #define REMOTE_NDIS_QUERY_MSG 0x00000004U 50*4882a593Smuzhiyun #define REMOTE_NDIS_SET_MSG 0x00000005U 51*4882a593Smuzhiyun #define REMOTE_NDIS_RESET_MSG 0x00000006U 52*4882a593Smuzhiyun #define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007U 53*4882a593Smuzhiyun #define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008U 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* Message completion */ 56*4882a593Smuzhiyun #define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002U 57*4882a593Smuzhiyun #define REMOTE_NDIS_QUERY_CMPLT 0x80000004U 58*4882a593Smuzhiyun #define REMOTE_NDIS_SET_CMPLT 0x80000005U 59*4882a593Smuzhiyun #define REMOTE_NDIS_RESET_CMPLT 0x80000006U 60*4882a593Smuzhiyun #define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008U 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* Device Flags */ 63*4882a593Smuzhiyun #define RNDIS_DF_CONNECTIONLESS 0x00000001U 64*4882a593Smuzhiyun #define RNDIS_DF_CONNECTION_ORIENTED 0x00000002U 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define RNDIS_MEDIUM_802_3 0x00000000U 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* from drivers/net/sk98lin/h/skgepnmi.h */ 69*4882a593Smuzhiyun #define OID_PNP_CAPABILITIES 0xFD010100 70*4882a593Smuzhiyun #define OID_PNP_SET_POWER 0xFD010101 71*4882a593Smuzhiyun #define OID_PNP_QUERY_POWER 0xFD010102 72*4882a593Smuzhiyun #define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103 73*4882a593Smuzhiyun #define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104 74*4882a593Smuzhiyun #define OID_PNP_ENABLE_WAKE_UP 0xFD010106 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun typedef struct rndis_init_msg_type { 78*4882a593Smuzhiyun __le32 MessageType; 79*4882a593Smuzhiyun __le32 MessageLength; 80*4882a593Smuzhiyun __le32 RequestID; 81*4882a593Smuzhiyun __le32 MajorVersion; 82*4882a593Smuzhiyun __le32 MinorVersion; 83*4882a593Smuzhiyun __le32 MaxTransferSize; 84*4882a593Smuzhiyun } rndis_init_msg_type; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun typedef struct rndis_init_cmplt_type { 87*4882a593Smuzhiyun __le32 MessageType; 88*4882a593Smuzhiyun __le32 MessageLength; 89*4882a593Smuzhiyun __le32 RequestID; 90*4882a593Smuzhiyun __le32 Status; 91*4882a593Smuzhiyun __le32 MajorVersion; 92*4882a593Smuzhiyun __le32 MinorVersion; 93*4882a593Smuzhiyun __le32 DeviceFlags; 94*4882a593Smuzhiyun __le32 Medium; 95*4882a593Smuzhiyun __le32 MaxPacketsPerTransfer; 96*4882a593Smuzhiyun __le32 MaxTransferSize; 97*4882a593Smuzhiyun __le32 PacketAlignmentFactor; 98*4882a593Smuzhiyun __le32 AFListOffset; 99*4882a593Smuzhiyun __le32 AFListSize; 100*4882a593Smuzhiyun } rndis_init_cmplt_type; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun typedef struct rndis_halt_msg_type { 103*4882a593Smuzhiyun __le32 MessageType; 104*4882a593Smuzhiyun __le32 MessageLength; 105*4882a593Smuzhiyun __le32 RequestID; 106*4882a593Smuzhiyun } rndis_halt_msg_type; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun typedef struct rndis_query_msg_type { 109*4882a593Smuzhiyun __le32 MessageType; 110*4882a593Smuzhiyun __le32 MessageLength; 111*4882a593Smuzhiyun __le32 RequestID; 112*4882a593Smuzhiyun __le32 OID; 113*4882a593Smuzhiyun __le32 InformationBufferLength; 114*4882a593Smuzhiyun __le32 InformationBufferOffset; 115*4882a593Smuzhiyun __le32 DeviceVcHandle; 116*4882a593Smuzhiyun } rndis_query_msg_type; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun typedef struct rndis_query_cmplt_type { 119*4882a593Smuzhiyun __le32 MessageType; 120*4882a593Smuzhiyun __le32 MessageLength; 121*4882a593Smuzhiyun __le32 RequestID; 122*4882a593Smuzhiyun __le32 Status; 123*4882a593Smuzhiyun __le32 InformationBufferLength; 124*4882a593Smuzhiyun __le32 InformationBufferOffset; 125*4882a593Smuzhiyun } rndis_query_cmplt_type; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun typedef struct rndis_set_msg_type { 128*4882a593Smuzhiyun __le32 MessageType; 129*4882a593Smuzhiyun __le32 MessageLength; 130*4882a593Smuzhiyun __le32 RequestID; 131*4882a593Smuzhiyun __le32 OID; 132*4882a593Smuzhiyun __le32 InformationBufferLength; 133*4882a593Smuzhiyun __le32 InformationBufferOffset; 134*4882a593Smuzhiyun __le32 DeviceVcHandle; 135*4882a593Smuzhiyun } rndis_set_msg_type; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun typedef struct rndis_set_cmplt_type { 138*4882a593Smuzhiyun __le32 MessageType; 139*4882a593Smuzhiyun __le32 MessageLength; 140*4882a593Smuzhiyun __le32 RequestID; 141*4882a593Smuzhiyun __le32 Status; 142*4882a593Smuzhiyun } rndis_set_cmplt_type; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun typedef struct rndis_reset_msg_type { 145*4882a593Smuzhiyun __le32 MessageType; 146*4882a593Smuzhiyun __le32 MessageLength; 147*4882a593Smuzhiyun __le32 Reserved; 148*4882a593Smuzhiyun } rndis_reset_msg_type; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun typedef struct rndis_reset_cmplt_type { 151*4882a593Smuzhiyun __le32 MessageType; 152*4882a593Smuzhiyun __le32 MessageLength; 153*4882a593Smuzhiyun __le32 Status; 154*4882a593Smuzhiyun __le32 AddressingReset; 155*4882a593Smuzhiyun } rndis_reset_cmplt_type; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun typedef struct rndis_indicate_status_msg_type { 158*4882a593Smuzhiyun __le32 MessageType; 159*4882a593Smuzhiyun __le32 MessageLength; 160*4882a593Smuzhiyun __le32 Status; 161*4882a593Smuzhiyun __le32 StatusBufferLength; 162*4882a593Smuzhiyun __le32 StatusBufferOffset; 163*4882a593Smuzhiyun } rndis_indicate_status_msg_type; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun typedef struct rndis_keepalive_msg_type { 166*4882a593Smuzhiyun __le32 MessageType; 167*4882a593Smuzhiyun __le32 MessageLength; 168*4882a593Smuzhiyun __le32 RequestID; 169*4882a593Smuzhiyun } rndis_keepalive_msg_type; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun typedef struct rndis_keepalive_cmplt_type { 172*4882a593Smuzhiyun __le32 MessageType; 173*4882a593Smuzhiyun __le32 MessageLength; 174*4882a593Smuzhiyun __le32 RequestID; 175*4882a593Smuzhiyun __le32 Status; 176*4882a593Smuzhiyun } rndis_keepalive_cmplt_type; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun struct rndis_packet_msg_type { 179*4882a593Smuzhiyun __le32 MessageType; 180*4882a593Smuzhiyun __le32 MessageLength; 181*4882a593Smuzhiyun __le32 DataOffset; 182*4882a593Smuzhiyun __le32 DataLength; 183*4882a593Smuzhiyun __le32 OOBDataOffset; 184*4882a593Smuzhiyun __le32 OOBDataLength; 185*4882a593Smuzhiyun __le32 NumOOBDataElements; 186*4882a593Smuzhiyun __le32 PerPacketInfoOffset; 187*4882a593Smuzhiyun __le32 PerPacketInfoLength; 188*4882a593Smuzhiyun __le32 VcHandle; 189*4882a593Smuzhiyun __le32 Reserved; 190*4882a593Smuzhiyun } __attribute__ ((packed)); 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun struct rndis_config_parameter { 193*4882a593Smuzhiyun __le32 ParameterNameOffset; 194*4882a593Smuzhiyun __le32 ParameterNameLength; 195*4882a593Smuzhiyun __le32 ParameterType; 196*4882a593Smuzhiyun __le32 ParameterValueOffset; 197*4882a593Smuzhiyun __le32 ParameterValueLength; 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /* implementation specific */ 201*4882a593Smuzhiyun enum rndis_state { 202*4882a593Smuzhiyun RNDIS_UNINITIALIZED, 203*4882a593Smuzhiyun RNDIS_INITIALIZED, 204*4882a593Smuzhiyun RNDIS_DATA_INITIALIZED, 205*4882a593Smuzhiyun }; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun typedef struct rndis_resp_t { 208*4882a593Smuzhiyun struct list_head list; 209*4882a593Smuzhiyun u8 *buf; 210*4882a593Smuzhiyun u32 length; 211*4882a593Smuzhiyun int send; 212*4882a593Smuzhiyun } rndis_resp_t; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun typedef struct rndis_params { 215*4882a593Smuzhiyun u8 confignr; 216*4882a593Smuzhiyun u8 used; 217*4882a593Smuzhiyun u16 saved_filter; 218*4882a593Smuzhiyun enum rndis_state state; 219*4882a593Smuzhiyun u32 medium; 220*4882a593Smuzhiyun u32 speed; 221*4882a593Smuzhiyun u32 media_state; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun const u8 *host_mac; 224*4882a593Smuzhiyun u16 *filter; 225*4882a593Smuzhiyun struct net_device_stats *stats; 226*4882a593Smuzhiyun int mtu; 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun u32 vendorID; 229*4882a593Smuzhiyun const char *vendorDescr; 230*4882a593Smuzhiyun #ifndef CONFIG_DM_ETH 231*4882a593Smuzhiyun struct eth_device *dev; 232*4882a593Smuzhiyun int (*ack)(struct eth_device *); 233*4882a593Smuzhiyun #else 234*4882a593Smuzhiyun struct udevice *dev; 235*4882a593Smuzhiyun int (*ack)(struct udevice *); 236*4882a593Smuzhiyun #endif 237*4882a593Smuzhiyun struct list_head resp_queue; 238*4882a593Smuzhiyun } rndis_params; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun /* RNDIS Message parser and other useless functions */ 241*4882a593Smuzhiyun int rndis_msg_parser(u8 configNr, u8 *buf); 242*4882a593Smuzhiyun enum rndis_state rndis_get_state(int configNr); 243*4882a593Smuzhiyun void rndis_deregister(int configNr); 244*4882a593Smuzhiyun #ifndef CONFIG_DM_ETH 245*4882a593Smuzhiyun int rndis_register(int (*rndis_control_ack)(struct eth_device *)); 246*4882a593Smuzhiyun int rndis_set_param_dev(u8 configNr, struct eth_device *dev, int mtu, 247*4882a593Smuzhiyun struct net_device_stats *stats, u16 *cdc_filter); 248*4882a593Smuzhiyun #else 249*4882a593Smuzhiyun int rndis_register(int (*rndis_control_ack)(struct udevice *)); 250*4882a593Smuzhiyun int rndis_set_param_dev(u8 configNr, struct udevice *dev, int mtu, 251*4882a593Smuzhiyun struct net_device_stats *stats, u16 *cdc_filter); 252*4882a593Smuzhiyun #endif 253*4882a593Smuzhiyun int rndis_set_param_vendor(u8 configNr, u32 vendorID, 254*4882a593Smuzhiyun const char *vendorDescr); 255*4882a593Smuzhiyun int rndis_set_param_medium(u8 configNr, u32 medium, u32 speed); 256*4882a593Smuzhiyun void rndis_add_hdr(void *bug, int length); 257*4882a593Smuzhiyun int rndis_rm_hdr(void *bug, int length); 258*4882a593Smuzhiyun u8 *rndis_get_next_response(int configNr, u32 *length); 259*4882a593Smuzhiyun void rndis_free_response(int configNr, u8 *buf); 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun void rndis_uninit(int configNr); 262*4882a593Smuzhiyun int rndis_signal_connect(int configNr); 263*4882a593Smuzhiyun int rndis_signal_disconnect(int configNr); 264*4882a593Smuzhiyun extern void rndis_set_host_mac(int configNr, const u8 *addr); 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun int rndis_init(void); 267*4882a593Smuzhiyun void rndis_exit(void); 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun #endif /* _USBGADGET_RNDIS_H */ 270