Jon's patch needed to get synced with the latest RNDIS code,
so testing by someone with a big-endian CPU would be good.
Seemed like more patches would be needed anyway, since that
ppc config would only ping in one direction!

- Dave


Add byteswapping.  Original version sort-of-worked on PPC with Net2280,
this version applies to the latest RNDIS code but hasn't been tested on
big-endian.  Ping should be working in at least one one direction.

From:           Jon Neal <[EMAIL PROTECTED]>
Signed-off-by:  David Brownell <[EMAIL PROTECTED]>


--- 1.9/drivers/usb/gadget/rndis.c      Mon May 17 20:39:31 2004
+++ edited/drivers/usb/gadget/rndis.c   Sun Jun  6 15:54:51 2004
@@ -18,6 +18,9 @@
  * 
  * 03/25/2004 Kai-Uwe Bloem <[EMAIL PROTECTED]>
  *             Fixed rndis_rm_hdr length bug.
+ *
+ * Copyright (C) 2004 by David Brownell
+ *             updates to merge with Linux 2.6, better match RNDIS spec
  */
 
 #include <linux/config.h>
@@ -49,10 +52,6 @@
  * and will be happier if you provide the host_addr module parameter.
  */
 
-#ifndef        __LITTLE_ENDIAN
-#warning this code is missing all cpu_to_leXX() calls ...
-#endif
-
 #if 0
 #define DEBUG(str,args...) do { \
        if (rndis_debug) \
@@ -95,6 +94,8 @@
 {
        int                     retval = -ENOTSUPP;
        u32                     length = 0;
+       u32                     *tmp;
+       int                     i, count;
        rndis_query_cmplt_type  *resp;
 
        if (!r) return -ENOMEM;
@@ -110,7 +111,10 @@
        case OID_GEN_SUPPORTED_LIST:
                DEBUG ("%s: OID_GEN_SUPPORTED_LIST\n", __FUNCTION__);
                length = sizeof (oid_supported_list);
-               memcpy ((u8 *) resp + 24, oid_supported_list, length); 
+               count  = length / sizeof (u32);
+               tmp = (u32 *) ((u8 *)resp + 24);
+               for (i = 0; i < count; i++)
+                       tmp[i] = cpu_to_le32 (oid_supported_list[i]);
                retval = 0;
                break;
                
@@ -124,7 +128,7 @@
                 * reddite ergo quae sunt Caesaris Caesari
                 * et quae sunt Dei Deo!
                 */
-               *((u32 *) resp + 6) = 0;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
                
@@ -132,7 +136,8 @@
        case OID_GEN_MEDIA_SUPPORTED:
                DEBUG("%s: OID_GEN_MEDIA_SUPPORTED\n", __FUNCTION__);
                length = 4;
-               *((u32 *) resp + 6) = rndis_per_dev_params [configNr].medium;
+               *((u32 *) resp + 6) = cpu_to_le32 (
+                                       rndis_per_dev_params [configNr].medium);
                retval = 0;
                break;
                
@@ -141,20 +146,21 @@
                DEBUG("%s: OID_GEN_MEDIA_IN_USE\n", __FUNCTION__);
                length = 4;
                /* one medium, one transport... (maybe you do it better) */
-               *((u32 *) resp + 6) = rndis_per_dev_params [configNr].medium;
+               *((u32 *) resp + 6) = cpu_to_le32 (
+                                       rndis_per_dev_params [configNr].medium);
                retval = 0;
                break;
-
+               
        /* mandatory */
        case OID_GEN_MAXIMUM_FRAME_SIZE:
                DEBUG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].dev) {
                        length = 4;
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr]
-                                               .dev->mtu;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr].dev->mtu);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -165,9 +171,10 @@
                length = 4;
                if (rndis_per_dev_params [configNr].media_state
                        == NDIS_MEDIA_STATE_DISCONNECTED)
-                   *((u32 *) resp + 6) = 0;
+                   *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                else
-                   *((u32 *) resp + 6) = rndis_per_dev_params [configNr].speed;
+                   *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr].speed);
                retval = 0;
                break;
 
@@ -176,8 +183,8 @@
                DEBUG("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].dev) {
                        length = 4;
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr]
-                                               .dev->mtu;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr].dev->mtu);
                        retval = 0;
                }
                break;
