diff options
author | Benjamin Herrenschmidt | 2012-09-07 01:48:59 +0200 |
---|---|---|
committer | Benjamin Herrenschmidt | 2012-09-07 01:48:59 +0200 |
commit | fff34b3412b9401a76ba9d021db1bd91cb0e02b6 (patch) | |
tree | 870ed2d1555004e7939d15b5099017aae61c97b8 /drivers/net/hyperv/rndis_filter.c | |
parent | powerpc/kprobes: Rename opcode_t in probes.h to ppc_opcode_t (diff) | |
parent | powerpc: Don't use __put_user() in patch_instruction (diff) | |
download | kernel-qcow2-linux-fff34b3412b9401a76ba9d021db1bd91cb0e02b6.tar.gz kernel-qcow2-linux-fff34b3412b9401a76ba9d021db1bd91cb0e02b6.tar.xz kernel-qcow2-linux-fff34b3412b9401a76ba9d021db1bd91cb0e02b6.zip |
Merge branch 'merge' into next
Brings in various bug fixes from 3.6-rcX
Diffstat (limited to 'drivers/net/hyperv/rndis_filter.c')
-rw-r--r-- | drivers/net/hyperv/rndis_filter.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index e5d6146937fa..1e88a1095934 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c @@ -718,6 +718,9 @@ static void rndis_filter_halt_device(struct rndis_device *dev) { struct rndis_request *request; struct rndis_halt_request *halt; + struct netvsc_device *nvdev = dev->net_dev; + struct hv_device *hdev = nvdev->dev; + ulong flags; /* Attempt to do a rndis device halt */ request = get_rndis_request(dev, RNDIS_MSG_HALT, @@ -735,6 +738,14 @@ static void rndis_filter_halt_device(struct rndis_device *dev) dev->state = RNDIS_DEV_UNINITIALIZED; cleanup: + spin_lock_irqsave(&hdev->channel->inbound_lock, flags); + nvdev->destroy = true; + spin_unlock_irqrestore(&hdev->channel->inbound_lock, flags); + + /* Wait for all send completions */ + wait_event(nvdev->wait_drain, + atomic_read(&nvdev->num_outstanding_sends) == 0); + if (request) put_rndis_request(dev, request); return; |