fix USB driver to compile with ADMH_VERBOSE_DEBUG defined

SVN-Revision: 9593
This commit is contained in:
Gabor Juhos 2007-11-23 18:11:49 +00:00
parent 5a1a5dcf58
commit 4263fdd731
3 changed files with 34 additions and 36 deletions

View file

@ -76,12 +76,12 @@ static inline char *td_togglestring(u32 info)
* small: 0) header + data packets 1) just header * small: 0) header + data packets 1) just header
*/ */
static void __attribute__((unused)) static void __attribute__((unused))
urb_print(struct admhcd *ahcd, struct urb *urb, char * str, int small) urb_print(struct admhcd *ahcd, struct urb *urb, char *str, int small)
{ {
unsigned int pipe = urb->pipe; unsigned int pipe = urb->pipe;
if (!urb->dev || !urb->dev->bus) { if (!urb->dev || !urb->dev->bus) {
admhc_dbg("%s URB: no dev", str); admhc_dbg(ahcd, "%s URB: no dev", str);
return; return;
} }
@ -89,7 +89,7 @@ urb_print(struct admhcd *ahcd, struct urb *urb, char * str, int small)
if (urb->status != 0) if (urb->status != 0)
#endif #endif
admhc_dbg(ahcd, "URB-%s %p dev=%d ep=%d%s-%s flags=%x len=%d/%d " admhc_dbg(ahcd, "URB-%s %p dev=%d ep=%d%s-%s flags=%x len=%d/%d "
"stat=%d", "stat=%d\n",
str, str,
urb, urb,
usb_pipedevice (pipe), usb_pipedevice (pipe),
@ -112,14 +112,14 @@ urb_print(struct admhcd *ahcd, struct urb *urb, char * str, int small)
printk ("\n"); printk ("\n");
} }
if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) { if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) {
printk(KERN_DEBUG __FILE__ ": data(%d/%d):", admhc_dbg(ahcd, "data(%d/%d):",
urb->actual_length, urb->actual_length,
urb->transfer_buffer_length); urb->transfer_buffer_length);
len = usb_pipeout(pipe)? len = usb_pipeout(pipe)?
urb->transfer_buffer_length: urb->actual_length; urb->transfer_buffer_length: urb->actual_length;
for (i = 0; i < 16 && i < len; i++) for (i = 0; i < 16 && i < len; i++)
printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]); printk(" %02x", ((__u8 *)urb->transfer_buffer)[i]);
admhc_dbg("%s stat:%d\n", i < len? "...": "", urb->status); printk("%s stat:%d\n", i < len? "...": "", urb->status);
} }
} }
#endif /* ADMHC_VERBOSE_DEBUG */ #endif /* ADMHC_VERBOSE_DEBUG */
@ -363,7 +363,8 @@ admhc_dump_ed(const struct admhcd *ahcd, const char *label,
#else /* ifdef DEBUG */ #else /* ifdef DEBUG */
static inline void urb_print(struct urb * urb, char * str, int small) {} static inline void urb_print(struct admhcd *ahcd, struct urb * urb, char * str,
int small) {}
static inline void admhc_dump_ed(const struct admhcd *ahcd, const char *label, static inline void admhc_dump_ed(const struct admhcd *ahcd, const char *label,
const struct ed *ed, int verbose) {} const struct ed *ed, int verbose) {}
static inline void admhc_dump_td(const struct admhcd *ahcd, const char *label, static inline void admhc_dump_td(const struct admhcd *ahcd, const char *label,

View file

@ -45,7 +45,7 @@
#include "../core/hcd.h" #include "../core/hcd.h"
#include "../core/hub.h" #include "../core/hub.h"
#define DRIVER_VERSION "v0.10" #define DRIVER_VERSION "v0.10.1"
#define DRIVER_AUTHOR "Gabor Juhos <juhosg at openwrt.org>" #define DRIVER_AUTHOR "Gabor Juhos <juhosg at openwrt.org>"
#define DRIVER_DESC "ADMtek USB 1.1 Host Controller Driver" #define DRIVER_DESC "ADMtek USB 1.1 Host Controller Driver"
@ -228,11 +228,12 @@ static int admhc_urb_dequeue(struct usb_hcd *hcd, struct urb *urb)
struct admhcd *ahcd = hcd_to_admhcd(hcd); struct admhcd *ahcd = hcd_to_admhcd(hcd);
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&ahcd->lock, flags);
#ifdef ADMHC_VERBOSE_DEBUG #ifdef ADMHC_VERBOSE_DEBUG
urb_print(ahcd, urb, "DEQUEUE", 1); urb_print(ahcd, urb, "DEQUEUE", 1);
#endif #endif
spin_lock_irqsave(&ahcd->lock, flags);
if (HC_IS_RUNNING(hcd->state)) { if (HC_IS_RUNNING(hcd->state)) {
struct urb_priv *urb_priv; struct urb_priv *urb_priv;

View file

@ -38,7 +38,7 @@ __acquires(ahcd->lock)
&& urb->status == 0) { && urb->status == 0) {
urb->status = -EREMOTEIO; urb->status = -EREMOTEIO;
#ifdef ADMHC_VERBOSE_DEBUG #ifdef ADMHC_VERBOSE_DEBUG
urb_print(urb, "SHORT", usb_pipeout (urb->pipe)); urb_print(ahcd, urb, "SHORT", usb_pipeout(urb->pipe));
#endif #endif
} }
spin_unlock(&urb->lock); spin_unlock(&urb->lock);
@ -53,7 +53,7 @@ __acquires(ahcd->lock)
} }
#ifdef ADMHC_VERBOSE_DEBUG #ifdef ADMHC_VERBOSE_DEBUG
urb_print(urb, "RET", usb_pipeout (urb->pipe)); urb_print(ahcd, urb, "RET", usb_pipeout (urb->pipe));
#endif #endif
/* urb->complete() can reenter this HCD */ /* urb->complete() can reenter this HCD */
@ -112,7 +112,7 @@ static void periodic_link (struct admhcd *ahcd, struct ed *ed)
unsigned i; unsigned i;
admhc_vdbg (ahcd, "link %sed %p branch %d [%dus.], interval %d\n", admhc_vdbg (ahcd, "link %sed %p branch %d [%dus.], interval %d\n",
(ed->hwINFO & cpu_to_hc32 (ahcd, ED_ISO)) ? "iso " : "", (ed->hwINFO & cpu_to_hc32(ahcd, ED_ISO)) ? "iso " : "",
ed, ed->branch, ed->load, ed->interval); ed, ed->branch, ed->load, ed->interval);
for (i = ed->branch; i < NUM_INTS; i += ed->interval) { for (i = ed->branch; i < NUM_INTS; i += ed->interval) {
@ -202,7 +202,7 @@ static void periodic_unlink (struct admhcd *ahcd, struct ed *ed)
admhcd_to_hcd(ahcd)->self.bandwidth_allocated -= ed->load / ed->interval; admhcd_to_hcd(ahcd)->self.bandwidth_allocated -= ed->load / ed->interval;
admhc_vdbg (ahcd, "unlink %sed %p branch %d [%dus.], interval %d\n", admhc_vdbg (ahcd, "unlink %sed %p branch %d [%dus.], interval %d\n",
(ed->hwINFO & cpu_to_hc32 (ahcd, ED_ISO)) ? "iso " : "", (ed->hwINFO & cpu_to_hc32(ahcd, ED_ISO)) ? "iso " : "",
ed, ed->branch, ed->load, ed->interval); ed, ed->branch, ed->load, ed->interval);
} }
#endif #endif
@ -333,7 +333,7 @@ static struct ed *ed_get(struct admhcd *ahcd, struct usb_host_endpoint *ep,
*/ */
static void start_ed_unlink(struct admhcd *ahcd, struct ed *ed) static void start_ed_unlink(struct admhcd *ahcd, struct ed *ed)
{ {
ed->hwINFO |= cpu_to_hc32 (ahcd, ED_DEQUEUE); ed->hwINFO |= cpu_to_hc32(ahcd, ED_DEQUEUE);
ed_deschedule(ahcd, ed); ed_deschedule(ahcd, ed);
/* add this ED into the remove list */ /* add this ED into the remove list */
@ -432,9 +432,7 @@ static void td_submit_urb(struct admhcd *ahcd, struct urb *urb)
int cnt = 0; int cnt = 0;
u32 info = 0; u32 info = 0;
int is_out = usb_pipeout(urb->pipe); int is_out = usb_pipeout(urb->pipe);
int periodic = 0;
u32 toggle = 0; u32 toggle = 0;
struct td *td;
/* OHCI handles the bulk/interrupt data toggles itself. We just /* OHCI handles the bulk/interrupt data toggles itself. We just
* use the device toggle bits for resetting, and rely on the fact * use the device toggle bits for resetting, and rely on the fact
@ -644,15 +642,15 @@ ed_halted(struct admhcd *ahcd, struct td *td, int cc, struct td *rev)
struct urb *urb = td->urb; struct urb *urb = td->urb;
struct ed *ed = td->ed; struct ed *ed = td->ed;
struct list_head *tmp = td->td_list.next; struct list_head *tmp = td->td_list.next;
__hc32 toggle = ed->hwHeadP & cpu_to_hc32 (ahcd, ED_C); __hc32 toggle = ed->hwHeadP & cpu_to_hc32(ahcd, ED_C);
admhc_dump_ed(ahcd, "ed halted", td->ed, 1); admhc_dump_ed(ahcd, "ed halted", td->ed, 1);
/* clear ed halt; this is the td that caused it, but keep it inactive /* clear ed halt; this is the td that caused it, but keep it inactive
* until its urb->complete() has a chance to clean up. * until its urb->complete() has a chance to clean up.
*/ */
ed->hwINFO |= cpu_to_hc32 (ahcd, ED_SKIP); ed->hwINFO |= cpu_to_hc32(ahcd, ED_SKIP);
wmb(); wmb();
ed->hwHeadP &= ~cpu_to_hc32 (ahcd, ED_H); ed->hwHeadP &= ~cpu_to_hc32(ahcd, ED_H);
/* put any later tds from this urb onto the donelist, after 'td', /* put any later tds from this urb onto the donelist, after 'td',
* order won't matter here: no errors, and nothing was transferred. * order won't matter here: no errors, and nothing was transferred.
@ -677,9 +675,9 @@ ed_halted(struct admhcd *ahcd, struct td *td, int cc, struct td *rev)
*/ */
info = next->hwINFO; info = next->hwINFO;
#if 0 /* FIXME */ #if 0 /* FIXME */
info |= cpu_to_hc32 (ahcd, TD_DONE); info |= cpu_to_hc32(ahcd, TD_DONE);
#endif #endif
info &= ~cpu_to_hc32 (ahcd, TD_CC); info &= ~cpu_to_hc32(ahcd, TD_CC);
next->hwINFO = info; next->hwINFO = info;
next->next_dl_td = rev; next->next_dl_td = rev;
@ -738,7 +736,7 @@ skip_ed:
continue; continue;
} }
if (!list_empty (&ed->td_list)) { if (!list_empty(&ed->td_list)) {
struct td *td; struct td *td;
u32 head; u32 head;
@ -772,7 +770,7 @@ skip_ed:
rescan_this: rescan_this:
completed = 0; completed = 0;
prev = &ed->hwHeadP; prev = &ed->hwHeadP;
list_for_each_safe (entry, tmp, &ed->td_list) { list_for_each_safe(entry, tmp, &ed->td_list) {
struct td *td; struct td *td;
struct urb *urb; struct urb *urb;
struct urb_priv *urb_priv; struct urb_priv *urb_priv;
@ -795,7 +793,7 @@ rescan_this:
*prev = td->hwNextTD | savebits; *prev = td->hwNextTD | savebits;
/* HC may have partly processed this TD */ /* HC may have partly processed this TD */
urb_print(urb, "PARTIAL", 1); urb_print(ahcd, urb, "PARTIAL", 1);
td_done(ahcd, urb, td); td_done(ahcd, urb, td);
/* if URB is done, clean up */ /* if URB is done, clean up */
@ -804,7 +802,7 @@ rescan_this:
finish_urb(ahcd, urb); finish_urb(ahcd, urb);
} }
} }
if (completed && !list_empty (&ed->td_list)) if (completed && !list_empty(&ed->td_list))
goto rescan_this; goto rescan_this;
/* ED's now officially unlinked, hc doesn't see */ /* ED's now officially unlinked, hc doesn't see */
@ -812,10 +810,10 @@ rescan_this:
ed->hwHeadP &= ~cpu_to_hc32(ahcd, ED_H); ed->hwHeadP &= ~cpu_to_hc32(ahcd, ED_H);
ed->hwNextED = 0; ed->hwNextED = 0;
wmb (); wmb ();
ed->hwINFO &= ~cpu_to_hc32 (ahcd, ED_SKIP | ED_DEQUEUE); ed->hwINFO &= ~cpu_to_hc32(ahcd, ED_SKIP | ED_DEQUEUE);
/* but if there's work queued, reschedule */ /* but if there's work queued, reschedule */
if (!list_empty (&ed->td_list)) { if (!list_empty(&ed->td_list)) {
if (HC_IS_RUNNING(admhcd_to_hcd(ahcd)->state)) if (HC_IS_RUNNING(admhcd_to_hcd(ahcd)->state))
ed_schedule(ahcd, ed); ed_schedule(ahcd, ed);
} }
@ -838,9 +836,7 @@ rescan_this:
static void ed_unhalt(struct admhcd *ahcd, struct ed *ed, struct urb *urb) static void ed_unhalt(struct admhcd *ahcd, struct ed *ed, struct urb *urb)
{ {
struct list_head *entry,*tmp; struct list_head *entry,*tmp;
struct urb_priv *urb_priv = urb->hcpriv; __hc32 toggle = ed->hwHeadP & cpu_to_hc32(ahcd, ED_C);
__hc32 toggle = ed->hwHeadP & cpu_to_hc32 (ahcd, ED_C);
#ifdef ADMHC_VERBOSE_DEBUG #ifdef ADMHC_VERBOSE_DEBUG
admhc_dump_ed(ahcd, "UNHALT", ed, 0); admhc_dump_ed(ahcd, "UNHALT", ed, 0);
@ -848,9 +844,9 @@ static void ed_unhalt(struct admhcd *ahcd, struct ed *ed, struct urb *urb)
/* clear ed halt; this is the td that caused it, but keep it inactive /* clear ed halt; this is the td that caused it, but keep it inactive
* until its urb->complete() has a chance to clean up. * until its urb->complete() has a chance to clean up.
*/ */
ed->hwINFO |= cpu_to_hc32 (ahcd, ED_SKIP); ed->hwINFO |= cpu_to_hc32(ahcd, ED_SKIP);
wmb(); wmb();
ed->hwHeadP &= ~cpu_to_hc32 (ahcd, ED_H); ed->hwHeadP &= ~cpu_to_hc32(ahcd, ED_H);
list_for_each_safe(entry, tmp, &ed->td_list) { list_for_each_safe(entry, tmp, &ed->td_list) {
struct td *td = list_entry(entry, struct td, td_list); struct td *td = list_entry(entry, struct td, td_list);
@ -913,13 +909,13 @@ static void ed_update(struct admhcd *ahcd, struct ed *ed)
start_ed_unlink(ahcd, ed); start_ed_unlink(ahcd, ed);
/* ... reenabling halted EDs only after fault cleanup */ /* ... reenabling halted EDs only after fault cleanup */
} else if ((ed->hwINFO & cpu_to_hc32 (ahcd, } else if ((ed->hwINFO & cpu_to_hc32(ahcd,
ED_SKIP | ED_DEQUEUE)) ED_SKIP | ED_DEQUEUE))
== cpu_to_hc32 (ahcd, ED_SKIP)) { == cpu_to_hc32(ahcd, ED_SKIP)) {
td = list_entry(ed->td_list.next, struct td, td_list); td = list_entry(ed->td_list.next, struct td, td_list);
#if 0 #if 0
if (!(td->hwINFO & cpu_to_hc32 (ahcd, TD_DONE))) { if (!(td->hwINFO & cpu_to_hc32(ahcd, TD_DONE))) {
ed->hwINFO &= ~cpu_to_hc32 (ahcd, ED_SKIP); ed->hwINFO &= ~cpu_to_hc32(ahcd, ED_SKIP);
/* ... hc may need waking-up */ /* ... hc may need waking-up */
switch (ed->type) { switch (ed->type) {
case PIPE_CONTROL: case PIPE_CONTROL: