diff options
Diffstat (limited to 'drivers/usb/gadget/goku_udc.c')
-rw-r--r-- | drivers/usb/gadget/goku_udc.c | 84 |
1 files changed, 17 insertions, 67 deletions
diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c index ae931af05cef..d6c5f1150ae7 100644 --- a/drivers/usb/gadget/goku_udc.c +++ b/drivers/usb/gadget/goku_udc.c | |||
@@ -20,7 +20,6 @@ | |||
20 | * - DMA works with ep1 (OUT transfers) and ep2 (IN transfers). | 20 | * - DMA works with ep1 (OUT transfers) and ep2 (IN transfers). |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #undef DEBUG | ||
24 | // #define VERBOSE /* extra debug messages (success too) */ | 23 | // #define VERBOSE /* extra debug messages (success too) */ |
25 | // #define USB_TRACE /* packet-level success messages */ | 24 | // #define USB_TRACE /* packet-level success messages */ |
26 | 25 | ||
@@ -296,51 +295,6 @@ goku_free_request(struct usb_ep *_ep, struct usb_request *_req) | |||
296 | 295 | ||
297 | /*-------------------------------------------------------------------------*/ | 296 | /*-------------------------------------------------------------------------*/ |
298 | 297 | ||
299 | /* allocating buffers this way eliminates dma mapping overhead, which | ||
300 | * on some platforms will mean eliminating a per-io buffer copy. with | ||
301 | * some kinds of system caches, further tweaks may still be needed. | ||
302 | */ | ||
303 | static void * | ||
304 | goku_alloc_buffer(struct usb_ep *_ep, unsigned bytes, | ||
305 | dma_addr_t *dma, gfp_t gfp_flags) | ||
306 | { | ||
307 | void *retval; | ||
308 | struct goku_ep *ep; | ||
309 | |||
310 | ep = container_of(_ep, struct goku_ep, ep); | ||
311 | if (!_ep) | ||
312 | return NULL; | ||
313 | *dma = DMA_ADDR_INVALID; | ||
314 | |||
315 | if (ep->dma) { | ||
316 | /* the main problem with this call is that it wastes memory | ||
317 | * on typical 1/N page allocations: it allocates 1-N pages. | ||
318 | */ | ||
319 | #warning Using dma_alloc_coherent even with buffers smaller than a page. | ||
320 | retval = dma_alloc_coherent(&ep->dev->pdev->dev, | ||
321 | bytes, dma, gfp_flags); | ||
322 | } else | ||
323 | retval = kmalloc(bytes, gfp_flags); | ||
324 | return retval; | ||
325 | } | ||
326 | |||
327 | static void | ||
328 | goku_free_buffer(struct usb_ep *_ep, void *buf, dma_addr_t dma, unsigned bytes) | ||
329 | { | ||
330 | /* free memory into the right allocator */ | ||
331 | if (dma != DMA_ADDR_INVALID) { | ||
332 | struct goku_ep *ep; | ||
333 | |||
334 | ep = container_of(_ep, struct goku_ep, ep); | ||
335 | if (!_ep) | ||
336 | return; | ||
337 | dma_free_coherent(&ep->dev->pdev->dev, bytes, buf, dma); | ||
338 | } else | ||
339 | kfree (buf); | ||
340 | } | ||
341 | |||
342 | /*-------------------------------------------------------------------------*/ | ||
343 | |||
344 | static void | 298 | static void |
345 | done(struct goku_ep *ep, struct goku_request *req, int status) | 299 | done(struct goku_ep *ep, struct goku_request *req, int status) |
346 | { | 300 | { |
@@ -485,7 +439,7 @@ top: | |||
485 | /* use ep1/ep2 double-buffering for OUT */ | 439 | /* use ep1/ep2 double-buffering for OUT */ |
486 | if (!(size & PACKET_ACTIVE)) | 440 | if (!(size & PACKET_ACTIVE)) |
487 | size = readl(®s->EPxSizeLB[ep->num]); | 441 | size = readl(®s->EPxSizeLB[ep->num]); |
488 | if (!(size & PACKET_ACTIVE)) // "can't happen" | 442 | if (!(size & PACKET_ACTIVE)) /* "can't happen" */ |
489 | break; | 443 | break; |
490 | size &= DATASIZE; /* EPxSizeH == 0 */ | 444 | size &= DATASIZE; /* EPxSizeH == 0 */ |
491 | 445 | ||
@@ -1026,9 +980,6 @@ static struct usb_ep_ops goku_ep_ops = { | |||
1026 | .alloc_request = goku_alloc_request, | 980 | .alloc_request = goku_alloc_request, |
1027 | .free_request = goku_free_request, | 981 | .free_request = goku_free_request, |
1028 | 982 | ||
1029 | .alloc_buffer = goku_alloc_buffer, | ||
1030 | .free_buffer = goku_free_buffer, | ||
1031 | |||
1032 | .queue = goku_queue, | 983 | .queue = goku_queue, |
1033 | .dequeue = goku_dequeue, | 984 | .dequeue = goku_dequeue, |
1034 | 985 | ||
@@ -1140,17 +1091,17 @@ udc_proc_read(char *buffer, char **start, off_t off, int count, | |||
1140 | is_usb_connected | 1091 | is_usb_connected |
1141 | ? ((tmp & PW_PULLUP) ? "full speed" : "powered") | 1092 | ? ((tmp & PW_PULLUP) ? "full speed" : "powered") |
1142 | : "disconnected", | 1093 | : "disconnected", |
1143 | ({char *tmp; | 1094 | ({char *state; |
1144 | switch(dev->ep0state){ | 1095 | switch(dev->ep0state){ |
1145 | case EP0_DISCONNECT: tmp = "ep0_disconnect"; break; | 1096 | case EP0_DISCONNECT: state = "ep0_disconnect"; break; |
1146 | case EP0_IDLE: tmp = "ep0_idle"; break; | 1097 | case EP0_IDLE: state = "ep0_idle"; break; |
1147 | case EP0_IN: tmp = "ep0_in"; break; | 1098 | case EP0_IN: state = "ep0_in"; break; |
1148 | case EP0_OUT: tmp = "ep0_out"; break; | 1099 | case EP0_OUT: state = "ep0_out"; break; |
1149 | case EP0_STATUS: tmp = "ep0_status"; break; | 1100 | case EP0_STATUS: state = "ep0_status"; break; |
1150 | case EP0_STALL: tmp = "ep0_stall"; break; | 1101 | case EP0_STALL: state = "ep0_stall"; break; |
1151 | case EP0_SUSPEND: tmp = "ep0_suspend"; break; | 1102 | case EP0_SUSPEND: state = "ep0_suspend"; break; |
1152 | default: tmp = "ep0_?"; break; | 1103 | default: state = "ep0_?"; break; |
1153 | } tmp; }) | 1104 | } state; }) |
1154 | ); | 1105 | ); |
1155 | size -= t; | 1106 | size -= t; |
1156 | next += t; | 1107 | next += t; |
@@ -1195,7 +1146,6 @@ udc_proc_read(char *buffer, char **start, off_t off, int count, | |||
1195 | for (i = 0; i < 4; i++) { | 1146 | for (i = 0; i < 4; i++) { |
1196 | struct goku_ep *ep = &dev->ep [i]; | 1147 | struct goku_ep *ep = &dev->ep [i]; |
1197 | struct goku_request *req; | 1148 | struct goku_request *req; |
1198 | int t; | ||
1199 | 1149 | ||
1200 | if (i && !ep->desc) | 1150 | if (i && !ep->desc) |
1201 | continue; | 1151 | continue; |
@@ -1283,7 +1233,7 @@ done: | |||
1283 | static void udc_reinit (struct goku_udc *dev) | 1233 | static void udc_reinit (struct goku_udc *dev) |
1284 | { | 1234 | { |
1285 | static char *names [] = { "ep0", "ep1-bulk", "ep2-bulk", "ep3-bulk" }; | 1235 | static char *names [] = { "ep0", "ep1-bulk", "ep2-bulk", "ep3-bulk" }; |
1286 | 1236 | ||
1287 | unsigned i; | 1237 | unsigned i; |
1288 | 1238 | ||
1289 | INIT_LIST_HEAD (&dev->gadget.ep_list); | 1239 | INIT_LIST_HEAD (&dev->gadget.ep_list); |
@@ -1896,9 +1846,9 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1896 | 1846 | ||
1897 | /* done */ | 1847 | /* done */ |
1898 | the_controller = dev; | 1848 | the_controller = dev; |
1899 | device_register(&dev->gadget.dev); | 1849 | retval = device_register(&dev->gadget.dev); |
1900 | 1850 | if (retval == 0) | |
1901 | return 0; | 1851 | return 0; |
1902 | 1852 | ||
1903 | done: | 1853 | done: |
1904 | if (dev) | 1854 | if (dev) |
@@ -1910,8 +1860,8 @@ done: | |||
1910 | /*-------------------------------------------------------------------------*/ | 1860 | /*-------------------------------------------------------------------------*/ |
1911 | 1861 | ||
1912 | static struct pci_device_id pci_ids [] = { { | 1862 | static struct pci_device_id pci_ids [] = { { |
1913 | .class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), | 1863 | .class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), |
1914 | .class_mask = ~0, | 1864 | .class_mask = ~0, |
1915 | .vendor = 0x102f, /* Toshiba */ | 1865 | .vendor = 0x102f, /* Toshiba */ |
1916 | .device = 0x0107, /* this UDC */ | 1866 | .device = 0x0107, /* this UDC */ |
1917 | .subvendor = PCI_ANY_ID, | 1867 | .subvendor = PCI_ANY_ID, |