Re: [PATCH 1/6] [local/generalize] USB: musb: workaround RX DMA hang anomaly by disabling double buffer mode

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Wed, Dec 23, 2009 at 11:01:20AM +0100, ext Cai, Cliff wrote:
this tells me that we really can't trust musb's double
buffering at all and we can make a check based on the rtl
revision. At least until rtl1.9 we can't use double buffering,
no matter what the fifo table or hardware ep configuration says.

Exactly,Blackfin doesn't have dynamic fifo sizing,and since the BULK EP
has a 1024 bytes fifo,double buffering is enabled by default.

good, so can you reimplement this with a rtl version check and blacklist double buffering for anything <= rtl1.9 ??

you will need this patch:

commit 32c3b94e2b643bfeca5e48b0f7f0b81812c7a1d3
Author: Anand Gadiyar <gadiyar@xxxxxx>
Date:   Mon Nov 16 21:09:21 2009 +0530

    USB: MUSB: save hardware revision at init
MUSB: save hardware revision at init This can be used later to flag workarounds for issues affecting
    particular revisions. Saving this at init avoids having to
    read the HWVERS register multiple times in code.
While at it, use macros to extract the version information
    instead of using hardcoded values.
Signed-off-by: Anand Gadiyar <gadiyar@xxxxxx>
    Cc: Ajay Kumar Gupta <ajay.gupta@xxxxxx>
    Acked-by: Felipe Balbi <felipe.balbi@xxxxxxxxx>
    Cc: David Brownell <dbrownell@xxxxxxxxxxxxxxxxxxxxx>
    Cc: Sergei Shtylyov <sshtylyov@xxxxxxxxxxxxx>
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>

diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 547e0e3..49f2346 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -1319,7 +1319,6 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb)
 #endif
        u8 reg;
        char *type;
-       u16 hwvers, rev_major, rev_minor;
        char aInfo[78], aRevision[32], aDate[12];
        void __iomem    *mbase = musb->mregs;
        int             status = 0;
@@ -1391,11 +1390,10 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb)
        }
/* log release info */
-       hwvers = musb_read_hwvers(mbase);
-       rev_major = (hwvers >> 10) & 0x1f;
-       rev_minor = hwvers & 0x3ff;
-       snprintf(aRevision, 32, "%d.%d%s", rev_major,
-               rev_minor, (hwvers & 0x8000) ? "RC" : "");
+       musb->hwvers = musb_read_hwvers(mbase);
+       snprintf(aRevision, 32, "%d.%d%s", MUSB_HWVERS_MAJOR(musb->hwvers),
+               MUSB_HWVERS_MINOR(musb->hwvers),
+               (musb->hwvers & MUSB_HWVERS_RC) ? "RC" : "");
        printk(KERN_DEBUG "%s: %sHDRC RTL version %s %s\n",
                        musb_driver_name, type, aRevision, aDate);
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index 6aa5f22..03d5090 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -322,6 +322,14 @@ struct musb {
        struct clk              *clock;
        irqreturn_t             (*isr)(int, void *);
        struct work_struct      irq_work;
+#define MUSB_HWVERS_MAJOR(x)   ((x >> 10) & 0x1f)
+#define MUSB_HWVERS_MINOR(x)   (x & 0x3ff)
+#define MUSB_HWVERS_RC         0x8000
+#define MUSB_HWVERS_1300       0x52C
+#define MUSB_HWVERS_1400       0x590
+#define MUSB_HWVERS_1800       0x720
+#define MUSB_HWVERS_2000       0x800
+       u16                     hwvers;
/* this hub status bit is reserved by USB 2.0 and not seen by usbcore */
 #define MUSB_PORT_STAT_RESUME  (1 << 31)

--
balbi
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux