diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 46c4cdb..4691f8d 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -4794,7 +4794,14 @@ ata_pci_init_native_mode(struct pci_dev pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS; probe_ent->port[p].bmdma_addr = pci_resource_start(pdev, 4); ata_std_ports(&probe_ent->port[p]); - p++; + + if (pci_resource_start(pdev, 0) && + pci_resource_len(pdev, 0) && + pci_resource_start(pdev, 1) && + pci_resource_len(pdev, 1) && + pci_resource_start(pdev, 4) && + pci_resource_len(pdev, 4)) + p++; } if (ports & ATA_PORT_SECONDARY) { @@ -4804,10 +4811,23 @@ ata_pci_init_native_mode(struct pci_dev pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS; probe_ent->port[p].bmdma_addr = pci_resource_start(pdev, 4) + 8; ata_std_ports(&probe_ent->port[p]); - p++; + + if (pci_resource_start(pdev, 2) && + pci_resource_len(pdev, 2) && + pci_resource_start(pdev, 3) && + pci_resource_len(pdev, 3) && + pci_resource_start(pdev, 4) && + pci_resource_len(pdev, 4) > 8) + p++; } probe_ent->n_ports = p; + + if (p == 0) { + kfree(probe_ent); + probe_ent = NULL; + } + return probe_ent; } @@ -4815,6 +4835,10 @@ static struct ata_probe_ent *ata_pci_ini { struct ata_probe_ent *probe_ent; + if (!pci_resource_start(pdev, 4) || + !pci_resource_len(pdev, 4)) + return NULL; + probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port); if (!probe_ent) return NULL;