Commit b9a7696a authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman

[PATCH] USB: rndis (3/4) Big Endian support for gadget RNDIS

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

Also added a handful of other things from my BK:  track suspend/resume
(to eventually implement wake-on-lan), give a better rndis error
message, and add missing declarations for PM-related OIDs (usage is
#ifdeffed out by previous patch).

    From:	   Jon Neal <jon@ballardtech.com>
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 9f86f9fb
...@@ -118,6 +118,7 @@ struct eth_dev { ...@@ -118,6 +118,7 @@ struct eth_dev {
unsigned zlp:1; unsigned zlp:1;
unsigned cdc:1; unsigned cdc:1;
unsigned rndis:1; unsigned rndis:1;
unsigned suspended:1;
u16 cdc_filter; u16 cdc_filter;
unsigned long todo; unsigned long todo;
#define WORK_RX_MEMORY 0 #define WORK_RX_MEMORY 0
...@@ -1355,11 +1356,13 @@ static void rndis_response_complete (struct usb_ep *ep, struct usb_request *req) ...@@ -1355,11 +1356,13 @@ static void rndis_response_complete (struct usb_ep *ep, struct usb_request *req)
static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req) static void rndis_command_complete (struct usb_ep *ep, struct usb_request *req)
{ {
struct eth_dev *dev = ep->driver_data; struct eth_dev *dev = ep->driver_data;
int status;
/* received RNDIS command from CDC_SEND_ENCAPSULATED_COMMAND */ /* received RNDIS command from CDC_SEND_ENCAPSULATED_COMMAND */
spin_lock(&dev->lock); spin_lock(&dev->lock);
if (rndis_msg_parser (dev->rndis_config, (u8 *) req->buf)) status = rndis_msg_parser (dev->rndis_config, (u8 *) req->buf);
ERROR(dev, "%s: rndis parse error\n", __FUNCTION__ ); if (status < 0)
ERROR(dev, "%s: rndis parse error %d\n", __FUNCTION__, status);
spin_unlock(&dev->lock); spin_unlock(&dev->lock);
} }
...@@ -2561,6 +2564,26 @@ eth_bind (struct usb_gadget *gadget) ...@@ -2561,6 +2564,26 @@ eth_bind (struct usb_gadget *gadget)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static void
eth_suspend (struct usb_gadget *gadget)
{
struct eth_dev *dev = get_gadget_data (gadget);
DEBUG (dev, "suspend\n");
dev->suspended = 1;
}
static void
eth_resume (struct usb_gadget *gadget)
{
struct eth_dev *dev = get_gadget_data (gadget);
DEBUG (dev, "resume\n");
dev->suspended = 0;
}
/*-------------------------------------------------------------------------*/
static struct usb_gadget_driver eth_driver = { static struct usb_gadget_driver eth_driver = {
#ifdef CONFIG_USB_GADGET_DUALSPEED #ifdef CONFIG_USB_GADGET_DUALSPEED
.speed = USB_SPEED_HIGH, .speed = USB_SPEED_HIGH,
...@@ -2574,6 +2597,9 @@ static struct usb_gadget_driver eth_driver = { ...@@ -2574,6 +2597,9 @@ static struct usb_gadget_driver eth_driver = {
.setup = eth_setup, .setup = eth_setup,
.disconnect = eth_disconnect, .disconnect = eth_disconnect,
.suspend = eth_suspend,
.resume = eth_resume,
.driver = { .driver = {
.name = (char *) shortname, .name = (char *) shortname,
// .shutdown = ... // .shutdown = ...
......
...@@ -26,11 +26,41 @@ ...@@ -26,11 +26,41 @@
#define NDIS_STATUS_MULTICAST_EXISTS 0xC001000A #define NDIS_STATUS_MULTICAST_EXISTS 0xC001000A
#define NDIS_STATUS_MULTICAST_NOT_FOUND 0xC001000B #define NDIS_STATUS_MULTICAST_NOT_FOUND 0xC001000B
enum NDIS_DEVICE_POWER_STATE {
NdisDeviceStateUnspecified = 0,
NdisDeviceStateD0,
NdisDeviceStateD1,
NdisDeviceStateD2,
NdisDeviceStateD3,
NdisDeviceStateMaximum
};
struct NDIS_PM_WAKE_UP_CAPABILITIES {
enum NDIS_DEVICE_POWER_STATE MinMagicPacketWakeUp;
enum NDIS_DEVICE_POWER_STATE MinPatternWakeUp;
enum NDIS_DEVICE_POWER_STATE MinLinkChangeWakeUp;
};
/* NDIS_PNP_CAPABILITIES.Flags constants */ /* NDIS_PNP_CAPABILITIES.Flags constants */
#define NDIS_DEVICE_WAKE_UP_ENABLE 0x00000001 #define NDIS_DEVICE_WAKE_UP_ENABLE 0x00000001
#define NDIS_DEVICE_WAKE_ON_PATTERN_MATCH_ENABLE 0x00000002 #define NDIS_DEVICE_WAKE_ON_PATTERN_MATCH_ENABLE 0x00000002
#define NDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE 0x00000004 #define NDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE 0x00000004
struct NDIS_PNP_CAPABILITIES {
u32 Flags;
struct NDIS_PM_WAKE_UP_CAPABILITIES WakeUpCapabilities;
};
struct NDIS_PM_PACKET_PATTERN {
u32 Priority;
u32 Reserved;
u32 MaskSize;
u32 PatternOffset;
u32 PatternSize;
u32 PatternFlags;
};
/* Required Object IDs (OIDs) */ /* Required Object IDs (OIDs) */
#define OID_GEN_SUPPORTED_LIST 0x00010101 #define OID_GEN_SUPPORTED_LIST 0x00010101
#define OID_GEN_HARDWARE_STATUS 0x00010102 #define OID_GEN_HARDWARE_STATUS 0x00010102
......
...@@ -52,10 +52,6 @@ ...@@ -52,10 +52,6 @@
* and will be happier if you provide the host_addr module parameter. * 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 #if 0
#define DEBUG(str,args...) do { \ #define DEBUG(str,args...) do { \
if (rndis_debug) \ if (rndis_debug) \
...@@ -98,6 +94,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -98,6 +94,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
{ {
int retval = -ENOTSUPP; int retval = -ENOTSUPP;
u32 length = 0; u32 length = 0;
u32 *tmp;
int i, count;
rndis_query_cmplt_type *resp; rndis_query_cmplt_type *resp;
if (!r) return -ENOMEM; if (!r) return -ENOMEM;
...@@ -113,7 +111,10 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -113,7 +111,10 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_SUPPORTED_LIST: case OID_GEN_SUPPORTED_LIST:
DEBUG ("%s: OID_GEN_SUPPORTED_LIST\n", __FUNCTION__); DEBUG ("%s: OID_GEN_SUPPORTED_LIST\n", __FUNCTION__);
length = sizeof (oid_supported_list); 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; retval = 0;
break; break;
...@@ -127,7 +128,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -127,7 +128,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
* reddite ergo quae sunt Caesaris Caesari * reddite ergo quae sunt Caesaris Caesari
* et quae sunt Dei Deo! * et quae sunt Dei Deo!
*/ */
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
break; break;
...@@ -135,7 +136,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -135,7 +136,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_MEDIA_SUPPORTED: case OID_GEN_MEDIA_SUPPORTED:
DEBUG("%s: OID_GEN_MEDIA_SUPPORTED\n", __FUNCTION__); DEBUG("%s: OID_GEN_MEDIA_SUPPORTED\n", __FUNCTION__);
length = 4; 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; retval = 0;
break; break;
...@@ -144,7 +146,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -144,7 +146,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_GEN_MEDIA_IN_USE\n", __FUNCTION__); DEBUG("%s: OID_GEN_MEDIA_IN_USE\n", __FUNCTION__);
length = 4; length = 4;
/* one medium, one transport... (maybe you do it better) */ /* 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; retval = 0;
break; break;
...@@ -153,11 +156,11 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -153,11 +156,11 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __FUNCTION__); DEBUG("%s: OID_GEN_MAXIMUM_FRAME_SIZE\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].dev) { if (rndis_per_dev_params [configNr].dev) {
length = 4; length = 4;
*((u32 *) resp + 6) = rndis_per_dev_params [configNr] *((u32 *) resp + 6) = cpu_to_le32 (
.dev->mtu; rndis_per_dev_params [configNr].dev->mtu);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -168,9 +171,10 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -168,9 +171,10 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
length = 4; length = 4;
if (rndis_per_dev_params [configNr].media_state if (rndis_per_dev_params [configNr].media_state
== NDIS_MEDIA_STATE_DISCONNECTED) == NDIS_MEDIA_STATE_DISCONNECTED)
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
else else
*((u32 *) resp + 6) = rndis_per_dev_params [configNr].speed; *((u32 *) resp + 6) = cpu_to_le32 (
rndis_per_dev_params [configNr].speed);
retval = 0; retval = 0;
break; break;
...@@ -179,8 +183,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -179,8 +183,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __FUNCTION__); DEBUG("%s: OID_GEN_TRANSMIT_BLOCK_SIZE\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].dev) { if (rndis_per_dev_params [configNr].dev) {
length = 4; length = 4;
*((u32 *) resp + 6) = rndis_per_dev_params [configNr] *((u32 *) resp + 6) = cpu_to_le32 (
.dev->mtu; rndis_per_dev_params [configNr].dev->mtu);
retval = 0; retval = 0;
} }
break; break;
...@@ -190,8 +194,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -190,8 +194,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __FUNCTION__); DEBUG("%s: OID_GEN_RECEIVE_BLOCK_SIZE\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].dev) { if (rndis_per_dev_params [configNr].dev) {
length = 4; length = 4;
*((u32 *) resp + 6) = rndis_per_dev_params [configNr] *((u32 *) resp + 6) = cpu_to_le32 (
.dev->mtu; rndis_per_dev_params [configNr].dev->mtu);
retval = 0; retval = 0;
} }
break; break;
...@@ -200,7 +204,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -200,7 +204,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_VENDOR_ID: case OID_GEN_VENDOR_ID:
DEBUG("%s: OID_GEN_VENDOR_ID\n", __FUNCTION__); DEBUG("%s: OID_GEN_VENDOR_ID\n", __FUNCTION__);
length = 4; 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; retval = 0;
break; break;
...@@ -216,6 +221,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -216,6 +221,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_VENDOR_DRIVER_VERSION: case OID_GEN_VENDOR_DRIVER_VERSION:
DEBUG("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __FUNCTION__); DEBUG("%s: OID_GEN_VENDOR_DRIVER_VERSION\n", __FUNCTION__);
length = 4; length = 4;
/* Created as LE */
*((u32 *) resp + 6) = rndis_driver_version; *((u32 *) resp + 6) = rndis_driver_version;
retval = 0; retval = 0;
break; break;
...@@ -224,7 +230,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -224,7 +230,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_CURRENT_PACKET_FILTER: case OID_GEN_CURRENT_PACKET_FILTER:
DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __FUNCTION__); DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER\n", __FUNCTION__);
length = 4; 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; retval = 0;
break; break;
...@@ -232,7 +239,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -232,7 +239,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_MAXIMUM_TOTAL_SIZE: case OID_GEN_MAXIMUM_TOTAL_SIZE:
DEBUG("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __FUNCTION__); DEBUG("%s: OID_GEN_MAXIMUM_TOTAL_SIZE\n", __FUNCTION__);
length = 4; length = 4;
*((u32 *) resp + 6) = RNDIS_MAX_TOTAL_SIZE; *((u32 *) resp + 6) = __constant_cpu_to_le32(
RNDIS_MAX_TOTAL_SIZE);
retval = 0; retval = 0;
break; break;
...@@ -240,15 +248,16 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -240,15 +248,16 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_MEDIA_CONNECT_STATUS: case OID_GEN_MEDIA_CONNECT_STATUS:
DEBUG("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __FUNCTION__); DEBUG("%s: OID_GEN_MEDIA_CONNECT_STATUS\n", __FUNCTION__);
length = 4; length = 4;
*((u32 *) resp + 6) = rndis_per_dev_params [configNr] *((u32 *) resp + 6) = cpu_to_le32 (
.media_state; rndis_per_dev_params [configNr]
.media_state);
retval = 0; retval = 0;
break; break;
case OID_GEN_PHYSICAL_MEDIUM: case OID_GEN_PHYSICAL_MEDIUM:
DEBUG("%s: OID_GEN_PHYSICAL_MEDIUM\n", __FUNCTION__); DEBUG("%s: OID_GEN_PHYSICAL_MEDIUM\n", __FUNCTION__);
length = 4; length = 4;
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
break; break;
...@@ -272,13 +281,13 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -272,13 +281,13 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_GEN_XMIT_OK\n", __FUNCTION__); DEBUG("%s: OID_GEN_XMIT_OK\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
length = 4; length = 4;
*((u32 *) resp + 6) = rndis_per_dev_params [configNr] *((u32 *) resp + 6) = cpu_to_le32 (
.stats->tx_packets - rndis_per_dev_params [configNr].stats->tx_packets -
rndis_per_dev_params [configNr].stats->tx_errors - 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; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -288,13 +297,13 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -288,13 +297,13 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_GEN_RCV_OK\n", __FUNCTION__); DEBUG("%s: OID_GEN_RCV_OK\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
length = 4; length = 4;
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->rx_packets - rndis_per_dev_params [configNr].stats->rx_packets -
rndis_per_dev_params [configNr].stats->rx_errors - 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; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -304,11 +313,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -304,11 +313,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_GEN_XMIT_ERROR\n", __FUNCTION__); DEBUG("%s: OID_GEN_XMIT_ERROR\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
length = 4; length = 4;
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->tx_errors; rndis_per_dev_params [configNr]
.stats->tx_errors);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -317,11 +327,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -317,11 +327,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_RCV_ERROR: case OID_GEN_RCV_ERROR:
DEBUG("%s: OID_GEN_RCV_ERROR\n", __FUNCTION__); DEBUG("%s: OID_GEN_RCV_ERROR\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->rx_errors; rndis_per_dev_params [configNr]
.stats->rx_errors);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -330,11 +341,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -330,11 +341,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_RCV_NO_BUFFER: case OID_GEN_RCV_NO_BUFFER:
DEBUG("%s: OID_GEN_RCV_NO_BUFFER\n", __FUNCTION__); DEBUG("%s: OID_GEN_RCV_NO_BUFFER\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->rx_dropped; rndis_per_dev_params [configNr]
.stats->rx_dropped);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -349,14 +361,17 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -349,14 +361,17 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
*/ */
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
length = 4; length = 4;
*((u32 *) resp + 6) = (rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->tx_packets - (rndis_per_dev_params [configNr]
rndis_per_dev_params [configNr].stats->tx_errors - .stats->tx_packets -
rndis_per_dev_params [configNr].stats->tx_dropped) rndis_per_dev_params [configNr]
*123; .stats->tx_errors -
rndis_per_dev_params [configNr]
.stats->tx_dropped)
* 123);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -366,14 +381,17 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -366,14 +381,17 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
/* dito */ /* dito */
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
length = 4; length = 4;
*((u32 *) resp + 6) = (rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->tx_packets - (rndis_per_dev_params [configNr]
rndis_per_dev_params [configNr].stats->tx_errors - .stats->tx_packets -
rndis_per_dev_params [configNr].stats->tx_dropped) rndis_per_dev_params [configNr]
/123; .stats->tx_errors -
rndis_per_dev_params [configNr]
.stats->tx_dropped)
/ 123);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -381,11 +399,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -381,11 +399,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_MULTICAST_BYTES_XMIT: case OID_GEN_MULTICAST_BYTES_XMIT:
DEBUG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __FUNCTION__); DEBUG("%s: OID_GEN_MULTICAST_BYTES_XMIT\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->multicast*1234; rndis_per_dev_params [configNr]
.stats->multicast*1234);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -393,11 +412,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -393,11 +412,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_MULTICAST_FRAMES_XMIT: case OID_GEN_MULTICAST_FRAMES_XMIT:
DEBUG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __FUNCTION__); DEBUG("%s: OID_GEN_MULTICAST_FRAMES_XMIT\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->multicast; rndis_per_dev_params [configNr]
.stats->multicast);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -405,11 +425,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -405,11 +425,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_BROADCAST_BYTES_XMIT: case OID_GEN_BROADCAST_BYTES_XMIT:
DEBUG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __FUNCTION__); DEBUG("%s: OID_GEN_BROADCAST_BYTES_XMIT\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->tx_packets/42*255; rndis_per_dev_params [configNr]
.stats->tx_packets/42*255);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -417,35 +438,37 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -417,35 +438,37 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_BROADCAST_FRAMES_XMIT: case OID_GEN_BROADCAST_FRAMES_XMIT:
DEBUG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __FUNCTION__); DEBUG("%s: OID_GEN_BROADCAST_FRAMES_XMIT\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->tx_packets/42; rndis_per_dev_params [configNr]
.stats->tx_packets/42);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
case OID_GEN_DIRECTED_BYTES_RCV: case OID_GEN_DIRECTED_BYTES_RCV:
DEBUG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __FUNCTION__); DEBUG("%s: OID_GEN_DIRECTED_BYTES_RCV\n", __FUNCTION__);
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
break; break;
case OID_GEN_DIRECTED_FRAMES_RCV: case OID_GEN_DIRECTED_FRAMES_RCV:
DEBUG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __FUNCTION__); DEBUG("%s: OID_GEN_DIRECTED_FRAMES_RCV\n", __FUNCTION__);
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
break; break;
case OID_GEN_MULTICAST_BYTES_RCV: case OID_GEN_MULTICAST_BYTES_RCV:
DEBUG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __FUNCTION__); DEBUG("%s: OID_GEN_MULTICAST_BYTES_RCV\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->multicast*1111; rndis_per_dev_params [configNr]
.stats->multicast * 1111);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -453,11 +476,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -453,11 +476,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_MULTICAST_FRAMES_RCV: case OID_GEN_MULTICAST_FRAMES_RCV:
DEBUG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __FUNCTION__); DEBUG("%s: OID_GEN_MULTICAST_FRAMES_RCV\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->multicast; rndis_per_dev_params [configNr]
.stats->multicast);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -465,11 +489,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -465,11 +489,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_BROADCAST_BYTES_RCV: case OID_GEN_BROADCAST_BYTES_RCV:
DEBUG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __FUNCTION__); DEBUG("%s: OID_GEN_BROADCAST_BYTES_RCV\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->rx_packets/42*255; rndis_per_dev_params [configNr]
.stats->rx_packets/42*255);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -477,11 +502,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -477,11 +502,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_BROADCAST_FRAMES_RCV: case OID_GEN_BROADCAST_FRAMES_RCV:
DEBUG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __FUNCTION__); DEBUG("%s: OID_GEN_BROADCAST_FRAMES_RCV\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->rx_packets/42; rndis_per_dev_params [configNr]
.stats->rx_packets/42);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -489,18 +515,19 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -489,18 +515,19 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_GEN_RCV_CRC_ERROR: case OID_GEN_RCV_CRC_ERROR:
DEBUG("%s: OID_GEN_RCV_CRC_ERROR\n", __FUNCTION__); DEBUG("%s: OID_GEN_RCV_CRC_ERROR\n", __FUNCTION__);
if (rndis_per_dev_params [configNr].stats) { if (rndis_per_dev_params [configNr].stats) {
*((u32 *) resp + 6) = rndis_per_dev_params [configNr]. *((u32 *) resp + 6) = cpu_to_le32 (
stats->rx_crc_errors; rndis_per_dev_params [configNr]
.stats->rx_crc_errors);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
case OID_GEN_TRANSMIT_QUEUE_LENGTH: case OID_GEN_TRANSMIT_QUEUE_LENGTH:
DEBUG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __FUNCTION__); DEBUG("%s: OID_GEN_TRANSMIT_QUEUE_LENGTH\n", __FUNCTION__);
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
break; break;
#endif /* RNDIS_OPTIONAL_STATS */ #endif /* RNDIS_OPTIONAL_STATS */
...@@ -517,7 +544,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -517,7 +544,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
length); length);
retval = 0; retval = 0;
} else { } else {
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
} }
break; break;
...@@ -539,7 +566,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -539,7 +566,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__); DEBUG("%s: OID_802_3_MULTICAST_LIST\n", __FUNCTION__);
length = 4; length = 4;
/* Multicast base address only */ /* Multicast base address only */
*((u32 *) resp + 6) = 0xE0000000; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0xE0000000);
retval = 0; retval = 0;
break; break;
...@@ -548,7 +575,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -548,7 +575,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
DEBUG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __FUNCTION__); DEBUG("%s: OID_802_3_MAXIMUM_LIST_SIZE\n", __FUNCTION__);
length = 4; length = 4;
/* Multicast base address only */ /* Multicast base address only */
*((u32 *) resp + 6) = 1; *((u32 *) resp + 6) = __constant_cpu_to_le32 (1);
retval = 0; retval = 0;
break; break;
...@@ -564,8 +591,9 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -564,8 +591,9 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
if (rndis_per_dev_params [configNr].stats) if (rndis_per_dev_params [configNr].stats)
{ {
length = 4; length = 4;
*((u32 *) resp + 6) = rndis_per_dev_params [configNr] *((u32 *) resp + 6) = cpu_to_le32 (
.stats->rx_frame_errors; rndis_per_dev_params [configNr]
.stats->rx_frame_errors);
retval = 0; retval = 0;
} }
break; break;
...@@ -574,7 +602,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -574,7 +602,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_802_3_XMIT_ONE_COLLISION: case OID_802_3_XMIT_ONE_COLLISION:
DEBUG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __FUNCTION__); DEBUG("%s: OID_802_3_XMIT_ONE_COLLISION\n", __FUNCTION__);
length = 4; length = 4;
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
break; break;
...@@ -582,7 +610,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -582,7 +610,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
case OID_802_3_XMIT_MORE_COLLISIONS: case OID_802_3_XMIT_MORE_COLLISIONS:
DEBUG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __FUNCTION__); DEBUG("%s: OID_802_3_XMIT_MORE_COLLISIONS\n", __FUNCTION__);
length = 4; length = 4;
*((u32 *) resp + 6) = 0; *((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0; retval = 0;
break; break;
...@@ -658,9 +686,9 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r) ...@@ -658,9 +686,9 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
__FUNCTION__, OID); __FUNCTION__, OID);
} }
resp->InformationBufferOffset = 16; resp->InformationBufferOffset = __constant_cpu_to_le32 (16);
resp->InformationBufferLength = length; resp->InformationBufferLength = cpu_to_le32 (length);
resp->MessageLength = 24 + length; resp->MessageLength = cpu_to_le32 (24 + length);
r->length = 24 + length; r->length = 24 + length;
return retval; return retval;
} }
...@@ -671,7 +699,6 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, ...@@ -671,7 +699,6 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
rndis_set_cmplt_type *resp; rndis_set_cmplt_type *resp;
int i, retval = -ENOTSUPP; int i, retval = -ENOTSUPP;
struct rndis_params *params; struct rndis_params *params;
u8 *cp;
if (!r) if (!r)
return -ENOMEM; return -ENOMEM;
...@@ -679,8 +706,6 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, ...@@ -679,8 +706,6 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
if (!resp) if (!resp)
return -ENOMEM; return -ENOMEM;
cp = (u8 *)resp;
DEBUG("set OID %08x value, len %d:\n", OID, buf_len); DEBUG("set OID %08x value, len %d:\n", OID, buf_len);
for (i = 0; i < buf_len; i += 16) { for (i = 0; i < buf_len; i += 16) {
DEBUG ("%03d: " DEBUG ("%03d: "
...@@ -711,7 +736,7 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, ...@@ -711,7 +736,7 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
* PROMISCUOUS, DIRECTED, * PROMISCUOUS, DIRECTED,
* MULTICAST, ALL_MULTICAST, BROADCAST * MULTICAST, ALL_MULTICAST, BROADCAST
*/ */
params->filter = *(u32 *)buf; params->filter = cpu_to_le32p((u32 *)buf);
DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER %08x\n", DEBUG("%s: OID_GEN_CURRENT_PACKET_FILTER %08x\n",
__FUNCTION__, params->filter); __FUNCTION__, params->filter);
...@@ -743,7 +768,7 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len, ...@@ -743,7 +768,7 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
param = (struct rndis_config_parameter *) buf; param = (struct rndis_config_parameter *) buf;
DEBUG("%s: OID_GEN_RNDIS_CONFIG_PARAMETER '%*s'\n", DEBUG("%s: OID_GEN_RNDIS_CONFIG_PARAMETER '%*s'\n",
__FUNCTION__, __FUNCTION__,
param->ParameterNameLength, min(cpu_to_le32(param->ParameterNameLength),80),
buf + param->ParameterNameOffset); buf + param->ParameterNameOffset);
retval = 0; retval = 0;
} }
...@@ -794,22 +819,24 @@ static int rndis_init_response (int configNr, rndis_init_msg_type *buf) ...@@ -794,22 +819,24 @@ static int rndis_init_response (int configNr, rndis_init_msg_type *buf)
if (!resp) return -ENOMEM; if (!resp) return -ENOMEM;
resp->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT; resp->MessageType = __constant_cpu_to_le32 (
resp->MessageLength = 52; REMOTE_NDIS_INITIALIZE_CMPLT);
resp->RequestID = buf->RequestID; resp->MessageLength = __constant_cpu_to_le32 (52);
resp->Status = RNDIS_STATUS_SUCCESS; resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
resp->MajorVersion = RNDIS_MAJOR_VERSION; resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
resp->MinorVersion = RNDIS_MINOR_VERSION; resp->MajorVersion = __constant_cpu_to_le32 (RNDIS_MAJOR_VERSION);
resp->DeviceFlags = RNDIS_DF_CONNECTIONLESS; resp->MinorVersion = __constant_cpu_to_le32 (RNDIS_MINOR_VERSION);
resp->Medium = RNDIS_MEDIUM_802_3; resp->DeviceFlags = __constant_cpu_to_le32 (RNDIS_DF_CONNECTIONLESS);
resp->MaxPacketsPerTransfer = 1; resp->Medium = __constant_cpu_to_le32 (RNDIS_MEDIUM_802_3);
resp->MaxTransferSize = rndis_per_dev_params [configNr].dev->mtu resp->MaxPacketsPerTransfer = __constant_cpu_to_le32 (1);
resp->MaxTransferSize = cpu_to_le32 (
rndis_per_dev_params [configNr].dev->mtu
+ sizeof (struct ethhdr) + sizeof (struct ethhdr)
+ sizeof (struct rndis_packet_msg_type) + sizeof (struct rndis_packet_msg_type)
+ 22; + 22);
resp->PacketAlignmentFactor = 0; resp->PacketAlignmentFactor = __constant_cpu_to_le32 (0);
resp->AFListOffset = 0; resp->AFListOffset = __constant_cpu_to_le32 (0);
resp->AFListSize = 0; resp->AFListSize = __constant_cpu_to_le32 (0);
if (rndis_per_dev_params [configNr].ack) if (rndis_per_dev_params [configNr].ack)
rndis_per_dev_params [configNr].ack ( rndis_per_dev_params [configNr].ack (
...@@ -823,7 +850,7 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf) ...@@ -823,7 +850,7 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
rndis_query_cmplt_type *resp; rndis_query_cmplt_type *resp;
rndis_resp_t *r; 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; if (!rndis_per_dev_params [configNr].dev) return -ENOTSUPP;
/* /*
...@@ -837,17 +864,18 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf) ...@@ -837,17 +864,18 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
if (!resp) return -ENOMEM; if (!resp) return -ENOMEM;
resp->MessageType = REMOTE_NDIS_QUERY_CMPLT; resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_QUERY_CMPLT);
resp->MessageLength = 24; resp->MessageLength = __constant_cpu_to_le32 (24);
resp->RequestID = buf->RequestID; 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 */ /* OID not supported */
resp->Status = RNDIS_STATUS_NOT_SUPPORTED; resp->Status = __constant_cpu_to_le32 (
resp->InformationBufferLength = 0; RNDIS_STATUS_NOT_SUPPORTED);
resp->InformationBufferOffset = 0; resp->InformationBufferLength = __constant_cpu_to_le32 (0);
resp->InformationBufferOffset = __constant_cpu_to_le32 (0);
} else } else
resp->Status = RNDIS_STATUS_SUCCESS; resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
if (rndis_per_dev_params [configNr].ack) if (rndis_per_dev_params [configNr].ack)
rndis_per_dev_params [configNr].ack ( rndis_per_dev_params [configNr].ack (
...@@ -857,6 +885,7 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf) ...@@ -857,6 +885,7 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
static int rndis_set_response (int configNr, rndis_set_msg_type *buf) static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
{ {
u32 BufLength, BufOffset;
rndis_set_cmplt_type *resp; rndis_set_cmplt_type *resp;
rndis_resp_t *r; rndis_resp_t *r;
...@@ -866,30 +895,32 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf) ...@@ -866,30 +895,32 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
resp = (rndis_set_cmplt_type *) r->buf; resp = (rndis_set_cmplt_type *) r->buf;
if (!resp) return -ENOMEM; if (!resp) return -ENOMEM;
BufLength = cpu_to_le32 (buf->InformationBufferLength);
BufOffset = cpu_to_le32 (buf->InformationBufferOffset);
#ifdef VERBOSE #ifdef VERBOSE
DEBUG("%s: Length: %d\n", __FUNCTION__, buf->InformationBufferLength); DEBUG("%s: Length: %d\n", __FUNCTION__, BufLength);
DEBUG("%s: Offset: %d\n", __FUNCTION__, buf->InformationBufferOffset); DEBUG("%s: Offset: %d\n", __FUNCTION__, BufOffset);
DEBUG("%s: InfoBuffer: ", __FUNCTION__); DEBUG("%s: InfoBuffer: ", __FUNCTION__);
for (i = 0; i < buf->InformationBufferLength; i++) { for (i = 0; i < BufLength; i++) {
DEBUG ("%02x ", *(((u8 *) buf) + i + 12 + DEBUG ("%02x ", *(((u8 *) buf) + i + 8 + BufOffset));
buf->InformationBufferOffset));
} }
DEBUG ("\n"); DEBUG ("\n");
#endif #endif
resp->MessageType = REMOTE_NDIS_SET_CMPLT; resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_SET_CMPLT);
resp->MessageLength = 16; resp->MessageLength = __constant_cpu_to_le32 (16);
resp->RequestID = buf->RequestID; resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
if (gen_ndis_set_resp (configNr, buf->OID, if (gen_ndis_set_resp (configNr, cpu_to_le32 (buf->OID),
((u8 *) buf) + 28, ((u8 *) buf) + 8 + BufOffset, BufLength, r))
buf->InformationBufferLength, r)) resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_NOT_SUPPORTED);
resp->Status = RNDIS_STATUS_NOT_SUPPORTED; else resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
else resp->Status = RNDIS_STATUS_SUCCESS;
if (rndis_per_dev_params [configNr].ack) 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; return 0;
} }
...@@ -905,10 +936,11 @@ static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf) ...@@ -905,10 +936,11 @@ static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf)
resp = (rndis_reset_cmplt_type *) r->buf; resp = (rndis_reset_cmplt_type *) r->buf;
if (!resp) return -ENOMEM; if (!resp) return -ENOMEM;
resp->MessageType = REMOTE_NDIS_RESET_CMPLT; resp->MessageType = __constant_cpu_to_le32 (REMOTE_NDIS_RESET_CMPLT);
resp->MessageLength = 16; resp->MessageLength = __constant_cpu_to_le32 (16);
resp->Status = RNDIS_STATUS_SUCCESS; resp->Status = __constant_cpu_to_le32 (RNDIS_STATUS_SUCCESS);
resp->AddressingReset = 1; /* resent information */ /* resent information */
resp->AddressingReset = __constant_cpu_to_le32 (1);
if (rndis_per_dev_params [configNr].ack) if (rndis_per_dev_params [configNr].ack)
rndis_per_dev_params [configNr].ack ( rndis_per_dev_params [configNr].ack (
...@@ -929,10 +961,11 @@ static int rndis_keepalive_response (int configNr, ...@@ -929,10 +961,11 @@ static int rndis_keepalive_response (int configNr,
resp = (rndis_keepalive_cmplt_type *) r->buf; resp = (rndis_keepalive_cmplt_type *) r->buf;
if (!resp) return -ENOMEM; if (!resp) return -ENOMEM;
resp->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT; resp->MessageType = __constant_cpu_to_le32 (
resp->MessageLength = 16; REMOTE_NDIS_KEEPALIVE_CMPLT);
resp->RequestID = buf->RequestID; resp->MessageLength = __constant_cpu_to_le32 (16);
resp->Status = RNDIS_STATUS_SUCCESS; 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) if (rndis_per_dev_params [configNr].ack)
rndis_per_dev_params [configNr].ack ( rndis_per_dev_params [configNr].ack (
...@@ -960,11 +993,12 @@ static int rndis_indicate_status_msg (int configNr, u32 status) ...@@ -960,11 +993,12 @@ static int rndis_indicate_status_msg (int configNr, u32 status)
resp = (rndis_indicate_status_msg_type *) r->buf; resp = (rndis_indicate_status_msg_type *) r->buf;
if (!resp) return -ENOMEM; if (!resp) return -ENOMEM;
resp->MessageType = REMOTE_NDIS_INDICATE_STATUS_MSG; resp->MessageType = __constant_cpu_to_le32 (
resp->MessageLength = 20; REMOTE_NDIS_INDICATE_STATUS_MSG);
resp->Status = status; resp->MessageLength = __constant_cpu_to_le32 (20);
resp->StatusBufferLength = 0; resp->Status = cpu_to_le32 (status);
resp->StatusBufferOffset = 0; resp->StatusBufferLength = __constant_cpu_to_le32 (0);
resp->StatusBufferOffset = __constant_cpu_to_le32 (0);
if (rndis_per_dev_params [configNr].ack) if (rndis_per_dev_params [configNr].ack)
rndis_per_dev_params [configNr].ack ( rndis_per_dev_params [configNr].ack (
...@@ -1005,8 +1039,8 @@ int rndis_msg_parser (u8 configNr, u8 *buf) ...@@ -1005,8 +1039,8 @@ int rndis_msg_parser (u8 configNr, u8 *buf)
return -ENOMEM; return -ENOMEM;
tmp = (u32 *) buf; tmp = (u32 *) buf;
MsgType = *tmp; MsgType = cpu_to_le32p(tmp++);
MsgLength = *(tmp + 1); MsgLength = cpu_to_le32p(tmp++);
if (configNr >= RNDIS_MAX_CONFIGS) if (configNr >= RNDIS_MAX_CONFIGS)
return -ENOTSUPP; return -ENOTSUPP;
...@@ -1158,10 +1192,10 @@ void rndis_add_hdr (struct sk_buff *skb) ...@@ -1158,10 +1192,10 @@ void rndis_add_hdr (struct sk_buff *skb)
if (!skb) return; if (!skb) return;
skb_push (skb, sizeof (struct rndis_packet_msg_type)); skb_push (skb, sizeof (struct rndis_packet_msg_type));
memset (skb->data, 0, sizeof (struct rndis_packet_msg_type)); memset (skb->data, 0, sizeof (struct rndis_packet_msg_type));
*((u32 *) skb->data) = 1; *((u32 *) skb->data) = __constant_cpu_to_le32 (1);
*((u32 *) skb->data + 1) = skb->len; *((u32 *) skb->data + 1) = cpu_to_le32(skb->len);
*((u32 *) skb->data + 2) = 36; *((u32 *) skb->data + 2) = __constant_cpu_to_le32 (36);
*((u32 *) skb->data + 3) = skb->len - 44; *((u32 *) skb->data + 3) = cpu_to_le32(skb->len - 44);
return; return;
} }
...@@ -1221,14 +1255,16 @@ static rndis_resp_t *rndis_add_response (int configNr, u32 length) ...@@ -1221,14 +1255,16 @@ static rndis_resp_t *rndis_add_response (int configNr, u32 length)
int rndis_rm_hdr (u8 *buf, u32 *length) 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 (!buf || !length) return -1;
if (*((u32 *) buf) != 1) return -1; if (cpu_to_le32p(tmp++) != 1) return -1;
messageLen = *((u32 *) buf + 1); messageLen = cpu_to_le32p(tmp++);
dataOffset = cpu_to_le32p(tmp++) + 8;
dataOffset = *((u32 *) buf + 2) + 8;
if (messageLen < dataOffset || messageLen > *length) return -1; if (messageLen < dataOffset || messageLen > *length) return -1;
for (i = dataOffset; i < messageLen; i++) for (i = dataOffset; i < messageLen; i++)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment