Commit 928ce049 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://bart.bkbits.net/ide-2.6

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 7d9ace4c 997b00dd
......@@ -830,6 +830,13 @@ config BLK_DEV_IDE_RAPIDE
Say Y here if you want to support the Yellowstone RapIDE controller
manufactured for use with Acorn computers.
config BLK_DEV_IDE_BAST
tristate "Simtec BAST / Thorcom VR1000 IDE support"
depends on ARM && (ARCH_BAST || MACH_VR100)
help
Say Y here if you want to support the onboard IDE channels on the
Simtec BAST or the Thorcom VR1000
config BLK_DEV_GAYLE
bool "Amiga Gayle IDE interface support"
depends on AMIGA
......
obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o
obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o
obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o
EXTRA_CFLAGS := -Idrivers/ide
/* linux/drivers/ide/arm/bast-ide.c
*
* Copyright (c) 2003-2004 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <asm/mach-types.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/arch/map.h>
#include <asm/arch/bast-map.h>
#include <asm/arch/bast-irq.h>
/* list of registered interfaces */
static ide_hwif_t *ifs[2];
static int __init
bastide_register(unsigned int base, unsigned int aux, int irq,
ide_hwif_t **hwif)
{
hw_regs_t hw;
int i;
memset(&hw, 0, sizeof(hw));
base += BAST_IDE_CS;
aux += BAST_IDE_CS;
for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
hw.io_ports[i] = (unsigned long)base;
base += 0x20;
}
hw.io_ports[IDE_CONTROL_OFFSET] = aux + (6 * 0x20);
hw.irq = irq;
ide_register_hw(&hw, hwif);
return 0;
}
static int __init bastide_init(void)
{
/* we can treat the VR1000 and the BAST the same */
if (!(machine_is_bast() || machine_is_vr1000()))
return 0;
printk("BAST: IDE driver, (c) 2003-2004 Simtec Electronics\n");
bastide_register(BAST_VA_IDEPRI, BAST_VA_IDEPRIAUX, IRQ_IDE0, &ifs[0]);
bastide_register(BAST_VA_IDESEC, BAST_VA_IDESECAUX, IRQ_IDE1, &ifs[1]);
return 0;
}
module_init(bastide_init);
MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simtec BAST / Thorcom VR1000 IDE driver");
......@@ -389,15 +389,6 @@ static int try_to_identify (ide_drive_t *drive, u8 cmd)
*/
printk("%s: IRQ probe failed (0x%lx)\n",
drive->name, cookie);
#ifdef CONFIG_BLK_DEV_CMD640
#ifdef CMD640_DUMP_REGS
if (hwif->chipset == ide_cmd640) {
printk("%s: Hmmm.. probably a driver "
"problem.\n", drive->name);
CMD640_DUMP_REGS;
}
#endif /* CMD640_DUMP_REGS */
#endif /* CONFIG_BLK_DEV_CMD640 */
}
}
}
......
......@@ -361,26 +361,13 @@ static int proc_ide_read_identify
len = sprintf(page, "\n");
if (drive)
{
if (drive) {
unsigned short *val = (unsigned short *) page;
/*
* The current code can't handle a driverless
* identify query taskfile. Now the right fix is
* to add a 'default' driver but that is a bit
* more work.
*
* FIXME: this has to be fixed for hotswap devices
*/
BUG_ON(!drive->driver);
if(DRIVER(drive))
err = taskfile_lib_get_identify(drive, page);
else /* This relies on the ID changes */
val = (unsigned short *)drive->id;
if(!err)
{
if (!err) {
char *out = ((char *)page) + (SECTOR_WORDS * 4);
page = out;
do {
......
......@@ -103,30 +103,6 @@ int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf)
EXPORT_SYMBOL(taskfile_lib_get_identify);
#ifdef CONFIG_IDE_TASK_IOCTL_DEBUG
void debug_taskfile (ide_drive_t *drive, ide_task_t *args)
{
printk(KERN_INFO "%s: ", drive->name);
// printk("TF.0=x%02x ", args->tfRegister[IDE_DATA_OFFSET]);
printk("TF.1=x%02x ", args->tfRegister[IDE_FEATURE_OFFSET]);
printk("TF.2=x%02x ", args->tfRegister[IDE_NSECTOR_OFFSET]);
printk("TF.3=x%02x ", args->tfRegister[IDE_SECTOR_OFFSET]);
printk("TF.4=x%02x ", args->tfRegister[IDE_LCYL_OFFSET]);
printk("TF.5=x%02x ", args->tfRegister[IDE_HCYL_OFFSET]);
printk("TF.6=x%02x ", args->tfRegister[IDE_SELECT_OFFSET]);
printk("TF.7=x%02x\n", args->tfRegister[IDE_COMMAND_OFFSET]);
printk(KERN_INFO "%s: ", drive->name);
// printk("HTF.0=x%02x ", args->hobRegister[IDE_DATA_OFFSET]);
printk("HTF.1=x%02x ", args->hobRegister[IDE_FEATURE_OFFSET]);
printk("HTF.2=x%02x ", args->hobRegister[IDE_NSECTOR_OFFSET]);
printk("HTF.3=x%02x ", args->hobRegister[IDE_SECTOR_OFFSET]);
printk("HTF.4=x%02x ", args->hobRegister[IDE_LCYL_OFFSET]);
printk("HTF.5=x%02x ", args->hobRegister[IDE_HCYL_OFFSET]);
printk("HTF.6=x%02x ", args->hobRegister[IDE_SELECT_OFFSET]);
printk("HTF.7=x%02x\n", args->hobRegister[IDE_CONTROL_OFFSET_HOB]);
}
#endif /* CONFIG_IDE_TASK_IOCTL_DEBUG */
ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
{
ide_hwif_t *hwif = HWIF(drive);
......@@ -134,10 +110,6 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task)
hob_struct_t *hobfile = (hob_struct_t *) task->hobRegister;
u8 HIHI = (drive->addressing == 1) ? 0xE0 : 0xEF;
#ifdef CONFIG_IDE_TASK_IOCTL_DEBUG
void debug_taskfile(drive, task);
#endif /* CONFIG_IDE_TASK_IOCTL_DEBUG */
/* ALL Command Block Executions SHALL clear nIEN, unless otherwise */
if (IDE_CONTROL_REG) {
/* clear nIEN */
......@@ -853,11 +825,6 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
u8 status;
#endif
#ifdef CONFIG_IDE_TASK_IOCTL_DEBUG
void debug_taskfile(drive, task);
#endif /* CONFIG_IDE_TASK_IOCTL_DEBUG */
if (task->data_phase == TASKFILE_MULTI_IN ||
task->data_phase == TASKFILE_MULTI_OUT) {
if (!drive->mult_count) {
......
......@@ -29,8 +29,6 @@ static u8 aec62xx_proc = 0;
static struct pci_dev *aec_devs[AEC_MAX_DEVS];
static int n_aec_devs;
#undef DEBUG_AEC_REGS
static int aec62xx_get_info (char *buffer, char **addr, off_t offset, int count)
{
char *p = buffer;
......@@ -44,9 +42,6 @@ static int aec62xx_get_info (char *buffer, char **addr, off_t offset, int count)
struct pci_dev *dev = aec_devs[i];
unsigned long iobase = pci_resource_start(dev, 4);
u8 c0 = 0, c1 = 0, art = 0;
#ifdef DEBUG_AEC_REGS
u8 uart = 0;
#endif /* DEBUG_AEC_REGS */
c0 = inb(iobase + 0x02);
c1 = inb(iobase + 0x0a);
......@@ -83,24 +78,6 @@ static int aec62xx_get_info (char *buffer, char **addr, off_t offset, int count)
p += sprintf(p, " %s(%s)\n",
(c1&0x40)?((art&0xc0)?"UDMA":" DMA"):" PIO",
(art&0x80)?"2":(art&0x40)?"1":"0");
#ifdef DEBUG_AEC_REGS
(void) pci_read_config_byte(dev, 0x40, &art);
p += sprintf(p, "Active: 0x%02x", art);
(void) pci_read_config_byte(dev, 0x42, &art);
p += sprintf(p, " 0x%02x", art);
(void) pci_read_config_byte(dev, 0x44, &art);
p += sprintf(p, " 0x%02x", art);
(void) pci_read_config_byte(dev, 0x46, &art);
p += sprintf(p, " 0x%02x\n", art);
(void) pci_read_config_byte(dev, 0x41, &art);
p += sprintf(p, "Recovery: 0x%02x", art);
(void) pci_read_config_byte(dev, 0x43, &art);
p += sprintf(p, " 0x%02x", art);
(void) pci_read_config_byte(dev, 0x45, &art);
p += sprintf(p, " 0x%02x", art);
(void) pci_read_config_byte(dev, 0x47, &art);
p += sprintf(p, " 0x%02x\n", art);
#endif /* DEBUG_AEC_REGS */
} else {
/*
* case PCI_DEVICE_ID_ARTOP_ATP860:
......@@ -146,28 +123,6 @@ static int aec62xx_get_info (char *buffer, char **addr, off_t offset, int count)
((art&0x30)==0x30)?"2":
((art&0x20)==0x20)?"1":
((art&0x10)==0x10)?"0":"?");
#ifdef DEBUG_AEC_REGS
(void) pci_read_config_byte(dev, 0x40, &art);
p += sprintf(p, "Active: 0x%02x", HIGH_4(art));
(void) pci_read_config_byte(dev, 0x41, &art);
p += sprintf(p, " 0x%02x", HIGH_4(art));
(void) pci_read_config_byte(dev, 0x42, &art);
p += sprintf(p, " 0x%02x", HIGH_4(art));
(void) pci_read_config_byte(dev, 0x43, &art);
p += sprintf(p, " 0x%02x\n", HIGH_4(art));
(void) pci_read_config_byte(dev, 0x40, &art);
p += sprintf(p, "Recovery: 0x%02x", LOW_4(art));
(void) pci_read_config_byte(dev, 0x41, &art);
p += sprintf(p, " 0x%02x", LOW_4(art));
(void) pci_read_config_byte(dev, 0x42, &art);
p += sprintf(p, " 0x%02x", LOW_4(art));
(void) pci_read_config_byte(dev, 0x43, &art);
p += sprintf(p, " 0x%02x\n", LOW_4(art));
(void) pci_read_config_byte(dev, 0x49, &uart);
p += sprintf(p, "reg49h = 0x%02x ", uart);
(void) pci_read_config_byte(dev, 0x4a, &uart);
p += sprintf(p, "reg4ah = 0x%02x\n", uart);
#endif /* DEBUG_AEC_REGS */
}
}
/* p - buffer must be less than 4k! */
......@@ -240,6 +195,7 @@ static int aec6210_tune_chipset (ide_drive_t *drive, u8 xferspeed)
unsigned long flags;
local_irq_save(flags);
/* 0x40|(2*drive->dn): Active, 0x41|(2*drive->dn): Recovery */
pci_read_config_word(dev, 0x40|(2*drive->dn), &d_conf);
tmp0 = pci_bus_clock_list(speed, BUSCLOCK(dev));
SPLIT_BYTE(tmp0,tmp1,tmp2);
......@@ -268,6 +224,7 @@ static int aec6260_tune_chipset (ide_drive_t *drive, u8 xferspeed)
unsigned long flags;
local_irq_save(flags);
/* high 4-bits: Active, low 4-bits: Recovery */
pci_read_config_byte(dev, 0x40|drive->dn, &drive_conf);
drive_conf = pci_bus_clock_list(speed, BUSCLOCK(dev));
pci_write_config_byte(dev, 0x40|drive->dn, drive_conf);
......
......@@ -53,13 +53,6 @@ struct chipset_bus_clock_list_entry aec6xxx_34_base [] = {
{ 0, 0x00, 0x00 }
};
#ifndef HIGH_4
#define HIGH_4(H) ((H)=(H>>4))
#endif
#ifndef LOW_4
#define LOW_4(L) ((L)=(L-((L>>4)<<4)))
#endif
#ifndef SPLIT_BYTE
#define SPLIT_BYTE(B,H,L) ((H)=(B>>4), (L)=(B-((B>>4)<<4)))
#endif
......
......@@ -101,6 +101,8 @@
#undef REALLY_SLOW_IO /* most systems can safely undef this */
#define CMD640_PREFETCH_MASKS 1
//#define CMD640_DUMP_REGS
#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
......@@ -748,7 +750,7 @@ int __init ide_probe_for_cmd640x (void)
put_cmd640_reg(0x5b, 0);
#ifdef CMD640_DUMP_REGS
CMD640_DUMP_REGS;
cmd640_dump_regs();
#endif
/*
......@@ -870,7 +872,7 @@ int __init ide_probe_for_cmd640x (void)
}
#ifdef CMD640_DUMP_REGS
CMD640_DUMP_REGS;
cmd640_dump_regs();
#endif
return 1;
}
......
......@@ -561,36 +561,31 @@ static int piix_config_drive_xfer_rate (ide_drive_t *drive)
drive->init_speed = 0;
if ((id->capability & 1) && drive->autodma) {
/* Consult the list of known "bad" drives */
if (__ide_dma_bad_drive(drive))
goto fast_ata_pio;
if (id->field_valid & 4) {
if (id->dma_ultra & hwif->ultra_mask) {
/* Force if Capable UltraDMA */
if ((id->field_valid & 2) &&
(!piix_config_drive_for_dma(drive)))
goto try_dma_modes;
}
} else if (id->field_valid & 2) {
try_dma_modes:
if ((id->dma_mword & hwif->mwdma_mask) ||
(id->dma_1word & hwif->swdma_mask)) {
/* Force if Capable regular DMA modes */
if (!piix_config_drive_for_dma(drive))
goto no_dma_set;
/**
* Try to turn DMA on if:
* - UDMA or EIDE modes are supported or
* - drive is a known "good" drive
*
* Checks for best mode supported are down later by
* piix_config_drive_for_dma() -> ide_dma_speed()
*/
if ((id->field_valid & (4 | 2)) ||
(__ide_dma_good_drive(drive) && id->eide_dma_time < 150)) {
if (piix_config_drive_for_dma(drive))
return hwif->ide_dma_on(drive);
}
} else if (__ide_dma_good_drive(drive) &&
(id->eide_dma_time < 150)) {
/* Consult the list of known "good" drives */
if (!piix_config_drive_for_dma(drive))
goto no_dma_set;
} else {
/* For some reason DMA wasn't turned on, so try PIO. */
goto fast_ata_pio;
}
return hwif->ide_dma_on(drive);
} else if ((id->capability & 8) || (id->field_valid & 2)) {
fast_ata_pio:
no_dma_set:
/* Find best PIO mode. */
hwif->tuneproc(drive, 255);
return hwif->ide_dma_off_quietly(drive);
}
......
......@@ -41,57 +41,6 @@
#include <linux/ide.h>
#include <linux/init.h>
static struct pci_dev *triflex_dev;
#ifdef CONFIG_PROC_FS
static int triflex_get_info(char *buf, char **addr, off_t offset, int count)
{
char *p = buf;
int len;
struct pci_dev *dev = triflex_dev;
unsigned long bibma = pci_resource_start(dev, 4);
u8 c0 = 0, c1 = 0;
u32 pri_timing, sec_timing;
p += sprintf(p, "\n Compaq Triflex Chipset\n");
pci_read_config_dword(dev, 0x70, &pri_timing);
pci_read_config_dword(dev, 0x74, &sec_timing);
/*
* at that point bibma+0x2 et bibma+0xa are byte registers
* to investigate:
*/
c0 = inb((unsigned short)bibma + 0x02);
c1 = inb((unsigned short)bibma + 0x0a);
p += sprintf(p, "--------------- Primary Channel "
"---------------- Secondary Channel "
"-------------\n");
p += sprintf(p, " %sabled "
" %sabled\n",
(c0&0x80) ? "dis" : " en",
(c1&0x80) ? "dis" : " en");
p += sprintf(p, "--------------- drive0 --------- drive1 "
"-------- drive0 ---------- drive1 ------\n");
p += sprintf(p, "DMA enabled: %s %s "
" %s %s\n",
(c0&0x20) ? "yes" : "no ",
(c0&0x40) ? "yes" : "no ",
(c1&0x20) ? "yes" : "no ",
(c1&0x40) ? "yes" : "no " );
p += sprintf(p, "DMA\n");
p += sprintf(p, "PIO\n");
len = (p - buf) - offset;
*addr = buf + offset;
return len > count ? count : len;
}
#endif
static int triflex_tune_chipset(ide_drive_t *drive, u8 xferspeed)
{
ide_hwif_t *hwif = HWIF(drive);
......@@ -206,18 +155,8 @@ static void __init init_hwif_triflex(ide_hwif_t *hwif)
hwif->drives[1].autodma = hwif->autodma;
}
static unsigned int __init init_chipset_triflex(struct pci_dev *dev,
const char *name)
{
#ifdef CONFIG_PROC_FS
ide_pci_create_host_proc("triflex", triflex_get_info);
#endif
return 0;
}
static ide_pci_device_t triflex_device __devinitdata = {
.name = "TRIFLEX",
.init_chipset = init_chipset_triflex,
.init_hwif = init_hwif_triflex,
.channels = 2,
.autodma = AUTODMA,
......@@ -229,7 +168,6 @@ static int __devinit triflex_init_one(struct pci_dev *dev,
const struct pci_device_id *id)
{
ide_setup_pci_device(dev, &triflex_device);
triflex_dev = dev;
return 0;
}
......
......@@ -52,13 +52,6 @@
#define OK_TO_RESET_CONTROLLER 1 /* 0 for use with AH2372A/B interface */
#endif
#ifdef CONFIG_BLK_DEV_CMD640
#if 0 /* change to 1 when debugging cmd640 problems */
void cmd640_dump_regs (void);
#define CMD640_DUMP_REGS cmd640_dump_regs() /* for debugging cmd640 chipset */
#endif
#endif /* CONFIG_BLK_DEV_CMD640 */
#ifndef DISABLE_IRQ_NOSYNC
#define DISABLE_IRQ_NOSYNC 0
#endif
......
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