|
@@ -25,7 +25,7 @@
|
|
#include <linux/libata.h>
|
|
#include <linux/libata.h>
|
|
|
|
|
|
#define DRV_NAME "pata_amd"
|
|
#define DRV_NAME "pata_amd"
|
|
-#define DRV_VERSION "0.2.8"
|
|
|
|
|
|
+#define DRV_VERSION "0.3.8"
|
|
|
|
|
|
/**
|
|
/**
|
|
* timing_setup - shared timing computation and load
|
|
* timing_setup - shared timing computation and load
|
|
@@ -119,32 +119,25 @@ static void timing_setup(struct ata_port *ap, struct ata_device *adev, int offse
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * amd_probe_init - cable detection
|
|
|
|
|
|
+ * amd_probe_init - perform reset handling
|
|
* @ap: ATA port
|
|
* @ap: ATA port
|
|
*
|
|
*
|
|
- * Perform cable detection. The BIOS stores this in PCI config
|
|
|
|
- * space for us.
|
|
|
|
|
|
+ * Reset sequence checking enable bits to see which ports are
|
|
|
|
+ * active.
|
|
*/
|
|
*/
|
|
|
|
|
|
static int amd_pre_reset(struct ata_port *ap)
|
|
static int amd_pre_reset(struct ata_port *ap)
|
|
{
|
|
{
|
|
- static const u32 bitmask[2] = {0x03, 0x0C};
|
|
|
|
static const struct pci_bits amd_enable_bits[] = {
|
|
static const struct pci_bits amd_enable_bits[] = {
|
|
{ 0x40, 1, 0x02, 0x02 },
|
|
{ 0x40, 1, 0x02, 0x02 },
|
|
{ 0x40, 1, 0x01, 0x01 }
|
|
{ 0x40, 1, 0x01, 0x01 }
|
|
};
|
|
};
|
|
|
|
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
- u8 ata66;
|
|
|
|
|
|
|
|
if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no]))
|
|
if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no]))
|
|
return -ENOENT;
|
|
return -ENOENT;
|
|
|
|
|
|
- pci_read_config_byte(pdev, 0x42, &ata66);
|
|
|
|
- if (ata66 & bitmask[ap->port_no])
|
|
|
|
- ap->cbl = ATA_CBL_PATA80;
|
|
|
|
- else
|
|
|
|
- ap->cbl = ATA_CBL_PATA40;
|
|
|
|
return ata_std_prereset(ap);
|
|
return ata_std_prereset(ap);
|
|
|
|
|
|
}
|
|
}
|
|
@@ -156,28 +149,16 @@ static void amd_error_handler(struct ata_port *ap)
|
|
ata_std_postreset);
|
|
ata_std_postreset);
|
|
}
|
|
}
|
|
|
|
|
|
-static int amd_early_pre_reset(struct ata_port *ap)
|
|
|
|
|
|
+static int amd_cable_detect(struct ata_port *ap)
|
|
{
|
|
{
|
|
|
|
+ static const u32 bitmask[2] = {0x03, 0x0C};
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
- static struct pci_bits amd_enable_bits[] = {
|
|
|
|
- { 0x40, 1, 0x02, 0x02 },
|
|
|
|
- { 0x40, 1, 0x01, 0x01 }
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- if (!pci_test_config_bits(pdev, &amd_enable_bits[ap->port_no]))
|
|
|
|
- return -ENOENT;
|
|
|
|
-
|
|
|
|
- /* No host side cable detection */
|
|
|
|
- ap->cbl = ATA_CBL_PATA80;
|
|
|
|
- return ata_std_prereset(ap);
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
|
|
+ u8 ata66;
|
|
|
|
|
|
-static void amd_early_error_handler(struct ata_port *ap)
|
|
|
|
-{
|
|
|
|
- ata_bmdma_drive_eh(ap, amd_early_pre_reset,
|
|
|
|
- ata_std_softreset, NULL,
|
|
|
|
- ata_std_postreset);
|
|
|
|
|
|
+ pci_read_config_byte(pdev, 0x42, &ata66);
|
|
|
|
+ if (ata66 & bitmask[ap->port_no])
|
|
|
|
+ return ATA_CBL_PATA80;
|
|
|
|
+ return ATA_CBL_PATA40;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -247,31 +228,16 @@ static void amd133_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
|
*/
|
|
*/
|
|
|
|
|
|
static int nv_pre_reset(struct ata_port *ap) {
|
|
static int nv_pre_reset(struct ata_port *ap) {
|
|
- static const u8 bitmask[2] = {0x03, 0x0C};
|
|
|
|
static const struct pci_bits nv_enable_bits[] = {
|
|
static const struct pci_bits nv_enable_bits[] = {
|
|
{ 0x50, 1, 0x02, 0x02 },
|
|
{ 0x50, 1, 0x02, 0x02 },
|
|
{ 0x50, 1, 0x01, 0x01 }
|
|
{ 0x50, 1, 0x01, 0x01 }
|
|
};
|
|
};
|
|
|
|
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
- u8 ata66;
|
|
|
|
- u16 udma;
|
|
|
|
|
|
|
|
if (!pci_test_config_bits(pdev, &nv_enable_bits[ap->port_no]))
|
|
if (!pci_test_config_bits(pdev, &nv_enable_bits[ap->port_no]))
|
|
return -ENOENT;
|
|
return -ENOENT;
|
|
|
|
|
|
- pci_read_config_byte(pdev, 0x52, &ata66);
|
|
|
|
- if (ata66 & bitmask[ap->port_no])
|
|
|
|
- ap->cbl = ATA_CBL_PATA80;
|
|
|
|
- else
|
|
|
|
- ap->cbl = ATA_CBL_PATA40;
|
|
|
|
-
|
|
|
|
- /* We now have to double check because the Nvidia boxes BIOS
|
|
|
|
- doesn't always set the cable bits but does set mode bits */
|
|
|
|
-
|
|
|
|
- pci_read_config_word(pdev, 0x62 - 2 * ap->port_no, &udma);
|
|
|
|
- if ((udma & 0xC4) == 0xC4 || (udma & 0xC400) == 0xC400)
|
|
|
|
- ap->cbl = ATA_CBL_PATA80;
|
|
|
|
return ata_std_prereset(ap);
|
|
return ata_std_prereset(ap);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -281,6 +247,29 @@ static void nv_error_handler(struct ata_port *ap)
|
|
ata_std_softreset, NULL,
|
|
ata_std_softreset, NULL,
|
|
ata_std_postreset);
|
|
ata_std_postreset);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+static int nv_cable_detect(struct ata_port *ap)
|
|
|
|
+{
|
|
|
|
+ static const u8 bitmask[2] = {0x03, 0x0C};
|
|
|
|
+ struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
|
|
|
+ u8 ata66;
|
|
|
|
+ u16 udma;
|
|
|
|
+ int cbl;
|
|
|
|
+
|
|
|
|
+ pci_read_config_byte(pdev, 0x52, &ata66);
|
|
|
|
+ if (ata66 & bitmask[ap->port_no])
|
|
|
|
+ cbl = ATA_CBL_PATA80;
|
|
|
|
+ else
|
|
|
|
+ cbl = ATA_CBL_PATA40;
|
|
|
|
+
|
|
|
|
+ /* We now have to double check because the Nvidia boxes BIOS
|
|
|
|
+ doesn't always set the cable bits but does set mode bits */
|
|
|
|
+ pci_read_config_word(pdev, 0x62 - 2 * ap->port_no, &udma);
|
|
|
|
+ if ((udma & 0xC4) == 0xC4 || (udma & 0xC400) == 0xC400)
|
|
|
|
+ cbl = ATA_CBL_PATA80;
|
|
|
|
+ return cbl;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* nv100_set_piomode - set initial PIO mode data
|
|
* nv100_set_piomode - set initial PIO mode data
|
|
* @ap: ATA interface
|
|
* @ap: ATA interface
|
|
@@ -353,8 +342,9 @@ static struct ata_port_operations amd33_port_ops = {
|
|
|
|
|
|
.freeze = ata_bmdma_freeze,
|
|
.freeze = ata_bmdma_freeze,
|
|
.thaw = ata_bmdma_thaw,
|
|
.thaw = ata_bmdma_thaw,
|
|
- .error_handler = amd_early_error_handler,
|
|
|
|
|
|
+ .error_handler = amd_error_handler,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
|
|
+ .cable_detect = ata_cable_40wire,
|
|
|
|
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_start = ata_bmdma_start,
|
|
.bmdma_start = ata_bmdma_start,
|
|
@@ -387,8 +377,9 @@ static struct ata_port_operations amd66_port_ops = {
|
|
|
|
|
|
.freeze = ata_bmdma_freeze,
|
|
.freeze = ata_bmdma_freeze,
|
|
.thaw = ata_bmdma_thaw,
|
|
.thaw = ata_bmdma_thaw,
|
|
- .error_handler = amd_early_error_handler,
|
|
|
|
|
|
+ .error_handler = amd_error_handler,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
|
|
+ .cable_detect = ata_cable_unknown,
|
|
|
|
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_start = ata_bmdma_start,
|
|
.bmdma_start = ata_bmdma_start,
|
|
@@ -423,6 +414,7 @@ static struct ata_port_operations amd100_port_ops = {
|
|
.thaw = ata_bmdma_thaw,
|
|
.thaw = ata_bmdma_thaw,
|
|
.error_handler = amd_error_handler,
|
|
.error_handler = amd_error_handler,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
|
|
+ .cable_detect = ata_cable_unknown,
|
|
|
|
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_start = ata_bmdma_start,
|
|
.bmdma_start = ata_bmdma_start,
|
|
@@ -457,6 +449,7 @@ static struct ata_port_operations amd133_port_ops = {
|
|
.thaw = ata_bmdma_thaw,
|
|
.thaw = ata_bmdma_thaw,
|
|
.error_handler = amd_error_handler,
|
|
.error_handler = amd_error_handler,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
|
|
+ .cable_detect = amd_cable_detect,
|
|
|
|
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_start = ata_bmdma_start,
|
|
.bmdma_start = ata_bmdma_start,
|
|
@@ -491,6 +484,7 @@ static struct ata_port_operations nv100_port_ops = {
|
|
.thaw = ata_bmdma_thaw,
|
|
.thaw = ata_bmdma_thaw,
|
|
.error_handler = nv_error_handler,
|
|
.error_handler = nv_error_handler,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
|
|
+ .cable_detect = nv_cable_detect,
|
|
|
|
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_start = ata_bmdma_start,
|
|
.bmdma_start = ata_bmdma_start,
|
|
@@ -525,6 +519,7 @@ static struct ata_port_operations nv133_port_ops = {
|
|
.thaw = ata_bmdma_thaw,
|
|
.thaw = ata_bmdma_thaw,
|
|
.error_handler = nv_error_handler,
|
|
.error_handler = nv_error_handler,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
.post_internal_cmd = ata_bmdma_post_internal_cmd,
|
|
|
|
+ .cable_detect = nv_cable_detect,
|
|
|
|
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_setup = ata_bmdma_setup,
|
|
.bmdma_start = ata_bmdma_start,
|
|
.bmdma_start = ata_bmdma_start,
|
|
@@ -644,6 +639,11 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
if (type == 1 && rev > 0x7)
|
|
if (type == 1 && rev > 0x7)
|
|
type = 2;
|
|
type = 2;
|
|
|
|
|
|
|
|
+#if defined(CONFIG_ATA_ACPI)
|
|
|
|
+ /* Prefer the ACPI driver for Nvidia hardware */
|
|
|
|
+ if (pdev->vendor == PCI_VENDOR_ID_NVIDIA && ata_pata_acpi_present(pdev))
|
|
|
|
+ return -ENODEV;
|
|
|
|
+#endif
|
|
/* Check for AMD7411 */
|
|
/* Check for AMD7411 */
|
|
if (type == 3)
|
|
if (type == 3)
|
|
/* FIFO is broken */
|
|
/* FIFO is broken */
|