Commit c791c306 authored by Jeff Garzik's avatar Jeff Garzik

[libata] minor PCI IDE probe fixes and cleanups

* Replace needless 'n_ports > 2' check with a simple BUG_ON().
  No existing driver ever wants more than 2 ports.

* Delete ATA_FLAG_NO_LEGACY check.  No current driver uses
  ata_pci_init_one(), that sets this flag.

* Move PCI_CLASS_PROG register read below pci_enable_device()

* Handle ata_device_add() failure
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 54bb3a94
...@@ -946,35 +946,21 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, ...@@ -946,35 +946,21 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
{ {
struct ata_probe_ent *probe_ent = NULL; struct ata_probe_ent *probe_ent = NULL;
struct ata_port_info *port[2]; struct ata_port_info *port[2];
u8 tmp8, mask; u8 mask;
unsigned int legacy_mode = 0; unsigned int legacy_mode = 0;
int disable_dev_on_err = 1; int disable_dev_on_err = 1;
int rc; int rc;
DPRINTK("ENTER\n"); DPRINTK("ENTER\n");
BUG_ON(n_ports < 1 || n_ports > 2);
port[0] = port_info[0]; port[0] = port_info[0];
if (n_ports > 1) if (n_ports > 1)
port[1] = port_info[1]; port[1] = port_info[1];
else else
port[1] = port[0]; port[1] = port[0];
if ((port[0]->flags & ATA_FLAG_NO_LEGACY) == 0
&& (pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
/* TODO: What if one channel is in native mode ... */
pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8);
mask = (1 << 2) | (1 << 0);
if ((tmp8 & mask) != mask)
legacy_mode = (1 << 3);
}
/* FIXME... */
if ((!legacy_mode) && (n_ports > 2)) {
printk(KERN_ERR "ata: BUG: native mode, n_ports > 2\n");
n_ports = 2;
/* For now */
}
/* FIXME: Really for ATA it isn't safe because the device may be /* FIXME: Really for ATA it isn't safe because the device may be
multi-purpose and we want to leave it alone if it was already multi-purpose and we want to leave it alone if it was already
enabled. Secondly for shared use as Arjan says we want refcounting enabled. Secondly for shared use as Arjan says we want refcounting
...@@ -987,6 +973,16 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, ...@@ -987,6 +973,16 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
if (rc) if (rc)
return rc; return rc;
if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
u8 tmp8;
/* TODO: What if one channel is in native mode ... */
pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8);
mask = (1 << 2) | (1 << 0);
if ((tmp8 & mask) != mask)
legacy_mode = (1 << 3);
}
rc = pci_request_regions(pdev, DRV_NAME); rc = pci_request_regions(pdev, DRV_NAME);
if (rc) { if (rc) {
disable_dev_on_err = 0; disable_dev_on_err = 0;
...@@ -1039,7 +1035,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, ...@@ -1039,7 +1035,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
goto err_out_regions; goto err_out_regions;
} }
/* FIXME: If we get no DMA mask we should fall back to PIO */ /* TODO: If we get no DMA mask we should fall back to PIO */
rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
if (rc) if (rc)
goto err_out_regions; goto err_out_regions;
...@@ -1062,13 +1058,17 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, ...@@ -1062,13 +1058,17 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
pci_set_master(pdev); pci_set_master(pdev);
/* FIXME: check ata_device_add return */ if (!ata_device_add(probe_ent)) {
ata_device_add(probe_ent); rc = -ENODEV;
goto err_out_ent;
}
kfree(probe_ent); kfree(probe_ent);
return 0; return 0;
err_out_ent:
kfree(probe_ent);
err_out_regions: err_out_regions:
if (legacy_mode & ATA_PORT_PRIMARY) if (legacy_mode & ATA_PORT_PRIMARY)
release_region(ATA_PRIMARY_CMD, 8); release_region(ATA_PRIMARY_CMD, 8);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment