diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-06-09 00:27:51 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-06-09 00:27:51 -0400 |
commit | 141dc40ee343ab532717b235dd645e2d25ae3092 (patch) | |
tree | 2289e5d1ec20df5e465b9b629e291877f4d70485 /drivers/usb/musb | |
parent | 1c83d94ff646001f9ee83f0330a3933b55660927 (diff) | |
parent | 317ddd256b9c24b0d78fa8018f80f1e495481a10 (diff) |
Merge 3.10-rc5 into usb-next
We need the changes in this branch.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/musb')
-rw-r--r-- | drivers/usb/musb/musb_host.c | 18 | ||||
-rw-r--r-- | drivers/usb/musb/musb_host.h | 1 |
2 files changed, 9 insertions, 10 deletions
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 85ed11e04f35..4211e5540945 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
@@ -1231,7 +1231,6 @@ void musb_host_tx(struct musb *musb, u8 epnum) | |||
1231 | void __iomem *mbase = musb->mregs; | 1231 | void __iomem *mbase = musb->mregs; |
1232 | struct dma_channel *dma; | 1232 | struct dma_channel *dma; |
1233 | bool transfer_pending = false; | 1233 | bool transfer_pending = false; |
1234 | static bool use_sg; | ||
1235 | 1234 | ||
1236 | musb_ep_select(mbase, epnum); | 1235 | musb_ep_select(mbase, epnum); |
1237 | tx_csr = musb_readw(epio, MUSB_TXCSR); | 1236 | tx_csr = musb_readw(epio, MUSB_TXCSR); |
@@ -1462,9 +1461,9 @@ done: | |||
1462 | * NULL. | 1461 | * NULL. |
1463 | */ | 1462 | */ |
1464 | if (!urb->transfer_buffer) | 1463 | if (!urb->transfer_buffer) |
1465 | use_sg = true; | 1464 | qh->use_sg = true; |
1466 | 1465 | ||
1467 | if (use_sg) { | 1466 | if (qh->use_sg) { |
1468 | /* sg_miter_start is already done in musb_ep_program */ | 1467 | /* sg_miter_start is already done in musb_ep_program */ |
1469 | if (!sg_miter_next(&qh->sg_miter)) { | 1468 | if (!sg_miter_next(&qh->sg_miter)) { |
1470 | dev_err(musb->controller, "error: sg list empty\n"); | 1469 | dev_err(musb->controller, "error: sg list empty\n"); |
@@ -1483,9 +1482,9 @@ done: | |||
1483 | 1482 | ||
1484 | qh->segsize = length; | 1483 | qh->segsize = length; |
1485 | 1484 | ||
1486 | if (use_sg) { | 1485 | if (qh->use_sg) { |
1487 | if (offset + length >= urb->transfer_buffer_length) | 1486 | if (offset + length >= urb->transfer_buffer_length) |
1488 | use_sg = false; | 1487 | qh->use_sg = false; |
1489 | } | 1488 | } |
1490 | 1489 | ||
1491 | musb_ep_select(mbase, epnum); | 1490 | musb_ep_select(mbase, epnum); |
@@ -1551,7 +1550,6 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1551 | bool done = false; | 1550 | bool done = false; |
1552 | u32 status; | 1551 | u32 status; |
1553 | struct dma_channel *dma; | 1552 | struct dma_channel *dma; |
1554 | static bool use_sg; | ||
1555 | unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG; | 1553 | unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG; |
1556 | 1554 | ||
1557 | musb_ep_select(mbase, epnum); | 1555 | musb_ep_select(mbase, epnum); |
@@ -1877,12 +1875,12 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
1877 | * NULL. | 1875 | * NULL. |
1878 | */ | 1876 | */ |
1879 | if (!urb->transfer_buffer) { | 1877 | if (!urb->transfer_buffer) { |
1880 | use_sg = true; | 1878 | qh->use_sg = true; |
1881 | sg_miter_start(&qh->sg_miter, urb->sg, 1, | 1879 | sg_miter_start(&qh->sg_miter, urb->sg, 1, |
1882 | sg_flags); | 1880 | sg_flags); |
1883 | } | 1881 | } |
1884 | 1882 | ||
1885 | if (use_sg) { | 1883 | if (qh->use_sg) { |
1886 | if (!sg_miter_next(&qh->sg_miter)) { | 1884 | if (!sg_miter_next(&qh->sg_miter)) { |
1887 | dev_err(musb->controller, "error: sg list empty\n"); | 1885 | dev_err(musb->controller, "error: sg list empty\n"); |
1888 | sg_miter_stop(&qh->sg_miter); | 1886 | sg_miter_stop(&qh->sg_miter); |
@@ -1912,8 +1910,8 @@ finish: | |||
1912 | urb->actual_length += xfer_len; | 1910 | urb->actual_length += xfer_len; |
1913 | qh->offset += xfer_len; | 1911 | qh->offset += xfer_len; |
1914 | if (done) { | 1912 | if (done) { |
1915 | if (use_sg) | 1913 | if (qh->use_sg) |
1916 | use_sg = false; | 1914 | qh->use_sg = false; |
1917 | 1915 | ||
1918 | if (urb->status == -EINPROGRESS) | 1916 | if (urb->status == -EINPROGRESS) |
1919 | urb->status = status; | 1917 | urb->status = status; |
diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h index 5a9c8feec10c..738f7eb60df9 100644 --- a/drivers/usb/musb/musb_host.h +++ b/drivers/usb/musb/musb_host.h | |||
@@ -74,6 +74,7 @@ struct musb_qh { | |||
74 | u16 frame; /* for periodic schedule */ | 74 | u16 frame; /* for periodic schedule */ |
75 | unsigned iso_idx; /* in urb->iso_frame_desc[] */ | 75 | unsigned iso_idx; /* in urb->iso_frame_desc[] */ |
76 | struct sg_mapping_iter sg_miter; /* for highmem in PIO mode */ | 76 | struct sg_mapping_iter sg_miter; /* for highmem in PIO mode */ |
77 | bool use_sg; /* to track urb using sglist */ | ||
77 | }; | 78 | }; |
78 | 79 | ||
79 | /* map from control or bulk queue head to the first qh on that ring */ | 80 | /* map from control or bulk queue head to the first qh on that ring */ |