• Guennadi Liakhovetski's avatar
    [SCSI] dc395x: dynamically map scatter-gather for PIO · cdb8c2a6
    Guennadi Liakhovetski authored
    
    
    The current dc395x driver uses PIO to transfer up to 4 bytes which do not
    get transferred by DMA (under unclear circumstances). For this the driver
    uses page_address() which is broken on highmem. Apart from this the
    actual calculation of the virtual address is wrong (even without highmem).
    So, e.g., for reading it reads bytes from the driver to a wrong address
    and returns wrong data, I guess, for writing it would just output random
    data to the device.
    
    The proper fix, as suggested by many, is to dynamically map data using
    kmap_atomic(page, KM_BIO_SRC_IRQ) / kunmap_atomic(virt). The reason why it
    has not been done until now, although I've done some preliminary patches
    more than a year ago was that nobody interested in fixing this problem was
    able to reliably reproduce it. Now it changed - with the help from
    Sebastian Frei (CC'ed) I was able to trigger the PIO path. Thus, I was
    also able to test and debug it.
    
    There are 4 cases when PIO is used in dc395x - data-in / -out with and
    without scatter-gather. I was able to reproduce and test only data-in with
    and without SG. So, the data-out path is still untested, but it is also
    somewhat simpler than the data-in. Fredrik Roubert (also CC'ed) also had
    PIO triggering on his system, and in his case it was data-out without SG.
    It would be great if he could test the attached patch on his system, but
    even if he cannot, I would still request to apply the patch and just wait
    if anybody cries...
    
    Implementation: I put 2 new functions in scsi_lib.c and their declarations
    in scsi_cmnd.h. I exported them without _GPL, although, I don't feel
    strongly about that - not many drivers are likely to use them. But there
    is at least one more - I want to use them in tmscsim.c. Whether these are
    the right files for the functions and their declarations - not sure
    either. Actually, they are not scsi-specific, so, might go somewhere
    around other scattergather magic? They are not platform specific either,
    and most SG functions are defined under arch/*/... As these issues were
    discussed previously there were some more routines suggested to manipulate
    scattergather buffers, I think, some of them were needed around
    crypto code... So, might be a common place reasonable, like
    lib/scattergather.c? I am open here.
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
    cdb8c2a6
scsi_lib.c 61.7 KB