• Fabian Godehardt's avatar
    USB: s3c2410_udc: Add handling for S3C244X dual-packet mode · 16f08a08
    Fabian Godehardt authored
    This is a patch that seems to make the USB hangs on the S3C244X go away.
    At least a good amount of ping torture didn't make them come back so far.
    
    The issue is that, if there are several back-to-back packets, sometimes no
    interrupt is generated for one of them. This seems to be caused by the
    mysterious dual packet mode, which the USB hardware enters automatically
    if the endpoint size is half that of the FIFO. (On the 244X, this is the
    normal situation for bulk data endpoints.)
    
    There is also a timing factor in this. It seems that what happens is that
    the USB hardware automatically sends an acknowledgement if there is only one
    packet in the FIFO (the FIFO has space for two). If another packet arrives
    before the host has retrieved and acknowledged the previous one, no interrupt
    is generated for that second one.
    
    However, there may be an indication. There is one undocumented bit (none
    of the 244x manuals document it), OUT_CRS1_REG[1], that seems to be set
    suspiciously often when this condition occurs. There is also
    CLR_DATA_TOGGLE, OUT_CRS1_REG[7], which may have a function related to
    this. (The Samsung manual is rather terse on that, as usual.)
    
    This needs to be examined further. For now, the patch seems to do the
    trick.
    Signed-off-by: default avatarVasily Khoruzhick <anarsoul@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    16f08a08
s3c2410_udc.c 48.8 KB