Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 232606
b: refs/heads/master
c: b92a5e2
h: refs/heads/master
v: v3
  • Loading branch information
Max Vozeler authored and Greg Kroah-Hartman committed Jan 21, 2011
1 parent a8015a5 commit 3db27de
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 8 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: 7606ee8aa33287dd3e6eb44c78541b87a413a325
refs/heads/master: b92a5e23737172c52656a090977408a80d7f06d1
3 changes: 3 additions & 0 deletions trunk/drivers/staging/usbip/vhci.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ void rh_port_disconnect(int rhport);
void vhci_rx_loop(struct usbip_task *ut);
void vhci_tx_loop(struct usbip_task *ut);

struct urb *pickup_urb_and_free_priv(struct vhci_device *vdev,
__u32 seqnum);

#define hardware (&the_controller->pdev.dev)

static inline struct vhci_device *port_to_vdev(__u32 port)
Expand Down
24 changes: 23 additions & 1 deletion trunk/drivers/staging/usbip/vhci_hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -808,19 +808,41 @@ static int vhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
return 0;
}


static void vhci_device_unlink_cleanup(struct vhci_device *vdev)
{
struct vhci_unlink *unlink, *tmp;

spin_lock(&vdev->priv_lock);

list_for_each_entry_safe(unlink, tmp, &vdev->unlink_tx, list) {
usbip_uinfo("unlink cleanup tx %lu\n", unlink->unlink_seqnum);
list_del(&unlink->list);
kfree(unlink);
}

list_for_each_entry_safe(unlink, tmp, &vdev->unlink_rx, list) {
struct urb *urb;

/* give back URB of unanswered unlink request */
usbip_uinfo("unlink cleanup rx %lu\n", unlink->unlink_seqnum);

urb = pickup_urb_and_free_priv(vdev, unlink->unlink_seqnum);
if (!urb) {
usbip_uinfo("the urb (seqnum %lu) was already given back\n",
unlink->unlink_seqnum);
list_del(&unlink->list);
kfree(unlink);
continue;
}

urb->status = -ENODEV;

spin_lock(&the_controller->lock);
usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
spin_unlock(&the_controller->lock);

usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb, urb->status);

list_del(&unlink->list);
kfree(unlink);
}
Expand Down
15 changes: 9 additions & 6 deletions trunk/drivers/staging/usbip/vhci_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,14 @@
#include "vhci.h"


/* get URB from transmitted urb queue */
static struct urb *pickup_urb_and_free_priv(struct vhci_device *vdev,
/* get URB from transmitted urb queue. caller must hold vdev->priv_lock */
struct urb *pickup_urb_and_free_priv(struct vhci_device *vdev,
__u32 seqnum)
{
struct vhci_priv *priv, *tmp;
struct urb *urb = NULL;
int status;

spin_lock(&vdev->priv_lock);

list_for_each_entry_safe(priv, tmp, &vdev->priv_rx, list) {
if (priv->seqnum == seqnum) {
urb = priv->urb;
Expand Down Expand Up @@ -63,8 +61,6 @@ static struct urb *pickup_urb_and_free_priv(struct vhci_device *vdev,
}
}

spin_unlock(&vdev->priv_lock);

return urb;
}

Expand All @@ -74,9 +70,11 @@ static void vhci_recv_ret_submit(struct vhci_device *vdev,
struct usbip_device *ud = &vdev->ud;
struct urb *urb;

spin_lock(&vdev->priv_lock);

urb = pickup_urb_and_free_priv(vdev, pdu->base.seqnum);

spin_unlock(&vdev->priv_lock);

if (!urb) {
usbip_uerr("cannot find a urb of seqnum %u\n",
Expand Down Expand Up @@ -161,7 +159,12 @@ static void vhci_recv_ret_unlink(struct vhci_device *vdev,
return;
}

spin_lock(&vdev->priv_lock);

urb = pickup_urb_and_free_priv(vdev, unlink->unlink_seqnum);

spin_unlock(&vdev->priv_lock);

if (!urb) {
/*
* I get the result of a unlink request. But, it seems that I
Expand Down

0 comments on commit 3db27de

Please sign in to comment.