diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-09-28 03:40:11 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-09-28 03:40:11 -0400 |
commit | c791c30670ea61f19eec390124128bf278e854fe (patch) | |
tree | 5e75cc3f222a3425a2116be8e1691baa9534cdbe /drivers/ata/libata-sff.c | |
parent | 54bb3a94b192be09feb85993b664ff118d6433d0 (diff) |
[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>
Diffstat (limited to 'drivers/ata/libata-sff.c')
-rw-r--r-- | drivers/ata/libata-sff.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 08b3a407473e..a620e235ccc2 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -946,35 +946,21 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, | |||
946 | { | 946 | { |
947 | struct ata_probe_ent *probe_ent = NULL; | 947 | struct ata_probe_ent *probe_ent = NULL; |
948 | struct ata_port_info *port[2]; | 948 | struct ata_port_info *port[2]; |
949 | u8 tmp8, mask; | 949 | u8 mask; |
950 | unsigned int legacy_mode = 0; | 950 | unsigned int legacy_mode = 0; |
951 | int disable_dev_on_err = 1; | 951 | int disable_dev_on_err = 1; |
952 | int rc; | 952 | int rc; |
953 | 953 | ||
954 | DPRINTK("ENTER\n"); | 954 | DPRINTK("ENTER\n"); |
955 | 955 | ||
956 | BUG_ON(n_ports < 1 || n_ports > 2); | ||
957 | |||
956 | port[0] = port_info[0]; | 958 | port[0] = port_info[0]; |
957 | if (n_ports > 1) | 959 | if (n_ports > 1) |
958 | port[1] = port_info[1]; | 960 | port[1] = port_info[1]; |
959 | else | 961 | else |
960 | port[1] = port[0]; | 962 | port[1] = port[0]; |
961 | 963 | ||
962 | if ((port[0]->flags & ATA_FLAG_NO_LEGACY) == 0 | ||
963 | && (pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) { | ||
964 | /* TODO: What if one channel is in native mode ... */ | ||
965 | pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8); | ||
966 | mask = (1 << 2) | (1 << 0); | ||
967 | if ((tmp8 & mask) != mask) | ||
968 | legacy_mode = (1 << 3); | ||
969 | } | ||
970 | |||
971 | /* FIXME... */ | ||
972 | if ((!legacy_mode) && (n_ports > 2)) { | ||
973 | printk(KERN_ERR "ata: BUG: native mode, n_ports > 2\n"); | ||
974 | n_ports = 2; | ||
975 | /* For now */ | ||
976 | } | ||
977 | |||
978 | /* FIXME: Really for ATA it isn't safe because the device may be | 964 | /* FIXME: Really for ATA it isn't safe because the device may be |
979 | multi-purpose and we want to leave it alone if it was already | 965 | multi-purpose and we want to leave it alone if it was already |
980 | enabled. Secondly for shared use as Arjan says we want refcounting | 966 | 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 | if (rc) | 973 | if (rc) |
988 | return rc; | 974 | return rc; |
989 | 975 | ||
976 | if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) { | ||
977 | u8 tmp8; | ||
978 | |||
979 | /* TODO: What if one channel is in native mode ... */ | ||
980 | pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8); | ||
981 | mask = (1 << 2) | (1 << 0); | ||
982 | if ((tmp8 & mask) != mask) | ||
983 | legacy_mode = (1 << 3); | ||
984 | } | ||
985 | |||
990 | rc = pci_request_regions(pdev, DRV_NAME); | 986 | rc = pci_request_regions(pdev, DRV_NAME); |
991 | if (rc) { | 987 | if (rc) { |
992 | disable_dev_on_err = 0; | 988 | 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 | goto err_out_regions; | 1035 | goto err_out_regions; |
1040 | } | 1036 | } |
1041 | 1037 | ||
1042 | /* FIXME: If we get no DMA mask we should fall back to PIO */ | 1038 | /* TODO: If we get no DMA mask we should fall back to PIO */ |
1043 | rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); | 1039 | rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); |
1044 | if (rc) | 1040 | if (rc) |
1045 | goto err_out_regions; | 1041 | goto err_out_regions; |
@@ -1062,13 +1058,17 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info, | |||
1062 | 1058 | ||
1063 | pci_set_master(pdev); | 1059 | pci_set_master(pdev); |
1064 | 1060 | ||
1065 | /* FIXME: check ata_device_add return */ | 1061 | if (!ata_device_add(probe_ent)) { |
1066 | ata_device_add(probe_ent); | 1062 | rc = -ENODEV; |
1063 | goto err_out_ent; | ||
1064 | } | ||
1067 | 1065 | ||
1068 | kfree(probe_ent); | 1066 | kfree(probe_ent); |
1069 | 1067 | ||
1070 | return 0; | 1068 | return 0; |
1071 | 1069 | ||
1070 | err_out_ent: | ||
1071 | kfree(probe_ent); | ||
1072 | err_out_regions: | 1072 | err_out_regions: |
1073 | if (legacy_mode & ATA_PORT_PRIMARY) | 1073 | if (legacy_mode & ATA_PORT_PRIMARY) |
1074 | release_region(ATA_PRIMARY_CMD, 8); | 1074 | release_region(ATA_PRIMARY_CMD, 8); |