diff options
| author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-10-29 00:14:20 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-10-29 00:14:20 -0700 |
| commit | 4fd830f9c5fff95aef470db1513913a2efff5e4d (patch) | |
| tree | 7d98497b93334f0f6ffc956da88c71d31910f720 | |
| parent | b5d748ca0a00a7cf495d9a255625480dce9f267f (diff) | |
| parent | a45f698c0d8c7aaad5b5624a8b9900c9e3c28efc (diff) | |
Merge bk://bart.bkbits.net/ide-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
| -rw-r--r-- | Documentation/ide.txt | 7 | ||||
| -rw-r--r-- | drivers/ide/Kconfig | 13 | ||||
| -rw-r--r-- | drivers/ide/ide-disk.c | 3 | ||||
| -rw-r--r-- | drivers/ide/ide-proc.c | 25 | ||||
| -rw-r--r-- | drivers/ide/ide-taskfile.c | 10 | ||||
| -rw-r--r-- | drivers/ide/ide.c | 9 | ||||
| -rw-r--r-- | drivers/ide/pci/cs5520.c | 2 | ||||
| -rw-r--r-- | drivers/ide/pci/cs5530.c | 1 | ||||
| -rw-r--r-- | drivers/ide/pci/hpt34x.c | 17 | ||||
| -rw-r--r-- | drivers/ide/pci/hpt34x.h | 29 | ||||
| -rw-r--r-- | drivers/ide/ppc/pmac.c | 7 | ||||
| -rw-r--r-- | drivers/ide/setup-pci.c | 56 | ||||
| -rw-r--r-- | include/linux/ide.h | 10 |
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 { |
