Browse Source

[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: Jeff Garzik <jeff@garzik.org>
Jeff Garzik 19 years ago
parent
commit
c791c30670
1 changed files with 20 additions and 20 deletions
  1. 20 20
      drivers/ata/libata-sff.c

+ 20 - 20
drivers/ata/libata-sff.c

@@ -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,
 	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,
 		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,
 
 
 	pci_set_master(pdev);
 	pci_set_master(pdev);
 
 
-	/* FIXME: check ata_device_add return */
-	ata_device_add(probe_ent);
+	if (!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);