@@ -187,8 +194,8 @@
                DEBUG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].dev) {
                        length = 4;
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr]
-                                               .dev->mtu;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr].dev->mtu);
                        retval = 0;
                }
                break;
@@ -197,7 +204,8 @@
        case OID_GEN_VENDOR_ID:
                DEBUG("%s: OID_GEN_VENDOR_ID\n", __FUNCTION__);
                length = 4;
-               *((u32 *) resp + 6) = rndis_per_dev_params [configNr].vendorID;
+               *((u32 *) resp + 6) = cpu_to_le32 (
+                       rndis_per_dev_params [configNr].vendorID);
                retval = 0;
                break;
                
@@ -213,6 +221,7 @@
        case OID_GEN_VENDOR_DRIVER_VERSION:
                DEBUG("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __FUNCTION__);
                length = 4;
+               /* Created as LE */
                *((u32 *) resp + 6) = rndis_driver_version;
                retval = 0;
                break;
@@ -221,7 +230,8 @@
        case OID_GEN_CURRENT_PACKET_FILTER:
                DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __FUNCTION__);
                length = 4;
-               *((u32 *) resp + 6) = rndis_per_dev_params[configNr].filter;
+               *((u32 *) resp + 6) = cpu_to_le32 (
+                                       rndis_per_dev_params[configNr].filter);
                retval = 0;
                break;
 
@@ -229,7 +239,8 @@
        case OID_GEN_MAXIMUM_TOTAL_SIZE:
                DEBUG("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __FUNCTION__);
                length = 4;
-               *((u32 *) resp + 6) = RNDIS_MAX_TOTAL_SIZE;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32(
+                                       RNDIS_MAX_TOTAL_SIZE);
                retval = 0;
                break;
 
@@ -237,32 +248,33 @@
        case OID_GEN_MEDIA_CONNECT_STATUS:
                DEBUG("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __FUNCTION__);
                length = 4;
-               *((u32 *) resp + 6) = rndis_per_dev_params [configNr]
-                                               .media_state;
+               *((u32 *) resp + 6) = cpu_to_le32 (
+                                       rndis_per_dev_params [configNr]
+                                               .media_state);
                retval = 0;
                break;
-               
+
        case OID_GEN_PHYSICAL_MEDIUM:
                DEBUG("%s: OID_GEN_PHYSICAL_MEDIUM\n", __FUNCTION__);
                length = 4;
-               *((u32 *) resp + 6) = 0;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
 
        /* statistics OIDs (table 4-2) */
-               
+
        /* mandatory */
        case OID_GEN_XMIT_OK:
                DEBUG("%s: OID_GEN_XMIT_OK\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
                        length = 4;
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr]
-                                       .stats->tx_packets - 
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                           rndis_per_dev_params [configNr].stats->tx_packets - 
                            rndis_per_dev_params [configNr].stats->tx_errors -
-                           rndis_per_dev_params [configNr].stats->tx_dropped;
+                           rndis_per_dev_params [configNr].stats->tx_dropped);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -272,13 +284,13 @@
                DEBUG("%s: OID_GEN_RCV_OK\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
                        length = 4;
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->rx_packets - 
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                           rndis_per_dev_params [configNr].stats->rx_packets - 
                            rndis_per_dev_params [configNr].stats->rx_errors -
-                           rndis_per_dev_params [configNr].stats->rx_dropped;
+                           rndis_per_dev_params [configNr].stats->rx_dropped);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -288,11 +300,12 @@
                DEBUG("%s: OID_GEN_XMIT_ERROR\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
                        length = 4;
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->tx_errors;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->tx_errors);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -301,11 +314,12 @@
        case OID_GEN_RCV_ERROR:
                DEBUG("%s: OID_GEN_RCV_ERROR\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->rx_errors;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->rx_errors);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -314,11 +328,12 @@
        case OID_GEN_RCV_NO_BUFFER:
                DEBUG("%s: OID_GEN_RCV_NO_BUFFER\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->rx_dropped;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->rx_dropped);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -333,14 +348,17 @@
                 */
                if (rndis_per_dev_params [configNr].stats) {
                        length = 4;
-                       *((u32 *) resp + 6) = (rndis_per_dev_params [configNr].
-                                       stats->tx_packets - 
-                           rndis_per_dev_params [configNr].stats->tx_errors -
-                           rndis_per_dev_params [configNr].stats->tx_dropped)
-                                       *123;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               (rndis_per_dev_params [configNr]
+                                       .stats->tx_packets - 
+                                rndis_per_dev_params [configNr]
+                                        .stats->tx_errors -
+                                rndis_per_dev_params [configNr]
+                                        .stats->tx_dropped)
+                               * 123);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -350,14 +368,17 @@
                /* dito */
                if (rndis_per_dev_params [configNr].stats) {
                        length = 4;
-                       *((u32 *) resp + 6) = (rndis_per_dev_params [configNr].
-                                       stats->tx_packets - 
-                           rndis_per_dev_params [configNr].stats->tx_errors -
-                           rndis_per_dev_params [configNr].stats->tx_dropped)
-                                       /123;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               (rndis_per_dev_params [configNr]
+                                       .stats->tx_packets - 
+                                rndis_per_dev_params [configNr]
+                                        .stats->tx_errors -
+                                rndis_per_dev_params [configNr]
+                                        .stats->tx_dropped)
+                               / 123);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -365,11 +386,12 @@
        case OID_GEN_MULTICAST_BYTES_XMIT:
                DEBUG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->multicast*1234;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->multicast*1234);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -377,11 +399,12 @@
        case OID_GEN_MULTICAST_FRAMES_XMIT:
                DEBUG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->multicast;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->multicast);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -389,11 +412,12 @@
        case OID_GEN_BROADCAST_BYTES_XMIT:
                DEBUG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->tx_packets/42*255;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->tx_packets/42*255);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -401,35 +425,37 @@
        case OID_GEN_BROADCAST_FRAMES_XMIT:
                DEBUG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->tx_packets/42;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->tx_packets/42);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
                
        case OID_GEN_DIRECTED_BYTES_RCV:
                DEBUG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __FUNCTION__);
