mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-03 04:26:55 +00:00
USB driver fixes * fix allocation of the ED/TD descriptors * remove some unused fields from admhcd struct
SVN-Revision: 8391
This commit is contained in:
parent
8c9dcd936f
commit
92bfc02547
@ -90,6 +90,7 @@ MODULE_AUTHOR("Jeroen Vreeken (pe1rxq@amsat.org)");
|
|||||||
#define ADMHCD_REG_HOSTHEAD 0x80
|
#define ADMHCD_REG_HOSTHEAD 0x80
|
||||||
|
|
||||||
#define ADMHCD_NUMPORTS 2
|
#define ADMHCD_NUMPORTS 2
|
||||||
|
#define ADMHCD_DESC_ALIGN 16
|
||||||
|
|
||||||
struct admhcd_ed {
|
struct admhcd_ed {
|
||||||
/* Don't change first four, they used for DMA */
|
/* Don't change first four, they used for DMA */
|
||||||
@ -155,13 +156,12 @@ static int admhcd_td_err[16] = {
|
|||||||
#define ADMHCD_TD_ERRMASK 0x38000000
|
#define ADMHCD_TD_ERRMASK 0x38000000
|
||||||
#define ADMHCD_TD_ERRSHIFT 27
|
#define ADMHCD_TD_ERRSHIFT 27
|
||||||
|
|
||||||
#define TD(td) ((struct admhcd_td *)(((u32)(td)) & ~0xf))
|
#define TD(td) ((struct admhcd_td *)(((u32)(td)) & ~(ADMHCD_DESC_ALIGN-1)))
|
||||||
#define ED(ed) ((struct admhcd_ed *)(((u32)(ed)) & ~0xf))
|
#define ED(ed) ((struct admhcd_ed *)(((u32)(ed)) & ~(ADMHCD_DESC_ALIGN-1)))
|
||||||
|
|
||||||
struct admhcd {
|
struct admhcd {
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
|
|
||||||
void __iomem *data_reg;
|
|
||||||
/* Root hub registers */
|
/* Root hub registers */
|
||||||
u32 rhdesca;
|
u32 rhdesca;
|
||||||
u32 rhdescb;
|
u32 rhdescb;
|
||||||
@ -173,7 +173,6 @@ struct admhcd {
|
|||||||
u32 base;
|
u32 base;
|
||||||
u32 dma_en;
|
u32 dma_en;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct admhcd *hcd_to_admhcd(struct usb_hcd *hcd)
|
static inline struct admhcd *hcd_to_admhcd(struct usb_hcd *hcd)
|
||||||
@ -217,12 +216,12 @@ static struct admhcd_td *admhcd_td_alloc(struct admhcd_ed *ed, struct urb *urb)
|
|||||||
{
|
{
|
||||||
struct admhcd_td *tdn, *td;
|
struct admhcd_td *tdn, *td;
|
||||||
|
|
||||||
tdn = kzalloc(sizeof(*tdn), GFP_ATOMIC);
|
tdn = kzalloc(sizeof(*tdn)+ADMHCD_DESC_ALIGN, GFP_ATOMIC);
|
||||||
if (!tdn)
|
if (!tdn)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
tdn->real = tdn;
|
tdn->real = tdn;
|
||||||
tdn = (struct admhcd_td *)KSEG1ADDR(tdn);
|
tdn = TD(KSEG1ADDR(tdn));
|
||||||
if (ed->cur == NULL) {
|
if (ed->cur == NULL) {
|
||||||
ed->cur = tdn;
|
ed->cur = tdn;
|
||||||
ed->head = tdn;
|
ed->head = tdn;
|
||||||
@ -283,12 +282,12 @@ static struct admhcd_ed *admhcd_get_ed(struct admhcd *ahcd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
found = kzalloc(sizeof(*found), GFP_ATOMIC);
|
found = kzalloc(sizeof(*found)+ADMHCD_DESC_ALIGN, GFP_ATOMIC);
|
||||||
if (!found)
|
if (!found)
|
||||||
goto out;
|
goto out;
|
||||||
found->real = found;
|
found->real = found;
|
||||||
found->ep = ep;
|
found->ep = ep;
|
||||||
found = (struct admhcd_ed *)KSEG1ADDR(found);
|
found = ED(KSEG1ADDR(found));
|
||||||
found->control = usb_pipedevice(pipe) |
|
found->control = usb_pipedevice(pipe) |
|
||||||
(usb_pipeendpoint(pipe) << ADMHCD_ED_EPSHIFT) |
|
(usb_pipeendpoint(pipe) << ADMHCD_ED_EPSHIFT) |
|
||||||
(usb_pipeint(pipe) ? ADMHCD_ED_INT : 0) |
|
(usb_pipeint(pipe) ? ADMHCD_ED_INT : 0) |
|
||||||
@ -900,7 +899,6 @@ static int __init adm5120hcd_probe(struct platform_device *pdev)
|
|||||||
hcd->regs = data_reg;
|
hcd->regs = data_reg;
|
||||||
|
|
||||||
ahcd = hcd_to_admhcd(hcd);
|
ahcd = hcd_to_admhcd(hcd);
|
||||||
ahcd->data_reg = data_reg;
|
|
||||||
ahcd->base = (u32)data_reg;
|
ahcd->base = (u32)data_reg;
|
||||||
|
|
||||||
spin_lock_init(&ahcd->lock);
|
spin_lock_init(&ahcd->lock);
|
||||||
@ -921,7 +919,7 @@ out_dev:
|
|||||||
out_unmap:
|
out_unmap:
|
||||||
iounmap(data_reg);
|
iounmap(data_reg);
|
||||||
out_mem:
|
out_mem:
|
||||||
release_mem_region(pdev->resource[0].start, pdev->resource[0].end - pdev->resource[0].start +1);
|
release_mem_region(data->start, resource_len(data));
|
||||||
out:
|
out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user