diff options
| author | Ming Lei <tom.leiming@gmail.com> | 2010-09-20 03:32:06 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-09-24 14:05:01 -0400 |
| commit | 66af83ddf7b5a4ea94e79cbeadaa0aeed4def5f7 (patch) | |
| tree | 06cc6046c4db50bc9dd1b165e9c02095bc12d57f | |
| parent | bb27bc2c1133372b54d00f3077ea4acbbf459045 (diff) | |
usb: musb: gadget: fix dma length in txstate
DMA length should not go beyond the availabe space
of request buffer, so fix it.
Also set max_len of cppi dma channel as max size of
int type, so make musb dma handling happier.
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Cc: Anand Gadiyar <gadiyar@ti.com>
Cc: Mike Frysinger <vapier@gentoo.org>
Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/usb/musb/cppi_dma.c | 1 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget.c | 18 |
2 files changed, 10 insertions, 9 deletions
diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index 59dc3d351b60..5ab5bb89bae3 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c | |||
| @@ -322,6 +322,7 @@ cppi_channel_allocate(struct dma_controller *c, | |||
| 322 | index, transmit ? 'T' : 'R', cppi_ch); | 322 | index, transmit ? 'T' : 'R', cppi_ch); |
| 323 | cppi_ch->hw_ep = ep; | 323 | cppi_ch->hw_ep = ep; |
| 324 | cppi_ch->channel.status = MUSB_DMA_STATUS_FREE; | 324 | cppi_ch->channel.status = MUSB_DMA_STATUS_FREE; |
| 325 | cppi_ch->channel.max_len = 0x7fffffff; | ||
| 325 | 326 | ||
| 326 | DBG(4, "Allocate CPPI%d %cX\n", index, transmit ? 'T' : 'R'); | 327 | DBG(4, "Allocate CPPI%d %cX\n", index, transmit ? 'T' : 'R'); |
| 327 | return &cppi_ch->channel; | 328 | return &cppi_ch->channel; |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index fa826f9e262b..cacae96468b9 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
| @@ -300,6 +300,11 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 300 | #ifndef CONFIG_MUSB_PIO_ONLY | 300 | #ifndef CONFIG_MUSB_PIO_ONLY |
| 301 | if (is_dma_capable() && musb_ep->dma) { | 301 | if (is_dma_capable() && musb_ep->dma) { |
| 302 | struct dma_controller *c = musb->dma_controller; | 302 | struct dma_controller *c = musb->dma_controller; |
| 303 | size_t request_size; | ||
| 304 | |||
| 305 | /* setup DMA, then program endpoint CSR */ | ||
| 306 | request_size = min_t(size_t, request->length - request->actual, | ||
| 307 | musb_ep->dma->max_len); | ||
| 303 | 308 | ||
| 304 | use_dma = (request->dma != DMA_ADDR_INVALID); | 309 | use_dma = (request->dma != DMA_ADDR_INVALID); |
| 305 | 310 | ||
| @@ -307,11 +312,6 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 307 | 312 | ||
| 308 | #ifdef CONFIG_USB_INVENTRA_DMA | 313 | #ifdef CONFIG_USB_INVENTRA_DMA |
| 309 | { | 314 | { |
| 310 | size_t request_size; | ||
| 311 | |||
| 312 | /* setup DMA, then program endpoint CSR */ | ||
| 313 | request_size = min_t(size_t, request->length, | ||
| 314 | musb_ep->dma->max_len); | ||
| 315 | if (request_size < musb_ep->packet_sz) | 315 | if (request_size < musb_ep->packet_sz) |
| 316 | musb_ep->dma->desired_mode = 0; | 316 | musb_ep->dma->desired_mode = 0; |
| 317 | else | 317 | else |
| @@ -373,8 +373,8 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 373 | use_dma = use_dma && c->channel_program( | 373 | use_dma = use_dma && c->channel_program( |
| 374 | musb_ep->dma, musb_ep->packet_sz, | 374 | musb_ep->dma, musb_ep->packet_sz, |
| 375 | 0, | 375 | 0, |
| 376 | request->dma, | 376 | request->dma + request->actual, |
| 377 | request->length); | 377 | request_size); |
| 378 | if (!use_dma) { | 378 | if (!use_dma) { |
| 379 | c->channel_release(musb_ep->dma); | 379 | c->channel_release(musb_ep->dma); |
| 380 | musb_ep->dma = NULL; | 380 | musb_ep->dma = NULL; |
| @@ -386,8 +386,8 @@ static void txstate(struct musb *musb, struct musb_request *req) | |||
| 386 | use_dma = use_dma && c->channel_program( | 386 | use_dma = use_dma && c->channel_program( |
| 387 | musb_ep->dma, musb_ep->packet_sz, | 387 | musb_ep->dma, musb_ep->packet_sz, |
| 388 | request->zero, | 388 | request->zero, |
| 389 | request->dma, | 389 | request->dma + request->actual, |
| 390 | request->length); | 390 | request_size); |
| 391 | #endif | 391 | #endif |
| 392 | } | 392 | } |
| 393 | #endif | 393 | #endif |