-               *((u32 *) resp + 6) = 0;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
                
        case OID_GEN_DIRECTED_FRAMES_RCV:
                DEBUG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __FUNCTION__);
-               *((u32 *) resp + 6) = 0;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
                
        case OID_GEN_MULTICAST_BYTES_RCV:
                DEBUG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->multicast*1111;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->multicast * 1111);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -437,11 +463,12 @@
        case OID_GEN_MULTICAST_FRAMES_RCV:
                DEBUG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->multicast;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->multicast);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -449,11 +476,12 @@
        case OID_GEN_BROADCAST_BYTES_RCV:
                DEBUG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->rx_packets/42*255;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->rx_packets/42*255);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -461,11 +489,12 @@
        case OID_GEN_BROADCAST_FRAMES_RCV:
                DEBUG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->rx_packets/42;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->rx_packets/42);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -473,18 +502,19 @@
        case OID_GEN_RCV_CRC_ERROR:
                DEBUG("%s: OID_GEN_RCV_CRC_ERROR\n", __FUNCTION__);
                if (rndis_per_dev_params [configNr].stats) {
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr].
-                                       stats->rx_crc_errors;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->rx_crc_errors);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
                
        case OID_GEN_TRANSMIT_QUEUE_LENGTH:
                DEBUG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __FUNCTION__);
-               *((u32 *) resp + 6) = 0;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
 #endif /* RNDIS_OPTIONAL_STATS */
@@ -501,7 +531,7 @@
                                length);
                        retval = 0;
                } else {
-                       *((u32 *) resp + 6) = 0;
+                       *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                        retval = 0;
                }
                break;
@@ -523,7 +553,7 @@
                DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__);
                length = 4;
                /* Multicast base address only */
-               *((u32 *) resp + 6) = 0xE0000000;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (0xE0000000);
                retval = 0;
                break;
                
@@ -532,10 +562,10 @@
                DEBUG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __FUNCTION__);
                 length = 4;
                /* Multicast base address only */
-               *((u32 *) resp + 6) = 1;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (1);
                retval = 0;
                break;
-
+               
        case OID_802_3_MAC_OPTIONS:
                DEBUG("%s: OID_802_3_MAC_OPTIONS\n", __FUNCTION__);
                break;
@@ -548,8 +578,9 @@
                if (rndis_per_dev_params [configNr].stats)
                {
                        length = 4;
-                       *((u32 *) resp + 6) = rndis_per_dev_params [configNr]
-                                       .stats->rx_frame_errors;
+                       *((u32 *) resp + 6) = cpu_to_le32 (
+                               rndis_per_dev_params [configNr]
+                                       .stats->rx_frame_errors);
                        retval = 0;
                }
                break;
