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 {
unsigned zlp:1;
unsigned cdc:1;
unsigned rndis:1;
unsigned suspended:1;
u16 cdc_filter;
unsigned long todo;
#define WORK_RX_MEMORY 0
......@@ -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)
{
struct eth_dev *dev = ep->driver_data;
int status;
/* received RNDIS command from CDC_SEND_ENCAPSULATED_COMMAND */
spin_lock(&dev->lock);
if (rndis_msg_parser (dev->rndis_config, (u8 *) req->buf))
ERROR(dev, "%s: rndis parse error\n", __FUNCTION__ );
status = rndis_msg_parser (dev->rndis_config, (u8 *) req->buf);
if (status < 0)
ERROR(dev, "%s: rndis parse error %d\n", __FUNCTION__, status);
spin_unlock(&dev->lock);
}
......@@ -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 = {
#ifdef CONFIG_USB_GADGET_DUALSPEED
.speed = USB_SPEED_HIGH,
......@@ -2574,6 +2597,9 @@ static struct usb_gadget_driver eth_driver = {
.setup = eth_setup,
.disconnect = eth_disconnect,
.suspend = eth_suspend,
.resume = eth_resume,
.driver = {
.name = (char *) shortname,
// .shutdown = ...
......
......@@ -26,11 +26,41 @@
#define NDIS_STATUS_MULTICAST_EXISTS 0xC001000A
#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 */
#define NDIS_DEVICE_WAKE_UP_ENABLE 0x00000001
#define NDIS_DEVICE_WAKE_ON_PATTERN_MATCH_ENABLE 0x00000002
#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) */
#define OID_GEN_SUPPORTED_LIST 0x00010101
#define OID_GEN_HARDWARE_STATUS 0x00010102
......
......@@ -52,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) \
......@@ -98,6 +94,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
{
int retval = -ENOTSUPP;
u32 length = 0;
u32 *tmp;
int i, count;
rndis_query_cmplt_type *resp;
if (!r) return -ENOMEM;
......@@ -113,7 +111,10 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -127,7 +128,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
* 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;
......@@ -135,7 +136,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -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__);
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;
......@@ -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__);
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;
......@@ -168,9 +171,10 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -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__);
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;
......@@ -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__);
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;
......@@ -200,7 +204,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -216,6 +221,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -224,7 +230,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -232,7 +239,8 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -240,15 +248,16 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -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__);
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;
......@@ -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__);
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;
......@@ -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__);
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;
......@@ -317,11 +327,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -330,11 +341,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -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) {
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;
......@@ -366,14 +381,17 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
/* 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;
......@@ -381,11 +399,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -393,11 +412,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -405,11 +425,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -417,35 +438,37 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -453,11 +476,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -465,11 +489,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -477,11 +502,12 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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;
......@@ -489,18 +515,19 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
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 */
......@@ -517,7 +544,7 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
length);
retval = 0;
} else {
*((u32 *) resp + 6) = 0;
*((u32 *) resp + 6) = __constant_cpu_to_le32 (0);
retval = 0;
}
break;
......@@ -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__);
length = 4;
/* Multicast base address only */
*((u32 *) resp + 6) = 0xE0000000;
*((u32 *) resp + 6) = __constant_cpu_to_le32 (0xE0000000);
retval = 0;
break;
......@@ -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__);
length = 4;
/* Multicast base address only */
*((u32 *) resp + 6) = 1;
*((u32 *) resp + 6) = __constant_cpu_to_le32 (1);
retval = 0;
break;
......@@ -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)
{
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;
......@@ -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:
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;
......@@ -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:
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;
......@@ -658,9 +686,9 @@ static int gen_ndis_query_resp (int configNr, u32 OID, rndis_resp_t *r)
__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;
}
......@@ -671,7 +699,6 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
rndis_set_cmplt_type *resp;
int i, retval = -ENOTSUPP;
struct rndis_params *params;
u8 *cp;
if (!r)
return -ENOMEM;
......@@ -679,8 +706,6 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
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: "
......@@ -711,7 +736,7 @@ static int gen_ndis_set_resp (u8 configNr, u32 OID, u8 *buf, u32 buf_len,
* 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);
......@@ -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;
DEBUG("%s: OID_GEN_RNDIS_CONFIG_PARAMETER '%*s'\n",
__FUNCTION__,
param->ParameterNameLength,
min(cpu_to_le32(param->ParameterNameLength),80),
buf + param->ParameterNameOffset);
retval = 0;
}
......@@ -794,22 +819,24 @@ static int rndis_init_response (int configNr, rndis_init_msg_type *buf)
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 (
......@@ -823,7 +850,7 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
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;
/*
......@@ -837,17 +864,18 @@ static int rndis_query_response (int configNr, rndis_query_msg_type *buf)
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 (
......@@ -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)
{
u32 BufLength, BufOffset;
rndis_set_cmplt_type *resp;
rndis_resp_t *r;
......@@ -866,30 +895,32 @@ static int rndis_set_response (int configNr, rndis_set_msg_type *buf)
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;
}
......@@ -905,10 +936,11 @@ static int rndis_reset_response (int configNr, rndis_reset_msg_type *buf)
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 (
......@@ -929,10 +961,11 @@ static int rndis_keepalive_response (int configNr,
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 (
......@@ -960,11 +993,12 @@ static int rndis_indicate_status_msg (int configNr, u32 status)
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 (
......@@ -1005,8 +1039,8 @@ int rndis_msg_parser (u8 configNr, u8 *buf)
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;
......@@ -1158,10 +1192,10 @@ void rndis_add_hdr (struct sk_buff *skb)
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;
}
......@@ -1221,14 +1255,16 @@ static rndis_resp_t *rndis_add_response (int configNr, 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 (*((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;
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