1
0
mirror of https://git.yoctoproject.org/meta-ti synced 2026-05-07 03:49:20 +00:00

linux-ti33x-psp: Refresh musb patch

This patch is rewritten to poll for the channel FIFO state without depending on a worker thread.

The v2 version fixes all the previous issues, and remains to be seen if it also fixes the issue of
100% CPU usage with a mac.

Signed-off-by: Joel A Fernandes <joelagnel@ti.com>
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
This commit is contained in:
Joel A Fernandes
2011-11-14 21:34:23 -06:00
committed by Koen Kooi
parent a0b13fc0e5
commit 59e00aecf2
2 changed files with 58 additions and 14 deletions
@@ -1,7 +1,7 @@
From b564457d26931a00f8c5645981a00c1eb78e9a90 Mon Sep 17 00:00:00 2001
From c5a0664fa68a8541c1400bf7330a072581b12c38 Mon Sep 17 00:00:00 2001
From: Joel A Fernandes <joelagnel@ti.com>
Date: Sat, 12 Nov 2011 23:42:26 -0600
Subject: [PATCH] usb::musb::cppi41_dma: Check if scheduling is required after DMA
Subject: [PATCH v2] usb::musb::cppi41_dma: Check if scheduling is required after DMA
Even after TX DMA, data can still be in the FIFO and we would keep
rescheduling the worker thread in a polling fashion taking up a lot
@@ -11,19 +11,64 @@ is required and sleep if so.
This fixes high CPU load issue seen with g_mass_storage on a BeagleBone
and could potentially fix similar issues seen with other gadget drivers.
v2 changes:
Avoid rescheduling a "worker", this process involves a lot of workqueue
related crunching that is unnecessary. If we're polling, we might as well
do it with minimum overhead, and giving other processes CPU time at the
same time.
Signed-off-by: Joel A Fernandes <joelagnel@ti.com>
---
drivers/usb/musb/cppi41_dma.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
drivers/usb/musb/cppi41_dma.c | 30 ++++++++++++++++++------------
1 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/drivers/usb/musb/cppi41_dma.c b/drivers/usb/musb/cppi41_dma.c
index a24707c..e68c5d7 100644
index a24707c..3ac58b1 100644
--- a/drivers/usb/musb/cppi41_dma.c
+++ b/drivers/usb/musb/cppi41_dma.c
@@ -1319,6 +1319,16 @@ void txdma_completion_work(struct work_struct *data)
struct musb *musb = cppi->musb;
unsigned long flags;
@@ -1283,6 +1283,7 @@ void cppi41_check_fifo_empty(struct cppi41 *cppi)
for (index = 0; index < USB_CPPI41_NUM_CH; index++) {
void __iomem *epio;
u16 csr;
+ unsigned long flags;
tx_ch = &cppi->tx_cppi_ch[index];
if (tx_ch->tx_complete) {
@@ -1299,29 +1300,34 @@ void cppi41_check_fifo_empty(struct cppi41 *cppi)
epio = tx_ch->end_pt->regs;
csr = musb_readw(epio, MUSB_TXCSR);
- if (csr & (MUSB_TXCSR_TXPKTRDY |
- MUSB_TXCSR_FIFONOTEMPTY))
- resched = 1;
- else {
- tx_ch->tx_complete = 0;
- musb_dma_completion(musb, index+1, 1);
+ while (1) {
+ csr = musb_readw(epio, MUSB_TXCSR);
+ if(!(csr & (MUSB_TXCSR_TXPKTRDY |
+ MUSB_TXCSR_FIFONOTEMPTY)))
+ break;
+ cond_resched();
}
+ tx_ch->tx_complete = 0;
+ spin_lock_irqsave(&musb->lock, flags);
+ musb_dma_completion(musb, index+1, 1);
+ spin_unlock_irqrestore(&musb->lock, flags);
}
}
-
- if (resched)
- schedule_work(&cppi->txdma_work);
}
void txdma_completion_work(struct work_struct *data)
{
struct cppi41 *cppi = container_of(data, struct cppi41, txdma_work);
struct musb *musb = cppi->musb;
- unsigned long flags;
- spin_lock_irqsave(&musb->lock, flags);
+ /*
+ * txdma worker thread can call schedule_work on itself and cause
+ * itself to be scheduled immediately and because the data might still
@@ -31,12 +76,11 @@ index a24707c..e68c5d7 100644
+ * the worker to consume lot of CPU when the controller is slow, so we
+ * reschedule if necessary.
+ */
+ if (need_resched())
+ cond_resched();
+
spin_lock_irqsave(&musb->lock, flags);
cppi41_check_fifo_empty(cppi);
spin_unlock_irqrestore(&musb->lock, flags);
- spin_unlock_irqrestore(&musb->lock, flags);
}
/**
--
1.7.4.1
+1 -1
View File
@@ -11,7 +11,7 @@ MULTI_CONFIG_BASE_SUFFIX = ""
BRANCH = "v3.1-staging"
SRCREV = "1d84d8853fa30cf3db2571a5aec572accca4e29d"
MACHINE_KERNEL_PR_append = "r+gitr${SRCREV}"
MACHINE_KERNEL_PR_append = "s+gitr${SRCREV}"
COMPATIBLE_MACHINE = "(ti33x)"