@@ -558,7 +589,7 @@
        case OID_802_3_XMIT_ONE_COLLISION:
                DEBUG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __FUNCTION__);
                length = 4;
-               *((u32 *) resp + 6) = 0;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
                
@@ -566,7 +597,7 @@
        case OID_802_3_XMIT_MORE_COLLISIONS:
                DEBUG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __FUNCTION__);
                length = 4;
-               *((u32 *) resp + 6) = 0;
+               *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
                retval = 0;
                break;
                
@@ -642,9 +673,9 @@
                         __FUNCTION__, OID);
        }
        
-       resp->InformationBufferOffset = 16;
-       resp->InformationBufferLength = length;
-       resp->MessageLength = 24 + length;
+       resp->InformationBufferOffset = __constant_cpu_to_le32 (16);
+       resp->InformationBufferLength = cpu_to_le32 (length);
+       resp->MessageLength = cpu_to_le32 (24 + length);
        r->length = 24 + length;
        return retval;
 }
@@ -655,7 +686,6 @@
        rndis_set_cmplt_type            *resp;
        int                             i, retval = -ENOTSUPP;
        struct rndis_params             *params;
-       u8 *cp;
 
        if (!r)
                return -ENOMEM;
@@ -663,8 +693,6 @@
        if (!resp)
                return -ENOMEM;
 
-       cp = (u8 *)resp;
-
        DEBUG("set OID %08x value, len %d:\n", OID, buf_len);
        for (i = 0; i < buf_len; i += 16) {
                DEBUG ("%03d: "
@@ -695,7 +723,7 @@
                 *      PROMISCUOUS, DIRECTED,
                 *      MULTICAST, ALL_MULTICAST, BROADCAST
                 */
-               params->filter = *(u32 *)buf;
+               params->filter = cpu_to_le32p((u32 *)buf);
                DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER %08x\n",
                        __FUNCTION__, params->filter);
 
@@ -727,7 +755,7 @@
                param = (struct rndis_config_parameter *) buf;
                DEBUG("%s: OID_GEN_RNDIS_CONFIG_PARAMETER '%*s'\n",
                        __FUNCTION__,
-                       param->ParameterNameLength,
+                       min(cpu_to_le32(param->ParameterNameLength),80),
                        buf + param->ParameterNameOffset);
                retval = 0;
                }
@@ -778,22 +806,24 @@
        
        if (!resp) return -ENOMEM;
        
-       resp->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT;
-       resp->MessageLength = 52;
-       resp->RequestID = buf->RequestID;
-       resp->Status = RNDIS_STATUS_SUCCESS;
-       resp->MajorVersion = RNDIS_MAJOR_VERSION;
-       resp->MinorVersion = RNDIS_MINOR_VERSION;
-       resp->DeviceFlags = RNDIS_DF_CONNECTIONLESS;
-       resp->Medium = RNDIS_MEDIUM_802_3;
-       resp->MaxPacketsPerTransfer = 1;
-       resp->MaxTransferSize = rndis_per_dev_params [configNr].dev->mtu
+       resp->MessageType = __constant_cpu_to_le32 (
+                       REMOTE_NDIS_INITIALIZE_CMPLT);
+       resp->MessageLength = __constant_cpu_to_le32 (52);
+       resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
+       resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
+       resp->MajorVersion = __constant_cpu_to_le32 (RNDIS_MAJOR_VERSION);
+       resp->MinorVersion = __constant_cpu_to_le32 (RNDIS_MINOR_VERSION);
+       resp->DeviceFlags = __constant_cpu_to_le32 (RNDIS_DF_CONNECTIONLESS);
+       resp->Medium = __constant_cpu_to_le32 (RNDIS_MEDIUM_802_3);
+       resp->MaxPacketsPerTransfer = __constant_cpu_to_le32 (1);
+       resp->MaxTransferSize = cpu_to_le32 (
+                 rndis_per_dev_params [configNr].dev->mtu
                + sizeof (struct ethhdr)
                + sizeof (struct rndis_packet_msg_type)
-               + 22;
-       resp->PacketAlignmentFactor = 0;
-       resp->AFListOffset = 0;
-       resp->AFListSize = 0;
+               + 22);
+       resp->PacketAlignmentFactor = __constant_cpu_to_le32 (0);
+       resp->AFListOffset = __constant_cpu_to_le32 (0);
+       resp->AFListSize = __constant_cpu_to_le32 (0);
        
        if (rndis_per_dev_params [configNr].ack)
            rndis_per_dev_params [configNr].ack (
@@ -807,7 +837,7 @@
        rndis_query_cmplt_type *resp;
        rndis_resp_t            *r;
        
-       // DEBUG("%s: OID = %08X\n", __FUNCTION__, buf->OID);
+       // DEBUG("%s: OID = %08X\n", __FUNCTION__, cpu_to_le32(buf->OID));
        if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP;
        
        /* 
@@ -821,17 +851,18 @@
        
        if (!resp) return -ENOMEM;
        
-       resp->MessageType = REMOTE_NDIS_QUERY_CMPLT;
-       resp->MessageLength = 24;
-       resp->RequestID = buf->RequestID;
+       resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_QUERY_CMPLT);
+       resp->MessageLength = __constant_cpu_to_le32 (24);
+       resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
        
-       if (gen_ndis_query_resp (configNr, buf->OID, r)) {
+       if (gen_ndis_query_resp (configNr, cpu_to_le32 (buf->OID), r)) {
                /* OID not supported */
-               resp->Status = RNDIS_STATUS_NOT_SUPPORTED;
-               resp->InformationBufferLength = 0;
-               resp->InformationBufferOffset = 0;
+               resp->Status = __constant_cpu_to_le32 (
+                               RNDIS_STATUS_NOT_SUPPORTED);
+               resp->InformationBufferLength = __constant_cpu_to_le32 (0);
+               resp->InformationBufferOffset = __constant_cpu_to_le32 (0);
        } else
-               resp->Status = RNDIS_STATUS_SUCCESS;
+               resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
        
        if (rndis_per_dev_params [configNr].ack)
            rndis_per_dev_params [configNr].ack (
@@ -841,6 +872,7 @@
 
 static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
 {
+       u32                     BufLength, BufOffset;
        rndis_set_cmplt_type    *resp;
        rndis_resp_t            *r;
        
@@ -850,30 +882,32 @@
        resp = (rndis_set_cmplt_type *) r->buf;
        if (!resp) return -ENOMEM;
 
+       BufLength = cpu_to_le32 (buf->InformationBufferLength);
+       BufOffset = cpu_to_le32 (buf->InformationBufferOffset);
+
 #ifdef VERBOSE
-       DEBUG("%s: Length: %d\n", __FUNCTION__, buf->InformationBufferLength);
-       DEBUG("%s: Offset: %d\n", __FUNCTION__, buf->InformationBufferOffset);
+       DEBUG("%s: Length: %d\n", __FUNCTION__, BufLength);
+       DEBUG("%s: Offset: %d\n", __FUNCTION__, BufOffset);
        DEBUG("%s: InfoBuffer: ", __FUNCTION__);
        
-       for (i = 0; i < buf->InformationBufferLength; i++) {
-               DEBUG ("%02x ", *(((u8 *) buf) + i + 12 +
-                      buf->InformationBufferOffset));
+       for (i = 0; i < BufLength; i++) {
+               DEBUG ("%02x ", *(((u8 *) buf) + i + 8 + BufOffset));
        }
        
        DEBUG ("\n");
 #endif
-
-       resp->MessageType = REMOTE_NDIS_SET_CMPLT;
-       resp->MessageLength = 16;
-       resp->RequestID = buf->RequestID;
-       if (gen_ndis_set_resp (configNr, buf->OID, 
-                              ((u8 *) buf) + 28, 
-                              buf->InformationBufferLength, r))
-           resp->Status = RNDIS_STATUS_NOT_SUPPORTED;
-       else resp->Status = RNDIS_STATUS_SUCCESS;
+       
+       resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_SET_CMPLT);
+       resp->MessageLength = __constant_cpu_to_le32 (16);
+       resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
+       if (gen_ndis_set_resp (configNr, cpu_to_le32 (buf->OID), 
+                              ((u8 *) buf) + 8 + BufOffset, BufLength, r))
+           resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_NOT_SUPPORTED);
+       else resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
        
        if (rndis_per_dev_params [configNr].ack)
-           rndis_per_dev_params [configNr].ack (rndis_per_dev_params [configNr].dev);
+           rndis_per_dev_params [configNr].ack (
+                       rndis_per_dev_params [configNr].dev);
        
        return 0;
 }
