Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 249100
b: refs/heads/master
c: 5799115
h: refs/heads/master
v: v3
  • Loading branch information
Haiyang Zhang authored and Greg Kroah-Hartman committed Apr 25, 2011
1 parent e3d9541 commit 43e5f97
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 53 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: af24ce42c51fad4fdc2eb3576b8c0388fd19ed4a
refs/heads/master: 57991156b949cca02737e67d8fa3fa75f80720d9
102 changes: 50 additions & 52 deletions trunk/drivers/staging/hv/netvsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,6 @@ static void netvsc_send_completion(struct hv_device *device,
static void netvsc_receive(struct hv_device *device,
struct vmpacket_descriptor *packet);

static void netvsc_receive_completion(void *context);

static void netvsc_send_recv_completion(struct hv_device *device,
u64 transaction_id);

Expand Down Expand Up @@ -837,6 +835,56 @@ static int netvsc_send(struct hv_device *device,
return ret;
}

/* Send a receive completion packet to RNDIS device (ie NetVsp) */
static void netvsc_receive_completion(void *context)
{
struct hv_netvsc_packet *packet = context;
struct hv_device *device = (struct hv_device *)packet->device;
struct netvsc_device *net_device;
u64 transaction_id = 0;
bool fsend_receive_comp = false;
unsigned long flags;

/*
* Even though it seems logical to do a GetOutboundNetDevice() here to
* send out receive completion, we are using GetInboundNetDevice()
* since we may have disable outbound traffic already.
*/
net_device = get_inbound_net_device(device);
if (!net_device) {
dev_err(&device->device, "unable to get net device..."
"device being destroyed?");
return;
}

/* Overloading use of the lock. */
spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);

packet->xfer_page_pkt->count--;

/*
* Last one in the line that represent 1 xfer page packet.
* Return the xfer page packet itself to the freelist
*/
if (packet->xfer_page_pkt->count == 0) {
fsend_receive_comp = true;
transaction_id = packet->completion.recv.recv_completion_tid;
list_add_tail(&packet->xfer_page_pkt->list_ent,
&net_device->recv_pkt_list);

}

/* Put the packet back */
list_add_tail(&packet->list_ent, &net_device->recv_pkt_list);
spin_unlock_irqrestore(&net_device->recv_pkt_list_lock, flags);

/* Send a receive completion for the xfer page packet */
if (fsend_receive_comp)
netvsc_send_recv_completion(device, transaction_id);

put_net_device(device);
}

static void netvsc_receive(struct hv_device *device,
struct vmpacket_descriptor *packet)
{
Expand Down Expand Up @@ -1063,56 +1111,6 @@ static void netvsc_send_recv_completion(struct hv_device *device,
}
}

/* Send a receive completion packet to RNDIS device (ie NetVsp) */
static void netvsc_receive_completion(void *context)
{
struct hv_netvsc_packet *packet = context;
struct hv_device *device = (struct hv_device *)packet->device;
struct netvsc_device *net_device;
u64 transaction_id = 0;
bool fsend_receive_comp = false;
unsigned long flags;

/*
* Even though it seems logical to do a GetOutboundNetDevice() here to
* send out receive completion, we are using GetInboundNetDevice()
* since we may have disable outbound traffic already.
*/
net_device = get_inbound_net_device(device);
if (!net_device) {
dev_err(&device->device, "unable to get net device..."
"device being destroyed?");
return;
}

/* Overloading use of the lock. */
spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);

packet->xfer_page_pkt->count--;

/*
* Last one in the line that represent 1 xfer page packet.
* Return the xfer page packet itself to the freelist
*/
if (packet->xfer_page_pkt->count == 0) {
fsend_receive_comp = true;
transaction_id = packet->completion.recv.recv_completion_tid;
list_add_tail(&packet->xfer_page_pkt->list_ent,
&net_device->recv_pkt_list);

}

/* Put the packet back */
list_add_tail(&packet->list_ent, &net_device->recv_pkt_list);
spin_unlock_irqrestore(&net_device->recv_pkt_list_lock, flags);

/* Send a receive completion for the xfer page packet */
if (fsend_receive_comp)
netvsc_send_recv_completion(device, transaction_id);

put_net_device(device);
}

static void netvsc_channel_cb(void *context)
{
int ret;
Expand Down

0 comments on commit 43e5f97

Please sign in to comment.