Re: [2.6.18-rc2-mm1] libata ate one PATA channel

Tejun Heo
2006-07-30T19:53:51Z

[-- Attachment #1: Type: text/plain, Size: 2865 bytes --]

J.A. Magallón wrote:
> Hi...
>
> I've been out for more than a week. Just went to try -rc2-mm1 and
> it ate one ide channel...
>
> This was -rc1-mm2:
> libata version 2.00 loaded.
> ata_piix 0000:00:1f.1: version 2.00ac6
> ACPI: PCI Interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 16
> PCI: Setting latency timer of device 0000:00:1f.1 to 64
> ata1: PATA max UDMA/100 cmd 0x1F0 ctl 0x3F6 bmdma 0xF000 irq 14
> scsi0 : ata_piix
> ata1.00: ATAPI, max UDMA/33
> ata1.01: ATAPI, max MWDMA0, CDB intr
> ata1.00: configured for PIO3
> ata1.01: configured for PIO3
> Vendor: HL-DT-ST Model: DVDRAM GSA-4120B Rev: A111
> Type: CD-ROM ANSI SCSI revision: 05
> Vendor: IOMEGA Model: ZIP 250 Rev: 51.G
> Type: Direct-Access ANSI SCSI revision: 05
> ata2: PATA max UDMA/100 cmd 0x170 ctl 0x376 bmdma 0xF008 irq 15
> scsi1 : ata_piix
> ata2.00: ATA-6, max UDMA/100, 234441648 sectors: LBA48
> ata2.00: ata2: dev 0 multi count 16
> ata2.01: ATAPI, max UDMA/33
> ata2.00: configured for UDMA/33
> ata2.01: configured for UDMA/33
> Vendor: ATA Model: ST3120022A Rev: 3.06
> Type: Direct-Access ANSI SCSI revision: 05
> Vendor: TOSHIBA Model: DVD-ROM SD-M1712 Rev: 1004
> Type: CD-ROM ANSI SCSI revision: 05
> ata_piix 0000:00:1f.2: MAP [ P0 -- P1 -- ]
> ACPI: PCI Interrupt 0000:00:1f.2[A] -> GSI 18 (level, low) -> IRQ 16
> PCI: Setting latency timer of device 0000:00:1f.2 to 64
> ata3: SATA max UDMA/133 cmd 0xC000 ctl 0xC402 bmdma 0xD000 irq 16
> ata4: SATA max UDMA/133 cmd 0xC800 ctl 0xCC02 bmdma 0xD008 irq 16
>
>
> This is -rc2-mm1, a PATA channel is missing...
>
> libata version 2.00 loaded.
> ata_piix 0000:00:1f.1: version 2.00ac6
> ACPI: PCI Interrupt 0000:00:1f.1[A] -> GSI 18 (level, low) -> IRQ 16
> PCI: Setting latency timer of device 0000:00:1f.1 to 64
> ata1: PATA max UDMA/100 cmd 0x1F0 ctl 0x3F6 bmdma 0xF000 irq 14
> scsi0 : ata_piix
> ata1.00: ATAPI, max UDMA/33
> ata1.01: ATAPI, max MWDMA0, CDB intr
> ata1.00: configured for UDMA/33
> ata1.01: configured for PIO3
> Vendor: HL-DT-ST Model: DVDRAM GSA-4120B Rev: A111
> Type: CD-ROM ANSI SCSI revision: 05
> Vendor: IOMEGA Model: ZIP 250 Rev: 51.G
> Type: Direct-Access ANSI SCSI revision: 05
> ata_piix 0000:00:1f.2: MAP [ P0 -- P1 -- ]
> ACPI: PCI Interrupt 0000:00:1f.2[A] -> GSI 18 (level, low) -> IRQ 16
> PCI: Setting latency timer of device 0000:00:1f.2 to 64
> ata2: SATA max UDMA/133 cmd 0xC000 ctl 0xC402 bmdma 0xD000 irq 16
> ata3: SATA max UDMA/133 cmd 0xC800 ctl 0xCC02 bmdma 0xD008 irq 16
>
> Any idea ?
> Any more info needed ?

lspci -n please. Also, can you report what the kernel says with the
attached patch applied?

Thanks.

--
tejun

[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 1570 bytes --]

diff --git a/drivers/scsi/libata-bmdma.c b/drivers/scsi/libata-bmdma.c
index 9ce221f..9397f0b 100644
--- a/drivers/scsi/libata-bmdma.c
+++ b/drivers/scsi/libata-bmdma.c
@@ -1070,6 +1070,10 @@ int ata_pci_init_one (struct pci_dev *pd
goto err_out_regions;
}

+ dev_printk(KERN_INFO, &pdev->dev,
+ "XXX: legacy_mode=%x probe_ent=%p probe_ent2=%p\n",
+ legacy_mode, probe_ent, probe_ent2);
+
pci_set_master(pdev);

/* FIXME: check ata_device_add return */
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 66feebd..9756ee6 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -5401,8 +5401,11 @@ int ata_device_add(const struct ata_prob
/* alloc a container for our list of ATA ports (buses) */
host_set = kzalloc(sizeof(struct ata_host_set) +
(ent->n_ports * sizeof(void *)), GFP_KERNEL);
- if (!host_set)
+ if (!host_set) {
+ printk(KERN_ERR "ata_device_add() alloc failed, n_ports=%d\n",
+ ent->n_ports);
return 0;
+ }
spin_lock_init(&host_set->lock);

host_set->dev = dev;
@@ -5419,8 +5422,10 @@ int ata_device_add(const struct ata_prob
unsigned long xfer_mode_mask;

ap = ata_host_add(ent, host_set, i);
- if (!ap)
+ if (!ap) {
+ printk(KERN_ERR "ata_host_add() failed\n");
goto err_out;
+ }

host_set->ports[i] = ap;
xfer_mode_mask =(ap->udma_mask << ATA_SHIFT_UDMA) |
@@ -5537,7 +5542,7 @@ err_out:
}
err_free_ret:
kfree(host_set);
- VPRINTK("EXIT, returning 0\n");
+ printk(KERN_ERR "ata_device_add() ERROR, returning 0\n");
return 0;
}