diff options
| -rw-r--r-- | drivers/ide/Kconfig | 9 | ||||
| -rw-r--r-- | drivers/ide/ide-floppy.c | 6 | ||||
| -rw-r--r-- | drivers/ide/ide-iops.c | 6 | ||||
| -rw-r--r-- | drivers/ide/ide-taskfile.c | 2 | ||||
| -rw-r--r-- | drivers/ide/ide.c | 1 | ||||
| -rw-r--r-- | drivers/ide/legacy/ide-cs.c | 7 | ||||
| -rw-r--r-- | drivers/ide/pci/Makefile | 1 | ||||
| -rw-r--r-- | drivers/ide/pci/amd74xx.c | 3 | ||||
| -rw-r--r-- | drivers/ide/pci/cs5535.c | 305 | ||||
| -rw-r--r-- | drivers/ide/pci/cy82c693.c | 2 | ||||
| -rw-r--r-- | drivers/ide/pci/siimage.c | 9 | ||||
| -rw-r--r-- | drivers/scsi/ide-scsi.c | 5 | ||||
| -rw-r--r-- | include/asm-alpha/ide.h | 4 | ||||
| -rw-r--r-- | include/asm-i386/ide.h | 6 | ||||
| -rw-r--r-- | include/asm-sh/ide.h | 4 | ||||
| -rw-r--r-- | include/asm-sh64/ide.h | 4 | ||||
| -rw-r--r-- | include/linux/ide.h | 5 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 3 |
18 files changed, 352 insertions, 30 deletions
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index a737886e39d1..42e5b8175cbf 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -539,6 +539,15 @@ config BLK_DEV_CS5530 | |||
| 539 | 539 | ||
| 540 | It is safe to say Y to this question. | 540 | It is safe to say Y to this question. |
| 541 | 541 | ||
| 542 | config BLK_DEV_CS5535 | ||
| 543 | tristate "AMD CS5535 chipset support" | ||
| 544 | depends on X86 && !X86_64 | ||
| 545 | help | ||
| 546 | Include support for UDMA on the NSC/AMD CS5535 companion chipset. | ||
| 547 | This will automatically be detected and configured if found. | ||
| 548 | |||
| 549 | It is safe to say Y to this question. | ||
| 550 | |||
| 542 | config BLK_DEV_HPT34X | 551 | config BLK_DEV_HPT34X |
| 543 | tristate "HPT34X chipset support" | 552 | tristate "HPT34X chipset support" |
| 544 | help | 553 | help |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index e83f54d37f96..f615ab759962 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
| @@ -2038,11 +2038,9 @@ static int idefloppy_ioctl(struct inode *inode, struct file *file, | |||
| 2038 | struct ide_floppy_obj *floppy = ide_floppy_g(bdev->bd_disk); | 2038 | struct ide_floppy_obj *floppy = ide_floppy_g(bdev->bd_disk); |
| 2039 | ide_drive_t *drive = floppy->drive; | 2039 | ide_drive_t *drive = floppy->drive; |
| 2040 | void __user *argp = (void __user *)arg; | 2040 | void __user *argp = (void __user *)arg; |
| 2041 | int err = generic_ide_ioctl(drive, file, bdev, cmd, arg); | 2041 | int err; |
| 2042 | int prevent = (arg) ? 1 : 0; | 2042 | int prevent = (arg) ? 1 : 0; |
| 2043 | idefloppy_pc_t pc; | 2043 | idefloppy_pc_t pc; |
| 2044 | if (err != -EINVAL) | ||
| 2045 | return err; | ||
| 2046 | 2044 | ||
| 2047 | switch (cmd) { | 2045 | switch (cmd) { |
| 2048 | case CDROMEJECT: | 2046 | case CDROMEJECT: |
| @@ -2094,7 +2092,7 @@ static int idefloppy_ioctl(struct inode *inode, struct file *file, | |||
| 2094 | case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS: | 2092 | case IDEFLOPPY_IOCTL_FORMAT_GET_PROGRESS: |
| 2095 | return idefloppy_get_format_progress(drive, argp); | 2093 | return idefloppy_get_format_progress(drive, argp); |
| 2096 | } | 2094 | } |
| 2097 | return -EINVAL; | 2095 | return generic_ide_ioctl(drive, file, bdev, cmd, arg); |
| 2098 | } | 2096 | } |
| 2099 | 2097 | ||
| 2100 | static int idefloppy_media_changed(struct gendisk *disk) | 2098 | static int idefloppy_media_changed(struct gendisk *disk) |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 0b0aa4f51628..af7af958ab3e 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
| @@ -104,8 +104,6 @@ void default_hwif_iops (ide_hwif_t *hwif) | |||
| 104 | hwif->INSL = ide_insl; | 104 | hwif->INSL = ide_insl; |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | EXPORT_SYMBOL(default_hwif_iops); | ||
| 108 | |||
| 109 | /* | 107 | /* |
| 110 | * MMIO operations, typically used for SATA controllers | 108 | * MMIO operations, typically used for SATA controllers |
| 111 | */ | 109 | */ |
| @@ -329,8 +327,6 @@ void default_hwif_transport(ide_hwif_t *hwif) | |||
| 329 | hwif->atapi_output_bytes = atapi_output_bytes; | 327 | hwif->atapi_output_bytes = atapi_output_bytes; |
| 330 | } | 328 | } |
| 331 | 329 | ||
| 332 | EXPORT_SYMBOL(default_hwif_transport); | ||
| 333 | |||
| 334 | /* | 330 | /* |
| 335 | * Beginning of Taskfile OPCODE Library and feature sets. | 331 | * Beginning of Taskfile OPCODE Library and feature sets. |
| 336 | */ | 332 | */ |
| @@ -529,8 +525,6 @@ int wait_for_ready (ide_drive_t *drive, int timeout) | |||
| 529 | return 0; | 525 | return 0; |
| 530 | } | 526 | } |
| 531 | 527 | ||
| 532 | EXPORT_SYMBOL(wait_for_ready); | ||
| 533 | |||
| 534 | /* | 528 | /* |
| 535 | * This routine busy-waits for the drive status to be not "busy". | 529 | * This routine busy-waits for the drive status to be not "busy". |
| 536 | * It then checks the status for all of the "good" bits and none | 530 | * It then checks the status for all of the "good" bits and none |
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 7ec18fa3b5ff..54f9639c2a8c 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
| @@ -161,8 +161,6 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
| 161 | return ide_stopped; | 161 | return ide_stopped; |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | EXPORT_SYMBOL(do_rw_taskfile); | ||
| 165 | |||
| 166 | /* | 164 | /* |
| 167 | * set_multmode_intr() is invoked on completion of a WIN_SETMULT cmd. | 165 | * set_multmode_intr() is invoked on completion of a WIN_SETMULT cmd. |
| 168 | */ | 166 | */ |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 9fe19808d815..8af179b531c3 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
| @@ -803,6 +803,7 @@ found: | |||
| 803 | hwif->irq = hw->irq; | 803 | hwif->irq = hw->irq; |
| 804 | hwif->noprobe = 0; | 804 | hwif->noprobe = 0; |
| 805 | hwif->chipset = hw->chipset; | 805 | hwif->chipset = hw->chipset; |
| 806 | hwif->gendev.parent = hw->dev; | ||
| 806 | 807 | ||
| 807 | if (!initializing) { | 808 | if (!initializing) { |
| 808 | probe_hwif_init_with_fixup(hwif, fixup); | 809 | probe_hwif_init_with_fixup(hwif, fixup); |
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index 1dafffa7e513..ef79805218e4 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
| @@ -182,13 +182,14 @@ static void ide_detach(dev_link_t *link) | |||
| 182 | 182 | ||
| 183 | } /* ide_detach */ | 183 | } /* ide_detach */ |
| 184 | 184 | ||
| 185 | static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq) | 185 | static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle) |
| 186 | { | 186 | { |
| 187 | hw_regs_t hw; | 187 | hw_regs_t hw; |
| 188 | memset(&hw, 0, sizeof(hw)); | 188 | memset(&hw, 0, sizeof(hw)); |
| 189 | ide_init_hwif_ports(&hw, io, ctl, NULL); | 189 | ide_init_hwif_ports(&hw, io, ctl, NULL); |
| 190 | hw.irq = irq; | 190 | hw.irq = irq; |
| 191 | hw.chipset = ide_pci; | 191 | hw.chipset = ide_pci; |
| 192 | hw.dev = &handle->dev; | ||
| 192 | return ide_register_hw_with_fixup(&hw, NULL, ide_undecoded_slave); | 193 | return ide_register_hw_with_fixup(&hw, NULL, ide_undecoded_slave); |
| 193 | } | 194 | } |
| 194 | 195 | ||
| @@ -327,12 +328,12 @@ static void ide_config(dev_link_t *link) | |||
| 327 | 328 | ||
| 328 | /* retry registration in case device is still spinning up */ | 329 | /* retry registration in case device is still spinning up */ |
| 329 | for (hd = -1, i = 0; i < 10; i++) { | 330 | for (hd = -1, i = 0; i < 10; i++) { |
| 330 | hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ); | 331 | hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, handle); |
| 331 | if (hd >= 0) break; | 332 | if (hd >= 0) break; |
| 332 | if (link->io.NumPorts1 == 0x20) { | 333 | if (link->io.NumPorts1 == 0x20) { |
| 333 | outb(0x02, ctl_base + 0x10); | 334 | outb(0x02, ctl_base + 0x10); |
| 334 | hd = idecs_register(io_base + 0x10, ctl_base + 0x10, | 335 | hd = idecs_register(io_base + 0x10, ctl_base + 0x10, |
| 335 | link->irq.AssignedIRQ); | 336 | link->irq.AssignedIRQ, handle); |
| 336 | if (hd >= 0) { | 337 | if (hd >= 0) { |
| 337 | io_base += 0x10; | 338 | io_base += 0x10; |
| 338 | ctl_base += 0x10; | 339 | ctl_base += 0x10; |
diff --git a/drivers/ide/pci/Makefile b/drivers/ide/pci/Makefile index af46226c1796..f35d684edc25 100644 --- a/drivers/ide/pci/Makefile +++ b/drivers/ide/pci/Makefile | |||
| @@ -6,6 +6,7 @@ obj-$(CONFIG_BLK_DEV_ATIIXP) += atiixp.o | |||
| 6 | obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o | 6 | obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o |
| 7 | obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o | 7 | obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o |
| 8 | obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o | 8 | obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o |
| 9 | obj-$(CONFIG_BLK_DEV_CS5535) += cs5535.o | ||
| 9 | obj-$(CONFIG_BLK_DEV_SC1200) += sc1200.o | 10 | obj-$(CONFIG_BLK_DEV_SC1200) += sc1200.o |
| 10 | obj-$(CONFIG_BLK_DEV_CY82C693) += cy82c693.o | 11 | obj-$(CONFIG_BLK_DEV_CY82C693) += cy82c693.o |
| 11 | obj-$(CONFIG_BLK_DEV_HPT34X) += hpt34x.o | 12 | obj-$(CONFIG_BLK_DEV_HPT34X) += hpt34x.o |
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c index 844a6c9fb949..21965e5ef25e 100644 --- a/drivers/ide/pci/amd74xx.c +++ b/drivers/ide/pci/amd74xx.c | |||
| @@ -74,6 +74,7 @@ static struct amd_ide_chip { | |||
| 74 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, 0x50, AMD_UDMA_133 }, | 74 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, 0x50, AMD_UDMA_133 }, |
| 75 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, 0x50, AMD_UDMA_133 }, | 75 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, 0x50, AMD_UDMA_133 }, |
| 76 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, 0x50, AMD_UDMA_133 }, | 76 | { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, 0x50, AMD_UDMA_133 }, |
| 77 | { PCI_DEVICE_ID_AMD_CS5536_IDE, 0x40, AMD_UDMA_100 }, | ||
| 77 | { 0 } | 78 | { 0 } |
| 78 | }; | 79 | }; |
| 79 | 80 | ||
| @@ -491,6 +492,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { | |||
| 491 | /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"), | 492 | /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"), |
| 492 | /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"), | 493 | /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"), |
| 493 | /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"), | 494 | /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"), |
| 495 | /* 17 */ DECLARE_AMD_DEV("AMD5536"), | ||
| 494 | }; | 496 | }; |
| 495 | 497 | ||
| 496 | static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) | 498 | static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id) |
| @@ -527,6 +529,7 @@ static struct pci_device_id amd74xx_pci_tbl[] = { | |||
| 527 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 }, | 529 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 }, |
| 528 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 }, | 530 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 }, |
| 529 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 }, | 531 | { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 }, |
| 532 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_IDE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 }, | ||
| 530 | { 0, }, | 533 | { 0, }, |
| 531 | }; | 534 | }; |
| 532 | MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); | 535 | MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl); |
diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c new file mode 100644 index 000000000000..6eb305197f3c --- /dev/null +++ b/drivers/ide/pci/cs5535.c | |||
| @@ -0,0 +1,305 @@ | |||
| 1 | /* | ||
| 2 | * linux/drivers/ide/pci/cs5535.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 2004-2005 Advanced Micro Devices, Inc. | ||
| 5 | * | ||
| 6 | * History: | ||
| 7 | * 09/20/2005 - Jaya Kumar <jayakumar.ide@gmail.com> | ||
| 8 | * - Reworked tuneproc, set_drive, misc mods to prep for mainline | ||
| 9 | * - Work was sponsored by CIS (M) Sdn Bhd. | ||
| 10 | * Ported to Kernel 2.6.11 on June 26, 2005 by | ||
| 11 | * Wolfgang Zuleger <wolfgang.zuleger@gmx.de> | ||
| 12 | * Alexander Kiausch <alex.kiausch@t-online.de> | ||
| 13 | * Originally developed by AMD for 2.4/2.6 | ||
| 14 | * | ||
| 15 | * Development of this chipset driver was funded | ||
| 16 | * by the nice folks at National Semiconductor/AMD. | ||
| 17 | * | ||
| 18 | * This program is free software; you can redistribute it and/or modify it | ||
| 19 | * under the terms of the GNU General Public License version 2 as published by | ||
| 20 | * the Free Software Foundation. | ||
| 21 | * | ||
| 22 | * Documentation: | ||
| 23 | * CS5535 documentation available from AMD | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <linux/config.h> | ||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/pci.h> | ||
| 29 | #include <linux/ide.h> | ||
| 30 | |||
| 31 | #include "ide-timing.h" | ||
| 32 | |||
| 33 | #define MSR_ATAC_BASE 0x51300000 | ||
| 34 | #define ATAC_GLD_MSR_CAP (MSR_ATAC_BASE+0) | ||
| 35 | #define ATAC_GLD_MSR_CONFIG (MSR_ATAC_BASE+0x01) | ||
| 36 | #define ATAC_GLD_MSR_SMI (MSR_ATAC_BASE+0x02) | ||
| 37 | #define ATAC_GLD_MSR_ERROR (MSR_ATAC_BASE+0x03) | ||
| 38 | #define ATAC_GLD_MSR_PM (MSR_ATAC_BASE+0x04) | ||
| 39 | #define ATAC_GLD_MSR_DIAG (MSR_ATAC_BASE+0x05) | ||
| 40 | #define ATAC_IO_BAR (MSR_ATAC_BASE+0x08) | ||
| 41 | #define ATAC_RESET (MSR_ATAC_BASE+0x10) | ||
| 42 | #define ATAC_CH0D0_PIO (MSR_ATAC_BASE+0x20) | ||
| 43 | #define ATAC_CH0D0_DMA (MSR_ATAC_BASE+0x21) | ||
| 44 | #define ATAC_CH0D1_PIO (MSR_ATAC_BASE+0x22) | ||
| 45 | #define ATAC_CH0D1_DMA (MSR_ATAC_BASE+0x23) | ||
| 46 | #define ATAC_PCI_ABRTERR (MSR_ATAC_BASE+0x24) | ||
| 47 | #define ATAC_BM0_CMD_PRIM 0x00 | ||
| 48 | #define ATAC_BM0_STS_PRIM 0x02 | ||
| 49 | #define ATAC_BM0_PRD 0x04 | ||
| 50 | #define CS5535_CABLE_DETECT 0x48 | ||
| 51 | |||
| 52 | /* Format I PIO settings. We seperate out cmd and data for safer timings */ | ||
| 53 | |||
| 54 | static unsigned int cs5535_pio_cmd_timings[5] = | ||
| 55 | { 0xF7F4, 0x53F3, 0x13F1, 0x5131, 0x1131 }; | ||
| 56 | static unsigned int cs5535_pio_dta_timings[5] = | ||
| 57 | { 0xF7F4, 0xF173, 0x8141, 0x5131, 0x1131 }; | ||
| 58 | |||
| 59 | static unsigned int cs5535_mwdma_timings[3] = | ||
| 60 | { 0x7F0FFFF3, 0x7F035352, 0x7f024241 }; | ||
| 61 | |||
| 62 | static unsigned int cs5535_udma_timings[5] = | ||
| 63 | { 0x7F7436A1, 0x7F733481, 0x7F723261, 0x7F713161, 0x7F703061 }; | ||
| 64 | |||
| 65 | /* Macros to check if the register is the reset value - reset value is an | ||
| 66 | invalid timing and indicates the register has not been set previously */ | ||
| 67 | |||
| 68 | #define CS5535_BAD_PIO(timings) ( (timings&~0x80000000UL) == 0x00009172 ) | ||
| 69 | #define CS5535_BAD_DMA(timings) ( (timings & 0x000FFFFF) == 0x00077771 ) | ||
| 70 | |||
| 71 | /**** | ||
| 72 | * cs5535_set_speed - Configure the chipset to the new speed | ||
| 73 | * @drive: Drive to set up | ||
| 74 | * @speed: desired speed | ||
| 75 | * | ||
| 76 | * cs5535_set_speed() configures the chipset to a new speed. | ||
| 77 | */ | ||
| 78 | static void cs5535_set_speed(ide_drive_t *drive, u8 speed) | ||
| 79 | { | ||
| 80 | |||
| 81 | u32 reg = 0, dummy; | ||
| 82 | int unit = drive->select.b.unit; | ||
| 83 | |||
| 84 | |||
| 85 | /* Set the PIO timings */ | ||
| 86 | if ((speed & XFER_MODE) == XFER_PIO) { | ||
| 87 | u8 pioa; | ||
| 88 | u8 piob; | ||
| 89 | u8 cmd; | ||
| 90 | |||
| 91 | pioa = speed - XFER_PIO_0; | ||
| 92 | piob = ide_get_best_pio_mode(&(drive->hwif->drives[!unit]), | ||
| 93 | 255, 4, NULL); | ||
| 94 | cmd = pioa < piob ? pioa : piob; | ||
| 95 | |||
| 96 | /* Write the speed of the current drive */ | ||
| 97 | reg = (cs5535_pio_cmd_timings[cmd] << 16) | | ||
| 98 | cs5535_pio_dta_timings[pioa]; | ||
| 99 | wrmsr(unit ? ATAC_CH0D1_PIO : ATAC_CH0D0_PIO, reg, 0); | ||
| 100 | |||
| 101 | /* And if nessesary - change the speed of the other drive */ | ||
| 102 | rdmsr(unit ? ATAC_CH0D0_PIO : ATAC_CH0D1_PIO, reg, dummy); | ||
| 103 | |||
| 104 | if (((reg >> 16) & cs5535_pio_cmd_timings[cmd]) != | ||
| 105 | cs5535_pio_cmd_timings[cmd]) { | ||
| 106 | reg &= 0x0000FFFF; | ||
| 107 | reg |= cs5535_pio_cmd_timings[cmd] << 16; | ||
| 108 | wrmsr(unit ? ATAC_CH0D0_PIO : ATAC_CH0D1_PIO, reg, 0); | ||
| 109 | } | ||
| 110 | |||
| 111 | /* Set bit 31 of the DMA register for PIO format 1 timings */ | ||
| 112 | rdmsr(unit ? ATAC_CH0D1_DMA : ATAC_CH0D0_DMA, reg, dummy); | ||
| 113 | wrmsr(unit ? ATAC_CH0D1_DMA : ATAC_CH0D0_DMA, | ||
| 114 | reg | 0x80000000UL, 0); | ||
| 115 | } else { | ||
| 116 | rdmsr(unit ? ATAC_CH0D1_DMA : ATAC_CH0D0_DMA, reg, dummy); | ||
| 117 | |||
| 118 | reg &= 0x80000000UL; /* Preserve the PIO format bit */ | ||
| 119 | |||
| 120 | if (speed >= XFER_UDMA_0 && speed <= XFER_UDMA_7) | ||
| 121 | reg |= cs5535_udma_timings[speed - XFER_UDMA_0]; | ||
| 122 | else if (speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2) | ||
| 123 | reg |= cs5535_mwdma_timings[speed - XFER_MW_DMA_0]; | ||
| 124 | else | ||
| 125 | return; | ||
| 126 | |||
| 127 | wrmsr(unit ? ATAC_CH0D1_DMA : ATAC_CH0D0_DMA, reg, 0); | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 131 | static u8 cs5535_ratemask(ide_drive_t *drive) | ||
| 132 | { | ||
| 133 | /* eighty93 will return 1 if it's 80core and capable of | ||
| 134 | exceeding udma2, 0 otherwise. we need ratemask to set | ||
| 135 | the max speed and if we can > udma2 then we return 2 | ||
| 136 | which selects speed_max as udma4 which is the 5535's max | ||
| 137 | speed, and 1 selects udma2 which is the max for 40c */ | ||
| 138 | if (!eighty_ninty_three(drive)) | ||
| 139 | return 1; | ||
| 140 | |||
| 141 | return 2; | ||
| 142 | } | ||
| 143 | |||
| 144 | |||
| 145 | /**** | ||
| 146 | * cs5535_set_drive - Configure the drive to the new speed | ||
| 147 | * @drive: Drive to set up | ||
| 148 | * @speed: desired speed | ||
| 149 | * | ||
| 150 | * cs5535_set_drive() configures the drive and the chipset to a | ||
| 151 | * new speed. It also can be called by upper layers. | ||
| 152 | */ | ||
| 153 | static int cs5535_set_drive(ide_drive_t *drive, u8 speed) | ||
| 154 | { | ||
| 155 | speed = ide_rate_filter(cs5535_ratemask(drive), speed); | ||
| 156 | ide_config_drive_speed(drive, speed); | ||
| 157 | cs5535_set_speed(drive, speed); | ||
| 158 | |||
| 159 | return 0; | ||
| 160 | } | ||
| 161 | |||
| 162 | /**** | ||
| 163 | * cs5535_tuneproc - PIO setup | ||
| 164 | * @drive: drive to set up | ||
| 165 | * @pio: mode to use (255 for 'best possible') | ||
| 166 | * | ||
| 167 | * A callback from the upper layers for PIO-only tuning. | ||
| 168 | */ | ||
| 169 | static void cs5535_tuneproc(ide_drive_t *drive, u8 xferspeed) | ||
| 170 | { | ||
| 171 | u8 modes[] = { XFER_PIO_0, XFER_PIO_1, XFER_PIO_2, XFER_PIO_3, | ||
| 172 | XFER_PIO_4 }; | ||
| 173 | |||
| 174 | /* cs5535 max pio is pio 4, best_pio will check the blacklist. | ||
| 175 | i think we don't need to rate_filter the incoming xferspeed | ||
| 176 | since we know we're only going to choose pio */ | ||
| 177 | xferspeed = ide_get_best_pio_mode(drive, xferspeed, 4, NULL); | ||
| 178 | ide_config_drive_speed(drive, modes[xferspeed]); | ||
| 179 | cs5535_set_speed(drive, xferspeed); | ||
| 180 | } | ||
| 181 | |||
| 182 | static int cs5535_config_drive_for_dma(ide_drive_t *drive) | ||
| 183 | { | ||
| 184 | u8 speed; | ||
| 185 | |||
| 186 | speed = ide_dma_speed(drive, cs5535_ratemask(drive)); | ||
| 187 | |||
| 188 | /* If no DMA speed was available then let dma_check hit pio */ | ||
| 189 | if (!speed) { | ||
| 190 | return 0; | ||
| 191 | } | ||
| 192 | |||
| 193 | cs5535_set_drive(drive, speed); | ||
| 194 | return ide_dma_enable(drive); | ||
| 195 | } | ||
| 196 | |||
| 197 | static int cs5535_dma_check(ide_drive_t *drive) | ||
| 198 | { | ||
| 199 | ide_hwif_t *hwif = drive->hwif; | ||
| 200 | struct hd_driveid *id = drive->id; | ||
| 201 | u8 speed; | ||
| 202 | |||
| 203 | drive->init_speed = 0; | ||
| 204 | |||
| 205 | if ((id->capability & 1) && drive->autodma) { | ||
| 206 | if (ide_use_dma(drive)) { | ||
| 207 | if (cs5535_config_drive_for_dma(drive)) | ||
| 208 | return hwif->ide_dma_on(drive); | ||
| 209 | } | ||
| 210 | |||
| 211 | goto fast_ata_pio; | ||
| 212 | |||
| 213 | } else if ((id->capability & 8) || (id->field_valid & 2)) { | ||
| 214 | fast_ata_pio: | ||
| 215 | speed = ide_get_best_pio_mode(drive, 255, 4, NULL); | ||
| 216 | cs5535_set_drive(drive, speed); | ||
| 217 | return hwif->ide_dma_off_quietly(drive); | ||
| 218 | } | ||
| 219 | /* IORDY not supported */ | ||
| 220 | return 0; | ||
| 221 | } | ||
| 222 | |||
| 223 | static u8 __devinit cs5535_cable_detect(struct pci_dev *dev) | ||
| 224 | { | ||
| 225 | u8 bit; | ||
| 226 | |||
| 227 | /* if a 80 wire cable was detected */ | ||
| 228 | pci_read_config_byte(dev, CS5535_CABLE_DETECT, &bit); | ||
| 229 | return (bit & 1); | ||
| 230 | } | ||
| 231 | |||
| 232 | /**** | ||
| 233 | * init_hwif_cs5535 - Initialize one ide cannel | ||
| 234 | * @hwif: Channel descriptor | ||
| 235 | * | ||
| 236 | * This gets invoked by the IDE driver once for each channel. It | ||
| 237 | * performs channel-specific pre-initialization before drive probing. | ||
| 238 | * | ||
| 239 | */ | ||
| 240 | static void __devinit init_hwif_cs5535(ide_hwif_t *hwif) | ||
| 241 | { | ||
| 242 | int i; | ||
| 243 | |||
| 244 | hwif->autodma = 0; | ||
| 245 | |||
| 246 | hwif->tuneproc = &cs5535_tuneproc; | ||
| 247 | hwif->speedproc = &cs5535_set_drive; | ||
| 248 | hwif->ide_dma_check = &cs5535_dma_check; | ||
| 249 | |||
| 250 | hwif->atapi_dma = 1; | ||
| 251 | hwif->ultra_mask = 0x1F; | ||
| 252 | hwif->mwdma_mask = 0x07; | ||
| 253 | |||
| 254 | |||
| 255 | hwif->udma_four = cs5535_cable_detect(hwif->pci_dev); | ||
| 256 | |||
| 257 | if (!noautodma) | ||
| 258 | hwif->autodma = 1; | ||
| 259 | |||
| 260 | /* just setting autotune and not worrying about bios timings */ | ||
| 261 | for (i = 0; i < 2; i++) { | ||
| 262 | hwif->drives[i].autotune = 1; | ||
| 263 | hwif->drives[i].autodma = hwif->autodma; | ||
| 264 | } | ||
| 265 | } | ||
| 266 | |||
| 267 | static ide_pci_device_t cs5535_chipset __devinitdata = { | ||
| 268 | .name = "CS5535", | ||
| 269 | .init_hwif = init_hwif_cs5535, | ||
| 270 | .channels = 1, | ||
| 271 | .autodma = AUTODMA, | ||
| 272 | .bootable = ON_BOARD, | ||
| 273 | }; | ||
| 274 | |||
| 275 | static int __devinit cs5535_init_one(struct pci_dev *dev, | ||
| 276 | const struct pci_device_id *id) | ||
| 277 | { | ||
| 278 | return ide_setup_pci_device(dev, &cs5535_chipset); | ||
| 279 | } | ||
| 280 | |||
| 281 | static struct pci_device_id cs5535_pci_tbl[] = | ||
| 282 | { | ||
| 283 | { PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_CS5535_IDE, PCI_ANY_ID, | ||
| 284 | PCI_ANY_ID, 0, 0, 0}, | ||
| 285 | { 0, }, | ||
| 286 | }; | ||
| 287 | |||
| 288 | MODULE_DEVICE_TABLE(pci, cs5535_pci_tbl); | ||
| 289 | |||
| 290 | static struct pci_driver driver = { | ||
| 291 | .name = "CS5535_IDE", | ||
| 292 | .id_table = cs5535_pci_tbl, | ||
| 293 | .probe = cs5535_init_one, | ||
| 294 | }; | ||
| 295 | |||
| 296 | static int __init cs5535_ide_init(void) | ||
| 297 | { | ||
| 298 | return ide_pci_register_driver(&driver); | ||
| 299 | } | ||
| 300 | |||
| 301 | module_init(cs5535_ide_init); | ||
| 302 | |||
| 303 | MODULE_AUTHOR("AMD"); | ||
| 304 | MODULE_DESCRIPTION("PCI driver module for AMD/NS CS5535 IDE"); | ||
| 305 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/pci/cy82c693.c b/drivers/ide/pci/cy82c693.c index 5a33513f3dd1..9f41ecd56338 100644 --- a/drivers/ide/pci/cy82c693.c +++ b/drivers/ide/pci/cy82c693.c | |||
| @@ -469,7 +469,7 @@ static void __devinit init_hwif_cy82c693(ide_hwif_t *hwif) | |||
| 469 | 469 | ||
| 470 | static __devinitdata ide_hwif_t *primary; | 470 | static __devinitdata ide_hwif_t *primary; |
| 471 | 471 | ||
| 472 | void __devinit init_iops_cy82c693(ide_hwif_t *hwif) | 472 | static void __devinit init_iops_cy82c693(ide_hwif_t *hwif) |
| 473 | { | 473 | { |
| 474 | if (PCI_FUNC(hwif->pci_dev->devfn) == 1) | 474 | if (PCI_FUNC(hwif->pci_dev->devfn) == 1) |
| 475 | primary = hwif; | 475 | primary = hwif; |
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index 2b9961b88135..022d244f2eb0 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
| @@ -701,6 +701,7 @@ static unsigned int setup_mmio_siimage (struct pci_dev *dev, const char *name) | |||
| 701 | unsigned long barsize = pci_resource_len(dev, 5); | 701 | unsigned long barsize = pci_resource_len(dev, 5); |
| 702 | u8 tmpbyte = 0; | 702 | u8 tmpbyte = 0; |
| 703 | void __iomem *ioaddr; | 703 | void __iomem *ioaddr; |
| 704 | u32 tmp, irq_mask; | ||
| 704 | 705 | ||
| 705 | /* | 706 | /* |
| 706 | * Drop back to PIO if we can't map the mmio. Some | 707 | * Drop back to PIO if we can't map the mmio. Some |
| @@ -726,6 +727,14 @@ static unsigned int setup_mmio_siimage (struct pci_dev *dev, const char *name) | |||
| 726 | pci_set_drvdata(dev, (void *) ioaddr); | 727 | pci_set_drvdata(dev, (void *) ioaddr); |
| 727 | 728 | ||
| 728 | if (pdev_is_sata(dev)) { | 729 | if (pdev_is_sata(dev)) { |
| 730 | /* make sure IDE0/1 interrupts are not masked */ | ||
| 731 | irq_mask = (1 << 22) | (1 << 23); | ||
| 732 | tmp = readl(ioaddr + 0x48); | ||
| 733 | if (tmp & irq_mask) { | ||
| 734 | tmp &= ~irq_mask; | ||
| 735 | writel(tmp, ioaddr + 0x48); | ||
| 736 | readl(ioaddr + 0x48); /* flush */ | ||
| 737 | } | ||
| 729 | writel(0, ioaddr + 0x148); | 738 | writel(0, ioaddr + 0x148); |
| 730 | writel(0, ioaddr + 0x1C8); | 739 | writel(0, ioaddr + 0x1C8); |
| 731 | } | 740 | } |
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index c888af4a4562..3553da0e1cd5 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
| @@ -395,6 +395,7 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs) | |||
| 395 | int log = test_bit(IDESCSI_LOG_CMD, &scsi->log); | 395 | int log = test_bit(IDESCSI_LOG_CMD, &scsi->log); |
| 396 | struct Scsi_Host *host; | 396 | struct Scsi_Host *host; |
| 397 | u8 *scsi_buf; | 397 | u8 *scsi_buf; |
| 398 | int errors = rq->errors; | ||
| 398 | unsigned long flags; | 399 | unsigned long flags; |
| 399 | 400 | ||
| 400 | if (!(rq->flags & (REQ_SPECIAL|REQ_SENSE))) { | 401 | if (!(rq->flags & (REQ_SPECIAL|REQ_SENSE))) { |
| @@ -421,11 +422,11 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs) | |||
| 421 | printk (KERN_WARNING "ide-scsi: %s: timed out for %lu\n", | 422 | printk (KERN_WARNING "ide-scsi: %s: timed out for %lu\n", |
| 422 | drive->name, pc->scsi_cmd->serial_number); | 423 | drive->name, pc->scsi_cmd->serial_number); |
| 423 | pc->scsi_cmd->result = DID_TIME_OUT << 16; | 424 | pc->scsi_cmd->result = DID_TIME_OUT << 16; |
| 424 | } else if (rq->errors >= ERROR_MAX) { | 425 | } else if (errors >= ERROR_MAX) { |
| 425 | pc->scsi_cmd->result = DID_ERROR << 16; | 426 | pc->scsi_cmd->result = DID_ERROR << 16; |
| 426 | if (log) | 427 | if (log) |
| 427 | printk ("ide-scsi: %s: I/O error for %lu\n", drive->name, pc->scsi_cmd->serial_number); | 428 | printk ("ide-scsi: %s: I/O error for %lu\n", drive->name, pc->scsi_cmd->serial_number); |
| 428 | } else if (rq->errors) { | 429 | } else if (errors) { |
| 429 | if (log) | 430 | if (log) |
| 430 | printk ("ide-scsi: %s: check condition for %lu\n", drive->name, pc->scsi_cmd->serial_number); | 431 | printk ("ide-scsi: %s: check condition for %lu\n", drive->name, pc->scsi_cmd->serial_number); |
| 431 | if (!idescsi_check_condition(drive, rq)) | 432 | if (!idescsi_check_condition(drive, rq)) |
diff --git a/include/asm-alpha/ide.h b/include/asm-alpha/ide.h index 68934a25931f..6126afe27380 100644 --- a/include/asm-alpha/ide.h +++ b/include/asm-alpha/ide.h | |||
| @@ -15,10 +15,6 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/config.h> | 16 | #include <linux/config.h> |
| 17 | 17 | ||
| 18 | #ifndef MAX_HWIFS | ||
| 19 | #define MAX_HWIFS CONFIG_IDE_MAX_HWIFS | ||
| 20 | #endif | ||
| 21 | |||
| 22 | #define IDE_ARCH_OBSOLETE_DEFAULTS | 18 | #define IDE_ARCH_OBSOLETE_DEFAULTS |
| 23 | 19 | ||
| 24 | static inline int ide_default_irq(unsigned long base) | 20 | static inline int ide_default_irq(unsigned long base) |
diff --git a/include/asm-i386/ide.h b/include/asm-i386/ide.h index 79dfab87135d..454440193eac 100644 --- a/include/asm-i386/ide.h +++ b/include/asm-i386/ide.h | |||
| @@ -41,6 +41,12 @@ static __inline__ int ide_default_irq(unsigned long base) | |||
| 41 | 41 | ||
| 42 | static __inline__ unsigned long ide_default_io_base(int index) | 42 | static __inline__ unsigned long ide_default_io_base(int index) |
| 43 | { | 43 | { |
| 44 | /* | ||
| 45 | * If PCI is present then it is not safe to poke around | ||
| 46 | * the other legacy IDE ports. Only 0x1f0 and 0x170 are | ||
| 47 | * defined compatibility mode ports for PCI. A user can | ||
| 48 | * override this using ide= but we must default safe. | ||
| 49 | */ | ||
| 44 | if (pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL) == NULL) { | 50 | if (pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL) == NULL) { |
| 45 | switch(index) { | 51 | switch(index) { |
| 46 | case 2: return 0x1e8; | 52 | case 2: return 0x1e8; |
diff --git a/include/asm-sh/ide.h b/include/asm-sh/ide.h index f42cf3977a57..711dad4cb48b 100644 --- a/include/asm-sh/ide.h +++ b/include/asm-sh/ide.h | |||
| @@ -16,10 +16,6 @@ | |||
| 16 | 16 | ||
| 17 | #include <linux/config.h> | 17 | #include <linux/config.h> |
| 18 | 18 | ||
| 19 | #ifndef MAX_HWIFS | ||
| 20 | #define MAX_HWIFS CONFIG_IDE_MAX_HWIFS | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #define ide_default_io_ctl(base) (0) | 19 | #define ide_default_io_ctl(base) (0) |
| 24 | 20 | ||
| 25 | #include <asm-generic/ide_iops.h> | 21 | #include <asm-generic/ide_iops.h> |
diff --git a/include/asm-sh64/ide.h b/include/asm-sh64/ide.h index 6fd514daa1ba..852f50afe39c 100644 --- a/include/asm-sh64/ide.h +++ b/include/asm-sh64/ide.h | |||
| @@ -17,10 +17,6 @@ | |||
| 17 | 17 | ||
| 18 | #include <linux/config.h> | 18 | #include <linux/config.h> |
| 19 | 19 | ||
| 20 | #ifndef MAX_HWIFS | ||
| 21 | #define MAX_HWIFS CONFIG_IDE_MAX_HWIFS | ||
| 22 | #endif | ||
| 23 | |||
| 24 | /* Without this, the initialisation of PCI IDE cards end up calling | 20 | /* Without this, the initialisation of PCI IDE cards end up calling |
| 25 | * ide_init_hwif_ports, which won't work. */ | 21 | * ide_init_hwif_ports, which won't work. */ |
| 26 | #ifdef CONFIG_BLK_DEV_IDEPCI | 22 | #ifdef CONFIG_BLK_DEV_IDEPCI |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 3461abc1e854..77ae55d4c13c 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -230,6 +230,7 @@ typedef struct hw_regs_s { | |||
| 230 | int dma; /* our dma entry */ | 230 | int dma; /* our dma entry */ |
| 231 | ide_ack_intr_t *ack_intr; /* acknowledge interrupt */ | 231 | ide_ack_intr_t *ack_intr; /* acknowledge interrupt */ |
| 232 | hwif_chipset_t chipset; | 232 | hwif_chipset_t chipset; |
| 233 | struct device *dev; | ||
| 233 | } hw_regs_t; | 234 | } hw_regs_t; |
| 234 | 235 | ||
| 235 | /* | 236 | /* |
| @@ -266,6 +267,10 @@ static inline void ide_std_init_ports(hw_regs_t *hw, | |||
| 266 | 267 | ||
| 267 | #include <asm/ide.h> | 268 | #include <asm/ide.h> |
| 268 | 269 | ||
| 270 | #ifndef MAX_HWIFS | ||
| 271 | #define MAX_HWIFS CONFIG_IDE_MAX_HWIFS | ||
| 272 | #endif | ||
| 273 | |||
| 269 | /* needed on alpha, x86/x86_64, ia64, mips, ppc32 and sh */ | 274 | /* needed on alpha, x86/x86_64, ia64, mips, ppc32 and sh */ |
| 270 | #ifndef IDE_ARCH_OBSOLETE_DEFAULTS | 275 | #ifndef IDE_ARCH_OBSOLETE_DEFAULTS |
| 271 | # define ide_default_io_base(index) (0) | 276 | # define ide_default_io_base(index) (0) |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 9a96f0588393..4e06eb0f4451 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -387,6 +387,7 @@ | |||
| 387 | #define PCI_DEVICE_ID_NS_SC1100_SMI 0x0511 | 387 | #define PCI_DEVICE_ID_NS_SC1100_SMI 0x0511 |
| 388 | #define PCI_DEVICE_ID_NS_SC1100_XBUS 0x0515 | 388 | #define PCI_DEVICE_ID_NS_SC1100_XBUS 0x0515 |
| 389 | #define PCI_DEVICE_ID_NS_87410 0xd001 | 389 | #define PCI_DEVICE_ID_NS_87410 0xd001 |
| 390 | #define PCI_DEVICE_ID_NS_CS5535_IDE 0x002d | ||
| 390 | 391 | ||
| 391 | #define PCI_VENDOR_ID_TSENG 0x100c | 392 | #define PCI_VENDOR_ID_TSENG 0x100c |
| 392 | #define PCI_DEVICE_ID_TSENG_W32P_2 0x3202 | 393 | #define PCI_DEVICE_ID_TSENG_W32P_2 0x3202 |
| @@ -487,6 +488,8 @@ | |||
| 487 | #define PCI_DEVICE_ID_AMD_8151_0 0x7454 | 488 | #define PCI_DEVICE_ID_AMD_8151_0 0x7454 |
| 488 | #define PCI_DEVICE_ID_AMD_8131_APIC 0x7450 | 489 | #define PCI_DEVICE_ID_AMD_8131_APIC 0x7450 |
| 489 | 490 | ||
| 491 | #define PCI_DEVICE_ID_AMD_CS5536_IDE 0x209A | ||
| 492 | |||
| 490 | #define PCI_VENDOR_ID_TRIDENT 0x1023 | 493 | #define PCI_VENDOR_ID_TRIDENT 0x1023 |
| 491 | #define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000 | 494 | #define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000 |
| 492 | #define PCI_DEVICE_ID_TRIDENT_4DWAVE_NX 0x2001 | 495 | #define PCI_DEVICE_ID_TRIDENT_4DWAVE_NX 0x2001 |
