Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-greg' of git://gitorious.org/usb/usb into work

+95 -38
+2
drivers/usb/core/hcd.c
··· 1330 1330 */ 1331 1331 1332 1332 if (usb_endpoint_xfer_control(&urb->ep->desc)) { 1333 + if (hcd->self.uses_pio_for_control) 1334 + return ret; 1333 1335 if (hcd->self.uses_dma) { 1334 1336 urb->setup_dma = dma_map_single( 1335 1337 hcd->self.controller,
+3
drivers/usb/musb/musb_core.c
··· 2116 2116 * Otherwise, wait till the gadget driver hooks up. 2117 2117 */ 2118 2118 if (!is_otg_enabled(musb) && is_host_enabled(musb)) { 2119 + struct usb_hcd *hcd = musb_to_hcd(musb); 2120 + 2119 2121 MUSB_HST_MODE(musb); 2120 2122 musb->xceiv->default_a = 1; 2121 2123 musb->xceiv->state = OTG_STATE_A_IDLE; 2122 2124 2123 2125 status = usb_add_hcd(musb_to_hcd(musb), -1, 0); 2124 2126 2127 + hcd->self.uses_pio_for_control = 1; 2125 2128 DBG(1, "%s mode, status %d, devctl %02x %c\n", 2126 2129 "HOST", status, 2127 2130 musb_readb(musb->mregs, MUSB_DEVCTL),
+86 -38
drivers/usb/musb/musb_gadget.c
··· 92 92 93 93 /* ----------------------------------------------------------------------- */ 94 94 95 + /* Maps the buffer to dma */ 96 + 97 + static inline void map_dma_buffer(struct musb_request *request, 98 + struct musb *musb) 99 + { 100 + if (request->request.dma == DMA_ADDR_INVALID) { 101 + request->request.dma = dma_map_single( 102 + musb->controller, 103 + request->request.buf, 104 + request->request.length, 105 + request->tx 106 + ? DMA_TO_DEVICE 107 + : DMA_FROM_DEVICE); 108 + request->mapped = 1; 109 + } else { 110 + dma_sync_single_for_device(musb->controller, 111 + request->request.dma, 112 + request->request.length, 113 + request->tx 114 + ? DMA_TO_DEVICE 115 + : DMA_FROM_DEVICE); 116 + request->mapped = 0; 117 + } 118 + } 119 + 120 + /* Unmap the buffer from dma and maps it back to cpu */ 121 + static inline void unmap_dma_buffer(struct musb_request *request, 122 + struct musb *musb) 123 + { 124 + if (request->request.dma == DMA_ADDR_INVALID) { 125 + DBG(20, "not unmapping a never mapped buffer\n"); 126 + return; 127 + } 128 + if (request->mapped) { 129 + dma_unmap_single(musb->controller, 130 + request->request.dma, 131 + request->request.length, 132 + request->tx 133 + ? DMA_TO_DEVICE 134 + : DMA_FROM_DEVICE); 135 + request->request.dma = DMA_ADDR_INVALID; 136 + request->mapped = 0; 137 + } else { 138 + dma_sync_single_for_cpu(musb->controller, 139 + request->request.dma, 140 + request->request.length, 141 + request->tx 142 + ? DMA_TO_DEVICE 143 + : DMA_FROM_DEVICE); 144 + 145 + } 146 + } 147 + 95 148 /* 96 149 * Immediately complete a request. 97 150 * ··· 172 119 173 120 ep->busy = 1; 174 121 spin_unlock(&musb->lock); 175 - if (is_dma_capable()) { 176 - if (req->mapped) { 177 - dma_unmap_single(musb->controller, 178 - req->request.dma, 179 - req->request.length, 180 - req->tx 181 - ? DMA_TO_DEVICE 182 - : DMA_FROM_DEVICE); 183 - req->request.dma = DMA_ADDR_INVALID; 184 - req->mapped = 0; 185 - } else if (req->request.dma != DMA_ADDR_INVALID) 186 - dma_sync_single_for_cpu(musb->controller, 187 - req->request.dma, 188 - req->request.length, 189 - req->tx 190 - ? DMA_TO_DEVICE 191 - : DMA_FROM_DEVICE); 192 - } 122 + if (is_dma_capable() && ep->dma) 123 + unmap_dma_buffer(req, musb); 193 124 if (request->status == 0) 194 125 DBG(5, "%s done request %p, %d/%d\n", 195 126 ep->end_point.name, request, ··· 432 395 #endif 433 396 434 397 if (!use_dma) { 398 + /* 399 + * Unmap the dma buffer back to cpu if dma channel 400 + * programming fails 401 + */ 402 + if (is_dma_capable() && musb_ep->dma) 403 + unmap_dma_buffer(req, musb); 404 + 435 405 musb_write_fifo(musb_ep->hw_ep, fifo_count, 436 406 (u8 *) (request->buf + request->actual)); 437 407 request->actual += fifo_count; ··· 757 713 return; 758 714 } 759 715 #endif 716 + /* 717 + * Unmap the dma buffer back to cpu if dma channel 718 + * programming fails. This buffer is mapped if the 719 + * channel allocation is successful 720 + */ 721 + if (is_dma_capable() && musb_ep->dma) { 722 + unmap_dma_buffer(req, musb); 723 + 724 + /* 725 + * Clear DMAENAB and AUTOCLEAR for the 726 + * PIO mode transfer 727 + */ 728 + csr &= ~(MUSB_RXCSR_DMAENAB | MUSB_RXCSR_AUTOCLEAR); 729 + musb_writew(epio, MUSB_RXCSR, csr); 730 + } 760 731 761 732 musb_read_fifo(musb_ep->hw_ep, fifo_count, (u8 *) 762 733 (request->buf + request->actual)); ··· 896 837 if (!request) 897 838 return; 898 839 } 840 + #if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_TUSB_OMAP_DMA) 899 841 exit: 842 + #endif 900 843 /* Analyze request */ 901 844 rxstate(musb, to_musb_request(request)); 902 845 } ··· 1211 1150 request->epnum = musb_ep->current_epnum; 1212 1151 request->tx = musb_ep->is_in; 1213 1152 1214 - if (is_dma_capable() && musb_ep->dma) { 1215 - if (request->request.dma == DMA_ADDR_INVALID) { 1216 - request->request.dma = dma_map_single( 1217 - musb->controller, 1218 - request->request.buf, 1219 - request->request.length, 1220 - request->tx 1221 - ? DMA_TO_DEVICE 1222 - : DMA_FROM_DEVICE); 1223 - request->mapped = 1; 1224 - } else { 1225 - dma_sync_single_for_device(musb->controller, 1226 - request->request.dma, 1227 - request->request.length, 1228 - request->tx 1229 - ? DMA_TO_DEVICE 1230 - : DMA_FROM_DEVICE); 1231 - request->mapped = 0; 1232 - } 1233 - } else 1153 + if (is_dma_capable() && musb_ep->dma) 1154 + map_dma_buffer(request, musb); 1155 + else 1234 1156 request->mapped = 0; 1235 1157 1236 1158 spin_lock_irqsave(&musb->lock, lockflags); ··· 1833 1789 spin_unlock_irqrestore(&musb->lock, flags); 1834 1790 1835 1791 if (is_otg_enabled(musb)) { 1792 + struct usb_hcd *hcd = musb_to_hcd(musb); 1793 + 1836 1794 DBG(3, "OTG startup...\n"); 1837 1795 1838 1796 /* REVISIT: funcall to other code, which also ··· 1849 1803 musb->gadget_driver = NULL; 1850 1804 musb->g.dev.driver = NULL; 1851 1805 spin_unlock_irqrestore(&musb->lock, flags); 1806 + } else { 1807 + hcd->self.uses_pio_for_control = 1; 1852 1808 } 1853 1809 } 1854 1810 }
+4
include/linux/usb.h
··· 313 313 int busnum; /* Bus number (in order of reg) */ 314 314 const char *bus_name; /* stable id (PCI slot_name etc) */ 315 315 u8 uses_dma; /* Does the host controller use DMA? */ 316 + u8 uses_pio_for_control; /* 317 + * Does the host controller use PIO 318 + * for control transfers? 319 + */ 316 320 u8 otg_port; /* 0, or number of OTG/HNP port */ 317 321 unsigned is_b_host:1; /* true during some HNP roleswitches */ 318 322 unsigned b_hnp_enable:1; /* OTG: did A-Host enable HNP? */