Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=14d66ab7e2e06d3727719d3e4eec6bf9f70251c3
Commit:     14d66ab7e2e06d3727719d3e4eec6bf9f70251c3
Parent:     9a2eb709256cd591119edc2809b4fcac7cb8eb6c
Author:     Petr Vandrovec <[EMAIL PROTECTED]>
AuthorDate: Thu Mar 8 10:12:12 2007 +0100
Committer:  Jeff Garzik <[EMAIL PROTECTED]>
CommitDate: Fri Mar 9 08:41:15 2007 -0500

    Fix simplex adapters with libata
    
    Recently I got my hands on nVidia's MCP61 PM-AM board, and
    it contains IDE chip configured by BIOS with only primary
    channel enabled.  This confuses code which probes for
    device DMA capabilities - it gets 0x60 (happy duplex
    device) from primary channel BMDMA, but 0xFF (nobody here)
    from secondary channel BMDMA.  Due to this code then believes
    that chip is simplex.  I do not address this problem in
    my patch, as I'm not sure how to handle this.  Probably
    ata_pci_init_one should have bitmap of enabled/possible
    interfaces instead of their count, but it looks like
    quite intrusive change, and maybe we do not care - for device
    with only one channel simplex and regular DMA engines are
    same.
    
    But making device simplex pointed out that support for
    DMA on simplex devices is currently broken - ata_dev_xfermask
    tests whether device is simplex and if it is whether DMA
    engine was assigned to this port.  If not then it strips
    out DMA bits from device.  Problem is that code which assigns
    DMA engine to port in ata_set_mode first detect device
    mode and assigns DMA engine to channel only if some DMA
    capable device was found.
    
    And as xfermask stripped out DMA bits, host->simplex_claimed
    is always NULL with current implementation.
    
    By allowing DMA either if simplex_claimed is NULL or if it
    points to current port DMA can be finally used - it gets
    assigned to first port which contains any DMA capable
    device.
    
    Before:
    pata_amd 0000:00:06.0: version 0.2.8
    PCI: Setting latency timer of device 0000:00:06.0 to 64
    ata5: PATA max UDMA/133 cmd 0x000101f0 ctl 0x000103f6 bmdma 0x0001f000 irq 
14
    ata6: PATA max UDMA/133 cmd 0x00010170 ctl 0x00010376 bmdma 0x0001f008 irq 
15
    scsi4 : pata_amd
    ata5.00: ATAPI, max UDMA/66
    ata5.00: simplex DMA is claimed by other device, disabling DMA
    ata5.00: configured for PIO4
    scsi5 : pata_amd
    ata6: port disabled. ignoring.
    ata6: reset failed, giving up
    scsi 4:0:0:0: CD-ROM            ATAPI    DVD W  DH16W1P   LG12 PQ: 0 ANSI: 5
    
    After:
    pata_amd 0000:00:06.0: version 0.2.8
    PCI: Setting latency timer of device 0000:00:06.0 to 64
    ata5: PATA max UDMA/133 cmd 0x000101f0 ctl 0x000103f6 bmdma 0x0001f000 irq 
14
    ata6: PATA max UDMA/133 cmd 0x00010170 ctl 0x00010376 bmdma 0x0001f008 irq 
15
    scsi4 : pata_amd
    ata5.00: ATAPI, max UDMA/66
    ata5.00: configured for UDMA/33
    scsi5 : pata_amd
    ata6: port disabled. ignoring.
    ata6: reset failed, giving up
    scsi 4:0:0:0: CD-ROM            ATAPI    DVD W  DH16W1P   LG12 PQ: 0 ANSI: 5
    
    Signed-off-by: Petr Vandrovec <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
---
 drivers/ata/libata-core.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index dc362fa..f6408ca 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3455,7 +3455,8 @@ static void ata_dev_xfermask(struct ata_device *dev)
                               "device is on DMA blacklist, disabling DMA\n");
        }
 
-       if ((host->flags & ATA_HOST_SIMPLEX) && host->simplex_claimed != ap) {
+       if ((host->flags & ATA_HOST_SIMPLEX) &&
+            host->simplex_claimed && host->simplex_claimed != ap) {
                xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
                ata_dev_printk(dev, KERN_WARNING, "simplex DMA is claimed by "
                               "other device, disabling DMA\n");
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to