@@ -889,10 +923,11 @@
        resp = (rndis_reset_cmplt_type *) r->buf;
        if (!resp) return -ENOMEM;
        
-       resp->MessageType = REMOTE_NDIS_RESET_CMPLT;
-       resp->MessageLength = 16;
-       resp->Status = RNDIS_STATUS_SUCCESS;
-       resp->AddressingReset = 1; /* resent information */
+       resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_RESET_CMPLT);
+       resp->MessageLength = __constant_cpu_to_le32 (16);
+       resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
+       /* resent information */
+       resp->AddressingReset = __constant_cpu_to_le32 (1);
        
        if (rndis_per_dev_params [configNr].ack)
            rndis_per_dev_params [configNr].ack (
@@ -913,10 +948,11 @@
        resp = (rndis_keepalive_cmplt_type *) r->buf;
        if (!resp) return -ENOMEM;
                
-       resp->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT;
-       resp->MessageLength = 16;
-       resp->RequestID = buf->RequestID;
-       resp->Status = RNDIS_STATUS_SUCCESS;
+       resp->MessageType = __constant_cpu_to_le32 (
+                       REMOTE_NDIS_KEEPALIVE_CMPLT);
+       resp->MessageLength = __constant_cpu_to_le32 (16);
+       resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
+       resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
        
        if (rndis_per_dev_params [configNr].ack)
            rndis_per_dev_params [configNr].ack (
@@ -944,11 +980,12 @@
        resp = (rndis_indicate_status_msg_type *) r->buf;
        if (!resp) return -ENOMEM;
        
-       resp->MessageType = REMOTE_NDIS_INDICATE_STATUS_MSG;
-       resp->MessageLength = 20;
-       resp->Status = status;
-       resp->StatusBufferLength = 0;
-       resp->StatusBufferOffset = 0;
+       resp->MessageType = __constant_cpu_to_le32 (
+                       REMOTE_NDIS_INDICATE_STATUS_MSG);
+       resp->MessageLength = __constant_cpu_to_le32 (20);
+       resp->Status = cpu_to_le32 (status);
+       resp->StatusBufferLength = __constant_cpu_to_le32 (0);
+       resp->StatusBufferOffset = __constant_cpu_to_le32 (0);
        
        if (rndis_per_dev_params [configNr].ack) 
            rndis_per_dev_params [configNr].ack (
@@ -989,8 +1026,8 @@
                return -ENOMEM;
        
        tmp = (u32 *) buf; 
-       MsgType = *tmp;
-       MsgLength = *(tmp + 1);
+       MsgType   = cpu_to_le32p(tmp++);
+       MsgLength = cpu_to_le32p(tmp++);
        
        if (configNr >= RNDIS_MAX_CONFIGS)
                return -ENOTSUPP;
@@ -1138,10 +1175,10 @@
        if (!skb) return;
        skb_push (skb, sizeof (struct rndis_packet_msg_type));
        memset (skb->data, 0, sizeof (struct rndis_packet_msg_type));
-       *((u32 *) skb->data) = 1;
-       *((u32 *) skb->data + 1) = skb->len;
-       *((u32 *) skb->data + 2) = 36;
-       *((u32 *) skb->data + 3) = skb->len - 44;
+       *((u32 *) skb->data) = __constant_cpu_to_le32 (1);
+       *((u32 *) skb->data + 1) = cpu_to_le32(skb->len);
+       *((u32 *) skb->data + 2) = __constant_cpu_to_le32 (36);
+       *((u32 *) skb->data + 3) = cpu_to_le32(skb->len - 44);
        
        return;
 }
@@ -1201,14 +1238,16 @@
 
 int rndis_rm_hdr (u8 *buf, u32 *length)
 {
-       u32 i, messageLen, dataOffset;
+       u32 i, messageLen, dataOffset, *tmp;
        
+       tmp = (u32 *) buf; 
+
        if (!buf || !length) return -1;
-       if (*((u32 *) buf) != 1) return -1;
-       
-       messageLen = *((u32 *) buf + 1);
+       if (cpu_to_le32p(tmp++) != 1) return -1;
        
-       dataOffset = *((u32 *) buf + 2) + 8;
+       messageLen = cpu_to_le32p(tmp++);
+       dataOffset = cpu_to_le32p(tmp++) + 8;
+
        if (messageLen < dataOffset || messageLen > *length) return -1;
        
        for (i = dataOffset; i < messageLen; i++)

Reply via email to