usb: musb: set AUTOSET for full speed bulk DMA transfer in host mode
The "mult" factor is not updated properly for the can_bulk_split() case. The AUTOSET bit in the TXCSR is not being set if the "mult" factor is greater than 1 for the High Bandwidth ISO case. But the "mult" factor is also greater than 1 in case of Full speed bulk transfers with the packet splitting in TXMAXP register enabled with can_bulk_split(). Without the AUTOSET the DMA transfers will not progress in mode1 [ balbi@ti.com : fix braces placement ] Signed-off-by: supriya karanth <supriya.karanth@stericsson.com> Signed-off-by: Praveena NADAHALLY <praveen.nadahally@stericsson.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
bb3a2ef2eb
commit
f278628193
|
@ -634,7 +634,17 @@ static bool musb_tx_dma_program(struct dma_controller *dma,
|
||||||
mode = 1;
|
mode = 1;
|
||||||
csr |= MUSB_TXCSR_DMAMODE | MUSB_TXCSR_DMAENAB;
|
csr |= MUSB_TXCSR_DMAMODE | MUSB_TXCSR_DMAENAB;
|
||||||
/* autoset shouldn't be set in high bandwidth */
|
/* autoset shouldn't be set in high bandwidth */
|
||||||
if (qh->hb_mult == 1)
|
/*
|
||||||
|
* Enable Autoset according to table
|
||||||
|
* below
|
||||||
|
* bulk_split hb_mult Autoset_Enable
|
||||||
|
* 0 1 Yes(Normal)
|
||||||
|
* 0 >1 No(High BW ISO)
|
||||||
|
* 1 1 Yes(HS bulk)
|
||||||
|
* 1 >1 Yes(FS bulk)
|
||||||
|
*/
|
||||||
|
if (qh->hb_mult == 1 || (qh->hb_mult > 1 &&
|
||||||
|
can_bulk_split(hw_ep->musb, qh->type)))
|
||||||
csr |= MUSB_TXCSR_AUTOSET;
|
csr |= MUSB_TXCSR_AUTOSET;
|
||||||
} else {
|
} else {
|
||||||
mode = 0;
|
mode = 0;
|
||||||
|
@ -791,17 +801,19 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
|
||||||
/* protocol/endpoint/interval/NAKlimit */
|
/* protocol/endpoint/interval/NAKlimit */
|
||||||
if (epnum) {
|
if (epnum) {
|
||||||
musb_writeb(epio, MUSB_TXTYPE, qh->type_reg);
|
musb_writeb(epio, MUSB_TXTYPE, qh->type_reg);
|
||||||
if (musb->double_buffer_not_ok)
|
if (musb->double_buffer_not_ok) {
|
||||||
musb_writew(epio, MUSB_TXMAXP,
|
musb_writew(epio, MUSB_TXMAXP,
|
||||||
hw_ep->max_packet_sz_tx);
|
hw_ep->max_packet_sz_tx);
|
||||||
else if (can_bulk_split(musb, qh->type))
|
} else if (can_bulk_split(musb, qh->type)) {
|
||||||
|
qh->hb_mult = hw_ep->max_packet_sz_tx
|
||||||
|
/ packet_sz;
|
||||||
musb_writew(epio, MUSB_TXMAXP, packet_sz
|
musb_writew(epio, MUSB_TXMAXP, packet_sz
|
||||||
| ((hw_ep->max_packet_sz_tx /
|
| ((qh->hb_mult) - 1) << 11);
|
||||||
packet_sz) - 1) << 11);
|
} else {
|
||||||
else
|
|
||||||
musb_writew(epio, MUSB_TXMAXP,
|
musb_writew(epio, MUSB_TXMAXP,
|
||||||
qh->maxpacket |
|
qh->maxpacket |
|
||||||
((qh->hb_mult - 1) << 11));
|
((qh->hb_mult - 1) << 11));
|
||||||
|
}
|
||||||
musb_writeb(epio, MUSB_TXINTERVAL, qh->intv_reg);
|
musb_writeb(epio, MUSB_TXINTERVAL, qh->intv_reg);
|
||||||
} else {
|
} else {
|
||||||
musb_writeb(epio, MUSB_NAKLIMIT0, qh->intv_reg);
|
musb_writeb(epio, MUSB_NAKLIMIT0, qh->intv_reg);
|
||||||
|
|
Loading…
Reference in New Issue