diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-07-18 16:00:54 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-18 16:00:54 -0400 |
commit | bb2c018b09b681d43f5e08124b83e362647ea82b (patch) | |
tree | d794902c78f9fdd04ed88a4b8d451ed6f9292ec0 /drivers/ide | |
parent | 82638844d9a8581bbf33201cc209a14876eca167 (diff) | |
parent | 5b664cb235e97afbf34db9c4d77f08ebd725335e (diff) |
Merge branch 'linus' into cpus4096
Conflicts:
drivers/acpi/processor_throttling.c
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'drivers/ide')
53 files changed, 633 insertions, 2639 deletions
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index cf707c8f08d4..15b09b89588a 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -98,6 +98,9 @@ if BLK_DEV_IDE | |||
98 | 98 | ||
99 | comment "Please see Documentation/ide/ide.txt for help/info on IDE drives" | 99 | comment "Please see Documentation/ide/ide.txt for help/info on IDE drives" |
100 | 100 | ||
101 | config IDE_TIMINGS | ||
102 | bool | ||
103 | |||
101 | config IDE_ATAPI | 104 | config IDE_ATAPI |
102 | bool | 105 | bool |
103 | 106 | ||
@@ -326,6 +329,7 @@ config BLK_DEV_PLATFORM | |||
326 | config BLK_DEV_CMD640 | 329 | config BLK_DEV_CMD640 |
327 | tristate "CMD640 chipset bugfix/support" | 330 | tristate "CMD640 chipset bugfix/support" |
328 | depends on X86 | 331 | depends on X86 |
332 | select IDE_TIMINGS | ||
329 | ---help--- | 333 | ---help--- |
330 | The CMD-Technologies CMD640 IDE chip is used on many common 486 and | 334 | The CMD-Technologies CMD640 IDE chip is used on many common 486 and |
331 | Pentium motherboards, usually in combination with a "Neptune" or | 335 | Pentium motherboards, usually in combination with a "Neptune" or |
@@ -455,6 +459,7 @@ config BLK_DEV_AEC62XX | |||
455 | 459 | ||
456 | config BLK_DEV_ALI15X3 | 460 | config BLK_DEV_ALI15X3 |
457 | tristate "ALI M15x3 chipset support" | 461 | tristate "ALI M15x3 chipset support" |
462 | select IDE_TIMINGS | ||
458 | select BLK_DEV_IDEDMA_PCI | 463 | select BLK_DEV_IDEDMA_PCI |
459 | help | 464 | help |
460 | This driver ensures (U)DMA support for ALI 1533, 1543 and 1543C | 465 | This driver ensures (U)DMA support for ALI 1533, 1543 and 1543C |
@@ -469,6 +474,7 @@ config BLK_DEV_ALI15X3 | |||
469 | config BLK_DEV_AMD74XX | 474 | config BLK_DEV_AMD74XX |
470 | tristate "AMD and nVidia IDE support" | 475 | tristate "AMD and nVidia IDE support" |
471 | depends on !ARM | 476 | depends on !ARM |
477 | select IDE_TIMINGS | ||
472 | select BLK_DEV_IDEDMA_PCI | 478 | select BLK_DEV_IDEDMA_PCI |
473 | help | 479 | help |
474 | This driver adds explicit support for AMD-7xx and AMD-8111 chips | 480 | This driver adds explicit support for AMD-7xx and AMD-8111 chips |
@@ -489,6 +495,7 @@ config BLK_DEV_ATIIXP | |||
489 | 495 | ||
490 | config BLK_DEV_CMD64X | 496 | config BLK_DEV_CMD64X |
491 | tristate "CMD64{3|6|8|9} chipset support" | 497 | tristate "CMD64{3|6|8|9} chipset support" |
498 | select IDE_TIMINGS | ||
492 | select BLK_DEV_IDEDMA_PCI | 499 | select BLK_DEV_IDEDMA_PCI |
493 | help | 500 | help |
494 | Say Y here if you have an IDE controller which uses any of these | 501 | Say Y here if you have an IDE controller which uses any of these |
@@ -503,6 +510,7 @@ config BLK_DEV_TRIFLEX | |||
503 | 510 | ||
504 | config BLK_DEV_CY82C693 | 511 | config BLK_DEV_CY82C693 |
505 | tristate "CY82C693 chipset support" | 512 | tristate "CY82C693 chipset support" |
513 | select IDE_TIMINGS | ||
506 | select BLK_DEV_IDEDMA_PCI | 514 | select BLK_DEV_IDEDMA_PCI |
507 | help | 515 | help |
508 | This driver adds detection and support for the CY82C693 chipset | 516 | This driver adds detection and support for the CY82C693 chipset |
@@ -695,6 +703,7 @@ config BLK_DEV_SIS5513 | |||
695 | config BLK_DEV_SL82C105 | 703 | config BLK_DEV_SL82C105 |
696 | tristate "Winbond SL82c105 support" | 704 | tristate "Winbond SL82c105 support" |
697 | depends on (PPC || ARM) | 705 | depends on (PPC || ARM) |
706 | select IDE_TIMINGS | ||
698 | select BLK_DEV_IDEDMA_PCI | 707 | select BLK_DEV_IDEDMA_PCI |
699 | help | 708 | help |
700 | If you have a Winbond SL82c105 IDE controller, say Y here to enable | 709 | If you have a Winbond SL82c105 IDE controller, say Y here to enable |
@@ -725,6 +734,7 @@ config BLK_DEV_TRM290 | |||
725 | 734 | ||
726 | config BLK_DEV_VIA82CXXX | 735 | config BLK_DEV_VIA82CXXX |
727 | tristate "VIA82CXXX chipset support" | 736 | tristate "VIA82CXXX chipset support" |
737 | select IDE_TIMINGS | ||
728 | select BLK_DEV_IDEDMA_PCI | 738 | select BLK_DEV_IDEDMA_PCI |
729 | help | 739 | help |
730 | This driver adds explicit support for VIA BusMastering IDE chips. | 740 | This driver adds explicit support for VIA BusMastering IDE chips. |
@@ -751,6 +761,7 @@ endif | |||
751 | config BLK_DEV_IDE_PMAC | 761 | config BLK_DEV_IDE_PMAC |
752 | tristate "PowerMac on-board IDE support" | 762 | tristate "PowerMac on-board IDE support" |
753 | depends on PPC_PMAC && IDE=y && BLK_DEV_IDE=y | 763 | depends on PPC_PMAC && IDE=y && BLK_DEV_IDE=y |
764 | select IDE_TIMINGS | ||
754 | help | 765 | help |
755 | This driver provides support for the on-board IDE controller on | 766 | This driver provides support for the on-board IDE controller on |
756 | most of the recent Apple Power Macintoshes and PowerBooks. | 767 | most of the recent Apple Power Macintoshes and PowerBooks. |
@@ -829,13 +840,6 @@ config BLK_DEV_IDE_RAPIDE | |||
829 | Say Y here if you want to support the Yellowstone RapIDE controller | 840 | Say Y here if you want to support the Yellowstone RapIDE controller |
830 | manufactured for use with Acorn computers. | 841 | manufactured for use with Acorn computers. |
831 | 842 | ||
832 | config BLK_DEV_IDE_BAST | ||
833 | tristate "Simtec BAST / Thorcom VR1000 IDE support" | ||
834 | depends on ARM && (ARCH_BAST || MACH_VR1000) | ||
835 | help | ||
836 | Say Y here if you want to support the onboard IDE channels on the | ||
837 | Simtec BAST or the Thorcom VR1000 | ||
838 | |||
839 | config IDE_H8300 | 843 | config IDE_H8300 |
840 | tristate "H8300 IDE support" | 844 | tristate "H8300 IDE support" |
841 | depends on H8300 | 845 | depends on H8300 |
@@ -919,51 +923,12 @@ config BLK_DEV_Q40IDE | |||
919 | config BLK_DEV_PALMCHIP_BK3710 | 923 | config BLK_DEV_PALMCHIP_BK3710 |
920 | tristate "Palmchip bk3710 IDE controller support" | 924 | tristate "Palmchip bk3710 IDE controller support" |
921 | depends on ARCH_DAVINCI | 925 | depends on ARCH_DAVINCI |
926 | select IDE_TIMINGS | ||
922 | select BLK_DEV_IDEDMA_SFF | 927 | select BLK_DEV_IDEDMA_SFF |
923 | help | 928 | help |
924 | Say Y here if you want to support the onchip IDE controller on the | 929 | Say Y here if you want to support the onchip IDE controller on the |
925 | TI DaVinci SoC | 930 | TI DaVinci SoC |
926 | 931 | ||
927 | |||
928 | config BLK_DEV_MPC8xx_IDE | ||
929 | tristate "MPC8xx IDE support" | ||
930 | depends on 8xx && (LWMON || IVMS8 || IVML24 || TQM8xxL) && IDE=y && BLK_DEV_IDE=y && !PPC_MERGE | ||
931 | help | ||
932 | This option provides support for IDE on Motorola MPC8xx Systems. | ||
933 | Please see 'Type of MPC8xx IDE interface' for details. | ||
934 | |||
935 | If unsure, say N. | ||
936 | |||
937 | choice | ||
938 | prompt "Type of MPC8xx IDE interface" | ||
939 | depends on BLK_DEV_MPC8xx_IDE | ||
940 | default IDE_8xx_PCCARD | ||
941 | |||
942 | config IDE_8xx_PCCARD | ||
943 | bool "8xx_PCCARD" | ||
944 | ---help--- | ||
945 | Select how the IDE devices are connected to the MPC8xx system: | ||
946 | |||
947 | 8xx_PCCARD uses the 8xx internal PCMCIA interface in combination | ||
948 | with a PC Card (e.g. ARGOSY portable Hard Disk Adapter), | ||
949 | ATA PC Card HDDs or ATA PC Flash Cards (example: TQM8xxL | ||
950 | systems) | ||
951 | |||
952 | 8xx_DIRECT is used for directly connected IDE devices using the 8xx | ||
953 | internal PCMCIA interface (example: IVMS8 systems) | ||
954 | |||
955 | EXT_DIRECT is used for IDE devices directly connected to the 8xx | ||
956 | bus using some glue logic, but _not_ the 8xx internal | ||
957 | PCMCIA interface (example: IDIF860 systems) | ||
958 | |||
959 | config IDE_8xx_DIRECT | ||
960 | bool "8xx_DIRECT" | ||
961 | |||
962 | config IDE_EXT_DIRECT | ||
963 | bool "EXT_DIRECT" | ||
964 | |||
965 | endchoice | ||
966 | |||
967 | # no isa -> no vlb | 932 | # no isa -> no vlb |
968 | if ISA && (ALPHA || X86 || MIPS) | 933 | if ISA && (ALPHA || X86 || MIPS) |
969 | 934 | ||
@@ -981,6 +946,7 @@ config BLK_DEV_4DRIVES | |||
981 | 946 | ||
982 | config BLK_DEV_ALI14XX | 947 | config BLK_DEV_ALI14XX |
983 | tristate "ALI M14xx support" | 948 | tristate "ALI M14xx support" |
949 | select IDE_TIMINGS | ||
984 | help | 950 | help |
985 | This driver is enabled at runtime using the "ali14xx.probe" kernel | 951 | This driver is enabled at runtime using the "ali14xx.probe" kernel |
986 | boot parameter. It enables support for the secondary IDE interface | 952 | boot parameter. It enables support for the secondary IDE interface |
@@ -1000,6 +966,7 @@ config BLK_DEV_DTC2278 | |||
1000 | 966 | ||
1001 | config BLK_DEV_HT6560B | 967 | config BLK_DEV_HT6560B |
1002 | tristate "Holtek HT6560B support" | 968 | tristate "Holtek HT6560B support" |
969 | select IDE_TIMINGS | ||
1003 | help | 970 | help |
1004 | This driver is enabled at runtime using the "ht6560b.probe" kernel | 971 | This driver is enabled at runtime using the "ht6560b.probe" kernel |
1005 | boot parameter. It enables support for the secondary IDE interface | 972 | boot parameter. It enables support for the secondary IDE interface |
@@ -1009,6 +976,7 @@ config BLK_DEV_HT6560B | |||
1009 | 976 | ||
1010 | config BLK_DEV_QD65XX | 977 | config BLK_DEV_QD65XX |
1011 | tristate "QDI QD65xx support" | 978 | tristate "QDI QD65xx support" |
979 | select IDE_TIMINGS | ||
1012 | help | 980 | help |
1013 | This driver is enabled at runtime using the "qd65xx.probe" kernel | 981 | This driver is enabled at runtime using the "qd65xx.probe" kernel |
1014 | boot parameter. It permits faster I/O speeds to be set. See the | 982 | boot parameter. It permits faster I/O speeds to be set. See the |
@@ -1032,30 +1000,4 @@ config BLK_DEV_IDEDMA | |||
1032 | 1000 | ||
1033 | endif | 1001 | endif |
1034 | 1002 | ||
1035 | config BLK_DEV_HD_ONLY | ||
1036 | bool "Old hard disk (MFM/RLL/IDE) driver" | ||
1037 | depends on !ARM || ARCH_RPC || ARCH_SHARK || BROKEN | ||
1038 | help | ||
1039 | There are two drivers for MFM/RLL/IDE hard disks. Most people use | ||
1040 | the newer enhanced driver, but this old one is still around for two | ||
1041 | reasons. Some older systems have strange timing problems and seem to | ||
1042 | work only with the old driver (which itself does not work with some | ||
1043 | newer systems). The other reason is that the old driver is smaller, | ||
1044 | since it lacks the enhanced functionality of the new one. This makes | ||
1045 | it a good choice for systems with very tight memory restrictions, or | ||
1046 | for systems with only older MFM/RLL/ESDI drives. Choosing the old | ||
1047 | driver can save 13 KB or so of kernel memory. | ||
1048 | |||
1049 | If you want to use this driver together with the new one you have | ||
1050 | to use "hda=noprobe hdb=noprobe" kernel parameters to prevent the new | ||
1051 | driver from probing the primary interface. | ||
1052 | |||
1053 | If you are unsure, then just choose the Enhanced IDE/MFM/RLL driver | ||
1054 | instead of this one. For more detailed information, read the | ||
1055 | Disk-HOWTO, available from | ||
1056 | <http://www.tldp.org/docs.html#howto>. | ||
1057 | |||
1058 | config BLK_DEV_HD | ||
1059 | def_bool BLK_DEV_HD_ONLY | ||
1060 | |||
1061 | endif # IDE | 1003 | endif # IDE |
diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile index a2b3f84d710d..5d414e301a5a 100644 --- a/drivers/ide/Makefile +++ b/drivers/ide/Makefile | |||
@@ -11,9 +11,11 @@ | |||
11 | 11 | ||
12 | EXTRA_CFLAGS += -Idrivers/ide | 12 | EXTRA_CFLAGS += -Idrivers/ide |
13 | 13 | ||
14 | ide-core-y += ide.o ide-io.o ide-iops.o ide-lib.o ide-probe.o ide-taskfile.o | 14 | ide-core-y += ide.o ide-io.o ide-iops.o ide-lib.o ide-probe.o ide-taskfile.o \ |
15 | ide-pio-blacklist.o | ||
15 | 16 | ||
16 | # core IDE code | 17 | # core IDE code |
18 | ide-core-$(CONFIG_IDE_TIMINGS) += ide-timings.o | ||
17 | ide-core-$(CONFIG_IDE_ATAPI) += ide-atapi.o | 19 | ide-core-$(CONFIG_IDE_ATAPI) += ide-atapi.o |
18 | ide-core-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o | 20 | ide-core-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o |
19 | ide-core-$(CONFIG_BLK_DEV_IDEDMA) += ide-dma.o | 21 | ide-core-$(CONFIG_BLK_DEV_IDEDMA) += ide-dma.o |
@@ -59,9 +61,3 @@ ifeq ($(CONFIG_BLK_DEV_PLATFORM), y) | |||
59 | endif | 61 | endif |
60 | 62 | ||
61 | obj-$(CONFIG_BLK_DEV_IDE) += arm/ mips/ | 63 | obj-$(CONFIG_BLK_DEV_IDE) += arm/ mips/ |
62 | |||
63 | # old hd driver must be last | ||
64 | ifeq ($(CONFIG_BLK_DEV_HD), y) | ||
65 | hd-core-y += legacy/hd.o | ||
66 | obj-y += hd-core.o | ||
67 | endif | ||
diff --git a/drivers/ide/arm/Makefile b/drivers/ide/arm/Makefile index 936e7b0237f5..5bc26053afa6 100644 --- a/drivers/ide/arm/Makefile +++ b/drivers/ide/arm/Makefile | |||
@@ -1,7 +1,6 @@ | |||
1 | 1 | ||
2 | obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o | 2 | obj-$(CONFIG_BLK_DEV_IDE_ICSIDE) += icside.o |
3 | obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o | 3 | obj-$(CONFIG_BLK_DEV_IDE_RAPIDE) += rapide.o |
4 | obj-$(CONFIG_BLK_DEV_IDE_BAST) += bast-ide.o | ||
5 | obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o | 4 | obj-$(CONFIG_BLK_DEV_PALMCHIP_BK3710) += palm_bk3710.o |
6 | 5 | ||
7 | ifeq ($(CONFIG_IDE_ARM), m) | 6 | ifeq ($(CONFIG_IDE_ARM), m) |
diff --git a/drivers/ide/arm/bast-ide.c b/drivers/ide/arm/bast-ide.c deleted file mode 100644 index 8e8c28104b45..000000000000 --- a/drivers/ide/arm/bast-ide.c +++ /dev/null | |||
@@ -1,90 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2003-2004 Simtec Electronics | ||
3 | * Ben Dooks <ben@simtec.co.uk> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify | ||
6 | * it under the terms of the GNU General Public License version 2 as | ||
7 | * published by the Free Software Foundation. | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/errno.h> | ||
13 | #include <linux/ide.h> | ||
14 | #include <linux/init.h> | ||
15 | |||
16 | #include <asm/mach-types.h> | ||
17 | |||
18 | #include <asm/io.h> | ||
19 | #include <asm/irq.h> | ||
20 | #include <asm/arch/map.h> | ||
21 | #include <asm/arch/bast-map.h> | ||
22 | #include <asm/arch/bast-irq.h> | ||
23 | |||
24 | #define DRV_NAME "bast-ide" | ||
25 | |||
26 | static int __init bastide_register(unsigned int base, unsigned int aux, int irq) | ||
27 | { | ||
28 | ide_hwif_t *hwif; | ||
29 | hw_regs_t hw; | ||
30 | int i; | ||
31 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | ||
32 | |||
33 | memset(&hw, 0, sizeof(hw)); | ||
34 | |||
35 | base += BAST_IDE_CS; | ||
36 | aux += BAST_IDE_CS; | ||
37 | |||
38 | for (i = 0; i <= 7; i++) { | ||
39 | hw.io_ports_array[i] = (unsigned long)base; | ||
40 | base += 0x20; | ||
41 | } | ||
42 | |||
43 | hw.io_ports.ctl_addr = aux + (6 * 0x20); | ||
44 | hw.irq = irq; | ||
45 | hw.chipset = ide_generic; | ||
46 | |||
47 | hwif = ide_find_port(); | ||
48 | if (hwif == NULL) | ||
49 | goto out; | ||
50 | |||
51 | i = hwif->index; | ||
52 | |||
53 | ide_init_port_data(hwif, i); | ||
54 | ide_init_port_hw(hwif, &hw); | ||
55 | hwif->port_ops = NULL; | ||
56 | |||
57 | idx[0] = i; | ||
58 | |||
59 | ide_device_add(idx, NULL); | ||
60 | out: | ||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | static int __init bastide_init(void) | ||
65 | { | ||
66 | unsigned long base = BAST_VA_IDEPRI + BAST_IDE_CS; | ||
67 | |||
68 | /* we can treat the VR1000 and the BAST the same */ | ||
69 | |||
70 | if (!(machine_is_bast() || machine_is_vr1000())) | ||
71 | return 0; | ||
72 | |||
73 | printk("BAST: IDE driver, (c) 2003-2004 Simtec Electronics\n"); | ||
74 | |||
75 | if (!request_mem_region(base, 0x400000, DRV_NAME)) { | ||
76 | printk(KERN_ERR "%s: resources busy\n", DRV_NAME); | ||
77 | return -EBUSY; | ||
78 | } | ||
79 | |||
80 | bastide_register(BAST_VA_IDEPRI, BAST_VA_IDEPRIAUX, IRQ_IDE0); | ||
81 | bastide_register(BAST_VA_IDESEC, BAST_VA_IDESECAUX, IRQ_IDE1); | ||
82 | |||
83 | return 0; | ||
84 | } | ||
85 | |||
86 | module_init(bastide_init); | ||
87 | |||
88 | MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>"); | ||
89 | MODULE_LICENSE("GPL"); | ||
90 | MODULE_DESCRIPTION("Simtec BAST / Thorcom VR1000 IDE driver"); | ||
diff --git a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c index 061456914ca3..52f58c885783 100644 --- a/drivers/ide/arm/icside.c +++ b/drivers/ide/arm/icside.c | |||
@@ -21,6 +21,8 @@ | |||
21 | #include <asm/dma.h> | 21 | #include <asm/dma.h> |
22 | #include <asm/ecard.h> | 22 | #include <asm/ecard.h> |
23 | 23 | ||
24 | #define DRV_NAME "icside" | ||
25 | |||
24 | #define ICS_IDENT_OFFSET 0x2280 | 26 | #define ICS_IDENT_OFFSET 0x2280 |
25 | 27 | ||
26 | #define ICS_ARCIN_V5_INTRSTAT 0x0000 | 28 | #define ICS_ARCIN_V5_INTRSTAT 0x0000 |
@@ -68,6 +70,7 @@ struct icside_state { | |||
68 | unsigned int enabled; | 70 | unsigned int enabled; |
69 | void __iomem *irq_port; | 71 | void __iomem *irq_port; |
70 | void __iomem *ioc_base; | 72 | void __iomem *ioc_base; |
73 | unsigned int sel; | ||
71 | unsigned int type; | 74 | unsigned int type; |
72 | ide_hwif_t *hwif[2]; | 75 | ide_hwif_t *hwif[2]; |
73 | }; | 76 | }; |
@@ -165,7 +168,8 @@ static const expansioncard_ops_t icside_ops_arcin_v6 = { | |||
165 | static void icside_maskproc(ide_drive_t *drive, int mask) | 168 | static void icside_maskproc(ide_drive_t *drive, int mask) |
166 | { | 169 | { |
167 | ide_hwif_t *hwif = HWIF(drive); | 170 | ide_hwif_t *hwif = HWIF(drive); |
168 | struct icside_state *state = hwif->hwif_data; | 171 | struct expansion_card *ec = ECARD_DEV(hwif->dev); |
172 | struct icside_state *state = ecard_get_drvdata(ec); | ||
169 | unsigned long flags; | 173 | unsigned long flags; |
170 | 174 | ||
171 | local_irq_save(flags); | 175 | local_irq_save(flags); |
@@ -308,6 +312,7 @@ static int icside_dma_setup(ide_drive_t *drive) | |||
308 | { | 312 | { |
309 | ide_hwif_t *hwif = HWIF(drive); | 313 | ide_hwif_t *hwif = HWIF(drive); |
310 | struct expansion_card *ec = ECARD_DEV(hwif->dev); | 314 | struct expansion_card *ec = ECARD_DEV(hwif->dev); |
315 | struct icside_state *state = ecard_get_drvdata(ec); | ||
311 | struct request *rq = hwif->hwgroup->rq; | 316 | struct request *rq = hwif->hwgroup->rq; |
312 | unsigned int dma_mode; | 317 | unsigned int dma_mode; |
313 | 318 | ||
@@ -331,7 +336,7 @@ static int icside_dma_setup(ide_drive_t *drive) | |||
331 | /* | 336 | /* |
332 | * Route the DMA signals to the correct interface. | 337 | * Route the DMA signals to the correct interface. |
333 | */ | 338 | */ |
334 | writeb(hwif->select_data, hwif->config_data); | 339 | writeb(state->sel | hwif->channel, state->ioc_base); |
335 | 340 | ||
336 | /* | 341 | /* |
337 | * Select the correct timing for this drive. | 342 | * Select the correct timing for this drive. |
@@ -359,7 +364,8 @@ static void icside_dma_exec_cmd(ide_drive_t *drive, u8 cmd) | |||
359 | static int icside_dma_test_irq(ide_drive_t *drive) | 364 | static int icside_dma_test_irq(ide_drive_t *drive) |
360 | { | 365 | { |
361 | ide_hwif_t *hwif = HWIF(drive); | 366 | ide_hwif_t *hwif = HWIF(drive); |
362 | struct icside_state *state = hwif->hwif_data; | 367 | struct expansion_card *ec = ECARD_DEV(hwif->dev); |
368 | struct icside_state *state = ecard_get_drvdata(ec); | ||
363 | 369 | ||
364 | return readb(state->irq_port + | 370 | return readb(state->irq_port + |
365 | (hwif->channel ? | 371 | (hwif->channel ? |
@@ -411,36 +417,24 @@ static int icside_dma_off_init(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
411 | return -EOPNOTSUPP; | 417 | return -EOPNOTSUPP; |
412 | } | 418 | } |
413 | 419 | ||
414 | static ide_hwif_t * | 420 | static void icside_setup_ports(hw_regs_t *hw, void __iomem *base, |
415 | icside_setup(void __iomem *base, struct cardinfo *info, struct expansion_card *ec) | 421 | struct cardinfo *info, struct expansion_card *ec) |
416 | { | 422 | { |
417 | unsigned long port = (unsigned long)base + info->dataoffset; | 423 | unsigned long port = (unsigned long)base + info->dataoffset; |
418 | ide_hwif_t *hwif; | ||
419 | 424 | ||
420 | hwif = ide_find_port(); | 425 | hw->io_ports.data_addr = port; |
421 | if (hwif) { | 426 | hw->io_ports.error_addr = port + (1 << info->stepping); |
422 | /* | 427 | hw->io_ports.nsect_addr = port + (2 << info->stepping); |
423 | * Ensure we're using MMIO | 428 | hw->io_ports.lbal_addr = port + (3 << info->stepping); |
424 | */ | 429 | hw->io_ports.lbam_addr = port + (4 << info->stepping); |
425 | default_hwif_mmiops(hwif); | 430 | hw->io_ports.lbah_addr = port + (5 << info->stepping); |
426 | 431 | hw->io_ports.device_addr = port + (6 << info->stepping); | |
427 | hwif->io_ports.data_addr = port; | 432 | hw->io_ports.status_addr = port + (7 << info->stepping); |
428 | hwif->io_ports.error_addr = port + (1 << info->stepping); | 433 | hw->io_ports.ctl_addr = (unsigned long)base + info->ctrloffset; |
429 | hwif->io_ports.nsect_addr = port + (2 << info->stepping); | 434 | |
430 | hwif->io_ports.lbal_addr = port + (3 << info->stepping); | 435 | hw->irq = ec->irq; |
431 | hwif->io_ports.lbam_addr = port + (4 << info->stepping); | 436 | hw->dev = &ec->dev; |
432 | hwif->io_ports.lbah_addr = port + (5 << info->stepping); | 437 | hw->chipset = ide_acorn; |
433 | hwif->io_ports.device_addr = port + (6 << info->stepping); | ||
434 | hwif->io_ports.status_addr = port + (7 << info->stepping); | ||
435 | hwif->io_ports.ctl_addr = | ||
436 | (unsigned long)base + info->ctrloffset; | ||
437 | hwif->irq = ec->irq; | ||
438 | hwif->chipset = ide_acorn; | ||
439 | hwif->gendev.parent = &ec->dev; | ||
440 | hwif->dev = &ec->dev; | ||
441 | } | ||
442 | |||
443 | return hwif; | ||
444 | } | 438 | } |
445 | 439 | ||
446 | static int __init | 440 | static int __init |
@@ -449,6 +443,7 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec) | |||
449 | ide_hwif_t *hwif; | 443 | ide_hwif_t *hwif; |
450 | void __iomem *base; | 444 | void __iomem *base; |
451 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 445 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
446 | hw_regs_t hw; | ||
452 | 447 | ||
453 | base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); | 448 | base = ecardm_iomap(ec, ECARD_RES_MEMC, 0, 0); |
454 | if (!base) | 449 | if (!base) |
@@ -466,12 +461,19 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec) | |||
466 | */ | 461 | */ |
467 | icside_irqdisable_arcin_v5(ec, 0); | 462 | icside_irqdisable_arcin_v5(ec, 0); |
468 | 463 | ||
469 | hwif = icside_setup(base, &icside_cardinfo_v5, ec); | 464 | icside_setup_ports(&hw, base, &icside_cardinfo_v5, ec); |
465 | |||
466 | hwif = ide_find_port(); | ||
470 | if (!hwif) | 467 | if (!hwif) |
471 | return -ENODEV; | 468 | return -ENODEV; |
472 | 469 | ||
470 | ide_init_port_hw(hwif, &hw); | ||
471 | default_hwif_mmiops(hwif); | ||
472 | |||
473 | state->hwif[0] = hwif; | 473 | state->hwif[0] = hwif; |
474 | 474 | ||
475 | ecard_set_drvdata(ec, state); | ||
476 | |||
475 | idx[0] = hwif->index; | 477 | idx[0] = hwif->index; |
476 | 478 | ||
477 | ide_device_add(idx, NULL); | 479 | ide_device_add(idx, NULL); |
@@ -497,6 +499,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec) | |||
497 | int ret; | 499 | int ret; |
498 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 500 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
499 | struct ide_port_info d = icside_v6_port_info; | 501 | struct ide_port_info d = icside_v6_port_info; |
502 | hw_regs_t hw[2]; | ||
500 | 503 | ||
501 | ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); | 504 | ioc_base = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, 0); |
502 | if (!ioc_base) { | 505 | if (!ioc_base) { |
@@ -525,43 +528,47 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec) | |||
525 | 528 | ||
526 | state->irq_port = easi_base; | 529 | state->irq_port = easi_base; |
527 | state->ioc_base = ioc_base; | 530 | state->ioc_base = ioc_base; |
531 | state->sel = sel; | ||
528 | 532 | ||
529 | /* | 533 | /* |
530 | * Be on the safe side - disable interrupts | 534 | * Be on the safe side - disable interrupts |
531 | */ | 535 | */ |
532 | icside_irqdisable_arcin_v6(ec, 0); | 536 | icside_irqdisable_arcin_v6(ec, 0); |
533 | 537 | ||
538 | icside_setup_ports(&hw[0], easi_base, &icside_cardinfo_v6_1, ec); | ||
539 | icside_setup_ports(&hw[1], easi_base, &icside_cardinfo_v6_2, ec); | ||
540 | |||
534 | /* | 541 | /* |
535 | * Find and register the interfaces. | 542 | * Find and register the interfaces. |
536 | */ | 543 | */ |
537 | hwif = icside_setup(easi_base, &icside_cardinfo_v6_1, ec); | 544 | hwif = ide_find_port(); |
538 | mate = icside_setup(easi_base, &icside_cardinfo_v6_2, ec); | 545 | if (hwif == NULL) |
546 | return -ENODEV; | ||
539 | 547 | ||
540 | if (!hwif || !mate) { | 548 | ide_init_port_hw(hwif, &hw[0]); |
541 | ret = -ENODEV; | 549 | default_hwif_mmiops(hwif); |
542 | goto out; | 550 | |
551 | idx[0] = hwif->index; | ||
552 | |||
553 | mate = ide_find_port(); | ||
554 | if (mate) { | ||
555 | ide_init_port_hw(mate, &hw[1]); | ||
556 | default_hwif_mmiops(mate); | ||
557 | |||
558 | idx[1] = mate->index; | ||
543 | } | 559 | } |
544 | 560 | ||
545 | state->hwif[0] = hwif; | 561 | state->hwif[0] = hwif; |
546 | state->hwif[1] = mate; | 562 | state->hwif[1] = mate; |
547 | 563 | ||
548 | hwif->hwif_data = state; | 564 | ecard_set_drvdata(ec, state); |
549 | hwif->config_data = (unsigned long)ioc_base; | ||
550 | hwif->select_data = sel; | ||
551 | |||
552 | mate->hwif_data = state; | ||
553 | mate->config_data = (unsigned long)ioc_base; | ||
554 | mate->select_data = sel | 1; | ||
555 | 565 | ||
556 | if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) { | 566 | if (ec->dma != NO_DMA && !request_dma(ec->dma, DRV_NAME)) { |
557 | d.init_dma = icside_dma_init; | 567 | d.init_dma = icside_dma_init; |
558 | d.port_ops = &icside_v6_port_ops; | 568 | d.port_ops = &icside_v6_port_ops; |
559 | d.dma_ops = NULL; | 569 | d.dma_ops = NULL; |
560 | } | 570 | } |
561 | 571 | ||
562 | idx[0] = hwif->index; | ||
563 | idx[1] = mate->index; | ||
564 | |||
565 | ide_device_add(idx, &d); | 572 | ide_device_add(idx, &d); |
566 | 573 | ||
567 | return 0; | 574 | return 0; |
@@ -627,10 +634,8 @@ icside_probe(struct expansion_card *ec, const struct ecard_id *id) | |||
627 | break; | 634 | break; |
628 | } | 635 | } |
629 | 636 | ||
630 | if (ret == 0) { | 637 | if (ret == 0) |
631 | ecard_set_drvdata(ec, state); | ||
632 | goto out; | 638 | goto out; |
633 | } | ||
634 | 639 | ||
635 | kfree(state); | 640 | kfree(state); |
636 | release: | 641 | release: |
diff --git a/drivers/ide/arm/palm_bk3710.c b/drivers/ide/arm/palm_bk3710.c index 3839f5722985..c79b85b6e4a3 100644 --- a/drivers/ide/arm/palm_bk3710.c +++ b/drivers/ide/arm/palm_bk3710.c | |||
@@ -74,8 +74,6 @@ struct palm_bk3710_udmatiming { | |||
74 | #define BK3710_IORDYTMP 0x78 | 74 | #define BK3710_IORDYTMP 0x78 |
75 | #define BK3710_IORDYTMS 0x7C | 75 | #define BK3710_IORDYTMS 0x7C |
76 | 76 | ||
77 | #include "../ide-timing.h" | ||
78 | |||
79 | static unsigned ideclk_period; /* in nanoseconds */ | 77 | static unsigned ideclk_period; /* in nanoseconds */ |
80 | 78 | ||
81 | static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = { | 79 | static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = { |
@@ -402,7 +400,6 @@ static int __devinit palm_bk3710_probe(struct platform_device *pdev) | |||
402 | 400 | ||
403 | i = hwif->index; | 401 | i = hwif->index; |
404 | 402 | ||
405 | ide_init_port_data(hwif, i); | ||
406 | ide_init_port_hw(hwif, &hw); | 403 | ide_init_port_hw(hwif, &hw); |
407 | 404 | ||
408 | default_hwif_mmiops(hwif); | 405 | default_hwif_mmiops(hwif); |
diff --git a/drivers/ide/arm/rapide.c b/drivers/ide/arm/rapide.c index 1747b2358775..43057e0303c8 100644 --- a/drivers/ide/arm/rapide.c +++ b/drivers/ide/arm/rapide.c | |||
@@ -11,6 +11,10 @@ | |||
11 | 11 | ||
12 | #include <asm/ecard.h> | 12 | #include <asm/ecard.h> |
13 | 13 | ||
14 | static struct const ide_port_info rapide_port_info = { | ||
15 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | ||
16 | }; | ||
17 | |||
14 | static void rapide_setup_ports(hw_regs_t *hw, void __iomem *base, | 18 | static void rapide_setup_ports(hw_regs_t *hw, void __iomem *base, |
15 | void __iomem *ctrl, unsigned int sz, int irq) | 19 | void __iomem *ctrl, unsigned int sz, int irq) |
16 | { | 20 | { |
@@ -44,25 +48,26 @@ rapide_probe(struct expansion_card *ec, const struct ecard_id *id) | |||
44 | goto release; | 48 | goto release; |
45 | } | 49 | } |
46 | 50 | ||
47 | hwif = ide_find_port(); | 51 | memset(&hw, 0, sizeof(hw)); |
48 | if (hwif) { | 52 | rapide_setup_ports(&hw, base, base + 0x818, 1 << 6, ec->irq); |
49 | memset(&hw, 0, sizeof(hw)); | 53 | hw.chipset = ide_generic; |
50 | rapide_setup_ports(&hw, base, base + 0x818, 1 << 6, ec->irq); | 54 | hw.dev = &ec->dev; |
51 | hw.chipset = ide_generic; | ||
52 | hw.dev = &ec->dev; | ||
53 | 55 | ||
54 | ide_init_port_hw(hwif, &hw); | 56 | hwif = ide_find_port(); |
57 | if (hwif == NULL) { | ||
58 | ret = -ENOENT; | ||
59 | goto release; | ||
60 | } | ||
55 | 61 | ||
56 | hwif->host_flags = IDE_HFLAG_MMIO; | 62 | ide_init_port_hw(hwif, &hw); |
57 | default_hwif_mmiops(hwif); | 63 | default_hwif_mmiops(hwif); |
58 | 64 | ||
59 | idx[0] = hwif->index; | 65 | idx[0] = hwif->index; |
60 | 66 | ||
61 | ide_device_add(idx, NULL); | 67 | ide_device_add(idx, &rapide_port_info); |
62 | 68 | ||
63 | ecard_set_drvdata(ec, hwif); | 69 | ecard_set_drvdata(ec, hwif); |
64 | goto out; | 70 | goto out; |
65 | } | ||
66 | 71 | ||
67 | release: | 72 | release: |
68 | ecard_release_resources(ec); | 73 | ecard_release_resources(ec); |
diff --git a/drivers/ide/h8300/ide-h8300.c b/drivers/ide/h8300/ide-h8300.c index ae37ee58bae2..20fad6d542cc 100644 --- a/drivers/ide/h8300/ide-h8300.c +++ b/drivers/ide/h8300/ide-h8300.c | |||
@@ -8,6 +8,8 @@ | |||
8 | #include <asm/io.h> | 8 | #include <asm/io.h> |
9 | #include <asm/irq.h> | 9 | #include <asm/irq.h> |
10 | 10 | ||
11 | #define DRV_NAME "ide-h8300" | ||
12 | |||
11 | #define bswap(d) \ | 13 | #define bswap(d) \ |
12 | ({ \ | 14 | ({ \ |
13 | u16 r; \ | 15 | u16 r; \ |
@@ -176,6 +178,10 @@ static inline void hwif_setup(ide_hwif_t *hwif) | |||
176 | hwif->output_data = h8300_output_data; | 178 | hwif->output_data = h8300_output_data; |
177 | } | 179 | } |
178 | 180 | ||
181 | static const struct ide_port_info h8300_port_info = { | ||
182 | .host_flags = IDE_HFLAG_NO_IO_32BIT | IDE_HFLAG_NO_DMA, | ||
183 | }; | ||
184 | |||
179 | static int __init h8300_ide_init(void) | 185 | static int __init h8300_ide_init(void) |
180 | { | 186 | { |
181 | hw_regs_t hw; | 187 | hw_regs_t hw; |
@@ -183,6 +189,8 @@ static int __init h8300_ide_init(void) | |||
183 | int index; | 189 | int index; |
184 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 190 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
185 | 191 | ||
192 | printk(KERN_INFO DRV_NAME ": H8/300 generic IDE interface\n"); | ||
193 | |||
186 | if (!request_region(CONFIG_H8300_IDE_BASE, H8300_IDE_GAP*8, "ide-h8300")) | 194 | if (!request_region(CONFIG_H8300_IDE_BASE, H8300_IDE_GAP*8, "ide-h8300")) |
187 | goto out_busy; | 195 | goto out_busy; |
188 | if (!request_region(CONFIG_H8300_IDE_ALT, H8300_IDE_GAP, "ide-h8300")) { | 196 | if (!request_region(CONFIG_H8300_IDE_ALT, H8300_IDE_GAP, "ide-h8300")) { |
@@ -192,22 +200,17 @@ static int __init h8300_ide_init(void) | |||
192 | 200 | ||
193 | hw_setup(&hw); | 201 | hw_setup(&hw); |
194 | 202 | ||
195 | hwif = ide_find_port(); | 203 | hwif = ide_find_port_slot(&h8300_port_info); |
196 | if (hwif == NULL) { | 204 | if (hwif == NULL) |
197 | printk(KERN_ERR "ide-h8300: IDE I/F register failed\n"); | ||
198 | return -ENOENT; | 205 | return -ENOENT; |
199 | } | ||
200 | 206 | ||
201 | index = hwif->index; | 207 | index = hwif->index; |
202 | ide_init_port_data(hwif, index); | ||
203 | ide_init_port_hw(hwif, &hw); | 208 | ide_init_port_hw(hwif, &hw); |
204 | hwif_setup(hwif); | 209 | hwif_setup(hwif); |
205 | hwif->host_flags = IDE_HFLAG_NO_IO_32BIT; | ||
206 | printk(KERN_INFO "ide%d: H8/300 generic IDE interface\n", index); | ||
207 | 210 | ||
208 | idx[0] = index; | 211 | idx[0] = index; |
209 | 212 | ||
210 | ide_device_add(idx, NULL); | 213 | ide_device_add(idx, &h8300_port_info); |
211 | 214 | ||
212 | return 0; | 215 | return 0; |
213 | 216 | ||
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index d99847157186..6e29dd532090 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -517,14 +517,9 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive, | |||
517 | int xferlen, | 517 | int xferlen, |
518 | ide_handler_t *handler) | 518 | ide_handler_t *handler) |
519 | { | 519 | { |
520 | ide_startstop_t startstop; | ||
521 | struct cdrom_info *info = drive->driver_data; | 520 | struct cdrom_info *info = drive->driver_data; |
522 | ide_hwif_t *hwif = drive->hwif; | 521 | ide_hwif_t *hwif = drive->hwif; |
523 | 522 | ||
524 | /* wait for the controller to be idle */ | ||
525 | if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY)) | ||
526 | return startstop; | ||
527 | |||
528 | /* FIXME: for Virtual DMA we must check harder */ | 523 | /* FIXME: for Virtual DMA we must check harder */ |
529 | if (info->dma) | 524 | if (info->dma) |
530 | info->dma = !hwif->dma_ops->dma_setup(drive); | 525 | info->dma = !hwif->dma_ops->dma_setup(drive); |
@@ -604,28 +599,6 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, | |||
604 | } | 599 | } |
605 | 600 | ||
606 | /* | 601 | /* |
607 | * Block read functions. | ||
608 | */ | ||
609 | static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len) | ||
610 | { | ||
611 | while (len > 0) { | ||
612 | int dum = 0; | ||
613 | xf(drive, NULL, &dum, sizeof(dum)); | ||
614 | len -= sizeof(dum); | ||
615 | } | ||
616 | } | ||
617 | |||
618 | static void ide_cd_drain_data(ide_drive_t *drive, int nsects) | ||
619 | { | ||
620 | while (nsects > 0) { | ||
621 | static char dum[SECTOR_SIZE]; | ||
622 | |||
623 | drive->hwif->input_data(drive, NULL, dum, sizeof(dum)); | ||
624 | nsects--; | ||
625 | } | ||
626 | } | ||
627 | |||
628 | /* | ||
629 | * Check the contents of the interrupt reason register from the cdrom | 602 | * Check the contents of the interrupt reason register from the cdrom |
630 | * and attempt to recover if there are problems. Returns 0 if everything's | 603 | * and attempt to recover if there are problems. Returns 0 if everything's |
631 | * ok; nonzero if the request has been terminated. | 604 | * ok; nonzero if the request has been terminated. |
@@ -640,15 +613,12 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq, | |||
640 | if (ireason == (!rw << 1)) | 613 | if (ireason == (!rw << 1)) |
641 | return 0; | 614 | return 0; |
642 | else if (ireason == (rw << 1)) { | 615 | else if (ireason == (rw << 1)) { |
643 | ide_hwif_t *hwif = drive->hwif; | ||
644 | xfer_func_t *xf; | ||
645 | 616 | ||
646 | /* whoops... */ | 617 | /* whoops... */ |
647 | printk(KERN_ERR "%s: %s: wrong transfer direction!\n", | 618 | printk(KERN_ERR "%s: %s: wrong transfer direction!\n", |
648 | drive->name, __func__); | 619 | drive->name, __func__); |
649 | 620 | ||
650 | xf = rw ? hwif->output_data : hwif->input_data; | 621 | ide_pad_transfer(drive, rw, len); |
651 | ide_cd_pad_transfer(drive, xf, len); | ||
652 | } else if (rw == 0 && ireason == 1) { | 622 | } else if (rw == 0 && ireason == 1) { |
653 | /* | 623 | /* |
654 | * Some drives (ASUS) seem to tell us that status info is | 624 | * Some drives (ASUS) seem to tell us that status info is |
@@ -696,16 +666,9 @@ static int ide_cd_check_transfer_size(ide_drive_t *drive, int len) | |||
696 | 666 | ||
697 | static ide_startstop_t cdrom_newpc_intr(ide_drive_t *); | 667 | static ide_startstop_t cdrom_newpc_intr(ide_drive_t *); |
698 | 668 | ||
699 | /* | 669 | static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive, |
700 | * Routine to send a read/write packet command to the drive. This is usually | 670 | struct request *rq) |
701 | * called directly from cdrom_start_{read,write}(). However, for drq_interrupt | ||
702 | * devices, it is called from an interrupt when the drive is ready to accept | ||
703 | * the command. | ||
704 | */ | ||
705 | static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive) | ||
706 | { | 671 | { |
707 | struct request *rq = HWGROUP(drive)->rq; | ||
708 | |||
709 | if (rq_data_dir(rq) == READ) { | 672 | if (rq_data_dir(rq) == READ) { |
710 | unsigned short sectors_per_frame = | 673 | unsigned short sectors_per_frame = |
711 | queue_hardsect_size(drive->queue) >> SECTOR_BITS; | 674 | queue_hardsect_size(drive->queue) >> SECTOR_BITS; |
@@ -742,6 +705,19 @@ static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive) | |||
742 | /* set up the command */ | 705 | /* set up the command */ |
743 | rq->timeout = ATAPI_WAIT_PC; | 706 | rq->timeout = ATAPI_WAIT_PC; |
744 | 707 | ||
708 | return ide_started; | ||
709 | } | ||
710 | |||
711 | /* | ||
712 | * Routine to send a read/write packet command to the drive. This is usually | ||
713 | * called directly from cdrom_start_{read,write}(). However, for drq_interrupt | ||
714 | * devices, it is called from an interrupt when the drive is ready to accept | ||
715 | * the command. | ||
716 | */ | ||
717 | static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive) | ||
718 | { | ||
719 | struct request *rq = drive->hwif->hwgroup->rq; | ||
720 | |||
745 | /* send the command to the drive and return */ | 721 | /* send the command to the drive and return */ |
746 | return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); | 722 | return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); |
747 | } | 723 | } |
@@ -768,9 +744,8 @@ static ide_startstop_t cdrom_seek_intr(ide_drive_t *drive) | |||
768 | return ide_stopped; | 744 | return ide_stopped; |
769 | } | 745 | } |
770 | 746 | ||
771 | static ide_startstop_t cdrom_start_seek_continuation(ide_drive_t *drive) | 747 | static void ide_cd_prepare_seek_request(ide_drive_t *drive, struct request *rq) |
772 | { | 748 | { |
773 | struct request *rq = HWGROUP(drive)->rq; | ||
774 | sector_t frame = rq->sector; | 749 | sector_t frame = rq->sector; |
775 | 750 | ||
776 | sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS); | 751 | sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS); |
@@ -780,17 +755,13 @@ static ide_startstop_t cdrom_start_seek_continuation(ide_drive_t *drive) | |||
780 | put_unaligned(cpu_to_be32(frame), (unsigned int *) &rq->cmd[2]); | 755 | put_unaligned(cpu_to_be32(frame), (unsigned int *) &rq->cmd[2]); |
781 | 756 | ||
782 | rq->timeout = ATAPI_WAIT_PC; | 757 | rq->timeout = ATAPI_WAIT_PC; |
783 | return cdrom_transfer_packet_command(drive, rq, &cdrom_seek_intr); | ||
784 | } | 758 | } |
785 | 759 | ||
786 | static ide_startstop_t cdrom_start_seek(ide_drive_t *drive, unsigned int block) | 760 | static ide_startstop_t cdrom_start_seek_continuation(ide_drive_t *drive) |
787 | { | 761 | { |
788 | struct cdrom_info *info = drive->driver_data; | 762 | struct request *rq = drive->hwif->hwgroup->rq; |
789 | 763 | ||
790 | info->dma = 0; | 764 | return cdrom_transfer_packet_command(drive, rq, &cdrom_seek_intr); |
791 | info->start_seek = jiffies; | ||
792 | return cdrom_start_packet_command(drive, 0, | ||
793 | cdrom_start_seek_continuation); | ||
794 | } | 765 | } |
795 | 766 | ||
796 | /* | 767 | /* |
@@ -1011,7 +982,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
1011 | - bio_cur_sectors(rq->bio), | 982 | - bio_cur_sectors(rq->bio), |
1012 | thislen >> 9); | 983 | thislen >> 9); |
1013 | if (nskip > 0) { | 984 | if (nskip > 0) { |
1014 | ide_cd_drain_data(drive, nskip); | 985 | ide_pad_transfer(drive, write, nskip << 9); |
1015 | rq->current_nr_sectors -= nskip; | 986 | rq->current_nr_sectors -= nskip; |
1016 | thislen -= (nskip << 9); | 987 | thislen -= (nskip << 9); |
1017 | } | 988 | } |
@@ -1048,7 +1019,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
1048 | * If the buffers are full, pipe the rest into | 1019 | * If the buffers are full, pipe the rest into |
1049 | * oblivion. | 1020 | * oblivion. |
1050 | */ | 1021 | */ |
1051 | ide_cd_drain_data(drive, thislen >> 9); | 1022 | ide_pad_transfer(drive, 0, thislen); |
1052 | else { | 1023 | else { |
1053 | printk(KERN_ERR "%s: confused, missing data\n", | 1024 | printk(KERN_ERR "%s: confused, missing data\n", |
1054 | drive->name); | 1025 | drive->name); |
@@ -1096,7 +1067,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
1096 | 1067 | ||
1097 | /* pad, if necessary */ | 1068 | /* pad, if necessary */ |
1098 | if (!blk_fs_request(rq) && len > 0) | 1069 | if (!blk_fs_request(rq) && len > 0) |
1099 | ide_cd_pad_transfer(drive, xferfunc, len); | 1070 | ide_pad_transfer(drive, write, len); |
1100 | 1071 | ||
1101 | if (blk_pc_request(rq)) { | 1072 | if (blk_pc_request(rq)) { |
1102 | timeout = rq->timeout; | 1073 | timeout = rq->timeout; |
@@ -1165,21 +1136,17 @@ static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq) | |||
1165 | if (write) | 1136 | if (write) |
1166 | cd->devinfo.media_written = 1; | 1137 | cd->devinfo.media_written = 1; |
1167 | 1138 | ||
1168 | /* start sending the read/write request to the drive */ | 1139 | return ide_started; |
1169 | return cdrom_start_packet_command(drive, 32768, cdrom_start_rw_cont); | ||
1170 | } | 1140 | } |
1171 | 1141 | ||
1172 | static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive) | 1142 | static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive) |
1173 | { | 1143 | { |
1174 | struct request *rq = HWGROUP(drive)->rq; | 1144 | struct request *rq = HWGROUP(drive)->rq; |
1175 | 1145 | ||
1176 | if (!rq->timeout) | ||
1177 | rq->timeout = ATAPI_WAIT_PC; | ||
1178 | |||
1179 | return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); | 1146 | return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); |
1180 | } | 1147 | } |
1181 | 1148 | ||
1182 | static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) | 1149 | static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) |
1183 | { | 1150 | { |
1184 | struct cdrom_info *info = drive->driver_data; | 1151 | struct cdrom_info *info = drive->driver_data; |
1185 | 1152 | ||
@@ -1191,10 +1158,16 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) | |||
1191 | info->dma = 0; | 1158 | info->dma = 0; |
1192 | 1159 | ||
1193 | /* sg request */ | 1160 | /* sg request */ |
1194 | if (rq->bio) { | 1161 | if (rq->bio || ((rq->cmd_type == REQ_TYPE_ATA_PC) && rq->data_len)) { |
1195 | int mask = drive->queue->dma_alignment; | 1162 | struct request_queue *q = drive->queue; |
1196 | unsigned long addr = | 1163 | unsigned int alignment; |
1197 | (unsigned long)page_address(bio_page(rq->bio)); | 1164 | unsigned long addr; |
1165 | unsigned long stack_mask = ~(THREAD_SIZE - 1); | ||
1166 | |||
1167 | if (rq->bio) | ||
1168 | addr = (unsigned long)bio_data(rq->bio); | ||
1169 | else | ||
1170 | addr = (unsigned long)rq->data; | ||
1198 | 1171 | ||
1199 | info->dma = drive->using_dma; | 1172 | info->dma = drive->using_dma; |
1200 | 1173 | ||
@@ -1204,23 +1177,25 @@ static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) | |||
1204 | * NOTE! The "len" and "addr" checks should possibly have | 1177 | * NOTE! The "len" and "addr" checks should possibly have |
1205 | * separate masks. | 1178 | * separate masks. |
1206 | */ | 1179 | */ |
1207 | if ((rq->data_len & 15) || (addr & mask)) | 1180 | alignment = queue_dma_alignment(q) | q->dma_pad_mask; |
1181 | if (addr & alignment || rq->data_len & alignment) | ||
1208 | info->dma = 0; | 1182 | info->dma = 0; |
1209 | } | ||
1210 | 1183 | ||
1211 | /* start sending the command to the drive */ | 1184 | if (!((addr & stack_mask) ^ |
1212 | return cdrom_start_packet_command(drive, rq->data_len, | 1185 | ((unsigned long)current->stack & stack_mask))) |
1213 | cdrom_do_newpc_cont); | 1186 | info->dma = 0; |
1187 | } | ||
1214 | } | 1188 | } |
1215 | 1189 | ||
1216 | /* | 1190 | /* |
1217 | * cdrom driver request routine. | 1191 | * cdrom driver request routine. |
1218 | */ | 1192 | */ |
1219 | static ide_startstop_t ide_do_rw_cdrom(ide_drive_t *drive, struct request *rq, | 1193 | static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, |
1220 | sector_t block) | 1194 | sector_t block) |
1221 | { | 1195 | { |
1222 | ide_startstop_t action; | ||
1223 | struct cdrom_info *info = drive->driver_data; | 1196 | struct cdrom_info *info = drive->driver_data; |
1197 | ide_handler_t *fn; | ||
1198 | int xferlen; | ||
1224 | 1199 | ||
1225 | if (blk_fs_request(rq)) { | 1200 | if (blk_fs_request(rq)) { |
1226 | if (info->cd_flags & IDE_CD_FLAG_SEEKING) { | 1201 | if (info->cd_flags & IDE_CD_FLAG_SEEKING) { |
@@ -1240,29 +1215,48 @@ static ide_startstop_t ide_do_rw_cdrom(ide_drive_t *drive, struct request *rq, | |||
1240 | } | 1215 | } |
1241 | if (rq_data_dir(rq) == READ && | 1216 | if (rq_data_dir(rq) == READ && |
1242 | IDE_LARGE_SEEK(info->last_block, block, | 1217 | IDE_LARGE_SEEK(info->last_block, block, |
1243 | IDECD_SEEK_THRESHOLD) && | 1218 | IDECD_SEEK_THRESHOLD) && |
1244 | drive->dsc_overlap) | 1219 | drive->dsc_overlap) { |
1245 | action = cdrom_start_seek(drive, block); | 1220 | xferlen = 0; |
1246 | else | 1221 | fn = cdrom_start_seek_continuation; |
1247 | action = cdrom_start_rw(drive, rq); | 1222 | |
1223 | info->dma = 0; | ||
1224 | info->start_seek = jiffies; | ||
1225 | |||
1226 | ide_cd_prepare_seek_request(drive, rq); | ||
1227 | } else { | ||
1228 | xferlen = 32768; | ||
1229 | fn = cdrom_start_rw_cont; | ||
1230 | |||
1231 | if (cdrom_start_rw(drive, rq) == ide_stopped) | ||
1232 | return ide_stopped; | ||
1233 | |||
1234 | if (ide_cd_prepare_rw_request(drive, rq) == ide_stopped) | ||
1235 | return ide_stopped; | ||
1236 | } | ||
1248 | info->last_block = block; | 1237 | info->last_block = block; |
1249 | return action; | ||
1250 | } else if (blk_sense_request(rq) || blk_pc_request(rq) || | 1238 | } else if (blk_sense_request(rq) || blk_pc_request(rq) || |
1251 | rq->cmd_type == REQ_TYPE_ATA_PC) { | 1239 | rq->cmd_type == REQ_TYPE_ATA_PC) { |
1252 | return cdrom_do_block_pc(drive, rq); | 1240 | xferlen = rq->data_len; |
1241 | fn = cdrom_do_newpc_cont; | ||
1242 | |||
1243 | if (!rq->timeout) | ||
1244 | rq->timeout = ATAPI_WAIT_PC; | ||
1245 | |||
1246 | cdrom_do_block_pc(drive, rq); | ||
1253 | } else if (blk_special_request(rq)) { | 1247 | } else if (blk_special_request(rq)) { |
1254 | /* right now this can only be a reset... */ | 1248 | /* right now this can only be a reset... */ |
1255 | cdrom_end_request(drive, 1); | 1249 | cdrom_end_request(drive, 1); |
1256 | return ide_stopped; | 1250 | return ide_stopped; |
1251 | } else { | ||
1252 | blk_dump_rq_flags(rq, "ide-cd bad flags"); | ||
1253 | cdrom_end_request(drive, 0); | ||
1254 | return ide_stopped; | ||
1257 | } | 1255 | } |
1258 | 1256 | ||
1259 | blk_dump_rq_flags(rq, "ide-cd bad flags"); | 1257 | return cdrom_start_packet_command(drive, xferlen, fn); |
1260 | cdrom_end_request(drive, 0); | ||
1261 | return ide_stopped; | ||
1262 | } | 1258 | } |
1263 | 1259 | ||
1264 | |||
1265 | |||
1266 | /* | 1260 | /* |
1267 | * Ioctl handling. | 1261 | * Ioctl handling. |
1268 | * | 1262 | * |
@@ -1872,6 +1866,7 @@ static int ide_cdrom_setup(ide_drive_t *drive) | |||
1872 | 1866 | ||
1873 | blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn); | 1867 | blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn); |
1874 | blk_queue_dma_alignment(drive->queue, 31); | 1868 | blk_queue_dma_alignment(drive->queue, 31); |
1869 | blk_queue_update_dma_pad(drive->queue, 15); | ||
1875 | drive->queue->unplug_delay = (1 * HZ) / 1000; | 1870 | drive->queue->unplug_delay = (1 * HZ) / 1000; |
1876 | if (!drive->queue->unplug_delay) | 1871 | if (!drive->queue->unplug_delay) |
1877 | drive->queue->unplug_delay = 1; | 1872 | drive->queue->unplug_delay = 1; |
@@ -1954,10 +1949,9 @@ static ide_driver_t ide_cdrom_driver = { | |||
1954 | .version = IDECD_VERSION, | 1949 | .version = IDECD_VERSION, |
1955 | .media = ide_cdrom, | 1950 | .media = ide_cdrom, |
1956 | .supports_dsc_overlap = 1, | 1951 | .supports_dsc_overlap = 1, |
1957 | .do_request = ide_do_rw_cdrom, | 1952 | .do_request = ide_cd_do_request, |
1958 | .end_request = ide_end_request, | 1953 | .end_request = ide_end_request, |
1959 | .error = __ide_error, | 1954 | .error = __ide_error, |
1960 | .abort = __ide_abort, | ||
1961 | #ifdef CONFIG_IDE_PROC_FS | 1955 | #ifdef CONFIG_IDE_PROC_FS |
1962 | .proc = idecd_proc, | 1956 | .proc = idecd_proc, |
1963 | #endif | 1957 | #endif |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 5f49a4ae9dd8..3a2e80237c10 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -985,7 +985,6 @@ static ide_driver_t idedisk_driver = { | |||
985 | .do_request = ide_do_rw_disk, | 985 | .do_request = ide_do_rw_disk, |
986 | .end_request = ide_end_request, | 986 | .end_request = ide_end_request, |
987 | .error = __ide_error, | 987 | .error = __ide_error, |
988 | .abort = __ide_abort, | ||
989 | #ifdef CONFIG_IDE_PROC_FS | 988 | #ifdef CONFIG_IDE_PROC_FS |
990 | .proc = idedisk_proc, | 989 | .proc = idedisk_proc, |
991 | #endif | 990 | #endif |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index b3689437269f..011d72011cc4 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -351,10 +351,7 @@ static void ide_floppy_callback(ide_drive_t *drive) | |||
351 | 351 | ||
352 | static void idefloppy_init_pc(struct ide_atapi_pc *pc) | 352 | static void idefloppy_init_pc(struct ide_atapi_pc *pc) |
353 | { | 353 | { |
354 | memset(pc->c, 0, 12); | 354 | memset(pc, 0, sizeof(*pc)); |
355 | pc->retries = 0; | ||
356 | pc->flags = 0; | ||
357 | pc->req_xfer = 0; | ||
358 | pc->buf = pc->pc_buf; | 355 | pc->buf = pc->pc_buf; |
359 | pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE; | 356 | pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE; |
360 | pc->callback = ide_floppy_callback; | 357 | pc->callback = ide_floppy_callback; |
@@ -561,12 +558,6 @@ static void idefloppy_create_start_stop_cmd(struct ide_atapi_pc *pc, int start) | |||
561 | pc->c[4] = start; | 558 | pc->c[4] = start; |
562 | } | 559 | } |
563 | 560 | ||
564 | static void idefloppy_create_test_unit_ready_cmd(struct ide_atapi_pc *pc) | ||
565 | { | ||
566 | idefloppy_init_pc(pc); | ||
567 | pc->c[0] = GPCMD_TEST_UNIT_READY; | ||
568 | } | ||
569 | |||
570 | static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy, | 561 | static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy, |
571 | struct ide_atapi_pc *pc, struct request *rq, | 562 | struct ide_atapi_pc *pc, struct request *rq, |
572 | unsigned long sector) | 563 | unsigned long sector) |
@@ -711,10 +702,10 @@ static int ide_floppy_get_flexible_disk_page(ide_drive_t *drive) | |||
711 | set_disk_ro(floppy->disk, floppy->wp); | 702 | set_disk_ro(floppy->disk, floppy->wp); |
712 | page = &pc.buf[8]; | 703 | page = &pc.buf[8]; |
713 | 704 | ||
714 | transfer_rate = be16_to_cpu(*(u16 *)&pc.buf[8 + 2]); | 705 | transfer_rate = be16_to_cpup((__be16 *)&pc.buf[8 + 2]); |
715 | sector_size = be16_to_cpu(*(u16 *)&pc.buf[8 + 6]); | 706 | sector_size = be16_to_cpup((__be16 *)&pc.buf[8 + 6]); |
716 | cyls = be16_to_cpu(*(u16 *)&pc.buf[8 + 8]); | 707 | cyls = be16_to_cpup((__be16 *)&pc.buf[8 + 8]); |
717 | rpm = be16_to_cpu(*(u16 *)&pc.buf[8 + 28]); | 708 | rpm = be16_to_cpup((__be16 *)&pc.buf[8 + 28]); |
718 | heads = pc.buf[8 + 4]; | 709 | heads = pc.buf[8 + 4]; |
719 | sectors = pc.buf[8 + 5]; | 710 | sectors = pc.buf[8 + 5]; |
720 | 711 | ||
@@ -789,8 +780,8 @@ static int ide_floppy_get_capacity(ide_drive_t *drive) | |||
789 | for (i = 0; i < desc_cnt; i++) { | 780 | for (i = 0; i < desc_cnt; i++) { |
790 | unsigned int desc_start = 4 + i*8; | 781 | unsigned int desc_start = 4 + i*8; |
791 | 782 | ||
792 | blocks = be32_to_cpu(*(u32 *)&pc.buf[desc_start]); | 783 | blocks = be32_to_cpup((__be32 *)&pc.buf[desc_start]); |
793 | length = be16_to_cpu(*(u16 *)&pc.buf[desc_start + 6]); | 784 | length = be16_to_cpup((__be16 *)&pc.buf[desc_start + 6]); |
794 | 785 | ||
795 | debug_log("Descriptor %d: %dkB, %d blocks, %d sector size\n", | 786 | debug_log("Descriptor %d: %dkB, %d blocks, %d sector size\n", |
796 | i, blocks * length / 1024, blocks, length); | 787 | i, blocks * length / 1024, blocks, length); |
@@ -911,8 +902,8 @@ static int ide_floppy_get_format_capacities(ide_drive_t *drive, int __user *arg) | |||
911 | if (u_index >= u_array_size) | 902 | if (u_index >= u_array_size) |
912 | break; /* User-supplied buffer too small */ | 903 | break; /* User-supplied buffer too small */ |
913 | 904 | ||
914 | blocks = be32_to_cpu(*(u32 *)&pc.buf[desc_start]); | 905 | blocks = be32_to_cpup((__be32 *)&pc.buf[desc_start]); |
915 | length = be16_to_cpu(*(u16 *)&pc.buf[desc_start + 6]); | 906 | length = be16_to_cpup((__be16 *)&pc.buf[desc_start + 6]); |
916 | 907 | ||
917 | if (put_user(blocks, argp)) | 908 | if (put_user(blocks, argp)) |
918 | return(-EFAULT); | 909 | return(-EFAULT); |
@@ -1138,7 +1129,6 @@ static ide_driver_t idefloppy_driver = { | |||
1138 | .do_request = idefloppy_do_request, | 1129 | .do_request = idefloppy_do_request, |
1139 | .end_request = idefloppy_end_request, | 1130 | .end_request = idefloppy_end_request, |
1140 | .error = __ide_error, | 1131 | .error = __ide_error, |
1141 | .abort = __ide_abort, | ||
1142 | #ifdef CONFIG_IDE_PROC_FS | 1132 | #ifdef CONFIG_IDE_PROC_FS |
1143 | .proc = idefloppy_proc, | 1133 | .proc = idefloppy_proc, |
1144 | #endif | 1134 | #endif |
@@ -1166,7 +1156,9 @@ static int idefloppy_open(struct inode *inode, struct file *filp) | |||
1166 | floppy->flags &= ~IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS; | 1156 | floppy->flags &= ~IDEFLOPPY_FLAG_FORMAT_IN_PROGRESS; |
1167 | /* Just in case */ | 1157 | /* Just in case */ |
1168 | 1158 | ||
1169 | idefloppy_create_test_unit_ready_cmd(&pc); | 1159 | idefloppy_init_pc(&pc); |
1160 | pc.c[0] = GPCMD_TEST_UNIT_READY; | ||
1161 | |||
1170 | if (idefloppy_queue_pc_tail(drive, &pc)) { | 1162 | if (idefloppy_queue_pc_tail(drive, &pc)) { |
1171 | idefloppy_create_start_stop_cmd(&pc, 1); | 1163 | idefloppy_create_start_stop_cmd(&pc, 1); |
1172 | (void) idefloppy_queue_pc_tail(drive, &pc); | 1164 | (void) idefloppy_queue_pc_tail(drive, &pc); |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 28057747c1f8..661b75a89d4d 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -504,55 +504,6 @@ ide_startstop_t ide_error (ide_drive_t *drive, const char *msg, u8 stat) | |||
504 | 504 | ||
505 | EXPORT_SYMBOL_GPL(ide_error); | 505 | EXPORT_SYMBOL_GPL(ide_error); |
506 | 506 | ||
507 | ide_startstop_t __ide_abort(ide_drive_t *drive, struct request *rq) | ||
508 | { | ||
509 | if (drive->media != ide_disk) | ||
510 | rq->errors |= ERROR_RESET; | ||
511 | |||
512 | ide_kill_rq(drive, rq); | ||
513 | |||
514 | return ide_stopped; | ||
515 | } | ||
516 | |||
517 | EXPORT_SYMBOL_GPL(__ide_abort); | ||
518 | |||
519 | /** | ||
520 | * ide_abort - abort pending IDE operations | ||
521 | * @drive: drive the error occurred on | ||
522 | * @msg: message to report | ||
523 | * | ||
524 | * ide_abort kills and cleans up when we are about to do a | ||
525 | * host initiated reset on active commands. Longer term we | ||
526 | * want handlers to have sensible abort handling themselves | ||
527 | * | ||
528 | * This differs fundamentally from ide_error because in | ||
529 | * this case the command is doing just fine when we | ||
530 | * blow it away. | ||
531 | */ | ||
532 | |||
533 | ide_startstop_t ide_abort(ide_drive_t *drive, const char *msg) | ||
534 | { | ||
535 | struct request *rq; | ||
536 | |||
537 | if (drive == NULL || (rq = HWGROUP(drive)->rq) == NULL) | ||
538 | return ide_stopped; | ||
539 | |||
540 | /* retry only "normal" I/O: */ | ||
541 | if (!blk_fs_request(rq)) { | ||
542 | rq->errors = 1; | ||
543 | ide_end_drive_cmd(drive, BUSY_STAT, 0); | ||
544 | return ide_stopped; | ||
545 | } | ||
546 | |||
547 | if (rq->rq_disk) { | ||
548 | ide_driver_t *drv; | ||
549 | |||
550 | drv = *(ide_driver_t **)rq->rq_disk->private_data; | ||
551 | return drv->abort(drive, rq); | ||
552 | } else | ||
553 | return __ide_abort(drive, rq); | ||
554 | } | ||
555 | |||
556 | static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf) | 507 | static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf) |
557 | { | 508 | { |
558 | tf->nsect = drive->sect; | 509 | tf->nsect = drive->sect; |
@@ -766,6 +717,18 @@ static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, | |||
766 | return ide_stopped; | 717 | return ide_stopped; |
767 | } | 718 | } |
768 | 719 | ||
720 | static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq) | ||
721 | { | ||
722 | switch (rq->cmd[0]) { | ||
723 | case REQ_DRIVE_RESET: | ||
724 | return ide_do_reset(drive); | ||
725 | default: | ||
726 | blk_dump_rq_flags(rq, "ide_special_rq - bad request"); | ||
727 | ide_end_request(drive, 0, 0); | ||
728 | return ide_stopped; | ||
729 | } | ||
730 | } | ||
731 | |||
769 | static void ide_check_pm_state(ide_drive_t *drive, struct request *rq) | 732 | static void ide_check_pm_state(ide_drive_t *drive, struct request *rq) |
770 | { | 733 | { |
771 | struct request_pm_state *pm = rq->data; | 734 | struct request_pm_state *pm = rq->data; |
@@ -869,7 +832,16 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) | |||
869 | pm->pm_step == ide_pm_state_completed) | 832 | pm->pm_step == ide_pm_state_completed) |
870 | ide_complete_pm_request(drive, rq); | 833 | ide_complete_pm_request(drive, rq); |
871 | return startstop; | 834 | return startstop; |
872 | } | 835 | } else if (!rq->rq_disk && blk_special_request(rq)) |
836 | /* | ||
837 | * TODO: Once all ULDs have been modified to | ||
838 | * check for specific op codes rather than | ||
839 | * blindly accepting any special request, the | ||
840 | * check for ->rq_disk above may be replaced | ||
841 | * by a more suitable mechanism or even | ||
842 | * dropped entirely. | ||
843 | */ | ||
844 | return ide_special_rq(drive, rq); | ||
873 | 845 | ||
874 | drv = *(ide_driver_t **)rq->rq_disk->private_data; | 846 | drv = *(ide_driver_t **)rq->rq_disk->private_data; |
875 | return drv->do_request(drive, rq, block); | 847 | return drv->do_request(drive, rq, block); |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 80ad4f234f3f..44aaec256a30 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -905,6 +905,14 @@ void ide_execute_pkt_cmd(ide_drive_t *drive) | |||
905 | } | 905 | } |
906 | EXPORT_SYMBOL_GPL(ide_execute_pkt_cmd); | 906 | EXPORT_SYMBOL_GPL(ide_execute_pkt_cmd); |
907 | 907 | ||
908 | static inline void ide_complete_drive_reset(ide_drive_t *drive, int err) | ||
909 | { | ||
910 | struct request *rq = drive->hwif->hwgroup->rq; | ||
911 | |||
912 | if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET) | ||
913 | ide_end_request(drive, err ? err : 1, 0); | ||
914 | } | ||
915 | |||
908 | /* needed below */ | 916 | /* needed below */ |
909 | static ide_startstop_t do_reset1 (ide_drive_t *, int); | 917 | static ide_startstop_t do_reset1 (ide_drive_t *, int); |
910 | 918 | ||
@@ -940,7 +948,7 @@ static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive) | |||
940 | } | 948 | } |
941 | /* done polling */ | 949 | /* done polling */ |
942 | hwgroup->polling = 0; | 950 | hwgroup->polling = 0; |
943 | hwgroup->resetting = 0; | 951 | ide_complete_drive_reset(drive, 0); |
944 | return ide_stopped; | 952 | return ide_stopped; |
945 | } | 953 | } |
946 | 954 | ||
@@ -956,12 +964,14 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) | |||
956 | ide_hwif_t *hwif = HWIF(drive); | 964 | ide_hwif_t *hwif = HWIF(drive); |
957 | const struct ide_port_ops *port_ops = hwif->port_ops; | 965 | const struct ide_port_ops *port_ops = hwif->port_ops; |
958 | u8 tmp; | 966 | u8 tmp; |
967 | int err = 0; | ||
959 | 968 | ||
960 | if (port_ops && port_ops->reset_poll) { | 969 | if (port_ops && port_ops->reset_poll) { |
961 | if (port_ops->reset_poll(drive)) { | 970 | err = port_ops->reset_poll(drive); |
971 | if (err) { | ||
962 | printk(KERN_ERR "%s: host reset_poll failure for %s.\n", | 972 | printk(KERN_ERR "%s: host reset_poll failure for %s.\n", |
963 | hwif->name, drive->name); | 973 | hwif->name, drive->name); |
964 | return ide_stopped; | 974 | goto out; |
965 | } | 975 | } |
966 | } | 976 | } |
967 | 977 | ||
@@ -975,6 +985,7 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) | |||
975 | } | 985 | } |
976 | printk("%s: reset timed-out, status=0x%02x\n", hwif->name, tmp); | 986 | printk("%s: reset timed-out, status=0x%02x\n", hwif->name, tmp); |
977 | drive->failures++; | 987 | drive->failures++; |
988 | err = -EIO; | ||
978 | } else { | 989 | } else { |
979 | printk("%s: reset: ", hwif->name); | 990 | printk("%s: reset: ", hwif->name); |
980 | tmp = ide_read_error(drive); | 991 | tmp = ide_read_error(drive); |
@@ -1001,10 +1012,12 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive) | |||
1001 | if (tmp & 0x80) | 1012 | if (tmp & 0x80) |
1002 | printk("; slave: failed"); | 1013 | printk("; slave: failed"); |
1003 | printk("\n"); | 1014 | printk("\n"); |
1015 | err = -EIO; | ||
1004 | } | 1016 | } |
1005 | } | 1017 | } |
1018 | out: | ||
1006 | hwgroup->polling = 0; /* done polling */ | 1019 | hwgroup->polling = 0; /* done polling */ |
1007 | hwgroup->resetting = 0; /* done reset attempt */ | 1020 | ide_complete_drive_reset(drive, err); |
1008 | return ide_stopped; | 1021 | return ide_stopped; |
1009 | } | 1022 | } |
1010 | 1023 | ||
@@ -1090,7 +1103,6 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi) | |||
1090 | 1103 | ||
1091 | /* For an ATAPI device, first try an ATAPI SRST. */ | 1104 | /* For an ATAPI device, first try an ATAPI SRST. */ |
1092 | if (drive->media != ide_disk && !do_not_try_atapi) { | 1105 | if (drive->media != ide_disk && !do_not_try_atapi) { |
1093 | hwgroup->resetting = 1; | ||
1094 | pre_reset(drive); | 1106 | pre_reset(drive); |
1095 | SELECT_DRIVE(drive); | 1107 | SELECT_DRIVE(drive); |
1096 | udelay (20); | 1108 | udelay (20); |
@@ -1112,10 +1124,10 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi) | |||
1112 | 1124 | ||
1113 | if (io_ports->ctl_addr == 0) { | 1125 | if (io_ports->ctl_addr == 0) { |
1114 | spin_unlock_irqrestore(&ide_lock, flags); | 1126 | spin_unlock_irqrestore(&ide_lock, flags); |
1127 | ide_complete_drive_reset(drive, -ENXIO); | ||
1115 | return ide_stopped; | 1128 | return ide_stopped; |
1116 | } | 1129 | } |
1117 | 1130 | ||
1118 | hwgroup->resetting = 1; | ||
1119 | /* | 1131 | /* |
1120 | * Note that we also set nIEN while resetting the device, | 1132 | * Note that we also set nIEN while resetting the device, |
1121 | * to mask unwanted interrupts from the interface during the reset. | 1133 | * to mask unwanted interrupts from the interface during the reset. |
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index 47af80df6872..13af72f09ec4 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c | |||
@@ -1,26 +1,11 @@ | |||
1 | #include <linux/module.h> | ||
2 | #include <linux/types.h> | 1 | #include <linux/types.h> |
3 | #include <linux/string.h> | 2 | #include <linux/string.h> |
4 | #include <linux/kernel.h> | 3 | #include <linux/kernel.h> |
5 | #include <linux/timer.h> | ||
6 | #include <linux/mm.h> | ||
7 | #include <linux/interrupt.h> | 4 | #include <linux/interrupt.h> |
8 | #include <linux/major.h> | ||
9 | #include <linux/errno.h> | ||
10 | #include <linux/genhd.h> | ||
11 | #include <linux/blkpg.h> | ||
12 | #include <linux/slab.h> | ||
13 | #include <linux/pci.h> | ||
14 | #include <linux/delay.h> | ||
15 | #include <linux/hdreg.h> | 5 | #include <linux/hdreg.h> |
16 | #include <linux/ide.h> | 6 | #include <linux/ide.h> |
17 | #include <linux/bitops.h> | 7 | #include <linux/bitops.h> |
18 | 8 | ||
19 | #include <asm/byteorder.h> | ||
20 | #include <asm/irq.h> | ||
21 | #include <asm/uaccess.h> | ||
22 | #include <asm/io.h> | ||
23 | |||
24 | static const char *udma_str[] = | 9 | static const char *udma_str[] = |
25 | { "UDMA/16", "UDMA/25", "UDMA/33", "UDMA/44", | 10 | { "UDMA/16", "UDMA/25", "UDMA/33", "UDMA/44", |
26 | "UDMA/66", "UDMA/100", "UDMA/133", "UDMA7" }; | 11 | "UDMA/66", "UDMA/100", "UDMA/133", "UDMA7" }; |
@@ -90,142 +75,6 @@ static u8 ide_rate_filter(ide_drive_t *drive, u8 speed) | |||
90 | return min(speed, mode); | 75 | return min(speed, mode); |
91 | } | 76 | } |
92 | 77 | ||
93 | /* | ||
94 | * Standard (generic) timings for PIO modes, from ATA2 specification. | ||
95 | * These timings are for access to the IDE data port register *only*. | ||
96 | * Some drives may specify a mode, while also specifying a different | ||
97 | * value for cycle_time (from drive identification data). | ||
98 | */ | ||
99 | const ide_pio_timings_t ide_pio_timings[6] = { | ||
100 | { 70, 165, 600 }, /* PIO Mode 0 */ | ||
101 | { 50, 125, 383 }, /* PIO Mode 1 */ | ||
102 | { 30, 100, 240 }, /* PIO Mode 2 */ | ||
103 | { 30, 80, 180 }, /* PIO Mode 3 with IORDY */ | ||
104 | { 25, 70, 120 }, /* PIO Mode 4 with IORDY */ | ||
105 | { 20, 50, 100 } /* PIO Mode 5 with IORDY (nonstandard) */ | ||
106 | }; | ||
107 | |||
108 | EXPORT_SYMBOL_GPL(ide_pio_timings); | ||
109 | |||
110 | /* | ||
111 | * Shared data/functions for determining best PIO mode for an IDE drive. | ||
112 | * Most of this stuff originally lived in cmd640.c, and changes to the | ||
113 | * ide_pio_blacklist[] table should be made with EXTREME CAUTION to avoid | ||
114 | * breaking the fragile cmd640.c support. | ||
115 | */ | ||
116 | |||
117 | /* | ||
118 | * Black list. Some drives incorrectly report their maximal PIO mode, | ||
119 | * at least in respect to CMD640. Here we keep info on some known drives. | ||
120 | */ | ||
121 | static struct ide_pio_info { | ||
122 | const char *name; | ||
123 | int pio; | ||
124 | } ide_pio_blacklist [] = { | ||
125 | { "Conner Peripherals 540MB - CFS540A", 3 }, | ||
126 | |||
127 | { "WDC AC2700", 3 }, | ||
128 | { "WDC AC2540", 3 }, | ||
129 | { "WDC AC2420", 3 }, | ||
130 | { "WDC AC2340", 3 }, | ||
131 | { "WDC AC2250", 0 }, | ||
132 | { "WDC AC2200", 0 }, | ||
133 | { "WDC AC21200", 4 }, | ||
134 | { "WDC AC2120", 0 }, | ||
135 | { "WDC AC2850", 3 }, | ||
136 | { "WDC AC1270", 3 }, | ||
137 | { "WDC AC1170", 1 }, | ||
138 | { "WDC AC1210", 1 }, | ||
139 | { "WDC AC280", 0 }, | ||
140 | { "WDC AC31000", 3 }, | ||
141 | { "WDC AC31200", 3 }, | ||
142 | |||
143 | { "Maxtor 7131 AT", 1 }, | ||
144 | { "Maxtor 7171 AT", 1 }, | ||
145 | { "Maxtor 7213 AT", 1 }, | ||
146 | { "Maxtor 7245 AT", 1 }, | ||
147 | { "Maxtor 7345 AT", 1 }, | ||
148 | { "Maxtor 7546 AT", 3 }, | ||
149 | { "Maxtor 7540 AV", 3 }, | ||
150 | |||
151 | { "SAMSUNG SHD-3121A", 1 }, | ||
152 | { "SAMSUNG SHD-3122A", 1 }, | ||
153 | { "SAMSUNG SHD-3172A", 1 }, | ||
154 | |||
155 | { "ST5660A", 3 }, | ||
156 | { "ST3660A", 3 }, | ||
157 | { "ST3630A", 3 }, | ||
158 | { "ST3655A", 3 }, | ||
159 | { "ST3391A", 3 }, | ||
160 | { "ST3390A", 1 }, | ||
161 | { "ST3600A", 1 }, | ||
162 | { "ST3290A", 0 }, | ||
163 | { "ST3144A", 0 }, | ||
164 | { "ST3491A", 1 }, /* reports 3, should be 1 or 2 (depending on */ | ||
165 | /* drive) according to Seagates FIND-ATA program */ | ||
166 | |||
167 | { "QUANTUM ELS127A", 0 }, | ||
168 | { "QUANTUM ELS170A", 0 }, | ||
169 | { "QUANTUM LPS240A", 0 }, | ||
170 | { "QUANTUM LPS210A", 3 }, | ||
171 | { "QUANTUM LPS270A", 3 }, | ||
172 | { "QUANTUM LPS365A", 3 }, | ||
173 | { "QUANTUM LPS540A", 3 }, | ||
174 | { "QUANTUM LIGHTNING 540A", 3 }, | ||
175 | { "QUANTUM LIGHTNING 730A", 3 }, | ||
176 | |||
177 | { "QUANTUM FIREBALL_540", 3 }, /* Older Quantum Fireballs don't work */ | ||
178 | { "QUANTUM FIREBALL_640", 3 }, | ||
179 | { "QUANTUM FIREBALL_1080", 3 }, | ||
180 | { "QUANTUM FIREBALL_1280", 3 }, | ||
181 | { NULL, 0 } | ||
182 | }; | ||
183 | |||
184 | /** | ||
185 | * ide_scan_pio_blacklist - check for a blacklisted drive | ||
186 | * @model: Drive model string | ||
187 | * | ||
188 | * This routine searches the ide_pio_blacklist for an entry | ||
189 | * matching the start/whole of the supplied model name. | ||
190 | * | ||
191 | * Returns -1 if no match found. | ||
192 | * Otherwise returns the recommended PIO mode from ide_pio_blacklist[]. | ||
193 | */ | ||
194 | |||
195 | static int ide_scan_pio_blacklist (char *model) | ||
196 | { | ||
197 | struct ide_pio_info *p; | ||
198 | |||
199 | for (p = ide_pio_blacklist; p->name != NULL; p++) { | ||
200 | if (strncmp(p->name, model, strlen(p->name)) == 0) | ||
201 | return p->pio; | ||
202 | } | ||
203 | return -1; | ||
204 | } | ||
205 | |||
206 | unsigned int ide_pio_cycle_time(ide_drive_t *drive, u8 pio) | ||
207 | { | ||
208 | struct hd_driveid *id = drive->id; | ||
209 | int cycle_time = 0; | ||
210 | |||
211 | if (id->field_valid & 2) { | ||
212 | if (id->capability & 8) | ||
213 | cycle_time = id->eide_pio_iordy; | ||
214 | else | ||
215 | cycle_time = id->eide_pio; | ||
216 | } | ||
217 | |||
218 | /* conservative "downgrade" for all pre-ATA2 drives */ | ||
219 | if (pio < 3) { | ||
220 | if (cycle_time && cycle_time < ide_pio_timings[pio].cycle_time) | ||
221 | cycle_time = 0; /* use standard timing */ | ||
222 | } | ||
223 | |||
224 | return cycle_time ? cycle_time : ide_pio_timings[pio].cycle_time; | ||
225 | } | ||
226 | |||
227 | EXPORT_SYMBOL_GPL(ide_pio_cycle_time); | ||
228 | |||
229 | /** | 78 | /** |
230 | * ide_get_best_pio_mode - get PIO mode from drive | 79 | * ide_get_best_pio_mode - get PIO mode from drive |
231 | * @drive: drive to consider | 80 | * @drive: drive to consider |
diff --git a/drivers/ide/ide-pio-blacklist.c b/drivers/ide/ide-pio-blacklist.c new file mode 100644 index 000000000000..a8c2c8f8660a --- /dev/null +++ b/drivers/ide/ide-pio-blacklist.c | |||
@@ -0,0 +1,94 @@ | |||
1 | /* | ||
2 | * PIO blacklist. Some drives incorrectly report their maximal PIO mode, | ||
3 | * at least in respect to CMD640. Here we keep info on some known drives. | ||
4 | * | ||
5 | * Changes to the ide_pio_blacklist[] should be made with EXTREME CAUTION | ||
6 | * to avoid breaking the fragile cmd640.c support. | ||
7 | */ | ||
8 | |||
9 | #include <linux/string.h> | ||
10 | |||
11 | static struct ide_pio_info { | ||
12 | const char *name; | ||
13 | int pio; | ||
14 | } ide_pio_blacklist [] = { | ||
15 | { "Conner Peripherals 540MB - CFS540A", 3 }, | ||
16 | |||
17 | { "WDC AC2700", 3 }, | ||
18 | { "WDC AC2540", 3 }, | ||
19 | { "WDC AC2420", 3 }, | ||
20 | { "WDC AC2340", 3 }, | ||
21 | { "WDC AC2250", 0 }, | ||
22 | { "WDC AC2200", 0 }, | ||
23 | { "WDC AC21200", 4 }, | ||
24 | { "WDC AC2120", 0 }, | ||
25 | { "WDC AC2850", 3 }, | ||
26 | { "WDC AC1270", 3 }, | ||
27 | { "WDC AC1170", 1 }, | ||
28 | { "WDC AC1210", 1 }, | ||
29 | { "WDC AC280", 0 }, | ||
30 | { "WDC AC31000", 3 }, | ||
31 | { "WDC AC31200", 3 }, | ||
32 | |||
33 | { "Maxtor 7131 AT", 1 }, | ||
34 | { "Maxtor 7171 AT", 1 }, | ||
35 | { "Maxtor 7213 AT", 1 }, | ||
36 | { "Maxtor 7245 AT", 1 }, | ||
37 | { "Maxtor 7345 AT", 1 }, | ||
38 | { "Maxtor 7546 AT", 3 }, | ||
39 | { "Maxtor 7540 AV", 3 }, | ||
40 | |||
41 | { "SAMSUNG SHD-3121A", 1 }, | ||
42 | { "SAMSUNG SHD-3122A", 1 }, | ||
43 | { "SAMSUNG SHD-3172A", 1 }, | ||
44 | |||
45 | { "ST5660A", 3 }, | ||
46 | { "ST3660A", 3 }, | ||
47 | { "ST3630A", 3 }, | ||
48 | { "ST3655A", 3 }, | ||
49 | { "ST3391A", 3 }, | ||
50 | { "ST3390A", 1 }, | ||
51 | { "ST3600A", 1 }, | ||
52 | { "ST3290A", 0 }, | ||
53 | { "ST3144A", 0 }, | ||
54 | { "ST3491A", 1 }, /* reports 3, should be 1 or 2 (depending on drive) | ||
55 | according to Seagate's FIND-ATA program */ | ||
56 | |||
57 | { "QUANTUM ELS127A", 0 }, | ||
58 | { "QUANTUM ELS170A", 0 }, | ||
59 | { "QUANTUM LPS240A", 0 }, | ||
60 | { "QUANTUM LPS210A", 3 }, | ||
61 | { "QUANTUM LPS270A", 3 }, | ||
62 | { "QUANTUM LPS365A", 3 }, | ||
63 | { "QUANTUM LPS540A", 3 }, | ||
64 | { "QUANTUM LIGHTNING 540A", 3 }, | ||
65 | { "QUANTUM LIGHTNING 730A", 3 }, | ||
66 | |||
67 | { "QUANTUM FIREBALL_540", 3 }, /* Older Quantum Fireballs don't work */ | ||
68 | { "QUANTUM FIREBALL_640", 3 }, | ||
69 | { "QUANTUM FIREBALL_1080", 3 }, | ||
70 | { "QUANTUM FIREBALL_1280", 3 }, | ||
71 | { NULL, 0 } | ||
72 | }; | ||
73 | |||
74 | /** | ||
75 | * ide_scan_pio_blacklist - check for a blacklisted drive | ||
76 | * @model: Drive model string | ||
77 | * | ||
78 | * This routine searches the ide_pio_blacklist for an entry | ||
79 | * matching the start/whole of the supplied model name. | ||
80 | * | ||
81 | * Returns -1 if no match found. | ||
82 | * Otherwise returns the recommended PIO mode from ide_pio_blacklist[]. | ||
83 | */ | ||
84 | |||
85 | int ide_scan_pio_blacklist(char *model) | ||
86 | { | ||
87 | struct ide_pio_info *p; | ||
88 | |||
89 | for (p = ide_pio_blacklist; p->name != NULL; p++) { | ||
90 | if (strncmp(p->name, model, strlen(p->name)) == 0) | ||
91 | return p->pio; | ||
92 | } | ||
93 | return -1; | ||
94 | } | ||
diff --git a/drivers/ide/ide-pnp.c b/drivers/ide/ide-pnp.c index adbd01784162..03f2ef5470a3 100644 --- a/drivers/ide/ide-pnp.c +++ b/drivers/ide/ide-pnp.c | |||
@@ -33,6 +33,8 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | |||
33 | ide_hwif_t *hwif; | 33 | ide_hwif_t *hwif; |
34 | unsigned long base, ctl; | 34 | unsigned long base, ctl; |
35 | 35 | ||
36 | printk(KERN_INFO DRV_NAME ": generic PnP IDE interface\n"); | ||
37 | |||
36 | if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) | 38 | if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) |
37 | return -1; | 39 | return -1; |
38 | 40 | ||
@@ -62,10 +64,8 @@ static int idepnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) | |||
62 | u8 index = hwif->index; | 64 | u8 index = hwif->index; |
63 | u8 idx[4] = { index, 0xff, 0xff, 0xff }; | 65 | u8 idx[4] = { index, 0xff, 0xff, 0xff }; |
64 | 66 | ||
65 | ide_init_port_data(hwif, index); | ||
66 | ide_init_port_hw(hwif, &hw); | 67 | ide_init_port_hw(hwif, &hw); |
67 | 68 | ||
68 | printk(KERN_INFO "ide%d: generic PnP IDE interface\n", index); | ||
69 | pnp_set_drvdata(dev, hwif); | 69 | pnp_set_drvdata(dev, hwif); |
70 | 70 | ||
71 | ide_device_add(idx, NULL); | 71 | ide_device_add(idx, NULL); |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index d21e51a02c3e..235ebdb29b28 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -39,6 +39,8 @@ | |||
39 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
41 | 41 | ||
42 | static ide_hwif_t ide_hwifs[MAX_HWIFS]; /* master data repository */ | ||
43 | |||
42 | /** | 44 | /** |
43 | * generic_id - add a generic drive id | 45 | * generic_id - add a generic drive id |
44 | * @drive: drive to make an ID block for | 46 | * @drive: drive to make an ID block for |
@@ -1318,10 +1320,10 @@ static void ide_port_init_devices(ide_hwif_t *hwif) | |||
1318 | drive->unmask = 1; | 1320 | drive->unmask = 1; |
1319 | if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS) | 1321 | if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS) |
1320 | drive->no_unmask = 1; | 1322 | drive->no_unmask = 1; |
1321 | } | ||
1322 | 1323 | ||
1323 | if (port_ops && port_ops->port_init_devs) | 1324 | if (port_ops && port_ops->init_dev) |
1324 | port_ops->port_init_devs(hwif); | 1325 | port_ops->init_dev(drive); |
1326 | } | ||
1325 | } | 1327 | } |
1326 | 1328 | ||
1327 | static void ide_init_port(ide_hwif_t *hwif, unsigned int port, | 1329 | static void ide_init_port(ide_hwif_t *hwif, unsigned int port, |
@@ -1473,22 +1475,29 @@ ide_hwif_t *ide_find_port_slot(const struct ide_port_info *d) | |||
1473 | for (; i < MAX_HWIFS; i++) { | 1475 | for (; i < MAX_HWIFS; i++) { |
1474 | hwif = &ide_hwifs[i]; | 1476 | hwif = &ide_hwifs[i]; |
1475 | if (hwif->chipset == ide_unknown) | 1477 | if (hwif->chipset == ide_unknown) |
1476 | return hwif; | 1478 | goto out_found; |
1477 | } | 1479 | } |
1478 | } else { | 1480 | } else { |
1479 | for (i = 2; i < MAX_HWIFS; i++) { | 1481 | for (i = 2; i < MAX_HWIFS; i++) { |
1480 | hwif = &ide_hwifs[i]; | 1482 | hwif = &ide_hwifs[i]; |
1481 | if (hwif->chipset == ide_unknown) | 1483 | if (hwif->chipset == ide_unknown) |
1482 | return hwif; | 1484 | goto out_found; |
1483 | } | 1485 | } |
1484 | for (i = 0; i < 2 && i < MAX_HWIFS; i++) { | 1486 | for (i = 0; i < 2 && i < MAX_HWIFS; i++) { |
1485 | hwif = &ide_hwifs[i]; | 1487 | hwif = &ide_hwifs[i]; |
1486 | if (hwif->chipset == ide_unknown) | 1488 | if (hwif->chipset == ide_unknown) |
1487 | return hwif; | 1489 | goto out_found; |
1488 | } | 1490 | } |
1489 | } | 1491 | } |
1490 | 1492 | ||
1493 | printk(KERN_ERR "%s: no free slot for interface\n", | ||
1494 | d ? d->name : "ide"); | ||
1495 | |||
1491 | return NULL; | 1496 | return NULL; |
1497 | |||
1498 | out_found: | ||
1499 | ide_init_port_data(hwif, i); | ||
1500 | return hwif; | ||
1492 | } | 1501 | } |
1493 | EXPORT_SYMBOL_GPL(ide_find_port_slot); | 1502 | EXPORT_SYMBOL_GPL(ide_find_port_slot); |
1494 | 1503 | ||
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index f9cf1670e4e1..b711ab96e287 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -2591,7 +2591,6 @@ static ide_driver_t idetape_driver = { | |||
2591 | .do_request = idetape_do_request, | 2591 | .do_request = idetape_do_request, |
2592 | .end_request = idetape_end_request, | 2592 | .end_request = idetape_end_request, |
2593 | .error = __ide_error, | 2593 | .error = __ide_error, |
2594 | .abort = __ide_abort, | ||
2595 | #ifdef CONFIG_IDE_PROC_FS | 2594 | #ifdef CONFIG_IDE_PROC_FS |
2596 | .proc = idetape_proc, | 2595 | .proc = idetape_proc, |
2597 | #endif | 2596 | #endif |
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index cf55a48a7dd2..1fbdb746dc88 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -8,28 +8,18 @@ | |||
8 | * The big the bad and the ugly. | 8 | * The big the bad and the ugly. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/module.h> | ||
12 | #include <linux/types.h> | 11 | #include <linux/types.h> |
13 | #include <linux/string.h> | 12 | #include <linux/string.h> |
14 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
15 | #include <linux/timer.h> | ||
16 | #include <linux/mm.h> | ||
17 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
18 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
19 | #include <linux/major.h> | ||
20 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
21 | #include <linux/genhd.h> | ||
22 | #include <linux/blkpg.h> | ||
23 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
24 | #include <linux/pci.h> | ||
25 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
26 | #include <linux/hdreg.h> | 19 | #include <linux/hdreg.h> |
27 | #include <linux/ide.h> | 20 | #include <linux/ide.h> |
28 | #include <linux/bitops.h> | ||
29 | #include <linux/scatterlist.h> | 21 | #include <linux/scatterlist.h> |
30 | 22 | ||
31 | #include <asm/byteorder.h> | ||
32 | #include <asm/irq.h> | ||
33 | #include <asm/uaccess.h> | 23 | #include <asm/uaccess.h> |
34 | #include <asm/io.h> | 24 | #include <asm/io.h> |
35 | 25 | ||
@@ -62,25 +52,6 @@ int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf) | |||
62 | return ide_raw_taskfile(drive, &args, buf, 1); | 52 | return ide_raw_taskfile(drive, &args, buf, 1); |
63 | } | 53 | } |
64 | 54 | ||
65 | static int inline task_dma_ok(ide_task_t *task) | ||
66 | { | ||
67 | if (blk_fs_request(task->rq) || (task->tf_flags & IDE_TFLAG_FLAGGED)) | ||
68 | return 1; | ||
69 | |||
70 | switch (task->tf.command) { | ||
71 | case WIN_WRITEDMA_ONCE: | ||
72 | case WIN_WRITEDMA: | ||
73 | case WIN_WRITEDMA_EXT: | ||
74 | case WIN_READDMA_ONCE: | ||
75 | case WIN_READDMA: | ||
76 | case WIN_READDMA_EXT: | ||
77 | case WIN_IDENTIFY_DMA: | ||
78 | return 1; | ||
79 | } | ||
80 | |||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | static ide_startstop_t task_no_data_intr(ide_drive_t *); | 55 | static ide_startstop_t task_no_data_intr(ide_drive_t *); |
85 | static ide_startstop_t set_geometry_intr(ide_drive_t *); | 56 | static ide_startstop_t set_geometry_intr(ide_drive_t *); |
86 | static ide_startstop_t recal_intr(ide_drive_t *); | 57 | static ide_startstop_t recal_intr(ide_drive_t *); |
@@ -139,8 +110,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
139 | WAIT_WORSTCASE, NULL); | 110 | WAIT_WORSTCASE, NULL); |
140 | return ide_started; | 111 | return ide_started; |
141 | default: | 112 | default: |
142 | if (task_dma_ok(task) == 0 || drive->using_dma == 0 || | 113 | if (drive->using_dma == 0 || dma_ops->dma_setup(drive)) |
143 | dma_ops->dma_setup(drive)) | ||
144 | return ide_stopped; | 114 | return ide_stopped; |
145 | dma_ops->dma_exec_cmd(drive, tf->command); | 115 | dma_ops->dma_exec_cmd(drive, tf->command); |
146 | dma_ops->dma_start(drive); | 116 | dma_ops->dma_start(drive); |
@@ -183,7 +153,6 @@ static ide_startstop_t set_geometry_intr(ide_drive_t *drive) | |||
183 | if (stat & (ERR_STAT|DRQ_STAT)) | 153 | if (stat & (ERR_STAT|DRQ_STAT)) |
184 | return ide_error(drive, "set_geometry_intr", stat); | 154 | return ide_error(drive, "set_geometry_intr", stat); |
185 | 155 | ||
186 | BUG_ON(HWGROUP(drive)->handler != NULL); | ||
187 | ide_set_handler(drive, &set_geometry_intr, WAIT_WORSTCASE, NULL); | 156 | ide_set_handler(drive, &set_geometry_intr, WAIT_WORSTCASE, NULL); |
188 | return ide_started; | 157 | return ide_started; |
189 | } | 158 | } |
diff --git a/drivers/ide/ide-timing.h b/drivers/ide/ide-timings.c index 2e91c5870b4c..8c2f8327f487 100644 --- a/drivers/ide/ide-timing.h +++ b/drivers/ide/ide-timings.c | |||
@@ -1,11 +1,7 @@ | |||
1 | #ifndef _IDE_TIMING_H | ||
2 | #define _IDE_TIMING_H | ||
3 | |||
4 | /* | 1 | /* |
5 | * Copyright (c) 1999-2001 Vojtech Pavlik | 2 | * Copyright (c) 1999-2001 Vojtech Pavlik |
6 | */ | 3 | * Copyright (c) 2007-2008 Bartlomiej Zolnierkiewicz |
7 | 4 | * | |
8 | /* | ||
9 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License as published by | 6 | * it under the terms of the GNU General Public License as published by |
11 | * the Free Software Foundation; either version 2 of the License, or | 7 | * the Free Software Foundation; either version 2 of the License, or |
@@ -27,27 +23,14 @@ | |||
27 | 23 | ||
28 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
29 | #include <linux/hdreg.h> | 25 | #include <linux/hdreg.h> |
30 | 26 | #include <linux/ide.h> | |
31 | #define XFER_PIO_5 0x0d | 27 | #include <linux/module.h> |
32 | #define XFER_UDMA_SLOW 0x4f | ||
33 | |||
34 | struct ide_timing { | ||
35 | short mode; | ||
36 | short setup; /* t1 */ | ||
37 | short act8b; /* t2 for 8-bit io */ | ||
38 | short rec8b; /* t2i for 8-bit io */ | ||
39 | short cyc8b; /* t0 for 8-bit io */ | ||
40 | short active; /* t2 or tD */ | ||
41 | short recover; /* t2i or tK */ | ||
42 | short cycle; /* t0 */ | ||
43 | short udma; /* t2CYCTYP/2 */ | ||
44 | }; | ||
45 | 28 | ||
46 | /* | 29 | /* |
47 | * PIO 0-5, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds). | 30 | * PIO 0-5, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds). |
48 | * These were taken from ATA/ATAPI-6 standard, rev 0a, except | 31 | * These were taken from ATA/ATAPI-6 standard, rev 0a, except |
49 | * for PIO 5, which is a nonstandard extension and UDMA6, which | 32 | * for PIO 5, which is a nonstandard extension and UDMA6, which |
50 | * is currently supported only by Maxtor drives. | 33 | * is currently supported only by Maxtor drives. |
51 | */ | 34 | */ |
52 | 35 | ||
53 | static struct ide_timing ide_timing[] = { | 36 | static struct ide_timing ide_timing[] = { |
@@ -61,12 +44,10 @@ static struct ide_timing ide_timing[] = { | |||
61 | { XFER_UDMA_1, 0, 0, 0, 0, 0, 0, 0, 80 }, | 44 | { XFER_UDMA_1, 0, 0, 0, 0, 0, 0, 0, 80 }, |
62 | { XFER_UDMA_0, 0, 0, 0, 0, 0, 0, 0, 120 }, | 45 | { XFER_UDMA_0, 0, 0, 0, 0, 0, 0, 0, 120 }, |
63 | 46 | ||
64 | { XFER_UDMA_SLOW, 0, 0, 0, 0, 0, 0, 0, 150 }, | ||
65 | |||
66 | { XFER_MW_DMA_2, 25, 0, 0, 0, 70, 25, 120, 0 }, | 47 | { XFER_MW_DMA_2, 25, 0, 0, 0, 70, 25, 120, 0 }, |
67 | { XFER_MW_DMA_1, 45, 0, 0, 0, 80, 50, 150, 0 }, | 48 | { XFER_MW_DMA_1, 45, 0, 0, 0, 80, 50, 150, 0 }, |
68 | { XFER_MW_DMA_0, 60, 0, 0, 0, 215, 215, 480, 0 }, | 49 | { XFER_MW_DMA_0, 60, 0, 0, 0, 215, 215, 480, 0 }, |
69 | 50 | ||
70 | { XFER_SW_DMA_2, 60, 0, 0, 0, 120, 120, 240, 0 }, | 51 | { XFER_SW_DMA_2, 60, 0, 0, 0, 120, 120, 240, 0 }, |
71 | { XFER_SW_DMA_1, 90, 0, 0, 0, 240, 240, 480, 0 }, | 52 | { XFER_SW_DMA_1, 90, 0, 0, 0, 240, 240, 480, 0 }, |
72 | { XFER_SW_DMA_0, 120, 0, 0, 0, 480, 480, 960, 0 }, | 53 | { XFER_SW_DMA_0, 120, 0, 0, 0, 480, 480, 960, 0 }, |
@@ -81,29 +62,46 @@ static struct ide_timing ide_timing[] = { | |||
81 | 62 | ||
82 | { XFER_PIO_SLOW, 120, 290, 240, 960, 290, 240, 960, 0 }, | 63 | { XFER_PIO_SLOW, 120, 290, 240, 960, 290, 240, 960, 0 }, |
83 | 64 | ||
84 | { -1 } | 65 | { 0xff } |
85 | }; | 66 | }; |
86 | 67 | ||
87 | #define IDE_TIMING_SETUP 0x01 | 68 | struct ide_timing *ide_timing_find_mode(u8 speed) |
88 | #define IDE_TIMING_ACT8B 0x02 | 69 | { |
89 | #define IDE_TIMING_REC8B 0x04 | 70 | struct ide_timing *t; |
90 | #define IDE_TIMING_CYC8B 0x08 | 71 | |
91 | #define IDE_TIMING_8BIT 0x0e | 72 | for (t = ide_timing; t->mode != speed; t++) |
92 | #define IDE_TIMING_ACTIVE 0x10 | 73 | if (t->mode == 0xff) |
93 | #define IDE_TIMING_RECOVER 0x20 | 74 | return NULL; |
94 | #define IDE_TIMING_CYCLE 0x40 | 75 | return t; |
95 | #define IDE_TIMING_UDMA 0x80 | 76 | } |
96 | #define IDE_TIMING_ALL 0xff | 77 | EXPORT_SYMBOL_GPL(ide_timing_find_mode); |
97 | 78 | ||
98 | #define ENOUGH(v,unit) (((v)-1)/(unit)+1) | 79 | u16 ide_pio_cycle_time(ide_drive_t *drive, u8 pio) |
99 | #define EZ(v,unit) ((v)?ENOUGH(v,unit):0) | 80 | { |
100 | 81 | struct hd_driveid *id = drive->id; | |
101 | #define XFER_MODE 0xf0 | 82 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); |
102 | #define XFER_MWDMA 0x20 | 83 | u16 cycle = 0; |
103 | #define XFER_EPIO 0x01 | 84 | |
104 | #define XFER_PIO 0x00 | 85 | if (id->field_valid & 2) { |
105 | 86 | if (id->capability & 8) | |
106 | static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int T, int UT) | 87 | cycle = id->eide_pio_iordy; |
88 | else | ||
89 | cycle = id->eide_pio; | ||
90 | |||
91 | /* conservative "downgrade" for all pre-ATA2 drives */ | ||
92 | if (pio < 3 && cycle < t->cycle) | ||
93 | cycle = 0; /* use standard timing */ | ||
94 | } | ||
95 | |||
96 | return cycle ? cycle : t->cycle; | ||
97 | } | ||
98 | EXPORT_SYMBOL_GPL(ide_pio_cycle_time); | ||
99 | |||
100 | #define ENOUGH(v, unit) (((v) - 1) / (unit) + 1) | ||
101 | #define EZ(v, unit) ((v) ? ENOUGH(v, unit) : 0) | ||
102 | |||
103 | static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, | ||
104 | int T, int UT) | ||
107 | { | 105 | { |
108 | q->setup = EZ(t->setup * 1000, T); | 106 | q->setup = EZ(t->setup * 1000, T); |
109 | q->act8b = EZ(t->act8b * 1000, T); | 107 | q->act8b = EZ(t->act8b * 1000, T); |
@@ -115,92 +113,83 @@ static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int | |||
115 | q->udma = EZ(t->udma * 1000, UT); | 113 | q->udma = EZ(t->udma * 1000, UT); |
116 | } | 114 | } |
117 | 115 | ||
118 | static void ide_timing_merge(struct ide_timing *a, struct ide_timing *b, struct ide_timing *m, unsigned int what) | 116 | void ide_timing_merge(struct ide_timing *a, struct ide_timing *b, |
119 | { | 117 | struct ide_timing *m, unsigned int what) |
120 | if (what & IDE_TIMING_SETUP ) m->setup = max(a->setup, b->setup); | ||
121 | if (what & IDE_TIMING_ACT8B ) m->act8b = max(a->act8b, b->act8b); | ||
122 | if (what & IDE_TIMING_REC8B ) m->rec8b = max(a->rec8b, b->rec8b); | ||
123 | if (what & IDE_TIMING_CYC8B ) m->cyc8b = max(a->cyc8b, b->cyc8b); | ||
124 | if (what & IDE_TIMING_ACTIVE ) m->active = max(a->active, b->active); | ||
125 | if (what & IDE_TIMING_RECOVER) m->recover = max(a->recover, b->recover); | ||
126 | if (what & IDE_TIMING_CYCLE ) m->cycle = max(a->cycle, b->cycle); | ||
127 | if (what & IDE_TIMING_UDMA ) m->udma = max(a->udma, b->udma); | ||
128 | } | ||
129 | |||
130 | static struct ide_timing* ide_timing_find_mode(short speed) | ||
131 | { | 118 | { |
132 | struct ide_timing *t; | 119 | if (what & IDE_TIMING_SETUP) |
133 | 120 | m->setup = max(a->setup, b->setup); | |
134 | for (t = ide_timing; t->mode != speed; t++) | 121 | if (what & IDE_TIMING_ACT8B) |
135 | if (t->mode < 0) | 122 | m->act8b = max(a->act8b, b->act8b); |
136 | return NULL; | 123 | if (what & IDE_TIMING_REC8B) |
137 | return t; | 124 | m->rec8b = max(a->rec8b, b->rec8b); |
125 | if (what & IDE_TIMING_CYC8B) | ||
126 | m->cyc8b = max(a->cyc8b, b->cyc8b); | ||
127 | if (what & IDE_TIMING_ACTIVE) | ||
128 | m->active = max(a->active, b->active); | ||
129 | if (what & IDE_TIMING_RECOVER) | ||
130 | m->recover = max(a->recover, b->recover); | ||
131 | if (what & IDE_TIMING_CYCLE) | ||
132 | m->cycle = max(a->cycle, b->cycle); | ||
133 | if (what & IDE_TIMING_UDMA) | ||
134 | m->udma = max(a->udma, b->udma); | ||
138 | } | 135 | } |
136 | EXPORT_SYMBOL_GPL(ide_timing_merge); | ||
139 | 137 | ||
140 | static int ide_timing_compute(ide_drive_t *drive, short speed, struct ide_timing *t, int T, int UT) | 138 | int ide_timing_compute(ide_drive_t *drive, u8 speed, |
139 | struct ide_timing *t, int T, int UT) | ||
141 | { | 140 | { |
142 | struct hd_driveid *id = drive->id; | 141 | struct hd_driveid *id = drive->id; |
143 | struct ide_timing *s, p; | 142 | struct ide_timing *s, p; |
144 | 143 | ||
145 | /* | 144 | /* |
146 | * Find the mode. | 145 | * Find the mode. |
147 | */ | 146 | */ |
148 | 147 | s = ide_timing_find_mode(speed); | |
149 | if (!(s = ide_timing_find_mode(speed))) | 148 | if (s == NULL) |
150 | return -EINVAL; | 149 | return -EINVAL; |
151 | 150 | ||
152 | /* | 151 | /* |
153 | * Copy the timing from the table. | 152 | * Copy the timing from the table. |
154 | */ | 153 | */ |
155 | |||
156 | *t = *s; | 154 | *t = *s; |
157 | 155 | ||
158 | /* | 156 | /* |
159 | * If the drive is an EIDE drive, it can tell us it needs extended | 157 | * If the drive is an EIDE drive, it can tell us it needs extended |
160 | * PIO/MWDMA cycle timing. | 158 | * PIO/MWDMA cycle timing. |
161 | */ | 159 | */ |
162 | |||
163 | if (id && id->field_valid & 2) { /* EIDE drive */ | 160 | if (id && id->field_valid & 2) { /* EIDE drive */ |
164 | 161 | ||
165 | memset(&p, 0, sizeof(p)); | 162 | memset(&p, 0, sizeof(p)); |
166 | 163 | ||
167 | switch (speed & XFER_MODE) { | 164 | if (speed <= XFER_PIO_2) |
168 | 165 | p.cycle = p.cyc8b = id->eide_pio; | |
169 | case XFER_PIO: | 166 | else if (speed <= XFER_PIO_5) |
170 | if (speed <= XFER_PIO_2) p.cycle = p.cyc8b = id->eide_pio; | 167 | p.cycle = p.cyc8b = id->eide_pio_iordy; |
171 | else p.cycle = p.cyc8b = id->eide_pio_iordy; | 168 | else if (speed >= XFER_MW_DMA_0 && speed <= XFER_MW_DMA_2) |
172 | break; | 169 | p.cycle = id->eide_dma_min; |
173 | |||
174 | case XFER_MWDMA: | ||
175 | p.cycle = id->eide_dma_min; | ||
176 | break; | ||
177 | } | ||
178 | 170 | ||
179 | ide_timing_merge(&p, t, t, IDE_TIMING_CYCLE | IDE_TIMING_CYC8B); | 171 | ide_timing_merge(&p, t, t, IDE_TIMING_CYCLE | IDE_TIMING_CYC8B); |
180 | } | 172 | } |
181 | 173 | ||
182 | /* | 174 | /* |
183 | * Convert the timing to bus clock counts. | 175 | * Convert the timing to bus clock counts. |
184 | */ | 176 | */ |
185 | |||
186 | ide_timing_quantize(t, t, T, UT); | 177 | ide_timing_quantize(t, t, T, UT); |
187 | 178 | ||
188 | /* | 179 | /* |
189 | * Even in DMA/UDMA modes we still use PIO access for IDENTIFY, S.M.A.R.T | 180 | * Even in DMA/UDMA modes we still use PIO access for IDENTIFY, |
190 | * and some other commands. We have to ensure that the DMA cycle timing is | 181 | * S.M.A.R.T and some other commands. We have to ensure that the |
191 | * slower/equal than the fastest PIO timing. | 182 | * DMA cycle timing is slower/equal than the fastest PIO timing. |
192 | */ | 183 | */ |
193 | 184 | if (speed >= XFER_SW_DMA_0) { | |
194 | if ((speed & XFER_MODE) != XFER_PIO) { | ||
195 | u8 pio = ide_get_best_pio_mode(drive, 255, 5); | 185 | u8 pio = ide_get_best_pio_mode(drive, 255, 5); |
196 | ide_timing_compute(drive, XFER_PIO_0 + pio, &p, T, UT); | 186 | ide_timing_compute(drive, XFER_PIO_0 + pio, &p, T, UT); |
197 | ide_timing_merge(&p, t, t, IDE_TIMING_ALL); | 187 | ide_timing_merge(&p, t, t, IDE_TIMING_ALL); |
198 | } | 188 | } |
199 | 189 | ||
200 | /* | 190 | /* |
201 | * Lengthen active & recovery time so that cycle time is correct. | 191 | * Lengthen active & recovery time so that cycle time is correct. |
202 | */ | 192 | */ |
203 | |||
204 | if (t->act8b + t->rec8b < t->cyc8b) { | 193 | if (t->act8b + t->rec8b < t->cyc8b) { |
205 | t->act8b += (t->cyc8b - (t->act8b + t->rec8b)) / 2; | 194 | t->act8b += (t->cyc8b - (t->act8b + t->rec8b)) / 2; |
206 | t->rec8b = t->cyc8b - t->act8b; | 195 | t->rec8b = t->cyc8b - t->act8b; |
@@ -213,5 +202,4 @@ static int ide_timing_compute(ide_drive_t *drive, short speed, struct ide_timing | |||
213 | 202 | ||
214 | return 0; | 203 | return 0; |
215 | } | 204 | } |
216 | 205 | EXPORT_SYMBOL_GPL(ide_timing_compute); | |
217 | #endif | ||
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 2b8453510e09..d4a6b102a772 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -50,29 +50,16 @@ | |||
50 | #include <linux/types.h> | 50 | #include <linux/types.h> |
51 | #include <linux/string.h> | 51 | #include <linux/string.h> |
52 | #include <linux/kernel.h> | 52 | #include <linux/kernel.h> |
53 | #include <linux/timer.h> | ||
54 | #include <linux/mm.h> | ||
55 | #include <linux/interrupt.h> | 53 | #include <linux/interrupt.h> |
56 | #include <linux/major.h> | 54 | #include <linux/major.h> |
57 | #include <linux/errno.h> | 55 | #include <linux/errno.h> |
58 | #include <linux/genhd.h> | 56 | #include <linux/genhd.h> |
59 | #include <linux/blkpg.h> | ||
60 | #include <linux/slab.h> | 57 | #include <linux/slab.h> |
61 | #include <linux/init.h> | 58 | #include <linux/init.h> |
62 | #include <linux/pci.h> | 59 | #include <linux/pci.h> |
63 | #include <linux/delay.h> | ||
64 | #include <linux/ide.h> | 60 | #include <linux/ide.h> |
65 | #include <linux/completion.h> | 61 | #include <linux/completion.h> |
66 | #include <linux/reboot.h> | ||
67 | #include <linux/cdrom.h> | ||
68 | #include <linux/seq_file.h> | ||
69 | #include <linux/device.h> | 62 | #include <linux/device.h> |
70 | #include <linux/bitops.h> | ||
71 | |||
72 | #include <asm/byteorder.h> | ||
73 | #include <asm/irq.h> | ||
74 | #include <asm/uaccess.h> | ||
75 | #include <asm/io.h> | ||
76 | 63 | ||
77 | 64 | ||
78 | /* default maximum number of failures */ | 65 | /* default maximum number of failures */ |
@@ -91,8 +78,6 @@ DEFINE_MUTEX(ide_cfg_mtx); | |||
91 | __cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock); | 78 | __cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock); |
92 | EXPORT_SYMBOL(ide_lock); | 79 | EXPORT_SYMBOL(ide_lock); |
93 | 80 | ||
94 | ide_hwif_t ide_hwifs[MAX_HWIFS]; /* master data repository */ | ||
95 | |||
96 | static void ide_port_init_devices_data(ide_hwif_t *); | 81 | static void ide_port_init_devices_data(ide_hwif_t *); |
97 | 82 | ||
98 | /* | 83 | /* |
@@ -121,7 +106,6 @@ void ide_init_port_data(ide_hwif_t *hwif, unsigned int index) | |||
121 | 106 | ||
122 | ide_port_init_devices_data(hwif); | 107 | ide_port_init_devices_data(hwif); |
123 | } | 108 | } |
124 | EXPORT_SYMBOL_GPL(ide_init_port_data); | ||
125 | 109 | ||
126 | static void ide_port_init_devices_data(ide_hwif_t *hwif) | 110 | static void ide_port_init_devices_data(ide_hwif_t *hwif) |
127 | { | 111 | { |
@@ -150,18 +134,6 @@ static void ide_port_init_devices_data(ide_hwif_t *hwif) | |||
150 | } | 134 | } |
151 | } | 135 | } |
152 | 136 | ||
153 | static void __init init_ide_data (void) | ||
154 | { | ||
155 | unsigned int index; | ||
156 | |||
157 | /* Initialise all interface structures */ | ||
158 | for (index = 0; index < MAX_HWIFS; ++index) { | ||
159 | ide_hwif_t *hwif = &ide_hwifs[index]; | ||
160 | |||
161 | ide_init_port_data(hwif, index); | ||
162 | } | ||
163 | } | ||
164 | |||
165 | void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) | 137 | void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) |
166 | { | 138 | { |
167 | ide_hwgroup_t *hwgroup = hwif->hwgroup; | 139 | ide_hwgroup_t *hwgroup = hwif->hwgroup; |
@@ -312,7 +284,8 @@ void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw) | |||
312 | memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports)); | 284 | memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports)); |
313 | hwif->irq = hw->irq; | 285 | hwif->irq = hw->irq; |
314 | hwif->chipset = hw->chipset; | 286 | hwif->chipset = hw->chipset; |
315 | hwif->gendev.parent = hw->dev; | 287 | hwif->dev = hw->dev; |
288 | hwif->gendev.parent = hw->parent ? hw->parent : hw->dev; | ||
316 | hwif->ack_intr = hw->ack_intr; | 289 | hwif->ack_intr = hw->ack_intr; |
317 | } | 290 | } |
318 | EXPORT_SYMBOL_GPL(ide_init_port_hw); | 291 | EXPORT_SYMBOL_GPL(ide_init_port_hw); |
@@ -556,6 +529,22 @@ static int generic_ide_resume(struct device *dev) | |||
556 | return err; | 529 | return err; |
557 | } | 530 | } |
558 | 531 | ||
532 | static int generic_drive_reset(ide_drive_t *drive) | ||
533 | { | ||
534 | struct request *rq; | ||
535 | int ret = 0; | ||
536 | |||
537 | rq = blk_get_request(drive->queue, READ, __GFP_WAIT); | ||
538 | rq->cmd_type = REQ_TYPE_SPECIAL; | ||
539 | rq->cmd_len = 1; | ||
540 | rq->cmd[0] = REQ_DRIVE_RESET; | ||
541 | rq->cmd_flags |= REQ_SOFTBARRIER; | ||
542 | if (blk_execute_rq(drive->queue, NULL, rq, 1)) | ||
543 | ret = rq->errors; | ||
544 | blk_put_request(rq); | ||
545 | return ret; | ||
546 | } | ||
547 | |||
559 | int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev, | 548 | int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev, |
560 | unsigned int cmd, unsigned long arg) | 549 | unsigned int cmd, unsigned long arg) |
561 | { | 550 | { |
@@ -630,33 +619,8 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device | |||
630 | if (!capable(CAP_SYS_ADMIN)) | 619 | if (!capable(CAP_SYS_ADMIN)) |
631 | return -EACCES; | 620 | return -EACCES; |
632 | 621 | ||
633 | /* | 622 | return generic_drive_reset(drive); |
634 | * Abort the current command on the | ||
635 | * group if there is one, taking | ||
636 | * care not to allow anything else | ||
637 | * to be queued and to die on the | ||
638 | * spot if we miss one somehow | ||
639 | */ | ||
640 | |||
641 | spin_lock_irqsave(&ide_lock, flags); | ||
642 | |||
643 | if (HWGROUP(drive)->resetting) { | ||
644 | spin_unlock_irqrestore(&ide_lock, flags); | ||
645 | return -EBUSY; | ||
646 | } | ||
647 | 623 | ||
648 | ide_abort(drive, "drive reset"); | ||
649 | |||
650 | BUG_ON(HWGROUP(drive)->handler); | ||
651 | |||
652 | /* Ensure nothing gets queued after we | ||
653 | drop the lock. Reset will clear the busy */ | ||
654 | |||
655 | HWGROUP(drive)->busy = 1; | ||
656 | spin_unlock_irqrestore(&ide_lock, flags); | ||
657 | (void) ide_do_reset(drive); | ||
658 | |||
659 | return 0; | ||
660 | case HDIO_GET_BUSSTATE: | 624 | case HDIO_GET_BUSSTATE: |
661 | if (!capable(CAP_SYS_ADMIN)) | 625 | if (!capable(CAP_SYS_ADMIN)) |
662 | return -EACCES; | 626 | return -EACCES; |
@@ -1021,8 +985,6 @@ static int __init ide_init(void) | |||
1021 | goto out_port_class; | 985 | goto out_port_class; |
1022 | } | 986 | } |
1023 | 987 | ||
1024 | init_ide_data(); | ||
1025 | |||
1026 | proc_ide_create(); | 988 | proc_ide_create(); |
1027 | 989 | ||
1028 | return 0; | 990 | return 0; |
diff --git a/drivers/ide/legacy/ali14xx.c b/drivers/ide/legacy/ali14xx.c index 052125fafcfa..4ec19737f3c5 100644 --- a/drivers/ide/legacy/ali14xx.c +++ b/drivers/ide/legacy/ali14xx.c | |||
@@ -117,10 +117,11 @@ static void ali14xx_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
117 | u8 param1, param2, param3, param4; | 117 | u8 param1, param2, param3, param4; |
118 | unsigned long flags; | 118 | unsigned long flags; |
119 | int bus_speed = ide_vlb_clk ? ide_vlb_clk : 50; | 119 | int bus_speed = ide_vlb_clk ? ide_vlb_clk : 50; |
120 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
120 | 121 | ||
121 | /* calculate timing, according to PIO mode */ | 122 | /* calculate timing, according to PIO mode */ |
122 | time1 = ide_pio_cycle_time(drive, pio); | 123 | time1 = ide_pio_cycle_time(drive, pio); |
123 | time2 = ide_pio_timings[pio].active_time; | 124 | time2 = t->active; |
124 | param3 = param1 = (time2 * bus_speed + 999) / 1000; | 125 | param3 = param1 = (time2 * bus_speed + 999) / 1000; |
125 | param4 = param2 = (time1 * bus_speed + 999) / 1000 - param1; | 126 | param4 = param2 = (time1 * bus_speed + 999) / 1000 - param1; |
126 | if (pio < 3) { | 127 | if (pio < 3) { |
diff --git a/drivers/ide/legacy/buddha.c b/drivers/ide/legacy/buddha.c index 9a1d27ef3f8a..0497e7f85b09 100644 --- a/drivers/ide/legacy/buddha.c +++ b/drivers/ide/legacy/buddha.c | |||
@@ -227,7 +227,6 @@ fail_base2: | |||
227 | if (hwif) { | 227 | if (hwif) { |
228 | u8 index = hwif->index; | 228 | u8 index = hwif->index; |
229 | 229 | ||
230 | ide_init_port_data(hwif, index); | ||
231 | ide_init_port_hw(hwif, &hw); | 230 | ide_init_port_hw(hwif, &hw); |
232 | 231 | ||
233 | idx[i] = index; | 232 | idx[i] = index; |
diff --git a/drivers/ide/legacy/falconide.c b/drivers/ide/legacy/falconide.c index af11028b4794..129a812bb57f 100644 --- a/drivers/ide/legacy/falconide.c +++ b/drivers/ide/legacy/falconide.c | |||
@@ -111,7 +111,6 @@ static int __init falconide_init(void) | |||
111 | u8 index = hwif->index; | 111 | u8 index = hwif->index; |
112 | u8 idx[4] = { index, 0xff, 0xff, 0xff }; | 112 | u8 idx[4] = { index, 0xff, 0xff, 0xff }; |
113 | 113 | ||
114 | ide_init_port_data(hwif, index); | ||
115 | ide_init_port_hw(hwif, &hw); | 114 | ide_init_port_hw(hwif, &hw); |
116 | 115 | ||
117 | /* Atari has a byte-swapped IDE interface */ | 116 | /* Atari has a byte-swapped IDE interface */ |
diff --git a/drivers/ide/legacy/gayle.c b/drivers/ide/legacy/gayle.c index b78941680c32..7e74b20202df 100644 --- a/drivers/ide/legacy/gayle.c +++ b/drivers/ide/legacy/gayle.c | |||
@@ -185,7 +185,6 @@ found: | |||
185 | if (hwif) { | 185 | if (hwif) { |
186 | u8 index = hwif->index; | 186 | u8 index = hwif->index; |
187 | 187 | ||
188 | ide_init_port_data(hwif, index); | ||
189 | ide_init_port_hw(hwif, &hw); | 188 | ide_init_port_hw(hwif, &hw); |
190 | 189 | ||
191 | idx[i] = index; | 190 | idx[i] = index; |
diff --git a/drivers/ide/legacy/hd.c b/drivers/ide/legacy/hd.c deleted file mode 100644 index abdedf56643e..000000000000 --- a/drivers/ide/legacy/hd.c +++ /dev/null | |||
@@ -1,815 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 1991, 1992 Linus Torvalds | ||
3 | * | ||
4 | * This is the low-level hd interrupt support. It traverses the | ||
5 | * request-list, using interrupts to jump between functions. As | ||
6 | * all the functions are called within interrupts, we may not | ||
7 | * sleep. Special care is recommended. | ||
8 | * | ||
9 | * modified by Drew Eckhardt to check nr of hd's from the CMOS. | ||
10 | * | ||
11 | * Thanks to Branko Lankester, lankeste@fwi.uva.nl, who found a bug | ||
12 | * in the early extended-partition checks and added DM partitions | ||
13 | * | ||
14 | * IRQ-unmask, drive-id, multiple-mode, support for ">16 heads", | ||
15 | * and general streamlining by Mark Lord. | ||
16 | * | ||
17 | * Removed 99% of above. Use Mark's ide driver for those options. | ||
18 | * This is now a lightweight ST-506 driver. (Paul Gortmaker) | ||
19 | * | ||
20 | * Modified 1995 Russell King for ARM processor. | ||
21 | * | ||
22 | * Bugfix: max_sectors must be <= 255 or the wheels tend to come | ||
23 | * off in a hurry once you queue things up - Paul G. 02/2001 | ||
24 | */ | ||
25 | |||
26 | /* Uncomment the following if you want verbose error reports. */ | ||
27 | /* #define VERBOSE_ERRORS */ | ||
28 | |||
29 | #include <linux/blkdev.h> | ||
30 | #include <linux/errno.h> | ||
31 | #include <linux/signal.h> | ||
32 | #include <linux/interrupt.h> | ||
33 | #include <linux/timer.h> | ||
34 | #include <linux/fs.h> | ||
35 | #include <linux/kernel.h> | ||
36 | #include <linux/genhd.h> | ||
37 | #include <linux/slab.h> | ||
38 | #include <linux/string.h> | ||
39 | #include <linux/ioport.h> | ||
40 | #include <linux/mc146818rtc.h> /* CMOS defines */ | ||
41 | #include <linux/init.h> | ||
42 | #include <linux/blkpg.h> | ||
43 | #include <linux/hdreg.h> | ||
44 | |||
45 | #define REALLY_SLOW_IO | ||
46 | #include <asm/system.h> | ||
47 | #include <asm/io.h> | ||
48 | #include <asm/uaccess.h> | ||
49 | |||
50 | #ifdef __arm__ | ||
51 | #undef HD_IRQ | ||
52 | #endif | ||
53 | #include <asm/irq.h> | ||
54 | #ifdef __arm__ | ||
55 | #define HD_IRQ IRQ_HARDDISK | ||
56 | #endif | ||
57 | |||
58 | /* Hd controller regster ports */ | ||
59 | |||
60 | #define HD_DATA 0x1f0 /* _CTL when writing */ | ||
61 | #define HD_ERROR 0x1f1 /* see err-bits */ | ||
62 | #define HD_NSECTOR 0x1f2 /* nr of sectors to read/write */ | ||
63 | #define HD_SECTOR 0x1f3 /* starting sector */ | ||
64 | #define HD_LCYL 0x1f4 /* starting cylinder */ | ||
65 | #define HD_HCYL 0x1f5 /* high byte of starting cyl */ | ||
66 | #define HD_CURRENT 0x1f6 /* 101dhhhh , d=drive, hhhh=head */ | ||
67 | #define HD_STATUS 0x1f7 /* see status-bits */ | ||
68 | #define HD_FEATURE HD_ERROR /* same io address, read=error, write=feature */ | ||
69 | #define HD_PRECOMP HD_FEATURE /* obsolete use of this port - predates IDE */ | ||
70 | #define HD_COMMAND HD_STATUS /* same io address, read=status, write=cmd */ | ||
71 | |||
72 | #define HD_CMD 0x3f6 /* used for resets */ | ||
73 | #define HD_ALTSTATUS 0x3f6 /* same as HD_STATUS but doesn't clear irq */ | ||
74 | |||
75 | /* Bits of HD_STATUS */ | ||
76 | #define ERR_STAT 0x01 | ||
77 | #define INDEX_STAT 0x02 | ||
78 | #define ECC_STAT 0x04 /* Corrected error */ | ||
79 | #define DRQ_STAT 0x08 | ||
80 | #define SEEK_STAT 0x10 | ||
81 | #define SERVICE_STAT SEEK_STAT | ||
82 | #define WRERR_STAT 0x20 | ||
83 | #define READY_STAT 0x40 | ||
84 | #define BUSY_STAT 0x80 | ||
85 | |||
86 | /* Bits for HD_ERROR */ | ||
87 | #define MARK_ERR 0x01 /* Bad address mark */ | ||
88 | #define TRK0_ERR 0x02 /* couldn't find track 0 */ | ||
89 | #define ABRT_ERR 0x04 /* Command aborted */ | ||
90 | #define MCR_ERR 0x08 /* media change request */ | ||
91 | #define ID_ERR 0x10 /* ID field not found */ | ||
92 | #define MC_ERR 0x20 /* media changed */ | ||
93 | #define ECC_ERR 0x40 /* Uncorrectable ECC error */ | ||
94 | #define BBD_ERR 0x80 /* pre-EIDE meaning: block marked bad */ | ||
95 | #define ICRC_ERR 0x80 /* new meaning: CRC error during transfer */ | ||
96 | |||
97 | static DEFINE_SPINLOCK(hd_lock); | ||
98 | static struct request_queue *hd_queue; | ||
99 | |||
100 | #define MAJOR_NR HD_MAJOR | ||
101 | #define QUEUE (hd_queue) | ||
102 | #define CURRENT elv_next_request(hd_queue) | ||
103 | |||
104 | #define TIMEOUT_VALUE (6*HZ) | ||
105 | #define HD_DELAY 0 | ||
106 | |||
107 | #define MAX_ERRORS 16 /* Max read/write errors/sector */ | ||
108 | #define RESET_FREQ 8 /* Reset controller every 8th retry */ | ||
109 | #define RECAL_FREQ 4 /* Recalibrate every 4th retry */ | ||
110 | #define MAX_HD 2 | ||
111 | |||
112 | #define STAT_OK (READY_STAT|SEEK_STAT) | ||
113 | #define OK_STATUS(s) (((s)&(STAT_OK|(BUSY_STAT|WRERR_STAT|ERR_STAT)))==STAT_OK) | ||
114 | |||
115 | static void recal_intr(void); | ||
116 | static void bad_rw_intr(void); | ||
117 | |||
118 | static int reset; | ||
119 | static int hd_error; | ||
120 | |||
121 | /* | ||
122 | * This struct defines the HD's and their types. | ||
123 | */ | ||
124 | struct hd_i_struct { | ||
125 | unsigned int head, sect, cyl, wpcom, lzone, ctl; | ||
126 | int unit; | ||
127 | int recalibrate; | ||
128 | int special_op; | ||
129 | }; | ||
130 | |||
131 | #ifdef HD_TYPE | ||
132 | static struct hd_i_struct hd_info[] = { HD_TYPE }; | ||
133 | static int NR_HD = ARRAY_SIZE(hd_info); | ||
134 | #else | ||
135 | static struct hd_i_struct hd_info[MAX_HD]; | ||
136 | static int NR_HD; | ||
137 | #endif | ||
138 | |||
139 | static struct gendisk *hd_gendisk[MAX_HD]; | ||
140 | |||
141 | static struct timer_list device_timer; | ||
142 | |||
143 | #define TIMEOUT_VALUE (6*HZ) | ||
144 | |||
145 | #define SET_TIMER \ | ||
146 | do { \ | ||
147 | mod_timer(&device_timer, jiffies + TIMEOUT_VALUE); \ | ||
148 | } while (0) | ||
149 | |||
150 | static void (*do_hd)(void) = NULL; | ||
151 | #define SET_HANDLER(x) \ | ||
152 | if ((do_hd = (x)) != NULL) \ | ||
153 | SET_TIMER; \ | ||
154 | else \ | ||
155 | del_timer(&device_timer); | ||
156 | |||
157 | |||
158 | #if (HD_DELAY > 0) | ||
159 | |||
160 | #include <asm/i8253.h> | ||
161 | |||
162 | unsigned long last_req; | ||
163 | |||
164 | unsigned long read_timer(void) | ||
165 | { | ||
166 | unsigned long t, flags; | ||
167 | int i; | ||
168 | |||
169 | spin_lock_irqsave(&i8253_lock, flags); | ||
170 | t = jiffies * 11932; | ||
171 | outb_p(0, 0x43); | ||
172 | i = inb_p(0x40); | ||
173 | i |= inb(0x40) << 8; | ||
174 | spin_unlock_irqrestore(&i8253_lock, flags); | ||
175 | return(t - i); | ||
176 | } | ||
177 | #endif | ||
178 | |||
179 | static void __init hd_setup(char *str, int *ints) | ||
180 | { | ||
181 | int hdind = 0; | ||
182 | |||
183 | if (ints[0] != 3) | ||
184 | return; | ||
185 | if (hd_info[0].head != 0) | ||
186 | hdind = 1; | ||
187 | hd_info[hdind].head = ints[2]; | ||
188 | hd_info[hdind].sect = ints[3]; | ||
189 | hd_info[hdind].cyl = ints[1]; | ||
190 | hd_info[hdind].wpcom = 0; | ||
191 | hd_info[hdind].lzone = ints[1]; | ||
192 | hd_info[hdind].ctl = (ints[2] > 8 ? 8 : 0); | ||
193 | NR_HD = hdind+1; | ||
194 | } | ||
195 | |||
196 | static void dump_status(const char *msg, unsigned int stat) | ||
197 | { | ||
198 | char *name = "hd?"; | ||
199 | if (CURRENT) | ||
200 | name = CURRENT->rq_disk->disk_name; | ||
201 | |||
202 | #ifdef VERBOSE_ERRORS | ||
203 | printk("%s: %s: status=0x%02x { ", name, msg, stat & 0xff); | ||
204 | if (stat & BUSY_STAT) printk("Busy "); | ||
205 | if (stat & READY_STAT) printk("DriveReady "); | ||
206 | if (stat & WRERR_STAT) printk("WriteFault "); | ||
207 | if (stat & SEEK_STAT) printk("SeekComplete "); | ||
208 | if (stat & DRQ_STAT) printk("DataRequest "); | ||
209 | if (stat & ECC_STAT) printk("CorrectedError "); | ||
210 | if (stat & INDEX_STAT) printk("Index "); | ||
211 | if (stat & ERR_STAT) printk("Error "); | ||
212 | printk("}\n"); | ||
213 | if ((stat & ERR_STAT) == 0) { | ||
214 | hd_error = 0; | ||
215 | } else { | ||
216 | hd_error = inb(HD_ERROR); | ||
217 | printk("%s: %s: error=0x%02x { ", name, msg, hd_error & 0xff); | ||
218 | if (hd_error & BBD_ERR) printk("BadSector "); | ||
219 | if (hd_error & ECC_ERR) printk("UncorrectableError "); | ||
220 | if (hd_error & ID_ERR) printk("SectorIdNotFound "); | ||
221 | if (hd_error & ABRT_ERR) printk("DriveStatusError "); | ||
222 | if (hd_error & TRK0_ERR) printk("TrackZeroNotFound "); | ||
223 | if (hd_error & MARK_ERR) printk("AddrMarkNotFound "); | ||
224 | printk("}"); | ||
225 | if (hd_error & (BBD_ERR|ECC_ERR|ID_ERR|MARK_ERR)) { | ||
226 | printk(", CHS=%d/%d/%d", (inb(HD_HCYL)<<8) + inb(HD_LCYL), | ||
227 | inb(HD_CURRENT) & 0xf, inb(HD_SECTOR)); | ||
228 | if (CURRENT) | ||
229 | printk(", sector=%ld", CURRENT->sector); | ||
230 | } | ||
231 | printk("\n"); | ||
232 | } | ||
233 | #else | ||
234 | printk("%s: %s: status=0x%02x.\n", name, msg, stat & 0xff); | ||
235 | if ((stat & ERR_STAT) == 0) { | ||
236 | hd_error = 0; | ||
237 | } else { | ||
238 | hd_error = inb(HD_ERROR); | ||
239 | printk("%s: %s: error=0x%02x.\n", name, msg, hd_error & 0xff); | ||
240 | } | ||
241 | #endif | ||
242 | } | ||
243 | |||
244 | static void check_status(void) | ||
245 | { | ||
246 | int i = inb_p(HD_STATUS); | ||
247 | |||
248 | if (!OK_STATUS(i)) { | ||
249 | dump_status("check_status", i); | ||
250 | bad_rw_intr(); | ||
251 | } | ||
252 | } | ||
253 | |||
254 | static int controller_busy(void) | ||
255 | { | ||
256 | int retries = 100000; | ||
257 | unsigned char status; | ||
258 | |||
259 | do { | ||
260 | status = inb_p(HD_STATUS); | ||
261 | } while ((status & BUSY_STAT) && --retries); | ||
262 | return status; | ||
263 | } | ||
264 | |||
265 | static int status_ok(void) | ||
266 | { | ||
267 | unsigned char status = inb_p(HD_STATUS); | ||
268 | |||
269 | if (status & BUSY_STAT) | ||
270 | return 1; /* Ancient, but does it make sense??? */ | ||
271 | if (status & WRERR_STAT) | ||
272 | return 0; | ||
273 | if (!(status & READY_STAT)) | ||
274 | return 0; | ||
275 | if (!(status & SEEK_STAT)) | ||
276 | return 0; | ||
277 | return 1; | ||
278 | } | ||
279 | |||
280 | static int controller_ready(unsigned int drive, unsigned int head) | ||
281 | { | ||
282 | int retry = 100; | ||
283 | |||
284 | do { | ||
285 | if (controller_busy() & BUSY_STAT) | ||
286 | return 0; | ||
287 | outb_p(0xA0 | (drive<<4) | head, HD_CURRENT); | ||
288 | if (status_ok()) | ||
289 | return 1; | ||
290 | } while (--retry); | ||
291 | return 0; | ||
292 | } | ||
293 | |||
294 | static void hd_out(struct hd_i_struct *disk, | ||
295 | unsigned int nsect, | ||
296 | unsigned int sect, | ||
297 | unsigned int head, | ||
298 | unsigned int cyl, | ||
299 | unsigned int cmd, | ||
300 | void (*intr_addr)(void)) | ||
301 | { | ||
302 | unsigned short port; | ||
303 | |||
304 | #if (HD_DELAY > 0) | ||
305 | while (read_timer() - last_req < HD_DELAY) | ||
306 | /* nothing */; | ||
307 | #endif | ||
308 | if (reset) | ||
309 | return; | ||
310 | if (!controller_ready(disk->unit, head)) { | ||
311 | reset = 1; | ||
312 | return; | ||
313 | } | ||
314 | SET_HANDLER(intr_addr); | ||
315 | outb_p(disk->ctl, HD_CMD); | ||
316 | port = HD_DATA; | ||
317 | outb_p(disk->wpcom >> 2, ++port); | ||
318 | outb_p(nsect, ++port); | ||
319 | outb_p(sect, ++port); | ||
320 | outb_p(cyl, ++port); | ||
321 | outb_p(cyl >> 8, ++port); | ||
322 | outb_p(0xA0 | (disk->unit << 4) | head, ++port); | ||
323 | outb_p(cmd, ++port); | ||
324 | } | ||
325 | |||
326 | static void hd_request (void); | ||
327 | |||
328 | static int drive_busy(void) | ||
329 | { | ||
330 | unsigned int i; | ||
331 | unsigned char c; | ||
332 | |||
333 | for (i = 0; i < 500000 ; i++) { | ||
334 | c = inb_p(HD_STATUS); | ||
335 | if ((c & (BUSY_STAT | READY_STAT | SEEK_STAT)) == STAT_OK) | ||
336 | return 0; | ||
337 | } | ||
338 | dump_status("reset timed out", c); | ||
339 | return 1; | ||
340 | } | ||
341 | |||
342 | static void reset_controller(void) | ||
343 | { | ||
344 | int i; | ||
345 | |||
346 | outb_p(4, HD_CMD); | ||
347 | for (i = 0; i < 1000; i++) barrier(); | ||
348 | outb_p(hd_info[0].ctl & 0x0f, HD_CMD); | ||
349 | for (i = 0; i < 1000; i++) barrier(); | ||
350 | if (drive_busy()) | ||
351 | printk("hd: controller still busy\n"); | ||
352 | else if ((hd_error = inb(HD_ERROR)) != 1) | ||
353 | printk("hd: controller reset failed: %02x\n", hd_error); | ||
354 | } | ||
355 | |||
356 | static void reset_hd(void) | ||
357 | { | ||
358 | static int i; | ||
359 | |||
360 | repeat: | ||
361 | if (reset) { | ||
362 | reset = 0; | ||
363 | i = -1; | ||
364 | reset_controller(); | ||
365 | } else { | ||
366 | check_status(); | ||
367 | if (reset) | ||
368 | goto repeat; | ||
369 | } | ||
370 | if (++i < NR_HD) { | ||
371 | struct hd_i_struct *disk = &hd_info[i]; | ||
372 | disk->special_op = disk->recalibrate = 1; | ||
373 | hd_out(disk, disk->sect, disk->sect, disk->head-1, | ||
374 | disk->cyl, WIN_SPECIFY, &reset_hd); | ||
375 | if (reset) | ||
376 | goto repeat; | ||
377 | } else | ||
378 | hd_request(); | ||
379 | } | ||
380 | |||
381 | /* | ||
382 | * Ok, don't know what to do with the unexpected interrupts: on some machines | ||
383 | * doing a reset and a retry seems to result in an eternal loop. Right now I | ||
384 | * ignore it, and just set the timeout. | ||
385 | * | ||
386 | * On laptops (and "green" PCs), an unexpected interrupt occurs whenever the | ||
387 | * drive enters "idle", "standby", or "sleep" mode, so if the status looks | ||
388 | * "good", we just ignore the interrupt completely. | ||
389 | */ | ||
390 | static void unexpected_hd_interrupt(void) | ||
391 | { | ||
392 | unsigned int stat = inb_p(HD_STATUS); | ||
393 | |||
394 | if (stat & (BUSY_STAT|DRQ_STAT|ECC_STAT|ERR_STAT)) { | ||
395 | dump_status("unexpected interrupt", stat); | ||
396 | SET_TIMER; | ||
397 | } | ||
398 | } | ||
399 | |||
400 | /* | ||
401 | * bad_rw_intr() now tries to be a bit smarter and does things | ||
402 | * according to the error returned by the controller. | ||
403 | * -Mika Liljeberg (liljeber@cs.Helsinki.FI) | ||
404 | */ | ||
405 | static void bad_rw_intr(void) | ||
406 | { | ||
407 | struct request *req = CURRENT; | ||
408 | if (req != NULL) { | ||
409 | struct hd_i_struct *disk = req->rq_disk->private_data; | ||
410 | if (++req->errors >= MAX_ERRORS || (hd_error & BBD_ERR)) { | ||
411 | end_request(req, 0); | ||
412 | disk->special_op = disk->recalibrate = 1; | ||
413 | } else if (req->errors % RESET_FREQ == 0) | ||
414 | reset = 1; | ||
415 | else if ((hd_error & TRK0_ERR) || req->errors % RECAL_FREQ == 0) | ||
416 | disk->special_op = disk->recalibrate = 1; | ||
417 | /* Otherwise just retry */ | ||
418 | } | ||
419 | } | ||
420 | |||
421 | static inline int wait_DRQ(void) | ||
422 | { | ||
423 | int retries; | ||
424 | int stat; | ||
425 | |||
426 | for (retries = 0; retries < 100000; retries++) { | ||
427 | stat = inb_p(HD_STATUS); | ||
428 | if (stat & DRQ_STAT) | ||
429 | return 0; | ||
430 | } | ||
431 | dump_status("wait_DRQ", stat); | ||
432 | return -1; | ||
433 | } | ||
434 | |||
435 | static void read_intr(void) | ||
436 | { | ||
437 | struct request *req; | ||
438 | int i, retries = 100000; | ||
439 | |||
440 | do { | ||
441 | i = (unsigned) inb_p(HD_STATUS); | ||
442 | if (i & BUSY_STAT) | ||
443 | continue; | ||
444 | if (!OK_STATUS(i)) | ||
445 | break; | ||
446 | if (i & DRQ_STAT) | ||
447 | goto ok_to_read; | ||
448 | } while (--retries > 0); | ||
449 | dump_status("read_intr", i); | ||
450 | bad_rw_intr(); | ||
451 | hd_request(); | ||
452 | return; | ||
453 | ok_to_read: | ||
454 | req = CURRENT; | ||
455 | insw(HD_DATA, req->buffer, 256); | ||
456 | req->sector++; | ||
457 | req->buffer += 512; | ||
458 | req->errors = 0; | ||
459 | i = --req->nr_sectors; | ||
460 | --req->current_nr_sectors; | ||
461 | #ifdef DEBUG | ||
462 | printk("%s: read: sector %ld, remaining = %ld, buffer=%p\n", | ||
463 | req->rq_disk->disk_name, req->sector, req->nr_sectors, | ||
464 | req->buffer+512); | ||
465 | #endif | ||
466 | if (req->current_nr_sectors <= 0) | ||
467 | end_request(req, 1); | ||
468 | if (i > 0) { | ||
469 | SET_HANDLER(&read_intr); | ||
470 | return; | ||
471 | } | ||
472 | (void) inb_p(HD_STATUS); | ||
473 | #if (HD_DELAY > 0) | ||
474 | last_req = read_timer(); | ||
475 | #endif | ||
476 | if (elv_next_request(QUEUE)) | ||
477 | hd_request(); | ||
478 | return; | ||
479 | } | ||
480 | |||
481 | static void write_intr(void) | ||
482 | { | ||
483 | struct request *req = CURRENT; | ||
484 | int i; | ||
485 | int retries = 100000; | ||
486 | |||
487 | do { | ||
488 | i = (unsigned) inb_p(HD_STATUS); | ||
489 | if (i & BUSY_STAT) | ||
490 | continue; | ||
491 | if (!OK_STATUS(i)) | ||
492 | break; | ||
493 | if ((req->nr_sectors <= 1) || (i & DRQ_STAT)) | ||
494 | goto ok_to_write; | ||
495 | } while (--retries > 0); | ||
496 | dump_status("write_intr", i); | ||
497 | bad_rw_intr(); | ||
498 | hd_request(); | ||
499 | return; | ||
500 | ok_to_write: | ||
501 | req->sector++; | ||
502 | i = --req->nr_sectors; | ||
503 | --req->current_nr_sectors; | ||
504 | req->buffer += 512; | ||
505 | if (!i || (req->bio && req->current_nr_sectors <= 0)) | ||
506 | end_request(req, 1); | ||
507 | if (i > 0) { | ||
508 | SET_HANDLER(&write_intr); | ||
509 | outsw(HD_DATA, req->buffer, 256); | ||
510 | local_irq_enable(); | ||
511 | } else { | ||
512 | #if (HD_DELAY > 0) | ||
513 | last_req = read_timer(); | ||
514 | #endif | ||
515 | hd_request(); | ||
516 | } | ||
517 | return; | ||
518 | } | ||
519 | |||
520 | static void recal_intr(void) | ||
521 | { | ||
522 | check_status(); | ||
523 | #if (HD_DELAY > 0) | ||
524 | last_req = read_timer(); | ||
525 | #endif | ||
526 | hd_request(); | ||
527 | } | ||
528 | |||
529 | /* | ||
530 | * This is another of the error-routines I don't know what to do with. The | ||
531 | * best idea seems to just set reset, and start all over again. | ||
532 | */ | ||
533 | static void hd_times_out(unsigned long dummy) | ||
534 | { | ||
535 | char *name; | ||
536 | |||
537 | do_hd = NULL; | ||
538 | |||
539 | if (!CURRENT) | ||
540 | return; | ||
541 | |||
542 | disable_irq(HD_IRQ); | ||
543 | local_irq_enable(); | ||
544 | reset = 1; | ||
545 | name = CURRENT->rq_disk->disk_name; | ||
546 | printk("%s: timeout\n", name); | ||
547 | if (++CURRENT->errors >= MAX_ERRORS) { | ||
548 | #ifdef DEBUG | ||
549 | printk("%s: too many errors\n", name); | ||
550 | #endif | ||
551 | end_request(CURRENT, 0); | ||
552 | } | ||
553 | local_irq_disable(); | ||
554 | hd_request(); | ||
555 | enable_irq(HD_IRQ); | ||
556 | } | ||
557 | |||
558 | static int do_special_op(struct hd_i_struct *disk, struct request *req) | ||
559 | { | ||
560 | if (disk->recalibrate) { | ||
561 | disk->recalibrate = 0; | ||
562 | hd_out(disk, disk->sect, 0, 0, 0, WIN_RESTORE, &recal_intr); | ||
563 | return reset; | ||
564 | } | ||
565 | if (disk->head > 16) { | ||
566 | printk("%s: cannot handle device with more than 16 heads - giving up\n", req->rq_disk->disk_name); | ||
567 | end_request(req, 0); | ||
568 | } | ||
569 | disk->special_op = 0; | ||
570 | return 1; | ||
571 | } | ||
572 | |||
573 | /* | ||
574 | * The driver enables interrupts as much as possible. In order to do this, | ||
575 | * (a) the device-interrupt is disabled before entering hd_request(), | ||
576 | * and (b) the timeout-interrupt is disabled before the sti(). | ||
577 | * | ||
578 | * Interrupts are still masked (by default) whenever we are exchanging | ||
579 | * data/cmds with a drive, because some drives seem to have very poor | ||
580 | * tolerance for latency during I/O. The IDE driver has support to unmask | ||
581 | * interrupts for non-broken hardware, so use that driver if required. | ||
582 | */ | ||
583 | static void hd_request(void) | ||
584 | { | ||
585 | unsigned int block, nsect, sec, track, head, cyl; | ||
586 | struct hd_i_struct *disk; | ||
587 | struct request *req; | ||
588 | |||
589 | if (do_hd) | ||
590 | return; | ||
591 | repeat: | ||
592 | del_timer(&device_timer); | ||
593 | local_irq_enable(); | ||
594 | |||
595 | req = CURRENT; | ||
596 | if (!req) { | ||
597 | do_hd = NULL; | ||
598 | return; | ||
599 | } | ||
600 | |||
601 | if (reset) { | ||
602 | local_irq_disable(); | ||
603 | reset_hd(); | ||
604 | return; | ||
605 | } | ||
606 | disk = req->rq_disk->private_data; | ||
607 | block = req->sector; | ||
608 | nsect = req->nr_sectors; | ||
609 | if (block >= get_capacity(req->rq_disk) || | ||
610 | ((block+nsect) > get_capacity(req->rq_disk))) { | ||
611 | printk("%s: bad access: block=%d, count=%d\n", | ||
612 | req->rq_disk->disk_name, block, nsect); | ||
613 | end_request(req, 0); | ||
614 | goto repeat; | ||
615 | } | ||
616 | |||
617 | if (disk->special_op) { | ||
618 | if (do_special_op(disk, req)) | ||
619 | goto repeat; | ||
620 | return; | ||
621 | } | ||
622 | sec = block % disk->sect + 1; | ||
623 | track = block / disk->sect; | ||
624 | head = track % disk->head; | ||
625 | cyl = track / disk->head; | ||
626 | #ifdef DEBUG | ||
627 | printk("%s: %sing: CHS=%d/%d/%d, sectors=%d, buffer=%p\n", | ||
628 | req->rq_disk->disk_name, | ||
629 | req_data_dir(req) == READ ? "read" : "writ", | ||
630 | cyl, head, sec, nsect, req->buffer); | ||
631 | #endif | ||
632 | if (blk_fs_request(req)) { | ||
633 | switch (rq_data_dir(req)) { | ||
634 | case READ: | ||
635 | hd_out(disk, nsect, sec, head, cyl, WIN_READ, | ||
636 | &read_intr); | ||
637 | if (reset) | ||
638 | goto repeat; | ||
639 | break; | ||
640 | case WRITE: | ||
641 | hd_out(disk, nsect, sec, head, cyl, WIN_WRITE, | ||
642 | &write_intr); | ||
643 | if (reset) | ||
644 | goto repeat; | ||
645 | if (wait_DRQ()) { | ||
646 | bad_rw_intr(); | ||
647 | goto repeat; | ||
648 | } | ||
649 | outsw(HD_DATA, req->buffer, 256); | ||
650 | break; | ||
651 | default: | ||
652 | printk("unknown hd-command\n"); | ||
653 | end_request(req, 0); | ||
654 | break; | ||
655 | } | ||
656 | } | ||
657 | } | ||
658 | |||
659 | static void do_hd_request(struct request_queue *q) | ||
660 | { | ||
661 | disable_irq(HD_IRQ); | ||
662 | hd_request(); | ||
663 | enable_irq(HD_IRQ); | ||
664 | } | ||
665 | |||
666 | static int hd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
667 | { | ||
668 | struct hd_i_struct *disk = bdev->bd_disk->private_data; | ||
669 | |||
670 | geo->heads = disk->head; | ||
671 | geo->sectors = disk->sect; | ||
672 | geo->cylinders = disk->cyl; | ||
673 | return 0; | ||
674 | } | ||
675 | |||
676 | /* | ||
677 | * Releasing a block device means we sync() it, so that it can safely | ||
678 | * be forgotten about... | ||
679 | */ | ||
680 | |||
681 | static irqreturn_t hd_interrupt(int irq, void *dev_id) | ||
682 | { | ||
683 | void (*handler)(void) = do_hd; | ||
684 | |||
685 | do_hd = NULL; | ||
686 | del_timer(&device_timer); | ||
687 | if (!handler) | ||
688 | handler = unexpected_hd_interrupt; | ||
689 | handler(); | ||
690 | local_irq_enable(); | ||
691 | return IRQ_HANDLED; | ||
692 | } | ||
693 | |||
694 | static struct block_device_operations hd_fops = { | ||
695 | .getgeo = hd_getgeo, | ||
696 | }; | ||
697 | |||
698 | /* | ||
699 | * This is the hard disk IRQ description. The IRQF_DISABLED in sa_flags | ||
700 | * means we run the IRQ-handler with interrupts disabled: this is bad for | ||
701 | * interrupt latency, but anything else has led to problems on some | ||
702 | * machines. | ||
703 | * | ||
704 | * We enable interrupts in some of the routines after making sure it's | ||
705 | * safe. | ||
706 | */ | ||
707 | |||
708 | static int __init hd_init(void) | ||
709 | { | ||
710 | int drive; | ||
711 | |||
712 | if (register_blkdev(MAJOR_NR, "hd")) | ||
713 | return -1; | ||
714 | |||
715 | hd_queue = blk_init_queue(do_hd_request, &hd_lock); | ||
716 | if (!hd_queue) { | ||
717 | unregister_blkdev(MAJOR_NR, "hd"); | ||
718 | return -ENOMEM; | ||
719 | } | ||
720 | |||
721 | blk_queue_max_sectors(hd_queue, 255); | ||
722 | init_timer(&device_timer); | ||
723 | device_timer.function = hd_times_out; | ||
724 | blk_queue_hardsect_size(hd_queue, 512); | ||
725 | |||
726 | if (!NR_HD) { | ||
727 | /* | ||
728 | * We don't know anything about the drive. This means | ||
729 | * that you *MUST* specify the drive parameters to the | ||
730 | * kernel yourself. | ||
731 | * | ||
732 | * If we were on an i386, we used to read this info from | ||
733 | * the BIOS or CMOS. This doesn't work all that well, | ||
734 | * since this assumes that this is a primary or secondary | ||
735 | * drive, and if we're using this legacy driver, it's | ||
736 | * probably an auxilliary controller added to recover | ||
737 | * legacy data off an ST-506 drive. Either way, it's | ||
738 | * definitely safest to have the user explicitly specify | ||
739 | * the information. | ||
740 | */ | ||
741 | printk("hd: no drives specified - use hd=cyl,head,sectors" | ||
742 | " on kernel command line\n"); | ||
743 | goto out; | ||
744 | } | ||
745 | |||
746 | for (drive = 0 ; drive < NR_HD ; drive++) { | ||
747 | struct gendisk *disk = alloc_disk(64); | ||
748 | struct hd_i_struct *p = &hd_info[drive]; | ||
749 | if (!disk) | ||
750 | goto Enomem; | ||
751 | disk->major = MAJOR_NR; | ||
752 | disk->first_minor = drive << 6; | ||
753 | disk->fops = &hd_fops; | ||
754 | sprintf(disk->disk_name, "hd%c", 'a'+drive); | ||
755 | disk->private_data = p; | ||
756 | set_capacity(disk, p->head * p->sect * p->cyl); | ||
757 | disk->queue = hd_queue; | ||
758 | p->unit = drive; | ||
759 | hd_gendisk[drive] = disk; | ||
760 | printk("%s: %luMB, CHS=%d/%d/%d\n", | ||
761 | disk->disk_name, (unsigned long)get_capacity(disk)/2048, | ||
762 | p->cyl, p->head, p->sect); | ||
763 | } | ||
764 | |||
765 | if (request_irq(HD_IRQ, hd_interrupt, IRQF_DISABLED, "hd", NULL)) { | ||
766 | printk("hd: unable to get IRQ%d for the hard disk driver\n", | ||
767 | HD_IRQ); | ||
768 | goto out1; | ||
769 | } | ||
770 | if (!request_region(HD_DATA, 8, "hd")) { | ||
771 | printk(KERN_WARNING "hd: port 0x%x busy\n", HD_DATA); | ||
772 | goto out2; | ||
773 | } | ||
774 | if (!request_region(HD_CMD, 1, "hd(cmd)")) { | ||
775 | printk(KERN_WARNING "hd: port 0x%x busy\n", HD_CMD); | ||
776 | goto out3; | ||
777 | } | ||
778 | |||
779 | /* Let them fly */ | ||
780 | for (drive = 0; drive < NR_HD; drive++) | ||
781 | add_disk(hd_gendisk[drive]); | ||
782 | |||
783 | return 0; | ||
784 | |||
785 | out3: | ||
786 | release_region(HD_DATA, 8); | ||
787 | out2: | ||
788 | free_irq(HD_IRQ, NULL); | ||
789 | out1: | ||
790 | for (drive = 0; drive < NR_HD; drive++) | ||
791 | put_disk(hd_gendisk[drive]); | ||
792 | NR_HD = 0; | ||
793 | out: | ||
794 | del_timer(&device_timer); | ||
795 | unregister_blkdev(MAJOR_NR, "hd"); | ||
796 | blk_cleanup_queue(hd_queue); | ||
797 | return -1; | ||
798 | Enomem: | ||
799 | while (drive--) | ||
800 | put_disk(hd_gendisk[drive]); | ||
801 | goto out; | ||
802 | } | ||
803 | |||
804 | static int __init parse_hd_setup(char *line) | ||
805 | { | ||
806 | int ints[6]; | ||
807 | |||
808 | (void) get_options(line, ARRAY_SIZE(ints), ints); | ||
809 | hd_setup(NULL, ints); | ||
810 | |||
811 | return 1; | ||
812 | } | ||
813 | __setup("hd=", parse_hd_setup); | ||
814 | |||
815 | module_init(hd_init); | ||
diff --git a/drivers/ide/legacy/ht6560b.c b/drivers/ide/legacy/ht6560b.c index dd6dfb32e853..7bc8fd59ea9e 100644 --- a/drivers/ide/legacy/ht6560b.c +++ b/drivers/ide/legacy/ht6560b.c | |||
@@ -216,6 +216,7 @@ static u8 ht_pio2timings(ide_drive_t *drive, const u8 pio) | |||
216 | 216 | ||
217 | if (pio) { | 217 | if (pio) { |
218 | unsigned int cycle_time; | 218 | unsigned int cycle_time; |
219 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
219 | 220 | ||
220 | cycle_time = ide_pio_cycle_time(drive, pio); | 221 | cycle_time = ide_pio_cycle_time(drive, pio); |
221 | 222 | ||
@@ -224,10 +225,8 @@ static u8 ht_pio2timings(ide_drive_t *drive, const u8 pio) | |||
224 | * actual cycle time for recovery and activity | 225 | * actual cycle time for recovery and activity |
225 | * according system bus speed. | 226 | * according system bus speed. |
226 | */ | 227 | */ |
227 | active_time = ide_pio_timings[pio].active_time; | 228 | active_time = t->active; |
228 | recovery_time = cycle_time | 229 | recovery_time = cycle_time - active_time - t->setup; |
229 | - active_time | ||
230 | - ide_pio_timings[pio].setup_time; | ||
231 | /* | 230 | /* |
232 | * Cycle times should be Vesa bus cycles | 231 | * Cycle times should be Vesa bus cycles |
233 | */ | 232 | */ |
@@ -311,16 +310,16 @@ static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
311 | #endif | 310 | #endif |
312 | } | 311 | } |
313 | 312 | ||
314 | static void __init ht6560b_port_init_devs(ide_hwif_t *hwif) | 313 | static void __init ht6560b_init_dev(ide_drive_t *drive) |
315 | { | 314 | { |
315 | ide_hwif_t *hwif = drive->hwif; | ||
316 | /* Setting default configurations for drives. */ | 316 | /* Setting default configurations for drives. */ |
317 | int t = (HT_CONFIG_DEFAULT << 8) | HT_TIMING_DEFAULT; | 317 | int t = (HT_CONFIG_DEFAULT << 8) | HT_TIMING_DEFAULT; |
318 | 318 | ||
319 | if (hwif->channel) | 319 | if (hwif->channel) |
320 | t |= (HT_SECONDARY_IF << 8); | 320 | t |= (HT_SECONDARY_IF << 8); |
321 | 321 | ||
322 | hwif->drives[0].drive_data = t; | 322 | drive->drive_data = t; |
323 | hwif->drives[1].drive_data = t; | ||
324 | } | 323 | } |
325 | 324 | ||
326 | static int probe_ht6560b; | 325 | static int probe_ht6560b; |
@@ -329,7 +328,7 @@ module_param_named(probe, probe_ht6560b, bool, 0); | |||
329 | MODULE_PARM_DESC(probe, "probe for HT6560B chipset"); | 328 | MODULE_PARM_DESC(probe, "probe for HT6560B chipset"); |
330 | 329 | ||
331 | static const struct ide_port_ops ht6560b_port_ops = { | 330 | static const struct ide_port_ops ht6560b_port_ops = { |
332 | .port_init_devs = ht6560b_port_init_devs, | 331 | .init_dev = ht6560b_init_dev, |
333 | .set_pio_mode = ht6560b_set_pio_mode, | 332 | .set_pio_mode = ht6560b_set_pio_mode, |
334 | .selectproc = ht6560b_selectproc, | 333 | .selectproc = ht6560b_selectproc, |
335 | }; | 334 | }; |
diff --git a/drivers/ide/legacy/ide-4drives.c b/drivers/ide/legacy/ide-4drives.c index ecae916a3385..89c8ff0a4d08 100644 --- a/drivers/ide/legacy/ide-4drives.c +++ b/drivers/ide/legacy/ide-4drives.c | |||
@@ -11,6 +11,21 @@ static int probe_4drives; | |||
11 | module_param_named(probe, probe_4drives, bool, 0); | 11 | module_param_named(probe, probe_4drives, bool, 0); |
12 | MODULE_PARM_DESC(probe, "probe for generic IDE chipset with 4 drives/port"); | 12 | MODULE_PARM_DESC(probe, "probe for generic IDE chipset with 4 drives/port"); |
13 | 13 | ||
14 | static void ide_4drives_init_dev(ide_drive_t *drive) | ||
15 | { | ||
16 | if (drive->hwif->channel) | ||
17 | drive->select.all ^= 0x20; | ||
18 | } | ||
19 | |||
20 | static const struct ide_port_ops ide_4drives_port_ops = { | ||
21 | .init_dev = ide_4drives_init_dev, | ||
22 | }; | ||
23 | |||
24 | static const struct ide_port_info ide_4drives_port_info = { | ||
25 | .port_ops = &ide_4drives_port_ops, | ||
26 | .host_flags = IDE_HFLAG_SERIALIZE | IDE_HFLAG_NO_DMA, | ||
27 | }; | ||
28 | |||
14 | static int __init ide_4drives_init(void) | 29 | static int __init ide_4drives_init(void) |
15 | { | 30 | { |
16 | ide_hwif_t *hwif, *mate; | 31 | ide_hwif_t *hwif, *mate; |
@@ -49,18 +64,10 @@ static int __init ide_4drives_init(void) | |||
49 | mate = ide_find_port(); | 64 | mate = ide_find_port(); |
50 | if (mate) { | 65 | if (mate) { |
51 | ide_init_port_hw(mate, &hw); | 66 | ide_init_port_hw(mate, &hw); |
52 | mate->drives[0].select.all ^= 0x20; | ||
53 | mate->drives[1].select.all ^= 0x20; | ||
54 | idx[1] = mate->index; | 67 | idx[1] = mate->index; |
55 | |||
56 | if (hwif) { | ||
57 | hwif->mate = mate; | ||
58 | mate->mate = hwif; | ||
59 | hwif->serialized = mate->serialized = 1; | ||
60 | } | ||
61 | } | 68 | } |
62 | 69 | ||
63 | ide_device_add(idx, NULL); | 70 | ide_device_add(idx, &ide_4drives_port_info); |
64 | 71 | ||
65 | return 0; | 72 | return 0; |
66 | } | 73 | } |
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index 8dbf4d9b6447..27b1e0b7ecb4 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
@@ -66,8 +66,6 @@ MODULE_LICENSE("Dual MPL/GPL"); | |||
66 | #ifdef CONFIG_PCMCIA_DEBUG | 66 | #ifdef CONFIG_PCMCIA_DEBUG |
67 | INT_MODULE_PARM(pc_debug, 0); | 67 | INT_MODULE_PARM(pc_debug, 0); |
68 | #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) | 68 | #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) |
69 | /*static char *version = | ||
70 | "ide-cs.c 1.3 2002/10/26 05:45:31 (David Hinds)";*/ | ||
71 | #else | 69 | #else |
72 | #define DEBUG(n, args...) | 70 | #define DEBUG(n, args...) |
73 | #endif | 71 | #endif |
@@ -154,6 +152,11 @@ static const struct ide_port_ops idecs_port_ops = { | |||
154 | .quirkproc = ide_undecoded_slave, | 152 | .quirkproc = ide_undecoded_slave, |
155 | }; | 153 | }; |
156 | 154 | ||
155 | static const struct ide_port_info idecs_port_info = { | ||
156 | .port_ops = &idecs_port_ops, | ||
157 | .host_flags = IDE_HFLAG_NO_DMA, | ||
158 | }; | ||
159 | |||
157 | static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl, | 160 | static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl, |
158 | unsigned long irq, struct pcmcia_device *handle) | 161 | unsigned long irq, struct pcmcia_device *handle) |
159 | { | 162 | { |
@@ -187,13 +190,11 @@ static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl, | |||
187 | 190 | ||
188 | i = hwif->index; | 191 | i = hwif->index; |
189 | 192 | ||
190 | ide_init_port_data(hwif, i); | ||
191 | ide_init_port_hw(hwif, &hw); | 193 | ide_init_port_hw(hwif, &hw); |
192 | hwif->port_ops = &idecs_port_ops; | ||
193 | 194 | ||
194 | idx[0] = i; | 195 | idx[0] = i; |
195 | 196 | ||
196 | ide_device_add(idx, NULL); | 197 | ide_device_add(idx, &idecs_port_info); |
197 | 198 | ||
198 | if (hwif->present) | 199 | if (hwif->present) |
199 | return hwif; | 200 | return hwif; |
diff --git a/drivers/ide/legacy/ide_platform.c b/drivers/ide/legacy/ide_platform.c index d3bc3f24e05d..a249562b34b5 100644 --- a/drivers/ide/legacy/ide_platform.c +++ b/drivers/ide/legacy/ide_platform.c | |||
@@ -44,6 +44,10 @@ static void __devinit plat_ide_setup_ports(hw_regs_t *hw, | |||
44 | hw->chipset = ide_generic; | 44 | hw->chipset = ide_generic; |
45 | } | 45 | } |
46 | 46 | ||
47 | static const struct ide_port_info platform_ide_port_info = { | ||
48 | .host_flags = IDE_HFLAG_NO_DMA, | ||
49 | }; | ||
50 | |||
47 | static int __devinit plat_ide_probe(struct platform_device *pdev) | 51 | static int __devinit plat_ide_probe(struct platform_device *pdev) |
48 | { | 52 | { |
49 | struct resource *res_base, *res_alt, *res_irq; | 53 | struct resource *res_base, *res_alt, *res_irq; |
@@ -54,6 +58,7 @@ static int __devinit plat_ide_probe(struct platform_device *pdev) | |||
54 | int ret = 0; | 58 | int ret = 0; |
55 | int mmio = 0; | 59 | int mmio = 0; |
56 | hw_regs_t hw; | 60 | hw_regs_t hw; |
61 | struct ide_port_info d = platform_ide_port_info; | ||
57 | 62 | ||
58 | pdata = pdev->dev.platform_data; | 63 | pdata = pdev->dev.platform_data; |
59 | 64 | ||
@@ -102,13 +107,13 @@ static int __devinit plat_ide_probe(struct platform_device *pdev) | |||
102 | ide_init_port_hw(hwif, &hw); | 107 | ide_init_port_hw(hwif, &hw); |
103 | 108 | ||
104 | if (mmio) { | 109 | if (mmio) { |
105 | hwif->host_flags = IDE_HFLAG_MMIO; | 110 | d.host_flags |= IDE_HFLAG_MMIO; |
106 | default_hwif_mmiops(hwif); | 111 | default_hwif_mmiops(hwif); |
107 | } | 112 | } |
108 | 113 | ||
109 | idx[0] = hwif->index; | 114 | idx[0] = hwif->index; |
110 | 115 | ||
111 | ide_device_add(idx, NULL); | 116 | ide_device_add(idx, &d); |
112 | 117 | ||
113 | platform_set_drvdata(pdev, hwif); | 118 | platform_set_drvdata(pdev, hwif); |
114 | 119 | ||
diff --git a/drivers/ide/legacy/macide.c b/drivers/ide/legacy/macide.c index 2e84290d0bcc..0a6195bcfeda 100644 --- a/drivers/ide/legacy/macide.c +++ b/drivers/ide/legacy/macide.c | |||
@@ -130,7 +130,6 @@ static int __init macide_init(void) | |||
130 | u8 index = hwif->index; | 130 | u8 index = hwif->index; |
131 | u8 idx[4] = { index, 0xff, 0xff, 0xff }; | 131 | u8 idx[4] = { index, 0xff, 0xff, 0xff }; |
132 | 132 | ||
133 | ide_init_port_data(hwif, index); | ||
134 | ide_init_port_hw(hwif, &hw); | 133 | ide_init_port_hw(hwif, &hw); |
135 | 134 | ||
136 | ide_device_add(idx, NULL); | 135 | ide_device_add(idx, NULL); |
diff --git a/drivers/ide/legacy/q40ide.c b/drivers/ide/legacy/q40ide.c index 8ff6e2d20834..9c2b9d078f69 100644 --- a/drivers/ide/legacy/q40ide.c +++ b/drivers/ide/legacy/q40ide.c | |||
@@ -142,7 +142,6 @@ static int __init q40ide_init(void) | |||
142 | 142 | ||
143 | hwif = ide_find_port(); | 143 | hwif = ide_find_port(); |
144 | if (hwif) { | 144 | if (hwif) { |
145 | ide_init_port_data(hwif, hwif->index); | ||
146 | ide_init_port_hw(hwif, &hw); | 145 | ide_init_port_hw(hwif, &hw); |
147 | 146 | ||
148 | /* Q40 has a byte-swapped IDE interface */ | 147 | /* Q40 has a byte-swapped IDE interface */ |
diff --git a/drivers/ide/legacy/qd65xx.c b/drivers/ide/legacy/qd65xx.c index 51dba82f8812..2338f344ea24 100644 --- a/drivers/ide/legacy/qd65xx.c +++ b/drivers/ide/legacy/qd65xx.c | |||
@@ -207,6 +207,7 @@ static void qd6500_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
207 | static void qd6580_set_pio_mode(ide_drive_t *drive, const u8 pio) | 207 | static void qd6580_set_pio_mode(ide_drive_t *drive, const u8 pio) |
208 | { | 208 | { |
209 | ide_hwif_t *hwif = drive->hwif; | 209 | ide_hwif_t *hwif = drive->hwif; |
210 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
210 | unsigned int cycle_time; | 211 | unsigned int cycle_time; |
211 | int active_time = 175; | 212 | int active_time = 175; |
212 | int recovery_time = 415; /* worst case values from the dos driver */ | 213 | int recovery_time = 415; /* worst case values from the dos driver */ |
@@ -236,7 +237,7 @@ static void qd6580_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
236 | active_time = 110; | 237 | active_time = 110; |
237 | recovery_time = cycle_time - 120; | 238 | recovery_time = cycle_time - 120; |
238 | } else { | 239 | } else { |
239 | active_time = ide_pio_timings[pio].active_time; | 240 | active_time = t->active; |
240 | recovery_time = cycle_time - active_time; | 241 | recovery_time = cycle_time - active_time; |
241 | } | 242 | } |
242 | } | 243 | } |
@@ -281,17 +282,18 @@ static int __init qd_testreg(int port) | |||
281 | return (readreg != QD_TESTVAL); | 282 | return (readreg != QD_TESTVAL); |
282 | } | 283 | } |
283 | 284 | ||
284 | static void __init qd6500_port_init_devs(ide_hwif_t *hwif) | 285 | static void __init qd6500_init_dev(ide_drive_t *drive) |
285 | { | 286 | { |
287 | ide_hwif_t *hwif = drive->hwif; | ||
286 | u8 base = (hwif->config_data & 0xff00) >> 8; | 288 | u8 base = (hwif->config_data & 0xff00) >> 8; |
287 | u8 config = QD_CONFIG(hwif); | 289 | u8 config = QD_CONFIG(hwif); |
288 | 290 | ||
289 | hwif->drives[0].drive_data = QD6500_DEF_DATA; | 291 | drive->drive_data = QD6500_DEF_DATA; |
290 | hwif->drives[1].drive_data = QD6500_DEF_DATA; | ||
291 | } | 292 | } |
292 | 293 | ||
293 | static void __init qd6580_port_init_devs(ide_hwif_t *hwif) | 294 | static void __init qd6580_init_dev(ide_drive_t *drive) |
294 | { | 295 | { |
296 | ide_hwif_t *hwif = drive->hwif; | ||
295 | u16 t1, t2; | 297 | u16 t1, t2; |
296 | u8 base = (hwif->config_data & 0xff00) >> 8; | 298 | u8 base = (hwif->config_data & 0xff00) >> 8; |
297 | u8 config = QD_CONFIG(hwif); | 299 | u8 config = QD_CONFIG(hwif); |
@@ -302,18 +304,17 @@ static void __init qd6580_port_init_devs(ide_hwif_t *hwif) | |||
302 | } else | 304 | } else |
303 | t2 = t1 = hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA; | 305 | t2 = t1 = hwif->channel ? QD6580_DEF_DATA2 : QD6580_DEF_DATA; |
304 | 306 | ||
305 | hwif->drives[0].drive_data = t1; | 307 | drive->drive_data = drive->select.b.unit ? t2 : t1; |
306 | hwif->drives[1].drive_data = t2; | ||
307 | } | 308 | } |
308 | 309 | ||
309 | static const struct ide_port_ops qd6500_port_ops = { | 310 | static const struct ide_port_ops qd6500_port_ops = { |
310 | .port_init_devs = qd6500_port_init_devs, | 311 | .init_dev = qd6500_init_dev, |
311 | .set_pio_mode = qd6500_set_pio_mode, | 312 | .set_pio_mode = qd6500_set_pio_mode, |
312 | .selectproc = qd65xx_select, | 313 | .selectproc = qd65xx_select, |
313 | }; | 314 | }; |
314 | 315 | ||
315 | static const struct ide_port_ops qd6580_port_ops = { | 316 | static const struct ide_port_ops qd6580_port_ops = { |
316 | .port_init_devs = qd6580_port_init_devs, | 317 | .init_dev = qd6580_init_dev, |
317 | .set_pio_mode = qd6580_set_pio_mode, | 318 | .set_pio_mode = qd6580_set_pio_mode, |
318 | .selectproc = qd65xx_select, | 319 | .selectproc = qd65xx_select, |
319 | }; | 320 | }; |
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c index 1a6c27b32498..48d57cae63c6 100644 --- a/drivers/ide/mips/au1xxx-ide.c +++ b/drivers/ide/mips/au1xxx-ide.c | |||
@@ -213,10 +213,8 @@ static int auide_build_dmatable(ide_drive_t *drive) | |||
213 | { | 213 | { |
214 | int i, iswrite, count = 0; | 214 | int i, iswrite, count = 0; |
215 | ide_hwif_t *hwif = HWIF(drive); | 215 | ide_hwif_t *hwif = HWIF(drive); |
216 | |||
217 | struct request *rq = HWGROUP(drive)->rq; | 216 | struct request *rq = HWGROUP(drive)->rq; |
218 | 217 | _auide_hwif *ahwif = &auide_hwif; | |
219 | _auide_hwif *ahwif = (_auide_hwif*)hwif->hwif_data; | ||
220 | struct scatterlist *sg; | 218 | struct scatterlist *sg; |
221 | 219 | ||
222 | iswrite = (rq_data_dir(rq) == WRITE); | 220 | iswrite = (rq_data_dir(rq) == WRITE); |
@@ -402,7 +400,7 @@ static const struct ide_dma_ops au1xxx_dma_ops = { | |||
402 | 400 | ||
403 | static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d) | 401 | static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d) |
404 | { | 402 | { |
405 | _auide_hwif *auide = (_auide_hwif *)hwif->hwif_data; | 403 | _auide_hwif *auide = &auide_hwif; |
406 | dbdev_tab_t source_dev_tab, target_dev_tab; | 404 | dbdev_tab_t source_dev_tab, target_dev_tab; |
407 | u32 dev_id, tsize, devwidth, flags; | 405 | u32 dev_id, tsize, devwidth, flags; |
408 | 406 | ||
@@ -463,7 +461,7 @@ static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
463 | #else | 461 | #else |
464 | static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d) | 462 | static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d) |
465 | { | 463 | { |
466 | _auide_hwif *auide = (_auide_hwif *)hwif->hwif_data; | 464 | _auide_hwif *auide = &auide_hwif; |
467 | dbdev_tab_t source_dev_tab; | 465 | dbdev_tab_t source_dev_tab; |
468 | int flags; | 466 | int flags; |
469 | 467 | ||
@@ -600,8 +598,6 @@ static int au_ide_probe(struct device *dev) | |||
600 | 598 | ||
601 | ide_init_port_hw(hwif, &hw); | 599 | ide_init_port_hw(hwif, &hw); |
602 | 600 | ||
603 | hwif->dev = dev; | ||
604 | |||
605 | /* If the user has selected DDMA assisted copies, | 601 | /* If the user has selected DDMA assisted copies, |
606 | then set up a few local I/O function entry points | 602 | then set up a few local I/O function entry points |
607 | */ | 603 | */ |
@@ -610,11 +606,8 @@ static int au_ide_probe(struct device *dev) | |||
610 | hwif->input_data = au1xxx_input_data; | 606 | hwif->input_data = au1xxx_input_data; |
611 | hwif->output_data = au1xxx_output_data; | 607 | hwif->output_data = au1xxx_output_data; |
612 | #endif | 608 | #endif |
613 | hwif->select_data = 0; /* no chipset-specific code */ | ||
614 | hwif->config_data = 0; /* no chipset-specific code */ | ||
615 | 609 | ||
616 | auide_hwif.hwif = hwif; | 610 | auide_hwif.hwif = hwif; |
617 | hwif->hwif_data = &auide_hwif; | ||
618 | 611 | ||
619 | idx[0] = hwif->index; | 612 | idx[0] = hwif->index; |
620 | 613 | ||
diff --git a/drivers/ide/mips/swarm.c b/drivers/ide/mips/swarm.c index 52fee3d2771a..9f1212cc4aed 100644 --- a/drivers/ide/mips/swarm.c +++ b/drivers/ide/mips/swarm.c | |||
@@ -61,6 +61,11 @@ static struct resource swarm_ide_resource = { | |||
61 | 61 | ||
62 | static struct platform_device *swarm_ide_dev; | 62 | static struct platform_device *swarm_ide_dev; |
63 | 63 | ||
64 | static const struct ide_port_info swarm_port_info = { | ||
65 | .name = DRV_NAME, | ||
66 | .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, | ||
67 | }; | ||
68 | |||
64 | /* | 69 | /* |
65 | * swarm_ide_probe - if the board header indicates the existence of | 70 | * swarm_ide_probe - if the board header indicates the existence of |
66 | * Generic Bus IDE, allocate a HWIF for it. | 71 | * Generic Bus IDE, allocate a HWIF for it. |
@@ -77,12 +82,6 @@ static int __devinit swarm_ide_probe(struct device *dev) | |||
77 | if (!SIBYTE_HAVE_IDE) | 82 | if (!SIBYTE_HAVE_IDE) |
78 | return -ENODEV; | 83 | return -ENODEV; |
79 | 84 | ||
80 | hwif = ide_find_port(); | ||
81 | if (hwif == NULL) { | ||
82 | printk(KERN_ERR DRV_NAME ": no free slot for interface\n"); | ||
83 | return -ENOMEM; | ||
84 | } | ||
85 | |||
86 | base = ioremap(A_IO_EXT_BASE, 0x800); | 85 | base = ioremap(A_IO_EXT_BASE, 0x800); |
87 | offset = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_START_ADDR, IDE_CS)); | 86 | offset = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_START_ADDR, IDE_CS)); |
88 | size = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_MULT_SIZE, IDE_CS)); | 87 | size = __raw_readq(base + R_IO_EXT_REG(R_IO_EXT_MULT_SIZE, IDE_CS)); |
@@ -109,10 +108,6 @@ static int __devinit swarm_ide_probe(struct device *dev) | |||
109 | 108 | ||
110 | base = ioremap(offset, size); | 109 | base = ioremap(offset, size); |
111 | 110 | ||
112 | /* Setup MMIO ops. */ | ||
113 | hwif->host_flags = IDE_HFLAG_MMIO; | ||
114 | default_hwif_mmiops(hwif); | ||
115 | |||
116 | for (i = 0; i <= 7; i++) | 111 | for (i = 0; i <= 7; i++) |
117 | hw.io_ports_array[i] = | 112 | hw.io_ports_array[i] = |
118 | (unsigned long)(base + ((0x1f0 + i) << 5)); | 113 | (unsigned long)(base + ((0x1f0 + i) << 5)); |
@@ -121,15 +116,26 @@ static int __devinit swarm_ide_probe(struct device *dev) | |||
121 | hw.irq = K_INT_GB_IDE; | 116 | hw.irq = K_INT_GB_IDE; |
122 | hw.chipset = ide_generic; | 117 | hw.chipset = ide_generic; |
123 | 118 | ||
119 | hwif = ide_find_port_slot(&swarm_port_info); | ||
120 | if (hwif == NULL) | ||
121 | goto err; | ||
122 | |||
124 | ide_init_port_hw(hwif, &hw); | 123 | ide_init_port_hw(hwif, &hw); |
125 | 124 | ||
125 | /* Setup MMIO ops. */ | ||
126 | default_hwif_mmiops(hwif); | ||
127 | |||
126 | idx[0] = hwif->index; | 128 | idx[0] = hwif->index; |
127 | 129 | ||
128 | ide_device_add(idx, NULL); | 130 | ide_device_add(idx, &swarm_port_info); |
129 | 131 | ||
130 | dev_set_drvdata(dev, hwif); | 132 | dev_set_drvdata(dev, hwif); |
131 | 133 | ||
132 | return 0; | 134 | return 0; |
135 | err: | ||
136 | release_resource(&swarm_ide_resource); | ||
137 | iounmap(base); | ||
138 | return -ENOMEM; | ||
133 | } | 139 | } |
134 | 140 | ||
135 | static struct device_driver swarm_ide_driver = { | 141 | static struct device_driver swarm_ide_driver = { |
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index f2de00adf147..80d19c0eb780 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
@@ -69,7 +69,8 @@ static void ali_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
69 | { | 69 | { |
70 | ide_hwif_t *hwif = HWIF(drive); | 70 | ide_hwif_t *hwif = HWIF(drive); |
71 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 71 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
72 | int s_time, a_time, c_time; | 72 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); |
73 | int s_time = t->setup, a_time = t->active, c_time = t->cycle; | ||
73 | u8 s_clc, a_clc, r_clc; | 74 | u8 s_clc, a_clc, r_clc; |
74 | unsigned long flags; | 75 | unsigned long flags; |
75 | int bus_speed = ide_pci_clk ? ide_pci_clk : 33; | 76 | int bus_speed = ide_pci_clk ? ide_pci_clk : 33; |
@@ -78,13 +79,10 @@ static void ali_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
78 | u8 cd_dma_fifo = 0; | 79 | u8 cd_dma_fifo = 0; |
79 | int unit = drive->select.b.unit & 1; | 80 | int unit = drive->select.b.unit & 1; |
80 | 81 | ||
81 | s_time = ide_pio_timings[pio].setup_time; | ||
82 | a_time = ide_pio_timings[pio].active_time; | ||
83 | if ((s_clc = (s_time * bus_speed + 999) / 1000) >= 8) | 82 | if ((s_clc = (s_time * bus_speed + 999) / 1000) >= 8) |
84 | s_clc = 0; | 83 | s_clc = 0; |
85 | if ((a_clc = (a_time * bus_speed + 999) / 1000) >= 8) | 84 | if ((a_clc = (a_time * bus_speed + 999) / 1000) >= 8) |
86 | a_clc = 0; | 85 | a_clc = 0; |
87 | c_time = ide_pio_timings[pio].cycle_time; | ||
88 | 86 | ||
89 | if (!(r_clc = (c_time * bus_speed + 999) / 1000 - a_clc - s_clc)) { | 87 | if (!(r_clc = (c_time * bus_speed + 999) / 1000 - a_clc - s_clc)) { |
90 | r_clc = 1; | 88 | r_clc = 1; |
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c index ad222206a429..0bfcdd0e77b3 100644 --- a/drivers/ide/pci/amd74xx.c +++ b/drivers/ide/pci/amd74xx.c | |||
@@ -21,8 +21,6 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/ide.h> | 22 | #include <linux/ide.h> |
23 | 23 | ||
24 | #include "ide-timing.h" | ||
25 | |||
26 | enum { | 24 | enum { |
27 | AMD_IDE_CONFIG = 0x41, | 25 | AMD_IDE_CONFIG = 0x41, |
28 | AMD_CABLE_DETECT = 0x42, | 26 | AMD_CABLE_DETECT = 0x42, |
diff --git a/drivers/ide/pci/cmd640.c b/drivers/ide/pci/cmd640.c index cd1ba14984ab..1ad1e23e3105 100644 --- a/drivers/ide/pci/cmd640.c +++ b/drivers/ide/pci/cmd640.c | |||
@@ -521,6 +521,7 @@ static void program_drive_counts(ide_drive_t *drive, unsigned int index) | |||
521 | static void cmd640_set_mode(ide_drive_t *drive, unsigned int index, | 521 | static void cmd640_set_mode(ide_drive_t *drive, unsigned int index, |
522 | u8 pio_mode, unsigned int cycle_time) | 522 | u8 pio_mode, unsigned int cycle_time) |
523 | { | 523 | { |
524 | struct ide_timing *t; | ||
524 | int setup_time, active_time, recovery_time, clock_time; | 525 | int setup_time, active_time, recovery_time, clock_time; |
525 | u8 setup_count, active_count, recovery_count, recovery_count2, cycle_count; | 526 | u8 setup_count, active_count, recovery_count, recovery_count2, cycle_count; |
526 | int bus_speed; | 527 | int bus_speed; |
@@ -532,8 +533,11 @@ static void cmd640_set_mode(ide_drive_t *drive, unsigned int index, | |||
532 | 533 | ||
533 | if (pio_mode > 5) | 534 | if (pio_mode > 5) |
534 | pio_mode = 5; | 535 | pio_mode = 5; |
535 | setup_time = ide_pio_timings[pio_mode].setup_time; | 536 | |
536 | active_time = ide_pio_timings[pio_mode].active_time; | 537 | t = ide_timing_find_mode(XFER_PIO_0 + pio_mode); |
538 | setup_time = t->setup; | ||
539 | active_time = t->active; | ||
540 | |||
537 | recovery_time = cycle_time - (setup_time + active_time); | 541 | recovery_time = cycle_time - (setup_time + active_time); |
538 | clock_time = 1000 / bus_speed; | 542 | clock_time = 1000 / bus_speed; |
539 | cycle_count = DIV_ROUND_UP(cycle_time, clock_time); | 543 | cycle_count = DIV_ROUND_UP(cycle_time, clock_time); |
@@ -607,11 +611,40 @@ static void cmd640_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
607 | 611 | ||
608 | display_clocks(index); | 612 | display_clocks(index); |
609 | } | 613 | } |
614 | #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ | ||
615 | |||
616 | static void cmd640_init_dev(ide_drive_t *drive) | ||
617 | { | ||
618 | unsigned int i = drive->hwif->channel * 2 + drive->select.b.unit; | ||
619 | |||
620 | #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED | ||
621 | /* | ||
622 | * Reset timing to the slowest speed and turn off prefetch. | ||
623 | * This way, the drive identify code has a better chance. | ||
624 | */ | ||
625 | setup_counts[i] = 4; /* max possible */ | ||
626 | active_counts[i] = 16; /* max possible */ | ||
627 | recovery_counts[i] = 16; /* max possible */ | ||
628 | program_drive_counts(drive, i); | ||
629 | set_prefetch_mode(drive, i, 0); | ||
630 | printk(KERN_INFO DRV_NAME ": drive%d timings/prefetch cleared\n", i); | ||
631 | #else | ||
632 | /* | ||
633 | * Set the drive unmask flags to match the prefetch setting. | ||
634 | */ | ||
635 | check_prefetch(drive, i); | ||
636 | printk(KERN_INFO DRV_NAME ": drive%d timings/prefetch(%s) preserved\n", | ||
637 | i, drive->no_io_32bit ? "off" : "on"); | ||
638 | #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ | ||
639 | } | ||
640 | |||
610 | 641 | ||
611 | static const struct ide_port_ops cmd640_port_ops = { | 642 | static const struct ide_port_ops cmd640_port_ops = { |
643 | .init_dev = cmd640_init_dev, | ||
644 | #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED | ||
612 | .set_pio_mode = cmd640_set_pio_mode, | 645 | .set_pio_mode = cmd640_set_pio_mode, |
646 | #endif | ||
613 | }; | 647 | }; |
614 | #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ | ||
615 | 648 | ||
616 | static int pci_conf1(void) | 649 | static int pci_conf1(void) |
617 | { | 650 | { |
@@ -654,10 +687,8 @@ static const struct ide_port_info cmd640_port_info __initdata = { | |||
654 | IDE_HFLAG_NO_DMA | | 687 | IDE_HFLAG_NO_DMA | |
655 | IDE_HFLAG_ABUSE_PREFETCH | | 688 | IDE_HFLAG_ABUSE_PREFETCH | |
656 | IDE_HFLAG_ABUSE_FAST_DEVSEL, | 689 | IDE_HFLAG_ABUSE_FAST_DEVSEL, |
657 | #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED | ||
658 | .port_ops = &cmd640_port_ops, | 690 | .port_ops = &cmd640_port_ops, |
659 | .pio_mask = ATA_PIO5, | 691 | .pio_mask = ATA_PIO5, |
660 | #endif | ||
661 | }; | 692 | }; |
662 | 693 | ||
663 | static int cmd640x_init_one(unsigned long base, unsigned long ctl) | 694 | static int cmd640x_init_one(unsigned long base, unsigned long ctl) |
@@ -683,12 +714,8 @@ static int cmd640x_init_one(unsigned long base, unsigned long ctl) | |||
683 | */ | 714 | */ |
684 | static int __init cmd640x_init(void) | 715 | static int __init cmd640x_init(void) |
685 | { | 716 | { |
686 | #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED | ||
687 | int second_port_toggled = 0; | ||
688 | #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ | ||
689 | int second_port_cmd640 = 0, rc; | 717 | int second_port_cmd640 = 0, rc; |
690 | const char *bus_type, *port2; | 718 | const char *bus_type, *port2; |
691 | unsigned int index; | ||
692 | u8 b, cfr; | 719 | u8 b, cfr; |
693 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 720 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
694 | hw_regs_t hw[2]; | 721 | hw_regs_t hw[2]; |
@@ -774,88 +801,44 @@ static int __init cmd640x_init(void) | |||
774 | put_cmd640_reg(CMDTIM, 0); | 801 | put_cmd640_reg(CMDTIM, 0); |
775 | put_cmd640_reg(BRST, 0x40); | 802 | put_cmd640_reg(BRST, 0x40); |
776 | 803 | ||
777 | cmd_hwif1 = ide_find_port(); | 804 | b = get_cmd640_reg(CNTRL); |
778 | 805 | ||
779 | /* | 806 | /* |
780 | * Try to enable the secondary interface, if not already enabled | 807 | * Try to enable the secondary interface, if not already enabled |
781 | */ | 808 | */ |
782 | if (cmd_hwif1 && | 809 | if (secondary_port_responding()) { |
783 | cmd_hwif1->drives[0].noprobe && cmd_hwif1->drives[1].noprobe) { | 810 | if ((b & CNTRL_ENA_2ND)) { |
784 | port2 = "not probed"; | 811 | second_port_cmd640 = 1; |
812 | port2 = "okay"; | ||
813 | } else if (cmd640_vlb) { | ||
814 | second_port_cmd640 = 1; | ||
815 | port2 = "alive"; | ||
816 | } else | ||
817 | port2 = "not cmd640"; | ||
785 | } else { | 818 | } else { |
786 | b = get_cmd640_reg(CNTRL); | 819 | put_cmd640_reg(CNTRL, b ^ CNTRL_ENA_2ND); /* toggle the bit */ |
787 | if (secondary_port_responding()) { | 820 | if (secondary_port_responding()) { |
788 | if ((b & CNTRL_ENA_2ND)) { | 821 | second_port_cmd640 = 1; |
789 | second_port_cmd640 = 1; | 822 | port2 = "enabled"; |
790 | port2 = "okay"; | ||
791 | } else if (cmd640_vlb) { | ||
792 | second_port_cmd640 = 1; | ||
793 | port2 = "alive"; | ||
794 | } else | ||
795 | port2 = "not cmd640"; | ||
796 | } else { | 823 | } else { |
797 | put_cmd640_reg(CNTRL, b ^ CNTRL_ENA_2ND); /* toggle the bit */ | 824 | put_cmd640_reg(CNTRL, b); /* restore original setting */ |
798 | if (secondary_port_responding()) { | 825 | port2 = "not responding"; |
799 | second_port_cmd640 = 1; | ||
800 | #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED | ||
801 | second_port_toggled = 1; | ||
802 | #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ | ||
803 | port2 = "enabled"; | ||
804 | } else { | ||
805 | put_cmd640_reg(CNTRL, b); /* restore original setting */ | ||
806 | port2 = "not responding"; | ||
807 | } | ||
808 | } | 826 | } |
809 | } | 827 | } |
810 | 828 | ||
811 | /* | 829 | /* |
812 | * Initialize data for secondary cmd640 port, if enabled | 830 | * Initialize data for secondary cmd640 port, if enabled |
813 | */ | 831 | */ |
814 | if (second_port_cmd640 && cmd_hwif1) { | 832 | if (second_port_cmd640) { |
815 | ide_init_port_hw(cmd_hwif1, &hw[1]); | 833 | cmd_hwif1 = ide_find_port(); |
816 | idx[1] = cmd_hwif1->index; | 834 | if (cmd_hwif1) { |
835 | ide_init_port_hw(cmd_hwif1, &hw[1]); | ||
836 | idx[1] = cmd_hwif1->index; | ||
837 | } | ||
817 | } | 838 | } |
818 | printk(KERN_INFO "cmd640: %sserialized, secondary interface %s\n", | 839 | printk(KERN_INFO "cmd640: %sserialized, secondary interface %s\n", |
819 | second_port_cmd640 ? "" : "not ", port2); | 840 | second_port_cmd640 ? "" : "not ", port2); |
820 | 841 | ||
821 | /* | ||
822 | * Establish initial timings/prefetch for all drives. | ||
823 | * Do not unnecessarily disturb any prior BIOS setup of these. | ||
824 | */ | ||
825 | for (index = 0; index < (2 + (second_port_cmd640 << 1)); index++) { | ||
826 | ide_drive_t *drive; | ||
827 | |||
828 | if (index > 1) { | ||
829 | if (cmd_hwif1 == NULL) | ||
830 | continue; | ||
831 | drive = &cmd_hwif1->drives[index & 1]; | ||
832 | } else { | ||
833 | if (cmd_hwif0 == NULL) | ||
834 | continue; | ||
835 | drive = &cmd_hwif0->drives[index & 1]; | ||
836 | } | ||
837 | |||
838 | #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED | ||
839 | /* | ||
840 | * Reset timing to the slowest speed and turn off prefetch. | ||
841 | * This way, the drive identify code has a better chance. | ||
842 | */ | ||
843 | setup_counts [index] = 4; /* max possible */ | ||
844 | active_counts [index] = 16; /* max possible */ | ||
845 | recovery_counts [index] = 16; /* max possible */ | ||
846 | program_drive_counts(drive, index); | ||
847 | set_prefetch_mode(drive, index, 0); | ||
848 | printk("cmd640: drive%d timings/prefetch cleared\n", index); | ||
849 | #else | ||
850 | /* | ||
851 | * Set the drive unmask flags to match the prefetch setting | ||
852 | */ | ||
853 | check_prefetch(drive, index); | ||
854 | printk("cmd640: drive%d timings/prefetch(%s) preserved\n", | ||
855 | index, drive->no_io_32bit ? "off" : "on"); | ||
856 | #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ | ||
857 | } | ||
858 | |||
859 | #ifdef CMD640_DUMP_REGS | 842 | #ifdef CMD640_DUMP_REGS |
860 | cmd640_dump_regs(); | 843 | cmd640_dump_regs(); |
861 | #endif | 844 | #endif |
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c index ca4774aa27ee..cfa784bacf48 100644 --- a/drivers/ide/pci/cmd64x.c +++ b/drivers/ide/pci/cmd64x.c | |||
@@ -116,6 +116,7 @@ static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio) | |||
116 | { | 116 | { |
117 | ide_hwif_t *hwif = HWIF(drive); | 117 | ide_hwif_t *hwif = HWIF(drive); |
118 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 118 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
119 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
119 | unsigned int cycle_time; | 120 | unsigned int cycle_time; |
120 | u8 setup_count, arttim = 0; | 121 | u8 setup_count, arttim = 0; |
121 | 122 | ||
@@ -124,10 +125,9 @@ static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio) | |||
124 | 125 | ||
125 | cycle_time = ide_pio_cycle_time(drive, pio); | 126 | cycle_time = ide_pio_cycle_time(drive, pio); |
126 | 127 | ||
127 | program_cycle_times(drive, cycle_time, | 128 | program_cycle_times(drive, cycle_time, t->active); |
128 | ide_pio_timings[pio].active_time); | ||
129 | 129 | ||
130 | setup_count = quantize_timing(ide_pio_timings[pio].setup_time, | 130 | setup_count = quantize_timing(t->setup, |
131 | 1000 / (ide_pci_clk ? ide_pci_clk : 33)); | 131 | 1000 / (ide_pci_clk ? ide_pci_clk : 33)); |
132 | 132 | ||
133 | /* | 133 | /* |
diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c index 99fe91a191b8..dc97c48623f3 100644 --- a/drivers/ide/pci/cs5535.c +++ b/drivers/ide/pci/cs5535.c | |||
@@ -26,8 +26,6 @@ | |||
26 | #include <linux/pci.h> | 26 | #include <linux/pci.h> |
27 | #include <linux/ide.h> | 27 | #include <linux/ide.h> |
28 | 28 | ||
29 | #include "ide-timing.h" | ||
30 | |||
31 | #define MSR_ATAC_BASE 0x51300000 | 29 | #define MSR_ATAC_BASE 0x51300000 |
32 | #define ATAC_GLD_MSR_CAP (MSR_ATAC_BASE+0) | 30 | #define ATAC_GLD_MSR_CAP (MSR_ATAC_BASE+0) |
33 | #define ATAC_GLD_MSR_CONFIG (MSR_ATAC_BASE+0x01) | 31 | #define ATAC_GLD_MSR_CONFIG (MSR_ATAC_BASE+0x01) |
@@ -75,13 +73,11 @@ static unsigned int cs5535_udma_timings[5] = | |||
75 | */ | 73 | */ |
76 | static void cs5535_set_speed(ide_drive_t *drive, const u8 speed) | 74 | static void cs5535_set_speed(ide_drive_t *drive, const u8 speed) |
77 | { | 75 | { |
78 | |||
79 | u32 reg = 0, dummy; | 76 | u32 reg = 0, dummy; |
80 | int unit = drive->select.b.unit; | 77 | int unit = drive->select.b.unit; |
81 | 78 | ||
82 | |||
83 | /* Set the PIO timings */ | 79 | /* Set the PIO timings */ |
84 | if ((speed & XFER_MODE) == XFER_PIO) { | 80 | if (speed < XFER_SW_DMA_0) { |
85 | ide_drive_t *pair = ide_get_paired_drive(drive); | 81 | ide_drive_t *pair = ide_get_paired_drive(drive); |
86 | u8 cmd, pioa; | 82 | u8 cmd, pioa; |
87 | 83 | ||
diff --git a/drivers/ide/pci/cy82c693.c b/drivers/ide/pci/cy82c693.c index 8c534afcb6c8..e14ad5530fa4 100644 --- a/drivers/ide/pci/cy82c693.c +++ b/drivers/ide/pci/cy82c693.c | |||
@@ -133,6 +133,7 @@ static int calc_clk(int time, int bus_speed) | |||
133 | */ | 133 | */ |
134 | static void compute_clocks(u8 pio, pio_clocks_t *p_pclk) | 134 | static void compute_clocks(u8 pio, pio_clocks_t *p_pclk) |
135 | { | 135 | { |
136 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
136 | int clk1, clk2; | 137 | int clk1, clk2; |
137 | int bus_speed = ide_pci_clk ? ide_pci_clk : 33; | 138 | int bus_speed = ide_pci_clk ? ide_pci_clk : 33; |
138 | 139 | ||
@@ -141,15 +142,13 @@ static void compute_clocks(u8 pio, pio_clocks_t *p_pclk) | |||
141 | */ | 142 | */ |
142 | 143 | ||
143 | /* let's calc the address setup time clocks */ | 144 | /* let's calc the address setup time clocks */ |
144 | p_pclk->address_time = (u8)calc_clk(ide_pio_timings[pio].setup_time, bus_speed); | 145 | p_pclk->address_time = (u8)calc_clk(t->setup, bus_speed); |
145 | 146 | ||
146 | /* let's calc the active and recovery time clocks */ | 147 | /* let's calc the active and recovery time clocks */ |
147 | clk1 = calc_clk(ide_pio_timings[pio].active_time, bus_speed); | 148 | clk1 = calc_clk(t->active, bus_speed); |
148 | 149 | ||
149 | /* calc recovery timing */ | 150 | /* calc recovery timing */ |
150 | clk2 = ide_pio_timings[pio].cycle_time - | 151 | clk2 = t->cycle - t->active - t->setup; |
151 | ide_pio_timings[pio].active_time - | ||
152 | ide_pio_timings[pio].setup_time; | ||
153 | 152 | ||
154 | clk2 = calc_clk(clk2, bus_speed); | 153 | clk2 = calc_clk(clk2, bus_speed); |
155 | 154 | ||
diff --git a/drivers/ide/pci/delkin_cb.c b/drivers/ide/pci/delkin_cb.c index af0f30051d5a..0106e2a2df77 100644 --- a/drivers/ide/pci/delkin_cb.c +++ b/drivers/ide/pci/delkin_cb.c | |||
@@ -93,7 +93,6 @@ delkin_cb_probe (struct pci_dev *dev, const struct pci_device_id *id) | |||
93 | 93 | ||
94 | i = hwif->index; | 94 | i = hwif->index; |
95 | 95 | ||
96 | ide_init_port_data(hwif, i); | ||
97 | ide_init_port_hw(hwif, &hw); | 96 | ide_init_port_hw(hwif, &hw); |
98 | 97 | ||
99 | idx[0] = i; | 98 | idx[0] = i; |
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c index 6ab04115286b..cbf647202994 100644 --- a/drivers/ide/pci/it821x.c +++ b/drivers/ide/pci/it821x.c | |||
@@ -512,8 +512,14 @@ static void __devinit it821x_quirkproc(ide_drive_t *drive) | |||
512 | } | 512 | } |
513 | 513 | ||
514 | static struct ide_dma_ops it821x_pass_through_dma_ops = { | 514 | static struct ide_dma_ops it821x_pass_through_dma_ops = { |
515 | .dma_host_set = ide_dma_host_set, | ||
516 | .dma_setup = ide_dma_setup, | ||
517 | .dma_exec_cmd = ide_dma_exec_cmd, | ||
515 | .dma_start = it821x_dma_start, | 518 | .dma_start = it821x_dma_start, |
516 | .dma_end = it821x_dma_end, | 519 | .dma_end = it821x_dma_end, |
520 | .dma_test_irq = ide_dma_test_irq, | ||
521 | .dma_timeout = ide_dma_timeout, | ||
522 | .dma_lost_irq = ide_dma_lost_irq, | ||
517 | }; | 523 | }; |
518 | 524 | ||
519 | /** | 525 | /** |
diff --git a/drivers/ide/pci/scc_pata.c b/drivers/ide/pci/scc_pata.c index 1584ebb6a185..789c66dfbde5 100644 --- a/drivers/ide/pci/scc_pata.c +++ b/drivers/ide/pci/scc_pata.c | |||
@@ -558,12 +558,9 @@ static int scc_ide_setup_pci_device(struct pci_dev *dev, | |||
558 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 558 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; |
559 | int i; | 559 | int i; |
560 | 560 | ||
561 | hwif = ide_find_port(); | 561 | hwif = ide_find_port_slot(d); |
562 | if (hwif == NULL) { | 562 | if (hwif == NULL) |
563 | printk(KERN_ERR "%s: too many IDE interfaces, " | ||
564 | "no room in table\n", SCC_PATA_NAME); | ||
565 | return -ENOMEM; | 563 | return -ENOMEM; |
566 | } | ||
567 | 564 | ||
568 | memset(&hw, 0, sizeof(hw)); | 565 | memset(&hw, 0, sizeof(hw)); |
569 | for (i = 0; i <= 8; i++) | 566 | for (i = 0; i <= 8; i++) |
@@ -572,7 +569,6 @@ static int scc_ide_setup_pci_device(struct pci_dev *dev, | |||
572 | hw.dev = &dev->dev; | 569 | hw.dev = &dev->dev; |
573 | hw.chipset = ide_pci; | 570 | hw.chipset = ide_pci; |
574 | ide_init_port_hw(hwif, &hw); | 571 | ide_init_port_hw(hwif, &hw); |
575 | hwif->dev = &dev->dev; | ||
576 | 572 | ||
577 | idx[0] = hwif->index; | 573 | idx[0] = hwif->index; |
578 | 574 | ||
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index 24513e3dcd6b..c79ff5b41088 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -568,6 +568,7 @@ static const struct ide_dma_ops sgiioc4_dma_ops = { | |||
568 | }; | 568 | }; |
569 | 569 | ||
570 | static const struct ide_port_info sgiioc4_port_info __devinitdata = { | 570 | static const struct ide_port_info sgiioc4_port_info __devinitdata = { |
571 | .name = DRV_NAME, | ||
571 | .chipset = ide_pci, | 572 | .chipset = ide_pci, |
572 | .init_dma = ide_dma_sgiioc4, | 573 | .init_dma = ide_dma_sgiioc4, |
573 | .port_ops = &sgiioc4_port_ops, | 574 | .port_ops = &sgiioc4_port_ops, |
@@ -587,13 +588,6 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
587 | hw_regs_t hw; | 588 | hw_regs_t hw; |
588 | struct ide_port_info d = sgiioc4_port_info; | 589 | struct ide_port_info d = sgiioc4_port_info; |
589 | 590 | ||
590 | hwif = ide_find_port(); | ||
591 | if (hwif == NULL) { | ||
592 | printk(KERN_ERR "%s: too many IDE interfaces, no room in table\n", | ||
593 | DRV_NAME); | ||
594 | return -ENOMEM; | ||
595 | } | ||
596 | |||
597 | /* Get the CmdBlk and CtrlBlk Base Registers */ | 591 | /* Get the CmdBlk and CtrlBlk Base Registers */ |
598 | bar0 = pci_resource_start(dev, 0); | 592 | bar0 = pci_resource_start(dev, 0); |
599 | virt_base = ioremap(bar0, pci_resource_len(dev, 0)); | 593 | virt_base = ioremap(bar0, pci_resource_len(dev, 0)); |
@@ -608,11 +602,11 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
608 | 602 | ||
609 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; | 603 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; |
610 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, | 604 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, |
611 | hwif->name)) { | 605 | DRV_NAME)) { |
612 | printk(KERN_ERR | 606 | printk(KERN_ERR |
613 | "%s : %s -- ERROR, Addresses " | 607 | "%s : %s -- ERROR, Addresses " |
614 | "0x%p to 0x%p ALREADY in use\n", | 608 | "0x%p to 0x%p ALREADY in use\n", |
615 | __func__, hwif->name, (void *) cmd_phys_base, | 609 | __func__, DRV_NAME, (void *) cmd_phys_base, |
616 | (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE); | 610 | (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE); |
617 | return -ENOMEM; | 611 | return -ENOMEM; |
618 | } | 612 | } |
@@ -623,9 +617,12 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
623 | hw.irq = dev->irq; | 617 | hw.irq = dev->irq; |
624 | hw.chipset = ide_pci; | 618 | hw.chipset = ide_pci; |
625 | hw.dev = &dev->dev; | 619 | hw.dev = &dev->dev; |
626 | ide_init_port_hw(hwif, &hw); | ||
627 | 620 | ||
628 | hwif->dev = &dev->dev; | 621 | hwif = ide_find_port_slot(&d); |
622 | if (hwif == NULL) | ||
623 | goto err; | ||
624 | |||
625 | ide_init_port_hw(hwif, &hw); | ||
629 | 626 | ||
630 | /* The IOC4 uses MMIO rather than Port IO. */ | 627 | /* The IOC4 uses MMIO rather than Port IO. */ |
631 | default_hwif_mmiops(hwif); | 628 | default_hwif_mmiops(hwif); |
@@ -641,6 +638,10 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
641 | return -EIO; | 638 | return -EIO; |
642 | 639 | ||
643 | return 0; | 640 | return 0; |
641 | err: | ||
642 | release_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE); | ||
643 | iounmap(virt_base); | ||
644 | return -ENOMEM; | ||
644 | } | 645 | } |
645 | 646 | ||
646 | static unsigned int __devinit | 647 | static unsigned int __devinit |
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index b75e9bb390a7..6e9d7655d89c 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
@@ -421,8 +421,7 @@ static int sil_sata_reset_poll(ide_drive_t *drive) | |||
421 | if ((sata_stat & 0x03) != 0x03) { | 421 | if ((sata_stat & 0x03) != 0x03) { |
422 | printk(KERN_WARNING "%s: reset phy dead, status=0x%08x\n", | 422 | printk(KERN_WARNING "%s: reset phy dead, status=0x%08x\n", |
423 | hwif->name, sata_stat); | 423 | hwif->name, sata_stat); |
424 | HWGROUP(drive)->polling = 0; | 424 | return -ENXIO; |
425 | return ide_started; | ||
426 | } | 425 | } |
427 | } | 426 | } |
428 | 427 | ||
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index e127eb25ab63..2389945ca95d 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c | |||
@@ -52,8 +52,6 @@ | |||
52 | #include <linux/init.h> | 52 | #include <linux/init.h> |
53 | #include <linux/ide.h> | 53 | #include <linux/ide.h> |
54 | 54 | ||
55 | #include "ide-timing.h" | ||
56 | |||
57 | /* registers layout and init values are chipset family dependant */ | 55 | /* registers layout and init values are chipset family dependant */ |
58 | 56 | ||
59 | #define ATA_16 0x01 | 57 | #define ATA_16 0x01 |
@@ -616,7 +614,6 @@ MODULE_LICENSE("GPL"); | |||
616 | /* | 614 | /* |
617 | * TODO: | 615 | * TODO: |
618 | * - CLEANUP | 616 | * - CLEANUP |
619 | * - Use drivers/ide/ide-timing.h ! | ||
620 | * - More checks in the config registers (force values instead of | 617 | * - More checks in the config registers (force values instead of |
621 | * relying on the BIOS setting them correctly). | 618 | * relying on the BIOS setting them correctly). |
622 | * - Further optimisations ? | 619 | * - Further optimisations ? |
diff --git a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c index ce84fa045d39..6efbde297174 100644 --- a/drivers/ide/pci/sl82c105.c +++ b/drivers/ide/pci/sl82c105.c | |||
@@ -47,10 +47,11 @@ | |||
47 | */ | 47 | */ |
48 | static unsigned int get_pio_timings(ide_drive_t *drive, u8 pio) | 48 | static unsigned int get_pio_timings(ide_drive_t *drive, u8 pio) |
49 | { | 49 | { |
50 | struct ide_timing *t = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
50 | unsigned int cmd_on, cmd_off; | 51 | unsigned int cmd_on, cmd_off; |
51 | u8 iordy = 0; | 52 | u8 iordy = 0; |
52 | 53 | ||
53 | cmd_on = (ide_pio_timings[pio].active_time + 29) / 30; | 54 | cmd_on = (t->active + 29) / 30; |
54 | cmd_off = (ide_pio_cycle_time(drive, pio) - 30 * cmd_on + 29) / 30; | 55 | cmd_off = (ide_pio_cycle_time(drive, pio) - 30 * cmd_on + 29) / 30; |
55 | 56 | ||
56 | if (cmd_on == 0) | 57 | if (cmd_on == 0) |
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c index 3ed9728abd24..e47384c70c40 100644 --- a/drivers/ide/pci/via82cxxx.c +++ b/drivers/ide/pci/via82cxxx.c | |||
@@ -35,8 +35,6 @@ | |||
35 | #include <asm/processor.h> | 35 | #include <asm/processor.h> |
36 | #endif | 36 | #endif |
37 | 37 | ||
38 | #include "ide-timing.h" | ||
39 | |||
40 | #define VIA_IDE_ENABLE 0x40 | 38 | #define VIA_IDE_ENABLE 0x40 |
41 | #define VIA_IDE_CONFIG 0x41 | 39 | #define VIA_IDE_CONFIG 0x41 |
42 | #define VIA_FIFO_CONFIG 0x43 | 40 | #define VIA_FIFO_CONFIG 0x43 |
diff --git a/drivers/ide/ppc/Makefile b/drivers/ide/ppc/Makefile index 65af5848b28c..74e52adcdf4b 100644 --- a/drivers/ide/ppc/Makefile +++ b/drivers/ide/ppc/Makefile | |||
@@ -1,3 +1,2 @@ | |||
1 | 1 | ||
2 | obj-$(CONFIG_BLK_DEV_IDE_PMAC) += pmac.o | 2 | obj-$(CONFIG_BLK_DEV_IDE_PMAC) += pmac.o |
3 | obj-$(CONFIG_BLK_DEV_MPC8xx_IDE) += mpc8xx.o | ||
diff --git a/drivers/ide/ppc/mpc8xx.c b/drivers/ide/ppc/mpc8xx.c deleted file mode 100644 index 236f9c38e519..000000000000 --- a/drivers/ide/ppc/mpc8xx.c +++ /dev/null | |||
@@ -1,851 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000, 2001 Wolfgang Denk, wd@denx.de | ||
3 | * Modified for direct IDE interface | ||
4 | * by Thomas Lange, thomas@corelatus.com | ||
5 | * Modified for direct IDE interface on 8xx without using the PCMCIA | ||
6 | * controller | ||
7 | * by Steven.Scholz@imc-berlin.de | ||
8 | * Moved out of arch/ppc/kernel/m8xx_setup.c, other minor cleanups | ||
9 | * by Mathew Locke <mattl@mvista.com> | ||
10 | */ | ||
11 | |||
12 | #include <linux/errno.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/mm.h> | ||
15 | #include <linux/stddef.h> | ||
16 | #include <linux/unistd.h> | ||
17 | #include <linux/ptrace.h> | ||
18 | #include <linux/slab.h> | ||
19 | #include <linux/user.h> | ||
20 | #include <linux/tty.h> | ||
21 | #include <linux/major.h> | ||
22 | #include <linux/interrupt.h> | ||
23 | #include <linux/reboot.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <linux/ioport.h> | ||
26 | #include <linux/ide.h> | ||
27 | #include <linux/bootmem.h> | ||
28 | |||
29 | #include <asm/mpc8xx.h> | ||
30 | #include <asm/mmu.h> | ||
31 | #include <asm/processor.h> | ||
32 | #include <asm/io.h> | ||
33 | #include <asm/pgtable.h> | ||
34 | #include <asm/ide.h> | ||
35 | #include <asm/8xx_immap.h> | ||
36 | #include <asm/machdep.h> | ||
37 | #include <asm/irq.h> | ||
38 | |||
39 | #define DRV_NAME "ide-mpc8xx" | ||
40 | |||
41 | static int identify (volatile u8 *p); | ||
42 | static void print_fixed (volatile u8 *p); | ||
43 | static void print_funcid (int func); | ||
44 | static int check_ide_device (unsigned long base); | ||
45 | |||
46 | static void ide_interrupt_ack (void *dev); | ||
47 | static void m8xx_ide_set_pio_mode(ide_drive_t *drive, const u8 pio); | ||
48 | |||
49 | typedef struct ide_ioport_desc { | ||
50 | unsigned long base_off; /* Offset to PCMCIA memory */ | ||
51 | unsigned long reg_off[IDE_NR_PORTS]; /* controller register offsets */ | ||
52 | int irq; /* IRQ */ | ||
53 | } ide_ioport_desc_t; | ||
54 | |||
55 | ide_ioport_desc_t ioport_dsc[MAX_HWIFS] = { | ||
56 | #ifdef IDE0_BASE_OFFSET | ||
57 | { IDE0_BASE_OFFSET, | ||
58 | { | ||
59 | IDE0_DATA_REG_OFFSET, | ||
60 | IDE0_ERROR_REG_OFFSET, | ||
61 | IDE0_NSECTOR_REG_OFFSET, | ||
62 | IDE0_SECTOR_REG_OFFSET, | ||
63 | IDE0_LCYL_REG_OFFSET, | ||
64 | IDE0_HCYL_REG_OFFSET, | ||
65 | IDE0_SELECT_REG_OFFSET, | ||
66 | IDE0_STATUS_REG_OFFSET, | ||
67 | IDE0_CONTROL_REG_OFFSET, | ||
68 | IDE0_IRQ_REG_OFFSET, | ||
69 | }, | ||
70 | IDE0_INTERRUPT, | ||
71 | }, | ||
72 | #ifdef IDE1_BASE_OFFSET | ||
73 | { IDE1_BASE_OFFSET, | ||
74 | { | ||
75 | IDE1_DATA_REG_OFFSET, | ||
76 | IDE1_ERROR_REG_OFFSET, | ||
77 | IDE1_NSECTOR_REG_OFFSET, | ||
78 | IDE1_SECTOR_REG_OFFSET, | ||
79 | IDE1_LCYL_REG_OFFSET, | ||
80 | IDE1_HCYL_REG_OFFSET, | ||
81 | IDE1_SELECT_REG_OFFSET, | ||
82 | IDE1_STATUS_REG_OFFSET, | ||
83 | IDE1_CONTROL_REG_OFFSET, | ||
84 | IDE1_IRQ_REG_OFFSET, | ||
85 | }, | ||
86 | IDE1_INTERRUPT, | ||
87 | }, | ||
88 | #endif /* IDE1_BASE_OFFSET */ | ||
89 | #endif /* IDE0_BASE_OFFSET */ | ||
90 | }; | ||
91 | |||
92 | ide_pio_timings_t ide_pio_clocks[6]; | ||
93 | int hold_time[6] = {30, 20, 15, 10, 10, 10 }; /* PIO Mode 5 with IORDY (nonstandard) */ | ||
94 | |||
95 | /* | ||
96 | * Warning: only 1 (ONE) PCMCIA slot supported here, | ||
97 | * which must be correctly initialized by the firmware (PPCBoot). | ||
98 | */ | ||
99 | static int _slot_ = -1; /* will be read from PCMCIA registers */ | ||
100 | |||
101 | /* Make clock cycles and always round up */ | ||
102 | #define PCMCIA_MK_CLKS( t, T ) (( (t) * ((T)/1000000) + 999U ) / 1000U ) | ||
103 | |||
104 | #define M8XX_PCMCIA_CD2(slot) (0x10000000 >> (slot << 4)) | ||
105 | #define M8XX_PCMCIA_CD1(slot) (0x08000000 >> (slot << 4)) | ||
106 | |||
107 | /* | ||
108 | * The TQM850L hardware has two pins swapped! Grrrrgh! | ||
109 | */ | ||
110 | #ifdef CONFIG_TQM850L | ||
111 | #define __MY_PCMCIA_GCRX_CXRESET PCMCIA_GCRX_CXOE | ||
112 | #define __MY_PCMCIA_GCRX_CXOE PCMCIA_GCRX_CXRESET | ||
113 | #else | ||
114 | #define __MY_PCMCIA_GCRX_CXRESET PCMCIA_GCRX_CXRESET | ||
115 | #define __MY_PCMCIA_GCRX_CXOE PCMCIA_GCRX_CXOE | ||
116 | #endif | ||
117 | |||
118 | #if defined(CONFIG_BLK_DEV_MPC8xx_IDE) && defined(CONFIG_IDE_8xx_PCCARD) | ||
119 | #define PCMCIA_SCHLVL IDE0_INTERRUPT /* Status Change Interrupt Level */ | ||
120 | static int pcmcia_schlvl = PCMCIA_SCHLVL; | ||
121 | #endif | ||
122 | |||
123 | /* | ||
124 | * See include/linux/ide.h for definition of hw_regs_t (p, base) | ||
125 | */ | ||
126 | |||
127 | /* | ||
128 | * m8xx_ide_init_ports() for a direct IDE interface _using_ | ||
129 | * MPC8xx's internal PCMCIA interface | ||
130 | */ | ||
131 | #if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT) | ||
132 | static int __init m8xx_ide_init_ports(hw_regs_t *hw, unsigned long data_port) | ||
133 | { | ||
134 | unsigned long *p = hw->io_ports_array; | ||
135 | int i; | ||
136 | |||
137 | typedef struct { | ||
138 | ulong br; | ||
139 | ulong or; | ||
140 | } pcmcia_win_t; | ||
141 | volatile pcmcia_win_t *win; | ||
142 | volatile pcmconf8xx_t *pcmp; | ||
143 | |||
144 | uint *pgcrx; | ||
145 | u32 pcmcia_phy_base; | ||
146 | u32 pcmcia_phy_end; | ||
147 | static unsigned long pcmcia_base = 0; | ||
148 | unsigned long base; | ||
149 | |||
150 | *p = 0; | ||
151 | |||
152 | pcmp = (pcmconf8xx_t *)(&(((immap_t *)IMAP_ADDR)->im_pcmcia)); | ||
153 | |||
154 | if (!pcmcia_base) { | ||
155 | /* | ||
156 | * Read out PCMCIA registers. Since the reset values | ||
157 | * are undefined, we sure hope that they have been | ||
158 | * set up by firmware | ||
159 | */ | ||
160 | |||
161 | /* Scan all registers for valid settings */ | ||
162 | pcmcia_phy_base = 0xFFFFFFFF; | ||
163 | pcmcia_phy_end = 0; | ||
164 | /* br0 is start of brX and orX regs */ | ||
165 | win = (pcmcia_win_t *) \ | ||
166 | (&(((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pbr0)); | ||
167 | for (i = 0; i < 8; i++) { | ||
168 | if (win->or & 1) { /* This bank is marked as valid */ | ||
169 | if (win->br < pcmcia_phy_base) { | ||
170 | pcmcia_phy_base = win->br; | ||
171 | } | ||
172 | if ((win->br + PCMCIA_MEM_SIZE) > pcmcia_phy_end) { | ||
173 | pcmcia_phy_end = win->br + PCMCIA_MEM_SIZE; | ||
174 | } | ||
175 | /* Check which slot that has been defined */ | ||
176 | _slot_ = (win->or >> 2) & 1; | ||
177 | |||
178 | } /* Valid bank */ | ||
179 | win++; | ||
180 | } /* for */ | ||
181 | |||
182 | printk ("PCMCIA slot %c: phys mem %08x...%08x (size %08x)\n", | ||
183 | 'A' + _slot_, | ||
184 | pcmcia_phy_base, pcmcia_phy_end, | ||
185 | pcmcia_phy_end - pcmcia_phy_base); | ||
186 | |||
187 | if (!request_mem_region(pcmcia_phy_base, | ||
188 | pcmcia_phy_end - pcmcia_phy_base, | ||
189 | DRV_NAME)) { | ||
190 | printk(KERN_ERR "%s: resources busy\n", DRV_NAME); | ||
191 | return -EBUSY; | ||
192 | } | ||
193 | |||
194 | pcmcia_base=(unsigned long)ioremap(pcmcia_phy_base, | ||
195 | pcmcia_phy_end-pcmcia_phy_base); | ||
196 | |||
197 | #ifdef DEBUG | ||
198 | printk ("PCMCIA virt base: %08lx\n", pcmcia_base); | ||
199 | #endif | ||
200 | /* Compute clock cycles for PIO timings */ | ||
201 | for (i=0; i<6; ++i) { | ||
202 | bd_t *binfo = (bd_t *)__res; | ||
203 | |||
204 | hold_time[i] = | ||
205 | PCMCIA_MK_CLKS (hold_time[i], | ||
206 | binfo->bi_busfreq); | ||
207 | ide_pio_clocks[i].setup_time = | ||
208 | PCMCIA_MK_CLKS (ide_pio_timings[i].setup_time, | ||
209 | binfo->bi_busfreq); | ||
210 | ide_pio_clocks[i].active_time = | ||
211 | PCMCIA_MK_CLKS (ide_pio_timings[i].active_time, | ||
212 | binfo->bi_busfreq); | ||
213 | ide_pio_clocks[i].cycle_time = | ||
214 | PCMCIA_MK_CLKS (ide_pio_timings[i].cycle_time, | ||
215 | binfo->bi_busfreq); | ||
216 | #if 0 | ||
217 | printk ("PIO mode %d timings: %d/%d/%d => %d/%d/%d\n", | ||
218 | i, | ||
219 | ide_pio_clocks[i].setup_time, | ||
220 | ide_pio_clocks[i].active_time, | ||
221 | ide_pio_clocks[i].hold_time, | ||
222 | ide_pio_clocks[i].cycle_time, | ||
223 | ide_pio_timings[i].setup_time, | ||
224 | ide_pio_timings[i].active_time, | ||
225 | ide_pio_timings[i].hold_time, | ||
226 | ide_pio_timings[i].cycle_time); | ||
227 | #endif | ||
228 | } | ||
229 | } | ||
230 | |||
231 | if (_slot_ == -1) { | ||
232 | printk ("PCMCIA slot has not been defined! Using A as default\n"); | ||
233 | _slot_ = 0; | ||
234 | } | ||
235 | |||
236 | #ifdef CONFIG_IDE_8xx_PCCARD | ||
237 | |||
238 | #ifdef DEBUG | ||
239 | printk ("PIPR = 0x%08X slot %c ==> mask = 0x%X\n", | ||
240 | pcmp->pcmc_pipr, | ||
241 | 'A' + _slot_, | ||
242 | M8XX_PCMCIA_CD1(_slot_) | M8XX_PCMCIA_CD2(_slot_) ); | ||
243 | #endif /* DEBUG */ | ||
244 | |||
245 | if (pcmp->pcmc_pipr & (M8XX_PCMCIA_CD1(_slot_)|M8XX_PCMCIA_CD2(_slot_))) { | ||
246 | printk ("No card in slot %c: PIPR=%08x\n", | ||
247 | 'A' + _slot_, (u32) pcmp->pcmc_pipr); | ||
248 | return -ENODEV; /* No card in slot */ | ||
249 | } | ||
250 | |||
251 | check_ide_device (pcmcia_base); | ||
252 | |||
253 | #endif /* CONFIG_IDE_8xx_PCCARD */ | ||
254 | |||
255 | base = pcmcia_base + ioport_dsc[data_port].base_off; | ||
256 | #ifdef DEBUG | ||
257 | printk ("base: %08x + %08x = %08x\n", | ||
258 | pcmcia_base, ioport_dsc[data_port].base_off, base); | ||
259 | #endif | ||
260 | |||
261 | for (i = 0; i < IDE_NR_PORTS; ++i) { | ||
262 | #ifdef DEBUG | ||
263 | printk ("port[%d]: %08x + %08x = %08x\n", | ||
264 | i, | ||
265 | base, | ||
266 | ioport_dsc[data_port].reg_off[i], | ||
267 | i, base + ioport_dsc[data_port].reg_off[i]); | ||
268 | #endif | ||
269 | *p++ = base + ioport_dsc[data_port].reg_off[i]; | ||
270 | } | ||
271 | |||
272 | hw->irq = ioport_dsc[data_port].irq; | ||
273 | hw->ack_intr = (ide_ack_intr_t *)ide_interrupt_ack; | ||
274 | |||
275 | #ifdef CONFIG_IDE_8xx_PCCARD | ||
276 | { | ||
277 | unsigned int reg; | ||
278 | |||
279 | if (_slot_) | ||
280 | pgcrx = &((immap_t *) IMAP_ADDR)->im_pcmcia.pcmc_pgcrb; | ||
281 | else | ||
282 | pgcrx = &((immap_t *) IMAP_ADDR)->im_pcmcia.pcmc_pgcra; | ||
283 | |||
284 | reg = *pgcrx; | ||
285 | reg |= mk_int_int_mask (pcmcia_schlvl) << 24; | ||
286 | reg |= mk_int_int_mask (pcmcia_schlvl) << 16; | ||
287 | *pgcrx = reg; | ||
288 | } | ||
289 | #endif /* CONFIG_IDE_8xx_PCCARD */ | ||
290 | |||
291 | /* Enable Harddisk Interrupt, | ||
292 | * and make it edge sensitive | ||
293 | */ | ||
294 | /* (11-18) Set edge detect for irq, no wakeup from low power mode */ | ||
295 | ((immap_t *)IMAP_ADDR)->im_siu_conf.sc_siel |= | ||
296 | (0x80000000 >> ioport_dsc[data_port].irq); | ||
297 | |||
298 | #ifdef CONFIG_IDE_8xx_PCCARD | ||
299 | /* Make sure we don't get garbage irq */ | ||
300 | ((immap_t *) IMAP_ADDR)->im_pcmcia.pcmc_pscr = 0xFFFF; | ||
301 | |||
302 | /* Enable falling edge irq */ | ||
303 | pcmp->pcmc_per = 0x100000 >> (16 * _slot_); | ||
304 | #endif /* CONFIG_IDE_8xx_PCCARD */ | ||
305 | |||
306 | hw->chipset = ide_generic; | ||
307 | |||
308 | return 0; | ||
309 | } | ||
310 | #endif /* CONFIG_IDE_8xx_PCCARD || CONFIG_IDE_8xx_DIRECT */ | ||
311 | |||
312 | /* | ||
313 | * m8xx_ide_init_ports() for a direct IDE interface _not_ using | ||
314 | * MPC8xx's internal PCMCIA interface | ||
315 | */ | ||
316 | #if defined(CONFIG_IDE_EXT_DIRECT) | ||
317 | static int __init m8xx_ide_init_ports(hw_regs_t *hw, unsigned long data_port) | ||
318 | { | ||
319 | unsigned long *p = hw->io_ports_array; | ||
320 | int i; | ||
321 | |||
322 | u32 ide_phy_base; | ||
323 | u32 ide_phy_end; | ||
324 | static unsigned long ide_base = 0; | ||
325 | unsigned long base; | ||
326 | |||
327 | *p = 0; | ||
328 | |||
329 | if (!ide_base) { | ||
330 | |||
331 | /* TODO: | ||
332 | * - add code to read ORx, BRx | ||
333 | */ | ||
334 | ide_phy_base = CFG_ATA_BASE_ADDR; | ||
335 | ide_phy_end = CFG_ATA_BASE_ADDR + 0x200; | ||
336 | |||
337 | printk ("IDE phys mem : %08x...%08x (size %08x)\n", | ||
338 | ide_phy_base, ide_phy_end, | ||
339 | ide_phy_end - ide_phy_base); | ||
340 | |||
341 | if (!request_mem_region(ide_phy_base, 0x200, DRV_NAME)) { | ||
342 | printk(KERN_ERR "%s: resources busy\n", DRV_NAME); | ||
343 | return -EBUSY; | ||
344 | } | ||
345 | |||
346 | ide_base=(unsigned long)ioremap(ide_phy_base, | ||
347 | ide_phy_end-ide_phy_base); | ||
348 | |||
349 | #ifdef DEBUG | ||
350 | printk ("IDE virt base: %08lx\n", ide_base); | ||
351 | #endif | ||
352 | } | ||
353 | |||
354 | base = ide_base + ioport_dsc[data_port].base_off; | ||
355 | #ifdef DEBUG | ||
356 | printk ("base: %08x + %08x = %08x\n", | ||
357 | ide_base, ioport_dsc[data_port].base_off, base); | ||
358 | #endif | ||
359 | |||
360 | for (i = 0; i < IDE_NR_PORTS; ++i) { | ||
361 | #ifdef DEBUG | ||
362 | printk ("port[%d]: %08x + %08x = %08x\n", | ||
363 | i, | ||
364 | base, | ||
365 | ioport_dsc[data_port].reg_off[i], | ||
366 | i, base + ioport_dsc[data_port].reg_off[i]); | ||
367 | #endif | ||
368 | *p++ = base + ioport_dsc[data_port].reg_off[i]; | ||
369 | } | ||
370 | |||
371 | /* direct connected IDE drive, i.e. external IRQ */ | ||
372 | hw->irq = ioport_dsc[data_port].irq; | ||
373 | hw->ack_intr = (ide_ack_intr_t *)ide_interrupt_ack; | ||
374 | |||
375 | /* Enable Harddisk Interrupt, | ||
376 | * and make it edge sensitive | ||
377 | */ | ||
378 | /* (11-18) Set edge detect for irq, no wakeup from low power mode */ | ||
379 | ((immap_t *) IMAP_ADDR)->im_siu_conf.sc_siel |= | ||
380 | (0x80000000 >> ioport_dsc[data_port].irq); | ||
381 | |||
382 | hw->chipset = ide_generic; | ||
383 | |||
384 | return 0; | ||
385 | } | ||
386 | #endif /* CONFIG_IDE_8xx_DIRECT */ | ||
387 | |||
388 | |||
389 | /* -------------------------------------------------------------------- */ | ||
390 | |||
391 | |||
392 | /* PCMCIA Timing */ | ||
393 | #ifndef PCMCIA_SHT | ||
394 | #define PCMCIA_SHT(t) ((t & 0x0F)<<16) /* Strobe Hold Time */ | ||
395 | #define PCMCIA_SST(t) ((t & 0x0F)<<12) /* Strobe Setup Time */ | ||
396 | #define PCMCIA_SL(t) ((t==32) ? 0 : ((t & 0x1F)<<7)) /* Strobe Length */ | ||
397 | #endif | ||
398 | |||
399 | /* Calculate PIO timings */ | ||
400 | static void m8xx_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) | ||
401 | { | ||
402 | #if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT) | ||
403 | volatile pcmconf8xx_t *pcmp; | ||
404 | ulong timing, mask, reg; | ||
405 | |||
406 | pcmp = (pcmconf8xx_t *)(&(((immap_t *)IMAP_ADDR)->im_pcmcia)); | ||
407 | |||
408 | mask = ~(PCMCIA_SHT(0xFF) | PCMCIA_SST(0xFF) | PCMCIA_SL(0xFF)); | ||
409 | |||
410 | timing = PCMCIA_SHT(hold_time[pio] ) | ||
411 | | PCMCIA_SST(ide_pio_clocks[pio].setup_time ) | ||
412 | | PCMCIA_SL (ide_pio_clocks[pio].active_time) | ||
413 | ; | ||
414 | |||
415 | #if 1 | ||
416 | printk ("Setting timing bits 0x%08lx in PCMCIA controller\n", timing); | ||
417 | #endif | ||
418 | if ((reg = pcmp->pcmc_por0 & mask) != 0) | ||
419 | pcmp->pcmc_por0 = reg | timing; | ||
420 | |||
421 | if ((reg = pcmp->pcmc_por1 & mask) != 0) | ||
422 | pcmp->pcmc_por1 = reg | timing; | ||
423 | |||
424 | if ((reg = pcmp->pcmc_por2 & mask) != 0) | ||
425 | pcmp->pcmc_por2 = reg | timing; | ||
426 | |||
427 | if ((reg = pcmp->pcmc_por3 & mask) != 0) | ||
428 | pcmp->pcmc_por3 = reg | timing; | ||
429 | |||
430 | if ((reg = pcmp->pcmc_por4 & mask) != 0) | ||
431 | pcmp->pcmc_por4 = reg | timing; | ||
432 | |||
433 | if ((reg = pcmp->pcmc_por5 & mask) != 0) | ||
434 | pcmp->pcmc_por5 = reg | timing; | ||
435 | |||
436 | if ((reg = pcmp->pcmc_por6 & mask) != 0) | ||
437 | pcmp->pcmc_por6 = reg | timing; | ||
438 | |||
439 | if ((reg = pcmp->pcmc_por7 & mask) != 0) | ||
440 | pcmp->pcmc_por7 = reg | timing; | ||
441 | |||
442 | #elif defined(CONFIG_IDE_EXT_DIRECT) | ||
443 | |||
444 | printk("%s[%d] %s: not implemented yet!\n", | ||
445 | __FILE__, __LINE__, __func__); | ||
446 | #endif /* defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_PCMCIA */ | ||
447 | } | ||
448 | |||
449 | static const struct ide_port_ops m8xx_port_ops = { | ||
450 | .set_pio_mode = m8xx_ide_set_pio_mode, | ||
451 | }; | ||
452 | |||
453 | static void | ||
454 | ide_interrupt_ack (void *dev) | ||
455 | { | ||
456 | #ifdef CONFIG_IDE_8xx_PCCARD | ||
457 | u_int pscr, pipr; | ||
458 | |||
459 | #if (PCMCIA_SOCKETS_NO == 2) | ||
460 | u_int _slot_; | ||
461 | #endif | ||
462 | |||
463 | /* get interrupt sources */ | ||
464 | |||
465 | pscr = ((volatile immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr; | ||
466 | pipr = ((volatile immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pipr; | ||
467 | |||
468 | /* | ||
469 | * report only if both card detect signals are the same | ||
470 | * not too nice done, | ||
471 | * we depend on that CD2 is the bit to the left of CD1... | ||
472 | */ | ||
473 | |||
474 | if(_slot_==-1){ | ||
475 | printk("PCMCIA slot has not been defined! Using A as default\n"); | ||
476 | _slot_=0; | ||
477 | } | ||
478 | |||
479 | if(((pipr & M8XX_PCMCIA_CD2(_slot_)) >> 1) ^ | ||
480 | (pipr & M8XX_PCMCIA_CD1(_slot_)) ) { | ||
481 | printk ("card detect interrupt\n"); | ||
482 | } | ||
483 | /* clear the interrupt sources */ | ||
484 | ((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr = pscr; | ||
485 | |||
486 | #else /* ! CONFIG_IDE_8xx_PCCARD */ | ||
487 | /* | ||
488 | * Only CONFIG_IDE_8xx_PCCARD is using the interrupt of the | ||
489 | * MPC8xx's PCMCIA controller, so there is nothing to be done here | ||
490 | * for CONFIG_IDE_8xx_DIRECT and CONFIG_IDE_EXT_DIRECT. | ||
491 | * The interrupt is handled somewhere else. -- Steven | ||
492 | */ | ||
493 | #endif /* CONFIG_IDE_8xx_PCCARD */ | ||
494 | } | ||
495 | |||
496 | |||
497 | |||
498 | /* | ||
499 | * CIS Tupel codes | ||
500 | */ | ||
501 | #define CISTPL_NULL 0x00 | ||
502 | #define CISTPL_DEVICE 0x01 | ||
503 | #define CISTPL_LONGLINK_CB 0x02 | ||
504 | #define CISTPL_INDIRECT 0x03 | ||
505 | #define CISTPL_CONFIG_CB 0x04 | ||
506 | #define CISTPL_CFTABLE_ENTRY_CB 0x05 | ||
507 | #define CISTPL_LONGLINK_MFC 0x06 | ||
508 | #define CISTPL_BAR 0x07 | ||
509 | #define CISTPL_PWR_MGMNT 0x08 | ||
510 | #define CISTPL_EXTDEVICE 0x09 | ||
511 | #define CISTPL_CHECKSUM 0x10 | ||
512 | #define CISTPL_LONGLINK_A 0x11 | ||
513 | #define CISTPL_LONGLINK_C 0x12 | ||
514 | #define CISTPL_LINKTARGET 0x13 | ||
515 | #define CISTPL_NO_LINK 0x14 | ||
516 | #define CISTPL_VERS_1 0x15 | ||
517 | #define CISTPL_ALTSTR 0x16 | ||
518 | #define CISTPL_DEVICE_A 0x17 | ||
519 | #define CISTPL_JEDEC_C 0x18 | ||
520 | #define CISTPL_JEDEC_A 0x19 | ||
521 | #define CISTPL_CONFIG 0x1a | ||
522 | #define CISTPL_CFTABLE_ENTRY 0x1b | ||
523 | #define CISTPL_DEVICE_OC 0x1c | ||
524 | #define CISTPL_DEVICE_OA 0x1d | ||
525 | #define CISTPL_DEVICE_GEO 0x1e | ||
526 | #define CISTPL_DEVICE_GEO_A 0x1f | ||
527 | #define CISTPL_MANFID 0x20 | ||
528 | #define CISTPL_FUNCID 0x21 | ||
529 | #define CISTPL_FUNCE 0x22 | ||
530 | #define CISTPL_SWIL 0x23 | ||
531 | #define CISTPL_END 0xff | ||
532 | |||
533 | /* | ||
534 | * CIS Function ID codes | ||
535 | */ | ||
536 | #define CISTPL_FUNCID_MULTI 0x00 | ||
537 | #define CISTPL_FUNCID_MEMORY 0x01 | ||
538 | #define CISTPL_FUNCID_SERIAL 0x02 | ||
539 | #define CISTPL_FUNCID_PARALLEL 0x03 | ||
540 | #define CISTPL_FUNCID_FIXED 0x04 | ||
541 | #define CISTPL_FUNCID_VIDEO 0x05 | ||
542 | #define CISTPL_FUNCID_NETWORK 0x06 | ||
543 | #define CISTPL_FUNCID_AIMS 0x07 | ||
544 | #define CISTPL_FUNCID_SCSI 0x08 | ||
545 | |||
546 | /* | ||
547 | * Fixed Disk FUNCE codes | ||
548 | */ | ||
549 | #define CISTPL_IDE_INTERFACE 0x01 | ||
550 | |||
551 | #define CISTPL_FUNCE_IDE_IFACE 0x01 | ||
552 | #define CISTPL_FUNCE_IDE_MASTER 0x02 | ||
553 | #define CISTPL_FUNCE_IDE_SLAVE 0x03 | ||
554 | |||
555 | /* First feature byte */ | ||
556 | #define CISTPL_IDE_SILICON 0x04 | ||
557 | #define CISTPL_IDE_UNIQUE 0x08 | ||
558 | #define CISTPL_IDE_DUAL 0x10 | ||
559 | |||
560 | /* Second feature byte */ | ||
561 | #define CISTPL_IDE_HAS_SLEEP 0x01 | ||
562 | #define CISTPL_IDE_HAS_STANDBY 0x02 | ||
563 | #define CISTPL_IDE_HAS_IDLE 0x04 | ||
564 | #define CISTPL_IDE_LOW_POWER 0x08 | ||
565 | #define CISTPL_IDE_REG_INHIBIT 0x10 | ||
566 | #define CISTPL_IDE_HAS_INDEX 0x20 | ||
567 | #define CISTPL_IDE_IOIS16 0x40 | ||
568 | |||
569 | |||
570 | /* -------------------------------------------------------------------- */ | ||
571 | |||
572 | |||
573 | #define MAX_TUPEL_SZ 512 | ||
574 | #define MAX_FEATURES 4 | ||
575 | |||
576 | static int check_ide_device (unsigned long base) | ||
577 | { | ||
578 | volatile u8 *ident = NULL; | ||
579 | volatile u8 *feature_p[MAX_FEATURES]; | ||
580 | volatile u8 *p, *start; | ||
581 | int n_features = 0; | ||
582 | u8 func_id = ~0; | ||
583 | u8 code, len; | ||
584 | unsigned short config_base = 0; | ||
585 | int found = 0; | ||
586 | int i; | ||
587 | |||
588 | #ifdef DEBUG | ||
589 | printk ("PCMCIA MEM: %08lX\n", base); | ||
590 | #endif | ||
591 | start = p = (volatile u8 *) base; | ||
592 | |||
593 | while ((p - start) < MAX_TUPEL_SZ) { | ||
594 | |||
595 | code = *p; p += 2; | ||
596 | |||
597 | if (code == 0xFF) { /* End of chain */ | ||
598 | break; | ||
599 | } | ||
600 | |||
601 | len = *p; p += 2; | ||
602 | #ifdef DEBUG_PCMCIA | ||
603 | { volatile u8 *q = p; | ||
604 | printk ("\nTuple code %02x length %d\n\tData:", | ||
605 | code, len); | ||
606 | |||
607 | for (i = 0; i < len; ++i) { | ||
608 | printk (" %02x", *q); | ||
609 | q+= 2; | ||
610 | } | ||
611 | } | ||
612 | #endif /* DEBUG_PCMCIA */ | ||
613 | switch (code) { | ||
614 | case CISTPL_VERS_1: | ||
615 | ident = p + 4; | ||
616 | break; | ||
617 | case CISTPL_FUNCID: | ||
618 | func_id = *p; | ||
619 | break; | ||
620 | case CISTPL_FUNCE: | ||
621 | if (n_features < MAX_FEATURES) | ||
622 | feature_p[n_features++] = p; | ||
623 | break; | ||
624 | case CISTPL_CONFIG: | ||
625 | config_base = (*(p+6) << 8) + (*(p+4)); | ||
626 | default: | ||
627 | break; | ||
628 | } | ||
629 | p += 2 * len; | ||
630 | } | ||
631 | |||
632 | found = identify (ident); | ||
633 | |||
634 | if (func_id != ((u8)~0)) { | ||
635 | print_funcid (func_id); | ||
636 | |||
637 | if (func_id == CISTPL_FUNCID_FIXED) | ||
638 | found = 1; | ||
639 | else | ||
640 | return (1); /* no disk drive */ | ||
641 | } | ||
642 | |||
643 | for (i=0; i<n_features; ++i) { | ||
644 | print_fixed (feature_p[i]); | ||
645 | } | ||
646 | |||
647 | if (!found) { | ||
648 | printk ("unknown card type\n"); | ||
649 | return (1); | ||
650 | } | ||
651 | |||
652 | /* set level mode irq and I/O mapped device in config reg*/ | ||
653 | *((u8 *)(base + config_base)) = 0x41; | ||
654 | |||
655 | return (0); | ||
656 | } | ||
657 | |||
658 | /* ------------------------------------------------------------------------- */ | ||
659 | |||
660 | static void print_funcid (int func) | ||
661 | { | ||
662 | switch (func) { | ||
663 | case CISTPL_FUNCID_MULTI: | ||
664 | printk (" Multi-Function"); | ||
665 | break; | ||
666 | case CISTPL_FUNCID_MEMORY: | ||
667 | printk (" Memory"); | ||
668 | break; | ||
669 | case CISTPL_FUNCID_SERIAL: | ||
670 | printk (" Serial Port"); | ||
671 | break; | ||
672 | case CISTPL_FUNCID_PARALLEL: | ||
673 | printk (" Parallel Port"); | ||
674 | break; | ||
675 | case CISTPL_FUNCID_FIXED: | ||
676 | printk (" Fixed Disk"); | ||
677 | break; | ||
678 | case CISTPL_FUNCID_VIDEO: | ||
679 | printk (" Video Adapter"); | ||
680 | break; | ||
681 | case CISTPL_FUNCID_NETWORK: | ||
682 | printk (" Network Adapter"); | ||
683 | break; | ||
684 | case CISTPL_FUNCID_AIMS: | ||
685 | printk (" AIMS Card"); | ||
686 | break; | ||
687 | case CISTPL_FUNCID_SCSI: | ||
688 | printk (" SCSI Adapter"); | ||
689 | break; | ||
690 | default: | ||
691 | printk (" Unknown"); | ||
692 | break; | ||
693 | } | ||
694 | printk (" Card\n"); | ||
695 | } | ||
696 | |||
697 | /* ------------------------------------------------------------------------- */ | ||
698 | |||
699 | static void print_fixed (volatile u8 *p) | ||
700 | { | ||
701 | if (p == NULL) | ||
702 | return; | ||
703 | |||
704 | switch (*p) { | ||
705 | case CISTPL_FUNCE_IDE_IFACE: | ||
706 | { u8 iface = *(p+2); | ||
707 | |||
708 | printk ((iface == CISTPL_IDE_INTERFACE) ? " IDE" : " unknown"); | ||
709 | printk (" interface "); | ||
710 | break; | ||
711 | } | ||
712 | case CISTPL_FUNCE_IDE_MASTER: | ||
713 | case CISTPL_FUNCE_IDE_SLAVE: | ||
714 | { u8 f1 = *(p+2); | ||
715 | u8 f2 = *(p+4); | ||
716 | |||
717 | printk ((f1 & CISTPL_IDE_SILICON) ? " [silicon]" : " [rotating]"); | ||
718 | |||
719 | if (f1 & CISTPL_IDE_UNIQUE) | ||
720 | printk (" [unique]"); | ||
721 | |||
722 | printk ((f1 & CISTPL_IDE_DUAL) ? " [dual]" : " [single]"); | ||
723 | |||
724 | if (f2 & CISTPL_IDE_HAS_SLEEP) | ||
725 | printk (" [sleep]"); | ||
726 | |||
727 | if (f2 & CISTPL_IDE_HAS_STANDBY) | ||
728 | printk (" [standby]"); | ||
729 | |||
730 | if (f2 & CISTPL_IDE_HAS_IDLE) | ||
731 | printk (" [idle]"); | ||
732 | |||
733 | if (f2 & CISTPL_IDE_LOW_POWER) | ||
734 | printk (" [low power]"); | ||
735 | |||
736 | if (f2 & CISTPL_IDE_REG_INHIBIT) | ||
737 | printk (" [reg inhibit]"); | ||
738 | |||
739 | if (f2 & CISTPL_IDE_HAS_INDEX) | ||
740 | printk (" [index]"); | ||
741 | |||
742 | if (f2 & CISTPL_IDE_IOIS16) | ||
743 | printk (" [IOis16]"); | ||
744 | |||
745 | break; | ||
746 | } | ||
747 | } | ||
748 | printk ("\n"); | ||
749 | } | ||
750 | |||
751 | /* ------------------------------------------------------------------------- */ | ||
752 | |||
753 | |||
754 | #define MAX_IDENT_CHARS 64 | ||
755 | #define MAX_IDENT_FIELDS 4 | ||
756 | |||
757 | static u8 *known_cards[] = { | ||
758 | "ARGOSY PnPIDE D5", | ||
759 | NULL | ||
760 | }; | ||
761 | |||
762 | static int identify (volatile u8 *p) | ||
763 | { | ||
764 | u8 id_str[MAX_IDENT_CHARS]; | ||
765 | u8 data; | ||
766 | u8 *t; | ||
767 | u8 **card; | ||
768 | int i, done; | ||
769 | |||
770 | if (p == NULL) | ||
771 | return (0); /* Don't know */ | ||
772 | |||
773 | t = id_str; | ||
774 | done =0; | ||
775 | |||
776 | for (i=0; i<=4 && !done; ++i, p+=2) { | ||
777 | while ((data = *p) != '\0') { | ||
778 | if (data == 0xFF) { | ||
779 | done = 1; | ||
780 | break; | ||
781 | } | ||
782 | *t++ = data; | ||
783 | if (t == &id_str[MAX_IDENT_CHARS-1]) { | ||
784 | done = 1; | ||
785 | break; | ||
786 | } | ||
787 | p += 2; | ||
788 | } | ||
789 | if (!done) | ||
790 | *t++ = ' '; | ||
791 | } | ||
792 | *t = '\0'; | ||
793 | while (--t > id_str) { | ||
794 | if (*t == ' ') | ||
795 | *t = '\0'; | ||
796 | else | ||
797 | break; | ||
798 | } | ||
799 | printk ("Card ID: %s\n", id_str); | ||
800 | |||
801 | for (card=known_cards; *card; ++card) { | ||
802 | if (strcmp(*card, id_str) == 0) { /* found! */ | ||
803 | return (1); | ||
804 | } | ||
805 | } | ||
806 | |||
807 | return (0); /* don't know */ | ||
808 | } | ||
809 | |||
810 | static int __init mpc8xx_ide_probe(void) | ||
811 | { | ||
812 | hw_regs_t hw; | ||
813 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | ||
814 | |||
815 | #ifdef IDE0_BASE_OFFSET | ||
816 | memset(&hw, 0, sizeof(hw)); | ||
817 | if (!m8xx_ide_init_ports(&hw, 0)) { | ||
818 | ide_hwif_t *hwif = ide_find_port(); | ||
819 | |||
820 | if (hwif) { | ||
821 | ide_init_port_hw(hwif, &hw); | ||
822 | hwif->pio_mask = ATA_PIO4; | ||
823 | hwif->port_ops = &m8xx_port_ops; | ||
824 | |||
825 | idx[0] = hwif->index; | ||
826 | } | ||
827 | } | ||
828 | #ifdef IDE1_BASE_OFFSET | ||
829 | memset(&hw, 0, sizeof(hw)); | ||
830 | if (!m8xx_ide_init_ports(&hw, 1)) { | ||
831 | ide_hwif_t *mate = ide_find_port(); | ||
832 | |||
833 | if (mate) { | ||
834 | ide_init_port_hw(mate, &hw); | ||
835 | mate->pio_mask = ATA_PIO4; | ||
836 | mate->port_ops = &m8xx_port_ops; | ||
837 | |||
838 | idx[1] = mate->index; | ||
839 | } | ||
840 | } | ||
841 | #endif | ||
842 | #endif | ||
843 | |||
844 | ide_device_add(idx, NULL); | ||
845 | |||
846 | return 0; | ||
847 | } | ||
848 | |||
849 | module_init(mpc8xx_ide_probe); | ||
850 | |||
851 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index dcb2c466bb97..93fb9067c043 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * for doing DMA. | 5 | * for doing DMA. |
6 | * | 6 | * |
7 | * Copyright (C) 1998-2003 Paul Mackerras & Ben. Herrenschmidt | 7 | * Copyright (C) 1998-2003 Paul Mackerras & Ben. Herrenschmidt |
8 | * Copyright (C) 2007 Bartlomiej Zolnierkiewicz | 8 | * Copyright (C) 2007-2008 Bartlomiej Zolnierkiewicz |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or | 10 | * This program is free software; you can redistribute it and/or |
11 | * modify it under the terms of the GNU General Public License | 11 | * modify it under the terms of the GNU General Public License |
@@ -48,8 +48,6 @@ | |||
48 | #include <asm/mediabay.h> | 48 | #include <asm/mediabay.h> |
49 | #endif | 49 | #endif |
50 | 50 | ||
51 | #include "../ide-timing.h" | ||
52 | |||
53 | #undef IDE_PMAC_DEBUG | 51 | #undef IDE_PMAC_DEBUG |
54 | 52 | ||
55 | #define DMA_WAIT_TIMEOUT 50 | 53 | #define DMA_WAIT_TIMEOUT 50 |
@@ -495,6 +493,7 @@ static void pmac_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port) | |||
495 | static void | 493 | static void |
496 | pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) | 494 | pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) |
497 | { | 495 | { |
496 | struct ide_timing *tim = ide_timing_find_mode(XFER_PIO_0 + pio); | ||
498 | u32 *timings, t; | 497 | u32 *timings, t; |
499 | unsigned accessTicks, recTicks; | 498 | unsigned accessTicks, recTicks; |
500 | unsigned accessTime, recTime; | 499 | unsigned accessTime, recTime; |
@@ -526,10 +525,9 @@ pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
526 | } | 525 | } |
527 | case controller_kl_ata4: | 526 | case controller_kl_ata4: |
528 | /* 66Mhz cell */ | 527 | /* 66Mhz cell */ |
529 | recTime = cycle_time - ide_pio_timings[pio].active_time | 528 | recTime = cycle_time - tim->active - tim->setup; |
530 | - ide_pio_timings[pio].setup_time; | ||
531 | recTime = max(recTime, 150U); | 529 | recTime = max(recTime, 150U); |
532 | accessTime = ide_pio_timings[pio].active_time; | 530 | accessTime = tim->active; |
533 | accessTime = max(accessTime, 150U); | 531 | accessTime = max(accessTime, 150U); |
534 | accessTicks = SYSCLK_TICKS_66(accessTime); | 532 | accessTicks = SYSCLK_TICKS_66(accessTime); |
535 | accessTicks = min(accessTicks, 0x1fU); | 533 | accessTicks = min(accessTicks, 0x1fU); |
@@ -542,10 +540,9 @@ pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
542 | default: { | 540 | default: { |
543 | /* 33Mhz cell */ | 541 | /* 33Mhz cell */ |
544 | int ebit = 0; | 542 | int ebit = 0; |
545 | recTime = cycle_time - ide_pio_timings[pio].active_time | 543 | recTime = cycle_time - tim->active - tim->setup; |
546 | - ide_pio_timings[pio].setup_time; | ||
547 | recTime = max(recTime, 150U); | 544 | recTime = max(recTime, 150U); |
548 | accessTime = ide_pio_timings[pio].active_time; | 545 | accessTime = tim->active; |
549 | accessTime = max(accessTime, 150U); | 546 | accessTime = max(accessTime, 150U); |
550 | accessTicks = SYSCLK_TICKS(accessTime); | 547 | accessTicks = SYSCLK_TICKS(accessTime); |
551 | accessTicks = min(accessTicks, 0x1fU); | 548 | accessTicks = min(accessTicks, 0x1fU); |
@@ -1151,8 +1148,6 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match) | |||
1151 | base = ioremap(macio_resource_start(mdev, 0), 0x400); | 1148 | base = ioremap(macio_resource_start(mdev, 0), 0x400); |
1152 | regbase = (unsigned long) base; | 1149 | regbase = (unsigned long) base; |
1153 | 1150 | ||
1154 | hwif->dev = &mdev->bus->pdev->dev; | ||
1155 | |||
1156 | pmif->mdev = mdev; | 1151 | pmif->mdev = mdev; |
1157 | pmif->node = mdev->ofdev.node; | 1152 | pmif->node = mdev->ofdev.node; |
1158 | pmif->regbase = regbase; | 1153 | pmif->regbase = regbase; |
@@ -1174,7 +1169,8 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match) | |||
1174 | memset(&hw, 0, sizeof(hw)); | 1169 | memset(&hw, 0, sizeof(hw)); |
1175 | pmac_ide_init_ports(&hw, pmif->regbase); | 1170 | pmac_ide_init_ports(&hw, pmif->regbase); |
1176 | hw.irq = irq; | 1171 | hw.irq = irq; |
1177 | hw.dev = &mdev->ofdev.dev; | 1172 | hw.dev = &mdev->bus->pdev->dev; |
1173 | hw.parent = &mdev->ofdev.dev; | ||
1178 | 1174 | ||
1179 | rc = pmac_ide_setup_device(pmif, hwif, &hw); | 1175 | rc = pmac_ide_setup_device(pmif, hwif, &hw); |
1180 | if (rc != 0) { | 1176 | if (rc != 0) { |
@@ -1274,7 +1270,6 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1274 | goto out_free_pmif; | 1270 | goto out_free_pmif; |
1275 | } | 1271 | } |
1276 | 1272 | ||
1277 | hwif->dev = &pdev->dev; | ||
1278 | pmif->mdev = NULL; | 1273 | pmif->mdev = NULL; |
1279 | pmif->node = np; | 1274 | pmif->node = np; |
1280 | 1275 | ||
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index abcfb1739d4d..65fc08b6b6d0 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -6,19 +6,15 @@ | |||
6 | * May be copied or modified under the terms of the GNU General Public License | 6 | * May be copied or modified under the terms of the GNU General Public License |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/module.h> | ||
10 | #include <linux/types.h> | 9 | #include <linux/types.h> |
11 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
12 | #include <linux/pci.h> | 11 | #include <linux/pci.h> |
13 | #include <linux/init.h> | 12 | #include <linux/init.h> |
14 | #include <linux/timer.h> | ||
15 | #include <linux/mm.h> | ||
16 | #include <linux/interrupt.h> | 13 | #include <linux/interrupt.h> |
17 | #include <linux/ide.h> | 14 | #include <linux/ide.h> |
18 | #include <linux/dma-mapping.h> | 15 | #include <linux/dma-mapping.h> |
19 | 16 | ||
20 | #include <asm/io.h> | 17 | #include <asm/io.h> |
21 | #include <asm/irq.h> | ||
22 | 18 | ||
23 | /** | 19 | /** |
24 | * ide_setup_pci_baseregs - place a PCI IDE controller native | 20 | * ide_setup_pci_baseregs - place a PCI IDE controller native |
@@ -319,25 +315,22 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, | |||
319 | 315 | ||
320 | ctl = pci_resource_start(dev, 2*port+1); | 316 | ctl = pci_resource_start(dev, 2*port+1); |
321 | base = pci_resource_start(dev, 2*port); | 317 | base = pci_resource_start(dev, 2*port); |
322 | if ((ctl && !base) || (base && !ctl)) { | 318 | } else { |
323 | printk(KERN_ERR "%s: inconsistent baseregs (BIOS) " | ||
324 | "for port %d, skipping\n", d->name, port); | ||
325 | return NULL; | ||
326 | } | ||
327 | } | ||
328 | if (!ctl) { | ||
329 | /* Use default values */ | 319 | /* Use default values */ |
330 | ctl = port ? 0x374 : 0x3f4; | 320 | ctl = port ? 0x374 : 0x3f4; |
331 | base = port ? 0x170 : 0x1f0; | 321 | base = port ? 0x170 : 0x1f0; |
332 | } | 322 | } |
333 | 323 | ||
334 | hwif = ide_find_port_slot(d); | 324 | if (!base || !ctl) { |
335 | if (hwif == NULL) { | 325 | printk(KERN_ERR "%s: bad PCI BARs for port %d, skipping\n", |
336 | printk(KERN_ERR "%s: too many IDE interfaces, no room in " | 326 | d->name, port); |
337 | "table\n", d->name); | ||
338 | return NULL; | 327 | return NULL; |
339 | } | 328 | } |
340 | 329 | ||
330 | hwif = ide_find_port_slot(d); | ||
331 | if (hwif == NULL) | ||
332 | return NULL; | ||
333 | |||
341 | memset(&hw, 0, sizeof(hw)); | 334 | memset(&hw, 0, sizeof(hw)); |
342 | hw.irq = irq; | 335 | hw.irq = irq; |
343 | hw.dev = &dev->dev; | 336 | hw.dev = &dev->dev; |
@@ -346,8 +339,6 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, | |||
346 | 339 | ||
347 | ide_init_port_hw(hwif, &hw); | 340 | ide_init_port_hw(hwif, &hw); |
348 | 341 | ||
349 | hwif->dev = &dev->dev; | ||
350 | |||
351 | return hwif; | 342 | return hwif; |
352 | } | 343 | } |
353 | 344 | ||