Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 213621
b: refs/heads/master
c: 7a7e789
h: refs/heads/master
i:
  213619: 72a4292
v: v3
  • Loading branch information
Martin Fuzzey authored and Greg Kroah-Hartman committed Oct 22, 2010
1 parent 78ebbf7 commit 9ff3294
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 18 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: b2a068d058e71519e14d2c03e92459c4c1d63c8b
refs/heads/master: 7a7e7896422baced4757070b813ba28ab24a214a
56 changes: 39 additions & 17 deletions trunk/drivers/usb/host/imx21-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,15 +390,19 @@ static void schedule_nonisoc_etd(struct imx21 *imx21, struct urb *urb);
/* Endpoint now idle - release it's ETD(s) or asssign to queued request */
static void ep_idle(struct imx21 *imx21, struct ep_priv *ep_priv)
{
int etd_num;
int i;

for (i = 0; i < NUM_ISO_ETDS; i++) {
etd_num = ep_priv->etd[i];
int etd_num = ep_priv->etd[i];
struct etd_priv *etd;
if (etd_num < 0)
continue;

etd = &imx21->etd[etd_num];
ep_priv->etd[i] = -1;

free_dmem(imx21, etd); /* for isoc */

if (list_empty(&imx21->queue_for_etd)) {
free_etd(imx21, etd_num);
continue;
Expand Down Expand Up @@ -576,30 +580,43 @@ static struct ep_priv *alloc_isoc_ep(
int i;

ep_priv = kzalloc(sizeof(struct ep_priv), GFP_ATOMIC);
if (ep_priv == NULL)
if (!ep_priv)
return NULL;

/* Allocate the ETDs */
for (i = 0; i < NUM_ISO_ETDS; i++) {
ep_priv->etd[i] = alloc_etd(imx21);
if (ep_priv->etd[i] < 0) {
int j;
dev_err(imx21->dev, "isoc: Couldn't allocate etd\n");
for (j = 0; j < i; j++)
free_etd(imx21, ep_priv->etd[j]);
goto alloc_etd_failed;
}
imx21->etd[ep_priv->etd[i]].ep = ep;
}
for (i = 0; i < NUM_ISO_ETDS; i++)
ep_priv->etd[i] = -1;

INIT_LIST_HEAD(&ep_priv->td_list);
ep_priv->ep = ep;
ep->hcpriv = ep_priv;
return ep_priv;
}

static int alloc_isoc_etds(struct imx21 *imx21, struct ep_priv *ep_priv)
{
int i, j;
int etd_num;

/* Allocate the ETDs if required */
for (i = 0; i < NUM_ISO_ETDS; i++) {
if (ep_priv->etd[i] < 0) {
etd_num = alloc_etd(imx21);
if (etd_num < 0)
goto alloc_etd_failed;

ep_priv->etd[i] = etd_num;
imx21->etd[etd_num].ep = ep_priv->ep;
}
}
return 0;

alloc_etd_failed:
kfree(ep_priv);
return NULL;
dev_err(imx21->dev, "isoc: Couldn't allocate etd\n");
for (j = 0; j < i; j++) {
free_etd(imx21, ep_priv->etd[j]);
ep_priv->etd[j] = -1;
}
return -ENOMEM;
}

static int imx21_hc_urb_enqueue_isoc(struct usb_hcd *hcd,
Expand Down Expand Up @@ -639,6 +656,10 @@ static int imx21_hc_urb_enqueue_isoc(struct usb_hcd *hcd,
ep_priv = ep->hcpriv;
}

ret = alloc_isoc_etds(imx21, ep_priv);
if (ret)
goto alloc_etd_failed;

ret = usb_hcd_link_urb_to_ep(hcd, urb);
if (ret)
goto link_failed;
Expand Down Expand Up @@ -718,6 +739,7 @@ static int imx21_hc_urb_enqueue_isoc(struct usb_hcd *hcd,
usb_hcd_unlink_urb_from_ep(hcd, urb);

link_failed:
alloc_etd_failed:
alloc_ep_failed:
spin_unlock_irqrestore(&imx21->lock, flags);
kfree(urb_priv->isoc_td);
Expand Down

0 comments on commit 9ff3294

Please sign in to comment.