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