Commit 86cdffc9 authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman

[PATCH] ohci-hcd, paranoia

In a test where some memory corruption happened, I noticed an
oops (null pointer exception in_irq) that's avoidable.  Here's
a patch that avoids it ... anyone seeing the err() is likely
to hang some process, but that's better than the alternative.
(Also inlines some used-once routines, saving a bit of space
to make up for the new diagnostic.)
parent c5375618
...@@ -48,10 +48,10 @@ dma_to_ed_td (struct hash_list_t * entry, dma_addr_t dma) ...@@ -48,10 +48,10 @@ dma_to_ed_td (struct hash_list_t * entry, dma_addr_t dma)
struct hash_t * scan = entry->head; struct hash_t * scan = entry->head;
while (scan && scan->dma != dma) while (scan && scan->dma != dma)
scan = scan->next; scan = scan->next;
return scan->virt; return scan ? scan->virt : 0;
} }
static struct td * static inline struct td *
dma_to_td (struct ohci_hcd *hc, dma_addr_t td_dma) dma_to_td (struct ohci_hcd *hc, dma_addr_t td_dma)
{ {
td_dma &= TD_MASK; td_dma &= TD_MASK;
...@@ -62,7 +62,7 @@ dma_to_td (struct ohci_hcd *hc, dma_addr_t td_dma) ...@@ -62,7 +62,7 @@ dma_to_td (struct ohci_hcd *hc, dma_addr_t td_dma)
// FIXME: when updating the hashtables this way, mem_flags is unusable... // FIXME: when updating the hashtables this way, mem_flags is unusable...
/* Add a hash entry for a TD/ED; return true on success */ /* Add a hash entry for a TD/ED; return true on success */
static int static inline int
hash_add_ed_td ( hash_add_ed_td (
struct hash_list_t *entry, struct hash_list_t *entry,
void *virt, void *virt,
...@@ -97,7 +97,7 @@ hash_add_td (struct ohci_hcd *hc, struct td *td, int mem_flags) ...@@ -97,7 +97,7 @@ hash_add_td (struct ohci_hcd *hc, struct td *td, int mem_flags)
} }
static void static inline void
hash_free_ed_td (struct hash_list_t *entry, void *virt) hash_free_ed_td (struct hash_list_t *entry, void *virt)
{ {
struct hash_t *scan, *prev; struct hash_t *scan, *prev;
......
...@@ -854,6 +854,11 @@ static struct td *dl_reverse_done_list (struct ohci_hcd *ohci) ...@@ -854,6 +854,11 @@ static struct td *dl_reverse_done_list (struct ohci_hcd *ohci)
int cc; int cc;
td = dma_to_td (ohci, td_dma); td = dma_to_td (ohci, td_dma);
if (!td) {
err ("%s bad entry %8x",
ohci->hcd.self.bus_name, td_dma);
break;
}
td->hwINFO |= cpu_to_le32 (TD_DONE); td->hwINFO |= cpu_to_le32 (TD_DONE);
cc = TD_CC_GET (le32_to_cpup (&td->hwINFO)); cc = TD_CC_GET (le32_to_cpup (&td->hwINFO));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment