diff options
| -rw-r--r-- | drivers/usb/gadget/ether.c | 11 | ||||
| -rw-r--r-- | drivers/usb/gadget/ndis.h | 14 | ||||
| -rw-r--r-- | drivers/usb/gadget/rndis.c | 509 | ||||
| -rw-r--r-- | drivers/usb/gadget/rndis.h | 95 |
4 files changed, 285 insertions, 344 deletions
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 3f783cbdc7..a766c29c3e 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c | |||
| @@ -94,8 +94,9 @@ static const char driver_desc [] = DRIVER_DESC; | |||
| 94 | #ifdef CONFIG_USB_ETH_RNDIS | 94 | #ifdef CONFIG_USB_ETH_RNDIS |
| 95 | #include "rndis.h" | 95 | #include "rndis.h" |
| 96 | #else | 96 | #else |
| 97 | #define rndis_init() 0 | 97 | #define rndis_init() 0 |
| 98 | #define rndis_exit() do{}while(0) | 98 | #define rndis_uninit(x) do{}while(0) |
| 99 | #define rndis_exit() do{}while(0) | ||
| 99 | #endif | 100 | #endif |
| 100 | 101 | ||
| 101 | /* CDC and RNDIS support the same host-chosen outgoing packet filters. */ | 102 | /* CDC and RNDIS support the same host-chosen outgoing packet filters. */ |
| @@ -395,7 +396,8 @@ static inline int BITRATE(struct usb_gadget *g) | |||
| 395 | #define STRING_SUBSET 8 | 396 | #define STRING_SUBSET 8 |
| 396 | #define STRING_RNDIS 9 | 397 | #define STRING_RNDIS 9 |
| 397 | 398 | ||
| 398 | #define USB_BUFSIZ 256 /* holds our biggest descriptor */ | 399 | /* holds our biggest descriptor (or RNDIS response) */ |
| 400 | #define USB_BUFSIZ 256 | ||
| 399 | 401 | ||
| 400 | /* | 402 | /* |
| 401 | * This device advertises one configuration, eth_config, unless RNDIS | 403 | * This device advertises one configuration, eth_config, unless RNDIS |
| @@ -1124,6 +1126,7 @@ static void eth_reset_config (struct eth_dev *dev) | |||
| 1124 | 1126 | ||
| 1125 | netif_stop_queue (dev->net); | 1127 | netif_stop_queue (dev->net); |
| 1126 | netif_carrier_off (dev->net); | 1128 | netif_carrier_off (dev->net); |
| 1129 | rndis_uninit(dev->rndis_config); | ||
| 1127 | 1130 | ||
| 1128 | /* disable endpoints, forcing (synchronous) completion of | 1131 | /* disable endpoints, forcing (synchronous) completion of |
| 1129 | * pending i/o. then free the requests. | 1132 | * pending i/o. then free the requests. |
| @@ -2565,7 +2568,7 @@ fail0: | |||
| 2565 | /* these set up a lot of the OIDs that RNDIS needs */ | 2568 | /* these set up a lot of the OIDs that RNDIS needs */ |
| 2566 | rndis_set_host_mac (dev->rndis_config, dev->host_mac); | 2569 | rndis_set_host_mac (dev->rndis_config, dev->host_mac); |
| 2567 | if (rndis_set_param_dev (dev->rndis_config, dev->net, | 2570 | if (rndis_set_param_dev (dev->rndis_config, dev->net, |
| 2568 | &dev->stats)) | 2571 | &dev->stats, &dev->cdc_filter)) |
| 2569 | goto fail0; | 2572 | goto fail0; |
| 2570 | if (rndis_set_param_vendor (dev->rndis_config, vendorID, | 2573 | if (rndis_set_param_vendor (dev->rndis_config, vendorID, |
| 2571 | manufacturer)) | 2574 | manufacturer)) |
diff --git a/drivers/usb/gadget/ndis.h b/drivers/usb/gadget/ndis.h index c553bbf68c..09e3ee4eea 100644 --- a/drivers/usb/gadget/ndis.h +++ b/drivers/usb/gadget/ndis.h | |||
| @@ -47,17 +47,17 @@ struct NDIS_PM_WAKE_UP_CAPABILITIES { | |||
| 47 | #define NDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE 0x00000004 | 47 | #define NDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE 0x00000004 |
| 48 | 48 | ||
| 49 | struct NDIS_PNP_CAPABILITIES { | 49 | struct NDIS_PNP_CAPABILITIES { |
| 50 | u32 Flags; | 50 | __le32 Flags; |
| 51 | struct NDIS_PM_WAKE_UP_CAPABILITIES WakeUpCapabilities; | 51 | struct NDIS_PM_WAKE_UP_CAPABILITIES WakeUpCapabilities; |
| 52 | }; | 52 | }; |
| 53 | 53 | ||
| 54 | struct NDIS_PM_PACKET_PATTERN { | 54 | struct NDIS_PM_PACKET_PATTERN { |
| 55 | u32 Priority; | 55 | __le32 Priority; |
| 56 | u32 Reserved; | 56 | __le32 Reserved; |
| 57 | u32 MaskSize; | 57 | __le32 MaskSize; |
| 58 | u32 PatternOffset; | 58 | __le32 PatternOffset; |
| 59 | u32 PatternSize; | 59 | __le32 PatternSize; |
| 60 | u32 PatternFlags; | 60 | __le32 PatternFlags; |
| 61 | }; | 61 | }; |
| 62 | 62 | ||
| 63 | 63 | ||
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c index 7457268d5f..c9a0af29ec 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | 41 | ||
| 42 | 42 | ||
| 43 | #undef RNDIS_PM | 43 | #undef RNDIS_PM |
| 44 | #undef RNDIS_WAKEUP | ||
| 44 | #undef VERBOSE | 45 | #undef VERBOSE |
| 45 | 46 | ||
| 46 | #include "rndis.h" | 47 | #include "rndis.h" |
| @@ -60,7 +61,7 @@ | |||
| 60 | } while (0) | 61 | } while (0) |
| 61 | static int rndis_debug = 0; | 62 | static int rndis_debug = 0; |
| 62 | 63 | ||
| 63 | module_param (rndis_debug, bool, 0); | 64 | module_param (rndis_debug, int, 0); |
| 64 | MODULE_PARM_DESC (rndis_debug, "enable debugging"); | 65 | MODULE_PARM_DESC (rndis_debug, "enable debugging"); |
| 65 | 66 | ||
| 66 | #else | 67 | #else |
| @@ -78,22 +79,103 @@ static rndis_params rndis_per_dev_params [RNDIS_MAX_CONFIGS]; | |||
| 78 | static const __le32 rndis_driver_version = __constant_cpu_to_le32 (1); | 79 | static const __le32 rndis_driver_version = __constant_cpu_to_le32 (1); |
| 79 | 80 | ||
| 80 | /* Function Prototypes */ | 81 | /* Function Prototypes */ |
| 81 | static int rndis_init_response (int configNr, rndis_init_msg_type *buf); | ||
| 82 | static int rndis_query_response (int configNr, rndis_query_msg_type *buf); | ||
| 83 | static int rndis_set_response (int configNr, rndis_set_msg_type *buf); | ||
| 84 | static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf); | ||
| 85 | static int rndis_keepalive_response (int configNr, | ||
| 86 | rndis_keepalive_msg_type *buf); | ||
| 87 | |||
| 88 | static rndis_resp_t *rndis_add_response (int configNr, u32 length); | 82 | static rndis_resp_t *rndis_add_response (int configNr, u32 length); |
| 89 | 83 | ||
| 90 | 84 | ||
| 85 | /* supported OIDs */ | ||
| 86 | static const u32 oid_supported_list [] = | ||
| 87 | { | ||
| 88 | /* the general stuff */ | ||
| 89 | OID_GEN_SUPPORTED_LIST, | ||
| 90 | OID_GEN_HARDWARE_STATUS, | ||
| 91 | OID_GEN_MEDIA_SUPPORTED, | ||
| 92 | OID_GEN_MEDIA_IN_USE, | ||
| 93 | OID_GEN_MAXIMUM_FRAME_SIZE, | ||
| 94 | OID_GEN_LINK_SPEED, | ||
| 95 | OID_GEN_TRANSMIT_BLOCK_SIZE, | ||
| 96 | OID_GEN_RECEIVE_BLOCK_SIZE, | ||
| 97 | OID_GEN_VENDOR_ID, | ||
| 98 | OID_GEN_VENDOR_DESCRIPTION, | ||
| 99 | OID_GEN_VENDOR_DRIVER_VERSION, | ||
| 100 | OID_GEN_CURRENT_PACKET_FILTER, | ||
| 101 | OID_GEN_MAXIMUM_TOTAL_SIZE, | ||
| 102 | OID_GEN_MEDIA_CONNECT_STATUS, | ||
| 103 | OID_GEN_PHYSICAL_MEDIUM, | ||
| 104 | #if 0 | ||
| 105 | OID_GEN_RNDIS_CONFIG_PARAMETER, | ||
| 106 | #endif | ||
| 107 | |||
| 108 | /* the statistical stuff */ | ||
| 109 | OID_GEN_XMIT_OK, | ||
| 110 | OID_GEN_RCV_OK, | ||
| 111 | OID_GEN_XMIT_ERROR, | ||
| 112 | OID_GEN_RCV_ERROR, | ||
| 113 | OID_GEN_RCV_NO_BUFFER, | ||
| 114 | #ifdef RNDIS_OPTIONAL_STATS | ||
| 115 | OID_GEN_DIRECTED_BYTES_XMIT, | ||
| 116 | OID_GEN_DIRECTED_FRAMES_XMIT, | ||
| 117 | OID_GEN_MULTICAST_BYTES_XMIT, | ||
| 118 | OID_GEN_MULTICAST_FRAMES_XMIT, | ||
| 119 | OID_GEN_BROADCAST_BYTES_XMIT, | ||
| 120 | OID_GEN_BROADCAST_FRAMES_XMIT, | ||
| 121 | OID_GEN_DIRECTED_BYTES_RCV, | ||
| 122 | OID_GEN_DIRECTED_FRAMES_RCV, | ||
| 123 | OID_GEN_MULTICAST_BYTES_RCV, | ||
| 124 | OID_GEN_MULTICAST_FRAMES_RCV, | ||
| 125 | OID_GEN_BROADCAST_BYTES_RCV, | ||
| 126 | OID_GEN_BROADCAST_FRAMES_RCV, | ||
| 127 | OID_GEN_RCV_CRC_ERROR, | ||
| 128 | OID_GEN_TRANSMIT_QUEUE_LENGTH, | ||
| 129 | #endif /* RNDIS_OPTIONAL_STATS */ | ||
| 130 | |||
| 131 | /* mandatory 802.3 */ | ||
| 132 | /* the general stuff */ | ||
| 133 | OID_802_3_PERMANENT_ADDRESS, | ||
| 134 | OID_802_3_CURRENT_ADDRESS, | ||
| 135 | OID_802_3_MULTICAST_LIST, | ||
| 136 | OID_802_3_MAC_OPTIONS, | ||
| 137 | OID_802_3_MAXIMUM_LIST_SIZE, | ||
| 138 | |||
| 139 | /* the statistical stuff */ | ||
| 140 | OID_802_3_RCV_ERROR_ALIGNMENT, | ||
| 141 | OID_802_3_XMIT_ONE_COLLISION, | ||
| 142 | OID_802_3_XMIT_MORE_COLLISIONS, | ||
| 143 | #ifdef RNDIS_OPTIONAL_STATS | ||
| 144 | OID_802_3_XMIT_DEFERRED, | ||
| 145 | OID_802_3_XMIT_MAX_COLLISIONS, | ||
| 146 | OID_802_3_RCV_OVERRUN, | ||
| 147 | OID_802_3_XMIT_UNDERRUN, | ||
| 148 | OID_802_3_XMIT_HEARTBEAT_FAILURE, | ||
| 149 | OID_802_3_XMIT_TIMES_CRS_LOST, | ||
| 150 | OID_802_3_XMIT_LATE_COLLISIONS, | ||
| 151 | #endif /* RNDIS_OPTIONAL_STATS */ | ||
| 152 | |||
| 153 | #ifdef RNDIS_PM | ||
| 154 | /* PM and wakeup are mandatory for USB: */ | ||
| 155 | |||
| 156 | /* power management */ | ||
| 157 | OID_PNP_CAPABILITIES, | ||
| 158 | OID_PNP_QUERY_POWER, | ||
| 159 | OID_PNP_SET_POWER, | ||
| 160 | |||
| 161 | #ifdef RNDIS_WAKEUP | ||
| 162 | /* wake up host */ | ||
| 163 | OID_PNP_ENABLE_WAKE_UP, | ||
| 164 | OID_PNP_ADD_WAKE_UP_PATTERN, | ||
| 165 | OID_PNP_REMOVE_WAKE_UP_PATTERN, | ||
| 166 | #endif /* RNDIS_WAKEUP */ | ||
| 167 | #endif /* RNDIS_PM */ | ||
| 168 | }; | ||
| 169 | |||
| 170 | |||
| 91 | /* NDIS Functions */ | 171 | /* NDIS Functions */ |
| 92 | static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | 172 | static int |
| 173 | gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, | ||
| 174 | rndis_resp_t *r) | ||
| 93 | { | 175 | { |
| 94 | int retval = -ENOTSUPP; | 176 | int retval = -ENOTSUPP; |
| 95 | u32 length = 0; | 177 | u32 length = 4; /* usually */ |
| 96 | __le32 *tmp; | 178 | __le32 *outbuf; |
| 97 | int i, count; | 179 | int i, count; |
| 98 | rndis_query_cmplt_type *resp; | 180 | rndis_query_cmplt_type *resp; |
| 99 | 181 | ||
| @@ -101,7 +183,22 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 101 | resp = (rndis_query_cmplt_type *) r->buf; | 183 | resp = (rndis_query_cmplt_type *) r->buf; |
| 102 | 184 | ||
| 103 | if (!resp) return -ENOMEM; | 185 | if (!resp) return -ENOMEM; |
| 104 | 186 | ||
| 187 | if (buf_len && rndis_debug > 1) { | ||
| 188 | DEBUG("query OID %08x value, len %d:\n", OID, buf_len); | ||
| 189 | for (i = 0; i < buf_len; i += 16) { | ||
| 190 | DEBUG ("%03d: %08x %08x %08x %08x\n", i, | ||
| 191 | le32_to_cpup((__le32 *)&buf[i]), | ||
| 192 | le32_to_cpup((__le32 *)&buf[i + 4]), | ||
| 193 | le32_to_cpup((__le32 *)&buf[i + 8]), | ||
| 194 | le32_to_cpup((__le32 *)&buf[i + 12])); | ||
| 195 | } | ||
| 196 | } | ||
| 197 | |||
| 198 | /* response goes here, right after the header */ | ||
| 199 | outbuf = (__le32 *) &resp[1]; | ||
| 200 | resp->InformationBufferOffset = __constant_cpu_to_le32 (16); | ||
| 201 | |||
| 105 | switch (OID) { | 202 | switch (OID) { |
| 106 | 203 | ||
| 107 | /* general oids (table 4-1) */ | 204 | /* general oids (table 4-1) */ |
| @@ -111,42 +208,36 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 111 | DEBUG ("%s: OID_GEN_SUPPORTED_LIST\n", __FUNCTION__); | 208 | DEBUG ("%s: OID_GEN_SUPPORTED_LIST\n", __FUNCTION__); |
| 112 | length = sizeof (oid_supported_list); | 209 | length = sizeof (oid_supported_list); |
| 113 | count = length / sizeof (u32); | 210 | count = length / sizeof (u32); |
| 114 | tmp = (__le32 *) ((u8 *)resp + 24); | ||
| 115 | for (i = 0; i < count; i++) | 211 | for (i = 0; i < count; i++) |
| 116 | tmp[i] = cpu_to_le32 (oid_supported_list[i]); | 212 | outbuf[i] = cpu_to_le32 (oid_supported_list[i]); |
| 117 | retval = 0; | 213 | retval = 0; |
| 118 | break; | 214 | break; |
| 119 | 215 | ||
| 120 | /* mandatory */ | 216 | /* mandatory */ |
| 121 | case OID_GEN_HARDWARE_STATUS: | 217 | case OID_GEN_HARDWARE_STATUS: |
| 122 | DEBUG("%s: OID_GEN_HARDWARE_STATUS\n", __FUNCTION__); | 218 | DEBUG("%s: OID_GEN_HARDWARE_STATUS\n", __FUNCTION__); |
| 123 | length = 4; | ||
| 124 | /* Bogus question! | 219 | /* Bogus question! |
| 125 | * Hardware must be ready to receive high level protocols. | 220 | * Hardware must be ready to receive high level protocols. |
| 126 | * BTW: | 221 | * BTW: |
| 127 | * reddite ergo quae sunt Caesaris Caesari | 222 | * reddite ergo quae sunt Caesaris Caesari |
| 128 | * et quae sunt Dei Deo! | 223 | * et quae sunt Dei Deo! |
| 129 | */ | 224 | */ |
| 130 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | 225 | *outbuf = __constant_cpu_to_le32 (0); |
| 131 | retval = 0; | 226 | retval = 0; |
| 132 | break; | 227 | break; |
| 133 | 228 | ||
| 134 | /* mandatory */ | 229 | /* mandatory */ |
| 135 | case OID_GEN_MEDIA_SUPPORTED: | 230 | case OID_GEN_MEDIA_SUPPORTED: |
| 136 | DEBUG("%s: OID_GEN_MEDIA_SUPPORTED\n", __FUNCTION__); | 231 | DEBUG("%s: OID_GEN_MEDIA_SUPPORTED\n", __FUNCTION__); |
| 137 | length = 4; | 232 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr].medium); |
| 138 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 139 | rndis_per_dev_params [configNr].medium); | ||
| 140 | retval = 0; | 233 | retval = 0; |
| 141 | break; | 234 | break; |
| 142 | 235 | ||
| 143 | /* mandatory */ | 236 | /* mandatory */ |
| 144 | case OID_GEN_MEDIA_IN_USE: | 237 | case OID_GEN_MEDIA_IN_USE: |
| 145 | DEBUG("%s: OID_GEN_MEDIA_IN_USE\n", __FUNCTION__); | 238 | DEBUG("%s: OID_GEN_MEDIA_IN_USE\n", __FUNCTION__); |
| 146 | length = 4; | ||
| 147 | /* one medium, one transport... (maybe you do it better) */ | 239 | /* one medium, one transport... (maybe you do it better) */ |
| 148 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 240 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr].medium); |
| 149 | rndis_per_dev_params [configNr].medium); | ||
| 150 | retval = 0; | 241 | retval = 0; |
| 151 | break; | 242 | break; |
| 152 | 243 | ||
| @@ -154,25 +245,21 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 154 | case OID_GEN_MAXIMUM_FRAME_SIZE: | 245 | case OID_GEN_MAXIMUM_FRAME_SIZE: |
| 155 | DEBUG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __FUNCTION__); | 246 | DEBUG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __FUNCTION__); |
| 156 | if (rndis_per_dev_params [configNr].dev) { | 247 | if (rndis_per_dev_params [configNr].dev) { |
| 157 | length = 4; | 248 | *outbuf = cpu_to_le32 ( |
| 158 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 159 | rndis_per_dev_params [configNr].dev->mtu); | 249 | rndis_per_dev_params [configNr].dev->mtu); |
| 160 | retval = 0; | 250 | retval = 0; |
| 161 | } else { | ||
| 162 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 163 | retval = 0; | ||
| 164 | } | 251 | } |
| 165 | break; | 252 | break; |
| 166 | 253 | ||
| 167 | /* mandatory */ | 254 | /* mandatory */ |
| 168 | case OID_GEN_LINK_SPEED: | 255 | case OID_GEN_LINK_SPEED: |
| 169 | // DEBUG("%s: OID_GEN_LINK_SPEED\n", __FUNCTION__); | 256 | if (rndis_debug > 1) |
| 170 | length = 4; | 257 | DEBUG("%s: OID_GEN_LINK_SPEED\n", __FUNCTION__); |
| 171 | if (rndis_per_dev_params [configNr].media_state | 258 | if (rndis_per_dev_params [configNr].media_state |
| 172 | == NDIS_MEDIA_STATE_DISCONNECTED) | 259 | == NDIS_MEDIA_STATE_DISCONNECTED) |
| 173 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | 260 | *outbuf = __constant_cpu_to_le32 (0); |
| 174 | else | 261 | else |
| 175 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 262 | *outbuf = cpu_to_le32 ( |
| 176 | rndis_per_dev_params [configNr].speed); | 263 | rndis_per_dev_params [configNr].speed); |
| 177 | retval = 0; | 264 | retval = 0; |
| 178 | break; | 265 | break; |
| @@ -181,8 +268,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 181 | case OID_GEN_TRANSMIT_BLOCK_SIZE: | 268 | case OID_GEN_TRANSMIT_BLOCK_SIZE: |
| 182 | DEBUG("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __FUNCTION__); | 269 | DEBUG("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __FUNCTION__); |
| 183 | if (rndis_per_dev_params [configNr].dev) { | 270 | if (rndis_per_dev_params [configNr].dev) { |
| 184 | length = 4; | 271 | *outbuf = cpu_to_le32 ( |
| 185 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 186 | rndis_per_dev_params [configNr].dev->mtu); | 272 | rndis_per_dev_params [configNr].dev->mtu); |
| 187 | retval = 0; | 273 | retval = 0; |
| 188 | } | 274 | } |
| @@ -192,8 +278,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 192 | case OID_GEN_RECEIVE_BLOCK_SIZE: | 278 | case OID_GEN_RECEIVE_BLOCK_SIZE: |
| 193 | DEBUG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __FUNCTION__); | 279 | DEBUG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __FUNCTION__); |
| 194 | if (rndis_per_dev_params [configNr].dev) { | 280 | if (rndis_per_dev_params [configNr].dev) { |
| 195 | length = 4; | 281 | *outbuf = cpu_to_le32 ( |
| 196 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 197 | rndis_per_dev_params [configNr].dev->mtu); | 282 | rndis_per_dev_params [configNr].dev->mtu); |
| 198 | retval = 0; | 283 | retval = 0; |
| 199 | } | 284 | } |
| @@ -202,8 +287,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 202 | /* mandatory */ | 287 | /* mandatory */ |
| 203 | case OID_GEN_VENDOR_ID: | 288 | case OID_GEN_VENDOR_ID: |
| 204 | DEBUG("%s: OID_GEN_VENDOR_ID\n", __FUNCTION__); | 289 | DEBUG("%s: OID_GEN_VENDOR_ID\n", __FUNCTION__); |
| 205 | length = 4; | 290 | *outbuf = cpu_to_le32 ( |
| 206 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 207 | rndis_per_dev_params [configNr].vendorID); | 291 | rndis_per_dev_params [configNr].vendorID); |
| 208 | retval = 0; | 292 | retval = 0; |
| 209 | break; | 293 | break; |
| @@ -212,51 +296,44 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 212 | case OID_GEN_VENDOR_DESCRIPTION: | 296 | case OID_GEN_VENDOR_DESCRIPTION: |
| 213 | DEBUG("%s: OID_GEN_VENDOR_DESCRIPTION\n", __FUNCTION__); | 297 | DEBUG("%s: OID_GEN_VENDOR_DESCRIPTION\n", __FUNCTION__); |
| 214 | length = strlen (rndis_per_dev_params [configNr].vendorDescr); | 298 | length = strlen (rndis_per_dev_params [configNr].vendorDescr); |
| 215 | memcpy ((u8 *) resp + 24, | 299 | memcpy (outbuf, |
| 216 | rndis_per_dev_params [configNr].vendorDescr, length); | 300 | rndis_per_dev_params [configNr].vendorDescr, length); |
| 217 | retval = 0; | 301 | retval = 0; |
| 218 | break; | 302 | break; |
| 219 | 303 | ||
| 220 | case OID_GEN_VENDOR_DRIVER_VERSION: | 304 | case OID_GEN_VENDOR_DRIVER_VERSION: |
| 221 | DEBUG("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __FUNCTION__); | 305 | DEBUG("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __FUNCTION__); |
| 222 | length = 4; | ||
| 223 | /* Created as LE */ | 306 | /* Created as LE */ |
| 224 | *((__le32 *) resp + 6) = rndis_driver_version; | 307 | *outbuf = rndis_driver_version; |
| 225 | retval = 0; | 308 | retval = 0; |
| 226 | break; | 309 | break; |
| 227 | 310 | ||
| 228 | /* mandatory */ | 311 | /* mandatory */ |
| 229 | case OID_GEN_CURRENT_PACKET_FILTER: | 312 | case OID_GEN_CURRENT_PACKET_FILTER: |
| 230 | DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __FUNCTION__); | 313 | DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __FUNCTION__); |
| 231 | length = 4; | 314 | *outbuf = cpu_to_le32 (*rndis_per_dev_params[configNr].filter); |
| 232 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 233 | rndis_per_dev_params[configNr].filter); | ||
| 234 | retval = 0; | 315 | retval = 0; |
| 235 | break; | 316 | break; |
| 236 | 317 | ||
| 237 | /* mandatory */ | 318 | /* mandatory */ |
| 238 | case OID_GEN_MAXIMUM_TOTAL_SIZE: | 319 | case OID_GEN_MAXIMUM_TOTAL_SIZE: |
| 239 | DEBUG("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __FUNCTION__); | 320 | DEBUG("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __FUNCTION__); |
| 240 | length = 4; | 321 | *outbuf = __constant_cpu_to_le32(RNDIS_MAX_TOTAL_SIZE); |
| 241 | *((__le32 *) resp + 6) = __constant_cpu_to_le32( | ||
| 242 | RNDIS_MAX_TOTAL_SIZE); | ||
| 243 | retval = 0; | 322 | retval = 0; |
| 244 | break; | 323 | break; |
| 245 | 324 | ||
| 246 | /* mandatory */ | 325 | /* mandatory */ |
| 247 | case OID_GEN_MEDIA_CONNECT_STATUS: | 326 | case OID_GEN_MEDIA_CONNECT_STATUS: |
| 248 | DEBUG("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __FUNCTION__); | 327 | if (rndis_debug > 1) |
| 249 | length = 4; | 328 | DEBUG("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __FUNCTION__); |
| 250 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 329 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 251 | rndis_per_dev_params [configNr] | ||
| 252 | .media_state); | 330 | .media_state); |
| 253 | retval = 0; | 331 | retval = 0; |
| 254 | break; | 332 | break; |
| 255 | 333 | ||
| 256 | case OID_GEN_PHYSICAL_MEDIUM: | 334 | case OID_GEN_PHYSICAL_MEDIUM: |
| 257 | DEBUG("%s: OID_GEN_PHYSICAL_MEDIUM\n", __FUNCTION__); | 335 | DEBUG("%s: OID_GEN_PHYSICAL_MEDIUM\n", __FUNCTION__); |
| 258 | length = 4; | 336 | *outbuf = __constant_cpu_to_le32 (0); |
| 259 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 260 | retval = 0; | 337 | retval = 0; |
| 261 | break; | 338 | break; |
| 262 | 339 | ||
| @@ -266,8 +343,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 266 | */ | 343 | */ |
| 267 | case OID_GEN_MAC_OPTIONS: /* from WinME */ | 344 | case OID_GEN_MAC_OPTIONS: /* from WinME */ |
| 268 | DEBUG("%s: OID_GEN_MAC_OPTIONS\n", __FUNCTION__); | 345 | DEBUG("%s: OID_GEN_MAC_OPTIONS\n", __FUNCTION__); |
| 269 | length = 4; | 346 | *outbuf = __constant_cpu_to_le32( |
| 270 | *((__le32 *) resp + 6) = __constant_cpu_to_le32( | ||
| 271 | NDIS_MAC_OPTION_RECEIVE_SERIALIZED | 347 | NDIS_MAC_OPTION_RECEIVE_SERIALIZED |
| 272 | | NDIS_MAC_OPTION_FULL_DUPLEX); | 348 | | NDIS_MAC_OPTION_FULL_DUPLEX); |
| 273 | retval = 0; | 349 | retval = 0; |
| @@ -277,62 +353,49 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 277 | 353 | ||
| 278 | /* mandatory */ | 354 | /* mandatory */ |
| 279 | case OID_GEN_XMIT_OK: | 355 | case OID_GEN_XMIT_OK: |
| 280 | DEBUG("%s: OID_GEN_XMIT_OK\n", __FUNCTION__); | 356 | if (rndis_debug > 1) |
| 357 | DEBUG("%s: OID_GEN_XMIT_OK\n", __FUNCTION__); | ||
| 281 | if (rndis_per_dev_params [configNr].stats) { | 358 | if (rndis_per_dev_params [configNr].stats) { |
| 282 | length = 4; | 359 | *outbuf = cpu_to_le32 ( |
| 283 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 284 | rndis_per_dev_params [configNr].stats->tx_packets - | 360 | rndis_per_dev_params [configNr].stats->tx_packets - |
| 285 | rndis_per_dev_params [configNr].stats->tx_errors - | 361 | rndis_per_dev_params [configNr].stats->tx_errors - |
| 286 | rndis_per_dev_params [configNr].stats->tx_dropped); | 362 | rndis_per_dev_params [configNr].stats->tx_dropped); |
| 287 | retval = 0; | 363 | retval = 0; |
| 288 | } else { | ||
| 289 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 290 | retval = 0; | ||
| 291 | } | 364 | } |
| 292 | break; | 365 | break; |
| 293 | 366 | ||
| 294 | /* mandatory */ | 367 | /* mandatory */ |
| 295 | case OID_GEN_RCV_OK: | 368 | case OID_GEN_RCV_OK: |
| 296 | DEBUG("%s: OID_GEN_RCV_OK\n", __FUNCTION__); | 369 | if (rndis_debug > 1) |
| 370 | DEBUG("%s: OID_GEN_RCV_OK\n", __FUNCTION__); | ||
| 297 | if (rndis_per_dev_params [configNr].stats) { | 371 | if (rndis_per_dev_params [configNr].stats) { |
| 298 | length = 4; | 372 | *outbuf = cpu_to_le32 ( |
| 299 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 300 | rndis_per_dev_params [configNr].stats->rx_packets - | 373 | rndis_per_dev_params [configNr].stats->rx_packets - |
| 301 | rndis_per_dev_params [configNr].stats->rx_errors - | 374 | rndis_per_dev_params [configNr].stats->rx_errors - |
| 302 | rndis_per_dev_params [configNr].stats->rx_dropped); | 375 | rndis_per_dev_params [configNr].stats->rx_dropped); |
| 303 | retval = 0; | 376 | retval = 0; |
| 304 | } else { | ||
| 305 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 306 | retval = 0; | ||
| 307 | } | 377 | } |
| 308 | break; | 378 | break; |
| 309 | 379 | ||
| 310 | /* mandatory */ | 380 | /* mandatory */ |
| 311 | case OID_GEN_XMIT_ERROR: | 381 | case OID_GEN_XMIT_ERROR: |
| 312 | DEBUG("%s: OID_GEN_XMIT_ERROR\n", __FUNCTION__); | 382 | if (rndis_debug > 1) |
| 383 | DEBUG("%s: OID_GEN_XMIT_ERROR\n", __FUNCTION__); | ||
| 313 | if (rndis_per_dev_params [configNr].stats) { | 384 | if (rndis_per_dev_params [configNr].stats) { |
| 314 | length = 4; | 385 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 315 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 316 | rndis_per_dev_params [configNr] | ||
| 317 | .stats->tx_errors); | 386 | .stats->tx_errors); |
| 318 | retval = 0; | 387 | retval = 0; |
| 319 | } else { | ||
| 320 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 321 | retval = 0; | ||
| 322 | } | 388 | } |
| 323 | break; | 389 | break; |
| 324 | 390 | ||
| 325 | /* mandatory */ | 391 | /* mandatory */ |
| 326 | case OID_GEN_RCV_ERROR: | 392 | case OID_GEN_RCV_ERROR: |
| 327 | DEBUG("%s: OID_GEN_RCV_ERROR\n", __FUNCTION__); | 393 | if (rndis_debug > 1) |
| 394 | DEBUG("%s: OID_GEN_RCV_ERROR\n", __FUNCTION__); | ||
| 328 | if (rndis_per_dev_params [configNr].stats) { | 395 | if (rndis_per_dev_params [configNr].stats) { |
| 329 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 396 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 330 | rndis_per_dev_params [configNr] | ||
| 331 | .stats->rx_errors); | 397 | .stats->rx_errors); |
| 332 | retval = 0; | 398 | retval = 0; |
| 333 | } else { | ||
| 334 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 335 | retval = 0; | ||
| 336 | } | 399 | } |
| 337 | break; | 400 | break; |
| 338 | 401 | ||
| @@ -340,13 +403,9 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 340 | case OID_GEN_RCV_NO_BUFFER: | 403 | case OID_GEN_RCV_NO_BUFFER: |
| 341 | DEBUG("%s: OID_GEN_RCV_NO_BUFFER\n", __FUNCTION__); | 404 | DEBUG("%s: OID_GEN_RCV_NO_BUFFER\n", __FUNCTION__); |
| 342 | if (rndis_per_dev_params [configNr].stats) { | 405 | if (rndis_per_dev_params [configNr].stats) { |
| 343 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 406 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 344 | rndis_per_dev_params [configNr] | ||
| 345 | .stats->rx_dropped); | 407 | .stats->rx_dropped); |
| 346 | retval = 0; | 408 | retval = 0; |
| 347 | } else { | ||
| 348 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 349 | retval = 0; | ||
| 350 | } | 409 | } |
| 351 | break; | 410 | break; |
| 352 | 411 | ||
| @@ -359,8 +418,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 359 | * divided by weight of Alpha Centauri | 418 | * divided by weight of Alpha Centauri |
| 360 | */ | 419 | */ |
| 361 | if (rndis_per_dev_params [configNr].stats) { | 420 | if (rndis_per_dev_params [configNr].stats) { |
| 362 | length = 4; | 421 | *outbuf = cpu_to_le32 ( |
| 363 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 364 | (rndis_per_dev_params [configNr] | 422 | (rndis_per_dev_params [configNr] |
| 365 | .stats->tx_packets - | 423 | .stats->tx_packets - |
| 366 | rndis_per_dev_params [configNr] | 424 | rndis_per_dev_params [configNr] |
| @@ -369,9 +427,6 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 369 | .stats->tx_dropped) | 427 | .stats->tx_dropped) |
| 370 | * 123); | 428 | * 123); |
| 371 | retval = 0; | 429 | retval = 0; |
| 372 | } else { | ||
| 373 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 374 | retval = 0; | ||
| 375 | } | 430 | } |
| 376 | break; | 431 | break; |
| 377 | 432 | ||
| @@ -379,8 +434,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 379 | DEBUG("%s: OID_GEN_DIRECTED_FRAMES_XMIT\n", __FUNCTION__); | 434 | DEBUG("%s: OID_GEN_DIRECTED_FRAMES_XMIT\n", __FUNCTION__); |
| 380 | /* dito */ | 435 | /* dito */ |
| 381 | if (rndis_per_dev_params [configNr].stats) { | 436 | if (rndis_per_dev_params [configNr].stats) { |
| 382 | length = 4; | 437 | *outbuf = cpu_to_le32 ( |
| 383 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 384 | (rndis_per_dev_params [configNr] | 438 | (rndis_per_dev_params [configNr] |
| 385 | .stats->tx_packets - | 439 | .stats->tx_packets - |
| 386 | rndis_per_dev_params [configNr] | 440 | rndis_per_dev_params [configNr] |
| @@ -389,144 +443,105 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 389 | .stats->tx_dropped) | 443 | .stats->tx_dropped) |
| 390 | / 123); | 444 | / 123); |
| 391 | retval = 0; | 445 | retval = 0; |
| 392 | } else { | ||
| 393 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 394 | retval = 0; | ||
| 395 | } | 446 | } |
| 396 | break; | 447 | break; |
| 397 | 448 | ||
| 398 | case OID_GEN_MULTICAST_BYTES_XMIT: | 449 | case OID_GEN_MULTICAST_BYTES_XMIT: |
| 399 | DEBUG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __FUNCTION__); | 450 | DEBUG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __FUNCTION__); |
| 400 | if (rndis_per_dev_params [configNr].stats) { | 451 | if (rndis_per_dev_params [configNr].stats) { |
| 401 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 452 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 402 | rndis_per_dev_params [configNr] | ||
| 403 | .stats->multicast*1234); | 453 | .stats->multicast*1234); |
| 404 | retval = 0; | 454 | retval = 0; |
| 405 | } else { | ||
| 406 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 407 | retval = 0; | ||
| 408 | } | 455 | } |
| 409 | break; | 456 | break; |
| 410 | 457 | ||
| 411 | case OID_GEN_MULTICAST_FRAMES_XMIT: | 458 | case OID_GEN_MULTICAST_FRAMES_XMIT: |
| 412 | DEBUG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __FUNCTION__); | 459 | DEBUG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __FUNCTION__); |
| 413 | if (rndis_per_dev_params [configNr].stats) { | 460 | if (rndis_per_dev_params [configNr].stats) { |
| 414 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 461 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 415 | rndis_per_dev_params [configNr] | ||
| 416 | .stats->multicast); | 462 | .stats->multicast); |
| 417 | retval = 0; | 463 | retval = 0; |
| 418 | } else { | ||
| 419 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 420 | retval = 0; | ||
| 421 | } | 464 | } |
| 422 | break; | 465 | break; |
| 423 | 466 | ||
| 424 | case OID_GEN_BROADCAST_BYTES_XMIT: | 467 | case OID_GEN_BROADCAST_BYTES_XMIT: |
| 425 | DEBUG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __FUNCTION__); | 468 | DEBUG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __FUNCTION__); |
| 426 | if (rndis_per_dev_params [configNr].stats) { | 469 | if (rndis_per_dev_params [configNr].stats) { |
| 427 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 470 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 428 | rndis_per_dev_params [configNr] | ||
| 429 | .stats->tx_packets/42*255); | 471 | .stats->tx_packets/42*255); |
| 430 | retval = 0; | 472 | retval = 0; |
| 431 | } else { | ||
| 432 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 433 | retval = 0; | ||
| 434 | } | 473 | } |
| 435 | break; | 474 | break; |
| 436 | 475 | ||
| 437 | case OID_GEN_BROADCAST_FRAMES_XMIT: | 476 | case OID_GEN_BROADCAST_FRAMES_XMIT: |
| 438 | DEBUG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __FUNCTION__); | 477 | DEBUG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __FUNCTION__); |
| 439 | if (rndis_per_dev_params [configNr].stats) { | 478 | if (rndis_per_dev_params [configNr].stats) { |
| 440 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 479 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 441 | rndis_per_dev_params [configNr] | ||
| 442 | .stats->tx_packets/42); | 480 | .stats->tx_packets/42); |
| 443 | retval = 0; | 481 | retval = 0; |
| 444 | } else { | ||
| 445 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 446 | retval = 0; | ||
| 447 | } | 482 | } |
| 448 | break; | 483 | break; |
| 449 | 484 | ||
| 450 | case OID_GEN_DIRECTED_BYTES_RCV: | 485 | case OID_GEN_DIRECTED_BYTES_RCV: |
| 451 | DEBUG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __FUNCTION__); | 486 | DEBUG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __FUNCTION__); |
| 452 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | 487 | *outbuf = __constant_cpu_to_le32 (0); |
| 453 | retval = 0; | 488 | retval = 0; |
| 454 | break; | 489 | break; |
| 455 | 490 | ||
| 456 | case OID_GEN_DIRECTED_FRAMES_RCV: | 491 | case OID_GEN_DIRECTED_FRAMES_RCV: |
| 457 | DEBUG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __FUNCTION__); | 492 | DEBUG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __FUNCTION__); |
| 458 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | 493 | *outbuf = __constant_cpu_to_le32 (0); |
| 459 | retval = 0; | 494 | retval = 0; |
| 460 | break; | 495 | break; |
| 461 | 496 | ||
| 462 | case OID_GEN_MULTICAST_BYTES_RCV: | 497 | case OID_GEN_MULTICAST_BYTES_RCV: |
| 463 | DEBUG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __FUNCTION__); | 498 | DEBUG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __FUNCTION__); |
| 464 | if (rndis_per_dev_params [configNr].stats) { | 499 | if (rndis_per_dev_params [configNr].stats) { |
| 465 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 500 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 466 | rndis_per_dev_params [configNr] | ||
| 467 | .stats->multicast * 1111); | 501 | .stats->multicast * 1111); |
| 468 | retval = 0; | 502 | retval = 0; |
| 469 | } else { | ||
| 470 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 471 | retval = 0; | ||
| 472 | } | 503 | } |
| 473 | break; | 504 | break; |
| 474 | 505 | ||
| 475 | case OID_GEN_MULTICAST_FRAMES_RCV: | 506 | case OID_GEN_MULTICAST_FRAMES_RCV: |
| 476 | DEBUG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __FUNCTION__); | 507 | DEBUG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __FUNCTION__); |
| 477 | if (rndis_per_dev_params [configNr].stats) { | 508 | if (rndis_per_dev_params [configNr].stats) { |
| 478 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 509 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 479 | rndis_per_dev_params [configNr] | ||
| 480 | .stats->multicast); | 510 | .stats->multicast); |
| 481 | retval = 0; | 511 | retval = 0; |
| 482 | } else { | ||
| 483 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 484 | retval = 0; | ||
| 485 | } | 512 | } |
| 486 | break; | 513 | break; |
| 487 | 514 | ||
| 488 | case OID_GEN_BROADCAST_BYTES_RCV: | 515 | case OID_GEN_BROADCAST_BYTES_RCV: |
| 489 | DEBUG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __FUNCTION__); | 516 | DEBUG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __FUNCTION__); |
| 490 | if (rndis_per_dev_params [configNr].stats) { | 517 | if (rndis_per_dev_params [configNr].stats) { |
| 491 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 518 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 492 | rndis_per_dev_params [configNr] | ||
| 493 | .stats->rx_packets/42*255); | 519 | .stats->rx_packets/42*255); |
| 494 | retval = 0; | 520 | retval = 0; |
| 495 | } else { | ||
| 496 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 497 | retval = 0; | ||
| 498 | } | 521 | } |
| 499 | break; | 522 | break; |
| 500 | 523 | ||
| 501 | case OID_GEN_BROADCAST_FRAMES_RCV: | 524 | case OID_GEN_BROADCAST_FRAMES_RCV: |
| 502 | DEBUG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __FUNCTION__); | 525 | DEBUG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __FUNCTION__); |
| 503 | if (rndis_per_dev_params [configNr].stats) { | 526 | if (rndis_per_dev_params [configNr].stats) { |
| 504 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 527 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 505 | rndis_per_dev_params [configNr] | ||
| 506 | .stats->rx_packets/42); | 528 | .stats->rx_packets/42); |
| 507 | retval = 0; | 529 | retval = 0; |
| 508 | } else { | ||
| 509 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 510 | retval = 0; | ||
| 511 | } | 530 | } |
| 512 | break; | 531 | break; |
| 513 | 532 | ||
| 514 | case OID_GEN_RCV_CRC_ERROR: | 533 | case OID_GEN_RCV_CRC_ERROR: |
| 515 | DEBUG("%s: OID_GEN_RCV_CRC_ERROR\n", __FUNCTION__); | 534 | DEBUG("%s: OID_GEN_RCV_CRC_ERROR\n", __FUNCTION__); |
| 516 | if (rndis_per_dev_params [configNr].stats) { | 535 | if (rndis_per_dev_params [configNr].stats) { |
| 517 | *((__le32 *) resp + 6) = cpu_to_le32 ( | 536 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 518 | rndis_per_dev_params [configNr] | ||
| 519 | .stats->rx_crc_errors); | 537 | .stats->rx_crc_errors); |
| 520 | retval = 0; | 538 | retval = 0; |
| 521 | } else { | ||
| 522 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 523 | retval = 0; | ||
| 524 | } | 539 | } |
| 525 | break; | 540 | break; |
| 526 | 541 | ||
| 527 | case OID_GEN_TRANSMIT_QUEUE_LENGTH: | 542 | case OID_GEN_TRANSMIT_QUEUE_LENGTH: |
| 528 | DEBUG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __FUNCTION__); | 543 | DEBUG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __FUNCTION__); |
| 529 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | 544 | *outbuf = __constant_cpu_to_le32 (0); |
| 530 | retval = 0; | 545 | retval = 0; |
| 531 | break; | 546 | break; |
| 532 | #endif /* RNDIS_OPTIONAL_STATS */ | 547 | #endif /* RNDIS_OPTIONAL_STATS */ |
| @@ -538,13 +553,10 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 538 | DEBUG("%s: OID_802_3_PERMANENT_ADDRESS\n", __FUNCTION__); | 553 | DEBUG("%s: OID_802_3_PERMANENT_ADDRESS\n", __FUNCTION__); |
| 539 | if (rndis_per_dev_params [configNr].dev) { | 554 | if (rndis_per_dev_params [configNr].dev) { |
| 540 | length = ETH_ALEN; | 555 | length = ETH_ALEN; |
| 541 | memcpy ((u8 *) resp + 24, | 556 | memcpy (outbuf, |
| 542 | rndis_per_dev_params [configNr].host_mac, | 557 | rndis_per_dev_params [configNr].host_mac, |
| 543 | length); | 558 | length); |
| 544 | retval = 0; | 559 | retval = 0; |
| 545 | } else { | ||
| 546 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 547 | retval = 0; | ||
| 548 | } | 560 | } |
| 549 | break; | 561 | break; |
| 550 | 562 | ||
| @@ -553,7 +565,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 553 | DEBUG("%s: OID_802_3_CURRENT_ADDRESS\n", __FUNCTION__); | 565 | DEBUG("%s: OID_802_3_CURRENT_ADDRESS\n", __FUNCTION__); |
| 554 | if (rndis_per_dev_params [configNr].dev) { | 566 | if (rndis_per_dev_params [configNr].dev) { |
| 555 | length = ETH_ALEN; | 567 | length = ETH_ALEN; |
| 556 | memcpy ((u8 *) resp + 24, | 568 | memcpy (outbuf, |
| 557 | rndis_per_dev_params [configNr].host_mac, | 569 | rndis_per_dev_params [configNr].host_mac, |
| 558 | length); | 570 | length); |
| 559 | retval = 0; | 571 | retval = 0; |
| @@ -563,18 +575,16 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 563 | /* mandatory */ | 575 | /* mandatory */ |
| 564 | case OID_802_3_MULTICAST_LIST: | 576 | case OID_802_3_MULTICAST_LIST: |
| 565 | DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__); | 577 | DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__); |
| 566 | length = 4; | ||
| 567 | /* Multicast base address only */ | 578 | /* Multicast base address only */ |
| 568 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0xE0000000); | 579 | *outbuf = __constant_cpu_to_le32 (0xE0000000); |
| 569 | retval = 0; | 580 | retval = 0; |
| 570 | break; | 581 | break; |
| 571 | 582 | ||
| 572 | /* mandatory */ | 583 | /* mandatory */ |
| 573 | case OID_802_3_MAXIMUM_LIST_SIZE: | 584 | case OID_802_3_MAXIMUM_LIST_SIZE: |
| 574 | DEBUG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __FUNCTION__); | 585 | DEBUG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __FUNCTION__); |
| 575 | length = 4; | ||
| 576 | /* Multicast base address only */ | 586 | /* Multicast base address only */ |
| 577 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (1); | 587 | *outbuf = __constant_cpu_to_le32 (1); |
| 578 | retval = 0; | 588 | retval = 0; |
| 579 | break; | 589 | break; |
| 580 | 590 | ||
| @@ -587,11 +597,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 587 | /* mandatory */ | 597 | /* mandatory */ |
| 588 | case OID_802_3_RCV_ERROR_ALIGNMENT: | 598 | case OID_802_3_RCV_ERROR_ALIGNMENT: |
| 589 | DEBUG("%s: OID_802_3_RCV_ERROR_ALIGNMENT\n", __FUNCTION__); | 599 | DEBUG("%s: OID_802_3_RCV_ERROR_ALIGNMENT\n", __FUNCTION__); |
| 590 | if (rndis_per_dev_params [configNr].stats) | 600 | if (rndis_per_dev_params [configNr].stats) { |
| 591 | { | 601 | *outbuf = cpu_to_le32 (rndis_per_dev_params [configNr] |
| 592 | length = 4; | ||
| 593 | *((__le32 *) resp + 6) = cpu_to_le32 ( | ||
| 594 | rndis_per_dev_params [configNr] | ||
| 595 | .stats->rx_frame_errors); | 602 | .stats->rx_frame_errors); |
| 596 | retval = 0; | 603 | retval = 0; |
| 597 | } | 604 | } |
| @@ -600,16 +607,14 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 600 | /* mandatory */ | 607 | /* mandatory */ |
| 601 | case OID_802_3_XMIT_ONE_COLLISION: | 608 | case OID_802_3_XMIT_ONE_COLLISION: |
| 602 | DEBUG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __FUNCTION__); | 609 | DEBUG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __FUNCTION__); |
| 603 | length = 4; | 610 | *outbuf = __constant_cpu_to_le32 (0); |
| 604 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 605 | retval = 0; | 611 | retval = 0; |
| 606 | break; | 612 | break; |
| 607 | 613 | ||
| 608 | /* mandatory */ | 614 | /* mandatory */ |
| 609 | case OID_802_3_XMIT_MORE_COLLISIONS: | 615 | case OID_802_3_XMIT_MORE_COLLISIONS: |
| 610 | DEBUG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __FUNCTION__); | 616 | DEBUG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __FUNCTION__); |
| 611 | length = 4; | 617 | *outbuf = __constant_cpu_to_le32 (0); |
| 612 | *((__le32 *) resp + 6) = __constant_cpu_to_le32 (0); | ||
| 613 | retval = 0; | 618 | retval = 0; |
| 614 | break; | 619 | break; |
| 615 | 620 | ||
| @@ -655,27 +660,18 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 655 | case OID_PNP_CAPABILITIES: | 660 | case OID_PNP_CAPABILITIES: |
| 656 | DEBUG("%s: OID_PNP_CAPABILITIES\n", __FUNCTION__); | 661 | DEBUG("%s: OID_PNP_CAPABILITIES\n", __FUNCTION__); |
| 657 | 662 | ||
| 658 | /* just PM, and remote wakeup on link status change | 663 | /* for now, no wakeup capabilities */ |
| 659 | * (not magic packet or pattern match) | ||
| 660 | */ | ||
| 661 | length = sizeof (struct NDIS_PNP_CAPABILITIES); | 664 | length = sizeof (struct NDIS_PNP_CAPABILITIES); |
| 662 | memset (resp, 0, length); | 665 | memset(outbuf, 0, length); |
| 663 | { | ||
| 664 | struct NDIS_PNP_CAPABILITIES *caps = (void *) resp; | ||
| 665 | |||
| 666 | caps->Flags = NDIS_DEVICE_WAKE_UP_ENABLE; | ||
| 667 | caps->WakeUpCapabilities.MinLinkChangeWakeUp | ||
| 668 | = NdisDeviceStateD3; | ||
| 669 | |||
| 670 | /* FIXME then use usb_gadget_wakeup(), and | ||
| 671 | * set USB_CONFIG_ATT_WAKEUP in config desc | ||
| 672 | */ | ||
| 673 | } | ||
| 674 | retval = 0; | 666 | retval = 0; |
| 675 | break; | 667 | break; |
| 676 | case OID_PNP_QUERY_POWER: | 668 | case OID_PNP_QUERY_POWER: |
| 677 | DEBUG("%s: OID_PNP_QUERY_POWER\n", __FUNCTION__); | 669 | DEBUG("%s: OID_PNP_QUERY_POWER D%d\n", __FUNCTION__, |
| 678 | /* sure, handle any power state that maps to USB suspend */ | 670 | le32_to_cpup((__le32 *) buf) - 1); |
| 671 | /* only suspend is a real power state, and | ||
| 672 | * it can't be entered by OID_PNP_SET_POWER... | ||
| 673 | */ | ||
| 674 | length = 0; | ||
| 679 | retval = 0; | 675 | retval = 0; |
| 680 | break; | 676 | break; |
| 681 | #endif | 677 | #endif |
| @@ -684,11 +680,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) | |||
| 684 | printk (KERN_WARNING "%s: query unknown OID 0x%08X\n", | 680 | printk (KERN_WARNING "%s: query unknown OID 0x%08X\n", |
| 685 | __FUNCTION__, OID); | 681 | __FUNCTION__, OID); |
| 686 | } | 682 | } |
| 683 | if (retval < 0) | ||
| 684 | length = 0; | ||
| 687 | 685 | ||
| 688 | resp->InformationBufferOffset = __constant_cpu_to_le32 (16); | ||
| 689 | resp->InformationBufferLength = cpu_to_le32 (length); | 686 | resp->InformationBufferLength = cpu_to_le32 (length); |
| 690 | resp->MessageLength = cpu_to_le32 (24 + length); | 687 | r->length = length + sizeof *resp; |
| 691 | r->length = 24 + length; | 688 | resp->MessageLength = cpu_to_le32 (r->length); |
| 692 | return retval; | 689 | return retval; |
| 693 | } | 690 | } |
| 694 | 691 | ||
| @@ -705,45 +702,40 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, | |||
| 705 | if (!resp) | 702 | if (!resp) |
| 706 | return -ENOMEM; | 703 | return -ENOMEM; |
| 707 | 704 | ||
| 708 | DEBUG("set OID %08x value, len %d:\n", OID, buf_len); | 705 | if (buf_len && rndis_debug > 1) { |
| 709 | for (i = 0; i < buf_len; i += 16) { | 706 | DEBUG("set OID %08x value, len %d:\n", OID, buf_len); |
| 710 | DEBUG ("%03d: " | 707 | for (i = 0; i < buf_len; i += 16) { |
| 711 | " %02x %02x %02x %02x" | 708 | DEBUG ("%03d: %08x %08x %08x %08x\n", i, |
| 712 | " %02x %02x %02x %02x" | 709 | le32_to_cpup((__le32 *)&buf[i]), |
| 713 | " %02x %02x %02x %02x" | 710 | le32_to_cpup((__le32 *)&buf[i + 4]), |
| 714 | " %02x %02x %02x %02x" | 711 | le32_to_cpup((__le32 *)&buf[i + 8]), |
| 715 | "\n", | 712 | le32_to_cpup((__le32 *)&buf[i + 12])); |
| 716 | i, | 713 | } |
| 717 | buf[i], buf [i+1], | ||
| 718 | buf[i+2], buf[i+3], | ||
| 719 | buf[i+4], buf [i+5], | ||
| 720 | buf[i+6], buf[i+7], | ||
| 721 | buf[i+8], buf [i+9], | ||
| 722 | buf[i+10], buf[i+11], | ||
| 723 | buf[i+12], buf [i+13], | ||
| 724 | buf[i+14], buf[i+15]); | ||
| 725 | } | 714 | } |
| 726 | 715 | ||
| 716 | params = &rndis_per_dev_params [configNr]; | ||
| 727 | switch (OID) { | 717 | switch (OID) { |
| 728 | case OID_GEN_CURRENT_PACKET_FILTER: | 718 | case OID_GEN_CURRENT_PACKET_FILTER: |
| 729 | params = &rndis_per_dev_params [configNr]; | ||
| 730 | retval = 0; | ||
| 731 | 719 | ||
| 732 | /* FIXME use these NDIS_PACKET_TYPE_* bitflags to | 720 | /* these NDIS_PACKET_TYPE_* bitflags are shared with |
| 733 | * set the cdc_filter; it's not RNDIS-specific | 721 | * cdc_filter; it's not RNDIS-specific |
| 734 | * NDIS_PACKET_TYPE_x == USB_CDC_PACKET_TYPE_x for x in: | 722 | * NDIS_PACKET_TYPE_x == USB_CDC_PACKET_TYPE_x for x in: |
| 735 | * PROMISCUOUS, DIRECTED, | 723 | * PROMISCUOUS, DIRECTED, |
| 736 | * MULTICAST, ALL_MULTICAST, BROADCAST | 724 | * MULTICAST, ALL_MULTICAST, BROADCAST |
| 737 | */ | 725 | */ |
| 738 | params->filter = le32_to_cpup((__le32 *)buf); | 726 | *params->filter = (u16) le32_to_cpup((__le32 *)buf); |
| 739 | DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER %08x\n", | 727 | DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER %08x\n", |
| 740 | __FUNCTION__, params->filter); | 728 | __FUNCTION__, *params->filter); |
| 741 | 729 | ||
| 742 | /* this call has a significant side effect: it's | 730 | /* this call has a significant side effect: it's |
| 743 | * what makes the packet flow start and stop, like | 731 | * what makes the packet flow start and stop, like |
| 744 | * activating the CDC Ethernet altsetting. | 732 | * activating the CDC Ethernet altsetting. |
| 745 | */ | 733 | */ |
| 746 | if (params->filter) { | 734 | #ifdef RNDIS_PM |
| 735 | update_linkstate: | ||
| 736 | #endif | ||
| 737 | retval = 0; | ||
| 738 | if (*params->filter) { | ||
| 747 | params->state = RNDIS_DATA_INITIALIZED; | 739 | params->state = RNDIS_DATA_INITIALIZED; |
| 748 | netif_carrier_on(params->dev); | 740 | netif_carrier_on(params->dev); |
| 749 | if (netif_running(params->dev)) | 741 | if (netif_running(params->dev)) |
| @@ -776,21 +768,34 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, | |||
| 776 | 768 | ||
| 777 | #ifdef RNDIS_PM | 769 | #ifdef RNDIS_PM |
| 778 | case OID_PNP_SET_POWER: | 770 | case OID_PNP_SET_POWER: |
| 779 | DEBUG ("OID_PNP_SET_POWER\n"); | 771 | /* The only real power state is USB suspend, and RNDIS requests |
| 780 | /* sure, handle any power state that maps to USB suspend */ | 772 | * can't enter it; this one isn't really about power. After |
| 781 | retval = 0; | 773 | * resuming, Windows forces a reset, and then SET_POWER D0. |
| 782 | break; | 774 | * FIXME ... then things go batty; Windows wedges itself. |
| 783 | 775 | */ | |
| 784 | case OID_PNP_ENABLE_WAKE_UP: | 776 | i = le32_to_cpup((__force __le32 *)buf); |
| 785 | /* always-connected ... */ | 777 | DEBUG("%s: OID_PNP_SET_POWER D%d\n", __FUNCTION__, i - 1); |
| 786 | DEBUG ("OID_PNP_ENABLE_WAKE_UP\n"); | 778 | switch (i) { |
| 787 | retval = 0; | 779 | case NdisDeviceStateD0: |
| 780 | *params->filter = params->saved_filter; | ||
| 781 | goto update_linkstate; | ||
| 782 | case NdisDeviceStateD3: | ||
| 783 | case NdisDeviceStateD2: | ||
| 784 | case NdisDeviceStateD1: | ||
| 785 | params->saved_filter = *params->filter; | ||
| 786 | retval = 0; | ||
| 787 | break; | ||
| 788 | } | ||
| 788 | break; | 789 | break; |
| 789 | 790 | ||
| 790 | // no PM resume patterns supported (specified where?) | 791 | #ifdef RNDIS_WAKEUP |
| 791 | // so OID_PNP_{ADD,REMOVE}_WAKE_UP_PATTERN always fails | 792 | // no wakeup support advertised, so wakeup OIDs always fail: |
| 793 | // - OID_PNP_ENABLE_WAKE_UP | ||
| 794 | // - OID_PNP_{ADD,REMOVE}_WAKE_UP_PATTERN | ||
| 792 | #endif | 795 | #endif |
| 793 | 796 | ||
| 797 | #endif /* RNDIS_PM */ | ||
| 798 | |||
| 794 | default: | 799 | default: |
| 795 | printk (KERN_WARNING "%s: set unknown OID 0x%08X, size %d\n", | 800 | printk (KERN_WARNING "%s: set unknown OID 0x%08X, size %d\n", |
| 796 | __FUNCTION__, OID, buf_len); | 801 | __FUNCTION__, OID, buf_len); |
| @@ -811,13 +816,10 @@ static int rndis_init_response (int configNr, rndis_init_msg_type *buf) | |||
| 811 | if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP; | 816 | if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP; |
| 812 | 817 | ||
| 813 | r = rndis_add_response (configNr, sizeof (rndis_init_cmplt_type)); | 818 | r = rndis_add_response (configNr, sizeof (rndis_init_cmplt_type)); |
| 814 | 819 | if (!r) | |
| 815 | if (!r) return -ENOMEM; | 820 | return -ENOMEM; |
| 816 | |||
| 817 | resp = (rndis_init_cmplt_type *) r->buf; | 821 | resp = (rndis_init_cmplt_type *) r->buf; |
| 818 | 822 | ||
| 819 | if (!resp) return -ENOMEM; | ||
| 820 | |||
| 821 | resp->MessageType = __constant_cpu_to_le32 ( | 823 | resp->MessageType = __constant_cpu_to_le32 ( |
| 822 | REMOTE_NDIS_INITIALIZE_CMPLT); | 824 | REMOTE_NDIS_INITIALIZE_CMPLT); |
| 823 | resp->MessageLength = __constant_cpu_to_le32 (52); | 825 | resp->MessageLength = __constant_cpu_to_le32 (52); |
| @@ -857,20 +859,22 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf) | |||
| 857 | * oid_supported_list is the largest answer | 859 | * oid_supported_list is the largest answer |
| 858 | */ | 860 | */ |
| 859 | r = rndis_add_response (configNr, sizeof (oid_supported_list)); | 861 | r = rndis_add_response (configNr, sizeof (oid_supported_list)); |
| 860 | 862 | if (!r) | |
| 861 | if (!r) return -ENOMEM; | 863 | return -ENOMEM; |
| 862 | resp = (rndis_query_cmplt_type *) r->buf; | 864 | resp = (rndis_query_cmplt_type *) r->buf; |
| 863 | 865 | ||
| 864 | if (!resp) return -ENOMEM; | ||
| 865 | |||
| 866 | resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_QUERY_CMPLT); | 866 | resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_QUERY_CMPLT); |
| 867 | resp->MessageLength = __constant_cpu_to_le32 (24); | ||
| 868 | resp->RequestID = buf->RequestID; /* Still LE in msg buffer */ | 867 | resp->RequestID = buf->RequestID; /* Still LE in msg buffer */ |
| 869 | 868 | ||
| 870 | if (gen_ndis_query_resp (configNr, le32_to_cpu (buf->OID), r)) { | 869 | if (gen_ndis_query_resp (configNr, le32_to_cpu (buf->OID), |
| 870 | le32_to_cpu(buf->InformationBufferOffset) | ||
| 871 | + 8 + (u8 *) buf, | ||
| 872 | le32_to_cpu(buf->InformationBufferLength), | ||
| 873 | r)) { | ||
| 871 | /* OID not supported */ | 874 | /* OID not supported */ |
| 872 | resp->Status = __constant_cpu_to_le32 ( | 875 | resp->Status = __constant_cpu_to_le32 ( |
| 873 | RNDIS_STATUS_NOT_SUPPORTED); | 876 | RNDIS_STATUS_NOT_SUPPORTED); |
| 877 | resp->MessageLength = __constant_cpu_to_le32 (sizeof *resp); | ||
| 874 | resp->InformationBufferLength = __constant_cpu_to_le32 (0); | 878 | resp->InformationBufferLength = __constant_cpu_to_le32 (0); |
| 875 | resp->InformationBufferOffset = __constant_cpu_to_le32 (0); | 879 | resp->InformationBufferOffset = __constant_cpu_to_le32 (0); |
| 876 | } else | 880 | } else |
| @@ -889,10 +893,9 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf) | |||
| 889 | rndis_resp_t *r; | 893 | rndis_resp_t *r; |
| 890 | 894 | ||
| 891 | r = rndis_add_response (configNr, sizeof (rndis_set_cmplt_type)); | 895 | r = rndis_add_response (configNr, sizeof (rndis_set_cmplt_type)); |
| 892 | 896 | if (!r) | |
| 893 | if (!r) return -ENOMEM; | 897 | return -ENOMEM; |
| 894 | resp = (rndis_set_cmplt_type *) r->buf; | 898 | resp = (rndis_set_cmplt_type *) r->buf; |
| 895 | if (!resp) return -ENOMEM; | ||
| 896 | 899 | ||
| 897 | BufLength = le32_to_cpu (buf->InformationBufferLength); | 900 | BufLength = le32_to_cpu (buf->InformationBufferLength); |
| 898 | BufOffset = le32_to_cpu (buf->InformationBufferOffset); | 901 | BufOffset = le32_to_cpu (buf->InformationBufferOffset); |
| @@ -930,10 +933,9 @@ static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf) | |||
| 930 | rndis_resp_t *r; | 933 | rndis_resp_t *r; |
| 931 | 934 | ||
| 932 | r = rndis_add_response (configNr, sizeof (rndis_reset_cmplt_type)); | 935 | r = rndis_add_response (configNr, sizeof (rndis_reset_cmplt_type)); |
| 933 | 936 | if (!r) | |
| 934 | if (!r) return -ENOMEM; | 937 | return -ENOMEM; |
| 935 | resp = (rndis_reset_cmplt_type *) r->buf; | 938 | resp = (rndis_reset_cmplt_type *) r->buf; |
| 936 | if (!resp) return -ENOMEM; | ||
| 937 | 939 | ||
| 938 | resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_RESET_CMPLT); | 940 | resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_RESET_CMPLT); |
| 939 | resp->MessageLength = __constant_cpu_to_le32 (16); | 941 | resp->MessageLength = __constant_cpu_to_le32 (16); |
| @@ -957,8 +959,9 @@ static int rndis_keepalive_response (int configNr, | |||
| 957 | /* host "should" check only in RNDIS_DATA_INITIALIZED state */ | 959 | /* host "should" check only in RNDIS_DATA_INITIALIZED state */ |
| 958 | 960 | ||
| 959 | r = rndis_add_response (configNr, sizeof (rndis_keepalive_cmplt_type)); | 961 | r = rndis_add_response (configNr, sizeof (rndis_keepalive_cmplt_type)); |
| 962 | if (!r) | ||
| 963 | return -ENOMEM; | ||
| 960 | resp = (rndis_keepalive_cmplt_type *) r->buf; | 964 | resp = (rndis_keepalive_cmplt_type *) r->buf; |
| 961 | if (!resp) return -ENOMEM; | ||
| 962 | 965 | ||
| 963 | resp->MessageType = __constant_cpu_to_le32 ( | 966 | resp->MessageType = __constant_cpu_to_le32 ( |
| 964 | REMOTE_NDIS_KEEPALIVE_CMPLT); | 967 | REMOTE_NDIS_KEEPALIVE_CMPLT); |
| @@ -987,10 +990,9 @@ static int rndis_indicate_status_msg (int configNr, u32 status) | |||
| 987 | 990 | ||
| 988 | r = rndis_add_response (configNr, | 991 | r = rndis_add_response (configNr, |
| 989 | sizeof (rndis_indicate_status_msg_type)); | 992 | sizeof (rndis_indicate_status_msg_type)); |
| 990 | if (!r) return -ENOMEM; | 993 | if (!r) |
| 991 | 994 | return -ENOMEM; | |
| 992 | resp = (rndis_indicate_status_msg_type *) r->buf; | 995 | resp = (rndis_indicate_status_msg_type *) r->buf; |
| 993 | if (!resp) return -ENOMEM; | ||
| 994 | 996 | ||
| 995 | resp->MessageType = __constant_cpu_to_le32 ( | 997 | resp->MessageType = __constant_cpu_to_le32 ( |
| 996 | REMOTE_NDIS_INDICATE_STATUS_MSG); | 998 | REMOTE_NDIS_INDICATE_STATUS_MSG); |
| @@ -1021,6 +1023,15 @@ int rndis_signal_disconnect (int configNr) | |||
| 1021 | RNDIS_STATUS_MEDIA_DISCONNECT); | 1023 | RNDIS_STATUS_MEDIA_DISCONNECT); |
| 1022 | } | 1024 | } |
| 1023 | 1025 | ||
| 1026 | void rndis_uninit (int configNr) | ||
| 1027 | { | ||
| 1028 | if (configNr >= RNDIS_MAX_CONFIGS) | ||
| 1029 | return; | ||
| 1030 | rndis_per_dev_params [configNr].used = 0; | ||
| 1031 | rndis_per_dev_params [configNr].state = RNDIS_UNINITIALIZED; | ||
| 1032 | return; | ||
| 1033 | } | ||
| 1034 | |||
| 1024 | void rndis_set_host_mac (int configNr, const u8 *addr) | 1035 | void rndis_set_host_mac (int configNr, const u8 *addr) |
| 1025 | { | 1036 | { |
| 1026 | rndis_per_dev_params [configNr].host_mac = addr; | 1037 | rndis_per_dev_params [configNr].host_mac = addr; |
| @@ -1046,9 +1057,13 @@ int rndis_msg_parser (u8 configNr, u8 *buf) | |||
| 1046 | return -ENOTSUPP; | 1057 | return -ENOTSUPP; |
| 1047 | params = &rndis_per_dev_params [configNr]; | 1058 | params = &rndis_per_dev_params [configNr]; |
| 1048 | 1059 | ||
| 1060 | /* NOTE: RNDIS is *EXTREMELY* chatty ... Windows constantly polls for | ||
| 1061 | * rx/tx statistics and link status, in addition to KEEPALIVE traffic | ||
| 1062 | * and normal HC level polling to see if there's any IN traffic. | ||
| 1063 | */ | ||
| 1064 | |||
| 1049 | /* For USB: responses may take up to 10 seconds */ | 1065 | /* For USB: responses may take up to 10 seconds */ |
| 1050 | switch (MsgType) | 1066 | switch (MsgType) { |
| 1051 | { | ||
| 1052 | case REMOTE_NDIS_INITIALIZE_MSG: | 1067 | case REMOTE_NDIS_INITIALIZE_MSG: |
| 1053 | DEBUG("%s: REMOTE_NDIS_INITIALIZE_MSG\n", | 1068 | DEBUG("%s: REMOTE_NDIS_INITIALIZE_MSG\n", |
| 1054 | __FUNCTION__ ); | 1069 | __FUNCTION__ ); |
| @@ -1082,10 +1097,9 @@ int rndis_msg_parser (u8 configNr, u8 *buf) | |||
| 1082 | 1097 | ||
| 1083 | case REMOTE_NDIS_KEEPALIVE_MSG: | 1098 | case REMOTE_NDIS_KEEPALIVE_MSG: |
| 1084 | /* For USB: host does this every 5 seconds */ | 1099 | /* For USB: host does this every 5 seconds */ |
| 1085 | #ifdef VERBOSE | 1100 | if (rndis_debug > 1) |
| 1086 | DEBUG("%s: REMOTE_NDIS_KEEPALIVE_MSG\n", | 1101 | DEBUG("%s: REMOTE_NDIS_KEEPALIVE_MSG\n", |
| 1087 | __FUNCTION__ ); | 1102 | __FUNCTION__ ); |
| 1088 | #endif | ||
| 1089 | return rndis_keepalive_response (configNr, | 1103 | return rndis_keepalive_response (configNr, |
| 1090 | (rndis_keepalive_msg_type *) | 1104 | (rndis_keepalive_msg_type *) |
| 1091 | buf); | 1105 | buf); |
| @@ -1152,7 +1166,8 @@ void rndis_deregister (int configNr) | |||
| 1152 | } | 1166 | } |
| 1153 | 1167 | ||
| 1154 | int rndis_set_param_dev (u8 configNr, struct net_device *dev, | 1168 | int rndis_set_param_dev (u8 configNr, struct net_device *dev, |
| 1155 | struct net_device_stats *stats) | 1169 | struct net_device_stats *stats, |
| 1170 | u16 *cdc_filter) | ||
| 1156 | { | 1171 | { |
| 1157 | DEBUG("%s:\n", __FUNCTION__ ); | 1172 | DEBUG("%s:\n", __FUNCTION__ ); |
| 1158 | if (!dev || !stats) return -1; | 1173 | if (!dev || !stats) return -1; |
| @@ -1160,6 +1175,7 @@ int rndis_set_param_dev (u8 configNr, struct net_device *dev, | |||
| 1160 | 1175 | ||
| 1161 | rndis_per_dev_params [configNr].dev = dev; | 1176 | rndis_per_dev_params [configNr].dev = dev; |
| 1162 | rndis_per_dev_params [configNr].stats = stats; | 1177 | rndis_per_dev_params [configNr].stats = stats; |
| 1178 | rndis_per_dev_params [configNr].filter = cdc_filter; | ||
| 1163 | 1179 | ||
| 1164 | return 0; | 1180 | return 0; |
| 1165 | } | 1181 | } |
| @@ -1178,7 +1194,7 @@ int rndis_set_param_vendor (u8 configNr, u32 vendorID, const char *vendorDescr) | |||
| 1178 | 1194 | ||
| 1179 | int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed) | 1195 | int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed) |
| 1180 | { | 1196 | { |
| 1181 | DEBUG("%s:\n", __FUNCTION__ ); | 1197 | DEBUG("%s: %u %u\n", __FUNCTION__, medium, speed); |
| 1182 | if (configNr >= RNDIS_MAX_CONFIGS) return -1; | 1198 | if (configNr >= RNDIS_MAX_CONFIGS) return -1; |
| 1183 | 1199 | ||
| 1184 | rndis_per_dev_params [configNr].medium = medium; | 1200 | rndis_per_dev_params [configNr].medium = medium; |
| @@ -1242,6 +1258,7 @@ static rndis_resp_t *rndis_add_response (int configNr, u32 length) | |||
| 1242 | { | 1258 | { |
| 1243 | rndis_resp_t *r; | 1259 | rndis_resp_t *r; |
| 1244 | 1260 | ||
| 1261 | /* NOTE: this gets copied into ether.c USB_BUFSIZ bytes ... */ | ||
| 1245 | r = kmalloc (sizeof (rndis_resp_t) + length, GFP_ATOMIC); | 1262 | r = kmalloc (sizeof (rndis_resp_t) + length, GFP_ATOMIC); |
| 1246 | if (!r) return NULL; | 1263 | if (!r) return NULL; |
| 1247 | 1264 | ||
diff --git a/drivers/usb/gadget/rndis.h b/drivers/usb/gadget/rndis.h index 2b5b55df3c..95b4c63261 100644 --- a/drivers/usb/gadget/rndis.h +++ b/drivers/usb/gadget/rndis.h | |||
| @@ -69,90 +69,6 @@ | |||
| 69 | #define OID_PNP_ENABLE_WAKE_UP 0xFD010106 | 69 | #define OID_PNP_ENABLE_WAKE_UP 0xFD010106 |
| 70 | 70 | ||
| 71 | 71 | ||
| 72 | /* supported OIDs */ | ||
| 73 | static const u32 oid_supported_list [] = | ||
| 74 | { | ||
| 75 | /* the general stuff */ | ||
| 76 | OID_GEN_SUPPORTED_LIST, | ||
| 77 | OID_GEN_HARDWARE_STATUS, | ||
| 78 | OID_GEN_MEDIA_SUPPORTED, | ||
| 79 | OID_GEN_MEDIA_IN_USE, | ||
| 80 | OID_GEN_MAXIMUM_FRAME_SIZE, | ||
| 81 | OID_GEN_LINK_SPEED, | ||
| 82 | OID_GEN_TRANSMIT_BLOCK_SIZE, | ||
| 83 | OID_GEN_RECEIVE_BLOCK_SIZE, | ||
| 84 | OID_GEN_VENDOR_ID, | ||
| 85 | OID_GEN_VENDOR_DESCRIPTION, | ||
| 86 | OID_GEN_VENDOR_DRIVER_VERSION, | ||
| 87 | OID_GEN_CURRENT_PACKET_FILTER, | ||
| 88 | OID_GEN_MAXIMUM_TOTAL_SIZE, | ||
| 89 | OID_GEN_MEDIA_CONNECT_STATUS, | ||
| 90 | OID_GEN_PHYSICAL_MEDIUM, | ||
| 91 | #if 0 | ||
| 92 | OID_GEN_RNDIS_CONFIG_PARAMETER, | ||
| 93 | #endif | ||
| 94 | |||
| 95 | /* the statistical stuff */ | ||
| 96 | OID_GEN_XMIT_OK, | ||
| 97 | OID_GEN_RCV_OK, | ||
| 98 | OID_GEN_XMIT_ERROR, | ||
| 99 | OID_GEN_RCV_ERROR, | ||
| 100 | OID_GEN_RCV_NO_BUFFER, | ||
| 101 | #ifdef RNDIS_OPTIONAL_STATS | ||
| 102 | OID_GEN_DIRECTED_BYTES_XMIT, | ||
| 103 | OID_GEN_DIRECTED_FRAMES_XMIT, | ||
| 104 | OID_GEN_MULTICAST_BYTES_XMIT, | ||
| 105 | OID_GEN_MULTICAST_FRAMES_XMIT, | ||
| 106 | OID_GEN_BROADCAST_BYTES_XMIT, | ||
| 107 | OID_GEN_BROADCAST_FRAMES_XMIT, | ||
| 108 | OID_GEN_DIRECTED_BYTES_RCV, | ||
| 109 | OID_GEN_DIRECTED_FRAMES_RCV, | ||
| 110 | OID_GEN_MULTICAST_BYTES_RCV, | ||
| 111 | OID_GEN_MULTICAST_FRAMES_RCV, | ||
| 112 | OID_GEN_BROADCAST_BYTES_RCV, | ||
| 113 | OID_GEN_BROADCAST_FRAMES_RCV, | ||
| 114 | OID_GEN_RCV_CRC_ERROR, | ||
| 115 | OID_GEN_TRANSMIT_QUEUE_LENGTH, | ||
| 116 | #endif /* RNDIS_OPTIONAL_STATS */ | ||
| 117 | |||
| 118 | /* mandatory 802.3 */ | ||
| 119 | /* the general stuff */ | ||
| 120 | OID_802_3_PERMANENT_ADDRESS, | ||
| 121 | OID_802_3_CURRENT_ADDRESS, | ||
| 122 | OID_802_3_MULTICAST_LIST, | ||
| 123 | OID_802_3_MAC_OPTIONS, | ||
| 124 | OID_802_3_MAXIMUM_LIST_SIZE, | ||
| 125 | |||
| 126 | /* the statistical stuff */ | ||
| 127 | OID_802_3_RCV_ERROR_ALIGNMENT, | ||
| 128 | OID_802_3_XMIT_ONE_COLLISION, | ||
| 129 | OID_802_3_XMIT_MORE_COLLISIONS, | ||
| 130 | #ifdef RNDIS_OPTIONAL_STATS | ||
| 131 | OID_802_3_XMIT_DEFERRED, | ||
| 132 | OID_802_3_XMIT_MAX_COLLISIONS, | ||
| 133 | OID_802_3_RCV_OVERRUN, | ||
| 134 | OID_802_3_XMIT_UNDERRUN, | ||
| 135 | OID_802_3_XMIT_HEARTBEAT_FAILURE, | ||
| 136 | OID_802_3_XMIT_TIMES_CRS_LOST, | ||
| 137 | OID_802_3_XMIT_LATE_COLLISIONS, | ||
| 138 | #endif /* RNDIS_OPTIONAL_STATS */ | ||
| 139 | |||
| 140 | #ifdef RNDIS_PM | ||
| 141 | /* PM and wakeup are mandatory for USB: */ | ||
| 142 | |||
| 143 | /* power management */ | ||
| 144 | OID_PNP_CAPABILITIES, | ||
| 145 | OID_PNP_QUERY_POWER, | ||
| 146 | OID_PNP_SET_POWER, | ||
| 147 | |||
| 148 | /* wake up host */ | ||
| 149 | OID_PNP_ENABLE_WAKE_UP, | ||
| 150 | OID_PNP_ADD_WAKE_UP_PATTERN, | ||
| 151 | OID_PNP_REMOVE_WAKE_UP_PATTERN, | ||
| 152 | #endif | ||
| 153 | }; | ||
| 154 | |||
| 155 | |||
| 156 | typedef struct rndis_init_msg_type | 72 | typedef struct rndis_init_msg_type |
| 157 | { | 73 | { |
| 158 | __le32 MessageType; | 74 | __le32 MessageType; |
| @@ -309,15 +225,18 @@ typedef struct rndis_resp_t | |||
| 309 | typedef struct rndis_params | 225 | typedef struct rndis_params |
| 310 | { | 226 | { |
| 311 | u8 confignr; | 227 | u8 confignr; |
| 312 | int used; | 228 | u8 used; |
| 229 | u16 saved_filter; | ||
| 313 | enum rndis_state state; | 230 | enum rndis_state state; |
| 314 | u32 filter; | ||
| 315 | u32 medium; | 231 | u32 medium; |
| 316 | u32 speed; | 232 | u32 speed; |
| 317 | u32 media_state; | 233 | u32 media_state; |
| 234 | |||
| 318 | const u8 *host_mac; | 235 | const u8 *host_mac; |
| 236 | u16 *filter; | ||
| 319 | struct net_device *dev; | 237 | struct net_device *dev; |
| 320 | struct net_device_stats *stats; | 238 | struct net_device_stats *stats; |
| 239 | |||
| 321 | u32 vendorID; | 240 | u32 vendorID; |
| 322 | const char *vendorDescr; | 241 | const char *vendorDescr; |
| 323 | int (*ack) (struct net_device *); | 242 | int (*ack) (struct net_device *); |
| @@ -329,7 +248,8 @@ int rndis_msg_parser (u8 configNr, u8 *buf); | |||
| 329 | int rndis_register (int (*rndis_control_ack) (struct net_device *)); | 248 | int rndis_register (int (*rndis_control_ack) (struct net_device *)); |
| 330 | void rndis_deregister (int configNr); | 249 | void rndis_deregister (int configNr); |
| 331 | int rndis_set_param_dev (u8 configNr, struct net_device *dev, | 250 | int rndis_set_param_dev (u8 configNr, struct net_device *dev, |
| 332 | struct net_device_stats *stats); | 251 | struct net_device_stats *stats, |
| 252 | u16 *cdc_filter); | ||
| 333 | int rndis_set_param_vendor (u8 configNr, u32 vendorID, | 253 | int rndis_set_param_vendor (u8 configNr, u32 vendorID, |
| 334 | const char *vendorDescr); | 254 | const char *vendorDescr); |
| 335 | int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed); | 255 | int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed); |
| @@ -338,6 +258,7 @@ int rndis_rm_hdr (struct sk_buff *skb); | |||
| 338 | u8 *rndis_get_next_response (int configNr, u32 *length); | 258 | u8 *rndis_get_next_response (int configNr, u32 *length); |
| 339 | void rndis_free_response (int configNr, u8 *buf); | 259 | void rndis_free_response (int configNr, u8 *buf); |
| 340 | 260 | ||
| 261 | void rndis_uninit (int configNr); | ||
| 341 | int rndis_signal_connect (int configNr); | 262 | int rndis_signal_connect (int configNr); |
| 342 | int rndis_signal_disconnect (int configNr); | 263 | int rndis_signal_disconnect (int configNr); |
| 343 | int rndis_state (int configNr); | 264 | int rndis_state (int configNr); |
