summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2004-10-29 00:14:20 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-10-29 00:14:20 -0700
commit4fd830f9c5fff95aef470db1513913a2efff5e4d (patch)
tree7d98497b93334f0f6ffc956da88c71d31910f720
parentb5d748ca0a00a7cf495d9a255625480dce9f267f (diff)
parenta45f698c0d8c7aaad5b5624a8b9900c9e3c28efc (diff)
Merge bk://bart.bkbits.net/ide-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
-rw-r--r--Documentation/ide.txt7
-rw-r--r--drivers/ide/Kconfig13
-rw-r--r--drivers/ide/ide-disk.c3
-rw-r--r--drivers/ide/ide-proc.c25
-rw-r--r--drivers/ide/ide-taskfile.c10
-rw-r--r--drivers/ide/ide.c9
-rw-r--r--drivers/ide/pci/cs5520.c2
-rw-r--r--drivers/ide/pci/cs5530.c1
-rw-r--r--drivers/ide/pci/hpt34x.c17
-rw-r--r--drivers/ide/pci/hpt34x.h29
-rw-r--r--drivers/ide/ppc/pmac.c7
-rw-r--r--drivers/ide/setup-pci.c56
-rw-r--r--include/linux/ide.h10
13 files changed, 55 insertions, 134 deletions
diff --git a/Documentation/ide.txt b/Documentation/ide.txt
index a1c34d3800c9..12c7a2fd6ef3 100644
--- a/Documentation/ide.txt
+++ b/Documentation/ide.txt
@@ -248,13 +248,6 @@ Summary of ide driver parameters for kernel command line
allowing ide-floppy, ide-tape, and ide-cdrom|writers
to use ide-scsi emulation on a device specific option.
- "hdx=stroke" : Should you have a system w/ an AWARD Bios and your
- drives are larger than 32GB and it will not boot,
- one is required to perform a few OEM operations first.
- The option is called "stroke" because it allows one
- to "soft clip" the drive to work around a barrier
- limit.
-
"idebus=xx" : inform IDE driver of VESA/PCI bus speed in MHz,
where "xx" is between 20 and 66 inclusive,
used when tuning chipset PIO modes.
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig
index c93671b0f665..cc5aeb202d52 100644
--- a/drivers/ide/Kconfig
+++ b/drivers/ide/Kconfig
@@ -772,17 +772,6 @@ config BLK_DEV_IDE_PMAC_BLINK
This option enables the use of the sleep LED as a hard drive
activity LED.
-config BLK_DEV_IDEDMA_PMAC_AUTO
- bool "Use DMA by default"
- depends on BLK_DEV_IDEDMA_PMAC
- help
- This option allows the driver for the built-in IDE controller on
- Power Macintoshes and PowerBooks to use DMA automatically, without
- it having to be explicitly enabled. This option is provided because
- of concerns about a couple of cases where using DMA on buggy PC
- hardware may have caused damage. Saying Y should be safe on all
- Apple machines.
-
config IDE_ARM
def_bool ARM && (ARCH_A5K || ARCH_CLPS7500 || ARCH_RPC || ARCH_SHARK)
@@ -1037,7 +1026,7 @@ config IDEDMA_IVB
It is normally safe to answer Y; however, the default is N.
config IDEDMA_AUTO
- def_bool IDEDMA_PCI_AUTO || BLK_DEV_IDEDMA_PMAC_AUTO || IDEDMA_ICS_AUTO
+ def_bool IDEDMA_PCI_AUTO || IDEDMA_ICS_AUTO
endif
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
index 043d2ede89e5..ae3834a88e65 100644
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
@@ -643,9 +643,6 @@ static inline void idedisk_check_hpa(ide_drive_t *drive)
capacity, sectors_to_MB(capacity),
set_max, sectors_to_MB(set_max));
- if (!drive->stroke)
- return;
-
if (lba48)
set_max = idedisk_set_max_address_ext(drive, set_max);
else
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c
index 1dabe2cbc4f2..b7066680694c 100644
--- a/drivers/ide/ide-proc.c
+++ b/drivers/ide/ide-proc.c
@@ -418,7 +418,7 @@ static void destroy_proc_ide_device(ide_hwif_t *hwif, ide_drive_t *drive)
}
}
-void destroy_proc_ide_drives(ide_hwif_t *hwif)
+static void destroy_proc_ide_drives(ide_hwif_t *hwif)
{
int d;
@@ -466,29 +466,30 @@ void ide_pci_create_host_proc(const char *name, get_info_t *get_info)
EXPORT_SYMBOL_GPL(ide_pci_create_host_proc);
#endif
-void destroy_proc_ide_interfaces(void)
+void destroy_proc_ide_interface(ide_hwif_t *hwif)
+{
+ if (hwif->proc) {
+ destroy_proc_ide_drives(hwif);
+ ide_remove_proc_entries(hwif->proc, hwif_entries);
+ remove_proc_entry(hwif->name, proc_ide_root);
+ hwif->proc = NULL;
+ }
+}
+
+static void destroy_proc_ide_interfaces(void)
{
int h;
for (h = 0; h < MAX_HWIFS; h++) {
ide_hwif_t *hwif = &ide_hwifs[h];
- int exist = (hwif->proc != NULL);
#if 0
if (!hwif->present)
continue;
#endif
- if (exist) {
- destroy_proc_ide_drives(hwif);
- ide_remove_proc_entries(hwif->proc, hwif_entries);
- remove_proc_entry(hwif->name, proc_ide_root);
- hwif->proc = NULL;
- } else
- continue;
+ destroy_proc_ide_interface(hwif);
}
}
-EXPORT_SYMBOL(destroy_proc_ide_interfaces);
-
extern struct seq_operations ide_drivers_op;
static int ide_drivers_open(struct inode *inode, struct file *file)
{
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index eadcb964a0db..8d742b8d080d 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -274,14 +274,20 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int write)
#ifdef CONFIG_HIGHMEM
unsigned long flags;
#endif
+ unsigned int offset;
u8 *buf;
page = sg[hwif->cursg].page;
+ offset = sg[hwif->cursg].offset + hwif->cursg_ofs * SECTOR_SIZE;
+
+ /* get the current page and offset */
+ page = nth_page(page, (offset >> PAGE_SHIFT));
+ offset %= PAGE_SIZE;
+
#ifdef CONFIG_HIGHMEM
local_irq_save(flags);
#endif
- buf = kmap_atomic(page, KM_BIO_SRC_IRQ) +
- sg[hwif->cursg].offset + (hwif->cursg_ofs * SECTOR_SIZE);
+ buf = kmap_atomic(page, KM_BIO_SRC_IRQ) + offset;
hwif->nleft--;
hwif->cursg_ofs++;
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 34ef6769162b..06905e963dde 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -796,9 +796,7 @@ void ide_unregister(unsigned int index)
DRIVER(drive)->cleanup(drive);
}
-#ifdef CONFIG_PROC_FS
- destroy_proc_ide_drives(hwif);
-#endif
+ destroy_proc_ide_interface(hwif);
hwgroup = hwif->hwgroup;
/*
@@ -1854,7 +1852,7 @@ int __init ide_setup (char *s)
if (s[0] == 'h' && s[1] == 'd' && s[2] >= 'a' && s[2] <= max_drive) {
const char *hd_words[] = {
"none", "noprobe", "nowerr", "cdrom", "serialize",
- "autotune", "noautotune", "stroke", "swapdata", "bswap",
+ "autotune", "noautotune", "minus8", "swapdata", "bswap",
"minus11", "remap", "remap63", "scsi", NULL };
unit = s[2] - 'a';
hw = unit / MAX_DRIVES;
@@ -1888,9 +1886,6 @@ int __init ide_setup (char *s)
case -7: /* "noautotune" */
drive->autotune = IDE_TUNE_NOAUTO;
goto done;
- case -8: /* stroke */
- drive->stroke = 1;
- goto done;
case -9: /* "swapdata" */
case -10: /* "bswap" */
drive->bswap = 1;
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c
index b8a092bd15c4..8f9de206c9e6 100644
--- a/drivers/ide/pci/cs5520.c
+++ b/drivers/ide/pci/cs5520.c
@@ -239,7 +239,7 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic
* do all the device setup for us
*/
- ide_pci_setup_ports(dev, d, 1, 14, &index);
+ ide_pci_setup_ports(dev, d, 14, &index);
printk("Index.b %d %d\n", index.b.low, index.b.high);
mdelay(2000);
diff --git a/drivers/ide/pci/cs5530.c b/drivers/ide/pci/cs5530.c
index 077ddf856969..0457a8ea0c38 100644
--- a/drivers/ide/pci/cs5530.c
+++ b/drivers/ide/pci/cs5530.c
@@ -353,7 +353,6 @@ static ide_pci_device_t cs5530_chipset __devinitdata = {
.channels = 2,
.autodma = AUTODMA,
.bootable = ON_BOARD,
- .flags = IDEPCI_FLAG_FORCE_MASTER,
};
static int __devinit cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id)
diff --git a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c
index 7da353a43f99..59abcf084465 100644
--- a/drivers/ide/pci/hpt34x.c
+++ b/drivers/ide/pci/hpt34x.c
@@ -42,7 +42,7 @@
#include <asm/io.h>
#include <asm/irq.h>
-#include "hpt34x.h"
+#define HPT343_DEBUG_DRIVE_INFO 0
static u8 hpt34x_ratemask (ide_drive_t *drive)
{
@@ -69,7 +69,8 @@ static int hpt34x_tune_chipset (ide_drive_t *drive, u8 xferspeed)
u32 reg1= 0, tmp1 = 0, reg2 = 0, tmp2 = 0;
u8 hi_speed, lo_speed;
- SPLIT_BYTE(speed, hi_speed, lo_speed);
+ hi_speed = speed >> 4;
+ lo_speed = speed & 0x0f;
if (hi_speed & 7) {
hi_speed = (hi_speed & 4) ? 0x01 : 0x10;
@@ -229,9 +230,19 @@ static void __devinit init_hwif_hpt34x(ide_hwif_t *hwif)
hwif->drives[1].autodma = hwif->autodma;
}
+static ide_pci_device_t hpt34x_chipset __devinitdata = {
+ .name = "HPT34X",
+ .init_chipset = init_chipset_hpt34x,
+ .init_hwif = init_hwif_hpt34x,
+ .channels = 2,
+ .autodma = NOAUTODMA,
+ .bootable = NEVER_BOARD,
+ .extra = 16
+};
+
static int __devinit hpt34x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{
- ide_pci_device_t *d = &hpt34x_chipsets[id->driver_data];
+ ide_pci_device_t *d = &hpt34x_chipset;
static char *chipset_names[] = {"HPT343", "HPT345"};
u16 pcicmd = 0;
diff --git a/drivers/ide/pci/hpt34x.h b/drivers/ide/pci/hpt34x.h
deleted file mode 100644
index d1a8400345d7..000000000000
--- a/drivers/ide/pci/hpt34x.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef HPT34X_H
-#define HPT34X_H
-
-#include <linux/config.h>
-#include <linux/pci.h>
-#include <linux/ide.h>
-
-#define HPT343_DEBUG_DRIVE_INFO 0
-
-#ifndef SPLIT_BYTE
-#define SPLIT_BYTE(B,H,L) ((H)=(B>>4), (L)=(B-((B>>4)<<4)))
-#endif
-
-static unsigned int init_chipset_hpt34x(struct pci_dev *, const char *);
-static void init_hwif_hpt34x(ide_hwif_t *);
-
-static ide_pci_device_t hpt34x_chipsets[] __devinitdata = {
- { /* 0 */
- .name = "HPT34X",
- .init_chipset = init_chipset_hpt34x,
- .init_hwif = init_hwif_hpt34x,
- .channels = 2,
- .autodma = NOAUTODMA,
- .bootable = NEVER_BOARD,
- .extra = 16
- }
-};
-
-#endif /* HPT34X_H */
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c
index 1387f9057550..fee8f4f9dc16 100644
--- a/drivers/ide/ppc/pmac.c
+++ b/drivers/ide/ppc/pmac.c
@@ -2028,13 +2028,6 @@ pmac_ide_setup_dma(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif)
hwif->ide_dma_timeout = &__ide_dma_timeout;
hwif->ide_dma_lostirq = &pmac_ide_dma_lostirq;
-#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC_AUTO
- if (!noautodma)
- hwif->autodma = 1;
-#endif
- hwif->drives[0].autodma = hwif->autodma;
- hwif->drives[1].autodma = hwif->autodma;
-
hwif->atapi_dma = 1;
switch(pmif->kind) {
case controller_un_ata6:
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c
index b485e6b706c8..062340987ec3 100644
--- a/drivers/ide/setup-pci.c
+++ b/drivers/ide/setup-pci.c
@@ -185,19 +185,16 @@ static unsigned long ide_get_or_set_dma_base (ide_hwif_t *hwif)
second_chance_to_dma:
#endif /* CONFIG_BLK_DEV_IDEDMA_FORCED */
- if ((hwif->mmio) && (hwif->dma_base))
+ if (hwif->mmio)
return hwif->dma_base;
if (hwif->mate && hwif->mate->dma_base) {
dma_base = hwif->mate->dma_base - (hwif->channel ? 0 : 8);
} else {
- dma_base = (hwif->mmio) ?
- ((unsigned long) hwif->hwif_data) :
- (pci_resource_start(dev, 4));
+ dma_base = pci_resource_start(dev, 4);
if (!dma_base) {
- printk(KERN_ERR "%s: dma_base is invalid (0x%04lx)\n",
- hwif->cds->name, dma_base);
- dma_base = 0;
+ printk(KERN_ERR "%s: dma_base is invalid\n",
+ hwif->cds->name);
}
}
@@ -251,7 +248,6 @@ second_chance_to_dma:
simplex_stat = hwif->INB(dma_base + 2);
if (simplex_stat & 0x80) {
/* simplex device? */
-#if 0
/*
* At this point we haven't probed the drives so we can't make the
* appropriate decision. Really we should defer this problem
@@ -259,18 +255,7 @@ second_chance_to_dma:
* to be the DMA end. This has to be become dynamic to handle hot
* plug.
*/
- /* Don't enable DMA on a simplex channel with no drives */
- if (!hwif->drives[0].present && !hwif->drives[1].present)
- {
- printk(KERN_INFO "%s: simplex device with no drives: DMA disabled\n",
- hwif->cds->name);
- dma_base = 0;
- }
- /* If our other channel has DMA then we cannot */
- else
-#endif
- if(hwif->mate && hwif->mate->dma_base)
- {
+ if (hwif->mate && hwif->mate->dma_base) {
printk(KERN_INFO "%s: simplex device: "
"DMA disabled\n",
hwif->cds->name);
@@ -488,13 +473,8 @@ static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwi
* Set up BM-DMA capability
* (PnP BIOS should have done this)
*/
- if ((d->flags & IDEPCI_FLAG_FORCE_MASTER) == 0) {
- /*
- * default DMA off if we had to
- * configure it here
- */
- hwif->autodma = 0;
- }
+ /* default DMA off if we had to configure it here */
+ hwif->autodma = 0;
pci_set_master(dev);
if (pci_read_config_word(dev, PCI_COMMAND, &pcicmd) || !(pcicmd & PCI_COMMAND_MASTER)) {
printk(KERN_ERR "%s: %s error updating PCICMD\n",
@@ -530,13 +510,9 @@ static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwi
static int ide_setup_pci_controller(struct pci_dev *dev, ide_pci_device_t *d, int noisy, int *config)
{
- int ret = 0;
u32 class_rev;
u16 pcicmd;
- if (!noautodma)
- ret = 1;
-
if (noisy)
ide_setup_pci_noise(dev, d);
@@ -550,8 +526,6 @@ static int ide_setup_pci_controller(struct pci_dev *dev, ide_pci_device_t *d, in
if (!(pcicmd & PCI_COMMAND_IO)) { /* is device disabled? */
if (ide_pci_configure(dev, d))
return -ENODEV;
- /* default DMA off if we had to configure it here */
- ret = 0;
*config = 1;
printk(KERN_INFO "%s: device enabled (Linux)\n", d->name);
}
@@ -560,14 +534,13 @@ static int ide_setup_pci_controller(struct pci_dev *dev, ide_pci_device_t *d, in
class_rev &= 0xff;
if (noisy)
printk(KERN_INFO "%s: chipset revision %d\n", d->name, class_rev);
- return ret;
+ return 0;
}
/**
* ide_pci_setup_ports - configure ports/devices on PCI IDE
* @dev: PCI device
* @d: IDE pci device info
- * @autodma: Should we enable DMA
* @pciirq: IRQ line
* @index: ata index to update
*
@@ -580,7 +553,7 @@ static int ide_setup_pci_controller(struct pci_dev *dev, ide_pci_device_t *d, in
* where the chipset setup is not the default PCI IDE one.
*/
-void ide_pci_setup_ports(struct pci_dev *dev, ide_pci_device_t *d, int autodma, int pciirq, ata_index_t *index)
+void ide_pci_setup_ports(struct pci_dev *dev, ide_pci_device_t *d, int pciirq, ata_index_t *index)
{
int port;
int at_least_one_hwif_enabled = 0;
@@ -634,11 +607,7 @@ controller_ok:
if (d->autodma == NODMA)
goto bypass_legacy_dma;
- if (d->autodma == NOAUTODMA)
- autodma = 0;
- if (autodma)
- hwif->autodma = 1;
-
+
if(d->init_setup_dma)
d->init_setup_dma(dev, d, hwif);
else
@@ -671,12 +640,11 @@ EXPORT_SYMBOL_GPL(ide_pci_setup_ports);
*/
static ata_index_t do_ide_setup_pci_device (struct pci_dev *dev, ide_pci_device_t *d, u8 noisy)
{
- int autodma = 0;
int pciirq = 0;
int tried_config = 0;
ata_index_t index = { .b = { .low = 0xff, .high = 0xff } };
- if((autodma = ide_setup_pci_controller(dev, d, noisy, &tried_config)) < 0)
+ if (ide_setup_pci_controller(dev, d, noisy, &tried_config) < 0)
return index;
/*
@@ -724,7 +692,7 @@ static ata_index_t do_ide_setup_pci_device (struct pci_dev *dev, ide_pci_device_
if(pciirq < 0) /* Error not an IRQ */
return index;
- ide_pci_setup_ports(dev, d, autodma, pciirq, &index);
+ ide_pci_setup_ports(dev, d, pciirq, &index);
return index;
}
diff --git a/include/linux/ide.h b/include/linux/ide.h
index f4aad8403cd7..7c6dd0994a20 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -739,7 +739,6 @@ typedef struct ide_drive_s {
unsigned remap_0_to_1 : 1; /* 0=noremap, 1=remap 0->1 (for EZDrive) */
unsigned blocked : 1; /* 1=powermanagment told us not to do anything, so sleep nicely */
unsigned vdma : 1; /* 1=doing PIO over DMA 0=doing normal DMA */
- unsigned stroke : 1; /* from: hdx=stroke */
unsigned addressing; /* : 3;
* 0=28-bit
* 1=48-bit
@@ -1045,8 +1044,8 @@ extern struct proc_dir_entry *proc_ide_root;
extern void proc_ide_create(void);
extern void proc_ide_destroy(void);
-extern void destroy_proc_ide_drives(ide_hwif_t *);
extern void create_proc_ide_interfaces(void);
+void destroy_proc_ide_interface(ide_hwif_t *);
extern void ide_add_proc_entries(struct proc_dir_entry *, ide_proc_entry_t *, void *);
extern void ide_remove_proc_entries(struct proc_dir_entry *, ide_proc_entry_t *);
read_proc_t proc_ide_read_capacity;
@@ -1073,6 +1072,7 @@ void ide_pci_create_host_proc(const char *, get_info_t *);
}
#else
static inline void create_proc_ide_interfaces(void) { ; }
+static inline void destroy_proc_ide_interface(ide_hwif_t *hwif) { ; }
#define PROC_IDE_READ_RETURN(page,start,off,count,eof,len) return 0;
#endif
@@ -1417,7 +1417,7 @@ extern int ideprobe_init(void);
extern void ide_scan_pcibus(int scan_direction) __init;
extern int ide_pci_register_driver(struct pci_driver *driver);
extern void ide_pci_unregister_driver(struct pci_driver *driver);
-extern void ide_pci_setup_ports(struct pci_dev *dev, struct ide_pci_device_s *d, int autodma, int pciirq, ata_index_t *index);
+void ide_pci_setup_ports(struct pci_dev *, struct ide_pci_device_s *, int, ata_index_t *);
extern void ide_setup_pci_noise (struct pci_dev *dev, struct ide_pci_device_s *d);
extern void default_hwif_iops(ide_hwif_t *);
@@ -1452,9 +1452,7 @@ typedef struct ide_pci_enablebit_s {
enum {
/* Uses ISA control ports not PCI ones. */
IDEPCI_FLAG_ISA_PORTS = (1 << 0),
-
- IDEPCI_FLAG_FORCE_MASTER = (1 << 1),
- IDEPCI_FLAG_FORCE_PDC = (1 << 2),
+ IDEPCI_FLAG_FORCE_PDC = (1 << 1),
};
typedef struct ide_pci_device_s {