GNU Linux-libre 4.14.324-gnu1
[releases.git] / drivers / usb / gadget / function / rndis.c
1 /*
2  * RNDIS MSG parser
3  *
4  * Authors:     Benedikt Spranger, Pengutronix
5  *              Robert Schwebel, Pengutronix
6  *
7  *              This program is free software; you can redistribute it and/or
8  *              modify it under the terms of the GNU General Public License
9  *              version 2, as published by the Free Software Foundation.
10  *
11  *              This software was originally developed in conformance with
12  *              Microsoft's Remote NDIS Specification License Agreement.
13  *
14  * 03/12/2004 Kai-Uwe Bloem <linux-development@auerswald.de>
15  *              Fixed message length bug in init_response
16  *
17  * 03/25/2004 Kai-Uwe Bloem <linux-development@auerswald.de>
18  *              Fixed rndis_rm_hdr length bug.
19  *
20  * Copyright (C) 2004 by David Brownell
21  *              updates to merge with Linux 2.6, better match RNDIS spec
22  */
23
24 #include <linux/module.h>
25 #include <linux/moduleparam.h>
26 #include <linux/kernel.h>
27 #include <linux/errno.h>
28 #include <linux/idr.h>
29 #include <linux/list.h>
30 #include <linux/proc_fs.h>
31 #include <linux/slab.h>
32 #include <linux/seq_file.h>
33 #include <linux/netdevice.h>
34
35 #include <asm/io.h>
36 #include <asm/byteorder.h>
37 #include <asm/unaligned.h>
38
39 #include "u_rndis.h"
40
41 #undef  VERBOSE_DEBUG
42
43 #include "rndis.h"
44
45
46 /* The driver for your USB chip needs to support ep0 OUT to work with
47  * RNDIS, plus all three CDC Ethernet endpoints (interrupt not optional).
48  *
49  * Windows hosts need an INF file like Documentation/usb/linux.inf
50  * and will be happier if you provide the host_addr module parameter.
51  */
52
53 #if 0
54 static int rndis_debug = 0;
55 module_param (rndis_debug, int, 0);
56 MODULE_PARM_DESC (rndis_debug, "enable debugging");
57 #else
58 #define rndis_debug             0
59 #endif
60
61 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
62
63 #define NAME_TEMPLATE "driver/rndis-%03d"
64
65 #endif /* CONFIG_USB_GADGET_DEBUG_FILES */
66
67 static DEFINE_IDA(rndis_ida);
68
69 /* Driver Version */
70 static const __le32 rndis_driver_version = cpu_to_le32(1);
71
72 /* Function Prototypes */
73 static rndis_resp_t *rndis_add_response(struct rndis_params *params,
74                                         u32 length);
75
76 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
77
78 static const struct file_operations rndis_proc_fops;
79
80 #endif /* CONFIG_USB_GADGET_DEBUG_FILES */
81
82 /* supported OIDs */
83 static const u32 oid_supported_list[] = {
84         /* the general stuff */
85         RNDIS_OID_GEN_SUPPORTED_LIST,
86         RNDIS_OID_GEN_HARDWARE_STATUS,
87         RNDIS_OID_GEN_MEDIA_SUPPORTED,
88         RNDIS_OID_GEN_MEDIA_IN_USE,
89         RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
90         RNDIS_OID_GEN_LINK_SPEED,
91         RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE,
92         RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE,
93         RNDIS_OID_GEN_VENDOR_ID,
94         RNDIS_OID_GEN_VENDOR_DESCRIPTION,
95         RNDIS_OID_GEN_VENDOR_DRIVER_VERSION,
96         RNDIS_OID_GEN_CURRENT_PACKET_FILTER,
97         RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE,
98         RNDIS_OID_GEN_MEDIA_CONNECT_STATUS,
99         RNDIS_OID_GEN_PHYSICAL_MEDIUM,
100
101         /* the statistical stuff */
102         RNDIS_OID_GEN_XMIT_OK,
103         RNDIS_OID_GEN_RCV_OK,
104         RNDIS_OID_GEN_XMIT_ERROR,
105         RNDIS_OID_GEN_RCV_ERROR,
106         RNDIS_OID_GEN_RCV_NO_BUFFER,
107 #ifdef  RNDIS_OPTIONAL_STATS
108         RNDIS_OID_GEN_DIRECTED_BYTES_XMIT,
109         RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT,
110         RNDIS_OID_GEN_MULTICAST_BYTES_XMIT,
111         RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT,
112         RNDIS_OID_GEN_BROADCAST_BYTES_XMIT,
113         RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT,
114         RNDIS_OID_GEN_DIRECTED_BYTES_RCV,
115         RNDIS_OID_GEN_DIRECTED_FRAMES_RCV,
116         RNDIS_OID_GEN_MULTICAST_BYTES_RCV,
117         RNDIS_OID_GEN_MULTICAST_FRAMES_RCV,
118         RNDIS_OID_GEN_BROADCAST_BYTES_RCV,
119         RNDIS_OID_GEN_BROADCAST_FRAMES_RCV,
120         RNDIS_OID_GEN_RCV_CRC_ERROR,
121         RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH,
122 #endif  /* RNDIS_OPTIONAL_STATS */
123
124         /* mandatory 802.3 */
125         /* the general stuff */
126         RNDIS_OID_802_3_PERMANENT_ADDRESS,
127         RNDIS_OID_802_3_CURRENT_ADDRESS,
128         RNDIS_OID_802_3_MULTICAST_LIST,
129         RNDIS_OID_802_3_MAC_OPTIONS,
130         RNDIS_OID_802_3_MAXIMUM_LIST_SIZE,
131
132         /* the statistical stuff */
133         RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT,
134         RNDIS_OID_802_3_XMIT_ONE_COLLISION,
135         RNDIS_OID_802_3_XMIT_MORE_COLLISIONS,
136 #ifdef  RNDIS_OPTIONAL_STATS
137         RNDIS_OID_802_3_XMIT_DEFERRED,
138         RNDIS_OID_802_3_XMIT_MAX_COLLISIONS,
139         RNDIS_OID_802_3_RCV_OVERRUN,
140         RNDIS_OID_802_3_XMIT_UNDERRUN,
141         RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE,
142         RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST,
143         RNDIS_OID_802_3_XMIT_LATE_COLLISIONS,
144 #endif  /* RNDIS_OPTIONAL_STATS */
145
146 #ifdef  RNDIS_PM
147         /* PM and wakeup are "mandatory" for USB, but the RNDIS specs
148          * don't say what they mean ... and the NDIS specs are often
149          * confusing and/or ambiguous in this context.  (That is, more
150          * so than their specs for the other OIDs.)
151          *
152          * FIXME someone who knows what these should do, please
153          * implement them!
154          */
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
171 /* NDIS Functions */
172 static int gen_ndis_query_resp(struct rndis_params *params, u32 OID, u8 *buf,
173                                unsigned buf_len, rndis_resp_t *r)
174 {
175         int retval = -ENOTSUPP;
176         u32 length = 4; /* usually */
177         __le32 *outbuf;
178         int i, count;
179         rndis_query_cmplt_type *resp;
180         struct net_device *net;
181         struct rtnl_link_stats64 temp;
182         const struct rtnl_link_stats64 *stats;
183
184         if (!r) return -ENOMEM;
185         resp = (rndis_query_cmplt_type *)r->buf;
186
187         if (!resp) return -ENOMEM;
188
189         if (buf_len && rndis_debug > 1) {
190                 pr_debug("query OID %08x value, len %d:\n", OID, buf_len);
191                 for (i = 0; i < buf_len; i += 16) {
192                         pr_debug("%03d: %08x %08x %08x %08x\n", i,
193                                 get_unaligned_le32(&buf[i]),
194                                 get_unaligned_le32(&buf[i + 4]),
195                                 get_unaligned_le32(&buf[i + 8]),
196                                 get_unaligned_le32(&buf[i + 12]));
197                 }
198         }
199
200         /* response goes here, right after the header */
201         outbuf = (__le32 *)&resp[1];
202         resp->InformationBufferOffset = cpu_to_le32(16);
203
204         net = params->dev;
205         stats = dev_get_stats(net, &temp);
206
207         switch (OID) {
208
209         /* general oids (table 4-1) */
210
211         /* mandatory */
212         case RNDIS_OID_GEN_SUPPORTED_LIST:
213                 pr_debug("%s: RNDIS_OID_GEN_SUPPORTED_LIST\n", __func__);
214                 length = sizeof(oid_supported_list);
215                 count  = length / sizeof(u32);
216                 for (i = 0; i < count; i++)
217                         outbuf[i] = cpu_to_le32(oid_supported_list[i]);
218                 retval = 0;
219                 break;
220
221         /* mandatory */
222         case RNDIS_OID_GEN_HARDWARE_STATUS:
223                 pr_debug("%s: RNDIS_OID_GEN_HARDWARE_STATUS\n", __func__);
224                 /* Bogus question!
225                  * Hardware must be ready to receive high level protocols.
226                  * BTW:
227                  * reddite ergo quae sunt Caesaris Caesari
228                  * et quae sunt Dei Deo!
229                  */
230                 *outbuf = cpu_to_le32(0);
231                 retval = 0;
232                 break;
233
234         /* mandatory */
235         case RNDIS_OID_GEN_MEDIA_SUPPORTED:
236                 pr_debug("%s: RNDIS_OID_GEN_MEDIA_SUPPORTED\n", __func__);
237                 *outbuf = cpu_to_le32(params->medium);
238                 retval = 0;
239                 break;
240
241         /* mandatory */
242         case RNDIS_OID_GEN_MEDIA_IN_USE:
243                 pr_debug("%s: RNDIS_OID_GEN_MEDIA_IN_USE\n", __func__);
244                 /* one medium, one transport... (maybe you do it better) */
245                 *outbuf = cpu_to_le32(params->medium);
246                 retval = 0;
247                 break;
248
249         /* mandatory */
250         case RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE:
251                 pr_debug("%s: RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE\n", __func__);
252                 if (params->dev) {
253                         *outbuf = cpu_to_le32(params->dev->mtu);
254                         retval = 0;
255                 }
256                 break;
257
258         /* mandatory */
259         case RNDIS_OID_GEN_LINK_SPEED:
260                 if (rndis_debug > 1)
261                         pr_debug("%s: RNDIS_OID_GEN_LINK_SPEED\n", __func__);
262                 if (params->media_state == RNDIS_MEDIA_STATE_DISCONNECTED)
263                         *outbuf = cpu_to_le32(0);
264                 else
265                         *outbuf = cpu_to_le32(params->speed);
266                 retval = 0;
267                 break;
268
269         /* mandatory */
270         case RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE:
271                 pr_debug("%s: RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE\n", __func__);
272                 if (params->dev) {
273                         *outbuf = cpu_to_le32(params->dev->mtu);
274                         retval = 0;
275                 }
276                 break;
277
278         /* mandatory */
279         case RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE:
280                 pr_debug("%s: RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE\n", __func__);
281                 if (params->dev) {
282                         *outbuf = cpu_to_le32(params->dev->mtu);
283                         retval = 0;
284                 }
285                 break;
286
287         /* mandatory */
288         case RNDIS_OID_GEN_VENDOR_ID:
289                 pr_debug("%s: RNDIS_OID_GEN_VENDOR_ID\n", __func__);
290                 *outbuf = cpu_to_le32(params->vendorID);
291                 retval = 0;
292                 break;
293
294         /* mandatory */
295         case RNDIS_OID_GEN_VENDOR_DESCRIPTION:
296                 pr_debug("%s: RNDIS_OID_GEN_VENDOR_DESCRIPTION\n", __func__);
297                 if (params->vendorDescr) {
298                         length = strlen(params->vendorDescr);
299                         memcpy(outbuf, params->vendorDescr, length);
300                 } else {
301                         outbuf[0] = 0;
302                 }
303                 retval = 0;
304                 break;
305
306         case RNDIS_OID_GEN_VENDOR_DRIVER_VERSION:
307                 pr_debug("%s: RNDIS_OID_GEN_VENDOR_DRIVER_VERSION\n", __func__);
308                 /* Created as LE */
309                 *outbuf = rndis_driver_version;
310                 retval = 0;
311                 break;
312
313         /* mandatory */
314         case RNDIS_OID_GEN_CURRENT_PACKET_FILTER:
315                 pr_debug("%s: RNDIS_OID_GEN_CURRENT_PACKET_FILTER\n", __func__);
316                 *outbuf = cpu_to_le32(*params->filter);
317                 retval = 0;
318                 break;
319
320         /* mandatory */
321         case RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE:
322                 pr_debug("%s: RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE\n", __func__);
323                 *outbuf = cpu_to_le32(RNDIS_MAX_TOTAL_SIZE);
324                 retval = 0;
325                 break;
326
327         /* mandatory */
328         case RNDIS_OID_GEN_MEDIA_CONNECT_STATUS:
329                 if (rndis_debug > 1)
330                         pr_debug("%s: RNDIS_OID_GEN_MEDIA_CONNECT_STATUS\n", __func__);
331                 *outbuf = cpu_to_le32(params->media_state);
332                 retval = 0;
333                 break;
334
335         case RNDIS_OID_GEN_PHYSICAL_MEDIUM:
336                 pr_debug("%s: RNDIS_OID_GEN_PHYSICAL_MEDIUM\n", __func__);
337                 *outbuf = cpu_to_le32(0);
338                 retval = 0;
339                 break;
340
341         /* The RNDIS specification is incomplete/wrong.   Some versions
342          * of MS-Windows expect OIDs that aren't specified there.  Other
343          * versions emit undefined RNDIS messages. DOCUMENT ALL THESE!
344          */
345         case RNDIS_OID_GEN_MAC_OPTIONS:         /* from WinME */
346                 pr_debug("%s: RNDIS_OID_GEN_MAC_OPTIONS\n", __func__);
347                 *outbuf = cpu_to_le32(
348                           RNDIS_MAC_OPTION_RECEIVE_SERIALIZED
349                         | RNDIS_MAC_OPTION_FULL_DUPLEX);
350                 retval = 0;
351                 break;
352
353         /* statistics OIDs (table 4-2) */
354
355         /* mandatory */
356         case RNDIS_OID_GEN_XMIT_OK:
357                 if (rndis_debug > 1)
358                         pr_debug("%s: RNDIS_OID_GEN_XMIT_OK\n", __func__);
359                 if (stats) {
360                         *outbuf = cpu_to_le32(stats->tx_packets
361                                 - stats->tx_errors - stats->tx_dropped);
362                         retval = 0;
363                 }
364                 break;
365
366         /* mandatory */
367         case RNDIS_OID_GEN_RCV_OK:
368                 if (rndis_debug > 1)
369                         pr_debug("%s: RNDIS_OID_GEN_RCV_OK\n", __func__);
370                 if (stats) {
371                         *outbuf = cpu_to_le32(stats->rx_packets
372                                 - stats->rx_errors - stats->rx_dropped);
373                         retval = 0;
374                 }
375                 break;
376
377         /* mandatory */
378         case RNDIS_OID_GEN_XMIT_ERROR:
379                 if (rndis_debug > 1)
380                         pr_debug("%s: RNDIS_OID_GEN_XMIT_ERROR\n", __func__);
381                 if (stats) {
382                         *outbuf = cpu_to_le32(stats->tx_errors);
383                         retval = 0;
384                 }
385                 break;
386
387         /* mandatory */
388         case RNDIS_OID_GEN_RCV_ERROR:
389                 if (rndis_debug > 1)
390                         pr_debug("%s: RNDIS_OID_GEN_RCV_ERROR\n", __func__);
391                 if (stats) {
392                         *outbuf = cpu_to_le32(stats->rx_errors);
393                         retval = 0;
394                 }
395                 break;
396
397         /* mandatory */
398         case RNDIS_OID_GEN_RCV_NO_BUFFER:
399                 pr_debug("%s: RNDIS_OID_GEN_RCV_NO_BUFFER\n", __func__);
400                 if (stats) {
401                         *outbuf = cpu_to_le32(stats->rx_dropped);
402                         retval = 0;
403                 }
404                 break;
405
406         /* ieee802.3 OIDs (table 4-3) */
407
408         /* mandatory */
409         case RNDIS_OID_802_3_PERMANENT_ADDRESS:
410                 pr_debug("%s: RNDIS_OID_802_3_PERMANENT_ADDRESS\n", __func__);
411                 if (params->dev) {
412                         length = ETH_ALEN;
413                         memcpy(outbuf, params->host_mac, length);
414                         retval = 0;
415                 }
416                 break;
417
418         /* mandatory */
419         case RNDIS_OID_802_3_CURRENT_ADDRESS:
420                 pr_debug("%s: RNDIS_OID_802_3_CURRENT_ADDRESS\n", __func__);
421                 if (params->dev) {
422                         length = ETH_ALEN;
423                         memcpy(outbuf, params->host_mac, length);
424                         retval = 0;
425                 }
426                 break;
427
428         /* mandatory */
429         case RNDIS_OID_802_3_MULTICAST_LIST:
430                 pr_debug("%s: RNDIS_OID_802_3_MULTICAST_LIST\n", __func__);
431                 /* Multicast base address only */
432                 *outbuf = cpu_to_le32(0xE0000000);
433                 retval = 0;
434                 break;
435
436         /* mandatory */
437         case RNDIS_OID_802_3_MAXIMUM_LIST_SIZE:
438                 pr_debug("%s: RNDIS_OID_802_3_MAXIMUM_LIST_SIZE\n", __func__);
439                 /* Multicast base address only */
440                 *outbuf = cpu_to_le32(1);
441                 retval = 0;
442                 break;
443
444         case RNDIS_OID_802_3_MAC_OPTIONS:
445                 pr_debug("%s: RNDIS_OID_802_3_MAC_OPTIONS\n", __func__);
446                 *outbuf = cpu_to_le32(0);
447                 retval = 0;
448                 break;
449
450         /* ieee802.3 statistics OIDs (table 4-4) */
451
452         /* mandatory */
453         case RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT:
454                 pr_debug("%s: RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT\n", __func__);
455                 if (stats) {
456                         *outbuf = cpu_to_le32(stats->rx_frame_errors);
457                         retval = 0;
458                 }
459                 break;
460
461         /* mandatory */
462         case RNDIS_OID_802_3_XMIT_ONE_COLLISION:
463                 pr_debug("%s: RNDIS_OID_802_3_XMIT_ONE_COLLISION\n", __func__);
464                 *outbuf = cpu_to_le32(0);
465                 retval = 0;
466                 break;
467
468         /* mandatory */
469         case RNDIS_OID_802_3_XMIT_MORE_COLLISIONS:
470                 pr_debug("%s: RNDIS_OID_802_3_XMIT_MORE_COLLISIONS\n", __func__);
471                 *outbuf = cpu_to_le32(0);
472                 retval = 0;
473                 break;
474
475         default:
476                 pr_warn("%s: query unknown OID 0x%08X\n", __func__, OID);
477         }
478         if (retval < 0)
479                 length = 0;
480
481         resp->InformationBufferLength = cpu_to_le32(length);
482         r->length = length + sizeof(*resp);
483         resp->MessageLength = cpu_to_le32(r->length);
484         return retval;
485 }
486
487 static int gen_ndis_set_resp(struct rndis_params *params, u32 OID,
488                              u8 *buf, u32 buf_len, rndis_resp_t *r)
489 {
490         rndis_set_cmplt_type *resp;
491         int i, retval = -ENOTSUPP;
492
493         if (!r)
494                 return -ENOMEM;
495         resp = (rndis_set_cmplt_type *)r->buf;
496         if (!resp)
497                 return -ENOMEM;
498
499         if (buf_len && rndis_debug > 1) {
500                 pr_debug("set OID %08x value, len %d:\n", OID, buf_len);
501                 for (i = 0; i < buf_len; i += 16) {
502                         pr_debug("%03d: %08x %08x %08x %08x\n", i,
503                                 get_unaligned_le32(&buf[i]),
504                                 get_unaligned_le32(&buf[i + 4]),
505                                 get_unaligned_le32(&buf[i + 8]),
506                                 get_unaligned_le32(&buf[i + 12]));
507                 }
508         }
509
510         switch (OID) {
511         case RNDIS_OID_GEN_CURRENT_PACKET_FILTER:
512
513                 /* these NDIS_PACKET_TYPE_* bitflags are shared with
514                  * cdc_filter; it's not RNDIS-specific
515                  * NDIS_PACKET_TYPE_x == USB_CDC_PACKET_TYPE_x for x in:
516                  *      PROMISCUOUS, DIRECTED,
517                  *      MULTICAST, ALL_MULTICAST, BROADCAST
518                  */
519                 *params->filter = (u16)get_unaligned_le32(buf);
520                 pr_debug("%s: RNDIS_OID_GEN_CURRENT_PACKET_FILTER %08x\n",
521                         __func__, *params->filter);
522
523                 /* this call has a significant side effect:  it's
524                  * what makes the packet flow start and stop, like
525                  * activating the CDC Ethernet altsetting.
526                  */
527                 retval = 0;
528                 if (*params->filter) {
529                         params->state = RNDIS_DATA_INITIALIZED;
530                         netif_carrier_on(params->dev);
531                         if (netif_running(params->dev))
532                                 netif_wake_queue(params->dev);
533                 } else {
534                         params->state = RNDIS_INITIALIZED;
535                         netif_carrier_off(params->dev);
536                         netif_stop_queue(params->dev);
537                 }
538                 break;
539
540         case RNDIS_OID_802_3_MULTICAST_LIST:
541                 /* I think we can ignore this */
542                 pr_debug("%s: RNDIS_OID_802_3_MULTICAST_LIST\n", __func__);
543                 retval = 0;
544                 break;
545
546         default:
547                 pr_warn("%s: set unknown OID 0x%08X, size %d\n",
548                         __func__, OID, buf_len);
549         }
550
551         return retval;
552 }
553
554 /*
555  * Response Functions
556  */
557
558 static int rndis_init_response(struct rndis_params *params,
559                                rndis_init_msg_type *buf)
560 {
561         rndis_init_cmplt_type *resp;
562         rndis_resp_t *r;
563
564         if (!params->dev)
565                 return -ENOTSUPP;
566
567         r = rndis_add_response(params, sizeof(rndis_init_cmplt_type));
568         if (!r)
569                 return -ENOMEM;
570         resp = (rndis_init_cmplt_type *)r->buf;
571
572         resp->MessageType = cpu_to_le32(RNDIS_MSG_INIT_C);
573         resp->MessageLength = cpu_to_le32(52);
574         resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
575         resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
576         resp->MajorVersion = cpu_to_le32(RNDIS_MAJOR_VERSION);
577         resp->MinorVersion = cpu_to_le32(RNDIS_MINOR_VERSION);
578         resp->DeviceFlags = cpu_to_le32(RNDIS_DF_CONNECTIONLESS);
579         resp->Medium = cpu_to_le32(RNDIS_MEDIUM_802_3);
580         resp->MaxPacketsPerTransfer = cpu_to_le32(1);
581         resp->MaxTransferSize = cpu_to_le32(
582                   params->dev->mtu
583                 + sizeof(struct ethhdr)
584                 + sizeof(struct rndis_packet_msg_type)
585                 + 22);
586         resp->PacketAlignmentFactor = cpu_to_le32(0);
587         resp->AFListOffset = cpu_to_le32(0);
588         resp->AFListSize = cpu_to_le32(0);
589
590         params->resp_avail(params->v);
591         return 0;
592 }
593
594 static int rndis_query_response(struct rndis_params *params,
595                                 rndis_query_msg_type *buf)
596 {
597         rndis_query_cmplt_type *resp;
598         rndis_resp_t *r;
599
600         /* pr_debug("%s: OID = %08X\n", __func__, cpu_to_le32(buf->OID)); */
601         if (!params->dev)
602                 return -ENOTSUPP;
603
604         /*
605          * we need more memory:
606          * gen_ndis_query_resp expects enough space for
607          * rndis_query_cmplt_type followed by data.
608          * oid_supported_list is the largest data reply
609          */
610         r = rndis_add_response(params,
611                 sizeof(oid_supported_list) + sizeof(rndis_query_cmplt_type));
612         if (!r)
613                 return -ENOMEM;
614         resp = (rndis_query_cmplt_type *)r->buf;
615
616         resp->MessageType = cpu_to_le32(RNDIS_MSG_QUERY_C);
617         resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
618
619         if (gen_ndis_query_resp(params, le32_to_cpu(buf->OID),
620                         le32_to_cpu(buf->InformationBufferOffset)
621                                         + 8 + (u8 *)buf,
622                         le32_to_cpu(buf->InformationBufferLength),
623                         r)) {
624                 /* OID not supported */
625                 resp->Status = cpu_to_le32(RNDIS_STATUS_NOT_SUPPORTED);
626                 resp->MessageLength = cpu_to_le32(sizeof *resp);
627                 resp->InformationBufferLength = cpu_to_le32(0);
628                 resp->InformationBufferOffset = cpu_to_le32(0);
629         } else
630                 resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
631
632         params->resp_avail(params->v);
633         return 0;
634 }
635
636 static int rndis_set_response(struct rndis_params *params,
637                               rndis_set_msg_type *buf)
638 {
639         u32 BufLength, BufOffset;
640         rndis_set_cmplt_type *resp;
641         rndis_resp_t *r;
642
643         BufLength = le32_to_cpu(buf->InformationBufferLength);
644         BufOffset = le32_to_cpu(buf->InformationBufferOffset);
645         if ((BufLength > RNDIS_MAX_TOTAL_SIZE) ||
646             (BufOffset > RNDIS_MAX_TOTAL_SIZE) ||
647             (BufOffset + 8 >= RNDIS_MAX_TOTAL_SIZE))
648                     return -EINVAL;
649
650         r = rndis_add_response(params, sizeof(rndis_set_cmplt_type));
651         if (!r)
652                 return -ENOMEM;
653         resp = (rndis_set_cmplt_type *)r->buf;
654
655 #ifdef  VERBOSE_DEBUG
656         pr_debug("%s: Length: %d\n", __func__, BufLength);
657         pr_debug("%s: Offset: %d\n", __func__, BufOffset);
658         pr_debug("%s: InfoBuffer: ", __func__);
659
660         for (i = 0; i < BufLength; i++) {
661                 pr_debug("%02x ", *(((u8 *) buf) + i + 8 + BufOffset));
662         }
663
664         pr_debug("\n");
665 #endif
666
667         resp->MessageType = cpu_to_le32(RNDIS_MSG_SET_C);
668         resp->MessageLength = cpu_to_le32(16);
669         resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
670         if (gen_ndis_set_resp(params, le32_to_cpu(buf->OID),
671                         ((u8 *)buf) + 8 + BufOffset, BufLength, r))
672                 resp->Status = cpu_to_le32(RNDIS_STATUS_NOT_SUPPORTED);
673         else
674                 resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
675
676         params->resp_avail(params->v);
677         return 0;
678 }
679
680 static int rndis_reset_response(struct rndis_params *params,
681                                 rndis_reset_msg_type *buf)
682 {
683         rndis_reset_cmplt_type *resp;
684         rndis_resp_t *r;
685         u8 *xbuf;
686         u32 length;
687
688         /* drain the response queue */
689         while ((xbuf = rndis_get_next_response(params, &length)))
690                 rndis_free_response(params, xbuf);
691
692         r = rndis_add_response(params, sizeof(rndis_reset_cmplt_type));
693         if (!r)
694                 return -ENOMEM;
695         resp = (rndis_reset_cmplt_type *)r->buf;
696
697         resp->MessageType = cpu_to_le32(RNDIS_MSG_RESET_C);
698         resp->MessageLength = cpu_to_le32(16);
699         resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
700         /* resent information */
701         resp->AddressingReset = cpu_to_le32(1);
702
703         params->resp_avail(params->v);
704         return 0;
705 }
706
707 static int rndis_keepalive_response(struct rndis_params *params,
708                                     rndis_keepalive_msg_type *buf)
709 {
710         rndis_keepalive_cmplt_type *resp;
711         rndis_resp_t *r;
712
713         /* host "should" check only in RNDIS_DATA_INITIALIZED state */
714
715         r = rndis_add_response(params, sizeof(rndis_keepalive_cmplt_type));
716         if (!r)
717                 return -ENOMEM;
718         resp = (rndis_keepalive_cmplt_type *)r->buf;
719
720         resp->MessageType = cpu_to_le32(RNDIS_MSG_KEEPALIVE_C);
721         resp->MessageLength = cpu_to_le32(16);
722         resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
723         resp->Status = cpu_to_le32(RNDIS_STATUS_SUCCESS);
724
725         params->resp_avail(params->v);
726         return 0;
727 }
728
729
730 /*
731  * Device to Host Comunication
732  */
733 static int rndis_indicate_status_msg(struct rndis_params *params, u32 status)
734 {
735         rndis_indicate_status_msg_type *resp;
736         rndis_resp_t *r;
737
738         if (params->state == RNDIS_UNINITIALIZED)
739                 return -ENOTSUPP;
740
741         r = rndis_add_response(params, sizeof(rndis_indicate_status_msg_type));
742         if (!r)
743                 return -ENOMEM;
744         resp = (rndis_indicate_status_msg_type *)r->buf;
745
746         resp->MessageType = cpu_to_le32(RNDIS_MSG_INDICATE);
747         resp->MessageLength = cpu_to_le32(20);
748         resp->Status = cpu_to_le32(status);
749         resp->StatusBufferLength = cpu_to_le32(0);
750         resp->StatusBufferOffset = cpu_to_le32(0);
751
752         params->resp_avail(params->v);
753         return 0;
754 }
755
756 int rndis_signal_connect(struct rndis_params *params)
757 {
758         params->media_state = RNDIS_MEDIA_STATE_CONNECTED;
759         return rndis_indicate_status_msg(params, RNDIS_STATUS_MEDIA_CONNECT);
760 }
761 EXPORT_SYMBOL_GPL(rndis_signal_connect);
762
763 int rndis_signal_disconnect(struct rndis_params *params)
764 {
765         params->media_state = RNDIS_MEDIA_STATE_DISCONNECTED;
766         return rndis_indicate_status_msg(params, RNDIS_STATUS_MEDIA_DISCONNECT);
767 }
768 EXPORT_SYMBOL_GPL(rndis_signal_disconnect);
769
770 void rndis_uninit(struct rndis_params *params)
771 {
772         u8 *buf;
773         u32 length;
774
775         if (!params)
776                 return;
777         params->state = RNDIS_UNINITIALIZED;
778
779         /* drain the response queue */
780         while ((buf = rndis_get_next_response(params, &length)))
781                 rndis_free_response(params, buf);
782 }
783 EXPORT_SYMBOL_GPL(rndis_uninit);
784
785 void rndis_set_host_mac(struct rndis_params *params, const u8 *addr)
786 {
787         params->host_mac = addr;
788 }
789 EXPORT_SYMBOL_GPL(rndis_set_host_mac);
790
791 /*
792  * Message Parser
793  */
794 int rndis_msg_parser(struct rndis_params *params, u8 *buf)
795 {
796         u32 MsgType, MsgLength;
797         __le32 *tmp;
798
799         if (!buf)
800                 return -ENOMEM;
801
802         tmp = (__le32 *)buf;
803         MsgType   = get_unaligned_le32(tmp++);
804         MsgLength = get_unaligned_le32(tmp++);
805
806         if (!params)
807                 return -ENOTSUPP;
808
809         /* NOTE: RNDIS is *EXTREMELY* chatty ... Windows constantly polls for
810          * rx/tx statistics and link status, in addition to KEEPALIVE traffic
811          * and normal HC level polling to see if there's any IN traffic.
812          */
813
814         /* For USB: responses may take up to 10 seconds */
815         switch (MsgType) {
816         case RNDIS_MSG_INIT:
817                 pr_debug("%s: RNDIS_MSG_INIT\n",
818                         __func__);
819                 params->state = RNDIS_INITIALIZED;
820                 return rndis_init_response(params, (rndis_init_msg_type *)buf);
821
822         case RNDIS_MSG_HALT:
823                 pr_debug("%s: RNDIS_MSG_HALT\n",
824                         __func__);
825                 params->state = RNDIS_UNINITIALIZED;
826                 if (params->dev) {
827                         netif_carrier_off(params->dev);
828                         netif_stop_queue(params->dev);
829                 }
830                 return 0;
831
832         case RNDIS_MSG_QUERY:
833                 return rndis_query_response(params,
834                                         (rndis_query_msg_type *)buf);
835
836         case RNDIS_MSG_SET:
837                 return rndis_set_response(params, (rndis_set_msg_type *)buf);
838
839         case RNDIS_MSG_RESET:
840                 pr_debug("%s: RNDIS_MSG_RESET\n",
841                         __func__);
842                 return rndis_reset_response(params,
843                                         (rndis_reset_msg_type *)buf);
844
845         case RNDIS_MSG_KEEPALIVE:
846                 /* For USB: host does this every 5 seconds */
847                 if (rndis_debug > 1)
848                         pr_debug("%s: RNDIS_MSG_KEEPALIVE\n",
849                                 __func__);
850                 return rndis_keepalive_response(params,
851                                                  (rndis_keepalive_msg_type *)
852                                                  buf);
853
854         default:
855                 /* At least Windows XP emits some undefined RNDIS messages.
856                  * In one case those messages seemed to relate to the host
857                  * suspending itself.
858                  */
859                 pr_warn("%s: unknown RNDIS message 0x%08X len %d\n",
860                         __func__, MsgType, MsgLength);
861                 print_hex_dump_bytes(__func__, DUMP_PREFIX_OFFSET,
862                                      buf, MsgLength);
863                 break;
864         }
865
866         return -ENOTSUPP;
867 }
868 EXPORT_SYMBOL_GPL(rndis_msg_parser);
869
870 static inline int rndis_get_nr(void)
871 {
872         return ida_simple_get(&rndis_ida, 0, 0, GFP_KERNEL);
873 }
874
875 static inline void rndis_put_nr(int nr)
876 {
877         ida_simple_remove(&rndis_ida, nr);
878 }
879
880 struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v)
881 {
882         struct rndis_params *params;
883         int i;
884
885         if (!resp_avail)
886                 return ERR_PTR(-EINVAL);
887
888         i = rndis_get_nr();
889         if (i < 0) {
890                 pr_debug("failed\n");
891
892                 return ERR_PTR(-ENODEV);
893         }
894
895         params = kzalloc(sizeof(*params), GFP_KERNEL);
896         if (!params) {
897                 rndis_put_nr(i);
898
899                 return ERR_PTR(-ENOMEM);
900         }
901
902 #ifdef  CONFIG_USB_GADGET_DEBUG_FILES
903         {
904                 struct proc_dir_entry *proc_entry;
905                 char name[20];
906
907                 sprintf(name, NAME_TEMPLATE, i);
908                 proc_entry = proc_create_data(name, 0660, NULL,
909                                               &rndis_proc_fops, params);
910                 if (!proc_entry) {
911                         kfree(params);
912                         rndis_put_nr(i);
913
914                         return ERR_PTR(-EIO);
915                 }
916         }
917 #endif
918
919         params->confignr = i;
920         params->used = 1;
921         params->state = RNDIS_UNINITIALIZED;
922         params->media_state = RNDIS_MEDIA_STATE_DISCONNECTED;
923         params->resp_avail = resp_avail;
924         params->v = v;
925         INIT_LIST_HEAD(&params->resp_queue);
926         spin_lock_init(&params->resp_lock);
927         pr_debug("%s: configNr = %d\n", __func__, i);
928
929         return params;
930 }
931 EXPORT_SYMBOL_GPL(rndis_register);
932
933 void rndis_deregister(struct rndis_params *params)
934 {
935         int i;
936
937         pr_debug("%s:\n", __func__);
938
939         if (!params)
940                 return;
941
942         i = params->confignr;
943
944 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
945         {
946                 char name[20];
947
948                 sprintf(name, NAME_TEMPLATE, i);
949                 remove_proc_entry(name, NULL);
950         }
951 #endif
952
953         kfree(params);
954         rndis_put_nr(i);
955 }
956 EXPORT_SYMBOL_GPL(rndis_deregister);
957 int rndis_set_param_dev(struct rndis_params *params, struct net_device *dev,
958                         u16 *cdc_filter)
959 {
960         pr_debug("%s:\n", __func__);
961         if (!dev)
962                 return -EINVAL;
963         if (!params)
964                 return -1;
965
966         params->dev = dev;
967         params->filter = cdc_filter;
968
969         return 0;
970 }
971 EXPORT_SYMBOL_GPL(rndis_set_param_dev);
972
973 int rndis_set_param_vendor(struct rndis_params *params, u32 vendorID,
974                            const char *vendorDescr)
975 {
976         pr_debug("%s:\n", __func__);
977         if (!vendorDescr) return -1;
978         if (!params)
979                 return -1;
980
981         params->vendorID = vendorID;
982         params->vendorDescr = vendorDescr;
983
984         return 0;
985 }
986 EXPORT_SYMBOL_GPL(rndis_set_param_vendor);
987
988 int rndis_set_param_medium(struct rndis_params *params, u32 medium, u32 speed)
989 {
990         pr_debug("%s: %u %u\n", __func__, medium, speed);
991         if (!params)
992                 return -1;
993
994         params->medium = medium;
995         params->speed = speed;
996
997         return 0;
998 }
999 EXPORT_SYMBOL_GPL(rndis_set_param_medium);
1000
1001 void rndis_add_hdr(struct sk_buff *skb)
1002 {
1003         struct rndis_packet_msg_type *header;
1004
1005         if (!skb)
1006                 return;
1007         header = skb_push(skb, sizeof(*header));
1008         memset(header, 0, sizeof *header);
1009         header->MessageType = cpu_to_le32(RNDIS_MSG_PACKET);
1010         header->MessageLength = cpu_to_le32(skb->len);
1011         header->DataOffset = cpu_to_le32(36);
1012         header->DataLength = cpu_to_le32(skb->len - sizeof(*header));
1013 }
1014 EXPORT_SYMBOL_GPL(rndis_add_hdr);
1015
1016 void rndis_free_response(struct rndis_params *params, u8 *buf)
1017 {
1018         rndis_resp_t *r, *n;
1019
1020         spin_lock(&params->resp_lock);
1021         list_for_each_entry_safe(r, n, &params->resp_queue, list) {
1022                 if (r->buf == buf) {
1023                         list_del(&r->list);
1024                         kfree(r);
1025                 }
1026         }
1027         spin_unlock(&params->resp_lock);
1028 }
1029 EXPORT_SYMBOL_GPL(rndis_free_response);
1030
1031 u8 *rndis_get_next_response(struct rndis_params *params, u32 *length)
1032 {
1033         rndis_resp_t *r, *n;
1034
1035         if (!length) return NULL;
1036
1037         spin_lock(&params->resp_lock);
1038         list_for_each_entry_safe(r, n, &params->resp_queue, list) {
1039                 if (!r->send) {
1040                         r->send = 1;
1041                         *length = r->length;
1042                         spin_unlock(&params->resp_lock);
1043                         return r->buf;
1044                 }
1045         }
1046
1047         spin_unlock(&params->resp_lock);
1048         return NULL;
1049 }
1050 EXPORT_SYMBOL_GPL(rndis_get_next_response);
1051
1052 static rndis_resp_t *rndis_add_response(struct rndis_params *params, u32 length)
1053 {
1054         rndis_resp_t *r;
1055
1056         /* NOTE: this gets copied into ether.c USB_BUFSIZ bytes ... */
1057         r = kmalloc(sizeof(rndis_resp_t) + length, GFP_ATOMIC);
1058         if (!r) return NULL;
1059
1060         r->buf = (u8 *)(r + 1);
1061         r->length = length;
1062         r->send = 0;
1063
1064         spin_lock(&params->resp_lock);
1065         list_add_tail(&r->list, &params->resp_queue);
1066         spin_unlock(&params->resp_lock);
1067         return r;
1068 }
1069
1070 int rndis_rm_hdr(struct gether *port,
1071                         struct sk_buff *skb,
1072                         struct sk_buff_head *list)
1073 {
1074         /* tmp points to a struct rndis_packet_msg_type */
1075         __le32 *tmp = (void *)skb->data;
1076
1077         /* MessageType, MessageLength */
1078         if (cpu_to_le32(RNDIS_MSG_PACKET)
1079                         != get_unaligned(tmp++)) {
1080                 dev_kfree_skb_any(skb);
1081                 return -EINVAL;
1082         }
1083         tmp++;
1084
1085         /* DataOffset, DataLength */
1086         if (!skb_pull(skb, get_unaligned_le32(tmp++) + 8)) {
1087                 dev_kfree_skb_any(skb);
1088                 return -EOVERFLOW;
1089         }
1090         skb_trim(skb, get_unaligned_le32(tmp++));
1091
1092         skb_queue_tail(list, skb);
1093         return 0;
1094 }
1095 EXPORT_SYMBOL_GPL(rndis_rm_hdr);
1096
1097 #ifdef CONFIG_USB_GADGET_DEBUG_FILES
1098
1099 static int rndis_proc_show(struct seq_file *m, void *v)
1100 {
1101         rndis_params *param = m->private;
1102
1103         seq_printf(m,
1104                          "Config Nr. %d\n"
1105                          "used      : %s\n"
1106                          "state     : %s\n"
1107                          "medium    : 0x%08X\n"
1108                          "speed     : %d\n"
1109                          "cable     : %s\n"
1110                          "vendor ID : 0x%08X\n"
1111                          "vendor    : %s\n",
1112                          param->confignr, (param->used) ? "y" : "n",
1113                          ({ char *s = "?";
1114                          switch (param->state) {
1115                          case RNDIS_UNINITIALIZED:
1116                                 s = "RNDIS_UNINITIALIZED"; break;
1117                          case RNDIS_INITIALIZED:
1118                                 s = "RNDIS_INITIALIZED"; break;
1119                          case RNDIS_DATA_INITIALIZED:
1120                                 s = "RNDIS_DATA_INITIALIZED"; break;
1121                         } s; }),
1122                          param->medium,
1123                          (param->media_state) ? 0 : param->speed*100,
1124                          (param->media_state) ? "disconnected" : "connected",
1125                          param->vendorID, param->vendorDescr);
1126         return 0;
1127 }
1128
1129 static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,
1130                                 size_t count, loff_t *ppos)
1131 {
1132         rndis_params *p = PDE_DATA(file_inode(file));
1133         u32 speed = 0;
1134         int i, fl_speed = 0;
1135
1136         for (i = 0; i < count; i++) {
1137                 char c;
1138                 if (get_user(c, buffer))
1139                         return -EFAULT;
1140                 switch (c) {
1141                 case '0':
1142                 case '1':
1143                 case '2':
1144                 case '3':
1145                 case '4':
1146                 case '5':
1147                 case '6':
1148                 case '7':
1149                 case '8':
1150                 case '9':
1151                         fl_speed = 1;
1152                         speed = speed * 10 + c - '0';
1153                         break;
1154                 case 'C':
1155                 case 'c':
1156                         rndis_signal_connect(p);
1157                         break;
1158                 case 'D':
1159                 case 'd':
1160                         rndis_signal_disconnect(p);
1161                         break;
1162                 default:
1163                         if (fl_speed) p->speed = speed;
1164                         else pr_debug("%c is not valid\n", c);
1165                         break;
1166                 }
1167
1168                 buffer++;
1169         }
1170
1171         return count;
1172 }
1173
1174 static int rndis_proc_open(struct inode *inode, struct file *file)
1175 {
1176         return single_open(file, rndis_proc_show, PDE_DATA(inode));
1177 }
1178
1179 static const struct file_operations rndis_proc_fops = {
1180         .owner          = THIS_MODULE,
1181         .open           = rndis_proc_open,
1182         .read           = seq_read,
1183         .llseek         = seq_lseek,
1184         .release        = single_release,
1185         .write          = rndis_proc_write,
1186 };
1187
1188 #define NAME_TEMPLATE "driver/rndis-%03d"
1189
1190 #endif /* CONFIG_USB_GADGET_DEBUG_FILES */