diff options
Diffstat (limited to 'drivers/ide/pci/hpt366.c')
-rw-r--r-- | drivers/ide/pci/hpt366.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index 4f8017ac9900..c33d0b0f11c9 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/ide/pci/hpt366.c Version 1.05 Jun 26, 2007 | 2 | * linux/drivers/ide/pci/hpt366.c Version 1.06 Jun 27, 2007 |
3 | * | 3 | * |
4 | * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> | 4 | * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> |
5 | * Portions Copyright (C) 2001 Sun Microsystems, Inc. | 5 | * Portions Copyright (C) 2001 Sun Microsystems, Inc. |
@@ -1514,18 +1514,28 @@ static int __devinit init_setup_hpt366(struct pci_dev *dev, ide_pci_device_t *d) | |||
1514 | goto init_single; | 1514 | goto init_single; |
1515 | 1515 | ||
1516 | /* | 1516 | /* |
1517 | * HPT36x chips are single channel and | 1517 | * HPT36x chips have one channel per function and have |
1518 | * do not seem to have the channel enable bit... | 1518 | * both channel enable bits located differently and visible |
1519 | * to both functions -- really stupid design decision... :-( | ||
1520 | * Bit 4 is for the primary channel, bit 5 for the secondary. | ||
1519 | */ | 1521 | */ |
1520 | d->channels = 1; | 1522 | d->channels = 1; |
1521 | d->enablebits[0].reg = 0; | 1523 | d->enablebits[0].mask = d->enablebits[0].val = 0x10; |
1522 | 1524 | ||
1523 | if ((dev2 = pci_get_slot(dev->bus, dev->devfn + 1)) != NULL) { | 1525 | if ((dev2 = pci_get_slot(dev->bus, dev->devfn + 1)) != NULL) { |
1524 | u8 pin1 = 0, pin2 = 0; | 1526 | u8 mcr1 = 0, pin1 = 0, pin2 = 0; |
1525 | int ret; | 1527 | int ret; |
1526 | 1528 | ||
1527 | pci_set_drvdata(dev2, info[rev]); | 1529 | pci_set_drvdata(dev2, info[rev]); |
1528 | 1530 | ||
1531 | /* | ||
1532 | * Now we'll have to force both channels enabled if | ||
1533 | * at least one of them has been enabled by BIOS... | ||
1534 | */ | ||
1535 | pci_read_config_byte(dev, 0x50, &mcr1); | ||
1536 | if (mcr1 & 0x30) | ||
1537 | pci_write_config_byte(dev, 0x50, mcr1 | 0x30); | ||
1538 | |||
1529 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin1); | 1539 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin1); |
1530 | pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin2); | 1540 | pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin2); |
1531 | if (pin1 != pin2 && dev->irq == dev2->irq) { | 1541 | if (pin1 != pin2 && dev->irq == dev2->irq) { |