diff options
author | Sergei Shtylyov <sshtylyov@ru.mvista.com> | 2007-07-03 16:28:35 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-07-03 16:28:35 -0400 |
commit | 96dcc08b0c6b730474469b10ed5eeda06e617deb (patch) | |
tree | 524e9bfe6800a7f6ce42d618d9c450359ac76da9 /drivers/ide/pci | |
parent | 783353b1d3d1ed3ae4a0bd4ea4557bd4d77aa04e (diff) |
hpt366: use correct enablebits for HPT36x
The HPT36x chips finally turned out to have the channel enable bits -- however,
badly implemented. Make use of them despite it's probably only going to burden
the driver's code -- assuming both channels are always enabled by the HighPoint
BIOS anyway...
Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Acked-by: Linas Vepstas <linas@austin.ibm.com>
Cc: michal.kepien@poczta.onet.pl
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/pci')
-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) { |