summaryrefslogtreecommitdiffstats
path: root/drivers/staging/hv/rndis_filter.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/hv/rndis_filter.c')
-rw-r--r--drivers/staging/hv/rndis_filter.c107
1 files changed, 53 insertions, 54 deletions
diff --git a/drivers/staging/hv/rndis_filter.c b/drivers/staging/hv/rndis_filter.c
index 53676dcbf381..e7189cd324ca 100644
--- a/drivers/staging/hv/rndis_filter.c
+++ b/drivers/staging/hv/rndis_filter.c
@@ -19,13 +19,15 @@
* Hank Janssen <hjanssen@microsoft.com>
*/
#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/wait.h>
#include <linux/highmem.h>
#include <linux/slab.h>
#include <linux/io.h>
#include <linux/if_ether.h>
-#include "osd.h"
#include "logging.h"
+#include "hv_api.h"
#include "netvsc_api.h"
#include "rndis_filter.h"
@@ -57,7 +59,8 @@ struct rndis_device {
struct rndis_request {
struct list_head list_ent;
- struct osd_waitevent *waitevent;
+ int wait_condition;
+ wait_queue_head_t wait_event;
/*
* FIXME: We assumed a fixed size response here. If we do ever need to
@@ -129,11 +132,7 @@ static struct rndis_request *get_rndis_request(struct rndis_device *dev,
if (!request)
return NULL;
- request->waitevent = osd_waitevent_create();
- if (!request->waitevent) {
- kfree(request);
- return NULL;
- }
+ init_waitqueue_head(&request->wait_event);
rndis_msg = &request->request_msg;
rndis_msg->ndis_msg_type = msg_type;
@@ -164,7 +163,6 @@ static void put_rndis_request(struct rndis_device *dev,
list_del(&req->list_ent);
spin_unlock_irqrestore(&dev->request_lock, flags);
- kfree(req->waitevent);
kfree(req);
}
@@ -255,10 +253,10 @@ static int rndis_filter_send_request(struct rndis_device *dev,
packet->total_data_buflen = req->request_msg.msg_len;
packet->page_buf_cnt = 1;
- packet->page_buf[0].Pfn = virt_to_phys(&req->request_msg) >>
+ packet->page_buf[0].pfn = virt_to_phys(&req->request_msg) >>
PAGE_SHIFT;
- packet->page_buf[0].Length = req->request_msg.msg_len;
- packet->page_buf[0].Offset =
+ packet->page_buf[0].len = req->request_msg.msg_len;
+ packet->page_buf[0].offset =
(unsigned long)&req->request_msg & (PAGE_SIZE - 1);
packet->completion.send.send_completion_ctx = req;/* packet; */
@@ -321,7 +319,8 @@ static void rndis_filter_receive_response(struct rndis_device *dev,
}
}
- osd_waitevent_set(request->waitevent);
+ request->wait_condition = 1;
+ wake_up(&request->wait_event);
} else {
DPRINT_ERR(NETVSC, "no rndis request found for this response "
"(id 0x%x res type 0x%x)",
@@ -356,10 +355,6 @@ static void rndis_filter_receive_data(struct rndis_device *dev,
struct rndis_packet *rndis_pkt;
u32 data_offset;
- /* empty ethernet frame ?? */
- /* ASSERT(Packet->PageBuffers[0].Length > */
- /* RNDIS_MESSAGE_SIZE(struct rndis_packet)); */
-
rndis_pkt = &msg->msg.pkt;
/*
@@ -371,8 +366,8 @@ static void rndis_filter_receive_data(struct rndis_device *dev,
data_offset = RNDIS_HEADER_SIZE + rndis_pkt->data_offset;
pkt->total_data_buflen -= data_offset;
- pkt->page_buf[0].Offset += data_offset;
- pkt->page_buf[0].Length -= data_offset;
+ pkt->page_buf[0].offset += data_offset;
+ pkt->page_buf[0].len -= data_offset;
pkt->is_data_pkt = true;
@@ -383,7 +378,7 @@ static void rndis_filter_receive_data(struct rndis_device *dev,
static int rndis_filter_receive(struct hv_device *dev,
struct hv_netvsc_packet *pkt)
{
- struct netvsc_device *net_dev = dev->Extension;
+ struct netvsc_device *net_dev = dev->ext;
struct rndis_device *rndis_dev;
struct rndis_message rndis_msg;
struct rndis_message *rndis_hdr;
@@ -406,10 +401,10 @@ static int rndis_filter_receive(struct hv_device *dev,
}
rndis_hdr = (struct rndis_message *)kmap_atomic(
- pfn_to_page(pkt->page_buf[0].Pfn), KM_IRQ0);
+ pfn_to_page(pkt->page_buf[0].pfn), KM_IRQ0);
rndis_hdr = (void *)((unsigned long)rndis_hdr +
- pkt->page_buf[0].Offset);
+ pkt->page_buf[0].offset);
/* Make sure we got a valid rndis message */
/*
@@ -419,7 +414,7 @@ static int rndis_filter_receive(struct hv_device *dev,
* */
#if 0
if (pkt->total_data_buflen != rndis_hdr->msg_len) {
- kunmap_atomic(rndis_hdr - pkt->page_buf[0].Offset,
+ kunmap_atomic(rndis_hdr - pkt->page_buf[0].offset,
KM_IRQ0);
DPRINT_ERR(NETVSC, "invalid rndis message? (expected %u "
@@ -443,7 +438,7 @@ static int rndis_filter_receive(struct hv_device *dev,
sizeof(struct rndis_message) :
rndis_hdr->msg_len);
- kunmap_atomic(rndis_hdr - pkt->page_buf[0].Offset, KM_IRQ0);
+ kunmap_atomic(rndis_hdr - pkt->page_buf[0].offset, KM_IRQ0);
dump_rndis_message(&rndis_msg);
@@ -456,8 +451,6 @@ static int rndis_filter_receive(struct hv_device *dev,
case REMOTE_NDIS_INITIALIZE_CMPLT:
case REMOTE_NDIS_QUERY_CMPLT:
case REMOTE_NDIS_SET_CMPLT:
- /* case REMOTE_NDIS_RESET_CMPLT: */
- /* case REMOTE_NDIS_KEEPALIVE_CMPLT: */
/* completion msgs */
rndis_filter_receive_response(rndis_dev, &rndis_msg);
break;
@@ -503,11 +496,17 @@ static int rndis_filter_query_device(struct rndis_device *dev, u32 oid,
query->info_buflen = 0;
query->dev_vc_handle = 0;
+ request->wait_condition = 0;
ret = rndis_filter_send_request(dev, request);
if (ret != 0)
goto Cleanup;
- osd_waitevent_wait(request->waitevent);
+ wait_event_timeout(request->wait_event, request->wait_condition,
+ msecs_to_jiffies(1000));
+ if (request->wait_condition == 0) {
+ ret = -ETIMEDOUT;
+ goto Cleanup;
+ }
/* Copy the response back */
query_complete = &request->response_msg.msg.query_complete;
@@ -558,9 +557,6 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
u32 status;
int ret;
- /* ASSERT(RNDIS_MESSAGE_SIZE(struct rndis_set_request) + sizeof(u32) <= */
- /* sizeof(struct rndis_message)); */
-
request = get_rndis_request(dev, REMOTE_NDIS_SET_MSG,
RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
sizeof(u32));
@@ -578,12 +574,14 @@ static int rndis_filter_set_packet_filter(struct rndis_device *dev,
memcpy((void *)(unsigned long)set + sizeof(struct rndis_set_request),
&new_filter, sizeof(u32));
+ request->wait_condition = 0;
ret = rndis_filter_send_request(dev, request);
if (ret != 0)
goto Cleanup;
- ret = osd_waitevent_waitex(request->waitevent, 2000/*2sec*/);
- if (!ret) {
+ wait_event_timeout(request->wait_event, request->wait_condition,
+ msecs_to_jiffies(2000));
+ if (request->wait_condition == 0) {
ret = -1;
DPRINT_ERR(NETVSC, "timeout before we got a set response...");
/*
@@ -622,24 +620,21 @@ int rndis_filter_init(struct netvsc_driver *drv)
rndisDriver->OnLinkStatusChanged = Driver->OnLinkStatusChanged;*/
/* Save the original dispatch handlers before we override it */
- rndis_filter.inner_drv.base.OnDeviceAdd = drv->base.OnDeviceAdd;
- rndis_filter.inner_drv.base.OnDeviceRemove =
- drv->base.OnDeviceRemove;
- rndis_filter.inner_drv.base.OnCleanup = drv->base.OnCleanup;
+ rndis_filter.inner_drv.base.dev_add = drv->base.dev_add;
+ rndis_filter.inner_drv.base.dev_rm =
+ drv->base.dev_rm;
+ rndis_filter.inner_drv.base.cleanup = drv->base.cleanup;
- /* ASSERT(Driver->OnSend); */
- /* ASSERT(Driver->OnReceiveCallback); */
rndis_filter.inner_drv.send = drv->send;
rndis_filter.inner_drv.recv_cb = drv->recv_cb;
rndis_filter.inner_drv.link_status_change =
drv->link_status_change;
/* Override */
- drv->base.OnDeviceAdd = rndis_filte_device_add;
- drv->base.OnDeviceRemove = rndis_filter_device_remove;
- drv->base.OnCleanup = rndis_filter_cleanup;
+ drv->base.dev_add = rndis_filte_device_add;
+ drv->base.dev_rm = rndis_filter_device_remove;
+ drv->base.cleanup = rndis_filter_cleanup;
drv->send = rndis_filter_send;
- /* Driver->QueryLinkStatus = RndisFilterQueryDeviceLinkStatus; */
drv->recv_cb = rndis_filter_receive;
return 0;
@@ -669,13 +664,20 @@ static int rndis_filter_init_device(struct rndis_device *dev)
dev->state = RNDIS_DEV_INITIALIZING;
+ request->wait_condition = 0;
ret = rndis_filter_send_request(dev, request);
if (ret != 0) {
dev->state = RNDIS_DEV_UNINITIALIZED;
goto Cleanup;
}
- osd_waitevent_wait(request->waitevent);
+
+ wait_event_timeout(request->wait_event, request->wait_condition,
+ msecs_to_jiffies(1000));
+ if (request->wait_condition == 0) {
+ ret = -ETIMEDOUT;
+ goto Cleanup;
+ }
init_complete = &request->response_msg.msg.init_complete;
status = init_complete->status;
@@ -770,7 +772,7 @@ static int rndis_filte_device_add(struct hv_device *dev,
* NOTE! Once the channel is created, we may get a receive callback
* (RndisFilterOnReceive()) before this call is completed
*/
- ret = rndis_filter.inner_drv.base.OnDeviceAdd(dev, additional_info);
+ ret = rndis_filter.inner_drv.base.dev_add(dev, additional_info);
if (ret != 0) {
kfree(rndisDevice);
return ret;
@@ -778,9 +780,7 @@ static int rndis_filte_device_add(struct hv_device *dev,
/* Initialize the rndis device */
- netDevice = dev->Extension;
- /* ASSERT(netDevice); */
- /* ASSERT(netDevice->Device); */
+ netDevice = dev->ext;
netDevice->extension = rndisDevice;
rndisDevice->net_dev = netDevice;
@@ -818,7 +818,7 @@ static int rndis_filte_device_add(struct hv_device *dev,
static int rndis_filter_device_remove(struct hv_device *dev)
{
- struct netvsc_device *net_dev = dev->Extension;
+ struct netvsc_device *net_dev = dev->ext;
struct rndis_device *rndis_dev = net_dev->extension;
/* Halt and release the rndis device */
@@ -828,7 +828,7 @@ static int rndis_filter_device_remove(struct hv_device *dev)
net_dev->extension = NULL;
/* Pass control to inner driver to remove the device */
- rndis_filter.inner_drv.base.OnDeviceRemove(dev);
+ rndis_filter.inner_drv.base.dev_rm(dev);
return 0;
}
@@ -839,7 +839,7 @@ static void rndis_filter_cleanup(struct hv_driver *drv)
int rndis_filter_open(struct hv_device *dev)
{
- struct netvsc_device *netDevice = dev->Extension;
+ struct netvsc_device *netDevice = dev->ext;
if (!netDevice)
return -EINVAL;
@@ -849,7 +849,7 @@ int rndis_filter_open(struct hv_device *dev)
int rndis_filter_close(struct hv_device *dev)
{
- struct netvsc_device *netDevice = dev->Extension;
+ struct netvsc_device *netDevice = dev->ext;
if (!netDevice)
return -EINVAL;
@@ -868,7 +868,6 @@ static int rndis_filter_send(struct hv_device *dev,
/* Add the rndis header */
filterPacket = (struct rndis_filter_packet *)pkt->extension;
- /* ASSERT(filterPacket); */
memset(filterPacket, 0, sizeof(struct rndis_filter_packet));
@@ -884,10 +883,10 @@ static int rndis_filter_send(struct hv_device *dev,
rndisPacket->data_len = pkt->total_data_buflen;
pkt->is_data_pkt = true;
- pkt->page_buf[0].Pfn = virt_to_phys(rndisMessage) >> PAGE_SHIFT;
- pkt->page_buf[0].Offset =
+ pkt->page_buf[0].pfn = virt_to_phys(rndisMessage) >> PAGE_SHIFT;
+ pkt->page_buf[0].offset =
(unsigned long)rndisMessage & (PAGE_SIZE-1);
- pkt->page_buf[0].Length = rndisMessageSize;
+ pkt->page_buf[0].len = rndisMessageSize;
/* Save the packet send completion and context */
filterPacket->completion = pkt->completion.send.send_completion;