mirror of
https://github.com/adulau/aha.git
synced 2025-01-04 23:23:18 +00:00
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev: pata_via: Handle laptops via DMI libata: -ENODEV during prereset isn't an error libata: don't consider 0xff as port empty if SStatus is available ata_piix: add short 40c quirk for Acer Aspire 2030, take #2 pata_sis: Fix and clean up some timing setups hpt3x2n: Correct revision boundary
This commit is contained in:
commit
91396c1e2d
5 changed files with 57 additions and 27 deletions
|
@ -578,6 +578,7 @@ static const struct ich_laptop ich_laptop[] = {
|
||||||
{ 0x27DF, 0x0005, 0x0280 }, /* ICH7 on Acer 5602WLMi */
|
{ 0x27DF, 0x0005, 0x0280 }, /* ICH7 on Acer 5602WLMi */
|
||||||
{ 0x27DF, 0x1025, 0x0110 }, /* ICH7 on Acer 3682WLMi */
|
{ 0x27DF, 0x1025, 0x0110 }, /* ICH7 on Acer 3682WLMi */
|
||||||
{ 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */
|
{ 0x27DF, 0x1043, 0x1267 }, /* ICH7 on Asus W5F */
|
||||||
|
{ 0x24CA, 0x1025, 0x0061 }, /* ICH4 on ACER Aspire 2023WLMi */
|
||||||
/* end marker */
|
/* end marker */
|
||||||
{ 0, }
|
{ 0, }
|
||||||
};
|
};
|
||||||
|
|
|
@ -3022,7 +3022,7 @@ int ata_wait_ready(struct ata_port *ap, unsigned long deadline)
|
||||||
|
|
||||||
if (!(status & ATA_BUSY))
|
if (!(status & ATA_BUSY))
|
||||||
return 0;
|
return 0;
|
||||||
if (status == 0xff)
|
if (!ata_port_online(ap) && status == 0xff)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
if (time_after(now, deadline))
|
if (time_after(now, deadline))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
@ -3368,7 +3368,7 @@ int ata_std_prereset(struct ata_port *ap, unsigned long deadline)
|
||||||
*/
|
*/
|
||||||
if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_port_offline(ap)) {
|
if (!(ap->flags & ATA_FLAG_SKIP_D2H_BSY) && !ata_port_offline(ap)) {
|
||||||
rc = ata_wait_ready(ap, deadline);
|
rc = ata_wait_ready(ap, deadline);
|
||||||
if (rc) {
|
if (rc && rc != -ENODEV) {
|
||||||
ata_port_printk(ap, KERN_WARNING, "device not ready "
|
ata_port_printk(ap, KERN_WARNING, "device not ready "
|
||||||
"(errno=%d), forcing hardreset\n", rc);
|
"(errno=%d), forcing hardreset\n", rc);
|
||||||
ehc->i.action |= ATA_EH_HARDRESET;
|
ehc->i.action |= ATA_EH_HARDRESET;
|
||||||
|
|
|
@ -521,8 +521,8 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||||
/* 371N if rev > 1 */
|
/* 371N if rev > 1 */
|
||||||
break;
|
break;
|
||||||
case PCI_DEVICE_ID_TTI_HPT372:
|
case PCI_DEVICE_ID_TTI_HPT372:
|
||||||
/* 372N if rev >= 1*/
|
/* 372N if rev >= 2*/
|
||||||
if (class_rev == 0)
|
if (class_rev < 2)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
break;
|
break;
|
||||||
case PCI_DEVICE_ID_TTI_HPT302:
|
case PCI_DEVICE_ID_TTI_HPT302:
|
||||||
|
|
|
@ -73,14 +73,14 @@ static int sis_short_ata40(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sis_port_base - return PCI configuration base for dev
|
* sis_old_port_base - return PCI configuration base for dev
|
||||||
* @adev: device
|
* @adev: device
|
||||||
*
|
*
|
||||||
* Returns the base of the PCI configuration registers for this port
|
* Returns the base of the PCI configuration registers for this port
|
||||||
* number.
|
* number.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int sis_port_base(struct ata_device *adev)
|
static int sis_old_port_base(struct ata_device *adev)
|
||||||
{
|
{
|
||||||
return 0x40 + (4 * adev->ap->port_no) + (2 * adev->devno);
|
return 0x40 + (4 * adev->ap->port_no) + (2 * adev->devno);
|
||||||
}
|
}
|
||||||
|
@ -211,7 +211,7 @@ static void sis_set_fifo(struct ata_port *ap, struct ata_device *adev)
|
||||||
static void sis_old_set_piomode (struct ata_port *ap, struct ata_device *adev)
|
static void sis_old_set_piomode (struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
int port = sis_port_base(adev);
|
int port = sis_old_port_base(adev);
|
||||||
u8 t1, t2;
|
u8 t1, t2;
|
||||||
int speed = adev->pio_mode - XFER_PIO_0;
|
int speed = adev->pio_mode - XFER_PIO_0;
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ static void sis_old_set_piomode (struct ata_port *ap, struct ata_device *adev)
|
||||||
static void sis_100_set_piomode (struct ata_port *ap, struct ata_device *adev)
|
static void sis_100_set_piomode (struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
int port = sis_port_base(adev);
|
int port = sis_old_port_base(adev);
|
||||||
int speed = adev->pio_mode - XFER_PIO_0;
|
int speed = adev->pio_mode - XFER_PIO_0;
|
||||||
|
|
||||||
const u8 actrec[] = { 0x00, 0x67, 0x44, 0x33, 0x31 };
|
const u8 actrec[] = { 0x00, 0x67, 0x44, 0x33, 0x31 };
|
||||||
|
@ -328,7 +328,7 @@ static void sis_old_set_dmamode (struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
int speed = adev->dma_mode - XFER_MW_DMA_0;
|
int speed = adev->dma_mode - XFER_MW_DMA_0;
|
||||||
int drive_pci = sis_port_base(adev);
|
int drive_pci = sis_old_port_base(adev);
|
||||||
u16 timing;
|
u16 timing;
|
||||||
|
|
||||||
const u16 mwdma_bits[] = { 0x707, 0x202, 0x202 };
|
const u16 mwdma_bits[] = { 0x707, 0x202, 0x202 };
|
||||||
|
@ -367,7 +367,7 @@ static void sis_66_set_dmamode (struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
int speed = adev->dma_mode - XFER_MW_DMA_0;
|
int speed = adev->dma_mode - XFER_MW_DMA_0;
|
||||||
int drive_pci = sis_port_base(adev);
|
int drive_pci = sis_old_port_base(adev);
|
||||||
u16 timing;
|
u16 timing;
|
||||||
|
|
||||||
const u16 mwdma_bits[] = { 0x707, 0x202, 0x202 };
|
const u16 mwdma_bits[] = { 0x707, 0x202, 0x202 };
|
||||||
|
@ -378,12 +378,12 @@ static void sis_66_set_dmamode (struct ata_port *ap, struct ata_device *adev)
|
||||||
if (adev->dma_mode < XFER_UDMA_0) {
|
if (adev->dma_mode < XFER_UDMA_0) {
|
||||||
/* bits 3-0 hold recovery timing bits 8-10 active timing and
|
/* bits 3-0 hold recovery timing bits 8-10 active timing and
|
||||||
the higer bits are dependant on the device, bit 15 udma */
|
the higer bits are dependant on the device, bit 15 udma */
|
||||||
timing &= ~ 0x870F;
|
timing &= ~0x870F;
|
||||||
timing |= mwdma_bits[speed];
|
timing |= mwdma_bits[speed];
|
||||||
} else {
|
} else {
|
||||||
/* Bit 15 is UDMA on/off, bit 12-14 are cycle time */
|
/* Bit 15 is UDMA on/off, bit 12-14 are cycle time */
|
||||||
speed = adev->dma_mode - XFER_UDMA_0;
|
speed = adev->dma_mode - XFER_UDMA_0;
|
||||||
timing &= ~0x6000;
|
timing &= ~0xF000;
|
||||||
timing |= udma_bits[speed];
|
timing |= udma_bits[speed];
|
||||||
}
|
}
|
||||||
pci_write_config_word(pdev, drive_pci, timing);
|
pci_write_config_word(pdev, drive_pci, timing);
|
||||||
|
@ -405,22 +405,22 @@ static void sis_100_set_dmamode (struct ata_port *ap, struct ata_device *adev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
int speed = adev->dma_mode - XFER_MW_DMA_0;
|
int speed = adev->dma_mode - XFER_MW_DMA_0;
|
||||||
int drive_pci = sis_port_base(adev);
|
int drive_pci = sis_old_port_base(adev);
|
||||||
u16 timing;
|
u8 timing;
|
||||||
|
|
||||||
const u16 udma_bits[] = { 0x8B00, 0x8700, 0x8500, 0x8300, 0x8200, 0x8100};
|
const u8 udma_bits[] = { 0x8B, 0x87, 0x85, 0x83, 0x82, 0x81};
|
||||||
|
|
||||||
pci_read_config_word(pdev, drive_pci, &timing);
|
pci_read_config_byte(pdev, drive_pci + 1, &timing);
|
||||||
|
|
||||||
if (adev->dma_mode < XFER_UDMA_0) {
|
if (adev->dma_mode < XFER_UDMA_0) {
|
||||||
/* NOT SUPPORTED YET: NEED DATA SHEET. DITTO IN OLD DRIVER */
|
/* NOT SUPPORTED YET: NEED DATA SHEET. DITTO IN OLD DRIVER */
|
||||||
} else {
|
} else {
|
||||||
/* Bit 15 is UDMA on/off, bit 12-14 are cycle time */
|
/* Bit 7 is UDMA on/off, bit 0-3 are cycle time */
|
||||||
speed = adev->dma_mode - XFER_UDMA_0;
|
speed = adev->dma_mode - XFER_UDMA_0;
|
||||||
timing &= ~0x0F00;
|
timing &= ~0x8F;
|
||||||
timing |= udma_bits[speed];
|
timing |= udma_bits[speed];
|
||||||
}
|
}
|
||||||
pci_write_config_word(pdev, drive_pci, timing);
|
pci_write_config_byte(pdev, drive_pci + 1, timing);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -440,22 +440,22 @@ static void sis_133_early_set_dmamode (struct ata_port *ap, struct ata_device *a
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
int speed = adev->dma_mode - XFER_MW_DMA_0;
|
int speed = adev->dma_mode - XFER_MW_DMA_0;
|
||||||
int drive_pci = sis_port_base(adev);
|
int drive_pci = sis_old_port_base(adev);
|
||||||
u16 timing;
|
u8 timing;
|
||||||
|
/* Low 4 bits are timing */
|
||||||
|
static const u8 udma_bits[] = { 0x8F, 0x8A, 0x87, 0x85, 0x83, 0x82, 0x81};
|
||||||
|
|
||||||
static const u16 udma_bits[] = { 0x8F00, 0x8A00, 0x8700, 0x8500, 0x8300, 0x8200, 0x8100};
|
pci_read_config_byte(pdev, drive_pci + 1, &timing);
|
||||||
|
|
||||||
pci_read_config_word(pdev, drive_pci, &timing);
|
|
||||||
|
|
||||||
if (adev->dma_mode < XFER_UDMA_0) {
|
if (adev->dma_mode < XFER_UDMA_0) {
|
||||||
/* NOT SUPPORTED YET: NEED DATA SHEET. DITTO IN OLD DRIVER */
|
/* NOT SUPPORTED YET: NEED DATA SHEET. DITTO IN OLD DRIVER */
|
||||||
} else {
|
} else {
|
||||||
/* Bit 15 is UDMA on/off, bit 12-14 are cycle time */
|
/* Bit 7 is UDMA on/off, bit 0-3 are cycle time */
|
||||||
speed = adev->dma_mode - XFER_UDMA_0;
|
speed = adev->dma_mode - XFER_UDMA_0;
|
||||||
timing &= ~0x0F00;
|
timing &= ~0x8F;
|
||||||
timing |= udma_bits[speed];
|
timing |= udma_bits[speed];
|
||||||
}
|
}
|
||||||
pci_write_config_word(pdev, drive_pci, timing);
|
pci_write_config_byte(pdev, drive_pci + 1, timing);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -60,6 +60,7 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <scsi/scsi_host.h>
|
#include <scsi/scsi_host.h>
|
||||||
#include <linux/libata.h>
|
#include <linux/libata.h>
|
||||||
|
#include <linux/dmi.h>
|
||||||
|
|
||||||
#define DRV_NAME "pata_via"
|
#define DRV_NAME "pata_via"
|
||||||
#define DRV_VERSION "0.3.1"
|
#define DRV_VERSION "0.3.1"
|
||||||
|
@ -122,6 +123,31 @@ static const struct via_isa_bridge {
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Cable special cases
|
||||||
|
*/
|
||||||
|
|
||||||
|
static struct dmi_system_id cable_dmi_table[] = {
|
||||||
|
{
|
||||||
|
.ident = "Acer Ferrari 3400",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_BOARD_VENDOR, "Acer,Inc."),
|
||||||
|
DMI_MATCH(DMI_BOARD_NAME, "Ferrari 3400"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int via_cable_override(struct pci_dev *pdev)
|
||||||
|
{
|
||||||
|
/* Systems by DMI */
|
||||||
|
if (dmi_check_system(cable_dmi_table))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* via_cable_detect - cable detection
|
* via_cable_detect - cable detection
|
||||||
* @ap: ATA port
|
* @ap: ATA port
|
||||||
|
@ -139,6 +165,9 @@ static int via_cable_detect(struct ata_port *ap) {
|
||||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||||
u32 ata66;
|
u32 ata66;
|
||||||
|
|
||||||
|
if (via_cable_override(pdev))
|
||||||
|
return ATA_CBL_PATA40_SHORT;
|
||||||
|
|
||||||
/* Early chips are 40 wire */
|
/* Early chips are 40 wire */
|
||||||
if ((config->flags & VIA_UDMA) < VIA_UDMA_66)
|
if ((config->flags & VIA_UDMA) < VIA_UDMA_66)
|
||||||
return ATA_CBL_PATA40;
|
return ATA_CBL_PATA40;
|
||||||
|
|
Loading…
Reference in a new issue