Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 249378
b: refs/heads/master
c: c6956c9
h: refs/heads/master
v: v3
  • Loading branch information
matt mooney authored and Greg Kroah-Hartman committed May 6, 2011
1 parent c37fd74 commit ae075c1
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 34 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: 64f338edbd7bbf9cb5c985ee951c467ba5fd903d
refs/heads/master: c6956c97ec66dea4b7a307e3c7ecbc647d185892
56 changes: 23 additions & 33 deletions trunk/drivers/staging/usbip/stub_tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include "usbip_common.h"
#include "stub.h"


static void stub_free_priv_and_urb(struct stub_priv *priv)
{
struct urb *urb = priv->urb;
Expand Down Expand Up @@ -71,28 +70,27 @@ void stub_complete(struct urb *urb)

usbip_dbg_stub_tx("complete! status %d\n", urb->status);


switch (urb->status) {
case 0:
/* OK */
break;
case -ENOENT:
usbip_uinfo("stopped by a call of usb_kill_urb() because of"
"cleaning up a virtual connection\n");
"cleaning up a virtual connection\n");
return;
case -ECONNRESET:
usbip_uinfo("unlinked by a call of usb_unlink_urb()\n");
break;
case -EPIPE:
usbip_uinfo("endpoint %d is stalled\n",
usb_pipeendpoint(urb->pipe));
usb_pipeendpoint(urb->pipe));
break;
case -ESHUTDOWN:
usbip_uinfo("device removed?\n");
break;
default:
usbip_uinfo("urb completion with non-zero status %d\n",
urb->status);
urb->status);
}

/* link a urb to the queue of tx. */
Expand All @@ -104,45 +102,40 @@ void stub_complete(struct urb *urb)
} else
list_move_tail(&priv->list, &sdev->priv_tx);


spin_unlock_irqrestore(&sdev->priv_lock, flags);

/* wake up tx_thread */
wake_up(&sdev->tx_waitq);
}


/*-------------------------------------------------------------------------*/
/* fill PDU */

static inline void setup_base_pdu(struct usbip_header_basic *base,
__u32 command, __u32 seqnum)
__u32 command, __u32 seqnum)
{
base->command = command;
base->seqnum = seqnum;
base->devid = 0;
base->ep = 0;
base->direction = 0;
base->direction = 0;
}

static void setup_ret_submit_pdu(struct usbip_header *rpdu, struct urb *urb)
{
struct stub_priv *priv = (struct stub_priv *) urb->context;

setup_base_pdu(&rpdu->base, USBIP_RET_SUBMIT, priv->seqnum);

usbip_pack_pdu(rpdu, urb, USBIP_RET_SUBMIT, 1);
}

static void setup_ret_unlink_pdu(struct usbip_header *rpdu,
struct stub_unlink *unlink)
struct stub_unlink *unlink)
{
setup_base_pdu(&rpdu->base, USBIP_RET_UNLINK, unlink->seqnum);

rpdu->u.ret_unlink.status = unlink->status;
}


/*-------------------------------------------------------------------------*/
/* send RET_SUBMIT */

Expand Down Expand Up @@ -203,7 +196,7 @@ static int stub_send_ret_submit(struct stub_device *sdev)
/* 1. setup usbip_header */
setup_ret_submit_pdu(&pdu_header, urb);
usbip_dbg_stub_tx("setup txdata seqnum: %d urb: %p\n",
pdu_header.base.seqnum, urb);
pdu_header.base.seqnum, urb);
/*usbip_dump_header(pdu_header);*/
usbip_header_correct_endian(&pdu_header, 1);

Expand All @@ -214,14 +207,14 @@ static int stub_send_ret_submit(struct stub_device *sdev)

/* 2. setup transfer buffer */
if (usb_pipein(urb->pipe) &&
usb_pipetype(urb->pipe) != PIPE_ISOCHRONOUS &&
urb->actual_length > 0) {
usb_pipetype(urb->pipe) != PIPE_ISOCHRONOUS &&
urb->actual_length > 0) {
iov[iovnum].iov_base = urb->transfer_buffer;
iov[iovnum].iov_len = urb->actual_length;
iovnum++;
txsize += urb->actual_length;
} else if (usb_pipein(urb->pipe) &&
usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
/*
* For isochronous packets: actual length is the sum of
* the actual length of the individual, packets, but as
Expand All @@ -232,18 +225,23 @@ static int stub_send_ret_submit(struct stub_device *sdev)

int i;
for (i = 0; i < urb->number_of_packets; i++) {
iov[iovnum].iov_base = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
iov[iovnum].iov_len = urb->iso_frame_desc[i].actual_length;
iov[iovnum].iov_base = urb->transfer_buffer +
urb->iso_frame_desc[i].offset;
iov[iovnum].iov_len =
urb->iso_frame_desc[i].actual_length;
iovnum++;
txsize += urb->iso_frame_desc[i].actual_length;
}

if (txsize != sizeof(pdu_header) + urb->actual_length) {
dev_err(&sdev->interface->dev,
"actual length of urb (%d) does not match iso packet sizes (%d)\n",
urb->actual_length, txsize-sizeof(pdu_header));
"actual length of urb %d does not "
"match iso packet sizes %lu\n",
urb->actual_length,
txsize-sizeof(pdu_header));
kfree(iov);
usbip_event_add(&sdev->ud, SDEV_EVENT_ERROR_TCP);
usbip_event_add(&sdev->ud,
SDEV_EVENT_ERROR_TCP);
return -1;
}
}
Expand Down Expand Up @@ -285,17 +283,14 @@ static int stub_send_ret_submit(struct stub_device *sdev)
}

spin_lock_irqsave(&sdev->priv_lock, flags);

list_for_each_entry_safe(priv, tmp, &sdev->priv_free, list) {
stub_free_priv_and_urb(priv);
}

spin_unlock_irqrestore(&sdev->priv_lock, flags);

return total_size;
}


/*-------------------------------------------------------------------------*/
/* send RET_UNLINK */

Expand All @@ -317,7 +312,6 @@ static struct stub_unlink *dequeue_from_unlink_tx(struct stub_device *sdev)
return NULL;
}


static int stub_send_ret_unlink(struct stub_device *sdev)
{
unsigned long flags;
Expand Down Expand Up @@ -358,13 +352,10 @@ static int stub_send_ret_unlink(struct stub_device *sdev)
return -1;
}


usbip_dbg_stub_tx("send txdata\n");

total_size += txsize;
}


spin_lock_irqsave(&sdev->priv_lock, flags);

list_for_each_entry_safe(unlink, tmp, &sdev->unlink_free, list) {
Expand All @@ -377,7 +368,6 @@ static int stub_send_ret_unlink(struct stub_device *sdev)
return total_size;
}


/*-------------------------------------------------------------------------*/

int stub_tx_loop(void *data)
Expand Down Expand Up @@ -410,9 +400,9 @@ int stub_tx_loop(void *data)
break;

wait_event_interruptible(sdev->tx_waitq,
(!list_empty(&sdev->priv_tx) ||
!list_empty(&sdev->unlink_tx) ||
kthread_should_stop()));
(!list_empty(&sdev->priv_tx) ||
!list_empty(&sdev->unlink_tx) ||
kthread_should_stop()));
}

return 0;
Expand Down

0 comments on commit ae075c1

Please sign in to comment.