Commit 6cc556b6 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://gkernel.bkbits.net/libata-2.5

into ppc970.osdl.org:/home/torvalds/v2.5/linux
parents 0b2bfc7d 4cb629dd
...@@ -28,12 +28,13 @@ ...@@ -28,12 +28,13 @@
#include <linux/libata.h> #include <linux/libata.h>
#define DRV_NAME "ata_piix" #define DRV_NAME "ata_piix"
#define DRV_VERSION "1.00" #define DRV_VERSION "1.01"
enum { enum {
PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ PIIX_IOCFG = 0x54, /* IDE I/O configuration register */
ICH5_PCS = 0x92, /* port control and status */ ICH5_PCS = 0x92, /* port control and status */
PIIX_FLAG_CHECKINTR = (1 << 29), /* make sure PCI INTx enabled */
PIIX_FLAG_COMBINED = (1 << 30), /* combined mode possible */ PIIX_FLAG_COMBINED = (1 << 30), /* combined mode possible */
PIIX_COMB_PRI = (1 << 0), /* combined mode, PATA primary */ PIIX_COMB_PRI = (1 << 0), /* combined mode, PATA primary */
...@@ -163,7 +164,8 @@ static struct ata_port_info piix_port_info[] = { ...@@ -163,7 +164,8 @@ static struct ata_port_info piix_port_info[] = {
/* ich5_pata */ /* ich5_pata */
{ {
.sht = &piix_sht, .sht = &piix_sht,
.host_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST, .host_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST |
PIIX_FLAG_CHECKINTR,
.pio_mask = 0x03, /* pio3-4 */ .pio_mask = 0x03, /* pio3-4 */
.udma_mask = ATA_UDMA_MASK_40C, /* FIXME: cbl det */ .udma_mask = ATA_UDMA_MASK_40C, /* FIXME: cbl det */
.port_ops = &piix_pata_ops, .port_ops = &piix_pata_ops,
...@@ -172,8 +174,8 @@ static struct ata_port_info piix_port_info[] = { ...@@ -172,8 +174,8 @@ static struct ata_port_info piix_port_info[] = {
/* ich5_sata */ /* ich5_sata */
{ {
.sht = &piix_sht, .sht = &piix_sht,
.host_flags = ATA_FLAG_SATA | PIIX_FLAG_COMBINED | .host_flags = ATA_FLAG_SATA | ATA_FLAG_SRST |
ATA_FLAG_SRST, PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR,
.pio_mask = 0x03, /* pio3-4 */ .pio_mask = 0x03, /* pio3-4 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */ .udma_mask = 0x7f, /* udma0-6 ; FIXME */
.port_ops = &piix_sata_ops, .port_ops = &piix_sata_ops,
...@@ -518,6 +520,18 @@ static void piix_probe_combined (struct pci_dev *pdev, unsigned int *mask) ...@@ -518,6 +520,18 @@ static void piix_probe_combined (struct pci_dev *pdev, unsigned int *mask)
*mask |= PIIX_COMB_PRI; *mask |= PIIX_COMB_PRI;
} }
/* move to PCI layer, integrate w/ MSI stuff */
static void pci_enable_intx(struct pci_dev *pdev)
{
u16 pci_command;
pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
if (pci_command & PCI_COMMAND_INTX_DISABLE) {
pci_command &= ~PCI_COMMAND_INTX_DISABLE;
pci_write_config_word(pdev, PCI_COMMAND, pci_command);
}
}
/** /**
* piix_init_one - Register PIIX ATA PCI device with kernel services * piix_init_one - Register PIIX ATA PCI device with kernel services
* @pdev: PCI device to register * @pdev: PCI device to register
...@@ -552,6 +566,15 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -552,6 +566,15 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
if (port_info[0]->host_flags & PIIX_FLAG_COMBINED) if (port_info[0]->host_flags & PIIX_FLAG_COMBINED)
piix_probe_combined(pdev, &combined); piix_probe_combined(pdev, &combined);
/* On ICH5, some BIOSen disable the interrupt using the
* PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3.
* On ICH6, this bit has the same effect, but only when
* MSI is disabled (and it is disabled, as we don't use
* message-signalled interrupts currently).
*/
if (port_info[0]->host_flags & PIIX_FLAG_CHECKINTR)
pci_enable_intx(pdev);
if (combined & PIIX_COMB_PRI) if (combined & PIIX_COMB_PRI)
sata_comb = 1; sata_comb = 1;
else if (combined & PIIX_COMB_SEC) else if (combined & PIIX_COMB_SEC)
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/suspend.h>
#include <scsi/scsi.h> #include <scsi/scsi.h>
#include "scsi.h" #include "scsi.h"
#include "hosts.h" #include "hosts.h"
...@@ -2600,6 +2601,10 @@ static int ata_thread (void *data) ...@@ -2600,6 +2601,10 @@ static int ata_thread (void *data)
if (signal_pending (current)) if (signal_pending (current))
flush_signals(current); flush_signals(current);
if (current->flags & PF_FREEZE)
refrigerator(PF_IOTHREAD);
if ((timeout < 0) || (ap->time_to_die)) if ((timeout < 0) || (ap->time_to_die))
break; break;
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include <asm/io.h> #include <asm/io.h>
#define DRV_NAME "sata_promise" #define DRV_NAME "sata_promise"
#define DRV_VERSION "0.90" #define DRV_VERSION "0.91"
enum { enum {
...@@ -1014,6 +1014,14 @@ static void pdc_eng_timeout(struct ata_port *ap) ...@@ -1014,6 +1014,14 @@ static void pdc_eng_timeout(struct ata_port *ap)
goto out; goto out;
} }
/* hack alert! We cannot use the supplied completion
* function from inside the ->eh_strategy_handler() thread.
* libata is the only user of ->eh_strategy_handler() in
* any kernel, so the default scsi_done() assumes it is
* not being called from the SCSI EH.
*/
qc->scsidone = scsi_finish_command;
switch (qc->tf.protocol) { switch (qc->tf.protocol) {
case ATA_PROT_DMA_READ: case ATA_PROT_DMA_READ:
case ATA_PROT_DMA_WRITE: case ATA_PROT_DMA_WRITE:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment