diff options
246 files changed, 2704 insertions, 2095 deletions
diff --git a/arch/alpha/kernel/vmlinux.lds.S b/arch/alpha/kernel/vmlinux.lds.S index 71470e9d93ba..76bf071e376c 100644 --- a/arch/alpha/kernel/vmlinux.lds.S +++ b/arch/alpha/kernel/vmlinux.lds.S | |||
@@ -48,13 +48,7 @@ SECTIONS | |||
48 | . = ALIGN(8); | 48 | . = ALIGN(8); |
49 | __initcall_start = .; | 49 | __initcall_start = .; |
50 | .initcall.init : { | 50 | .initcall.init : { |
51 | *(.initcall1.init) | 51 | INITCALLS |
52 | *(.initcall2.init) | ||
53 | *(.initcall3.init) | ||
54 | *(.initcall4.init) | ||
55 | *(.initcall5.init) | ||
56 | *(.initcall6.init) | ||
57 | *(.initcall7.init) | ||
58 | } | 52 | } |
59 | __initcall_end = .; | 53 | __initcall_end = .; |
60 | 54 | ||
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 3ca574ee2772..a8fa75ea07a9 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -45,13 +45,7 @@ SECTIONS | |||
45 | *(.early_param.init) | 45 | *(.early_param.init) |
46 | __early_end = .; | 46 | __early_end = .; |
47 | __initcall_start = .; | 47 | __initcall_start = .; |
48 | *(.initcall1.init) | 48 | INITCALLS |
49 | *(.initcall2.init) | ||
50 | *(.initcall3.init) | ||
51 | *(.initcall4.init) | ||
52 | *(.initcall5.init) | ||
53 | *(.initcall6.init) | ||
54 | *(.initcall7.init) | ||
55 | __initcall_end = .; | 49 | __initcall_end = .; |
56 | __con_initcall_start = .; | 50 | __con_initcall_start = .; |
57 | *(.con_initcall.init) | 51 | *(.con_initcall.init) |
diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c index 9ee63834e603..0fdd03ab36e6 100644 --- a/arch/arm/mach-ixp2000/ixdp2400.c +++ b/arch/arm/mach-ixp2000/ixdp2400.c | |||
@@ -135,11 +135,11 @@ static void ixdp2400_pci_postinit(void) | |||
135 | if (ixdp2x00_master_npu()) { | 135 | if (ixdp2x00_master_npu()) { |
136 | dev = pci_get_bus_and_slot(1, IXDP2400_SLAVE_ENET_DEVFN); | 136 | dev = pci_get_bus_and_slot(1, IXDP2400_SLAVE_ENET_DEVFN); |
137 | pci_remove_bus_device(dev); | 137 | pci_remove_bus_device(dev); |
138 | pci_dev_put(dev) | 138 | pci_dev_put(dev); |
139 | } else { | 139 | } else { |
140 | dev = pci_get_bus_and_slot(1, IXDP2400_MASTER_ENET_DEVFN); | 140 | dev = pci_get_bus_and_slot(1, IXDP2400_MASTER_ENET_DEVFN); |
141 | pci_remove_bus_device(dev); | 141 | pci_remove_bus_device(dev); |
142 | pci_dev_put(dev) | 142 | pci_dev_put(dev); |
143 | 143 | ||
144 | ixdp2x00_slave_pci_postinit(); | 144 | ixdp2x00_slave_pci_postinit(); |
145 | } | 145 | } |
diff --git a/arch/arm/mach-lh7a40x/Kconfig b/arch/arm/mach-lh7a40x/Kconfig index 558a34f53b1c..147b01928a9b 100644 --- a/arch/arm/mach-lh7a40x/Kconfig +++ b/arch/arm/mach-lh7a40x/Kconfig | |||
@@ -14,7 +14,7 @@ config MACH_LPD7A400 | |||
14 | bool "LPD7A400 Card Engine" | 14 | bool "LPD7A400 Card Engine" |
15 | select ARCH_LH7A400 | 15 | select ARCH_LH7A400 |
16 | # select IDE_POLL | 16 | # select IDE_POLL |
17 | select HAS_TOUCHSCREEN_ADS7843_LH7 | 17 | # select HAS_TOUCHSCREEN_ADS7843_LH7 |
18 | help | 18 | help |
19 | Say Y here if you are using Logic Product Development's | 19 | Say Y here if you are using Logic Product Development's |
20 | LPD7A400 CardEngine. For the time being, the LPD7A400 and | 20 | LPD7A400 CardEngine. For the time being, the LPD7A400 and |
@@ -24,7 +24,7 @@ config MACH_LPD7A404 | |||
24 | bool "LPD7A404 Card Engine" | 24 | bool "LPD7A404 Card Engine" |
25 | select ARCH_LH7A404 | 25 | select ARCH_LH7A404 |
26 | # select IDE_POLL | 26 | # select IDE_POLL |
27 | select HAS_TOUCHSCREEN_ADC_LH7 | 27 | # select HAS_TOUCHSCREEN_ADC_LH7 |
28 | help | 28 | help |
29 | Say Y here if you are using Logic Product Development's | 29 | Say Y here if you are using Logic Product Development's |
30 | LPD7A404 CardEngine. For the time being, the LPD7A400 and | 30 | LPD7A404 CardEngine. For the time being, the LPD7A400 and |
diff --git a/arch/avr32/Makefile b/arch/avr32/Makefile index cefc95a73980..7b842e98efed 100644 --- a/arch/avr32/Makefile +++ b/arch/avr32/Makefile | |||
@@ -7,7 +7,7 @@ | |||
7 | 7 | ||
8 | # Default target when executing plain make | 8 | # Default target when executing plain make |
9 | .PHONY: all | 9 | .PHONY: all |
10 | all: uImage vmlinux.elf linux.lst | 10 | all: uImage vmlinux.elf |
11 | 11 | ||
12 | KBUILD_DEFCONFIG := atstk1002_defconfig | 12 | KBUILD_DEFCONFIG := atstk1002_defconfig |
13 | 13 | ||
@@ -21,9 +21,7 @@ cpuflags-$(CONFIG_CPU_AP7000) += -mcpu=ap7000 | |||
21 | CFLAGS += $(cpuflags-y) | 21 | CFLAGS += $(cpuflags-y) |
22 | AFLAGS += $(cpuflags-y) | 22 | AFLAGS += $(cpuflags-y) |
23 | 23 | ||
24 | CHECKFLAGS += -D__avr32__ | 24 | CHECKFLAGS += -D__avr32__ -D__BIG_ENDIAN |
25 | |||
26 | LIBGCC := $(shell $(CC) $(CFLAGS) -print-libgcc-file-name) | ||
27 | 25 | ||
28 | head-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/head.o | 26 | head-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/head.o |
29 | head-y += arch/avr32/kernel/head.o | 27 | head-y += arch/avr32/kernel/head.o |
@@ -32,7 +30,7 @@ core-$(CONFIG_BOARD_ATSTK1000) += arch/avr32/boards/atstk1000/ | |||
32 | core-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/ | 30 | core-$(CONFIG_LOADER_U_BOOT) += arch/avr32/boot/u-boot/ |
33 | core-y += arch/avr32/kernel/ | 31 | core-y += arch/avr32/kernel/ |
34 | core-y += arch/avr32/mm/ | 32 | core-y += arch/avr32/mm/ |
35 | libs-y += arch/avr32/lib/ #$(LIBGCC) | 33 | libs-y += arch/avr32/lib/ |
36 | 34 | ||
37 | archincdir-$(CONFIG_PLATFORM_AT32AP) := arch-at32ap | 35 | archincdir-$(CONFIG_PLATFORM_AT32AP) := arch-at32ap |
38 | 36 | ||
@@ -48,6 +46,8 @@ endif | |||
48 | 46 | ||
49 | archprepare: include/asm-avr32/.arch | 47 | archprepare: include/asm-avr32/.arch |
50 | 48 | ||
49 | CLEAN_FILES += include/asm-avr32/.arch include/asm-avr32/arch | ||
50 | |||
51 | BOOT_TARGETS := vmlinux.elf vmlinux.bin uImage uImage.srec | 51 | BOOT_TARGETS := vmlinux.elf vmlinux.bin uImage uImage.srec |
52 | 52 | ||
53 | .PHONY: $(BOOT_TARGETS) install | 53 | .PHONY: $(BOOT_TARGETS) install |
@@ -71,14 +71,19 @@ vmlinux.elf vmlinux.bin uImage.srec uImage vmlinux.cso: vmlinux | |||
71 | install: vmlinux | 71 | install: vmlinux |
72 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@ | 72 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@ |
73 | 73 | ||
74 | linux.s: vmlinux | 74 | vmlinux.s: vmlinux |
75 | $(call if_changed,disasm) | 75 | $(call if_changed,disasm) |
76 | 76 | ||
77 | linux.lst: vmlinux | 77 | vmlinux.lst: vmlinux |
78 | $(call if_changed,listing) | 78 | $(call if_changed,listing) |
79 | 79 | ||
80 | CLEAN_FILES += vmlinux.s vmlinux.lst | ||
81 | |||
82 | archclean: | ||
83 | $(Q)$(MAKE) $(clean)=$(boot) | ||
84 | |||
80 | define archhelp | 85 | define archhelp |
81 | @echo '* vmlinux.elf - ELF image with load address 0' | 86 | @echo '* vmlinux.elf - ELF image with load address 0' |
82 | @echo ' vmlinux.cso - PathFinder CSO image' | 87 | @echo ' vmlinux.cso - PathFinder CSO image' |
83 | @echo ' uImage - Create a bootable image for U-Boot' | 88 | @echo '* uImage - Create a bootable image for U-Boot' |
84 | endef | 89 | endef |
diff --git a/arch/avr32/boot/images/Makefile b/arch/avr32/boot/images/Makefile index ccd74eeecec3..219720a47bf9 100644 --- a/arch/avr32/boot/images/Makefile +++ b/arch/avr32/boot/images/Makefile | |||
@@ -37,14 +37,12 @@ OBJCOPYFLAGS_vmlinux.elf := --change-section-lma .text-0x80000000 \ | |||
37 | --change-section-lma .data-0x80000000 \ | 37 | --change-section-lma .data-0x80000000 \ |
38 | --change-section-lma .init-0x80000000 \ | 38 | --change-section-lma .init-0x80000000 \ |
39 | --change-section-lma .bss-0x80000000 \ | 39 | --change-section-lma .bss-0x80000000 \ |
40 | --change-section-lma .initrd-0x80000000 \ | ||
41 | --change-section-lma __param-0x80000000 \ | 40 | --change-section-lma __param-0x80000000 \ |
42 | --change-section-lma __ksymtab-0x80000000 \ | 41 | --change-section-lma __ksymtab-0x80000000 \ |
43 | --change-section-lma __ksymtab_gpl-0x80000000 \ | 42 | --change-section-lma __ksymtab_gpl-0x80000000 \ |
44 | --change-section-lma __kcrctab-0x80000000 \ | 43 | --change-section-lma __kcrctab-0x80000000 \ |
45 | --change-section-lma __kcrctab_gpl-0x80000000 \ | 44 | --change-section-lma __kcrctab_gpl-0x80000000 \ |
46 | --change-section-lma __ksymtab_strings-0x80000000 \ | 45 | --change-section-lma __ksymtab_strings-0x80000000 \ |
47 | --change-section-lma .got-0x80000000 \ | ||
48 | --set-start 0xa0000000 | 46 | --set-start 0xa0000000 |
49 | $(obj)/vmlinux.elf: vmlinux FORCE | 47 | $(obj)/vmlinux.elf: vmlinux FORCE |
50 | $(call if_changed,objcopy) | 48 | $(call if_changed,objcopy) |
@@ -59,4 +57,4 @@ install: $(BOOTIMAGE) | |||
59 | sh $(srctree)/install-kernel.sh $< | 57 | sh $(srctree)/install-kernel.sh $< |
60 | 58 | ||
61 | # Generated files to be removed upon make clean | 59 | # Generated files to be removed upon make clean |
62 | clean-files := vmlinux* uImage uImage.srec | 60 | clean-files := vmlinux.elf vmlinux.bin vmlinux.gz uImage uImage.srec |
diff --git a/arch/avr32/configs/atstk1002_defconfig b/arch/avr32/configs/atstk1002_defconfig index 6c2c5e00dfc7..ae92a14ef9a0 100644 --- a/arch/avr32/configs/atstk1002_defconfig +++ b/arch/avr32/configs/atstk1002_defconfig | |||
@@ -1,13 +1,14 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.18-rc1 | 3 | # Linux kernel version: 2.6.19-rc2 |
4 | # Tue Jul 11 12:41:36 2006 | 4 | # Fri Oct 20 11:52:37 2006 |
5 | # | 5 | # |
6 | CONFIG_AVR32=y | 6 | CONFIG_AVR32=y |
7 | CONFIG_GENERIC_HARDIRQS=y | 7 | CONFIG_GENERIC_HARDIRQS=y |
8 | CONFIG_HARDIRQS_SW_RESEND=y | 8 | CONFIG_HARDIRQS_SW_RESEND=y |
9 | CONFIG_GENERIC_IRQ_PROBE=y | 9 | CONFIG_GENERIC_IRQ_PROBE=y |
10 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 10 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
11 | CONFIG_GENERIC_TIME=y | ||
11 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
12 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 13 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
13 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 14 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
@@ -25,16 +26,23 @@ CONFIG_INIT_ENV_ARG_LIMIT=32 | |||
25 | CONFIG_LOCALVERSION="" | 26 | CONFIG_LOCALVERSION="" |
26 | # CONFIG_LOCALVERSION_AUTO is not set | 27 | # CONFIG_LOCALVERSION_AUTO is not set |
27 | CONFIG_SWAP=y | 28 | CONFIG_SWAP=y |
28 | # CONFIG_SYSVIPC is not set | 29 | CONFIG_SYSVIPC=y |
29 | # CONFIG_POSIX_MQUEUE is not set | 30 | # CONFIG_IPC_NS is not set |
30 | # CONFIG_BSD_PROCESS_ACCT is not set | 31 | CONFIG_POSIX_MQUEUE=y |
31 | CONFIG_SYSCTL=y | 32 | CONFIG_BSD_PROCESS_ACCT=y |
32 | # CONFIG_AUDIT is not set | 33 | CONFIG_BSD_PROCESS_ACCT_V3=y |
34 | CONFIG_TASKSTATS=y | ||
35 | CONFIG_TASK_DELAY_ACCT=y | ||
36 | # CONFIG_UTS_NS is not set | ||
37 | CONFIG_AUDIT=y | ||
33 | # CONFIG_IKCONFIG is not set | 38 | # CONFIG_IKCONFIG is not set |
34 | # CONFIG_RELAY is not set | 39 | CONFIG_RELAY=y |
35 | CONFIG_INITRAMFS_SOURCE="" | 40 | CONFIG_INITRAMFS_SOURCE="" |
36 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 41 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
42 | # CONFIG_TASK_XACCT is not set | ||
43 | CONFIG_SYSCTL=y | ||
37 | CONFIG_EMBEDDED=y | 44 | CONFIG_EMBEDDED=y |
45 | # CONFIG_SYSCTL_SYSCALL is not set | ||
38 | CONFIG_KALLSYMS=y | 46 | CONFIG_KALLSYMS=y |
39 | # CONFIG_KALLSYMS_ALL is not set | 47 | # CONFIG_KALLSYMS_ALL is not set |
40 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 48 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
@@ -43,14 +51,15 @@ CONFIG_PRINTK=y | |||
43 | CONFIG_BUG=y | 51 | CONFIG_BUG=y |
44 | CONFIG_ELF_CORE=y | 52 | CONFIG_ELF_CORE=y |
45 | # CONFIG_BASE_FULL is not set | 53 | # CONFIG_BASE_FULL is not set |
46 | # CONFIG_FUTEX is not set | 54 | CONFIG_FUTEX=y |
47 | # CONFIG_EPOLL is not set | 55 | CONFIG_EPOLL=y |
48 | CONFIG_SHMEM=y | 56 | CONFIG_SHMEM=y |
49 | # CONFIG_SLAB is not set | 57 | CONFIG_SLAB=y |
50 | # CONFIG_VM_EVENT_COUNTERS is not set | 58 | CONFIG_VM_EVENT_COUNTERS=y |
59 | CONFIG_RT_MUTEXES=y | ||
51 | # CONFIG_TINY_SHMEM is not set | 60 | # CONFIG_TINY_SHMEM is not set |
52 | CONFIG_BASE_SMALL=1 | 61 | CONFIG_BASE_SMALL=1 |
53 | CONFIG_SLOB=y | 62 | # CONFIG_SLOB is not set |
54 | 63 | ||
55 | # | 64 | # |
56 | # Loadable module support | 65 | # Loadable module support |
@@ -65,6 +74,7 @@ CONFIG_MODULE_UNLOAD=y | |||
65 | # | 74 | # |
66 | # Block layer | 75 | # Block layer |
67 | # | 76 | # |
77 | CONFIG_BLOCK=y | ||
68 | # CONFIG_BLK_DEV_IO_TRACE is not set | 78 | # CONFIG_BLK_DEV_IO_TRACE is not set |
69 | 79 | ||
70 | # | 80 | # |
@@ -166,10 +176,12 @@ CONFIG_IP_PNP_DHCP=y | |||
166 | # CONFIG_INET_TUNNEL is not set | 176 | # CONFIG_INET_TUNNEL is not set |
167 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | 177 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set |
168 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | 178 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set |
179 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
169 | CONFIG_INET_DIAG=y | 180 | CONFIG_INET_DIAG=y |
170 | CONFIG_INET_TCP_DIAG=y | 181 | CONFIG_INET_TCP_DIAG=y |
171 | # CONFIG_TCP_CONG_ADVANCED is not set | 182 | # CONFIG_TCP_CONG_ADVANCED is not set |
172 | CONFIG_TCP_CONG_BIC=y | 183 | CONFIG_TCP_CONG_CUBIC=y |
184 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
173 | # CONFIG_IPV6 is not set | 185 | # CONFIG_IPV6 is not set |
174 | # CONFIG_INET6_XFRM_TUNNEL is not set | 186 | # CONFIG_INET6_XFRM_TUNNEL is not set |
175 | # CONFIG_INET6_TUNNEL is not set | 187 | # CONFIG_INET6_TUNNEL is not set |
@@ -199,7 +211,6 @@ CONFIG_TCP_CONG_BIC=y | |||
199 | # CONFIG_ATALK is not set | 211 | # CONFIG_ATALK is not set |
200 | # CONFIG_X25 is not set | 212 | # CONFIG_X25 is not set |
201 | # CONFIG_LAPB is not set | 213 | # CONFIG_LAPB is not set |
202 | # CONFIG_NET_DIVERT is not set | ||
203 | # CONFIG_ECONET is not set | 214 | # CONFIG_ECONET is not set |
204 | # CONFIG_WAN_ROUTER is not set | 215 | # CONFIG_WAN_ROUTER is not set |
205 | 216 | ||
@@ -212,7 +223,6 @@ CONFIG_TCP_CONG_BIC=y | |||
212 | # Network testing | 223 | # Network testing |
213 | # | 224 | # |
214 | # CONFIG_NET_PKTGEN is not set | 225 | # CONFIG_NET_PKTGEN is not set |
215 | # CONFIG_NET_TCPPROBE is not set | ||
216 | # CONFIG_HAMRADIO is not set | 226 | # CONFIG_HAMRADIO is not set |
217 | # CONFIG_IRDA is not set | 227 | # CONFIG_IRDA is not set |
218 | # CONFIG_BT is not set | 228 | # CONFIG_BT is not set |
@@ -239,7 +249,84 @@ CONFIG_STANDALONE=y | |||
239 | # | 249 | # |
240 | # Memory Technology Devices (MTD) | 250 | # Memory Technology Devices (MTD) |
241 | # | 251 | # |
242 | # CONFIG_MTD is not set | 252 | CONFIG_MTD=y |
253 | # CONFIG_MTD_DEBUG is not set | ||
254 | # CONFIG_MTD_CONCAT is not set | ||
255 | CONFIG_MTD_PARTITIONS=y | ||
256 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
257 | CONFIG_MTD_CMDLINE_PARTS=y | ||
258 | |||
259 | # | ||
260 | # User Modules And Translation Layers | ||
261 | # | ||
262 | CONFIG_MTD_CHAR=y | ||
263 | CONFIG_MTD_BLOCK=y | ||
264 | # CONFIG_FTL is not set | ||
265 | # CONFIG_NFTL is not set | ||
266 | # CONFIG_INFTL is not set | ||
267 | # CONFIG_RFD_FTL is not set | ||
268 | # CONFIG_SSFDC is not set | ||
269 | |||
270 | # | ||
271 | # RAM/ROM/Flash chip drivers | ||
272 | # | ||
273 | CONFIG_MTD_CFI=y | ||
274 | # CONFIG_MTD_JEDECPROBE is not set | ||
275 | CONFIG_MTD_GEN_PROBE=y | ||
276 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
277 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
278 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
279 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
280 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
281 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
282 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
283 | CONFIG_MTD_CFI_I1=y | ||
284 | CONFIG_MTD_CFI_I2=y | ||
285 | # CONFIG_MTD_CFI_I4 is not set | ||
286 | # CONFIG_MTD_CFI_I8 is not set | ||
287 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
288 | CONFIG_MTD_CFI_AMDSTD=y | ||
289 | # CONFIG_MTD_CFI_STAA is not set | ||
290 | CONFIG_MTD_CFI_UTIL=y | ||
291 | # CONFIG_MTD_RAM is not set | ||
292 | # CONFIG_MTD_ROM is not set | ||
293 | # CONFIG_MTD_ABSENT is not set | ||
294 | # CONFIG_MTD_OBSOLETE_CHIPS is not set | ||
295 | |||
296 | # | ||
297 | # Mapping drivers for chip access | ||
298 | # | ||
299 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
300 | CONFIG_MTD_PHYSMAP=y | ||
301 | CONFIG_MTD_PHYSMAP_START=0x8000000 | ||
302 | CONFIG_MTD_PHYSMAP_LEN=0x0 | ||
303 | CONFIG_MTD_PHYSMAP_BANKWIDTH=2 | ||
304 | # CONFIG_MTD_PLATRAM is not set | ||
305 | |||
306 | # | ||
307 | # Self-contained MTD device drivers | ||
308 | # | ||
309 | # CONFIG_MTD_SLRAM is not set | ||
310 | # CONFIG_MTD_PHRAM is not set | ||
311 | # CONFIG_MTD_MTDRAM is not set | ||
312 | # CONFIG_MTD_BLOCK2MTD is not set | ||
313 | |||
314 | # | ||
315 | # Disk-On-Chip Device Drivers | ||
316 | # | ||
317 | # CONFIG_MTD_DOC2000 is not set | ||
318 | # CONFIG_MTD_DOC2001 is not set | ||
319 | # CONFIG_MTD_DOC2001PLUS is not set | ||
320 | |||
321 | # | ||
322 | # NAND Flash Device Drivers | ||
323 | # | ||
324 | # CONFIG_MTD_NAND is not set | ||
325 | |||
326 | # | ||
327 | # OneNAND Flash Device Drivers | ||
328 | # | ||
329 | # CONFIG_MTD_ONENAND is not set | ||
243 | 330 | ||
244 | # | 331 | # |
245 | # Parallel port support | 332 | # Parallel port support |
@@ -260,11 +347,18 @@ CONFIG_BLK_DEV_NBD=m | |||
260 | CONFIG_BLK_DEV_RAM=m | 347 | CONFIG_BLK_DEV_RAM=m |
261 | CONFIG_BLK_DEV_RAM_COUNT=16 | 348 | CONFIG_BLK_DEV_RAM_COUNT=16 |
262 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 349 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
350 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
263 | CONFIG_BLK_DEV_INITRD=y | 351 | CONFIG_BLK_DEV_INITRD=y |
264 | # CONFIG_CDROM_PKTCDVD is not set | 352 | # CONFIG_CDROM_PKTCDVD is not set |
265 | # CONFIG_ATA_OVER_ETH is not set | 353 | # CONFIG_ATA_OVER_ETH is not set |
266 | 354 | ||
267 | # | 355 | # |
356 | # Misc devices | ||
357 | # | ||
358 | # CONFIG_SGI_IOC4 is not set | ||
359 | # CONFIG_TIFM_CORE is not set | ||
360 | |||
361 | # | ||
268 | # ATA/ATAPI/MFM/RLL support | 362 | # ATA/ATAPI/MFM/RLL support |
269 | # | 363 | # |
270 | # CONFIG_IDE is not set | 364 | # CONFIG_IDE is not set |
@@ -274,6 +368,12 @@ CONFIG_BLK_DEV_INITRD=y | |||
274 | # | 368 | # |
275 | # CONFIG_RAID_ATTRS is not set | 369 | # CONFIG_RAID_ATTRS is not set |
276 | # CONFIG_SCSI is not set | 370 | # CONFIG_SCSI is not set |
371 | # CONFIG_SCSI_NETLINK is not set | ||
372 | |||
373 | # | ||
374 | # Serial ATA (prod) and Parallel ATA (experimental) drivers | ||
375 | # | ||
376 | # CONFIG_ATA is not set | ||
277 | 377 | ||
278 | # | 378 | # |
279 | # Multi-device support (RAID and LVM) | 379 | # Multi-device support (RAID and LVM) |
@@ -305,14 +405,11 @@ CONFIG_TUN=m | |||
305 | # | 405 | # |
306 | # PHY device support | 406 | # PHY device support |
307 | # | 407 | # |
308 | # CONFIG_PHYLIB is not set | ||
309 | 408 | ||
310 | # | 409 | # |
311 | # Ethernet (10 or 100Mbit) | 410 | # Ethernet (10 or 100Mbit) |
312 | # | 411 | # |
313 | CONFIG_NET_ETHERNET=y | 412 | # CONFIG_NET_ETHERNET is not set |
314 | CONFIG_MII=y | ||
315 | CONFIG_MACB=y | ||
316 | 413 | ||
317 | # | 414 | # |
318 | # Ethernet (1000 Mbit) | 415 | # Ethernet (1000 Mbit) |
@@ -341,10 +438,11 @@ CONFIG_PPP=m | |||
341 | CONFIG_PPP_ASYNC=m | 438 | CONFIG_PPP_ASYNC=m |
342 | # CONFIG_PPP_SYNC_TTY is not set | 439 | # CONFIG_PPP_SYNC_TTY is not set |
343 | CONFIG_PPP_DEFLATE=m | 440 | CONFIG_PPP_DEFLATE=m |
344 | # CONFIG_PPP_BSDCOMP is not set | 441 | CONFIG_PPP_BSDCOMP=m |
345 | # CONFIG_PPP_MPPE is not set | 442 | # CONFIG_PPP_MPPE is not set |
346 | # CONFIG_PPPOE is not set | 443 | # CONFIG_PPPOE is not set |
347 | # CONFIG_SLIP is not set | 444 | # CONFIG_SLIP is not set |
445 | CONFIG_SLHC=m | ||
348 | # CONFIG_SHAPER is not set | 446 | # CONFIG_SHAPER is not set |
349 | # CONFIG_NETCONSOLE is not set | 447 | # CONFIG_NETCONSOLE is not set |
350 | # CONFIG_NETPOLL is not set | 448 | # CONFIG_NETPOLL is not set |
@@ -417,7 +515,6 @@ CONFIG_UNIX98_PTYS=y | |||
417 | # TPM devices | 515 | # TPM devices |
418 | # | 516 | # |
419 | # CONFIG_TCG_TPM is not set | 517 | # CONFIG_TCG_TPM is not set |
420 | # CONFIG_TELCLOCK is not set | ||
421 | 518 | ||
422 | # | 519 | # |
423 | # I2C support | 520 | # I2C support |
@@ -427,23 +524,13 @@ CONFIG_UNIX98_PTYS=y | |||
427 | # | 524 | # |
428 | # SPI support | 525 | # SPI support |
429 | # | 526 | # |
430 | CONFIG_SPI=y | 527 | # CONFIG_SPI is not set |
431 | # CONFIG_SPI_DEBUG is not set | 528 | # CONFIG_SPI_MASTER is not set |
432 | CONFIG_SPI_MASTER=y | ||
433 | |||
434 | # | ||
435 | # SPI Master Controller Drivers | ||
436 | # | ||
437 | CONFIG_SPI_ATMEL=m | ||
438 | # CONFIG_SPI_BITBANG is not set | ||
439 | |||
440 | # | ||
441 | # SPI Protocol Masters | ||
442 | # | ||
443 | 529 | ||
444 | # | 530 | # |
445 | # Dallas's 1-wire bus | 531 | # Dallas's 1-wire bus |
446 | # | 532 | # |
533 | # CONFIG_W1 is not set | ||
447 | 534 | ||
448 | # | 535 | # |
449 | # Hardware Monitoring support | 536 | # Hardware Monitoring support |
@@ -452,14 +539,9 @@ CONFIG_SPI_ATMEL=m | |||
452 | # CONFIG_HWMON_VID is not set | 539 | # CONFIG_HWMON_VID is not set |
453 | 540 | ||
454 | # | 541 | # |
455 | # Misc devices | ||
456 | # | ||
457 | |||
458 | # | ||
459 | # Multimedia devices | 542 | # Multimedia devices |
460 | # | 543 | # |
461 | # CONFIG_VIDEO_DEV is not set | 544 | # CONFIG_VIDEO_DEV is not set |
462 | CONFIG_VIDEO_V4L2=y | ||
463 | 545 | ||
464 | # | 546 | # |
465 | # Digital Video Broadcasting Devices | 547 | # Digital Video Broadcasting Devices |
@@ -470,28 +552,8 @@ CONFIG_VIDEO_V4L2=y | |||
470 | # Graphics support | 552 | # Graphics support |
471 | # | 553 | # |
472 | # CONFIG_FIRMWARE_EDID is not set | 554 | # CONFIG_FIRMWARE_EDID is not set |
473 | CONFIG_FB=m | 555 | # CONFIG_FB is not set |
474 | CONFIG_FB_CFB_FILLRECT=m | 556 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
475 | CONFIG_FB_CFB_COPYAREA=m | ||
476 | CONFIG_FB_CFB_IMAGEBLIT=m | ||
477 | # CONFIG_FB_MACMODES is not set | ||
478 | # CONFIG_FB_BACKLIGHT is not set | ||
479 | # CONFIG_FB_MODE_HELPERS is not set | ||
480 | # CONFIG_FB_TILEBLITTING is not set | ||
481 | CONFIG_FB_SIDSA=m | ||
482 | CONFIG_FB_SIDSA_DEFAULT_BPP=24 | ||
483 | # CONFIG_FB_S1D13XXX is not set | ||
484 | # CONFIG_FB_VIRTUAL is not set | ||
485 | |||
486 | # | ||
487 | # Logo configuration | ||
488 | # | ||
489 | # CONFIG_LOGO is not set | ||
490 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
491 | # CONFIG_BACKLIGHT_CLASS_DEVICE is not set | ||
492 | CONFIG_LCD_CLASS_DEVICE=m | ||
493 | CONFIG_LCD_DEVICE=y | ||
494 | CONFIG_LCD_LTV350QV=m | ||
495 | 557 | ||
496 | # | 558 | # |
497 | # Sound | 559 | # Sound |
@@ -561,18 +623,21 @@ CONFIG_LCD_LTV350QV=m | |||
561 | # | 623 | # |
562 | # File systems | 624 | # File systems |
563 | # | 625 | # |
564 | CONFIG_EXT2_FS=y | 626 | CONFIG_EXT2_FS=m |
565 | # CONFIG_EXT2_FS_XATTR is not set | 627 | # CONFIG_EXT2_FS_XATTR is not set |
566 | # CONFIG_EXT2_FS_XIP is not set | 628 | # CONFIG_EXT2_FS_XIP is not set |
567 | # CONFIG_EXT3_FS is not set | 629 | # CONFIG_EXT3_FS is not set |
630 | # CONFIG_EXT4DEV_FS is not set | ||
568 | # CONFIG_REISERFS_FS is not set | 631 | # CONFIG_REISERFS_FS is not set |
569 | # CONFIG_JFS_FS is not set | 632 | # CONFIG_JFS_FS is not set |
570 | # CONFIG_FS_POSIX_ACL is not set | 633 | # CONFIG_FS_POSIX_ACL is not set |
571 | # CONFIG_XFS_FS is not set | 634 | # CONFIG_XFS_FS is not set |
635 | # CONFIG_GFS2_FS is not set | ||
572 | # CONFIG_OCFS2_FS is not set | 636 | # CONFIG_OCFS2_FS is not set |
573 | CONFIG_MINIX_FS=m | 637 | CONFIG_MINIX_FS=m |
574 | CONFIG_ROMFS_FS=m | 638 | # CONFIG_ROMFS_FS is not set |
575 | # CONFIG_INOTIFY is not set | 639 | CONFIG_INOTIFY=y |
640 | CONFIG_INOTIFY_USER=y | ||
576 | # CONFIG_QUOTA is not set | 641 | # CONFIG_QUOTA is not set |
577 | # CONFIG_DNOTIFY is not set | 642 | # CONFIG_DNOTIFY is not set |
578 | # CONFIG_AUTOFS_FS is not set | 643 | # CONFIG_AUTOFS_FS is not set |
@@ -600,8 +665,10 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
600 | # | 665 | # |
601 | CONFIG_PROC_FS=y | 666 | CONFIG_PROC_FS=y |
602 | CONFIG_PROC_KCORE=y | 667 | CONFIG_PROC_KCORE=y |
668 | CONFIG_PROC_SYSCTL=y | ||
603 | CONFIG_SYSFS=y | 669 | CONFIG_SYSFS=y |
604 | CONFIG_TMPFS=y | 670 | CONFIG_TMPFS=y |
671 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
605 | # CONFIG_HUGETLB_PAGE is not set | 672 | # CONFIG_HUGETLB_PAGE is not set |
606 | CONFIG_RAMFS=y | 673 | CONFIG_RAMFS=y |
607 | CONFIG_CONFIGFS_FS=m | 674 | CONFIG_CONFIGFS_FS=m |
@@ -616,6 +683,16 @@ CONFIG_CONFIGFS_FS=m | |||
616 | # CONFIG_BEFS_FS is not set | 683 | # CONFIG_BEFS_FS is not set |
617 | # CONFIG_BFS_FS is not set | 684 | # CONFIG_BFS_FS is not set |
618 | # CONFIG_EFS_FS is not set | 685 | # CONFIG_EFS_FS is not set |
686 | # CONFIG_JFFS_FS is not set | ||
687 | CONFIG_JFFS2_FS=y | ||
688 | CONFIG_JFFS2_FS_DEBUG=0 | ||
689 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
690 | # CONFIG_JFFS2_SUMMARY is not set | ||
691 | # CONFIG_JFFS2_FS_XATTR is not set | ||
692 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
693 | CONFIG_JFFS2_ZLIB=y | ||
694 | CONFIG_JFFS2_RTIME=y | ||
695 | # CONFIG_JFFS2_RUBIN is not set | ||
619 | # CONFIG_CRAMFS is not set | 696 | # CONFIG_CRAMFS is not set |
620 | # CONFIG_VXFS_FS is not set | 697 | # CONFIG_VXFS_FS is not set |
621 | # CONFIG_HPFS_FS is not set | 698 | # CONFIG_HPFS_FS is not set |
@@ -626,26 +703,10 @@ CONFIG_CONFIGFS_FS=m | |||
626 | # | 703 | # |
627 | # Network File Systems | 704 | # Network File Systems |
628 | # | 705 | # |
629 | CONFIG_NFS_FS=y | 706 | # CONFIG_NFS_FS is not set |
630 | CONFIG_NFS_V3=y | ||
631 | # CONFIG_NFS_V3_ACL is not set | ||
632 | # CONFIG_NFS_V4 is not set | ||
633 | # CONFIG_NFS_DIRECTIO is not set | ||
634 | # CONFIG_NFSD is not set | 707 | # CONFIG_NFSD is not set |
635 | CONFIG_ROOT_NFS=y | ||
636 | CONFIG_LOCKD=y | ||
637 | CONFIG_LOCKD_V4=y | ||
638 | CONFIG_NFS_COMMON=y | ||
639 | CONFIG_SUNRPC=y | ||
640 | # CONFIG_RPCSEC_GSS_KRB5 is not set | ||
641 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
642 | # CONFIG_SMB_FS is not set | 708 | # CONFIG_SMB_FS is not set |
643 | CONFIG_CIFS=m | 709 | # CONFIG_CIFS is not set |
644 | # CONFIG_CIFS_STATS is not set | ||
645 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
646 | # CONFIG_CIFS_XATTR is not set | ||
647 | # CONFIG_CIFS_DEBUG2 is not set | ||
648 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
649 | # CONFIG_NCP_FS is not set | 710 | # CONFIG_NCP_FS is not set |
650 | # CONFIG_CODA_FS is not set | 711 | # CONFIG_CODA_FS is not set |
651 | # CONFIG_AFS_FS is not set | 712 | # CONFIG_AFS_FS is not set |
@@ -665,7 +726,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" | |||
665 | CONFIG_NLS_CODEPAGE_437=m | 726 | CONFIG_NLS_CODEPAGE_437=m |
666 | # CONFIG_NLS_CODEPAGE_737 is not set | 727 | # CONFIG_NLS_CODEPAGE_737 is not set |
667 | # CONFIG_NLS_CODEPAGE_775 is not set | 728 | # CONFIG_NLS_CODEPAGE_775 is not set |
668 | CONFIG_NLS_CODEPAGE_850=m | 729 | # CONFIG_NLS_CODEPAGE_850 is not set |
669 | # CONFIG_NLS_CODEPAGE_852 is not set | 730 | # CONFIG_NLS_CODEPAGE_852 is not set |
670 | # CONFIG_NLS_CODEPAGE_855 is not set | 731 | # CONFIG_NLS_CODEPAGE_855 is not set |
671 | # CONFIG_NLS_CODEPAGE_857 is not set | 732 | # CONFIG_NLS_CODEPAGE_857 is not set |
@@ -705,13 +766,17 @@ CONFIG_NLS_UTF8=m | |||
705 | # Kernel hacking | 766 | # Kernel hacking |
706 | # | 767 | # |
707 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 768 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
708 | CONFIG_PRINTK_TIME=y | 769 | # CONFIG_PRINTK_TIME is not set |
770 | CONFIG_ENABLE_MUST_CHECK=y | ||
709 | CONFIG_MAGIC_SYSRQ=y | 771 | CONFIG_MAGIC_SYSRQ=y |
710 | # CONFIG_UNUSED_SYMBOLS is not set | 772 | # CONFIG_UNUSED_SYMBOLS is not set |
711 | CONFIG_DEBUG_KERNEL=y | 773 | CONFIG_DEBUG_KERNEL=y |
712 | CONFIG_LOG_BUF_SHIFT=14 | 774 | CONFIG_LOG_BUF_SHIFT=14 |
713 | CONFIG_DETECT_SOFTLOCKUP=y | 775 | CONFIG_DETECT_SOFTLOCKUP=y |
714 | # CONFIG_SCHEDSTATS is not set | 776 | # CONFIG_SCHEDSTATS is not set |
777 | # CONFIG_DEBUG_SLAB is not set | ||
778 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
779 | # CONFIG_RT_MUTEX_TESTER is not set | ||
715 | # CONFIG_DEBUG_SPINLOCK is not set | 780 | # CONFIG_DEBUG_SPINLOCK is not set |
716 | # CONFIG_DEBUG_MUTEXES is not set | 781 | # CONFIG_DEBUG_MUTEXES is not set |
717 | # CONFIG_DEBUG_RWSEMS is not set | 782 | # CONFIG_DEBUG_RWSEMS is not set |
@@ -722,11 +787,13 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
722 | # CONFIG_DEBUG_INFO is not set | 787 | # CONFIG_DEBUG_INFO is not set |
723 | CONFIG_DEBUG_FS=y | 788 | CONFIG_DEBUG_FS=y |
724 | # CONFIG_DEBUG_VM is not set | 789 | # CONFIG_DEBUG_VM is not set |
790 | # CONFIG_DEBUG_LIST is not set | ||
725 | CONFIG_FRAME_POINTER=y | 791 | CONFIG_FRAME_POINTER=y |
726 | # CONFIG_UNWIND_INFO is not set | 792 | # CONFIG_UNWIND_INFO is not set |
727 | CONFIG_FORCED_INLINING=y | 793 | CONFIG_FORCED_INLINING=y |
794 | # CONFIG_HEADERS_CHECK is not set | ||
728 | # CONFIG_RCU_TORTURE_TEST is not set | 795 | # CONFIG_RCU_TORTURE_TEST is not set |
729 | CONFIG_KPROBES=y | 796 | # CONFIG_KPROBES is not set |
730 | 797 | ||
731 | # | 798 | # |
732 | # Security options | 799 | # Security options |
@@ -740,15 +807,13 @@ CONFIG_KPROBES=y | |||
740 | # CONFIG_CRYPTO is not set | 807 | # CONFIG_CRYPTO is not set |
741 | 808 | ||
742 | # | 809 | # |
743 | # Hardware crypto devices | ||
744 | # | ||
745 | |||
746 | # | ||
747 | # Library routines | 810 | # Library routines |
748 | # | 811 | # |
749 | CONFIG_CRC_CCITT=m | 812 | CONFIG_CRC_CCITT=m |
750 | # CONFIG_CRC16 is not set | 813 | # CONFIG_CRC16 is not set |
751 | CONFIG_CRC32=m | 814 | CONFIG_CRC32=y |
752 | # CONFIG_LIBCRC32C is not set | 815 | # CONFIG_LIBCRC32C is not set |
753 | CONFIG_ZLIB_INFLATE=m | 816 | CONFIG_AUDIT_GENERIC=y |
754 | CONFIG_ZLIB_DEFLATE=m | 817 | CONFIG_ZLIB_INFLATE=y |
818 | CONFIG_ZLIB_DEFLATE=y | ||
819 | CONFIG_PLIST=y | ||
diff --git a/arch/avr32/kernel/avr32_ksyms.c b/arch/avr32/kernel/avr32_ksyms.c index 04f767a272b7..372e3f8b2417 100644 --- a/arch/avr32/kernel/avr32_ksyms.c +++ b/arch/avr32/kernel/avr32_ksyms.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #include <linux/io.h> | ||
10 | #include <linux/module.h> | 11 | #include <linux/module.h> |
11 | 12 | ||
12 | #include <asm/checksum.h> | 13 | #include <asm/checksum.h> |
@@ -53,3 +54,11 @@ EXPORT_SYMBOL(find_next_zero_bit); | |||
53 | EXPORT_SYMBOL(find_first_bit); | 54 | EXPORT_SYMBOL(find_first_bit); |
54 | EXPORT_SYMBOL(find_next_bit); | 55 | EXPORT_SYMBOL(find_next_bit); |
55 | EXPORT_SYMBOL(generic_find_next_zero_le_bit); | 56 | EXPORT_SYMBOL(generic_find_next_zero_le_bit); |
57 | |||
58 | /* I/O primitives (lib/io-*.S) */ | ||
59 | EXPORT_SYMBOL(__raw_readsb); | ||
60 | EXPORT_SYMBOL(__raw_readsw); | ||
61 | EXPORT_SYMBOL(__raw_readsl); | ||
62 | EXPORT_SYMBOL(__raw_writesb); | ||
63 | EXPORT_SYMBOL(__raw_writesw); | ||
64 | EXPORT_SYMBOL(__raw_writesl); | ||
diff --git a/arch/avr32/kernel/kprobes.c b/arch/avr32/kernel/kprobes.c index 6caf9e8d8080..ca41fc1edbe1 100644 --- a/arch/avr32/kernel/kprobes.c +++ b/arch/avr32/kernel/kprobes.c | |||
@@ -109,7 +109,7 @@ static int __kprobes kprobe_handler(struct pt_regs *regs) | |||
109 | void *addr = (void *)regs->pc; | 109 | void *addr = (void *)regs->pc; |
110 | int ret = 0; | 110 | int ret = 0; |
111 | 111 | ||
112 | pr_debug("kprobe_handler: kprobe_running=%d\n", | 112 | pr_debug("kprobe_handler: kprobe_running=%p\n", |
113 | kprobe_running()); | 113 | kprobe_running()); |
114 | 114 | ||
115 | /* | 115 | /* |
diff --git a/arch/avr32/kernel/module.c b/arch/avr32/kernel/module.c index dfc32f2817b6..b599eae64576 100644 --- a/arch/avr32/kernel/module.c +++ b/arch/avr32/kernel/module.c | |||
@@ -263,7 +263,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | |||
263 | * value of PC. Just subtract the value of | 263 | * value of PC. Just subtract the value of |
264 | * GOT, and we're done. | 264 | * GOT, and we're done. |
265 | */ | 265 | */ |
266 | pr_debug("GOTPC: PC=0x%lx, got_offset=0x%lx, core=0x%p\n", | 266 | pr_debug("GOTPC: PC=0x%x, got_offset=0x%lx, core=0x%p\n", |
267 | relocation, module->arch.got_offset, | 267 | relocation, module->arch.got_offset, |
268 | module->module_core); | 268 | module->module_core); |
269 | relocation -= ((unsigned long)module->module_core | 269 | relocation -= ((unsigned long)module->module_core |
@@ -282,7 +282,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, | |||
282 | && (relocation & 0xffff0000) != 0xffff0000) | 282 | && (relocation & 0xffff0000) != 0xffff0000) |
283 | return reloc_overflow(module, "R_AVR32_GOT16S", | 283 | return reloc_overflow(module, "R_AVR32_GOT16S", |
284 | relocation); | 284 | relocation); |
285 | pr_debug("GOT reloc @ 0x%lx -> %lu\n", | 285 | pr_debug("GOT reloc @ 0x%x -> %u\n", |
286 | rel->r_offset, relocation); | 286 | rel->r_offset, relocation); |
287 | value = *location; | 287 | value = *location; |
288 | value = ((value & 0xffff0000) | 288 | value = ((value & 0xffff0000) |
diff --git a/arch/avr32/kernel/ptrace.c b/arch/avr32/kernel/ptrace.c index 3c89e59029ab..f2e81cd79002 100644 --- a/arch/avr32/kernel/ptrace.c +++ b/arch/avr32/kernel/ptrace.c | |||
@@ -157,7 +157,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
157 | unsigned long tmp; | 157 | unsigned long tmp; |
158 | int ret; | 158 | int ret; |
159 | 159 | ||
160 | pr_debug("arch_ptrace(%ld, %ld, %#lx, %#lx)\n", | 160 | pr_debug("arch_ptrace(%ld, %d, %#lx, %#lx)\n", |
161 | request, child->pid, addr, data); | 161 | request, child->pid, addr, data); |
162 | 162 | ||
163 | pr_debug("ptrace: Enabling monitor mode...\n"); | 163 | pr_debug("ptrace: Enabling monitor mode...\n"); |
diff --git a/arch/avr32/kernel/vmlinux.lds.c b/arch/avr32/kernel/vmlinux.lds.c index cdd627c6b7dc..5c4424e362b5 100644 --- a/arch/avr32/kernel/vmlinux.lds.c +++ b/arch/avr32/kernel/vmlinux.lds.c | |||
@@ -38,13 +38,7 @@ SECTIONS | |||
38 | __setup_end = .; | 38 | __setup_end = .; |
39 | . = ALIGN(4); | 39 | . = ALIGN(4); |
40 | __initcall_start = .; | 40 | __initcall_start = .; |
41 | *(.initcall1.init) | 41 | INITCALLS |
42 | *(.initcall2.init) | ||
43 | *(.initcall3.init) | ||
44 | *(.initcall4.init) | ||
45 | *(.initcall5.init) | ||
46 | *(.initcall6.init) | ||
47 | *(.initcall7.init) | ||
48 | __initcall_end = .; | 42 | __initcall_end = .; |
49 | __con_initcall_start = .; | 43 | __con_initcall_start = .; |
50 | *(.con_initcall.init) | 44 | *(.con_initcall.init) |
diff --git a/arch/avr32/lib/Makefile b/arch/avr32/lib/Makefile index 09ac43e40522..084d95bac5e7 100644 --- a/arch/avr32/lib/Makefile +++ b/arch/avr32/lib/Makefile | |||
@@ -7,4 +7,5 @@ lib-y += strncpy_from_user.o strnlen_user.o | |||
7 | lib-y += delay.o memset.o memcpy.o findbit.o | 7 | lib-y += delay.o memset.o memcpy.o findbit.o |
8 | lib-y += csum_partial.o csum_partial_copy_generic.o | 8 | lib-y += csum_partial.o csum_partial_copy_generic.o |
9 | lib-y += io-readsw.o io-readsl.o io-writesw.o io-writesl.o | 9 | lib-y += io-readsw.o io-readsl.o io-writesw.o io-writesl.o |
10 | lib-y += io-readsb.o io-writesb.o | ||
10 | lib-y += __avr32_lsl64.o __avr32_lsr64.o __avr32_asr64.o | 11 | lib-y += __avr32_lsl64.o __avr32_lsr64.o __avr32_asr64.o |
diff --git a/arch/avr32/lib/io-readsb.S b/arch/avr32/lib/io-readsb.S new file mode 100644 index 000000000000..b319d5e71749 --- /dev/null +++ b/arch/avr32/lib/io-readsb.S | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004-2006 Atmel Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | .text | ||
10 | .Lnot_word_aligned: | ||
11 | 1: ld.ub r8, r12[0] | ||
12 | sub r10, 1 | ||
13 | st.b r11++, r8 | ||
14 | reteq r12 | ||
15 | tst r11, r9 | ||
16 | brne 1b | ||
17 | |||
18 | /* fall through */ | ||
19 | |||
20 | .global __raw_readsb | ||
21 | .type __raw_readsb,@function | ||
22 | __raw_readsb: | ||
23 | cp.w r10, 0 | ||
24 | mov r9, 3 | ||
25 | reteq r12 | ||
26 | |||
27 | tst r11, r9 | ||
28 | brne .Lnot_word_aligned | ||
29 | |||
30 | sub r10, 4 | ||
31 | brlt 2f | ||
32 | |||
33 | 1: ldins.b r8:t, r12[0] | ||
34 | ldins.b r8:u, r12[0] | ||
35 | ldins.b r8:l, r12[0] | ||
36 | ldins.b r8:b, r12[0] | ||
37 | st.w r11++, r8 | ||
38 | sub r10, 4 | ||
39 | brge 1b | ||
40 | |||
41 | 2: sub r10, -4 | ||
42 | reteq r12 | ||
43 | |||
44 | 3: ld.uh r8, r12[0] | ||
45 | sub r10, 1 | ||
46 | st.b r11++, r8 | ||
47 | brne 3b | ||
diff --git a/arch/avr32/lib/io-writesb.S b/arch/avr32/lib/io-writesb.S new file mode 100644 index 000000000000..b4ebaacccf68 --- /dev/null +++ b/arch/avr32/lib/io-writesb.S | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2004-2006 Atmel Corporation | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | |||
9 | .text | ||
10 | .Lnot_word_aligned: | ||
11 | 1: ld.ub r8, r11++ | ||
12 | sub r10, 1 | ||
13 | st.b r12[0], r8 | ||
14 | reteq r12 | ||
15 | tst r11, r9 | ||
16 | brne 1b | ||
17 | |||
18 | /* fall through */ | ||
19 | |||
20 | .global __raw_writesb | ||
21 | .type __raw_writesb,@function | ||
22 | __raw_writesb: | ||
23 | cp.w r10, 0 | ||
24 | mov r9, 3 | ||
25 | reteq r12 | ||
26 | |||
27 | tst r11, r9 | ||
28 | brne .Lnot_word_aligned | ||
29 | |||
30 | sub r10, 4 | ||
31 | brlt 2f | ||
32 | |||
33 | 1: ld.w r8, r11++ | ||
34 | bfextu r9, r8, 24, 8 | ||
35 | st.b r12[0], r9 | ||
36 | bfextu r9, r8, 16, 8 | ||
37 | st.b r12[0], r9 | ||
38 | bfextu r9, r8, 8, 8 | ||
39 | st.b r12[0], r9 | ||
40 | st.b r12[0], r8 | ||
41 | sub r10, 4 | ||
42 | brge 1b | ||
43 | |||
44 | 2: sub r10, -4 | ||
45 | reteq r12 | ||
46 | |||
47 | 3: ld.ub r8, r11++ | ||
48 | sub r10, 1 | ||
49 | st.b r12[0], r8 | ||
50 | brne 3b | ||
51 | |||
52 | retal r12 | ||
diff --git a/arch/avr32/mach-at32ap/hsmc.h b/arch/avr32/mach-at32ap/hsmc.h index 5681276fafdb..d1d48e26e393 100644 --- a/arch/avr32/mach-at32ap/hsmc.h +++ b/arch/avr32/mach-at32ap/hsmc.h | |||
@@ -120,8 +120,8 @@ | |||
120 | 120 | ||
121 | /* Register access macros */ | 121 | /* Register access macros */ |
122 | #define hsmc_readl(port,reg) \ | 122 | #define hsmc_readl(port,reg) \ |
123 | readl((port)->regs + HSMC_##reg) | 123 | __raw_readl((port)->regs + HSMC_##reg) |
124 | #define hsmc_writel(port,reg,value) \ | 124 | #define hsmc_writel(port,reg,value) \ |
125 | writel((value), (port)->regs + HSMC_##reg) | 125 | __raw_writel((value), (port)->regs + HSMC_##reg) |
126 | 126 | ||
127 | #endif /* __ASM_AVR32_HSMC_H__ */ | 127 | #endif /* __ASM_AVR32_HSMC_H__ */ |
diff --git a/arch/avr32/mach-at32ap/intc.h b/arch/avr32/mach-at32ap/intc.h index d289ca2fff13..4d3664e43a8e 100644 --- a/arch/avr32/mach-at32ap/intc.h +++ b/arch/avr32/mach-at32ap/intc.h | |||
@@ -321,7 +321,9 @@ | |||
321 | #define INTC_MKBF(name, value) (((value) & ((1 << INTC_##name##_SIZE) - 1)) << INTC_##name##_OFFSET) | 321 | #define INTC_MKBF(name, value) (((value) & ((1 << INTC_##name##_SIZE) - 1)) << INTC_##name##_OFFSET) |
322 | #define INTC_GETBF(name, value) (((value) >> INTC_##name##_OFFSET) & ((1 << INTC_##name##_SIZE) - 1)) | 322 | #define INTC_GETBF(name, value) (((value) >> INTC_##name##_OFFSET) & ((1 << INTC_##name##_SIZE) - 1)) |
323 | 323 | ||
324 | #define intc_readl(port,reg) readl((port)->regs + INTC_##reg) | 324 | #define intc_readl(port,reg) \ |
325 | #define intc_writel(port,reg,value) writel((value), (port)->regs + INTC_##reg) | 325 | __raw_readl((port)->regs + INTC_##reg) |
326 | #define intc_writel(port,reg,value) \ | ||
327 | __raw_writel((value), (port)->regs + INTC_##reg) | ||
326 | 328 | ||
327 | #endif /* __ASM_AVR32_PERIHP_INTC_H__ */ | 329 | #endif /* __ASM_AVR32_PERIHP_INTC_H__ */ |
diff --git a/arch/avr32/mach-at32ap/pio.h b/arch/avr32/mach-at32ap/pio.h index cfea12351599..50fa3aca32c5 100644 --- a/arch/avr32/mach-at32ap/pio.h +++ b/arch/avr32/mach-at32ap/pio.h | |||
@@ -170,8 +170,10 @@ | |||
170 | #define PIO_BFINS(name,value,old) (((old) & ~(((1 << PIO_##name##_SIZE) - 1) << PIO_##name##_OFFSET)) | PIO_BF(name,value)) | 170 | #define PIO_BFINS(name,value,old) (((old) & ~(((1 << PIO_##name##_SIZE) - 1) << PIO_##name##_OFFSET)) | PIO_BF(name,value)) |
171 | 171 | ||
172 | /* Register access macros */ | 172 | /* Register access macros */ |
173 | #define pio_readl(port,reg) readl((port)->regs + PIO_##reg) | 173 | #define pio_readl(port,reg) \ |
174 | #define pio_writel(port,reg,value) writel((value), (port)->regs + PIO_##reg) | 174 | __raw_readl((port)->regs + PIO_##reg) |
175 | #define pio_writel(port,reg,value) \ | ||
176 | __raw_writel((value), (port)->regs + PIO_##reg) | ||
175 | 177 | ||
176 | void at32_init_pio(struct platform_device *pdev); | 178 | void at32_init_pio(struct platform_device *pdev); |
177 | 179 | ||
diff --git a/arch/avr32/mach-at32ap/sm.h b/arch/avr32/mach-at32ap/sm.h index 27565822ae2a..cad02b512bcb 100644 --- a/arch/avr32/mach-at32ap/sm.h +++ b/arch/avr32/mach-at32ap/sm.h | |||
@@ -234,7 +234,9 @@ | |||
234 | #define SM_BFINS(name,value,old) (((old) & ~(((1 << SM_##name##_SIZE) - 1) << SM_##name##_OFFSET)) | SM_BF(name,value)) | 234 | #define SM_BFINS(name,value,old) (((old) & ~(((1 << SM_##name##_SIZE) - 1) << SM_##name##_OFFSET)) | SM_BF(name,value)) |
235 | 235 | ||
236 | /* Register access macros */ | 236 | /* Register access macros */ |
237 | #define sm_readl(port,reg) readl((port)->regs + SM_##reg) | 237 | #define sm_readl(port,reg) \ |
238 | #define sm_writel(port,reg,value) writel((value), (port)->regs + SM_##reg) | 238 | __raw_readl((port)->regs + SM_##reg) |
239 | #define sm_writel(port,reg,value) \ | ||
240 | __raw_writel((value), (port)->regs + SM_##reg) | ||
239 | 241 | ||
240 | #endif /* __ASM_AVR32_SM_H__ */ | 242 | #endif /* __ASM_AVR32_SM_H__ */ |
diff --git a/arch/avr32/mm/init.c b/arch/avr32/mm/init.c index 3e6c41039808..70da6894acc1 100644 --- a/arch/avr32/mm/init.c +++ b/arch/avr32/mm/init.c | |||
@@ -206,7 +206,7 @@ void __init setup_bootmem(void) | |||
206 | 206 | ||
207 | if (mem_ramdisk) { | 207 | if (mem_ramdisk) { |
208 | #ifdef CONFIG_BLK_DEV_INITRD | 208 | #ifdef CONFIG_BLK_DEV_INITRD |
209 | initrd_start = __va(mem_ramdisk->addr); | 209 | initrd_start = (unsigned long)__va(mem_ramdisk->addr); |
210 | initrd_end = initrd_start + mem_ramdisk->size; | 210 | initrd_end = initrd_start + mem_ramdisk->size; |
211 | 211 | ||
212 | print_memory_map("RAMDISK images", mem_ramdisk); | 212 | print_memory_map("RAMDISK images", mem_ramdisk); |
diff --git a/arch/avr32/mm/ioremap.c b/arch/avr32/mm/ioremap.c index 8cfec65e37f7..3437c82434ac 100644 --- a/arch/avr32/mm/ioremap.c +++ b/arch/avr32/mm/ioremap.c | |||
@@ -77,6 +77,8 @@ void __iounmap(void __iomem *addr) | |||
77 | 77 | ||
78 | if ((unsigned long)addr >= P4SEG) | 78 | if ((unsigned long)addr >= P4SEG) |
79 | return; | 79 | return; |
80 | if (PXSEG(addr) == P2SEG) | ||
81 | return; | ||
80 | 82 | ||
81 | p = remove_vm_area((void *)(PAGE_MASK & (unsigned long __force)addr)); | 83 | p = remove_vm_area((void *)(PAGE_MASK & (unsigned long __force)addr)); |
82 | if (unlikely(!p)) { | 84 | if (unlikely(!p)) { |
diff --git a/arch/frv/kernel/vmlinux.lds.S b/arch/frv/kernel/vmlinux.lds.S index f474534ba78a..9c1fb12367fa 100644 --- a/arch/frv/kernel/vmlinux.lds.S +++ b/arch/frv/kernel/vmlinux.lds.S | |||
@@ -44,13 +44,7 @@ SECTIONS | |||
44 | 44 | ||
45 | __initcall_start = .; | 45 | __initcall_start = .; |
46 | .initcall.init : { | 46 | .initcall.init : { |
47 | *(.initcall1.init) | 47 | INITCALLS |
48 | *(.initcall2.init) | ||
49 | *(.initcall3.init) | ||
50 | *(.initcall4.init) | ||
51 | *(.initcall5.init) | ||
52 | *(.initcall6.init) | ||
53 | *(.initcall7.init) | ||
54 | } | 48 | } |
55 | __initcall_end = .; | 49 | __initcall_end = .; |
56 | __con_initcall_start = .; | 50 | __con_initcall_start = .; |
diff --git a/arch/h8300/kernel/vmlinux.lds.S b/arch/h8300/kernel/vmlinux.lds.S index 6406c388f88a..756325dd480e 100644 --- a/arch/h8300/kernel/vmlinux.lds.S +++ b/arch/h8300/kernel/vmlinux.lds.S | |||
@@ -118,13 +118,7 @@ SECTIONS | |||
118 | . = ALIGN(0x4) ; | 118 | . = ALIGN(0x4) ; |
119 | ___setup_end = .; | 119 | ___setup_end = .; |
120 | ___initcall_start = .; | 120 | ___initcall_start = .; |
121 | *(.initcall1.init) | 121 | INITCALLS |
122 | *(.initcall2.init) | ||
123 | *(.initcall3.init) | ||
124 | *(.initcall4.init) | ||
125 | *(.initcall5.init) | ||
126 | *(.initcall6.init) | ||
127 | *(.initcall7.init) | ||
128 | ___initcall_end = .; | 122 | ___initcall_end = .; |
129 | ___con_initcall_start = .; | 123 | ___con_initcall_start = .; |
130 | *(.con_initcall.init) | 124 | *(.con_initcall.init) |
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 519e63c3c130..141041dde74d 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
@@ -846,7 +846,7 @@ efi_find_max_pfn(unsigned long start, unsigned long end, void *arg) | |||
846 | static int __init | 846 | static int __init |
847 | efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg) | 847 | efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg) |
848 | { | 848 | { |
849 | memory_present(0, start, end); | 849 | memory_present(0, PFN_UP(start), PFN_DOWN(end)); |
850 | return 0; | 850 | return 0; |
851 | } | 851 | } |
852 | 852 | ||
diff --git a/arch/i386/kernel/vmlinux.lds.S b/arch/i386/kernel/vmlinux.lds.S index 1e7ac1c44ddc..adc1f232afee 100644 --- a/arch/i386/kernel/vmlinux.lds.S +++ b/arch/i386/kernel/vmlinux.lds.S | |||
@@ -126,13 +126,7 @@ SECTIONS | |||
126 | __setup_end = .; | 126 | __setup_end = .; |
127 | __initcall_start = .; | 127 | __initcall_start = .; |
128 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { | 128 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { |
129 | *(.initcall1.init) | 129 | INITCALLS |
130 | *(.initcall2.init) | ||
131 | *(.initcall3.init) | ||
132 | *(.initcall4.init) | ||
133 | *(.initcall5.init) | ||
134 | *(.initcall6.init) | ||
135 | *(.initcall7.init) | ||
136 | } | 130 | } |
137 | __initcall_end = .; | 131 | __initcall_end = .; |
138 | __con_initcall_start = .; | 132 | __con_initcall_start = .; |
diff --git a/arch/i386/mach-visws/visws_apic.c b/arch/i386/mach-visws/visws_apic.c index 07097ed48890..38c2b13124d9 100644 --- a/arch/i386/mach-visws/visws_apic.c +++ b/arch/i386/mach-visws/visws_apic.c | |||
@@ -122,7 +122,7 @@ static void end_cobalt_irq(unsigned int irq) | |||
122 | spin_unlock_irqrestore(&cobalt_lock, flags); | 122 | spin_unlock_irqrestore(&cobalt_lock, flags); |
123 | } | 123 | } |
124 | 124 | ||
125 | static struct hw_interrupt_type cobalt_irq_type = { | 125 | static struct irq_chip cobalt_irq_type = { |
126 | .typename = "Cobalt-APIC", | 126 | .typename = "Cobalt-APIC", |
127 | .startup = startup_cobalt_irq, | 127 | .startup = startup_cobalt_irq, |
128 | .shutdown = disable_cobalt_irq, | 128 | .shutdown = disable_cobalt_irq, |
@@ -159,7 +159,7 @@ static void end_piix4_master_irq(unsigned int irq) | |||
159 | spin_unlock_irqrestore(&cobalt_lock, flags); | 159 | spin_unlock_irqrestore(&cobalt_lock, flags); |
160 | } | 160 | } |
161 | 161 | ||
162 | static struct hw_interrupt_type piix4_master_irq_type = { | 162 | static struct irq_chip piix4_master_irq_type = { |
163 | .typename = "PIIX4-master", | 163 | .typename = "PIIX4-master", |
164 | .startup = startup_piix4_master_irq, | 164 | .startup = startup_piix4_master_irq, |
165 | .ack = ack_cobalt_irq, | 165 | .ack = ack_cobalt_irq, |
@@ -167,9 +167,8 @@ static struct hw_interrupt_type piix4_master_irq_type = { | |||
167 | }; | 167 | }; |
168 | 168 | ||
169 | 169 | ||
170 | static struct hw_interrupt_type piix4_virtual_irq_type = { | 170 | static struct irq_chip piix4_virtual_irq_type = { |
171 | .typename = "PIIX4-virtual", | 171 | .typename = "PIIX4-virtual", |
172 | .startup = startup_8259A_irq, | ||
173 | .shutdown = disable_8259A_irq, | 172 | .shutdown = disable_8259A_irq, |
174 | .enable = enable_8259A_irq, | 173 | .enable = enable_8259A_irq, |
175 | .disable = disable_8259A_irq, | 174 | .disable = disable_8259A_irq, |
diff --git a/arch/i386/pci/fixup.c b/arch/i386/pci/fixup.c index 908b410f4c93..c1949ff38d61 100644 --- a/arch/i386/pci/fixup.c +++ b/arch/i386/pci/fixup.c | |||
@@ -343,6 +343,61 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC, pcie_ro | |||
343 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_rootport_aspm_quirk ); | 343 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_rootport_aspm_quirk ); |
344 | 344 | ||
345 | /* | 345 | /* |
346 | * Fixup to mark boot BIOS video selected by BIOS before it changes | ||
347 | * | ||
348 | * From information provided by "Jon Smirl" <jonsmirl@gmail.com> | ||
349 | * | ||
350 | * The standard boot ROM sequence for an x86 machine uses the BIOS | ||
351 | * to select an initial video card for boot display. This boot video | ||
352 | * card will have it's BIOS copied to C0000 in system RAM. | ||
353 | * IORESOURCE_ROM_SHADOW is used to associate the boot video | ||
354 | * card with this copy. On laptops this copy has to be used since | ||
355 | * the main ROM may be compressed or combined with another image. | ||
356 | * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW | ||
357 | * is marked here since the boot video device will be the only enabled | ||
358 | * video device at this point. | ||
359 | */ | ||
360 | |||
361 | static void __devinit pci_fixup_video(struct pci_dev *pdev) | ||
362 | { | ||
363 | struct pci_dev *bridge; | ||
364 | struct pci_bus *bus; | ||
365 | u16 config; | ||
366 | |||
367 | if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) | ||
368 | return; | ||
369 | |||
370 | /* Is VGA routed to us? */ | ||
371 | bus = pdev->bus; | ||
372 | while (bus) { | ||
373 | bridge = bus->self; | ||
374 | |||
375 | /* | ||
376 | * From information provided by | ||
377 | * "David Miller" <davem@davemloft.net> | ||
378 | * The bridge control register is valid for PCI header | ||
379 | * type BRIDGE, or CARDBUS. Host to PCI controllers use | ||
380 | * PCI header type NORMAL. | ||
381 | */ | ||
382 | if (bridge | ||
383 | &&((bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE) | ||
384 | ||(bridge->hdr_type == PCI_HEADER_TYPE_CARDBUS))) { | ||
385 | pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, | ||
386 | &config); | ||
387 | if (!(config & PCI_BRIDGE_CTL_VGA)) | ||
388 | return; | ||
389 | } | ||
390 | bus = bus->parent; | ||
391 | } | ||
392 | pci_read_config_word(pdev, PCI_COMMAND, &config); | ||
393 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | ||
394 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; | ||
395 | printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev)); | ||
396 | } | ||
397 | } | ||
398 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); | ||
399 | |||
400 | /* | ||
346 | * Some Toshiba laptops need extra code to enable their TI TSB43AB22/A. | 401 | * Some Toshiba laptops need extra code to enable their TI TSB43AB22/A. |
347 | * | 402 | * |
348 | * We pretend to bring them out of full D3 state, and restore the proper | 403 | * We pretend to bring them out of full D3 state, and restore the proper |
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index b3b2e389d6b2..d6083a0936f4 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
@@ -128,13 +128,7 @@ SECTIONS | |||
128 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) | 128 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) |
129 | { | 129 | { |
130 | __initcall_start = .; | 130 | __initcall_start = .; |
131 | *(.initcall1.init) | 131 | INITCALLS |
132 | *(.initcall2.init) | ||
133 | *(.initcall3.init) | ||
134 | *(.initcall4.init) | ||
135 | *(.initcall5.init) | ||
136 | *(.initcall6.init) | ||
137 | *(.initcall7.init) | ||
138 | __initcall_end = .; | 132 | __initcall_end = .; |
139 | } | 133 | } |
140 | 134 | ||
diff --git a/arch/ia64/pci/Makefile b/arch/ia64/pci/Makefile index e66889e6922a..fb14dc520d2d 100644 --- a/arch/ia64/pci/Makefile +++ b/arch/ia64/pci/Makefile | |||
@@ -1,4 +1,4 @@ | |||
1 | # | 1 | # |
2 | # Makefile for the ia64-specific parts of the pci bus | 2 | # Makefile for the ia64-specific parts of the pci bus |
3 | # | 3 | # |
4 | obj-y := pci.o | 4 | obj-y := pci.o fixup.o |
diff --git a/arch/ia64/pci/fixup.c b/arch/ia64/pci/fixup.c new file mode 100644 index 000000000000..245dc1fedc24 --- /dev/null +++ b/arch/ia64/pci/fixup.c | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * Exceptions for specific devices. Usually work-arounds for fatal design flaws. | ||
3 | * Derived from fixup.c of i386 tree. | ||
4 | */ | ||
5 | |||
6 | #include <linux/pci.h> | ||
7 | #include <linux/init.h> | ||
8 | |||
9 | #include <asm/machvec.h> | ||
10 | |||
11 | /* | ||
12 | * Fixup to mark boot BIOS video selected by BIOS before it changes | ||
13 | * | ||
14 | * From information provided by "Jon Smirl" <jonsmirl@gmail.com> | ||
15 | * | ||
16 | * The standard boot ROM sequence for an x86 machine uses the BIOS | ||
17 | * to select an initial video card for boot display. This boot video | ||
18 | * card will have it's BIOS copied to C0000 in system RAM. | ||
19 | * IORESOURCE_ROM_SHADOW is used to associate the boot video | ||
20 | * card with this copy. On laptops this copy has to be used since | ||
21 | * the main ROM may be compressed or combined with another image. | ||
22 | * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW | ||
23 | * is marked here since the boot video device will be the only enabled | ||
24 | * video device at this point. | ||
25 | */ | ||
26 | |||
27 | static void __devinit pci_fixup_video(struct pci_dev *pdev) | ||
28 | { | ||
29 | struct pci_dev *bridge; | ||
30 | struct pci_bus *bus; | ||
31 | u16 config; | ||
32 | |||
33 | if ((strcmp(platform_name, "dig") != 0) | ||
34 | && (strcmp(platform_name, "hpzx1") != 0)) | ||
35 | return; | ||
36 | /* Maybe, this machine supports legacy memory map. */ | ||
37 | |||
38 | if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) | ||
39 | return; | ||
40 | |||
41 | /* Is VGA routed to us? */ | ||
42 | bus = pdev->bus; | ||
43 | while (bus) { | ||
44 | bridge = bus->self; | ||
45 | |||
46 | /* | ||
47 | * From information provided by | ||
48 | * "David Miller" <davem@davemloft.net> | ||
49 | * The bridge control register is valid for PCI header | ||
50 | * type BRIDGE, or CARDBUS. Host to PCI controllers use | ||
51 | * PCI header type NORMAL. | ||
52 | */ | ||
53 | if (bridge | ||
54 | &&((bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE) | ||
55 | ||(bridge->hdr_type == PCI_HEADER_TYPE_CARDBUS))) { | ||
56 | pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, | ||
57 | &config); | ||
58 | if (!(config & PCI_BRIDGE_CTL_VGA)) | ||
59 | return; | ||
60 | } | ||
61 | bus = bus->parent; | ||
62 | } | ||
63 | pci_read_config_word(pdev, PCI_COMMAND, &config); | ||
64 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | ||
65 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; | ||
66 | printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev)); | ||
67 | } | ||
68 | } | ||
69 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); | ||
diff --git a/arch/m32r/kernel/vmlinux.lds.S b/arch/m32r/kernel/vmlinux.lds.S index 13c7bb698e37..358b9cee2c65 100644 --- a/arch/m32r/kernel/vmlinux.lds.S +++ b/arch/m32r/kernel/vmlinux.lds.S | |||
@@ -83,13 +83,7 @@ SECTIONS | |||
83 | __setup_end = .; | 83 | __setup_end = .; |
84 | __initcall_start = .; | 84 | __initcall_start = .; |
85 | .initcall.init : { | 85 | .initcall.init : { |
86 | *(.initcall1.init) | 86 | INITCALLS |
87 | *(.initcall2.init) | ||
88 | *(.initcall3.init) | ||
89 | *(.initcall4.init) | ||
90 | *(.initcall5.init) | ||
91 | *(.initcall6.init) | ||
92 | *(.initcall7.init) | ||
93 | } | 87 | } |
94 | __initcall_end = .; | 88 | __initcall_end = .; |
95 | __con_initcall_start = .; | 89 | __con_initcall_start = .; |
diff --git a/arch/m68k/kernel/vmlinux-std.lds b/arch/m68k/kernel/vmlinux-std.lds index 69d1d3d30c78..d2794452b195 100644 --- a/arch/m68k/kernel/vmlinux-std.lds +++ b/arch/m68k/kernel/vmlinux-std.lds | |||
@@ -54,13 +54,7 @@ SECTIONS | |||
54 | __setup_end = .; | 54 | __setup_end = .; |
55 | __initcall_start = .; | 55 | __initcall_start = .; |
56 | .initcall.init : { | 56 | .initcall.init : { |
57 | *(.initcall1.init) | 57 | INITCALLS |
58 | *(.initcall2.init) | ||
59 | *(.initcall3.init) | ||
60 | *(.initcall4.init) | ||
61 | *(.initcall5.init) | ||
62 | *(.initcall6.init) | ||
63 | *(.initcall7.init) | ||
64 | } | 58 | } |
65 | __initcall_end = .; | 59 | __initcall_end = .; |
66 | __con_initcall_start = .; | 60 | __con_initcall_start = .; |
diff --git a/arch/m68k/kernel/vmlinux-sun3.lds b/arch/m68k/kernel/vmlinux-sun3.lds index 65cc39c24185..2550b4ae2732 100644 --- a/arch/m68k/kernel/vmlinux-sun3.lds +++ b/arch/m68k/kernel/vmlinux-sun3.lds | |||
@@ -48,13 +48,7 @@ __init_begin = .; | |||
48 | __setup_end = .; | 48 | __setup_end = .; |
49 | __initcall_start = .; | 49 | __initcall_start = .; |
50 | .initcall.init : { | 50 | .initcall.init : { |
51 | *(.initcall1.init) | 51 | INITCALLS |
52 | *(.initcall2.init) | ||
53 | *(.initcall3.init) | ||
54 | *(.initcall4.init) | ||
55 | *(.initcall5.init) | ||
56 | *(.initcall6.init) | ||
57 | *(.initcall7.init) | ||
58 | } | 52 | } |
59 | __initcall_end = .; | 53 | __initcall_end = .; |
60 | __con_initcall_start = .; | 54 | __con_initcall_start = .; |
diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index ccd2ceb05cfb..58afa8be604e 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S | |||
@@ -140,13 +140,7 @@ SECTIONS { | |||
140 | *(.init.setup) | 140 | *(.init.setup) |
141 | __setup_end = .; | 141 | __setup_end = .; |
142 | __initcall_start = .; | 142 | __initcall_start = .; |
143 | *(.initcall1.init) | 143 | INITCALLS |
144 | *(.initcall2.init) | ||
145 | *(.initcall3.init) | ||
146 | *(.initcall4.init) | ||
147 | *(.initcall5.init) | ||
148 | *(.initcall6.init) | ||
149 | *(.initcall7.init) | ||
150 | __initcall_end = .; | 144 | __initcall_end = .; |
151 | __con_initcall_start = .; | 145 | __con_initcall_start = .; |
152 | *(.con_initcall.init) | 146 | *(.con_initcall.init) |
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S index 0bb9cd889456..25ed3337ce35 100644 --- a/arch/mips/kernel/vmlinux.lds.S +++ b/arch/mips/kernel/vmlinux.lds.S | |||
@@ -91,13 +91,7 @@ SECTIONS | |||
91 | 91 | ||
92 | __initcall_start = .; | 92 | __initcall_start = .; |
93 | .initcall.init : { | 93 | .initcall.init : { |
94 | *(.initcall1.init) | 94 | INITCALLS |
95 | *(.initcall2.init) | ||
96 | *(.initcall3.init) | ||
97 | *(.initcall4.init) | ||
98 | *(.initcall5.init) | ||
99 | *(.initcall6.init) | ||
100 | *(.initcall7.init) | ||
101 | } | 95 | } |
102 | __initcall_end = .; | 96 | __initcall_end = .; |
103 | 97 | ||
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index b3677fc8eef5..7b943b45f7cd 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
@@ -153,13 +153,7 @@ SECTIONS | |||
153 | __setup_end = .; | 153 | __setup_end = .; |
154 | __initcall_start = .; | 154 | __initcall_start = .; |
155 | .initcall.init : { | 155 | .initcall.init : { |
156 | *(.initcall1.init) | 156 | INITCALLS |
157 | *(.initcall2.init) | ||
158 | *(.initcall3.init) | ||
159 | *(.initcall4.init) | ||
160 | *(.initcall5.init) | ||
161 | *(.initcall6.init) | ||
162 | *(.initcall7.init) | ||
163 | } | 157 | } |
164 | __initcall_end = .; | 158 | __initcall_end = .; |
165 | __con_initcall_start = .; | 159 | __con_initcall_start = .; |
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 37ddfcab0003..4b2be611f77f 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile | |||
@@ -115,7 +115,7 @@ endif | |||
115 | quiet_cmd_wrap = WRAP $@ | 115 | quiet_cmd_wrap = WRAP $@ |
116 | cmd_wrap =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) vmlinux | 116 | cmd_wrap =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) vmlinux |
117 | quiet_cmd_wrap_initrd = WRAP $@ | 117 | quiet_cmd_wrap_initrd = WRAP $@ |
118 | cmd_wrap_initrd =$(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \ | 118 | cmd_wrap_initrd =$(CONFIG_SHELL) $(wrapper) -c -o $@ -p $2 $(CROSSWRAP) \ |
119 | -i $(obj)/ramdisk.image.gz vmlinux | 119 | -i $(obj)/ramdisk.image.gz vmlinux |
120 | 120 | ||
121 | $(obj)/zImage.chrp: vmlinux $(wrapperbits) | 121 | $(obj)/zImage.chrp: vmlinux $(wrapperbits) |
diff --git a/arch/powerpc/configs/cell_defconfig b/arch/powerpc/configs/cell_defconfig index 892d5dd3254e..0aba06d7d2ec 100644 --- a/arch/powerpc/configs/cell_defconfig +++ b/arch/powerpc/configs/cell_defconfig | |||
@@ -254,6 +254,7 @@ CONFIG_SYN_COOKIES=y | |||
254 | CONFIG_INET_TUNNEL=y | 254 | CONFIG_INET_TUNNEL=y |
255 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | 255 | CONFIG_INET_XFRM_MODE_TRANSPORT=y |
256 | CONFIG_INET_XFRM_MODE_TUNNEL=y | 256 | CONFIG_INET_XFRM_MODE_TUNNEL=y |
257 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
257 | CONFIG_INET_DIAG=y | 258 | CONFIG_INET_DIAG=y |
258 | CONFIG_INET_TCP_DIAG=y | 259 | CONFIG_INET_TCP_DIAG=y |
259 | # CONFIG_TCP_CONG_ADVANCED is not set | 260 | # CONFIG_TCP_CONG_ADVANCED is not set |
@@ -275,7 +276,9 @@ CONFIG_INET6_XFRM_TUNNEL=m | |||
275 | CONFIG_INET6_TUNNEL=m | 276 | CONFIG_INET6_TUNNEL=m |
276 | CONFIG_INET6_XFRM_MODE_TRANSPORT=y | 277 | CONFIG_INET6_XFRM_MODE_TRANSPORT=y |
277 | CONFIG_INET6_XFRM_MODE_TUNNEL=y | 278 | CONFIG_INET6_XFRM_MODE_TUNNEL=y |
279 | # CONFIG_INET6_XFRM_MODE_BEET is not set | ||
278 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | 280 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set |
281 | # CONFIG_IPV6_SIT is not set | ||
279 | CONFIG_IPV6_TUNNEL=m | 282 | CONFIG_IPV6_TUNNEL=m |
280 | # CONFIG_IPV6_SUBTREES is not set | 283 | # CONFIG_IPV6_SUBTREES is not set |
281 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | 284 | # CONFIG_IPV6_MULTIPLE_TABLES is not set |
@@ -406,6 +409,12 @@ CONFIG_BLK_DEV_INITRD=y | |||
406 | # CONFIG_ATA_OVER_ETH is not set | 409 | # CONFIG_ATA_OVER_ETH is not set |
407 | 410 | ||
408 | # | 411 | # |
412 | # Misc devices | ||
413 | # | ||
414 | # CONFIG_SGI_IOC4 is not set | ||
415 | # CONFIG_TIFM_CORE is not set | ||
416 | |||
417 | # | ||
409 | # ATA/ATAPI/MFM/RLL support | 418 | # ATA/ATAPI/MFM/RLL support |
410 | # | 419 | # |
411 | CONFIG_IDE=y | 420 | CONFIG_IDE=y |
@@ -738,7 +747,6 @@ CONFIG_GEN_RTC=y | |||
738 | # TPM devices | 747 | # TPM devices |
739 | # | 748 | # |
740 | # CONFIG_TCG_TPM is not set | 749 | # CONFIG_TCG_TPM is not set |
741 | # CONFIG_TELCLOCK is not set | ||
742 | 750 | ||
743 | # | 751 | # |
744 | # I2C support | 752 | # I2C support |
@@ -802,6 +810,7 @@ CONFIG_I2C_ALGOBIT=y | |||
802 | # | 810 | # |
803 | # Dallas's 1-wire bus | 811 | # Dallas's 1-wire bus |
804 | # | 812 | # |
813 | # CONFIG_W1 is not set | ||
805 | 814 | ||
806 | # | 815 | # |
807 | # Hardware Monitoring support | 816 | # Hardware Monitoring support |
@@ -810,14 +819,9 @@ CONFIG_I2C_ALGOBIT=y | |||
810 | # CONFIG_HWMON_VID is not set | 819 | # CONFIG_HWMON_VID is not set |
811 | 820 | ||
812 | # | 821 | # |
813 | # Misc devices | ||
814 | # | ||
815 | |||
816 | # | ||
817 | # Multimedia devices | 822 | # Multimedia devices |
818 | # | 823 | # |
819 | # CONFIG_VIDEO_DEV is not set | 824 | # CONFIG_VIDEO_DEV is not set |
820 | CONFIG_VIDEO_V4L2=y | ||
821 | 825 | ||
822 | # | 826 | # |
823 | # Digital Video Broadcasting Devices | 827 | # Digital Video Broadcasting Devices |
@@ -923,6 +927,7 @@ CONFIG_EXT3_FS=y | |||
923 | CONFIG_EXT3_FS_XATTR=y | 927 | CONFIG_EXT3_FS_XATTR=y |
924 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 928 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
925 | # CONFIG_EXT3_FS_SECURITY is not set | 929 | # CONFIG_EXT3_FS_SECURITY is not set |
930 | # CONFIG_EXT4DEV_FS is not set | ||
926 | CONFIG_JBD=y | 931 | CONFIG_JBD=y |
927 | # CONFIG_JBD_DEBUG is not set | 932 | # CONFIG_JBD_DEBUG is not set |
928 | CONFIG_FS_MBCACHE=y | 933 | CONFIG_FS_MBCACHE=y |
@@ -930,6 +935,7 @@ CONFIG_FS_MBCACHE=y | |||
930 | # CONFIG_JFS_FS is not set | 935 | # CONFIG_JFS_FS is not set |
931 | CONFIG_FS_POSIX_ACL=y | 936 | CONFIG_FS_POSIX_ACL=y |
932 | # CONFIG_XFS_FS is not set | 937 | # CONFIG_XFS_FS is not set |
938 | # CONFIG_GFS2_FS is not set | ||
933 | # CONFIG_OCFS2_FS is not set | 939 | # CONFIG_OCFS2_FS is not set |
934 | # CONFIG_MINIX_FS is not set | 940 | # CONFIG_MINIX_FS is not set |
935 | # CONFIG_ROMFS_FS is not set | 941 | # CONFIG_ROMFS_FS is not set |
@@ -1129,6 +1135,7 @@ CONFIG_DEBUG_FS=y | |||
1129 | # CONFIG_DEBUG_VM is not set | 1135 | # CONFIG_DEBUG_VM is not set |
1130 | # CONFIG_DEBUG_LIST is not set | 1136 | # CONFIG_DEBUG_LIST is not set |
1131 | # CONFIG_FORCED_INLINING is not set | 1137 | # CONFIG_FORCED_INLINING is not set |
1138 | # CONFIG_HEADERS_CHECK is not set | ||
1132 | # CONFIG_RCU_TORTURE_TEST is not set | 1139 | # CONFIG_RCU_TORTURE_TEST is not set |
1133 | # CONFIG_DEBUG_STACKOVERFLOW is not set | 1140 | # CONFIG_DEBUG_STACKOVERFLOW is not set |
1134 | # CONFIG_DEBUG_STACK_USAGE is not set | 1141 | # CONFIG_DEBUG_STACK_USAGE is not set |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 95382f994404..bfd499ee3753 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | #include <asm/oprofile_impl.h> | 19 | #include <asm/oprofile_impl.h> |
20 | #include <asm/cputable.h> | 20 | #include <asm/cputable.h> |
21 | #include <asm/prom.h> /* for PTRRELOC on ARCH=ppc */ | ||
21 | 22 | ||
22 | struct cpu_spec* cur_cpu_spec = NULL; | 23 | struct cpu_spec* cur_cpu_spec = NULL; |
23 | EXPORT_SYMBOL(cur_cpu_spec); | 24 | EXPORT_SYMBOL(cur_cpu_spec); |
@@ -73,7 +74,7 @@ extern void __restore_cpu_ppc970(void); | |||
73 | #define PPC_FEATURE_SPE_COMP 0 | 74 | #define PPC_FEATURE_SPE_COMP 0 |
74 | #endif | 75 | #endif |
75 | 76 | ||
76 | struct cpu_spec cpu_specs[] = { | 77 | static struct cpu_spec cpu_specs[] = { |
77 | #ifdef CONFIG_PPC64 | 78 | #ifdef CONFIG_PPC64 |
78 | { /* Power3 */ | 79 | { /* Power3 */ |
79 | .pvr_mask = 0xffff0000, | 80 | .pvr_mask = 0xffff0000, |
@@ -227,6 +228,21 @@ struct cpu_spec cpu_specs[] = { | |||
227 | .oprofile_type = PPC_OPROFILE_POWER4, | 228 | .oprofile_type = PPC_OPROFILE_POWER4, |
228 | .platform = "ppc970", | 229 | .platform = "ppc970", |
229 | }, | 230 | }, |
231 | { /* PPC970GX */ | ||
232 | .pvr_mask = 0xffff0000, | ||
233 | .pvr_value = 0x00450000, | ||
234 | .cpu_name = "PPC970GX", | ||
235 | .cpu_features = CPU_FTRS_PPC970, | ||
236 | .cpu_user_features = COMMON_USER_POWER4 | | ||
237 | PPC_FEATURE_HAS_ALTIVEC_COMP, | ||
238 | .icache_bsize = 128, | ||
239 | .dcache_bsize = 128, | ||
240 | .num_pmcs = 8, | ||
241 | .cpu_setup = __setup_cpu_ppc970, | ||
242 | .oprofile_cpu_type = "ppc64/970", | ||
243 | .oprofile_type = PPC_OPROFILE_POWER4, | ||
244 | .platform = "ppc970", | ||
245 | }, | ||
230 | { /* Power5 GR */ | 246 | { /* Power5 GR */ |
231 | .pvr_mask = 0xffff0000, | 247 | .pvr_mask = 0xffff0000, |
232 | .pvr_value = 0x003a0000, | 248 | .pvr_value = 0x003a0000, |
@@ -1152,3 +1168,71 @@ struct cpu_spec cpu_specs[] = { | |||
1152 | #endif /* !CLASSIC_PPC */ | 1168 | #endif /* !CLASSIC_PPC */ |
1153 | #endif /* CONFIG_PPC32 */ | 1169 | #endif /* CONFIG_PPC32 */ |
1154 | }; | 1170 | }; |
1171 | |||
1172 | struct cpu_spec *identify_cpu(unsigned long offset) | ||
1173 | { | ||
1174 | struct cpu_spec *s = cpu_specs; | ||
1175 | struct cpu_spec **cur = &cur_cpu_spec; | ||
1176 | unsigned int pvr = mfspr(SPRN_PVR); | ||
1177 | int i; | ||
1178 | |||
1179 | s = PTRRELOC(s); | ||
1180 | cur = PTRRELOC(cur); | ||
1181 | |||
1182 | if (*cur != NULL) | ||
1183 | return PTRRELOC(*cur); | ||
1184 | |||
1185 | for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) | ||
1186 | if ((pvr & s->pvr_mask) == s->pvr_value) { | ||
1187 | *cur = cpu_specs + i; | ||
1188 | #ifdef CONFIG_PPC64 | ||
1189 | /* ppc64 expects identify_cpu to also call setup_cpu | ||
1190 | * for that processor. I will consolidate that at a | ||
1191 | * later time, for now, just use our friend #ifdef. | ||
1192 | * we also don't need to PTRRELOC the function pointer | ||
1193 | * on ppc64 as we are running at 0 in real mode. | ||
1194 | */ | ||
1195 | if (s->cpu_setup) { | ||
1196 | s->cpu_setup(offset, s); | ||
1197 | } | ||
1198 | #endif /* CONFIG_PPC64 */ | ||
1199 | return s; | ||
1200 | } | ||
1201 | BUG(); | ||
1202 | return NULL; | ||
1203 | } | ||
1204 | |||
1205 | void do_feature_fixups(unsigned long value, void *fixup_start, void *fixup_end) | ||
1206 | { | ||
1207 | struct fixup_entry { | ||
1208 | unsigned long mask; | ||
1209 | unsigned long value; | ||
1210 | long start_off; | ||
1211 | long end_off; | ||
1212 | } *fcur, *fend; | ||
1213 | |||
1214 | fcur = fixup_start; | ||
1215 | fend = fixup_end; | ||
1216 | |||
1217 | for (; fcur < fend; fcur++) { | ||
1218 | unsigned int *pstart, *pend, *p; | ||
1219 | |||
1220 | if ((value & fcur->mask) == fcur->value) | ||
1221 | continue; | ||
1222 | |||
1223 | /* These PTRRELOCs will disappear once the new scheme for | ||
1224 | * modules and vdso is implemented | ||
1225 | */ | ||
1226 | pstart = ((unsigned int *)fcur) + (fcur->start_off / 4); | ||
1227 | pend = ((unsigned int *)fcur) + (fcur->end_off / 4); | ||
1228 | |||
1229 | for (p = pstart; p < pend; p++) { | ||
1230 | *p = 0x60000000u; | ||
1231 | asm volatile ("dcbst 0, %0" : : "r" (p)); | ||
1232 | } | ||
1233 | asm volatile ("sync" : : : "memory"); | ||
1234 | for (p = pstart; p < pend; p++) | ||
1235 | asm volatile ("icbi 0,%0" : : "r" (p)); | ||
1236 | asm volatile ("sync; isync" : : : "memory"); | ||
1237 | } | ||
1238 | } | ||
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 645c7f10fb28..291e3629b504 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -1580,11 +1580,6 @@ _STATIC(__start_initialization_iSeries) | |||
1580 | li r0,0 | 1580 | li r0,0 |
1581 | stdu r0,-STACK_FRAME_OVERHEAD(r1) | 1581 | stdu r0,-STACK_FRAME_OVERHEAD(r1) |
1582 | 1582 | ||
1583 | LOAD_REG_IMMEDIATE(r3,cpu_specs) | ||
1584 | LOAD_REG_IMMEDIATE(r4,cur_cpu_spec) | ||
1585 | li r5,0 | ||
1586 | bl .identify_cpu | ||
1587 | |||
1588 | LOAD_REG_IMMEDIATE(r2,__toc_start) | 1583 | LOAD_REG_IMMEDIATE(r2,__toc_start) |
1589 | addi r2,r2,0x4000 | 1584 | addi r2,r2,0x4000 |
1590 | addi r2,r2,0x4000 | 1585 | addi r2,r2,0x4000 |
@@ -1646,6 +1641,8 @@ _GLOBAL(__start_initialization_multiplatform) | |||
1646 | cmpwi r0,0x3c /* 970FX */ | 1641 | cmpwi r0,0x3c /* 970FX */ |
1647 | beq 1f | 1642 | beq 1f |
1648 | cmpwi r0,0x44 /* 970MP */ | 1643 | cmpwi r0,0x44 /* 970MP */ |
1644 | beq 1f | ||
1645 | cmpwi r0,0x45 /* 970GX */ | ||
1649 | bne 2f | 1646 | bne 2f |
1650 | 1: bl .__cpu_preinit_ppc970 | 1647 | 1: bl .__cpu_preinit_ppc970 |
1651 | 2: | 1648 | 2: |
@@ -1964,13 +1961,6 @@ _STATIC(start_here_multiplatform) | |||
1964 | addi r2,r2,0x4000 | 1961 | addi r2,r2,0x4000 |
1965 | add r2,r2,r26 | 1962 | add r2,r2,r26 |
1966 | 1963 | ||
1967 | LOAD_REG_IMMEDIATE(r3, cpu_specs) | ||
1968 | add r3,r3,r26 | ||
1969 | LOAD_REG_IMMEDIATE(r4,cur_cpu_spec) | ||
1970 | add r4,r4,r26 | ||
1971 | mr r5,r26 | ||
1972 | bl .identify_cpu | ||
1973 | |||
1974 | /* Do very early kernel initializations, including initial hash table, | 1964 | /* Do very early kernel initializations, including initial hash table, |
1975 | * stab and slb setup before we turn on relocation. */ | 1965 | * stab and slb setup before we turn on relocation. */ |
1976 | 1966 | ||
@@ -2000,13 +1990,6 @@ _STATIC(start_here_common) | |||
2000 | li r0,0 | 1990 | li r0,0 |
2001 | stdu r0,-STACK_FRAME_OVERHEAD(r1) | 1991 | stdu r0,-STACK_FRAME_OVERHEAD(r1) |
2002 | 1992 | ||
2003 | /* Apply the CPUs-specific fixups (nop out sections not relevant | ||
2004 | * to this CPU | ||
2005 | */ | ||
2006 | li r3,0 | ||
2007 | bl .do_cpu_ftr_fixups | ||
2008 | bl .do_fw_ftr_fixups | ||
2009 | |||
2010 | /* ptr to current */ | 1993 | /* ptr to current */ |
2011 | LOAD_REG_IMMEDIATE(r4, init_task) | 1994 | LOAD_REG_IMMEDIATE(r4, init_task) |
2012 | std r4,PACACURRENT(r13) | 1995 | std r4,PACACURRENT(r13) |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 88fd73fdf048..412bea3cf813 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -102,80 +102,6 @@ _GLOBAL(reloc_got2) | |||
102 | blr | 102 | blr |
103 | 103 | ||
104 | /* | 104 | /* |
105 | * identify_cpu, | ||
106 | * called with r3 = data offset and r4 = CPU number | ||
107 | * doesn't change r3 | ||
108 | */ | ||
109 | _GLOBAL(identify_cpu) | ||
110 | addis r8,r3,cpu_specs@ha | ||
111 | addi r8,r8,cpu_specs@l | ||
112 | mfpvr r7 | ||
113 | 1: | ||
114 | lwz r5,CPU_SPEC_PVR_MASK(r8) | ||
115 | and r5,r5,r7 | ||
116 | lwz r6,CPU_SPEC_PVR_VALUE(r8) | ||
117 | cmplw 0,r6,r5 | ||
118 | beq 1f | ||
119 | addi r8,r8,CPU_SPEC_ENTRY_SIZE | ||
120 | b 1b | ||
121 | 1: | ||
122 | addis r6,r3,cur_cpu_spec@ha | ||
123 | addi r6,r6,cur_cpu_spec@l | ||
124 | sub r8,r8,r3 | ||
125 | stw r8,0(r6) | ||
126 | blr | ||
127 | |||
128 | /* | ||
129 | * do_cpu_ftr_fixups - goes through the list of CPU feature fixups | ||
130 | * and writes nop's over sections of code that don't apply for this cpu. | ||
131 | * r3 = data offset (not changed) | ||
132 | */ | ||
133 | _GLOBAL(do_cpu_ftr_fixups) | ||
134 | /* Get CPU 0 features */ | ||
135 | addis r6,r3,cur_cpu_spec@ha | ||
136 | addi r6,r6,cur_cpu_spec@l | ||
137 | lwz r4,0(r6) | ||
138 | add r4,r4,r3 | ||
139 | lwz r4,CPU_SPEC_FEATURES(r4) | ||
140 | |||
141 | /* Get the fixup table */ | ||
142 | addis r6,r3,__start___ftr_fixup@ha | ||
143 | addi r6,r6,__start___ftr_fixup@l | ||
144 | addis r7,r3,__stop___ftr_fixup@ha | ||
145 | addi r7,r7,__stop___ftr_fixup@l | ||
146 | |||
147 | /* Do the fixup */ | ||
148 | 1: cmplw 0,r6,r7 | ||
149 | bgelr | ||
150 | addi r6,r6,16 | ||
151 | lwz r8,-16(r6) /* mask */ | ||
152 | and r8,r8,r4 | ||
153 | lwz r9,-12(r6) /* value */ | ||
154 | cmplw 0,r8,r9 | ||
155 | beq 1b | ||
156 | lwz r8,-8(r6) /* section begin */ | ||
157 | lwz r9,-4(r6) /* section end */ | ||
158 | subf. r9,r8,r9 | ||
159 | beq 1b | ||
160 | /* write nops over the section of code */ | ||
161 | /* todo: if large section, add a branch at the start of it */ | ||
162 | srwi r9,r9,2 | ||
163 | mtctr r9 | ||
164 | add r8,r8,r3 | ||
165 | lis r0,0x60000000@h /* nop */ | ||
166 | 3: stw r0,0(r8) | ||
167 | andi. r10,r4,CPU_FTR_SPLIT_ID_CACHE@l | ||
168 | beq 2f | ||
169 | dcbst 0,r8 /* suboptimal, but simpler */ | ||
170 | sync | ||
171 | icbi 0,r8 | ||
172 | 2: addi r8,r8,4 | ||
173 | bdnz 3b | ||
174 | sync /* additional sync needed on g4 */ | ||
175 | isync | ||
176 | b 1b | ||
177 | |||
178 | /* | ||
179 | * call_setup_cpu - call the setup_cpu function for this cpu | 105 | * call_setup_cpu - call the setup_cpu function for this cpu |
180 | * r3 = data offset, r24 = cpu number | 106 | * r3 = data offset, r24 = cpu number |
181 | * | 107 | * |
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index c70e20708a1f..21fd2c662a99 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -246,130 +246,6 @@ _GLOBAL(__flush_dcache_icache) | |||
246 | isync | 246 | isync |
247 | blr | 247 | blr |
248 | 248 | ||
249 | /* | ||
250 | * identify_cpu and calls setup_cpu | ||
251 | * In: r3 = base of the cpu_specs array | ||
252 | * r4 = address of cur_cpu_spec | ||
253 | * r5 = relocation offset | ||
254 | */ | ||
255 | _GLOBAL(identify_cpu) | ||
256 | mfpvr r7 | ||
257 | 1: | ||
258 | lwz r8,CPU_SPEC_PVR_MASK(r3) | ||
259 | and r8,r8,r7 | ||
260 | lwz r9,CPU_SPEC_PVR_VALUE(r3) | ||
261 | cmplw 0,r9,r8 | ||
262 | beq 1f | ||
263 | addi r3,r3,CPU_SPEC_ENTRY_SIZE | ||
264 | b 1b | ||
265 | 1: | ||
266 | sub r0,r3,r5 | ||
267 | std r0,0(r4) | ||
268 | ld r4,CPU_SPEC_SETUP(r3) | ||
269 | cmpdi 0,r4,0 | ||
270 | add r4,r4,r5 | ||
271 | beqlr | ||
272 | ld r4,0(r4) | ||
273 | add r4,r4,r5 | ||
274 | mtctr r4 | ||
275 | /* Calling convention for cpu setup is r3=offset, r4=cur_cpu_spec */ | ||
276 | mr r4,r3 | ||
277 | mr r3,r5 | ||
278 | bctr | ||
279 | |||
280 | /* | ||
281 | * do_cpu_ftr_fixups - goes through the list of CPU feature fixups | ||
282 | * and writes nop's over sections of code that don't apply for this cpu. | ||
283 | * r3 = data offset (not changed) | ||
284 | */ | ||
285 | _GLOBAL(do_cpu_ftr_fixups) | ||
286 | /* Get CPU 0 features */ | ||
287 | LOAD_REG_IMMEDIATE(r6,cur_cpu_spec) | ||
288 | sub r6,r6,r3 | ||
289 | ld r4,0(r6) | ||
290 | sub r4,r4,r3 | ||
291 | ld r4,CPU_SPEC_FEATURES(r4) | ||
292 | /* Get the fixup table */ | ||
293 | LOAD_REG_IMMEDIATE(r6,__start___ftr_fixup) | ||
294 | sub r6,r6,r3 | ||
295 | LOAD_REG_IMMEDIATE(r7,__stop___ftr_fixup) | ||
296 | sub r7,r7,r3 | ||
297 | /* Do the fixup */ | ||
298 | 1: cmpld r6,r7 | ||
299 | bgelr | ||
300 | addi r6,r6,32 | ||
301 | ld r8,-32(r6) /* mask */ | ||
302 | and r8,r8,r4 | ||
303 | ld r9,-24(r6) /* value */ | ||
304 | cmpld r8,r9 | ||
305 | beq 1b | ||
306 | ld r8,-16(r6) /* section begin */ | ||
307 | ld r9,-8(r6) /* section end */ | ||
308 | subf. r9,r8,r9 | ||
309 | beq 1b | ||
310 | /* write nops over the section of code */ | ||
311 | /* todo: if large section, add a branch at the start of it */ | ||
312 | srwi r9,r9,2 | ||
313 | mtctr r9 | ||
314 | sub r8,r8,r3 | ||
315 | lis r0,0x60000000@h /* nop */ | ||
316 | 3: stw r0,0(r8) | ||
317 | andi. r10,r4,CPU_FTR_SPLIT_ID_CACHE@l | ||
318 | beq 2f | ||
319 | dcbst 0,r8 /* suboptimal, but simpler */ | ||
320 | sync | ||
321 | icbi 0,r8 | ||
322 | 2: addi r8,r8,4 | ||
323 | bdnz 3b | ||
324 | sync /* additional sync needed on g4 */ | ||
325 | isync | ||
326 | b 1b | ||
327 | |||
328 | /* | ||
329 | * do_fw_ftr_fixups - goes through the list of firmware feature fixups | ||
330 | * and writes nop's over sections of code that don't apply for this firmware. | ||
331 | * r3 = data offset (not changed) | ||
332 | */ | ||
333 | _GLOBAL(do_fw_ftr_fixups) | ||
334 | /* Get firmware features */ | ||
335 | LOAD_REG_IMMEDIATE(r6,powerpc_firmware_features) | ||
336 | sub r6,r6,r3 | ||
337 | ld r4,0(r6) | ||
338 | /* Get the fixup table */ | ||
339 | LOAD_REG_IMMEDIATE(r6,__start___fw_ftr_fixup) | ||
340 | sub r6,r6,r3 | ||
341 | LOAD_REG_IMMEDIATE(r7,__stop___fw_ftr_fixup) | ||
342 | sub r7,r7,r3 | ||
343 | /* Do the fixup */ | ||
344 | 1: cmpld r6,r7 | ||
345 | bgelr | ||
346 | addi r6,r6,32 | ||
347 | ld r8,-32(r6) /* mask */ | ||
348 | and r8,r8,r4 | ||
349 | ld r9,-24(r6) /* value */ | ||
350 | cmpld r8,r9 | ||
351 | beq 1b | ||
352 | ld r8,-16(r6) /* section begin */ | ||
353 | ld r9,-8(r6) /* section end */ | ||
354 | subf. r9,r8,r9 | ||
355 | beq 1b | ||
356 | /* write nops over the section of code */ | ||
357 | /* todo: if large section, add a branch at the start of it */ | ||
358 | srwi r9,r9,2 | ||
359 | mtctr r9 | ||
360 | sub r8,r8,r3 | ||
361 | lis r0,0x60000000@h /* nop */ | ||
362 | 3: stw r0,0(r8) | ||
363 | BEGIN_FTR_SECTION | ||
364 | dcbst 0,r8 /* suboptimal, but simpler */ | ||
365 | sync | ||
366 | icbi 0,r8 | ||
367 | END_FTR_SECTION_IFSET(CPU_FTR_SPLIT_ID_CACHE) | ||
368 | addi r8,r8,4 | ||
369 | bdnz 3b | ||
370 | sync /* additional sync needed on g4 */ | ||
371 | isync | ||
372 | b 1b | ||
373 | 249 | ||
374 | #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) | 250 | #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) |
375 | /* | 251 | /* |
diff --git a/arch/powerpc/kernel/module_32.c b/arch/powerpc/kernel/module_32.c index 92f4e5f64f02..e2c3c6a85f33 100644 --- a/arch/powerpc/kernel/module_32.c +++ b/arch/powerpc/kernel/module_32.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
25 | #include <linux/cache.h> | 25 | #include <linux/cache.h> |
26 | 26 | ||
27 | #include "setup.h" | ||
28 | |||
27 | #if 0 | 29 | #if 0 |
28 | #define DEBUGP printk | 30 | #define DEBUGP printk |
29 | #else | 31 | #else |
@@ -269,33 +271,50 @@ int apply_relocate_add(Elf32_Shdr *sechdrs, | |||
269 | return 0; | 271 | return 0; |
270 | } | 272 | } |
271 | 273 | ||
274 | static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, | ||
275 | const Elf_Shdr *sechdrs, | ||
276 | const char *name) | ||
277 | { | ||
278 | char *secstrings; | ||
279 | unsigned int i; | ||
280 | |||
281 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | ||
282 | for (i = 1; i < hdr->e_shnum; i++) | ||
283 | if (strcmp(secstrings+sechdrs[i].sh_name, name) == 0) | ||
284 | return &sechdrs[i]; | ||
285 | return NULL; | ||
286 | } | ||
287 | |||
272 | int module_finalize(const Elf_Ehdr *hdr, | 288 | int module_finalize(const Elf_Ehdr *hdr, |
273 | const Elf_Shdr *sechdrs, | 289 | const Elf_Shdr *sechdrs, |
274 | struct module *me) | 290 | struct module *me) |
275 | { | 291 | { |
276 | char *secstrings; | 292 | const Elf_Shdr *sect; |
277 | unsigned int i; | ||
278 | 293 | ||
279 | me->arch.bug_table = NULL; | 294 | me->arch.bug_table = NULL; |
280 | me->arch.num_bugs = 0; | 295 | me->arch.num_bugs = 0; |
281 | 296 | ||
282 | /* Find the __bug_table section, if present */ | 297 | /* Find the __bug_table section, if present */ |
283 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 298 | sect = find_section(hdr, sechdrs, "__bug_table"); |
284 | for (i = 1; i < hdr->e_shnum; i++) { | 299 | if (sect != NULL) { |
285 | if (strcmp(secstrings+sechdrs[i].sh_name, "__bug_table")) | 300 | me->arch.bug_table = (void *) sect->sh_addr; |
286 | continue; | 301 | me->arch.num_bugs = sect->sh_size / sizeof(struct bug_entry); |
287 | me->arch.bug_table = (void *) sechdrs[i].sh_addr; | ||
288 | me->arch.num_bugs = sechdrs[i].sh_size / sizeof(struct bug_entry); | ||
289 | break; | ||
290 | } | 302 | } |
291 | 303 | ||
292 | /* | 304 | /* |
293 | * Strictly speaking this should have a spinlock to protect against | 305 | * Strictly speaking this should have a spinlock to protect against |
294 | * traversals, but since we only traverse on BUG()s, a spinlock | 306 | * traversals, but since we only traverse on BUG()s, a spinlock |
295 | * could potentially lead to deadlock and thus be counter-productive. | 307 | * could potentially lead to deadlock and thus be counter-productive. |
296 | */ | 308 | */ |
297 | list_add(&me->arch.bug_list, &module_bug_list); | 309 | list_add(&me->arch.bug_list, &module_bug_list); |
298 | 310 | ||
311 | /* Apply feature fixups */ | ||
312 | sect = find_section(hdr, sechdrs, "__ftr_fixup"); | ||
313 | if (sect != NULL) | ||
314 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
315 | (void *)sect->sh_addr, | ||
316 | (void *)sect->sh_addr + sect->sh_size); | ||
317 | |||
299 | return 0; | 318 | return 0; |
300 | } | 319 | } |
301 | 320 | ||
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index ba34001fca8e..8dd1f0aae5d6 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c | |||
@@ -22,6 +22,9 @@ | |||
22 | #include <linux/vmalloc.h> | 22 | #include <linux/vmalloc.h> |
23 | #include <asm/module.h> | 23 | #include <asm/module.h> |
24 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
25 | #include <asm/firmware.h> | ||
26 | |||
27 | #include "setup.h" | ||
25 | 28 | ||
26 | /* FIXME: We don't do .init separately. To do this, we'd need to have | 29 | /* FIXME: We don't do .init separately. To do this, we'd need to have |
27 | a separate r2 value in the init and core section, and stub between | 30 | a separate r2 value in the init and core section, and stub between |
@@ -400,6 +403,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
400 | | (value & 0x03fffffc); | 403 | | (value & 0x03fffffc); |
401 | break; | 404 | break; |
402 | 405 | ||
406 | case R_PPC64_REL64: | ||
407 | /* 64 bits relative (used by features fixups) */ | ||
408 | *location = value - (unsigned long)location; | ||
409 | break; | ||
410 | |||
403 | default: | 411 | default: |
404 | printk("%s: Unknown ADD relocation: %lu\n", | 412 | printk("%s: Unknown ADD relocation: %lu\n", |
405 | me->name, | 413 | me->name, |
@@ -413,23 +421,33 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
413 | 421 | ||
414 | LIST_HEAD(module_bug_list); | 422 | LIST_HEAD(module_bug_list); |
415 | 423 | ||
416 | int module_finalize(const Elf_Ehdr *hdr, | 424 | static const Elf_Shdr *find_section(const Elf_Ehdr *hdr, |
417 | const Elf_Shdr *sechdrs, struct module *me) | 425 | const Elf_Shdr *sechdrs, |
426 | const char *name) | ||
418 | { | 427 | { |
419 | char *secstrings; | 428 | char *secstrings; |
420 | unsigned int i; | 429 | unsigned int i; |
421 | 430 | ||
431 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | ||
432 | for (i = 1; i < hdr->e_shnum; i++) | ||
433 | if (strcmp(secstrings+sechdrs[i].sh_name, name) == 0) | ||
434 | return &sechdrs[i]; | ||
435 | return NULL; | ||
436 | } | ||
437 | |||
438 | int module_finalize(const Elf_Ehdr *hdr, | ||
439 | const Elf_Shdr *sechdrs, struct module *me) | ||
440 | { | ||
441 | const Elf_Shdr *sect; | ||
442 | |||
422 | me->arch.bug_table = NULL; | 443 | me->arch.bug_table = NULL; |
423 | me->arch.num_bugs = 0; | 444 | me->arch.num_bugs = 0; |
424 | 445 | ||
425 | /* Find the __bug_table section, if present */ | 446 | /* Find the __bug_table section, if present */ |
426 | secstrings = (char *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 447 | sect = find_section(hdr, sechdrs, "__bug_table"); |
427 | for (i = 1; i < hdr->e_shnum; i++) { | 448 | if (sect != NULL) { |
428 | if (strcmp(secstrings+sechdrs[i].sh_name, "__bug_table")) | 449 | me->arch.bug_table = (void *) sect->sh_addr; |
429 | continue; | 450 | me->arch.num_bugs = sect->sh_size / sizeof(struct bug_entry); |
430 | me->arch.bug_table = (void *) sechdrs[i].sh_addr; | ||
431 | me->arch.num_bugs = sechdrs[i].sh_size / sizeof(struct bug_entry); | ||
432 | break; | ||
433 | } | 451 | } |
434 | 452 | ||
435 | /* | 453 | /* |
@@ -439,6 +457,19 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
439 | */ | 457 | */ |
440 | list_add(&me->arch.bug_list, &module_bug_list); | 458 | list_add(&me->arch.bug_list, &module_bug_list); |
441 | 459 | ||
460 | /* Apply feature fixups */ | ||
461 | sect = find_section(hdr, sechdrs, "__ftr_fixup"); | ||
462 | if (sect != NULL) | ||
463 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
464 | (void *)sect->sh_addr, | ||
465 | (void *)sect->sh_addr + sect->sh_size); | ||
466 | |||
467 | sect = find_section(hdr, sechdrs, "__fw_ftr_fixup"); | ||
468 | if (sect != NULL) | ||
469 | do_feature_fixups(powerpc_firmware_features, | ||
470 | (void *)sect->sh_addr, | ||
471 | (void *)sect->sh_addr + sect->sh_size); | ||
472 | |||
442 | return 0; | 473 | return 0; |
443 | } | 474 | } |
444 | 475 | ||
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 865b9648d0d5..bdb412d4b748 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c | |||
@@ -1014,7 +1014,7 @@ EXPORT_SYMBOL(find_all_nodes); | |||
1014 | /** Checks if the given "compat" string matches one of the strings in | 1014 | /** Checks if the given "compat" string matches one of the strings in |
1015 | * the device's "compatible" property | 1015 | * the device's "compatible" property |
1016 | */ | 1016 | */ |
1017 | int device_is_compatible(struct device_node *device, const char *compat) | 1017 | int device_is_compatible(const struct device_node *device, const char *compat) |
1018 | { | 1018 | { |
1019 | const char* cp; | 1019 | const char* cp; |
1020 | int cplen, l; | 1020 | int cplen, l; |
@@ -1491,7 +1491,8 @@ static int __init prom_reconfig_setup(void) | |||
1491 | __initcall(prom_reconfig_setup); | 1491 | __initcall(prom_reconfig_setup); |
1492 | #endif | 1492 | #endif |
1493 | 1493 | ||
1494 | struct property *of_find_property(struct device_node *np, const char *name, | 1494 | struct property *of_find_property(const struct device_node *np, |
1495 | const char *name, | ||
1495 | int *lenp) | 1496 | int *lenp) |
1496 | { | 1497 | { |
1497 | struct property *pp; | 1498 | struct property *pp; |
@@ -1512,7 +1513,8 @@ struct property *of_find_property(struct device_node *np, const char *name, | |||
1512 | * Find a property with a given name for a given node | 1513 | * Find a property with a given name for a given node |
1513 | * and return the value. | 1514 | * and return the value. |
1514 | */ | 1515 | */ |
1515 | const void *get_property(struct device_node *np, const char *name, int *lenp) | 1516 | const void *get_property(const struct device_node *np, const char *name, |
1517 | int *lenp) | ||
1516 | { | 1518 | { |
1517 | struct property *pp = of_find_property(np,name,lenp); | 1519 | struct property *pp = of_find_property(np,name,lenp); |
1518 | return pp ? pp->value : NULL; | 1520 | return pp ? pp->value : NULL; |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index 191d0ab09222..a4c2964a3ca6 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
@@ -91,6 +91,7 @@ int ucache_bsize; | |||
91 | unsigned long __init early_init(unsigned long dt_ptr) | 91 | unsigned long __init early_init(unsigned long dt_ptr) |
92 | { | 92 | { |
93 | unsigned long offset = reloc_offset(); | 93 | unsigned long offset = reloc_offset(); |
94 | struct cpu_spec *spec; | ||
94 | 95 | ||
95 | /* First zero the BSS -- use memset_io, some platforms don't have | 96 | /* First zero the BSS -- use memset_io, some platforms don't have |
96 | * caches on yet */ | 97 | * caches on yet */ |
@@ -100,8 +101,11 @@ unsigned long __init early_init(unsigned long dt_ptr) | |||
100 | * Identify the CPU type and fix up code sections | 101 | * Identify the CPU type and fix up code sections |
101 | * that depend on which cpu we have. | 102 | * that depend on which cpu we have. |
102 | */ | 103 | */ |
103 | identify_cpu(offset, 0); | 104 | spec = identify_cpu(offset); |
104 | do_cpu_ftr_fixups(offset); | 105 | |
106 | do_feature_fixups(spec->cpu_features, | ||
107 | PTRRELOC(&__start___ftr_fixup), | ||
108 | PTRRELOC(&__stop___ftr_fixup)); | ||
105 | 109 | ||
106 | return KERNELBASE + offset; | 110 | return KERNELBASE + offset; |
107 | } | 111 | } |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index 4b2e32eab9dc..16278968dab6 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -170,6 +170,9 @@ void __init setup_paca(int cpu) | |||
170 | 170 | ||
171 | void __init early_setup(unsigned long dt_ptr) | 171 | void __init early_setup(unsigned long dt_ptr) |
172 | { | 172 | { |
173 | /* Identify CPU type */ | ||
174 | identify_cpu(0); | ||
175 | |||
173 | /* Assume we're on cpu 0 for now. Don't write to the paca yet! */ | 176 | /* Assume we're on cpu 0 for now. Don't write to the paca yet! */ |
174 | setup_paca(0); | 177 | setup_paca(0); |
175 | 178 | ||
@@ -348,6 +351,14 @@ void __init setup_system(void) | |||
348 | { | 351 | { |
349 | DBG(" -> setup_system()\n"); | 352 | DBG(" -> setup_system()\n"); |
350 | 353 | ||
354 | /* Apply the CPUs-specific and firmware specific fixups to kernel | ||
355 | * text (nop out sections not relevant to this CPU or this firmware) | ||
356 | */ | ||
357 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
358 | &__start___ftr_fixup, &__stop___ftr_fixup); | ||
359 | do_feature_fixups(powerpc_firmware_features, | ||
360 | &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup); | ||
361 | |||
351 | /* | 362 | /* |
352 | * Unflatten the device-tree passed by prom_init or kexec | 363 | * Unflatten the device-tree passed by prom_init or kexec |
353 | */ | 364 | */ |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 5b59bc18dfe7..a1b5e4b16151 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -220,11 +220,8 @@ static void account_process_time(struct pt_regs *regs) | |||
220 | */ | 220 | */ |
221 | struct cpu_purr_data { | 221 | struct cpu_purr_data { |
222 | int initialized; /* thread is running */ | 222 | int initialized; /* thread is running */ |
223 | u64 tb0; /* timebase at origin time */ | ||
224 | u64 purr0; /* PURR at origin time */ | ||
225 | u64 tb; /* last TB value read */ | 223 | u64 tb; /* last TB value read */ |
226 | u64 purr; /* last PURR value read */ | 224 | u64 purr; /* last PURR value read */ |
227 | u64 stolen; /* stolen time so far */ | ||
228 | spinlock_t lock; | 225 | spinlock_t lock; |
229 | }; | 226 | }; |
230 | 227 | ||
@@ -234,10 +231,8 @@ static void snapshot_tb_and_purr(void *data) | |||
234 | { | 231 | { |
235 | struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data); | 232 | struct cpu_purr_data *p = &__get_cpu_var(cpu_purr_data); |
236 | 233 | ||
237 | p->tb0 = mftb(); | 234 | p->tb = mftb(); |
238 | p->purr0 = mfspr(SPRN_PURR); | 235 | p->purr = mfspr(SPRN_PURR); |
239 | p->tb = p->tb0; | ||
240 | p->purr = 0; | ||
241 | wmb(); | 236 | wmb(); |
242 | p->initialized = 1; | 237 | p->initialized = 1; |
243 | } | 238 | } |
@@ -258,37 +253,24 @@ void snapshot_timebases(void) | |||
258 | 253 | ||
259 | void calculate_steal_time(void) | 254 | void calculate_steal_time(void) |
260 | { | 255 | { |
261 | u64 tb, purr, t0; | 256 | u64 tb, purr; |
262 | s64 stolen; | 257 | s64 stolen; |
263 | struct cpu_purr_data *p0, *pme, *phim; | 258 | struct cpu_purr_data *pme; |
264 | int cpu; | ||
265 | 259 | ||
266 | if (!cpu_has_feature(CPU_FTR_PURR)) | 260 | if (!cpu_has_feature(CPU_FTR_PURR)) |
267 | return; | 261 | return; |
268 | cpu = smp_processor_id(); | 262 | pme = &per_cpu(cpu_purr_data, smp_processor_id()); |
269 | pme = &per_cpu(cpu_purr_data, cpu); | ||
270 | if (!pme->initialized) | 263 | if (!pme->initialized) |
271 | return; /* this can happen in early boot */ | 264 | return; /* this can happen in early boot */ |
272 | p0 = &per_cpu(cpu_purr_data, cpu & ~1); | 265 | spin_lock(&pme->lock); |
273 | phim = &per_cpu(cpu_purr_data, cpu ^ 1); | ||
274 | spin_lock(&p0->lock); | ||
275 | tb = mftb(); | 266 | tb = mftb(); |
276 | purr = mfspr(SPRN_PURR) - pme->purr0; | 267 | purr = mfspr(SPRN_PURR); |
277 | if (!phim->initialized || !cpu_online(cpu ^ 1)) { | 268 | stolen = (tb - pme->tb) - (purr - pme->purr); |
278 | stolen = (tb - pme->tb) - (purr - pme->purr); | 269 | if (stolen > 0) |
279 | } else { | ||
280 | t0 = pme->tb0; | ||
281 | if (phim->tb0 < t0) | ||
282 | t0 = phim->tb0; | ||
283 | stolen = phim->tb - t0 - phim->purr - purr - p0->stolen; | ||
284 | } | ||
285 | if (stolen > 0) { | ||
286 | account_steal_time(current, stolen); | 270 | account_steal_time(current, stolen); |
287 | p0->stolen += stolen; | ||
288 | } | ||
289 | pme->tb = tb; | 271 | pme->tb = tb; |
290 | pme->purr = purr; | 272 | pme->purr = purr; |
291 | spin_unlock(&p0->lock); | 273 | spin_unlock(&pme->lock); |
292 | } | 274 | } |
293 | 275 | ||
294 | /* | 276 | /* |
@@ -297,30 +279,17 @@ void calculate_steal_time(void) | |||
297 | */ | 279 | */ |
298 | static void snapshot_purr(void) | 280 | static void snapshot_purr(void) |
299 | { | 281 | { |
300 | int cpu; | 282 | struct cpu_purr_data *pme; |
301 | u64 purr; | ||
302 | struct cpu_purr_data *p0, *pme, *phim; | ||
303 | unsigned long flags; | 283 | unsigned long flags; |
304 | 284 | ||
305 | if (!cpu_has_feature(CPU_FTR_PURR)) | 285 | if (!cpu_has_feature(CPU_FTR_PURR)) |
306 | return; | 286 | return; |
307 | cpu = smp_processor_id(); | 287 | pme = &per_cpu(cpu_purr_data, smp_processor_id()); |
308 | pme = &per_cpu(cpu_purr_data, cpu); | 288 | spin_lock_irqsave(&pme->lock, flags); |
309 | p0 = &per_cpu(cpu_purr_data, cpu & ~1); | 289 | pme->tb = mftb(); |
310 | phim = &per_cpu(cpu_purr_data, cpu ^ 1); | 290 | pme->purr = mfspr(SPRN_PURR); |
311 | spin_lock_irqsave(&p0->lock, flags); | ||
312 | pme->tb = pme->tb0 = mftb(); | ||
313 | purr = mfspr(SPRN_PURR); | ||
314 | if (!phim->initialized) { | ||
315 | pme->purr = 0; | ||
316 | pme->purr0 = purr; | ||
317 | } else { | ||
318 | /* set p->purr and p->purr0 for no change in p0->stolen */ | ||
319 | pme->purr = phim->tb - phim->tb0 - phim->purr - p0->stolen; | ||
320 | pme->purr0 = purr - pme->purr; | ||
321 | } | ||
322 | pme->initialized = 1; | 291 | pme->initialized = 1; |
323 | spin_unlock_irqrestore(&p0->lock, flags); | 292 | spin_unlock_irqrestore(&pme->lock, flags); |
324 | } | 293 | } |
325 | 294 | ||
326 | #endif /* CONFIG_PPC_SPLPAR */ | 295 | #endif /* CONFIG_PPC_SPLPAR */ |
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c index 1a7e19cdab39..c913ad5cad29 100644 --- a/arch/powerpc/kernel/vdso.c +++ b/arch/powerpc/kernel/vdso.c | |||
@@ -36,6 +36,8 @@ | |||
36 | #include <asm/vdso.h> | 36 | #include <asm/vdso.h> |
37 | #include <asm/vdso_datapage.h> | 37 | #include <asm/vdso_datapage.h> |
38 | 38 | ||
39 | #include "setup.h" | ||
40 | |||
39 | #undef DEBUG | 41 | #undef DEBUG |
40 | 42 | ||
41 | #ifdef DEBUG | 43 | #ifdef DEBUG |
@@ -586,6 +588,43 @@ static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32, | |||
586 | return 0; | 588 | return 0; |
587 | } | 589 | } |
588 | 590 | ||
591 | |||
592 | static __init int vdso_fixup_features(struct lib32_elfinfo *v32, | ||
593 | struct lib64_elfinfo *v64) | ||
594 | { | ||
595 | void *start32; | ||
596 | unsigned long size32; | ||
597 | |||
598 | #ifdef CONFIG_PPC64 | ||
599 | void *start64; | ||
600 | unsigned long size64; | ||
601 | |||
602 | start64 = find_section64(v64->hdr, "__ftr_fixup", &size64); | ||
603 | if (start64) | ||
604 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
605 | start64, start64 + size64); | ||
606 | |||
607 | start64 = find_section64(v64->hdr, "__fw_ftr_fixup", &size64); | ||
608 | if (start64) | ||
609 | do_feature_fixups(powerpc_firmware_features, | ||
610 | start64, start64 + size64); | ||
611 | #endif /* CONFIG_PPC64 */ | ||
612 | |||
613 | start32 = find_section32(v32->hdr, "__ftr_fixup", &size32); | ||
614 | if (start32) | ||
615 | do_feature_fixups(cur_cpu_spec->cpu_features, | ||
616 | start32, start32 + size32); | ||
617 | |||
618 | #ifdef CONFIG_PPC64 | ||
619 | start32 = find_section32(v32->hdr, "__fw_ftr_fixup", &size32); | ||
620 | if (start32) | ||
621 | do_feature_fixups(powerpc_firmware_features, | ||
622 | start32, start32 + size32); | ||
623 | #endif /* CONFIG_PPC64 */ | ||
624 | |||
625 | return 0; | ||
626 | } | ||
627 | |||
589 | static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, | 628 | static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, |
590 | struct lib64_elfinfo *v64) | 629 | struct lib64_elfinfo *v64) |
591 | { | 630 | { |
@@ -634,6 +673,9 @@ static __init int vdso_setup(void) | |||
634 | if (vdso_fixup_datapage(&v32, &v64)) | 673 | if (vdso_fixup_datapage(&v32, &v64)) |
635 | return -1; | 674 | return -1; |
636 | 675 | ||
676 | if (vdso_fixup_features(&v32, &v64)) | ||
677 | return -1; | ||
678 | |||
637 | if (vdso_fixup_alt_funcs(&v32, &v64)) | 679 | if (vdso_fixup_alt_funcs(&v32, &v64)) |
638 | return -1; | 680 | return -1; |
639 | 681 | ||
@@ -714,6 +756,7 @@ void __init vdso_init(void) | |||
714 | * Setup the syscall map in the vDOS | 756 | * Setup the syscall map in the vDOS |
715 | */ | 757 | */ |
716 | vdso_setup_syscall_map(); | 758 | vdso_setup_syscall_map(); |
759 | |||
717 | /* | 760 | /* |
718 | * Initialize the vDSO images in memory, that is do necessary | 761 | * Initialize the vDSO images in memory, that is do necessary |
719 | * fixups of vDSO symbols, locate trampolines, etc... | 762 | * fixups of vDSO symbols, locate trampolines, etc... |
diff --git a/arch/powerpc/kernel/vdso32/vdso32.lds.S b/arch/powerpc/kernel/vdso32/vdso32.lds.S index 6187af2d54c3..26e138c4ce17 100644 --- a/arch/powerpc/kernel/vdso32/vdso32.lds.S +++ b/arch/powerpc/kernel/vdso32/vdso32.lds.S | |||
@@ -32,6 +32,18 @@ SECTIONS | |||
32 | PROVIDE (_etext = .); | 32 | PROVIDE (_etext = .); |
33 | PROVIDE (etext = .); | 33 | PROVIDE (etext = .); |
34 | 34 | ||
35 | . = ALIGN(8); | ||
36 | __ftr_fixup : { | ||
37 | *(__ftr_fixup) | ||
38 | } | ||
39 | |||
40 | #ifdef CONFIG_PPC64 | ||
41 | . = ALIGN(8); | ||
42 | __fw_ftr_fixup : { | ||
43 | *(__fw_ftr_fixup) | ||
44 | } | ||
45 | #endif | ||
46 | |||
35 | /* Other stuff is appended to the text segment: */ | 47 | /* Other stuff is appended to the text segment: */ |
36 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } | 48 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } |
37 | .rodata1 : { *(.rodata1) } | 49 | .rodata1 : { *(.rodata1) } |
diff --git a/arch/powerpc/kernel/vdso64/gettimeofday.S b/arch/powerpc/kernel/vdso64/gettimeofday.S index 56e76ff5498f..40ffd9b6cef7 100644 --- a/arch/powerpc/kernel/vdso64/gettimeofday.S +++ b/arch/powerpc/kernel/vdso64/gettimeofday.S | |||
@@ -229,8 +229,10 @@ V_FUNCTION_BEGIN(__do_get_xsec) | |||
229 | xor r0,r8,r8 /* create dependency */ | 229 | xor r0,r8,r8 /* create dependency */ |
230 | add r3,r3,r0 | 230 | add r3,r3,r0 |
231 | 231 | ||
232 | /* Get TB & offset it */ | 232 | /* Get TB & offset it. We use the MFTB macro which will generate |
233 | mftb r7 | 233 | * workaround code for Cell. |
234 | */ | ||
235 | MFTB(r7) | ||
234 | ld r9,CFG_TB_ORIG_STAMP(r3) | 236 | ld r9,CFG_TB_ORIG_STAMP(r3) |
235 | subf r7,r9,r7 | 237 | subf r7,r9,r7 |
236 | 238 | ||
diff --git a/arch/powerpc/kernel/vdso64/vdso64.lds.S b/arch/powerpc/kernel/vdso64/vdso64.lds.S index 4a2b6dc0960c..2d70f35d50b5 100644 --- a/arch/powerpc/kernel/vdso64/vdso64.lds.S +++ b/arch/powerpc/kernel/vdso64/vdso64.lds.S | |||
@@ -31,6 +31,16 @@ SECTIONS | |||
31 | PROVIDE (_etext = .); | 31 | PROVIDE (_etext = .); |
32 | PROVIDE (etext = .); | 32 | PROVIDE (etext = .); |
33 | 33 | ||
34 | . = ALIGN(8); | ||
35 | __ftr_fixup : { | ||
36 | *(__ftr_fixup) | ||
37 | } | ||
38 | |||
39 | . = ALIGN(8); | ||
40 | __fw_ftr_fixup : { | ||
41 | *(__fw_ftr_fixup) | ||
42 | } | ||
43 | |||
34 | /* Other stuff is appended to the text segment: */ | 44 | /* Other stuff is appended to the text segment: */ |
35 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } | 45 | .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } |
36 | .rodata1 : { *(.rodata1) } | 46 | .rodata1 : { *(.rodata1) } |
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index cb0e8d46c3e8..e8342d867536 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
@@ -108,13 +108,7 @@ SECTIONS | |||
108 | 108 | ||
109 | .initcall.init : { | 109 | .initcall.init : { |
110 | __initcall_start = .; | 110 | __initcall_start = .; |
111 | *(.initcall1.init) | 111 | INITCALLS |
112 | *(.initcall2.init) | ||
113 | *(.initcall3.init) | ||
114 | *(.initcall4.init) | ||
115 | *(.initcall5.init) | ||
116 | *(.initcall6.init) | ||
117 | *(.initcall7.init) | ||
118 | __initcall_end = .; | 112 | __initcall_end = .; |
119 | } | 113 | } |
120 | 114 | ||
diff --git a/arch/powerpc/oprofile/op_model_power4.c b/arch/powerpc/oprofile/op_model_power4.c index 506f6b79f893..6a927effcc77 100644 --- a/arch/powerpc/oprofile/op_model_power4.c +++ b/arch/powerpc/oprofile/op_model_power4.c | |||
@@ -76,7 +76,7 @@ static inline int mmcra_must_set_sample(void) | |||
76 | { | 76 | { |
77 | if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p) || | 77 | if (__is_processor(PV_POWER4) || __is_processor(PV_POWER4p) || |
78 | __is_processor(PV_970) || __is_processor(PV_970FX) || | 78 | __is_processor(PV_970) || __is_processor(PV_970FX) || |
79 | __is_processor(PV_970MP)) | 79 | __is_processor(PV_970MP) || __is_processor(PV_970GX)) |
80 | return 1; | 80 | return 1; |
81 | 81 | ||
82 | return 0; | 82 | return 0; |
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index 0de8e114e6b6..533e2723e184 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -385,7 +385,7 @@ static ssize_t spufs_mbox_read(struct file *file, char __user *buf, | |||
385 | udata = (void __user *)buf; | 385 | udata = (void __user *)buf; |
386 | 386 | ||
387 | spu_acquire(ctx); | 387 | spu_acquire(ctx); |
388 | for (count = 0; count <= len; count += 4, udata++) { | 388 | for (count = 0; (count + 4) <= len; count += 4, udata++) { |
389 | int ret; | 389 | int ret; |
390 | ret = ctx->ops->mbox_read(ctx, &mbox_data); | 390 | ret = ctx->ops->mbox_read(ctx, &mbox_data); |
391 | if (ret == 0) | 391 | if (ret == 0) |
diff --git a/arch/powerpc/platforms/cell/spufs/hw_ops.c b/arch/powerpc/platforms/cell/spufs/hw_ops.c index efc452e71ab0..d805ffed892d 100644 --- a/arch/powerpc/platforms/cell/spufs/hw_ops.c +++ b/arch/powerpc/platforms/cell/spufs/hw_ops.c | |||
@@ -147,7 +147,7 @@ static void spu_hw_signal1_write(struct spu_context *ctx, u32 data) | |||
147 | 147 | ||
148 | static u32 spu_hw_signal2_read(struct spu_context *ctx) | 148 | static u32 spu_hw_signal2_read(struct spu_context *ctx) |
149 | { | 149 | { |
150 | return in_be32(&ctx->spu->problem->signal_notify1); | 150 | return in_be32(&ctx->spu->problem->signal_notify2); |
151 | } | 151 | } |
152 | 152 | ||
153 | static void spu_hw_signal2_write(struct spu_context *ctx, u32 data) | 153 | static void spu_hw_signal2_write(struct spu_context *ctx, u32 data) |
diff --git a/arch/powerpc/platforms/chrp/setup.c b/arch/powerpc/platforms/chrp/setup.c index cae3d13229b9..49b8dabcbc99 100644 --- a/arch/powerpc/platforms/chrp/setup.c +++ b/arch/powerpc/platforms/chrp/setup.c | |||
@@ -477,8 +477,10 @@ static void __init chrp_find_8259(void) | |||
477 | " address, polling\n"); | 477 | " address, polling\n"); |
478 | 478 | ||
479 | i8259_init(pic, chrp_int_ack); | 479 | i8259_init(pic, chrp_int_ack); |
480 | if (ppc_md.get_irq == NULL) | 480 | if (ppc_md.get_irq == NULL) { |
481 | ppc_md.get_irq = i8259_irq; | 481 | ppc_md.get_irq = i8259_irq; |
482 | irq_set_default_host(i8259_get_host()); | ||
483 | } | ||
482 | if (chrp_mpic != NULL) { | 484 | if (chrp_mpic != NULL) { |
483 | cascade_irq = irq_of_parse_and_map(pic, 0); | 485 | cascade_irq = irq_of_parse_and_map(pic, 0); |
484 | if (cascade_irq == NO_IRQ) | 486 | if (cascade_irq == NO_IRQ) |
diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c index a0ff7ba7d666..6f73469fd3b0 100644 --- a/arch/powerpc/platforms/iseries/setup.c +++ b/arch/powerpc/platforms/iseries/setup.c | |||
@@ -694,6 +694,11 @@ void * __init iSeries_early_setup(void) | |||
694 | { | 694 | { |
695 | unsigned long phys_mem_size; | 695 | unsigned long phys_mem_size; |
696 | 696 | ||
697 | /* Identify CPU type. This is done again by the common code later | ||
698 | * on but calling this function multiple times is fine. | ||
699 | */ | ||
700 | identify_cpu(0); | ||
701 | |||
697 | powerpc_firmware_features |= FW_FEATURE_ISERIES; | 702 | powerpc_firmware_features |= FW_FEATURE_ISERIES; |
698 | powerpc_firmware_features |= FW_FEATURE_LPAR; | 703 | powerpc_firmware_features |= FW_FEATURE_LPAR; |
699 | 704 | ||
diff --git a/arch/powerpc/platforms/powermac/sleep.S b/arch/powerpc/platforms/powermac/sleep.S index 1174ca128efa..adee28da353f 100644 --- a/arch/powerpc/platforms/powermac/sleep.S +++ b/arch/powerpc/platforms/powermac/sleep.S | |||
@@ -45,7 +45,8 @@ | |||
45 | .section .text | 45 | .section .text |
46 | .align 5 | 46 | .align 5 |
47 | 47 | ||
48 | #if defined(CONFIG_PM) || defined(CONFIG_CPU_FREQ_PMAC) | 48 | #if defined(CONFIG_PM) || defined(CONFIG_CPU_FREQ_PMAC) || \ |
49 | (defined(CONFIG_HOTPLUG_CPU) && defined(CONFIG_PPC32)) | ||
49 | 50 | ||
50 | /* This gets called by via-pmu.c late during the sleep process. | 51 | /* This gets called by via-pmu.c late during the sleep process. |
51 | * The PMU was already send the sleep command and will shut us down | 52 | * The PMU was already send the sleep command and will shut us down |
diff --git a/arch/powerpc/sysdev/i8259.c b/arch/powerpc/sysdev/i8259.c index 0450265d73bb..ad87adc975bc 100644 --- a/arch/powerpc/sysdev/i8259.c +++ b/arch/powerpc/sysdev/i8259.c | |||
@@ -224,6 +224,11 @@ static struct irq_host_ops i8259_host_ops = { | |||
224 | .xlate = i8259_host_xlate, | 224 | .xlate = i8259_host_xlate, |
225 | }; | 225 | }; |
226 | 226 | ||
227 | struct irq_host *i8259_get_host(void) | ||
228 | { | ||
229 | return i8259_host; | ||
230 | } | ||
231 | |||
227 | /** | 232 | /** |
228 | * i8259_init - Initialize the legacy controller | 233 | * i8259_init - Initialize the legacy controller |
229 | * @node: device node of the legacy PIC (can be NULL, but then, it will match | 234 | * @node: device node of the legacy PIC (can be NULL, but then, it will match |
diff --git a/arch/powerpc/sysdev/ipic.c b/arch/powerpc/sysdev/ipic.c index bc4d4a7f9657..746f78c15375 100644 --- a/arch/powerpc/sysdev/ipic.c +++ b/arch/powerpc/sysdev/ipic.c | |||
@@ -473,9 +473,9 @@ static int ipic_set_irq_type(unsigned int virq, unsigned int flow_type) | |||
473 | desc->status |= flow_type & IRQ_TYPE_SENSE_MASK; | 473 | desc->status |= flow_type & IRQ_TYPE_SENSE_MASK; |
474 | if (flow_type & IRQ_TYPE_LEVEL_LOW) { | 474 | if (flow_type & IRQ_TYPE_LEVEL_LOW) { |
475 | desc->status |= IRQ_LEVEL; | 475 | desc->status |= IRQ_LEVEL; |
476 | set_irq_handler(virq, handle_level_irq); | 476 | desc->handle_irq = handle_level_irq; |
477 | } else { | 477 | } else { |
478 | set_irq_handler(virq, handle_edge_irq); | 478 | desc->handle_irq = handle_edge_irq; |
479 | } | 479 | } |
480 | 480 | ||
481 | /* only EXT IRQ senses are programmable on ipic | 481 | /* only EXT IRQ senses are programmable on ipic |
diff --git a/arch/powerpc/sysdev/qe_lib/ucc.c b/arch/powerpc/sysdev/qe_lib/ucc.c index 916c9e5df57f..ac12a44d516f 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc.c +++ b/arch/powerpc/sysdev/qe_lib/ucc.c | |||
@@ -207,6 +207,7 @@ int ucc_set_qe_mux_rxtx(int ucc_num, enum qe_clock clock, enum comm_dir mode) | |||
207 | case QE_CLK18: source = 8; break; | 207 | case QE_CLK18: source = 8; break; |
208 | case QE_CLK7: source = 9; break; | 208 | case QE_CLK7: source = 9; break; |
209 | case QE_CLK8: source = 10; break; | 209 | case QE_CLK8: source = 10; break; |
210 | case QE_CLK16: source = 11; break; | ||
210 | default: source = -1; break; | 211 | default: source = -1; break; |
211 | } | 212 | } |
212 | break; | 213 | break; |
@@ -222,6 +223,7 @@ int ucc_set_qe_mux_rxtx(int ucc_num, enum qe_clock clock, enum comm_dir mode) | |||
222 | case QE_CLK22: source = 8; break; | 223 | case QE_CLK22: source = 8; break; |
223 | case QE_CLK7: source = 9; break; | 224 | case QE_CLK7: source = 9; break; |
224 | case QE_CLK8: source = 10; break; | 225 | case QE_CLK8: source = 10; break; |
226 | case QE_CLK16: source = 11; break; | ||
225 | default: source = -1; break; | 227 | default: source = -1; break; |
226 | } | 228 | } |
227 | break; | 229 | break; |
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_fast.c b/arch/powerpc/sysdev/qe_lib/ucc_fast.c index c2be7348fcbd..75fa3104a43a 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc_fast.c +++ b/arch/powerpc/sysdev/qe_lib/ucc_fast.c | |||
@@ -163,7 +163,7 @@ int ucc_fast_init(struct ucc_fast_info * uf_info, struct ucc_fast_private ** ucc | |||
163 | 163 | ||
164 | /* check if the UCC port number is in range. */ | 164 | /* check if the UCC port number is in range. */ |
165 | if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) { | 165 | if ((uf_info->ucc_num < 0) || (uf_info->ucc_num > UCC_MAX_NUM - 1)) { |
166 | uccf_err("ucc_fast_init: Illagal UCC number!"); | 166 | uccf_err("ucc_fast_init: Illegal UCC number!"); |
167 | return -EINVAL; | 167 | return -EINVAL; |
168 | } | 168 | } |
169 | 169 | ||
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_slow.c b/arch/powerpc/sysdev/qe_lib/ucc_slow.c index 1fb88ef7cf06..a49da6b73ecf 100644 --- a/arch/powerpc/sysdev/qe_lib/ucc_slow.c +++ b/arch/powerpc/sysdev/qe_lib/ucc_slow.c | |||
@@ -152,7 +152,7 @@ int ucc_slow_init(struct ucc_slow_info * us_info, struct ucc_slow_private ** ucc | |||
152 | 152 | ||
153 | /* check if the UCC port number is in range. */ | 153 | /* check if the UCC port number is in range. */ |
154 | if ((us_info->ucc_num < 0) || (us_info->ucc_num > UCC_MAX_NUM - 1)) { | 154 | if ((us_info->ucc_num < 0) || (us_info->ucc_num > UCC_MAX_NUM - 1)) { |
155 | uccs_err("ucc_slow_init: Illagal UCC number!"); | 155 | uccs_err("ucc_slow_init: Illegal UCC number!"); |
156 | return -EINVAL; | 156 | return -EINVAL; |
157 | } | 157 | } |
158 | 158 | ||
diff --git a/arch/powerpc/sysdev/tsi108_dev.c b/arch/powerpc/sysdev/tsi108_dev.c index 11de090eb901..97f37ef4bbbf 100644 --- a/arch/powerpc/sysdev/tsi108_dev.c +++ b/arch/powerpc/sysdev/tsi108_dev.c | |||
@@ -48,7 +48,7 @@ phys_addr_t get_csrbase(void) | |||
48 | tsi = of_find_node_by_type(NULL, "tsi-bridge"); | 48 | tsi = of_find_node_by_type(NULL, "tsi-bridge"); |
49 | if (tsi) { | 49 | if (tsi) { |
50 | unsigned int size; | 50 | unsigned int size; |
51 | void *prop = get_property(tsi, "reg", &size); | 51 | const void *prop = get_property(tsi, "reg", &size); |
52 | tsi108_csr_base = of_translate_address(tsi, prop); | 52 | tsi108_csr_base = of_translate_address(tsi, prop); |
53 | of_node_put(tsi); | 53 | of_node_put(tsi); |
54 | }; | 54 | }; |
@@ -79,7 +79,7 @@ static int __init tsi108_eth_of_init(void) | |||
79 | hw_info tsi_eth_data; | 79 | hw_info tsi_eth_data; |
80 | unsigned int *id; | 80 | unsigned int *id; |
81 | unsigned int *phy_id; | 81 | unsigned int *phy_id; |
82 | void *mac_addr; | 82 | const void *mac_addr; |
83 | phandle *ph; | 83 | phandle *ph; |
84 | 84 | ||
85 | memset(r, 0, sizeof(r)); | 85 | memset(r, 0, sizeof(r)); |
diff --git a/arch/ppc/boot/simple/relocate.S b/arch/ppc/boot/simple/relocate.S index 0c021556d78e..1bbbcd2f2bcb 100644 --- a/arch/ppc/boot/simple/relocate.S +++ b/arch/ppc/boot/simple/relocate.S | |||
@@ -154,8 +154,8 @@ do_relocate_out: | |||
154 | 154 | ||
155 | start_ldr: | 155 | start_ldr: |
156 | /* Clear all of BSS and set up stack for C calls */ | 156 | /* Clear all of BSS and set up stack for C calls */ |
157 | lis r3,edata@h | 157 | lis r3,__bss_start@h |
158 | ori r3,r3,edata@l | 158 | ori r3,r3,__bss_start@l |
159 | lis r4,end@h | 159 | lis r4,end@h |
160 | ori r4,r4,end@l | 160 | ori r4,r4,end@l |
161 | subi r3,r3,4 | 161 | subi r3,r3,4 |
@@ -163,7 +163,7 @@ start_ldr: | |||
163 | li r0,0 | 163 | li r0,0 |
164 | 50: stwu r0,4(r3) | 164 | 50: stwu r0,4(r3) |
165 | cmpw cr0,r3,r4 | 165 | cmpw cr0,r3,r4 |
166 | bne 50b | 166 | blt 50b |
167 | 90: mr r9,r1 /* Save old stack pointer (in case it matters) */ | 167 | 90: mr r9,r1 /* Save old stack pointer (in case it matters) */ |
168 | lis r1,.stack@h | 168 | lis r1,.stack@h |
169 | ori r1,r1,.stack@l | 169 | ori r1,r1,.stack@l |
diff --git a/arch/ppc/kernel/misc.S b/arch/ppc/kernel/misc.S index 5f6684012ded..d319f9ba2379 100644 --- a/arch/ppc/kernel/misc.S +++ b/arch/ppc/kernel/misc.S | |||
@@ -110,80 +110,6 @@ _GLOBAL(reloc_got2) | |||
110 | blr | 110 | blr |
111 | 111 | ||
112 | /* | 112 | /* |
113 | * identify_cpu, | ||
114 | * called with r3 = data offset and r4 = CPU number | ||
115 | * doesn't change r3 | ||
116 | */ | ||
117 | _GLOBAL(identify_cpu) | ||
118 | addis r8,r3,cpu_specs@ha | ||
119 | addi r8,r8,cpu_specs@l | ||
120 | mfpvr r7 | ||
121 | 1: | ||
122 | lwz r5,CPU_SPEC_PVR_MASK(r8) | ||
123 | and r5,r5,r7 | ||
124 | lwz r6,CPU_SPEC_PVR_VALUE(r8) | ||
125 | cmplw 0,r6,r5 | ||
126 | beq 1f | ||
127 | addi r8,r8,CPU_SPEC_ENTRY_SIZE | ||
128 | b 1b | ||
129 | 1: | ||
130 | addis r6,r3,cur_cpu_spec@ha | ||
131 | addi r6,r6,cur_cpu_spec@l | ||
132 | sub r8,r8,r3 | ||
133 | stw r8,0(r6) | ||
134 | blr | ||
135 | |||
136 | /* | ||
137 | * do_cpu_ftr_fixups - goes through the list of CPU feature fixups | ||
138 | * and writes nop's over sections of code that don't apply for this cpu. | ||
139 | * r3 = data offset (not changed) | ||
140 | */ | ||
141 | _GLOBAL(do_cpu_ftr_fixups) | ||
142 | /* Get CPU 0 features */ | ||
143 | addis r6,r3,cur_cpu_spec@ha | ||
144 | addi r6,r6,cur_cpu_spec@l | ||
145 | lwz r4,0(r6) | ||
146 | add r4,r4,r3 | ||
147 | lwz r4,CPU_SPEC_FEATURES(r4) | ||
148 | |||
149 | /* Get the fixup table */ | ||
150 | addis r6,r3,__start___ftr_fixup@ha | ||
151 | addi r6,r6,__start___ftr_fixup@l | ||
152 | addis r7,r3,__stop___ftr_fixup@ha | ||
153 | addi r7,r7,__stop___ftr_fixup@l | ||
154 | |||
155 | /* Do the fixup */ | ||
156 | 1: cmplw 0,r6,r7 | ||
157 | bgelr | ||
158 | addi r6,r6,16 | ||
159 | lwz r8,-16(r6) /* mask */ | ||
160 | and r8,r8,r4 | ||
161 | lwz r9,-12(r6) /* value */ | ||
162 | cmplw 0,r8,r9 | ||
163 | beq 1b | ||
164 | lwz r8,-8(r6) /* section begin */ | ||
165 | lwz r9,-4(r6) /* section end */ | ||
166 | subf. r9,r8,r9 | ||
167 | beq 1b | ||
168 | /* write nops over the section of code */ | ||
169 | /* todo: if large section, add a branch at the start of it */ | ||
170 | srwi r9,r9,2 | ||
171 | mtctr r9 | ||
172 | add r8,r8,r3 | ||
173 | lis r0,0x60000000@h /* nop */ | ||
174 | 3: stw r0,0(r8) | ||
175 | andi. r10,r4,CPU_FTR_SPLIT_ID_CACHE@l | ||
176 | beq 2f | ||
177 | dcbst 0,r8 /* suboptimal, but simpler */ | ||
178 | sync | ||
179 | icbi 0,r8 | ||
180 | 2: addi r8,r8,4 | ||
181 | bdnz 3b | ||
182 | sync /* additional sync needed on g4 */ | ||
183 | isync | ||
184 | b 1b | ||
185 | |||
186 | /* | ||
187 | * call_setup_cpu - call the setup_cpu function for this cpu | 113 | * call_setup_cpu - call the setup_cpu function for this cpu |
188 | * r3 = data offset, r24 = cpu number | 114 | * r3 = data offset, r24 = cpu number |
189 | * | 115 | * |
diff --git a/arch/ppc/kernel/setup.c b/arch/ppc/kernel/setup.c index 75fe13815be2..27faeca2c7a2 100644 --- a/arch/ppc/kernel/setup.c +++ b/arch/ppc/kernel/setup.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/nvram.h> | 38 | #include <asm/nvram.h> |
39 | #include <asm/xmon.h> | 39 | #include <asm/xmon.h> |
40 | #include <asm/ocp.h> | 40 | #include <asm/ocp.h> |
41 | #include <asm/prom.h> | ||
41 | 42 | ||
42 | #define USES_PPC_SYS (defined(CONFIG_85xx) || defined(CONFIG_83xx) || \ | 43 | #define USES_PPC_SYS (defined(CONFIG_85xx) || defined(CONFIG_83xx) || \ |
43 | defined(CONFIG_MPC10X_BRIDGE) || defined(CONFIG_8260) || \ | 44 | defined(CONFIG_MPC10X_BRIDGE) || defined(CONFIG_8260) || \ |
@@ -53,8 +54,6 @@ | |||
53 | 54 | ||
54 | extern void platform_init(unsigned long r3, unsigned long r4, | 55 | extern void platform_init(unsigned long r3, unsigned long r4, |
55 | unsigned long r5, unsigned long r6, unsigned long r7); | 56 | unsigned long r5, unsigned long r6, unsigned long r7); |
56 | extern void identify_cpu(unsigned long offset, unsigned long cpu); | ||
57 | extern void do_cpu_ftr_fixups(unsigned long offset); | ||
58 | extern void reloc_got2(unsigned long offset); | 57 | extern void reloc_got2(unsigned long offset); |
59 | 58 | ||
60 | extern void ppc6xx_idle(void); | 59 | extern void ppc6xx_idle(void); |
@@ -301,6 +300,7 @@ early_init(int r3, int r4, int r5) | |||
301 | { | 300 | { |
302 | unsigned long phys; | 301 | unsigned long phys; |
303 | unsigned long offset = reloc_offset(); | 302 | unsigned long offset = reloc_offset(); |
303 | struct cpu_spec *spec; | ||
304 | 304 | ||
305 | /* Default */ | 305 | /* Default */ |
306 | phys = offset + KERNELBASE; | 306 | phys = offset + KERNELBASE; |
@@ -313,8 +313,10 @@ early_init(int r3, int r4, int r5) | |||
313 | * Identify the CPU type and fix up code sections | 313 | * Identify the CPU type and fix up code sections |
314 | * that depend on which cpu we have. | 314 | * that depend on which cpu we have. |
315 | */ | 315 | */ |
316 | identify_cpu(offset, 0); | 316 | spec = identify_cpu(offset); |
317 | do_cpu_ftr_fixups(offset); | 317 | do_feature_fixups(spec->cpu_features, |
318 | PTRRELOC(&__start___ftr_fixup), | ||
319 | PTRRELOC(&__stop___ftr_fixup)); | ||
318 | 320 | ||
319 | return phys; | 321 | return phys; |
320 | } | 322 | } |
diff --git a/arch/ppc/kernel/vmlinux.lds.S b/arch/ppc/kernel/vmlinux.lds.S index 095fd3323323..16e8661e1fec 100644 --- a/arch/ppc/kernel/vmlinux.lds.S +++ b/arch/ppc/kernel/vmlinux.lds.S | |||
@@ -115,13 +115,7 @@ SECTIONS | |||
115 | __setup_end = .; | 115 | __setup_end = .; |
116 | __initcall_start = .; | 116 | __initcall_start = .; |
117 | .initcall.init : { | 117 | .initcall.init : { |
118 | *(.initcall1.init) | 118 | INITCALLS |
119 | *(.initcall2.init) | ||
120 | *(.initcall3.init) | ||
121 | *(.initcall4.init) | ||
122 | *(.initcall5.init) | ||
123 | *(.initcall6.init) | ||
124 | *(.initcall7.init) | ||
125 | } | 119 | } |
126 | __initcall_end = .; | 120 | __initcall_end = .; |
127 | 121 | ||
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index 45c9fa7d7545..af1e8fc7d985 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -310,6 +310,7 @@ appldata_interval_handler(ctl_table *ctl, int write, struct file *filp, | |||
310 | if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len)) { | 310 | if (copy_from_user(buf, buffer, len > sizeof(buf) ? sizeof(buf) : len)) { |
311 | return -EFAULT; | 311 | return -EFAULT; |
312 | } | 312 | } |
313 | interval = 0; | ||
313 | sscanf(buf, "%i", &interval); | 314 | sscanf(buf, "%i", &interval); |
314 | if (interval <= 0) { | 315 | if (interval <= 0) { |
315 | P_ERROR("Timer CPU interval has to be > 0!\n"); | 316 | P_ERROR("Timer CPU interval has to be > 0!\n"); |
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 2001767e1dc7..5b33f823863a 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
@@ -757,7 +757,9 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args) | |||
757 | put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp))) | 757 | put_user(oldlen, (u32 __user *)compat_ptr(tmp.oldlenp))) |
758 | error = -EFAULT; | 758 | error = -EFAULT; |
759 | } | 759 | } |
760 | copy_to_user(args->__unused, tmp.__unused, sizeof(tmp.__unused)); | 760 | if (copy_to_user(args->__unused, tmp.__unused, |
761 | sizeof(tmp.__unused))) | ||
762 | error = -EFAULT; | ||
761 | } | 763 | } |
762 | return error; | 764 | return error; |
763 | } | 765 | } |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index d49b876a83bf..861888ab8c13 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
@@ -169,12 +169,12 @@ sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | |||
169 | compat_old_sigset_t mask; | 169 | compat_old_sigset_t mask; |
170 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 170 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
171 | __get_user(sa_handler, &act->sa_handler) || | 171 | __get_user(sa_handler, &act->sa_handler) || |
172 | __get_user(sa_restorer, &act->sa_restorer)) | 172 | __get_user(sa_restorer, &act->sa_restorer) || |
173 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
174 | __get_user(mask, &act->sa_mask)) | ||
173 | return -EFAULT; | 175 | return -EFAULT; |
174 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; | 176 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; |
175 | new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer; | 177 | new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer; |
176 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
177 | __get_user(mask, &act->sa_mask); | ||
178 | siginitset(&new_ka.sa.sa_mask, mask); | 178 | siginitset(&new_ka.sa.sa_mask, mask); |
179 | } | 179 | } |
180 | 180 | ||
@@ -185,10 +185,10 @@ sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | |||
185 | sa_restorer = (unsigned long) old_ka.sa.sa_restorer; | 185 | sa_restorer = (unsigned long) old_ka.sa.sa_restorer; |
186 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 186 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
187 | __put_user(sa_handler, &oact->sa_handler) || | 187 | __put_user(sa_handler, &oact->sa_handler) || |
188 | __put_user(sa_restorer, &oact->sa_restorer)) | 188 | __put_user(sa_restorer, &oact->sa_restorer) || |
189 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
190 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
189 | return -EFAULT; | 191 | return -EFAULT; |
190 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
191 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
192 | } | 192 | } |
193 | 193 | ||
194 | return ret; | 194 | return ret; |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index cb0efae6802f..71e54ef0931e 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -1664,4 +1664,4 @@ sys_getcpu_wrapper: | |||
1664 | llgtr %r2,%r2 # unsigned * | 1664 | llgtr %r2,%r2 # unsigned * |
1665 | llgtr %r3,%r3 # unsigned * | 1665 | llgtr %r3,%r3 # unsigned * |
1666 | llgtr %r4,%r4 # struct getcpu_cache * | 1666 | llgtr %r4,%r4 # struct getcpu_cache * |
1667 | jg sys_tee | 1667 | jg sys_getcpu |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index 4392a77cbae8..4c8a7954ef48 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
@@ -80,10 +80,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
80 | old_sigset_t mask; | 80 | old_sigset_t mask; |
81 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 81 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || |
82 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | 82 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || |
83 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) | 83 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || |
84 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
85 | __get_user(mask, &act->sa_mask)) | ||
84 | return -EFAULT; | 86 | return -EFAULT; |
85 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
86 | __get_user(mask, &act->sa_mask); | ||
87 | siginitset(&new_ka.sa.sa_mask, mask); | 87 | siginitset(&new_ka.sa.sa_mask, mask); |
88 | } | 88 | } |
89 | 89 | ||
@@ -92,10 +92,10 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
92 | if (!ret && oact) { | 92 | if (!ret && oact) { |
93 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 93 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || |
94 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | 94 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || |
95 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) | 95 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || |
96 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
97 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
96 | return -EFAULT; | 98 | return -EFAULT; |
97 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
98 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
99 | } | 99 | } |
100 | 100 | ||
101 | return ret; | 101 | return ret; |
diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c index 66375a5e3d12..92ecffbc8d82 100644 --- a/arch/s390/kernel/traps.c +++ b/arch/s390/kernel/traps.c | |||
@@ -462,7 +462,8 @@ asmlinkage void illegal_op(struct pt_regs * regs, long interruption_code) | |||
462 | local_irq_enable(); | 462 | local_irq_enable(); |
463 | 463 | ||
464 | if (regs->psw.mask & PSW_MASK_PSTATE) { | 464 | if (regs->psw.mask & PSW_MASK_PSTATE) { |
465 | get_user(*((__u16 *) opcode), (__u16 __user *) location); | 465 | if (get_user(*((__u16 *) opcode), (__u16 __user *) location)) |
466 | return; | ||
466 | if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { | 467 | if (*((__u16 *) opcode) == S390_BREAKPOINT_U16) { |
467 | if (current->ptrace & PT_PTRACED) | 468 | if (current->ptrace & PT_PTRACED) |
468 | force_sig(SIGTRAP, current); | 469 | force_sig(SIGTRAP, current); |
@@ -470,20 +471,25 @@ asmlinkage void illegal_op(struct pt_regs * regs, long interruption_code) | |||
470 | signal = SIGILL; | 471 | signal = SIGILL; |
471 | #ifdef CONFIG_MATHEMU | 472 | #ifdef CONFIG_MATHEMU |
472 | } else if (opcode[0] == 0xb3) { | 473 | } else if (opcode[0] == 0xb3) { |
473 | get_user(*((__u16 *) (opcode+2)), location+1); | 474 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
475 | return; | ||
474 | signal = math_emu_b3(opcode, regs); | 476 | signal = math_emu_b3(opcode, regs); |
475 | } else if (opcode[0] == 0xed) { | 477 | } else if (opcode[0] == 0xed) { |
476 | get_user(*((__u32 *) (opcode+2)), | 478 | if (get_user(*((__u32 *) (opcode+2)), |
477 | (__u32 __user *)(location+1)); | 479 | (__u32 __user *)(location+1))) |
480 | return; | ||
478 | signal = math_emu_ed(opcode, regs); | 481 | signal = math_emu_ed(opcode, regs); |
479 | } else if (*((__u16 *) opcode) == 0xb299) { | 482 | } else if (*((__u16 *) opcode) == 0xb299) { |
480 | get_user(*((__u16 *) (opcode+2)), location+1); | 483 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
484 | return; | ||
481 | signal = math_emu_srnm(opcode, regs); | 485 | signal = math_emu_srnm(opcode, regs); |
482 | } else if (*((__u16 *) opcode) == 0xb29c) { | 486 | } else if (*((__u16 *) opcode) == 0xb29c) { |
483 | get_user(*((__u16 *) (opcode+2)), location+1); | 487 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
488 | return; | ||
484 | signal = math_emu_stfpc(opcode, regs); | 489 | signal = math_emu_stfpc(opcode, regs); |
485 | } else if (*((__u16 *) opcode) == 0xb29d) { | 490 | } else if (*((__u16 *) opcode) == 0xb29d) { |
486 | get_user(*((__u16 *) (opcode+2)), location+1); | 491 | if (get_user(*((__u16 *) (opcode+2)), location+1)) |
492 | return; | ||
487 | signal = math_emu_lfpc(opcode, regs); | 493 | signal = math_emu_lfpc(opcode, regs); |
488 | #endif | 494 | #endif |
489 | } else | 495 | } else |
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S index af9e69a03011..fe0f2e97ba7b 100644 --- a/arch/s390/kernel/vmlinux.lds.S +++ b/arch/s390/kernel/vmlinux.lds.S | |||
@@ -83,13 +83,7 @@ SECTIONS | |||
83 | __setup_end = .; | 83 | __setup_end = .; |
84 | __initcall_start = .; | 84 | __initcall_start = .; |
85 | .initcall.init : { | 85 | .initcall.init : { |
86 | *(.initcall1.init) | 86 | INITCALLS |
87 | *(.initcall2.init) | ||
88 | *(.initcall3.init) | ||
89 | *(.initcall4.init) | ||
90 | *(.initcall5.init) | ||
91 | *(.initcall6.init) | ||
92 | *(.initcall7.init) | ||
93 | } | 87 | } |
94 | __initcall_end = .; | 88 | __initcall_end = .; |
95 | __con_initcall_start = .; | 89 | __con_initcall_start = .; |
diff --git a/arch/sh/kernel/vmlinux.lds.S b/arch/sh/kernel/vmlinux.lds.S index 5eb930918186..77b4026d5688 100644 --- a/arch/sh/kernel/vmlinux.lds.S +++ b/arch/sh/kernel/vmlinux.lds.S | |||
@@ -76,13 +76,7 @@ SECTIONS | |||
76 | __setup_end = .; | 76 | __setup_end = .; |
77 | __initcall_start = .; | 77 | __initcall_start = .; |
78 | .initcall.init : { | 78 | .initcall.init : { |
79 | *(.initcall1.init) | 79 | INITCALLS |
80 | *(.initcall2.init) | ||
81 | *(.initcall3.init) | ||
82 | *(.initcall4.init) | ||
83 | *(.initcall5.init) | ||
84 | *(.initcall6.init) | ||
85 | *(.initcall7.init) | ||
86 | } | 80 | } |
87 | __initcall_end = .; | 81 | __initcall_end = .; |
88 | __con_initcall_start = .; | 82 | __con_initcall_start = .; |
diff --git a/arch/sh64/kernel/vmlinux.lds.S b/arch/sh64/kernel/vmlinux.lds.S index a8fcc3a71585..95c4d753e357 100644 --- a/arch/sh64/kernel/vmlinux.lds.S +++ b/arch/sh64/kernel/vmlinux.lds.S | |||
@@ -108,13 +108,7 @@ SECTIONS | |||
108 | __setup_end = .; | 108 | __setup_end = .; |
109 | __initcall_start = .; | 109 | __initcall_start = .; |
110 | .initcall.init : C_PHYS(.initcall.init) { | 110 | .initcall.init : C_PHYS(.initcall.init) { |
111 | *(.initcall1.init) | 111 | INITCALLS |
112 | *(.initcall2.init) | ||
113 | *(.initcall3.init) | ||
114 | *(.initcall4.init) | ||
115 | *(.initcall5.init) | ||
116 | *(.initcall6.init) | ||
117 | *(.initcall7.init) | ||
118 | } | 112 | } |
119 | __initcall_end = .; | 113 | __initcall_end = .; |
120 | __con_initcall_start = .; | 114 | __con_initcall_start = .; |
diff --git a/arch/sparc/kernel/ebus.c b/arch/sparc/kernel/ebus.c index 75ac24d229b1..ba58c3a061fd 100644 --- a/arch/sparc/kernel/ebus.c +++ b/arch/sparc/kernel/ebus.c | |||
@@ -237,12 +237,12 @@ void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_device *d | |||
237 | dev->ofdev.node = dp; | 237 | dev->ofdev.node = dp; |
238 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; | 238 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; |
239 | dev->ofdev.dev.bus = &ebus_bus_type; | 239 | dev->ofdev.dev.bus = &ebus_bus_type; |
240 | strcpy(dev->ofdev.dev.bus_id, dp->path_component_name); | 240 | sprintf(dev->ofdev.dev.bus_id, "ebus[%08x]", dp->node); |
241 | 241 | ||
242 | /* Register with core */ | 242 | /* Register with core */ |
243 | if (of_device_register(&dev->ofdev) != 0) | 243 | if (of_device_register(&dev->ofdev) != 0) |
244 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", | 244 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", |
245 | dev->ofdev.dev.bus_id); | 245 | dp->path_component_name); |
246 | 246 | ||
247 | if ((dp = dp->child) != NULL) { | 247 | if ((dp = dp->child) != NULL) { |
248 | dev->children = (struct linux_ebus_child *) | 248 | dev->children = (struct linux_ebus_child *) |
@@ -332,12 +332,12 @@ void __init ebus_init(void) | |||
332 | ebus->ofdev.node = dp; | 332 | ebus->ofdev.node = dp; |
333 | ebus->ofdev.dev.parent = &pdev->dev; | 333 | ebus->ofdev.dev.parent = &pdev->dev; |
334 | ebus->ofdev.dev.bus = &ebus_bus_type; | 334 | ebus->ofdev.dev.bus = &ebus_bus_type; |
335 | strcpy(ebus->ofdev.dev.bus_id, dp->path_component_name); | 335 | sprintf(ebus->ofdev.dev.bus_id, "ebus%d", num_ebus); |
336 | 336 | ||
337 | /* Register with core */ | 337 | /* Register with core */ |
338 | if (of_device_register(&ebus->ofdev) != 0) | 338 | if (of_device_register(&ebus->ofdev) != 0) |
339 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", | 339 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", |
340 | ebus->ofdev.dev.bus_id); | 340 | dp->path_component_name); |
341 | 341 | ||
342 | 342 | ||
343 | nd = dp->child; | 343 | nd = dp->child; |
diff --git a/arch/sparc/kernel/of_device.c b/arch/sparc/kernel/of_device.c index 74bef2a2d37f..46200c43ffb1 100644 --- a/arch/sparc/kernel/of_device.c +++ b/arch/sparc/kernel/of_device.c | |||
@@ -651,7 +651,7 @@ build_resources: | |||
651 | if (!parent) | 651 | if (!parent) |
652 | strcpy(op->dev.bus_id, "root"); | 652 | strcpy(op->dev.bus_id, "root"); |
653 | else | 653 | else |
654 | strcpy(op->dev.bus_id, dp->path_component_name); | 654 | sprintf(op->dev.bus_id, "%08x", dp->node); |
655 | 655 | ||
656 | if (of_device_register(op)) { | 656 | if (of_device_register(op)) { |
657 | printk("%s: Could not register of device.\n", | 657 | printk("%s: Could not register of device.\n", |
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index 1dd78c84888a..5cc5ff7f8824 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S | |||
@@ -49,13 +49,7 @@ SECTIONS | |||
49 | __setup_end = .; | 49 | __setup_end = .; |
50 | __initcall_start = .; | 50 | __initcall_start = .; |
51 | .initcall.init : { | 51 | .initcall.init : { |
52 | *(.initcall1.init) | 52 | INITCALLS |
53 | *(.initcall2.init) | ||
54 | *(.initcall3.init) | ||
55 | *(.initcall4.init) | ||
56 | *(.initcall5.init) | ||
57 | *(.initcall6.init) | ||
58 | *(.initcall7.init) | ||
59 | } | 53 | } |
60 | __initcall_end = .; | 54 | __initcall_end = .; |
61 | __con_initcall_start = .; | 55 | __con_initcall_start = .; |
diff --git a/arch/sparc64/kernel/central.c b/arch/sparc64/kernel/central.c index b66336db00ee..e724c54af029 100644 --- a/arch/sparc64/kernel/central.c +++ b/arch/sparc64/kernel/central.c | |||
@@ -126,6 +126,10 @@ static void probe_other_fhcs(void) | |||
126 | int board; | 126 | int board; |
127 | u32 tmp; | 127 | u32 tmp; |
128 | 128 | ||
129 | if (dp->parent && | ||
130 | dp->parent->parent != NULL) | ||
131 | continue; | ||
132 | |||
129 | fhc = (struct linux_fhc *) | 133 | fhc = (struct linux_fhc *) |
130 | central_alloc_bootmem(sizeof(struct linux_fhc)); | 134 | central_alloc_bootmem(sizeof(struct linux_fhc)); |
131 | if (fhc == NULL) | 135 | if (fhc == NULL) |
diff --git a/arch/sparc64/kernel/ebus.c b/arch/sparc64/kernel/ebus.c index 2df25c2b4071..35bf895fdeee 100644 --- a/arch/sparc64/kernel/ebus.c +++ b/arch/sparc64/kernel/ebus.c | |||
@@ -389,12 +389,12 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de | |||
389 | dev->ofdev.node = dp; | 389 | dev->ofdev.node = dp; |
390 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; | 390 | dev->ofdev.dev.parent = &dev->bus->ofdev.dev; |
391 | dev->ofdev.dev.bus = &ebus_bus_type; | 391 | dev->ofdev.dev.bus = &ebus_bus_type; |
392 | strcpy(dev->ofdev.dev.bus_id, dp->path_component_name); | 392 | sprintf(dev->ofdev.dev.bus_id, "ebus[%08x]", dp->node); |
393 | 393 | ||
394 | /* Register with core */ | 394 | /* Register with core */ |
395 | if (of_device_register(&dev->ofdev) != 0) | 395 | if (of_device_register(&dev->ofdev) != 0) |
396 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", | 396 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", |
397 | dev->ofdev.dev.bus_id); | 397 | dp->path_component_name); |
398 | 398 | ||
399 | dp = dp->child; | 399 | dp = dp->child; |
400 | if (dp) { | 400 | if (dp) { |
@@ -494,12 +494,12 @@ void __init ebus_init(void) | |||
494 | ebus->ofdev.node = dp; | 494 | ebus->ofdev.node = dp; |
495 | ebus->ofdev.dev.parent = &pdev->dev; | 495 | ebus->ofdev.dev.parent = &pdev->dev; |
496 | ebus->ofdev.dev.bus = &ebus_bus_type; | 496 | ebus->ofdev.dev.bus = &ebus_bus_type; |
497 | strcpy(ebus->ofdev.dev.bus_id, dp->path_component_name); | 497 | sprintf(ebus->ofdev.dev.bus_id, "ebus%d", num_ebus); |
498 | 498 | ||
499 | /* Register with core */ | 499 | /* Register with core */ |
500 | if (of_device_register(&ebus->ofdev) != 0) | 500 | if (of_device_register(&ebus->ofdev) != 0) |
501 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", | 501 | printk(KERN_DEBUG "ebus: device registration error for %s!\n", |
502 | ebus->ofdev.dev.bus_id); | 502 | dp->path_component_name); |
503 | 503 | ||
504 | 504 | ||
505 | child = dp->child; | 505 | child = dp->child; |
diff --git a/arch/sparc64/kernel/isa.c b/arch/sparc64/kernel/isa.c index 0f3aec72ef5f..f028e68b23f2 100644 --- a/arch/sparc64/kernel/isa.c +++ b/arch/sparc64/kernel/isa.c | |||
@@ -115,12 +115,12 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br) | |||
115 | isa_dev->ofdev.node = dp; | 115 | isa_dev->ofdev.node = dp; |
116 | isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev; | 116 | isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev; |
117 | isa_dev->ofdev.dev.bus = &isa_bus_type; | 117 | isa_dev->ofdev.dev.bus = &isa_bus_type; |
118 | strcpy(isa_dev->ofdev.dev.bus_id, dp->path_component_name); | 118 | sprintf(isa_dev->ofdev.dev.bus_id, "isa[%08x]", dp->node); |
119 | 119 | ||
120 | /* Register with core */ | 120 | /* Register with core */ |
121 | if (of_device_register(&isa_dev->ofdev) != 0) { | 121 | if (of_device_register(&isa_dev->ofdev) != 0) { |
122 | printk(KERN_DEBUG "isa: device registration error for %s!\n", | 122 | printk(KERN_DEBUG "isa: device registration error for %s!\n", |
123 | isa_dev->ofdev.dev.bus_id); | 123 | dp->path_component_name); |
124 | kfree(isa_dev); | 124 | kfree(isa_dev); |
125 | goto next_sibling; | 125 | goto next_sibling; |
126 | } | 126 | } |
@@ -191,12 +191,12 @@ void __init isa_init(void) | |||
191 | isa_br->ofdev.node = dp; | 191 | isa_br->ofdev.node = dp; |
192 | isa_br->ofdev.dev.parent = &pdev->dev; | 192 | isa_br->ofdev.dev.parent = &pdev->dev; |
193 | isa_br->ofdev.dev.bus = &isa_bus_type; | 193 | isa_br->ofdev.dev.bus = &isa_bus_type; |
194 | strcpy(isa_br->ofdev.dev.bus_id, dp->path_component_name); | 194 | sprintf(isa_br->ofdev.dev.bus_id, "isa%d", index); |
195 | 195 | ||
196 | /* Register with core */ | 196 | /* Register with core */ |
197 | if (of_device_register(&isa_br->ofdev) != 0) { | 197 | if (of_device_register(&isa_br->ofdev) != 0) { |
198 | printk(KERN_DEBUG "isa: device registration error for %s!\n", | 198 | printk(KERN_DEBUG "isa: device registration error for %s!\n", |
199 | isa_br->ofdev.dev.bus_id); | 199 | dp->path_component_name); |
200 | kfree(isa_br); | 200 | kfree(isa_br); |
201 | return; | 201 | return; |
202 | } | 202 | } |
diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c index d3dfb2a36d47..8cc14fc6b6f1 100644 --- a/arch/sparc64/kernel/of_device.c +++ b/arch/sparc64/kernel/of_device.c | |||
@@ -402,16 +402,22 @@ static void of_bus_sbus_count_cells(struct device_node *child, | |||
402 | *sizec = 1; | 402 | *sizec = 1; |
403 | } | 403 | } |
404 | 404 | ||
405 | static int of_bus_sbus_map(u32 *addr, const u32 *range, int na, int ns, int pna) | 405 | /* |
406 | { | 406 | * FHC/Central bus specific translator. |
407 | return of_bus_default_map(addr, range, na, ns, pna); | 407 | * |
408 | } | 408 | * This is just needed to hard-code the address and size cell |
409 | 409 | * counts. 'fhc' and 'central' nodes lack the #address-cells and | |
410 | static unsigned int of_bus_sbus_get_flags(u32 *addr) | 410 | * #size-cells properties, and if you walk to the root on such |
411 | * Enterprise boxes all you'll get is a #size-cells of 2 which is | ||
412 | * not what we want to use. | ||
413 | */ | ||
414 | static int of_bus_fhc_match(struct device_node *np) | ||
411 | { | 415 | { |
412 | return IORESOURCE_MEM; | 416 | return !strcmp(np->name, "fhc") || |
417 | !strcmp(np->name, "central"); | ||
413 | } | 418 | } |
414 | 419 | ||
420 | #define of_bus_fhc_count_cells of_bus_sbus_count_cells | ||
415 | 421 | ||
416 | /* | 422 | /* |
417 | * Array of bus specific translators | 423 | * Array of bus specific translators |
@@ -433,8 +439,17 @@ static struct of_bus of_busses[] = { | |||
433 | .addr_prop_name = "reg", | 439 | .addr_prop_name = "reg", |
434 | .match = of_bus_sbus_match, | 440 | .match = of_bus_sbus_match, |
435 | .count_cells = of_bus_sbus_count_cells, | 441 | .count_cells = of_bus_sbus_count_cells, |
436 | .map = of_bus_sbus_map, | 442 | .map = of_bus_default_map, |
437 | .get_flags = of_bus_sbus_get_flags, | 443 | .get_flags = of_bus_default_get_flags, |
444 | }, | ||
445 | /* FHC */ | ||
446 | { | ||
447 | .name = "fhc", | ||
448 | .addr_prop_name = "reg", | ||
449 | .match = of_bus_fhc_match, | ||
450 | .count_cells = of_bus_fhc_count_cells, | ||
451 | .map = of_bus_default_map, | ||
452 | .get_flags = of_bus_default_get_flags, | ||
438 | }, | 453 | }, |
439 | /* Default */ | 454 | /* Default */ |
440 | { | 455 | { |
@@ -846,7 +861,7 @@ static struct of_device * __init scan_one_device(struct device_node *dp, | |||
846 | if (!parent) | 861 | if (!parent) |
847 | strcpy(op->dev.bus_id, "root"); | 862 | strcpy(op->dev.bus_id, "root"); |
848 | else | 863 | else |
849 | sprintf(op->dev.bus_id, "%s@%08x", dp->name, dp->node); | 864 | sprintf(op->dev.bus_id, "%08x", dp->node); |
850 | 865 | ||
851 | if (of_device_register(op)) { | 866 | if (of_device_register(op)) { |
852 | printk("%s: Could not register of device.\n", | 867 | printk("%s: Could not register of device.\n", |
diff --git a/arch/sparc64/kernel/pci_iommu.c b/arch/sparc64/kernel/pci_iommu.c index 82e5455134c6..2e7f1427088a 100644 --- a/arch/sparc64/kernel/pci_iommu.c +++ b/arch/sparc64/kernel/pci_iommu.c | |||
@@ -281,7 +281,7 @@ static void pci_4u_free_consistent(struct pci_dev *pdev, size_t size, void *cpu, | |||
281 | 281 | ||
282 | spin_lock_irqsave(&iommu->lock, flags); | 282 | spin_lock_irqsave(&iommu->lock, flags); |
283 | 283 | ||
284 | free_npages(iommu, dvma, npages); | 284 | free_npages(iommu, dvma - iommu->page_table_map_base, npages); |
285 | 285 | ||
286 | spin_unlock_irqrestore(&iommu->lock, flags); | 286 | spin_unlock_irqrestore(&iommu->lock, flags); |
287 | 287 | ||
diff --git a/arch/sparc64/kernel/prom.c b/arch/sparc64/kernel/prom.c index e21cd6afa709..c60efb3cb22e 100644 --- a/arch/sparc64/kernel/prom.c +++ b/arch/sparc64/kernel/prom.c | |||
@@ -1079,23 +1079,22 @@ static void sun4v_vdev_irq_trans_init(struct device_node *dp) | |||
1079 | 1079 | ||
1080 | static void irq_trans_init(struct device_node *dp) | 1080 | static void irq_trans_init(struct device_node *dp) |
1081 | { | 1081 | { |
1082 | const char *model; | ||
1083 | #ifdef CONFIG_PCI | 1082 | #ifdef CONFIG_PCI |
1083 | const char *model; | ||
1084 | int i; | 1084 | int i; |
1085 | #endif | 1085 | #endif |
1086 | 1086 | ||
1087 | #ifdef CONFIG_PCI | ||
1087 | model = of_get_property(dp, "model", NULL); | 1088 | model = of_get_property(dp, "model", NULL); |
1088 | if (!model) | 1089 | if (!model) |
1089 | model = of_get_property(dp, "compatible", NULL); | 1090 | model = of_get_property(dp, "compatible", NULL); |
1090 | if (!model) | 1091 | if (model) { |
1091 | return; | 1092 | for (i = 0; i < ARRAY_SIZE(pci_irq_trans_table); i++) { |
1092 | 1093 | struct irq_trans *t = &pci_irq_trans_table[i]; | |
1093 | #ifdef CONFIG_PCI | ||
1094 | for (i = 0; i < ARRAY_SIZE(pci_irq_trans_table); i++) { | ||
1095 | struct irq_trans *t = &pci_irq_trans_table[i]; | ||
1096 | 1094 | ||
1097 | if (!strcmp(model, t->name)) | 1095 | if (!strcmp(model, t->name)) |
1098 | return t->init(dp); | 1096 | return t->init(dp); |
1097 | } | ||
1099 | } | 1098 | } |
1100 | #endif | 1099 | #endif |
1101 | #ifdef CONFIG_SBUS | 1100 | #ifdef CONFIG_SBUS |
@@ -1103,8 +1102,9 @@ static void irq_trans_init(struct device_node *dp) | |||
1103 | !strcmp(dp->name, "sbi")) | 1102 | !strcmp(dp->name, "sbi")) |
1104 | return sbus_irq_trans_init(dp); | 1103 | return sbus_irq_trans_init(dp); |
1105 | #endif | 1104 | #endif |
1106 | if (!strcmp(dp->name, "central")) | 1105 | if (!strcmp(dp->name, "fhc") && |
1107 | return central_irq_trans_init(dp->child); | 1106 | !strcmp(dp->parent->name, "central")) |
1107 | return central_irq_trans_init(dp); | ||
1108 | if (!strcmp(dp->name, "virtual-devices")) | 1108 | if (!strcmp(dp->name, "virtual-devices")) |
1109 | return sun4v_vdev_irq_trans_init(dp); | 1109 | return sun4v_vdev_irq_trans_init(dp); |
1110 | } | 1110 | } |
@@ -1516,7 +1516,7 @@ static char * __init get_one_property(phandle node, const char *name) | |||
1516 | return buf; | 1516 | return buf; |
1517 | } | 1517 | } |
1518 | 1518 | ||
1519 | static struct device_node * __init create_node(phandle node) | 1519 | static struct device_node * __init create_node(phandle node, struct device_node *parent) |
1520 | { | 1520 | { |
1521 | struct device_node *dp; | 1521 | struct device_node *dp; |
1522 | 1522 | ||
@@ -1525,6 +1525,7 @@ static struct device_node * __init create_node(phandle node) | |||
1525 | 1525 | ||
1526 | dp = prom_early_alloc(sizeof(*dp)); | 1526 | dp = prom_early_alloc(sizeof(*dp)); |
1527 | dp->unique_id = unique_id++; | 1527 | dp->unique_id = unique_id++; |
1528 | dp->parent = parent; | ||
1528 | 1529 | ||
1529 | kref_init(&dp->kref); | 1530 | kref_init(&dp->kref); |
1530 | 1531 | ||
@@ -1543,12 +1544,11 @@ static struct device_node * __init build_tree(struct device_node *parent, phandl | |||
1543 | { | 1544 | { |
1544 | struct device_node *dp; | 1545 | struct device_node *dp; |
1545 | 1546 | ||
1546 | dp = create_node(node); | 1547 | dp = create_node(node, parent); |
1547 | if (dp) { | 1548 | if (dp) { |
1548 | *(*nextp) = dp; | 1549 | *(*nextp) = dp; |
1549 | *nextp = &dp->allnext; | 1550 | *nextp = &dp->allnext; |
1550 | 1551 | ||
1551 | dp->parent = parent; | ||
1552 | dp->path_component_name = build_path_component(dp); | 1552 | dp->path_component_name = build_path_component(dp); |
1553 | dp->full_name = build_full_name(dp); | 1553 | dp->full_name = build_full_name(dp); |
1554 | 1554 | ||
@@ -1564,7 +1564,7 @@ void __init prom_build_devicetree(void) | |||
1564 | { | 1564 | { |
1565 | struct device_node **nextp; | 1565 | struct device_node **nextp; |
1566 | 1566 | ||
1567 | allnodes = create_node(prom_root_node); | 1567 | allnodes = create_node(prom_root_node, NULL); |
1568 | allnodes->path_component_name = ""; | 1568 | allnodes->path_component_name = ""; |
1569 | allnodes->full_name = "/"; | 1569 | allnodes->full_name = "/"; |
1570 | 1570 | ||
diff --git a/arch/sparc64/kernel/vmlinux.lds.S b/arch/sparc64/kernel/vmlinux.lds.S index b097379a49a8..bd9de8c2a2aa 100644 --- a/arch/sparc64/kernel/vmlinux.lds.S +++ b/arch/sparc64/kernel/vmlinux.lds.S | |||
@@ -57,13 +57,7 @@ SECTIONS | |||
57 | __setup_end = .; | 57 | __setup_end = .; |
58 | __initcall_start = .; | 58 | __initcall_start = .; |
59 | .initcall.init : { | 59 | .initcall.init : { |
60 | *(.initcall1.init) | 60 | INITCALLS |
61 | *(.initcall2.init) | ||
62 | *(.initcall3.init) | ||
63 | *(.initcall4.init) | ||
64 | *(.initcall5.init) | ||
65 | *(.initcall6.init) | ||
66 | *(.initcall7.init) | ||
67 | } | 61 | } |
68 | __initcall_end = .; | 62 | __initcall_end = .; |
69 | __con_initcall_start = .; | 63 | __con_initcall_start = .; |
diff --git a/arch/v850/kernel/vmlinux.lds.S b/arch/v850/kernel/vmlinux.lds.S index 63399219cd9f..88d087f527c9 100644 --- a/arch/v850/kernel/vmlinux.lds.S +++ b/arch/v850/kernel/vmlinux.lds.S | |||
@@ -140,13 +140,7 @@ | |||
140 | ___setup_end = . ; \ | 140 | ___setup_end = . ; \ |
141 | ___initcall_start = . ; \ | 141 | ___initcall_start = . ; \ |
142 | *(.initcall.init) \ | 142 | *(.initcall.init) \ |
143 | *(.initcall1.init) \ | 143 | INITCALLS \ |
144 | *(.initcall2.init) \ | ||
145 | *(.initcall3.init) \ | ||
146 | *(.initcall4.init) \ | ||
147 | *(.initcall5.init) \ | ||
148 | *(.initcall6.init) \ | ||
149 | *(.initcall7.init) \ | ||
150 | . = ALIGN (4) ; \ | 144 | . = ALIGN (4) ; \ |
151 | ___initcall_end = . ; \ | 145 | ___initcall_end = . ; \ |
152 | ___con_initcall_start = .; \ | 146 | ___con_initcall_start = .; \ |
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index b000017e4b5d..fe429e5d6b29 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
@@ -63,7 +63,7 @@ int timer_over_8254 __initdata = 1; | |||
63 | static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; | 63 | static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; |
64 | 64 | ||
65 | static DEFINE_SPINLOCK(ioapic_lock); | 65 | static DEFINE_SPINLOCK(ioapic_lock); |
66 | static DEFINE_SPINLOCK(vector_lock); | 66 | DEFINE_SPINLOCK(vector_lock); |
67 | 67 | ||
68 | /* | 68 | /* |
69 | * # of IRQ routing registers | 69 | * # of IRQ routing registers |
@@ -612,15 +612,15 @@ static int __assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result) | |||
612 | * Also, we've got to be careful not to trash gate | 612 | * Also, we've got to be careful not to trash gate |
613 | * 0x80, because int 0x80 is hm, kind of importantish. ;) | 613 | * 0x80, because int 0x80 is hm, kind of importantish. ;) |
614 | */ | 614 | */ |
615 | static struct { | 615 | static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0; |
616 | int vector; | ||
617 | int offset; | ||
618 | } pos[NR_CPUS] = { [ 0 ... NR_CPUS - 1] = {FIRST_DEVICE_VECTOR, 0} }; | ||
619 | int old_vector = -1; | 616 | int old_vector = -1; |
620 | int cpu; | 617 | int cpu; |
621 | 618 | ||
622 | BUG_ON((unsigned)irq >= NR_IRQ_VECTORS); | 619 | BUG_ON((unsigned)irq >= NR_IRQ_VECTORS); |
623 | 620 | ||
621 | /* Only try and allocate irqs on cpus that are present */ | ||
622 | cpus_and(mask, mask, cpu_online_map); | ||
623 | |||
624 | if (irq_vector[irq] > 0) | 624 | if (irq_vector[irq] > 0) |
625 | old_vector = irq_vector[irq]; | 625 | old_vector = irq_vector[irq]; |
626 | if (old_vector > 0) { | 626 | if (old_vector > 0) { |
@@ -630,15 +630,15 @@ static int __assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result) | |||
630 | } | 630 | } |
631 | 631 | ||
632 | for_each_cpu_mask(cpu, mask) { | 632 | for_each_cpu_mask(cpu, mask) { |
633 | cpumask_t domain; | 633 | cpumask_t domain, new_mask; |
634 | int first, new_cpu; | 634 | int new_cpu; |
635 | int vector, offset; | 635 | int vector, offset; |
636 | 636 | ||
637 | domain = vector_allocation_domain(cpu); | 637 | domain = vector_allocation_domain(cpu); |
638 | first = first_cpu(domain); | 638 | cpus_and(new_mask, domain, cpu_online_map); |
639 | 639 | ||
640 | vector = pos[first].vector; | 640 | vector = current_vector; |
641 | offset = pos[first].offset; | 641 | offset = current_offset; |
642 | next: | 642 | next: |
643 | vector += 8; | 643 | vector += 8; |
644 | if (vector >= FIRST_SYSTEM_VECTOR) { | 644 | if (vector >= FIRST_SYSTEM_VECTOR) { |
@@ -646,24 +646,24 @@ next: | |||
646 | offset = (offset + 1) % 8; | 646 | offset = (offset + 1) % 8; |
647 | vector = FIRST_DEVICE_VECTOR + offset; | 647 | vector = FIRST_DEVICE_VECTOR + offset; |
648 | } | 648 | } |
649 | if (unlikely(pos[first].vector == vector)) | 649 | if (unlikely(current_vector == vector)) |
650 | continue; | 650 | continue; |
651 | if (vector == IA32_SYSCALL_VECTOR) | 651 | if (vector == IA32_SYSCALL_VECTOR) |
652 | goto next; | 652 | goto next; |
653 | for_each_cpu_mask(new_cpu, domain) | 653 | for_each_cpu_mask(new_cpu, new_mask) |
654 | if (per_cpu(vector_irq, new_cpu)[vector] != -1) | 654 | if (per_cpu(vector_irq, new_cpu)[vector] != -1) |
655 | goto next; | 655 | goto next; |
656 | /* Found one! */ | 656 | /* Found one! */ |
657 | for_each_cpu_mask(new_cpu, domain) { | 657 | current_vector = vector; |
658 | pos[new_cpu].vector = vector; | 658 | current_offset = offset; |
659 | pos[new_cpu].offset = offset; | ||
660 | } | ||
661 | if (old_vector >= 0) { | 659 | if (old_vector >= 0) { |
660 | cpumask_t old_mask; | ||
662 | int old_cpu; | 661 | int old_cpu; |
663 | for_each_cpu_mask(old_cpu, irq_domain[irq]) | 662 | cpus_and(old_mask, irq_domain[irq], cpu_online_map); |
663 | for_each_cpu_mask(old_cpu, old_mask) | ||
664 | per_cpu(vector_irq, old_cpu)[old_vector] = -1; | 664 | per_cpu(vector_irq, old_cpu)[old_vector] = -1; |
665 | } | 665 | } |
666 | for_each_cpu_mask(new_cpu, domain) | 666 | for_each_cpu_mask(new_cpu, new_mask) |
667 | per_cpu(vector_irq, new_cpu)[vector] = irq; | 667 | per_cpu(vector_irq, new_cpu)[vector] = irq; |
668 | irq_vector[irq] = vector; | 668 | irq_vector[irq] = vector; |
669 | irq_domain[irq] = domain; | 669 | irq_domain[irq] = domain; |
@@ -684,6 +684,32 @@ static int assign_irq_vector(int irq, cpumask_t mask, cpumask_t *result) | |||
684 | return vector; | 684 | return vector; |
685 | } | 685 | } |
686 | 686 | ||
687 | void __setup_vector_irq(int cpu) | ||
688 | { | ||
689 | /* Initialize vector_irq on a new cpu */ | ||
690 | /* This function must be called with vector_lock held */ | ||
691 | unsigned long flags; | ||
692 | int irq, vector; | ||
693 | |||
694 | |||
695 | /* Mark the inuse vectors */ | ||
696 | for (irq = 0; irq < NR_IRQ_VECTORS; ++irq) { | ||
697 | if (!cpu_isset(cpu, irq_domain[irq])) | ||
698 | continue; | ||
699 | vector = irq_vector[irq]; | ||
700 | per_cpu(vector_irq, cpu)[vector] = irq; | ||
701 | } | ||
702 | /* Mark the free vectors */ | ||
703 | for (vector = 0; vector < NR_VECTORS; ++vector) { | ||
704 | irq = per_cpu(vector_irq, cpu)[vector]; | ||
705 | if (irq < 0) | ||
706 | continue; | ||
707 | if (!cpu_isset(cpu, irq_domain[irq])) | ||
708 | per_cpu(vector_irq, cpu)[vector] = -1; | ||
709 | } | ||
710 | } | ||
711 | |||
712 | |||
687 | extern void (*interrupt[NR_IRQS])(void); | 713 | extern void (*interrupt[NR_IRQS])(void); |
688 | 714 | ||
689 | static struct irq_chip ioapic_chip; | 715 | static struct irq_chip ioapic_chip; |
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c index 7b7a6870288a..62c2e747af58 100644 --- a/arch/x86_64/kernel/smpboot.c +++ b/arch/x86_64/kernel/smpboot.c | |||
@@ -581,12 +581,16 @@ void __cpuinit start_secondary(void) | |||
581 | * smp_call_function(). | 581 | * smp_call_function(). |
582 | */ | 582 | */ |
583 | lock_ipi_call_lock(); | 583 | lock_ipi_call_lock(); |
584 | spin_lock(&vector_lock); | ||
584 | 585 | ||
586 | /* Setup the per cpu irq handling data structures */ | ||
587 | __setup_vector_irq(smp_processor_id()); | ||
585 | /* | 588 | /* |
586 | * Allow the master to continue. | 589 | * Allow the master to continue. |
587 | */ | 590 | */ |
588 | cpu_set(smp_processor_id(), cpu_online_map); | 591 | cpu_set(smp_processor_id(), cpu_online_map); |
589 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; | 592 | per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; |
593 | spin_unlock(&vector_lock); | ||
590 | unlock_ipi_call_lock(); | 594 | unlock_ipi_call_lock(); |
591 | 595 | ||
592 | cpu_idle(); | 596 | cpu_idle(); |
@@ -799,7 +803,6 @@ static int __cpuinit do_boot_cpu(int cpu, int apicid) | |||
799 | cpu, node); | 803 | cpu, node); |
800 | } | 804 | } |
801 | 805 | ||
802 | |||
803 | alternatives_smp_switch(1); | 806 | alternatives_smp_switch(1); |
804 | 807 | ||
805 | c_idle.idle = get_idle_for_cpu(cpu); | 808 | c_idle.idle = get_idle_for_cpu(cpu); |
@@ -1246,8 +1249,10 @@ int __cpu_disable(void) | |||
1246 | local_irq_disable(); | 1249 | local_irq_disable(); |
1247 | remove_siblinginfo(cpu); | 1250 | remove_siblinginfo(cpu); |
1248 | 1251 | ||
1252 | spin_lock(&vector_lock); | ||
1249 | /* It's now safe to remove this processor from the online map */ | 1253 | /* It's now safe to remove this processor from the online map */ |
1250 | cpu_clear(cpu, cpu_online_map); | 1254 | cpu_clear(cpu, cpu_online_map); |
1255 | spin_unlock(&vector_lock); | ||
1251 | remove_cpu_from_maps(); | 1256 | remove_cpu_from_maps(); |
1252 | fixup_irqs(cpu_online_map); | 1257 | fixup_irqs(cpu_online_map); |
1253 | return 0; | 1258 | return 0; |
diff --git a/arch/x86_64/kernel/vmlinux.lds.S b/arch/x86_64/kernel/vmlinux.lds.S index 1283614c9b24..edb24aa714b4 100644 --- a/arch/x86_64/kernel/vmlinux.lds.S +++ b/arch/x86_64/kernel/vmlinux.lds.S | |||
@@ -175,13 +175,7 @@ SECTIONS | |||
175 | __setup_end = .; | 175 | __setup_end = .; |
176 | __initcall_start = .; | 176 | __initcall_start = .; |
177 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { | 177 | .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) { |
178 | *(.initcall1.init) | 178 | INITCALLS |
179 | *(.initcall2.init) | ||
180 | *(.initcall3.init) | ||
181 | *(.initcall4.init) | ||
182 | *(.initcall5.init) | ||
183 | *(.initcall6.init) | ||
184 | *(.initcall7.init) | ||
185 | } | 179 | } |
186 | __initcall_end = .; | 180 | __initcall_end = .; |
187 | __con_initcall_start = .; | 181 | __con_initcall_start = .; |
diff --git a/arch/x86_64/pci/mmconfig.c b/arch/x86_64/pci/mmconfig.c index 7732f4254d21..e61093b34c26 100644 --- a/arch/x86_64/pci/mmconfig.c +++ b/arch/x86_64/pci/mmconfig.c | |||
@@ -220,7 +220,7 @@ void __init pci_mmcfg_init(int type) | |||
220 | 220 | ||
221 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); | 221 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); |
222 | if (pci_mmcfg_virt == NULL) { | 222 | if (pci_mmcfg_virt == NULL) { |
223 | printk("PCI: Can not allocate memory for mmconfig structures\n"); | 223 | printk(KERN_ERR "PCI: Can not allocate memory for mmconfig structures\n"); |
224 | return; | 224 | return; |
225 | } | 225 | } |
226 | for (i = 0; i < pci_mmcfg_config_num; ++i) { | 226 | for (i = 0; i < pci_mmcfg_config_num; ++i) { |
@@ -228,7 +228,8 @@ void __init pci_mmcfg_init(int type) | |||
228 | pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].base_address, | 228 | pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].base_address, |
229 | MMCONFIG_APER_MAX); | 229 | MMCONFIG_APER_MAX); |
230 | if (!pci_mmcfg_virt[i].virt) { | 230 | if (!pci_mmcfg_virt[i].virt) { |
231 | printk("PCI: Cannot map mmconfig aperture for segment %d\n", | 231 | printk(KERN_ERR "PCI: Cannot map mmconfig aperture for " |
232 | "segment %d\n", | ||
232 | pci_mmcfg_config[i].pci_segment_group_number); | 233 | pci_mmcfg_config[i].pci_segment_group_number); |
233 | return; | 234 | return; |
234 | } | 235 | } |
diff --git a/arch/xtensa/kernel/vmlinux.lds.S b/arch/xtensa/kernel/vmlinux.lds.S index ab6cdbd5eb68..cfe75f528725 100644 --- a/arch/xtensa/kernel/vmlinux.lds.S +++ b/arch/xtensa/kernel/vmlinux.lds.S | |||
@@ -184,13 +184,7 @@ SECTIONS | |||
184 | 184 | ||
185 | __initcall_start = .; | 185 | __initcall_start = .; |
186 | .initcall.init : { | 186 | .initcall.init : { |
187 | *(.initcall1.init) | 187 | INITCALLS |
188 | *(.initcall2.init) | ||
189 | *(.initcall3.init) | ||
190 | *(.initcall4.init) | ||
191 | *(.initcall5.init) | ||
192 | *(.initcall6.init) | ||
193 | *(.initcall7.init) | ||
194 | } | 188 | } |
195 | __initcall_end = .; | 189 | __initcall_end = .; |
196 | 190 | ||
diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 0b4e22436935..1429f3a2629e 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig | |||
@@ -37,8 +37,8 @@ config DEBUG_DRIVER | |||
37 | 37 | ||
38 | If you are unsure about this, say N here. | 38 | If you are unsure about this, say N here. |
39 | 39 | ||
40 | endmenu | ||
41 | |||
42 | config SYS_HYPERVISOR | 40 | config SYS_HYPERVISOR |
43 | bool | 41 | bool |
44 | default n | 42 | default n |
43 | |||
44 | endmenu | ||
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index db01b95a47a5..c5d6bb4290ad 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/device.h> | 18 | #include <linux/device.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/kthread.h> | 20 | #include <linux/kthread.h> |
21 | #include <linux/wait.h> | ||
21 | 22 | ||
22 | #include "base.h" | 23 | #include "base.h" |
23 | #include "power/power.h" | 24 | #include "power/power.h" |
@@ -70,6 +71,8 @@ struct stupid_thread_structure { | |||
70 | }; | 71 | }; |
71 | 72 | ||
72 | static atomic_t probe_count = ATOMIC_INIT(0); | 73 | static atomic_t probe_count = ATOMIC_INIT(0); |
74 | static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue); | ||
75 | |||
73 | static int really_probe(void *void_data) | 76 | static int really_probe(void *void_data) |
74 | { | 77 | { |
75 | struct stupid_thread_structure *data = void_data; | 78 | struct stupid_thread_structure *data = void_data; |
@@ -121,6 +124,7 @@ probe_failed: | |||
121 | done: | 124 | done: |
122 | kfree(data); | 125 | kfree(data); |
123 | atomic_dec(&probe_count); | 126 | atomic_dec(&probe_count); |
127 | wake_up(&probe_waitqueue); | ||
124 | return ret; | 128 | return ret; |
125 | } | 129 | } |
126 | 130 | ||
@@ -337,6 +341,32 @@ void driver_detach(struct device_driver * drv) | |||
337 | } | 341 | } |
338 | } | 342 | } |
339 | 343 | ||
344 | #ifdef CONFIG_PCI_MULTITHREAD_PROBE | ||
345 | static int __init wait_for_probes(void) | ||
346 | { | ||
347 | DEFINE_WAIT(wait); | ||
348 | |||
349 | printk(KERN_INFO "%s: waiting for %d threads\n", __FUNCTION__, | ||
350 | atomic_read(&probe_count)); | ||
351 | if (!atomic_read(&probe_count)) | ||
352 | return 0; | ||
353 | while (atomic_read(&probe_count)) { | ||
354 | prepare_to_wait(&probe_waitqueue, &wait, TASK_UNINTERRUPTIBLE); | ||
355 | if (atomic_read(&probe_count)) | ||
356 | schedule(); | ||
357 | } | ||
358 | finish_wait(&probe_waitqueue, &wait); | ||
359 | return 0; | ||
360 | } | ||
361 | |||
362 | core_initcall_sync(wait_for_probes); | ||
363 | postcore_initcall_sync(wait_for_probes); | ||
364 | arch_initcall_sync(wait_for_probes); | ||
365 | subsys_initcall_sync(wait_for_probes); | ||
366 | fs_initcall_sync(wait_for_probes); | ||
367 | device_initcall_sync(wait_for_probes); | ||
368 | late_initcall_sync(wait_for_probes); | ||
369 | #endif | ||
340 | 370 | ||
341 | EXPORT_SYMBOL_GPL(device_bind_driver); | 371 | EXPORT_SYMBOL_GPL(device_bind_driver); |
342 | EXPORT_SYMBOL_GPL(device_release_driver); | 372 | EXPORT_SYMBOL_GPL(device_release_driver); |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index bc6602606fb5..6ffe2b2bdacc 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1992,8 +1992,8 @@ cciss_read_capacity(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
1992 | *block_size = BLOCK_SIZE; | 1992 | *block_size = BLOCK_SIZE; |
1993 | } | 1993 | } |
1994 | if (*total_size != (__u32) 0) | 1994 | if (*total_size != (__u32) 0) |
1995 | printk(KERN_INFO " blocks= %lld block_size= %d\n", | 1995 | printk(KERN_INFO " blocks= %llu block_size= %d\n", |
1996 | *total_size, *block_size); | 1996 | (unsigned long long)*total_size, *block_size); |
1997 | kfree(buf); | 1997 | kfree(buf); |
1998 | return; | 1998 | return; |
1999 | } | 1999 | } |
@@ -2027,8 +2027,8 @@ cciss_read_capacity_16(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
2027 | *total_size = 0; | 2027 | *total_size = 0; |
2028 | *block_size = BLOCK_SIZE; | 2028 | *block_size = BLOCK_SIZE; |
2029 | } | 2029 | } |
2030 | printk(KERN_INFO " blocks= %lld block_size= %d\n", | 2030 | printk(KERN_INFO " blocks= %llu block_size= %d\n", |
2031 | *total_size, *block_size); | 2031 | (unsigned long long)*total_size, *block_size); |
2032 | kfree(buf); | 2032 | kfree(buf); |
2033 | return; | 2033 | return; |
2034 | } | 2034 | } |
diff --git a/drivers/char/drm/drm_bufs.c b/drivers/char/drm/drm_bufs.c index 029baea33b62..6eafff13dab6 100644 --- a/drivers/char/drm/drm_bufs.c +++ b/drivers/char/drm/drm_bufs.c | |||
@@ -237,6 +237,8 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset, | |||
237 | 237 | ||
238 | list = drm_alloc(sizeof(*list), DRM_MEM_MAPS); | 238 | list = drm_alloc(sizeof(*list), DRM_MEM_MAPS); |
239 | if (!list) { | 239 | if (!list) { |
240 | if (map->type == _DRM_REGISTERS) | ||
241 | drm_ioremapfree(map->handle, map->size, dev); | ||
240 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 242 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); |
241 | return -EINVAL; | 243 | return -EINVAL; |
242 | } | 244 | } |
@@ -252,6 +254,8 @@ static int drm_addmap_core(drm_device_t * dev, unsigned int offset, | |||
252 | map->offset; | 254 | map->offset; |
253 | ret = drm_map_handle(dev, &list->hash, user_token, 0); | 255 | ret = drm_map_handle(dev, &list->hash, user_token, 0); |
254 | if (ret) { | 256 | if (ret) { |
257 | if (map->type == _DRM_REGISTERS) | ||
258 | drm_ioremapfree(map->handle, map->size, dev); | ||
255 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); | 259 | drm_free(map, sizeof(*map), DRM_MEM_MAPS); |
256 | drm_free(list, sizeof(*list), DRM_MEM_MAPS); | 260 | drm_free(list, sizeof(*list), DRM_MEM_MAPS); |
257 | mutex_unlock(&dev->struct_mutex); | 261 | mutex_unlock(&dev->struct_mutex); |
diff --git a/drivers/char/drm/drm_sysfs.c b/drivers/char/drm/drm_sysfs.c index 51ad98c685c3..ba4b8de83cf0 100644 --- a/drivers/char/drm/drm_sysfs.c +++ b/drivers/char/drm/drm_sysfs.c | |||
@@ -42,13 +42,24 @@ static CLASS_ATTR(version, S_IRUGO, version_show, NULL); | |||
42 | struct class *drm_sysfs_create(struct module *owner, char *name) | 42 | struct class *drm_sysfs_create(struct module *owner, char *name) |
43 | { | 43 | { |
44 | struct class *class; | 44 | struct class *class; |
45 | int err; | ||
45 | 46 | ||
46 | class = class_create(owner, name); | 47 | class = class_create(owner, name); |
47 | if (!class) | 48 | if (!class) { |
48 | return class; | 49 | err = -ENOMEM; |
50 | goto err_out; | ||
51 | } | ||
52 | |||
53 | err = class_create_file(class, &class_attr_version); | ||
54 | if (err) | ||
55 | goto err_out_class; | ||
49 | 56 | ||
50 | class_create_file(class, &class_attr_version); | ||
51 | return class; | 57 | return class; |
58 | |||
59 | err_out_class: | ||
60 | class_destroy(class); | ||
61 | err_out: | ||
62 | return ERR_PTR(err); | ||
52 | } | 63 | } |
53 | 64 | ||
54 | /** | 65 | /** |
@@ -96,20 +107,36 @@ static struct class_device_attribute class_device_attrs[] = { | |||
96 | struct class_device *drm_sysfs_device_add(struct class *cs, drm_head_t *head) | 107 | struct class_device *drm_sysfs_device_add(struct class *cs, drm_head_t *head) |
97 | { | 108 | { |
98 | struct class_device *class_dev; | 109 | struct class_device *class_dev; |
99 | int i; | 110 | int i, j, err; |
100 | 111 | ||
101 | class_dev = class_device_create(cs, NULL, | 112 | class_dev = class_device_create(cs, NULL, |
102 | MKDEV(DRM_MAJOR, head->minor), | 113 | MKDEV(DRM_MAJOR, head->minor), |
103 | &(head->dev->pdev)->dev, | 114 | &(head->dev->pdev)->dev, |
104 | "card%d", head->minor); | 115 | "card%d", head->minor); |
105 | if (!class_dev) | 116 | if (!class_dev) { |
106 | return NULL; | 117 | err = -ENOMEM; |
118 | goto err_out; | ||
119 | } | ||
107 | 120 | ||
108 | class_set_devdata(class_dev, head); | 121 | class_set_devdata(class_dev, head); |
109 | 122 | ||
110 | for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) | 123 | for (i = 0; i < ARRAY_SIZE(class_device_attrs); i++) { |
111 | class_device_create_file(class_dev, &class_device_attrs[i]); | 124 | err = class_device_create_file(class_dev, |
125 | &class_device_attrs[i]); | ||
126 | if (err) | ||
127 | goto err_out_files; | ||
128 | } | ||
129 | |||
112 | return class_dev; | 130 | return class_dev; |
131 | |||
132 | err_out_files: | ||
133 | if (i > 0) | ||
134 | for (j = 0; j < i; j++) | ||
135 | class_device_remove_file(class_dev, | ||
136 | &class_device_attrs[i]); | ||
137 | class_device_unregister(class_dev); | ||
138 | err_out: | ||
139 | return ERR_PTR(err); | ||
113 | } | 140 | } |
114 | 141 | ||
115 | /** | 142 | /** |
diff --git a/drivers/char/drm/mga_drv.c b/drivers/char/drm/mga_drv.c index e30f556b79f1..be49dbb9ec3f 100644 --- a/drivers/char/drm/mga_drv.c +++ b/drivers/char/drm/mga_drv.c | |||
@@ -47,6 +47,7 @@ static struct drm_driver driver = { | |||
47 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | | 47 | DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | |
48 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | | 48 | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | |
49 | DRIVER_IRQ_VBL, | 49 | DRIVER_IRQ_VBL, |
50 | .dev_priv_size = sizeof(drm_mga_buf_priv_t), | ||
50 | .load = mga_driver_load, | 51 | .load = mga_driver_load, |
51 | .unload = mga_driver_unload, | 52 | .unload = mga_driver_unload, |
52 | .lastclose = mga_driver_lastclose, | 53 | .lastclose = mga_driver_lastclose, |
diff --git a/drivers/char/drm/r300_cmdbuf.c b/drivers/char/drm/r300_cmdbuf.c index 26bdf2ca59d7..d14477ba3679 100644 --- a/drivers/char/drm/r300_cmdbuf.c +++ b/drivers/char/drm/r300_cmdbuf.c | |||
@@ -538,6 +538,36 @@ static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv, | |||
538 | return 0; | 538 | return 0; |
539 | } | 539 | } |
540 | 540 | ||
541 | static __inline__ int r300_emit_indx_buffer(drm_radeon_private_t *dev_priv, | ||
542 | drm_radeon_kcmd_buffer_t *cmdbuf) | ||
543 | { | ||
544 | u32 *cmd = (u32 *) cmdbuf->buf; | ||
545 | int count, ret; | ||
546 | RING_LOCALS; | ||
547 | |||
548 | count=(cmd[0]>>16) & 0x3fff; | ||
549 | |||
550 | if ((cmd[1] & 0x8000ffff) != 0x80000810) { | ||
551 | DRM_ERROR("Invalid indx_buffer reg address %08X\n", cmd[1]); | ||
552 | return DRM_ERR(EINVAL); | ||
553 | } | ||
554 | ret = r300_check_offset(dev_priv, cmd[2]); | ||
555 | if (ret) { | ||
556 | DRM_ERROR("Invalid indx_buffer offset is %08X\n", cmd[2]); | ||
557 | return DRM_ERR(EINVAL); | ||
558 | } | ||
559 | |||
560 | BEGIN_RING(count+2); | ||
561 | OUT_RING(cmd[0]); | ||
562 | OUT_RING_TABLE((int *)(cmdbuf->buf + 4), count + 1); | ||
563 | ADVANCE_RING(); | ||
564 | |||
565 | cmdbuf->buf += (count+2)*4; | ||
566 | cmdbuf->bufsz -= (count+2)*4; | ||
567 | |||
568 | return 0; | ||
569 | } | ||
570 | |||
541 | static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv, | 571 | static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv, |
542 | drm_radeon_kcmd_buffer_t *cmdbuf) | 572 | drm_radeon_kcmd_buffer_t *cmdbuf) |
543 | { | 573 | { |
@@ -578,10 +608,11 @@ static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv, | |||
578 | case RADEON_CNTL_BITBLT_MULTI: | 608 | case RADEON_CNTL_BITBLT_MULTI: |
579 | return r300_emit_bitblt_multi(dev_priv, cmdbuf); | 609 | return r300_emit_bitblt_multi(dev_priv, cmdbuf); |
580 | 610 | ||
611 | case RADEON_CP_INDX_BUFFER: /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */ | ||
612 | return r300_emit_indx_buffer(dev_priv, cmdbuf); | ||
581 | case RADEON_CP_3D_DRAW_IMMD_2: /* triggers drawing using in-packet vertex data */ | 613 | case RADEON_CP_3D_DRAW_IMMD_2: /* triggers drawing using in-packet vertex data */ |
582 | case RADEON_CP_3D_DRAW_VBUF_2: /* triggers drawing of vertex buffers setup elsewhere */ | 614 | case RADEON_CP_3D_DRAW_VBUF_2: /* triggers drawing of vertex buffers setup elsewhere */ |
583 | case RADEON_CP_3D_DRAW_INDX_2: /* triggers drawing using indices to vertex buffer */ | 615 | case RADEON_CP_3D_DRAW_INDX_2: /* triggers drawing using indices to vertex buffer */ |
584 | case RADEON_CP_INDX_BUFFER: /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */ | ||
585 | case RADEON_WAIT_FOR_IDLE: | 616 | case RADEON_WAIT_FOR_IDLE: |
586 | case RADEON_CP_NOP: | 617 | case RADEON_CP_NOP: |
587 | /* these packets are safe */ | 618 | /* these packets are safe */ |
diff --git a/drivers/char/drm/radeon_state.c b/drivers/char/drm/radeon_state.c index feac5f005d47..6e04fdd732ac 100644 --- a/drivers/char/drm/radeon_state.c +++ b/drivers/char/drm/radeon_state.c | |||
@@ -275,6 +275,8 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * | |||
275 | unsigned int *cmdsz) | 275 | unsigned int *cmdsz) |
276 | { | 276 | { |
277 | u32 *cmd = (u32 *) cmdbuf->buf; | 277 | u32 *cmd = (u32 *) cmdbuf->buf; |
278 | u32 offset, narrays; | ||
279 | int count, i, k; | ||
278 | 280 | ||
279 | *cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16); | 281 | *cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16); |
280 | 282 | ||
@@ -288,10 +290,106 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * | |||
288 | return DRM_ERR(EINVAL); | 290 | return DRM_ERR(EINVAL); |
289 | } | 291 | } |
290 | 292 | ||
291 | /* Check client state and fix it up if necessary */ | 293 | switch(cmd[0] & 0xff00) { |
292 | if (cmd[0] & 0x8000) { /* MSB of opcode: next DWORD GUI_CNTL */ | 294 | /* XXX Are there old drivers needing other packets? */ |
293 | u32 offset; | ||
294 | 295 | ||
296 | case RADEON_3D_DRAW_IMMD: | ||
297 | case RADEON_3D_DRAW_VBUF: | ||
298 | case RADEON_3D_DRAW_INDX: | ||
299 | case RADEON_WAIT_FOR_IDLE: | ||
300 | case RADEON_CP_NOP: | ||
301 | case RADEON_3D_CLEAR_ZMASK: | ||
302 | /* case RADEON_CP_NEXT_CHAR: | ||
303 | case RADEON_CP_PLY_NEXTSCAN: | ||
304 | case RADEON_CP_SET_SCISSORS: */ /* probably safe but will never need them? */ | ||
305 | /* these packets are safe */ | ||
306 | break; | ||
307 | |||
308 | case RADEON_CP_3D_DRAW_IMMD_2: | ||
309 | case RADEON_CP_3D_DRAW_VBUF_2: | ||
310 | case RADEON_CP_3D_DRAW_INDX_2: | ||
311 | case RADEON_3D_CLEAR_HIZ: | ||
312 | /* safe but r200 only */ | ||
313 | if (dev_priv->microcode_version != UCODE_R200) { | ||
314 | DRM_ERROR("Invalid 3d packet for r100-class chip\n"); | ||
315 | return DRM_ERR(EINVAL); | ||
316 | } | ||
317 | break; | ||
318 | |||
319 | case RADEON_3D_LOAD_VBPNTR: | ||
320 | count = (cmd[0] >> 16) & 0x3fff; | ||
321 | |||
322 | if (count > 18) { /* 12 arrays max */ | ||
323 | DRM_ERROR("Too large payload in 3D_LOAD_VBPNTR (count=%d)\n", | ||
324 | count); | ||
325 | return DRM_ERR(EINVAL); | ||
326 | } | ||
327 | |||
328 | /* carefully check packet contents */ | ||
329 | narrays = cmd[1] & ~0xc000; | ||
330 | k = 0; | ||
331 | i = 2; | ||
332 | while ((k < narrays) && (i < (count + 2))) { | ||
333 | i++; /* skip attribute field */ | ||
334 | if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[i])) { | ||
335 | DRM_ERROR | ||
336 | ("Invalid offset (k=%d i=%d) in 3D_LOAD_VBPNTR packet.\n", | ||
337 | k, i); | ||
338 | return DRM_ERR(EINVAL); | ||
339 | } | ||
340 | k++; | ||
341 | i++; | ||
342 | if (k == narrays) | ||
343 | break; | ||
344 | /* have one more to process, they come in pairs */ | ||
345 | if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[i])) { | ||
346 | DRM_ERROR | ||
347 | ("Invalid offset (k=%d i=%d) in 3D_LOAD_VBPNTR packet.\n", | ||
348 | k, i); | ||
349 | return DRM_ERR(EINVAL); | ||
350 | } | ||
351 | k++; | ||
352 | i++; | ||
353 | } | ||
354 | /* do the counts match what we expect ? */ | ||
355 | if ((k != narrays) || (i != (count + 2))) { | ||
356 | DRM_ERROR | ||
357 | ("Malformed 3D_LOAD_VBPNTR packet (k=%d i=%d narrays=%d count+1=%d).\n", | ||
358 | k, i, narrays, count + 1); | ||
359 | return DRM_ERR(EINVAL); | ||
360 | } | ||
361 | break; | ||
362 | |||
363 | case RADEON_3D_RNDR_GEN_INDX_PRIM: | ||
364 | if (dev_priv->microcode_version != UCODE_R100) { | ||
365 | DRM_ERROR("Invalid 3d packet for r200-class chip\n"); | ||
366 | return DRM_ERR(EINVAL); | ||
367 | } | ||
368 | if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[1])) { | ||
369 | DRM_ERROR("Invalid rndr_gen_indx offset\n"); | ||
370 | return DRM_ERR(EINVAL); | ||
371 | } | ||
372 | break; | ||
373 | |||
374 | case RADEON_CP_INDX_BUFFER: | ||
375 | if (dev_priv->microcode_version != UCODE_R200) { | ||
376 | DRM_ERROR("Invalid 3d packet for r100-class chip\n"); | ||
377 | return DRM_ERR(EINVAL); | ||
378 | } | ||
379 | if ((cmd[1] & 0x8000ffff) != 0x80000810) { | ||
380 | DRM_ERROR("Invalid indx_buffer reg address %08X\n", cmd[1]); | ||
381 | return DRM_ERR(EINVAL); | ||
382 | } | ||
383 | if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[2])) { | ||
384 | DRM_ERROR("Invalid indx_buffer offset is %08X\n", cmd[2]); | ||
385 | return DRM_ERR(EINVAL); | ||
386 | } | ||
387 | break; | ||
388 | |||
389 | case RADEON_CNTL_HOSTDATA_BLT: | ||
390 | case RADEON_CNTL_PAINT_MULTI: | ||
391 | case RADEON_CNTL_BITBLT_MULTI: | ||
392 | /* MSB of opcode: next DWORD GUI_CNTL */ | ||
295 | if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL | 393 | if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL |
296 | | RADEON_GMC_DST_PITCH_OFFSET_CNTL)) { | 394 | | RADEON_GMC_DST_PITCH_OFFSET_CNTL)) { |
297 | offset = cmd[2] << 10; | 395 | offset = cmd[2] << 10; |
@@ -313,6 +411,11 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t * | |||
313 | } | 411 | } |
314 | cmd[3] = (cmd[3] & 0xffc00000) | offset >> 10; | 412 | cmd[3] = (cmd[3] & 0xffc00000) | offset >> 10; |
315 | } | 413 | } |
414 | break; | ||
415 | |||
416 | default: | ||
417 | DRM_ERROR("Invalid packet type %x\n", cmd[0] & 0xff00); | ||
418 | return DRM_ERR(EINVAL); | ||
316 | } | 419 | } |
317 | 420 | ||
318 | return 0; | 421 | return 0; |
diff --git a/drivers/char/drm/savage_bci.c b/drivers/char/drm/savage_bci.c index 59c7520bf9a2..a9a84f88df5e 100644 --- a/drivers/char/drm/savage_bci.c +++ b/drivers/char/drm/savage_bci.c | |||
@@ -728,6 +728,7 @@ static int savage_do_init_bci(drm_device_t * dev, drm_savage_init_t * init) | |||
728 | dev_priv->status = NULL; | 728 | dev_priv->status = NULL; |
729 | } | 729 | } |
730 | if (dev_priv->dma_type == SAVAGE_DMA_AGP && init->buffers_offset) { | 730 | if (dev_priv->dma_type == SAVAGE_DMA_AGP && init->buffers_offset) { |
731 | dev->agp_buffer_token = init->buffers_offset; | ||
731 | dev->agp_buffer_map = drm_core_findmap(dev, | 732 | dev->agp_buffer_map = drm_core_findmap(dev, |
732 | init->buffers_offset); | 733 | init->buffers_offset); |
733 | if (!dev->agp_buffer_map) { | 734 | if (!dev->agp_buffer_map) { |
diff --git a/drivers/char/drm/savage_state.c b/drivers/char/drm/savage_state.c index ef2581d16146..1ca1e9cb5a33 100644 --- a/drivers/char/drm/savage_state.c +++ b/drivers/char/drm/savage_state.c | |||
@@ -994,7 +994,7 @@ int savage_bci_cmdbuf(DRM_IOCTL_ARGS) | |||
994 | if (cmdbuf.size) { | 994 | if (cmdbuf.size) { |
995 | kcmd_addr = drm_alloc(cmdbuf.size * 8, DRM_MEM_DRIVER); | 995 | kcmd_addr = drm_alloc(cmdbuf.size * 8, DRM_MEM_DRIVER); |
996 | if (kcmd_addr == NULL) | 996 | if (kcmd_addr == NULL) |
997 | return ENOMEM; | 997 | return DRM_ERR(ENOMEM); |
998 | 998 | ||
999 | if (DRM_COPY_FROM_USER(kcmd_addr, cmdbuf.cmd_addr, | 999 | if (DRM_COPY_FROM_USER(kcmd_addr, cmdbuf.cmd_addr, |
1000 | cmdbuf.size * 8)) | 1000 | cmdbuf.size * 8)) |
diff --git a/drivers/char/watchdog/sc1200wdt.c b/drivers/char/watchdog/sc1200wdt.c index d8d0f28e0acf..e3239833e4b0 100644 --- a/drivers/char/watchdog/sc1200wdt.c +++ b/drivers/char/watchdog/sc1200wdt.c | |||
@@ -392,7 +392,7 @@ static int __init sc1200wdt_init(void) | |||
392 | if (io == -1) { | 392 | if (io == -1) { |
393 | printk(KERN_ERR PFX "io parameter must be specified\n"); | 393 | printk(KERN_ERR PFX "io parameter must be specified\n"); |
394 | ret = -EINVAL; | 394 | ret = -EINVAL; |
395 | goto out_clean; | 395 | goto out_pnp; |
396 | } | 396 | } |
397 | 397 | ||
398 | #if defined CONFIG_PNP | 398 | #if defined CONFIG_PNP |
@@ -405,7 +405,7 @@ static int __init sc1200wdt_init(void) | |||
405 | if (!request_region(io, io_len, SC1200_MODULE_NAME)) { | 405 | if (!request_region(io, io_len, SC1200_MODULE_NAME)) { |
406 | printk(KERN_ERR PFX "Unable to register IO port %#x\n", io); | 406 | printk(KERN_ERR PFX "Unable to register IO port %#x\n", io); |
407 | ret = -EBUSY; | 407 | ret = -EBUSY; |
408 | goto out_clean; | 408 | goto out_pnp; |
409 | } | 409 | } |
410 | 410 | ||
411 | ret = sc1200wdt_probe(); | 411 | ret = sc1200wdt_probe(); |
@@ -435,6 +435,11 @@ out_rbt: | |||
435 | out_io: | 435 | out_io: |
436 | release_region(io, io_len); | 436 | release_region(io, io_len); |
437 | 437 | ||
438 | out_pnp: | ||
439 | #if defined CONFIG_PNP | ||
440 | if (isapnp) | ||
441 | pnp_unregister_driver(&scl200wdt_pnp_driver); | ||
442 | #endif | ||
438 | goto out_clean; | 443 | goto out_clean; |
439 | } | 444 | } |
440 | 445 | ||
diff --git a/drivers/fc4/fc.c b/drivers/fc4/fc.c index 22d17474755f..ca4e67a022d0 100644 --- a/drivers/fc4/fc.c +++ b/drivers/fc4/fc.c | |||
@@ -70,9 +70,9 @@ | |||
70 | 70 | ||
71 | #define FCP_CMND(SCpnt) ((fcp_cmnd *)&(SCpnt->SCp)) | 71 | #define FCP_CMND(SCpnt) ((fcp_cmnd *)&(SCpnt->SCp)) |
72 | #define FC_SCMND(SCpnt) ((fc_channel *)(SCpnt->device->host->hostdata[0])) | 72 | #define FC_SCMND(SCpnt) ((fc_channel *)(SCpnt->device->host->hostdata[0])) |
73 | #define SC_FCMND(fcmnd) ((Scsi_Cmnd *)((long)fcmnd - (long)&(((Scsi_Cmnd *)0)->SCp))) | 73 | #define SC_FCMND(fcmnd) ((struct scsi_cmnd *)((long)fcmnd - (long)&(((struct scsi_cmnd *)0)->SCp))) |
74 | 74 | ||
75 | static int fcp_scsi_queue_it(fc_channel *, Scsi_Cmnd *, fcp_cmnd *, int); | 75 | static int fcp_scsi_queue_it(fc_channel *, struct scsi_cmnd *, fcp_cmnd *, int); |
76 | void fcp_queue_empty(fc_channel *); | 76 | void fcp_queue_empty(fc_channel *); |
77 | 77 | ||
78 | static void fcp_scsi_insert_queue (fc_channel *fc, fcp_cmnd *fcmd) | 78 | static void fcp_scsi_insert_queue (fc_channel *fc, fcp_cmnd *fcmd) |
@@ -378,14 +378,14 @@ void fcp_register(fc_channel *fc, u8 type, int unregister) | |||
378 | printk ("FC: %segistering unknown type %02x\n", unregister ? "Unr" : "R", type); | 378 | printk ("FC: %segistering unknown type %02x\n", unregister ? "Unr" : "R", type); |
379 | } | 379 | } |
380 | 380 | ||
381 | static void fcp_scsi_done(Scsi_Cmnd *SCpnt); | 381 | static void fcp_scsi_done(struct scsi_cmnd *SCpnt); |
382 | 382 | ||
383 | static inline void fcp_scsi_receive(fc_channel *fc, int token, int status, fc_hdr *fch) | 383 | static inline void fcp_scsi_receive(fc_channel *fc, int token, int status, fc_hdr *fch) |
384 | { | 384 | { |
385 | fcp_cmnd *fcmd; | 385 | fcp_cmnd *fcmd; |
386 | fcp_rsp *rsp; | 386 | fcp_rsp *rsp; |
387 | int host_status; | 387 | int host_status; |
388 | Scsi_Cmnd *SCpnt; | 388 | struct scsi_cmnd *SCpnt; |
389 | int sense_len; | 389 | int sense_len; |
390 | int rsp_status; | 390 | int rsp_status; |
391 | 391 | ||
@@ -757,13 +757,14 @@ void fcp_release(fc_channel *fcchain, int count) /* count must > 0 */ | |||
757 | } | 757 | } |
758 | 758 | ||
759 | 759 | ||
760 | static void fcp_scsi_done (Scsi_Cmnd *SCpnt) | 760 | static void fcp_scsi_done(struct scsi_cmnd *SCpnt) |
761 | { | 761 | { |
762 | if (FCP_CMND(SCpnt)->done) | 762 | if (FCP_CMND(SCpnt)->done) |
763 | FCP_CMND(SCpnt)->done(SCpnt); | 763 | FCP_CMND(SCpnt)->done(SCpnt); |
764 | } | 764 | } |
765 | 765 | ||
766 | static int fcp_scsi_queue_it(fc_channel *fc, Scsi_Cmnd *SCpnt, fcp_cmnd *fcmd, int prepare) | 766 | static int fcp_scsi_queue_it(fc_channel *fc, struct scsi_cmnd *SCpnt, |
767 | fcp_cmnd *fcmd, int prepare) | ||
767 | { | 768 | { |
768 | long i; | 769 | long i; |
769 | fcp_cmd *cmd; | 770 | fcp_cmd *cmd; |
@@ -837,7 +838,8 @@ static int fcp_scsi_queue_it(fc_channel *fc, Scsi_Cmnd *SCpnt, fcp_cmnd *fcmd, i | |||
837 | return 0; | 838 | return 0; |
838 | } | 839 | } |
839 | 840 | ||
840 | int fcp_scsi_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *)) | 841 | int fcp_scsi_queuecommand(struct scsi_cmnd *SCpnt, |
842 | void (* done)(struct scsi_cmnd *)) | ||
841 | { | 843 | { |
842 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); | 844 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); |
843 | fc_channel *fc = FC_SCMND(SCpnt); | 845 | fc_channel *fc = FC_SCMND(SCpnt); |
@@ -873,7 +875,7 @@ void fcp_queue_empty(fc_channel *fc) | |||
873 | } | 875 | } |
874 | } | 876 | } |
875 | 877 | ||
876 | int fcp_scsi_abort(Scsi_Cmnd *SCpnt) | 878 | int fcp_scsi_abort(struct scsi_cmnd *SCpnt) |
877 | { | 879 | { |
878 | /* Internal bookkeeping only. Lose 1 cmd_slots slot. */ | 880 | /* Internal bookkeeping only. Lose 1 cmd_slots slot. */ |
879 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); | 881 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); |
@@ -910,7 +912,7 @@ int fcp_scsi_abort(Scsi_Cmnd *SCpnt) | |||
910 | } | 912 | } |
911 | 913 | ||
912 | #if 0 | 914 | #if 0 |
913 | void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt) | 915 | void fcp_scsi_reset_done(struct scsi_cmnd *SCpnt) |
914 | { | 916 | { |
915 | fc_channel *fc = FC_SCMND(SCpnt); | 917 | fc_channel *fc = FC_SCMND(SCpnt); |
916 | 918 | ||
@@ -921,7 +923,7 @@ void fcp_scsi_reset_done(Scsi_Cmnd *SCpnt) | |||
921 | 923 | ||
922 | #define FCP_RESET_TIMEOUT (2*HZ) | 924 | #define FCP_RESET_TIMEOUT (2*HZ) |
923 | 925 | ||
924 | int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt) | 926 | int fcp_scsi_dev_reset(struct scsi_cmnd *SCpnt) |
925 | { | 927 | { |
926 | #if 0 /* broken junk, but if davem wants to compile this driver, let him.. */ | 928 | #if 0 /* broken junk, but if davem wants to compile this driver, let him.. */ |
927 | unsigned long flags; | 929 | unsigned long flags; |
@@ -931,7 +933,7 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt) | |||
931 | DECLARE_MUTEX_LOCKED(sem); | 933 | DECLARE_MUTEX_LOCKED(sem); |
932 | 934 | ||
933 | if (!fc->rst_pkt) { | 935 | if (!fc->rst_pkt) { |
934 | fc->rst_pkt = (Scsi_Cmnd *) kmalloc(sizeof(SCpnt), GFP_KERNEL); | 936 | fc->rst_pkt = (struct scsi_cmnd *) kmalloc(sizeof(SCpnt), GFP_KERNEL); |
935 | if (!fc->rst_pkt) return FAILED; | 937 | if (!fc->rst_pkt) return FAILED; |
936 | 938 | ||
937 | fcmd = FCP_CMND(fc->rst_pkt); | 939 | fcmd = FCP_CMND(fc->rst_pkt); |
@@ -999,7 +1001,7 @@ int fcp_scsi_dev_reset(Scsi_Cmnd *SCpnt) | |||
999 | return SUCCESS; | 1001 | return SUCCESS; |
1000 | } | 1002 | } |
1001 | 1003 | ||
1002 | static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt) | 1004 | static int __fcp_scsi_host_reset(struct scsi_cmnd *SCpnt) |
1003 | { | 1005 | { |
1004 | fc_channel *fc = FC_SCMND(SCpnt); | 1006 | fc_channel *fc = FC_SCMND(SCpnt); |
1005 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); | 1007 | fcp_cmnd *fcmd = FCP_CMND(SCpnt); |
@@ -1020,7 +1022,7 @@ static int __fcp_scsi_host_reset(Scsi_Cmnd *SCpnt) | |||
1020 | else return FAILED; | 1022 | else return FAILED; |
1021 | } | 1023 | } |
1022 | 1024 | ||
1023 | int fcp_scsi_host_reset(Scsi_Cmnd *SCpnt) | 1025 | int fcp_scsi_host_reset(struct scsi_cmnd *SCpnt) |
1024 | { | 1026 | { |
1025 | unsigned long flags; | 1027 | unsigned long flags; |
1026 | int rc; | 1028 | int rc; |
diff --git a/drivers/fc4/fcp_impl.h b/drivers/fc4/fcp_impl.h index c397c84bef63..1ac61330592e 100644 --- a/drivers/fc4/fcp_impl.h +++ b/drivers/fc4/fcp_impl.h | |||
@@ -39,7 +39,7 @@ struct _fc_channel; | |||
39 | typedef struct fcp_cmnd { | 39 | typedef struct fcp_cmnd { |
40 | struct fcp_cmnd *next; | 40 | struct fcp_cmnd *next; |
41 | struct fcp_cmnd *prev; | 41 | struct fcp_cmnd *prev; |
42 | void (*done)(Scsi_Cmnd *); | 42 | void (*done)(struct scsi_cmnd *); |
43 | unsigned short proto; | 43 | unsigned short proto; |
44 | unsigned short token; | 44 | unsigned short token; |
45 | unsigned int did; | 45 | unsigned int did; |
@@ -94,14 +94,14 @@ typedef struct _fc_channel { | |||
94 | long *scsi_bitmap; | 94 | long *scsi_bitmap; |
95 | long scsi_bitmap_end; | 95 | long scsi_bitmap_end; |
96 | int scsi_free; | 96 | int scsi_free; |
97 | int (*encode_addr)(Scsi_Cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *); | 97 | int (*encode_addr)(struct scsi_cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *); |
98 | fcp_cmnd *scsi_que; | 98 | fcp_cmnd *scsi_que; |
99 | char scsi_name[4]; | 99 | char scsi_name[4]; |
100 | fcp_cmnd **cmd_slots; | 100 | fcp_cmnd **cmd_slots; |
101 | int channels; | 101 | int channels; |
102 | int targets; | 102 | int targets; |
103 | long *ages; | 103 | long *ages; |
104 | Scsi_Cmnd *rst_pkt; | 104 | struct scsi_cmnd *rst_pkt; |
105 | fcp_posmap *posmap; | 105 | fcp_posmap *posmap; |
106 | /* LOGIN stuff */ | 106 | /* LOGIN stuff */ |
107 | fcp_cmnd *login; | 107 | fcp_cmnd *login; |
@@ -155,9 +155,10 @@ int fc_do_prli(fc_channel *, unsigned char); | |||
155 | for_each_fc_channel(fc) \ | 155 | for_each_fc_channel(fc) \ |
156 | if (fc->state == FC_STATE_ONLINE) | 156 | if (fc->state == FC_STATE_ONLINE) |
157 | 157 | ||
158 | int fcp_scsi_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); | 158 | int fcp_scsi_queuecommand(struct scsi_cmnd *, |
159 | int fcp_scsi_abort(Scsi_Cmnd *); | 159 | void (* done) (struct scsi_cmnd *)); |
160 | int fcp_scsi_dev_reset(Scsi_Cmnd *); | 160 | int fcp_scsi_abort(struct scsi_cmnd *); |
161 | int fcp_scsi_host_reset(Scsi_Cmnd *); | 161 | int fcp_scsi_dev_reset(struct scsi_cmnd *); |
162 | int fcp_scsi_host_reset(struct scsi_cmnd *); | ||
162 | 163 | ||
163 | #endif /* !(_FCP_SCSI_H) */ | 164 | #endif /* !(_FCP_SCSI_H) */ |
diff --git a/drivers/ide/pci/generic.c b/drivers/ide/pci/generic.c index ad418ce882ca..e72ab36a5494 100644 --- a/drivers/ide/pci/generic.c +++ b/drivers/ide/pci/generic.c | |||
@@ -247,8 +247,10 @@ static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_devi | |||
247 | (!(PCI_FUNC(dev->devfn) & 1))) | 247 | (!(PCI_FUNC(dev->devfn) & 1))) |
248 | goto out; | 248 | goto out; |
249 | 249 | ||
250 | if (dev->vendor == PCI_VENDOR_ID_JMICRON && PCI_FUNC(dev->devfn) != 1) | 250 | if (dev->vendor == PCI_VENDOR_ID_JMICRON) { |
251 | goto out; | 251 | if (dev->device != PCI_DEVICE_ID_JMICRON_JMB368 && PCI_FUNC(dev->devfn) != 1) |
252 | goto out; | ||
253 | } | ||
252 | 254 | ||
253 | if (dev->vendor != PCI_VENDOR_ID_JMICRON) { | 255 | if (dev->vendor != PCI_VENDOR_ID_JMICRON) { |
254 | pci_read_config_word(dev, PCI_COMMAND, &command); | 256 | pci_read_config_word(dev, PCI_COMMAND, &command); |
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c index dea13525df88..6e8ea9110c46 100644 --- a/drivers/ieee1394/ohci1394.c +++ b/drivers/ieee1394/ohci1394.c | |||
@@ -3552,12 +3552,21 @@ static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state) | |||
3552 | { | 3552 | { |
3553 | int err; | 3553 | int err; |
3554 | 3554 | ||
3555 | printk(KERN_INFO "%s does not fully support suspend and resume yet\n", | ||
3556 | OHCI1394_DRIVER_NAME); | ||
3557 | |||
3555 | err = pci_save_state(pdev); | 3558 | err = pci_save_state(pdev); |
3556 | if (err) | 3559 | if (err) { |
3557 | goto out; | 3560 | printk(KERN_ERR "%s: pci_save_state failed with %d\n", |
3561 | OHCI1394_DRIVER_NAME, err); | ||
3562 | return err; | ||
3563 | } | ||
3558 | err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 3564 | err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
3565 | #ifdef OHCI1394_DEBUG | ||
3559 | if (err) | 3566 | if (err) |
3560 | goto out; | 3567 | printk(KERN_DEBUG "%s: pci_set_power_state failed with %d\n", |
3568 | OHCI1394_DRIVER_NAME, err); | ||
3569 | #endif /* OHCI1394_DEBUG */ | ||
3561 | 3570 | ||
3562 | /* PowerMac suspend code comes last */ | 3571 | /* PowerMac suspend code comes last */ |
3563 | #ifdef CONFIG_PPC_PMAC | 3572 | #ifdef CONFIG_PPC_PMAC |
@@ -3570,8 +3579,8 @@ static int ohci1394_pci_suspend (struct pci_dev *pdev, pm_message_t state) | |||
3570 | pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0); | 3579 | pmac_call_feature(PMAC_FTR_1394_ENABLE, of_node, 0, 0); |
3571 | } | 3580 | } |
3572 | #endif /* CONFIG_PPC_PMAC */ | 3581 | #endif /* CONFIG_PPC_PMAC */ |
3573 | out: | 3582 | |
3574 | return err; | 3583 | return 0; |
3575 | } | 3584 | } |
3576 | #endif /* CONFIG_PM */ | 3585 | #endif /* CONFIG_PM */ |
3577 | 3586 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index 7daa7b1e145f..50ab4a936e30 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -2003,6 +2003,7 @@ static mdk_rdev_t *md_import_device(dev_t newdev, int super_format, int super_mi | |||
2003 | kobject_init(&rdev->kobj); | 2003 | kobject_init(&rdev->kobj); |
2004 | 2004 | ||
2005 | rdev->desc_nr = -1; | 2005 | rdev->desc_nr = -1; |
2006 | rdev->saved_raid_disk = -1; | ||
2006 | rdev->flags = 0; | 2007 | rdev->flags = 0; |
2007 | rdev->data_offset = 0; | 2008 | rdev->data_offset = 0; |
2008 | rdev->sb_events = 0; | 2009 | rdev->sb_events = 0; |
@@ -4044,11 +4045,8 @@ static int update_size(mddev_t *mddev, unsigned long size) | |||
4044 | return -EBUSY; | 4045 | return -EBUSY; |
4045 | ITERATE_RDEV(mddev,rdev,tmp) { | 4046 | ITERATE_RDEV(mddev,rdev,tmp) { |
4046 | sector_t avail; | 4047 | sector_t avail; |
4047 | if (rdev->sb_offset > rdev->data_offset) | 4048 | avail = rdev->size * 2; |
4048 | avail = (rdev->sb_offset*2) - rdev->data_offset; | 4049 | |
4049 | else | ||
4050 | avail = get_capacity(rdev->bdev->bd_disk) | ||
4051 | - rdev->data_offset; | ||
4052 | if (fit && (size == 0 || size > avail/2)) | 4050 | if (fit && (size == 0 || size > avail/2)) |
4053 | size = avail/2; | 4051 | size = avail/2; |
4054 | if (avail < ((sector_t)size << 1)) | 4052 | if (avail < ((sector_t)size << 1)) |
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index a6260f0e3b9e..14da37fee37b 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
@@ -277,6 +277,7 @@ static void multipath_error (mddev_t *mddev, mdk_rdev_t *rdev) | |||
277 | set_bit(Faulty, &rdev->flags); | 277 | set_bit(Faulty, &rdev->flags); |
278 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 278 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
279 | conf->working_disks--; | 279 | conf->working_disks--; |
280 | mddev->degraded++; | ||
280 | printk(KERN_ALERT "multipath: IO failure on %s," | 281 | printk(KERN_ALERT "multipath: IO failure on %s," |
281 | " disabling IO path. \n Operation continuing" | 282 | " disabling IO path. \n Operation continuing" |
282 | " on %d IO paths.\n", | 283 | " on %d IO paths.\n", |
@@ -336,6 +337,7 @@ static int multipath_add_disk(mddev_t *mddev, mdk_rdev_t *rdev) | |||
336 | blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); | 337 | blk_queue_max_sectors(mddev->queue, PAGE_SIZE>>9); |
337 | 338 | ||
338 | conf->working_disks++; | 339 | conf->working_disks++; |
340 | mddev->degraded--; | ||
339 | rdev->raid_disk = path; | 341 | rdev->raid_disk = path; |
340 | set_bit(In_sync, &rdev->flags); | 342 | set_bit(In_sync, &rdev->flags); |
341 | rcu_assign_pointer(p->rdev, rdev); | 343 | rcu_assign_pointer(p->rdev, rdev); |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index dc9d2def0270..656fae912fe3 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1474,8 +1474,8 @@ static void fix_read_error(conf_t *conf, int read_disk, | |||
1474 | "raid1:%s: read error corrected " | 1474 | "raid1:%s: read error corrected " |
1475 | "(%d sectors at %llu on %s)\n", | 1475 | "(%d sectors at %llu on %s)\n", |
1476 | mdname(mddev), s, | 1476 | mdname(mddev), s, |
1477 | (unsigned long long)sect + | 1477 | (unsigned long long)(sect + |
1478 | rdev->data_offset, | 1478 | rdev->data_offset), |
1479 | bdevname(rdev->bdev, b)); | 1479 | bdevname(rdev->bdev, b)); |
1480 | } | 1480 | } |
1481 | } | 1481 | } |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 74f17a9a6ebb..7492d6033ac6 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -1470,8 +1470,8 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | |||
1470 | "raid10:%s: read error corrected" | 1470 | "raid10:%s: read error corrected" |
1471 | " (%d sectors at %llu on %s)\n", | 1471 | " (%d sectors at %llu on %s)\n", |
1472 | mdname(mddev), s, | 1472 | mdname(mddev), s, |
1473 | (unsigned long long)sect+ | 1473 | (unsigned long long)(sect+ |
1474 | rdev->data_offset, | 1474 | rdev->data_offset), |
1475 | bdevname(rdev->bdev, b)); | 1475 | bdevname(rdev->bdev, b)); |
1476 | 1476 | ||
1477 | rdev_dec_pending(rdev, mddev); | 1477 | rdev_dec_pending(rdev, mddev); |
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index c537d71c18e4..a4afad4ecab2 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
@@ -75,8 +75,8 @@ | |||
75 | #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR | 75 | #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR |
76 | #endif | 76 | #endif |
77 | 77 | ||
78 | #define MPT_LINUX_VERSION_COMMON "3.04.01" | 78 | #define MPT_LINUX_VERSION_COMMON "3.04.02" |
79 | #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.01" | 79 | #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.02" |
80 | #define WHAT_MAGIC_STRING "@" "(" "#" ")" | 80 | #define WHAT_MAGIC_STRING "@" "(" "#" ")" |
81 | 81 | ||
82 | #define show_mptmod_ver(s,ver) \ | 82 | #define show_mptmod_ver(s,ver) \ |
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index e57bb035a021..1dd491773150 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c | |||
@@ -96,6 +96,10 @@ static int mptfc_qcmd(struct scsi_cmnd *SCpnt, | |||
96 | static void mptfc_target_destroy(struct scsi_target *starget); | 96 | static void mptfc_target_destroy(struct scsi_target *starget); |
97 | static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout); | 97 | static void mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout); |
98 | static void __devexit mptfc_remove(struct pci_dev *pdev); | 98 | static void __devexit mptfc_remove(struct pci_dev *pdev); |
99 | static int mptfc_abort(struct scsi_cmnd *SCpnt); | ||
100 | static int mptfc_dev_reset(struct scsi_cmnd *SCpnt); | ||
101 | static int mptfc_bus_reset(struct scsi_cmnd *SCpnt); | ||
102 | static int mptfc_host_reset(struct scsi_cmnd *SCpnt); | ||
99 | 103 | ||
100 | static struct scsi_host_template mptfc_driver_template = { | 104 | static struct scsi_host_template mptfc_driver_template = { |
101 | .module = THIS_MODULE, | 105 | .module = THIS_MODULE, |
@@ -110,10 +114,10 @@ static struct scsi_host_template mptfc_driver_template = { | |||
110 | .target_destroy = mptfc_target_destroy, | 114 | .target_destroy = mptfc_target_destroy, |
111 | .slave_destroy = mptscsih_slave_destroy, | 115 | .slave_destroy = mptscsih_slave_destroy, |
112 | .change_queue_depth = mptscsih_change_queue_depth, | 116 | .change_queue_depth = mptscsih_change_queue_depth, |
113 | .eh_abort_handler = mptscsih_abort, | 117 | .eh_abort_handler = mptfc_abort, |
114 | .eh_device_reset_handler = mptscsih_dev_reset, | 118 | .eh_device_reset_handler = mptfc_dev_reset, |
115 | .eh_bus_reset_handler = mptscsih_bus_reset, | 119 | .eh_bus_reset_handler = mptfc_bus_reset, |
116 | .eh_host_reset_handler = mptscsih_host_reset, | 120 | .eh_host_reset_handler = mptfc_host_reset, |
117 | .bios_param = mptscsih_bios_param, | 121 | .bios_param = mptscsih_bios_param, |
118 | .can_queue = MPT_FC_CAN_QUEUE, | 122 | .can_queue = MPT_FC_CAN_QUEUE, |
119 | .this_id = -1, | 123 | .this_id = -1, |
@@ -171,6 +175,77 @@ static struct fc_function_template mptfc_transport_functions = { | |||
171 | .show_host_symbolic_name = 1, | 175 | .show_host_symbolic_name = 1, |
172 | }; | 176 | }; |
173 | 177 | ||
178 | static int | ||
179 | mptfc_block_error_handler(struct scsi_cmnd *SCpnt, | ||
180 | int (*func)(struct scsi_cmnd *SCpnt), | ||
181 | const char *caller) | ||
182 | { | ||
183 | struct scsi_device *sdev = SCpnt->device; | ||
184 | struct Scsi_Host *shost = sdev->host; | ||
185 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); | ||
186 | unsigned long flags; | ||
187 | int ready; | ||
188 | |||
189 | spin_lock_irqsave(shost->host_lock, flags); | ||
190 | while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) { | ||
191 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
192 | dfcprintk ((MYIOC_s_INFO_FMT | ||
193 | "mptfc_block_error_handler.%d: %d:%d, port status is " | ||
194 | "DID_IMM_RETRY, deferring %s recovery.\n", | ||
195 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | ||
196 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, | ||
197 | SCpnt->device->id,SCpnt->device->lun,caller)); | ||
198 | msleep(1000); | ||
199 | spin_lock_irqsave(shost->host_lock, flags); | ||
200 | } | ||
201 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
202 | |||
203 | if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) { | ||
204 | dfcprintk ((MYIOC_s_INFO_FMT | ||
205 | "%s.%d: %d:%d, failing recovery, " | ||
206 | "port state %d, vdev %p.\n", caller, | ||
207 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | ||
208 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, | ||
209 | SCpnt->device->id,SCpnt->device->lun,ready, | ||
210 | SCpnt->device->hostdata)); | ||
211 | return FAILED; | ||
212 | } | ||
213 | dfcprintk ((MYIOC_s_INFO_FMT | ||
214 | "%s.%d: %d:%d, executing recovery.\n", caller, | ||
215 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | ||
216 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, | ||
217 | SCpnt->device->id,SCpnt->device->lun)); | ||
218 | return (*func)(SCpnt); | ||
219 | } | ||
220 | |||
221 | static int | ||
222 | mptfc_abort(struct scsi_cmnd *SCpnt) | ||
223 | { | ||
224 | return | ||
225 | mptfc_block_error_handler(SCpnt, mptscsih_abort, __FUNCTION__); | ||
226 | } | ||
227 | |||
228 | static int | ||
229 | mptfc_dev_reset(struct scsi_cmnd *SCpnt) | ||
230 | { | ||
231 | return | ||
232 | mptfc_block_error_handler(SCpnt, mptscsih_dev_reset, __FUNCTION__); | ||
233 | } | ||
234 | |||
235 | static int | ||
236 | mptfc_bus_reset(struct scsi_cmnd *SCpnt) | ||
237 | { | ||
238 | return | ||
239 | mptfc_block_error_handler(SCpnt, mptscsih_bus_reset, __FUNCTION__); | ||
240 | } | ||
241 | |||
242 | static int | ||
243 | mptfc_host_reset(struct scsi_cmnd *SCpnt) | ||
244 | { | ||
245 | return | ||
246 | mptfc_block_error_handler(SCpnt, mptscsih_host_reset, __FUNCTION__); | ||
247 | } | ||
248 | |||
174 | static void | 249 | static void |
175 | mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) | 250 | mptfc_set_rport_loss_tmo(struct fc_rport *rport, uint32_t timeout) |
176 | { | 251 | { |
@@ -562,6 +637,12 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) | |||
562 | return 0; | 637 | return 0; |
563 | } | 638 | } |
564 | 639 | ||
640 | if (!SCpnt->device->hostdata) { /* vdev */ | ||
641 | SCpnt->result = DID_NO_CONNECT << 16; | ||
642 | done(SCpnt); | ||
643 | return 0; | ||
644 | } | ||
645 | |||
565 | /* dd_data is null until finished adding target */ | 646 | /* dd_data is null until finished adding target */ |
566 | ri = *((struct mptfc_rport_info **)rport->dd_data); | 647 | ri = *((struct mptfc_rport_info **)rport->dd_data); |
567 | if (unlikely(!ri)) { | 648 | if (unlikely(!ri)) { |
diff --git a/drivers/misc/ioc4.c b/drivers/misc/ioc4.c index 79354bbbbd6a..b995a15b7526 100644 --- a/drivers/misc/ioc4.c +++ b/drivers/misc/ioc4.c | |||
@@ -210,8 +210,8 @@ ioc4_clock_calibrate(struct ioc4_driver_data *idd) | |||
210 | 210 | ||
211 | do_div(ns, IOC4_EXTINT_COUNT_DIVISOR); | 211 | do_div(ns, IOC4_EXTINT_COUNT_DIVISOR); |
212 | printk(KERN_DEBUG | 212 | printk(KERN_DEBUG |
213 | "IOC4 %s: PCI clock is %lld ns.\n", | 213 | "IOC4 %s: PCI clock is %llu ns.\n", |
214 | pci_name(idd->idd_pdev), ns); | 214 | pci_name(idd->idd_pdev), (unsigned long long)ns); |
215 | } | 215 | } |
216 | 216 | ||
217 | /* Remember results. We store the extint clock period rather | 217 | /* Remember results. We store the extint clock period rather |
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index baece61169f4..41bfcae1fbf4 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -1479,6 +1479,7 @@ static void nand_write_page_syndrome(struct mtd_info *mtd, | |||
1479 | * @buf: the data to write | 1479 | * @buf: the data to write |
1480 | * @page: page number to write | 1480 | * @page: page number to write |
1481 | * @cached: cached programming | 1481 | * @cached: cached programming |
1482 | * @raw: use _raw version of write_page | ||
1482 | */ | 1483 | */ |
1483 | static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, | 1484 | static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip, |
1484 | const uint8_t *buf, int page, int cached, int raw) | 1485 | const uint8_t *buf, int page, int cached, int raw) |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index e2ed24918a58..e38846eb51fa 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -2717,6 +2717,7 @@ config PPP_MPPE | |||
2717 | select CRYPTO | 2717 | select CRYPTO |
2718 | select CRYPTO_SHA1 | 2718 | select CRYPTO_SHA1 |
2719 | select CRYPTO_ARC4 | 2719 | select CRYPTO_ARC4 |
2720 | select CRYPTO_ECB | ||
2720 | ---help--- | 2721 | ---help--- |
2721 | Support for the MPPE Encryption protocol, as employed by the | 2722 | Support for the MPPE Encryption protocol, as employed by the |
2722 | Microsoft Point-to-Point Tunneling Protocol. | 2723 | Microsoft Point-to-Point Tunneling Protocol. |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index a3a08a5dd185..19ab3441269c 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -2719,7 +2719,10 @@ static int e100_suspend(struct pci_dev *pdev, pm_message_t state) | |||
2719 | struct net_device *netdev = pci_get_drvdata(pdev); | 2719 | struct net_device *netdev = pci_get_drvdata(pdev); |
2720 | struct nic *nic = netdev_priv(netdev); | 2720 | struct nic *nic = netdev_priv(netdev); |
2721 | 2721 | ||
2722 | netif_poll_disable(nic->netdev); | 2722 | #ifdef CONFIG_E100_NAPI |
2723 | if (netif_running(netdev)) | ||
2724 | netif_poll_disable(nic->netdev); | ||
2725 | #endif | ||
2723 | del_timer_sync(&nic->watchdog); | 2726 | del_timer_sync(&nic->watchdog); |
2724 | netif_carrier_off(nic->netdev); | 2727 | netif_carrier_off(nic->netdev); |
2725 | 2728 | ||
@@ -2763,7 +2766,10 @@ static void e100_shutdown(struct pci_dev *pdev) | |||
2763 | struct net_device *netdev = pci_get_drvdata(pdev); | 2766 | struct net_device *netdev = pci_get_drvdata(pdev); |
2764 | struct nic *nic = netdev_priv(netdev); | 2767 | struct nic *nic = netdev_priv(netdev); |
2765 | 2768 | ||
2766 | netif_poll_disable(nic->netdev); | 2769 | #ifdef CONFIG_E100_NAPI |
2770 | if (netif_running(netdev)) | ||
2771 | netif_poll_disable(nic->netdev); | ||
2772 | #endif | ||
2767 | del_timer_sync(&nic->watchdog); | 2773 | del_timer_sync(&nic->watchdog); |
2768 | netif_carrier_off(nic->netdev); | 2774 | netif_carrier_off(nic->netdev); |
2769 | 2775 | ||
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 773821e4cf57..c564adbd669b 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
@@ -461,7 +461,8 @@ e1000_get_regs(struct net_device *netdev, | |||
461 | regs_buff[24] = (uint32_t)phy_data; /* phy local receiver status */ | 461 | regs_buff[24] = (uint32_t)phy_data; /* phy local receiver status */ |
462 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ | 462 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ |
463 | if (hw->mac_type >= e1000_82540 && | 463 | if (hw->mac_type >= e1000_82540 && |
464 | hw->media_type == e1000_media_type_copper) { | 464 | hw->mac_type < e1000_82571 && |
465 | hw->media_type == e1000_media_type_copper) { | ||
465 | regs_buff[26] = E1000_READ_REG(hw, MANC); | 466 | regs_buff[26] = E1000_READ_REG(hw, MANC); |
466 | } | 467 | } |
467 | } | 468 | } |
@@ -1690,6 +1691,7 @@ static int e1000_wol_exclusion(struct e1000_adapter *adapter, struct ethtool_wol | |||
1690 | int retval = 1; /* fail by default */ | 1691 | int retval = 1; /* fail by default */ |
1691 | 1692 | ||
1692 | switch (hw->device_id) { | 1693 | switch (hw->device_id) { |
1694 | case E1000_DEV_ID_82542: | ||
1693 | case E1000_DEV_ID_82543GC_FIBER: | 1695 | case E1000_DEV_ID_82543GC_FIBER: |
1694 | case E1000_DEV_ID_82543GC_COPPER: | 1696 | case E1000_DEV_ID_82543GC_COPPER: |
1695 | case E1000_DEV_ID_82544EI_FIBER: | 1697 | case E1000_DEV_ID_82544EI_FIBER: |
diff --git a/drivers/net/e1000/e1000_hw.h b/drivers/net/e1000/e1000_hw.h index 112447fd8bf2..449a60303e07 100644 --- a/drivers/net/e1000/e1000_hw.h +++ b/drivers/net/e1000/e1000_hw.h | |||
@@ -1961,9 +1961,9 @@ struct e1000_hw { | |||
1961 | #define E1000_RXDCTL_GRAN 0x01000000 /* RXDCTL Granularity */ | 1961 | #define E1000_RXDCTL_GRAN 0x01000000 /* RXDCTL Granularity */ |
1962 | 1962 | ||
1963 | /* Transmit Descriptor Control */ | 1963 | /* Transmit Descriptor Control */ |
1964 | #define E1000_TXDCTL_PTHRESH 0x000000FF /* TXDCTL Prefetch Threshold */ | 1964 | #define E1000_TXDCTL_PTHRESH 0x0000003F /* TXDCTL Prefetch Threshold */ |
1965 | #define E1000_TXDCTL_HTHRESH 0x0000FF00 /* TXDCTL Host Threshold */ | 1965 | #define E1000_TXDCTL_HTHRESH 0x00003F00 /* TXDCTL Host Threshold */ |
1966 | #define E1000_TXDCTL_WTHRESH 0x00FF0000 /* TXDCTL Writeback Threshold */ | 1966 | #define E1000_TXDCTL_WTHRESH 0x003F0000 /* TXDCTL Writeback Threshold */ |
1967 | #define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ | 1967 | #define E1000_TXDCTL_GRAN 0x01000000 /* TXDCTL Granularity */ |
1968 | #define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ | 1968 | #define E1000_TXDCTL_LWTHRESH 0xFE000000 /* TXDCTL Low Threshold */ |
1969 | #define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ | 1969 | #define E1000_TXDCTL_FULL_TX_DESC_WB 0x01010000 /* GRAN=1, WTHRESH=1 */ |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index fa849831d099..8d04752777a8 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -35,7 +35,7 @@ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; | |||
35 | #else | 35 | #else |
36 | #define DRIVERNAPI "-NAPI" | 36 | #define DRIVERNAPI "-NAPI" |
37 | #endif | 37 | #endif |
38 | #define DRV_VERSION "7.2.9-k2"DRIVERNAPI | 38 | #define DRV_VERSION "7.2.9-k4"DRIVERNAPI |
39 | char e1000_driver_version[] = DRV_VERSION; | 39 | char e1000_driver_version[] = DRV_VERSION; |
40 | static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; | 40 | static char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; |
41 | 41 | ||
@@ -699,7 +699,10 @@ e1000_reset(struct e1000_adapter *adapter) | |||
699 | phy_data); | 699 | phy_data); |
700 | } | 700 | } |
701 | 701 | ||
702 | if ((adapter->en_mng_pt) && (adapter->hw.mac_type < e1000_82571)) { | 702 | if ((adapter->en_mng_pt) && |
703 | (adapter->hw.mac_type >= e1000_82540) && | ||
704 | (adapter->hw.mac_type < e1000_82571) && | ||
705 | (adapter->hw.media_type == e1000_media_type_copper)) { | ||
703 | manc = E1000_READ_REG(&adapter->hw, MANC); | 706 | manc = E1000_READ_REG(&adapter->hw, MANC); |
704 | manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST); | 707 | manc |= (E1000_MANC_ARP_EN | E1000_MANC_EN_MNG2HOST); |
705 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | 708 | E1000_WRITE_REG(&adapter->hw, MANC, manc); |
@@ -1076,8 +1079,9 @@ e1000_remove(struct pci_dev *pdev) | |||
1076 | 1079 | ||
1077 | flush_scheduled_work(); | 1080 | flush_scheduled_work(); |
1078 | 1081 | ||
1079 | if (adapter->hw.mac_type < e1000_82571 && | 1082 | if (adapter->hw.mac_type >= e1000_82540 && |
1080 | adapter->hw.media_type == e1000_media_type_copper) { | 1083 | adapter->hw.mac_type < e1000_82571 && |
1084 | adapter->hw.media_type == e1000_media_type_copper) { | ||
1081 | manc = E1000_READ_REG(&adapter->hw, MANC); | 1085 | manc = E1000_READ_REG(&adapter->hw, MANC); |
1082 | if (manc & E1000_MANC_SMBUS_EN) { | 1086 | if (manc & E1000_MANC_SMBUS_EN) { |
1083 | manc |= E1000_MANC_ARP_EN; | 1087 | manc |= E1000_MANC_ARP_EN; |
@@ -1804,9 +1808,11 @@ e1000_setup_rctl(struct e1000_adapter *adapter) | |||
1804 | * followed by the page buffers. Therefore, skb->data is | 1808 | * followed by the page buffers. Therefore, skb->data is |
1805 | * sized to hold the largest protocol header. | 1809 | * sized to hold the largest protocol header. |
1806 | */ | 1810 | */ |
1811 | /* allocations using alloc_page take too long for regular MTU | ||
1812 | * so only enable packet split for jumbo frames */ | ||
1807 | pages = PAGE_USE_COUNT(adapter->netdev->mtu); | 1813 | pages = PAGE_USE_COUNT(adapter->netdev->mtu); |
1808 | if ((adapter->hw.mac_type > e1000_82547_rev_2) && (pages <= 3) && | 1814 | if ((adapter->hw.mac_type >= e1000_82571) && (pages <= 3) && |
1809 | PAGE_SIZE <= 16384) | 1815 | PAGE_SIZE <= 16384 && (rctl & E1000_RCTL_LPE)) |
1810 | adapter->rx_ps_pages = pages; | 1816 | adapter->rx_ps_pages = pages; |
1811 | else | 1817 | else |
1812 | adapter->rx_ps_pages = 0; | 1818 | adapter->rx_ps_pages = 0; |
@@ -2986,6 +2992,11 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
2986 | return NETDEV_TX_OK; | 2992 | return NETDEV_TX_OK; |
2987 | } | 2993 | } |
2988 | 2994 | ||
2995 | /* 82571 and newer doesn't need the workaround that limited descriptor | ||
2996 | * length to 4kB */ | ||
2997 | if (adapter->hw.mac_type >= e1000_82571) | ||
2998 | max_per_txd = 8192; | ||
2999 | |||
2989 | #ifdef NETIF_F_TSO | 3000 | #ifdef NETIF_F_TSO |
2990 | mss = skb_shinfo(skb)->gso_size; | 3001 | mss = skb_shinfo(skb)->gso_size; |
2991 | /* The controller does a simple calculation to | 3002 | /* The controller does a simple calculation to |
@@ -3775,9 +3786,6 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
3775 | 3786 | ||
3776 | length = le16_to_cpu(rx_desc->length); | 3787 | length = le16_to_cpu(rx_desc->length); |
3777 | 3788 | ||
3778 | /* adjust length to remove Ethernet CRC */ | ||
3779 | length -= 4; | ||
3780 | |||
3781 | if (unlikely(!(status & E1000_RXD_STAT_EOP))) { | 3789 | if (unlikely(!(status & E1000_RXD_STAT_EOP))) { |
3782 | /* All receives must fit into a single buffer */ | 3790 | /* All receives must fit into a single buffer */ |
3783 | E1000_DBG("%s: Receive packet consumed multiple" | 3791 | E1000_DBG("%s: Receive packet consumed multiple" |
@@ -3805,6 +3813,10 @@ e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
3805 | } | 3813 | } |
3806 | } | 3814 | } |
3807 | 3815 | ||
3816 | /* adjust length to remove Ethernet CRC, this must be | ||
3817 | * done after the TBI_ACCEPT workaround above */ | ||
3818 | length -= 4; | ||
3819 | |||
3808 | /* code added for copybreak, this should improve | 3820 | /* code added for copybreak, this should improve |
3809 | * performance for small packets with large amounts | 3821 | * performance for small packets with large amounts |
3810 | * of reassembly being done in the stack */ | 3822 | * of reassembly being done in the stack */ |
@@ -4773,8 +4785,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
4773 | pci_enable_wake(pdev, PCI_D3cold, 0); | 4785 | pci_enable_wake(pdev, PCI_D3cold, 0); |
4774 | } | 4786 | } |
4775 | 4787 | ||
4776 | if (adapter->hw.mac_type < e1000_82571 && | 4788 | if (adapter->hw.mac_type >= e1000_82540 && |
4777 | adapter->hw.media_type == e1000_media_type_copper) { | 4789 | adapter->hw.mac_type < e1000_82571 && |
4790 | adapter->hw.media_type == e1000_media_type_copper) { | ||
4778 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4791 | manc = E1000_READ_REG(&adapter->hw, MANC); |
4779 | if (manc & E1000_MANC_SMBUS_EN) { | 4792 | if (manc & E1000_MANC_SMBUS_EN) { |
4780 | manc |= E1000_MANC_ARP_EN; | 4793 | manc |= E1000_MANC_ARP_EN; |
@@ -4825,8 +4838,9 @@ e1000_resume(struct pci_dev *pdev) | |||
4825 | 4838 | ||
4826 | netif_device_attach(netdev); | 4839 | netif_device_attach(netdev); |
4827 | 4840 | ||
4828 | if (adapter->hw.mac_type < e1000_82571 && | 4841 | if (adapter->hw.mac_type >= e1000_82540 && |
4829 | adapter->hw.media_type == e1000_media_type_copper) { | 4842 | adapter->hw.mac_type < e1000_82571 && |
4843 | adapter->hw.media_type == e1000_media_type_copper) { | ||
4830 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4844 | manc = E1000_READ_REG(&adapter->hw, MANC); |
4831 | manc &= ~(E1000_MANC_ARP_EN); | 4845 | manc &= ~(E1000_MANC_ARP_EN); |
4832 | E1000_WRITE_REG(&adapter->hw, MANC, manc); | 4846 | E1000_WRITE_REG(&adapter->hw, MANC, manc); |
@@ -4944,6 +4958,7 @@ static void e1000_io_resume(struct pci_dev *pdev) | |||
4944 | netif_device_attach(netdev); | 4958 | netif_device_attach(netdev); |
4945 | 4959 | ||
4946 | if (adapter->hw.mac_type >= e1000_82540 && | 4960 | if (adapter->hw.mac_type >= e1000_82540 && |
4961 | adapter->hw.mac_type < e1000_82571 && | ||
4947 | adapter->hw.media_type == e1000_media_type_copper) { | 4962 | adapter->hw.media_type == e1000_media_type_copper) { |
4948 | manc = E1000_READ_REG(&adapter->hw, MANC); | 4963 | manc = E1000_READ_REG(&adapter->hw, MANC); |
4949 | manc &= ~(E1000_MANC_ARP_EN); | 4964 | manc &= ~(E1000_MANC_ARP_EN); |
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index c44311ac2fd3..16167b016266 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -1807,8 +1807,8 @@ u8 acpiphp_get_power_status(struct acpiphp_slot *slot) | |||
1807 | 1807 | ||
1808 | 1808 | ||
1809 | /* | 1809 | /* |
1810 | * latch closed: 1 | 1810 | * latch open: 1 |
1811 | * latch open: 0 | 1811 | * latch closed: 0 |
1812 | */ | 1812 | */ |
1813 | u8 acpiphp_get_latch_status(struct acpiphp_slot *slot) | 1813 | u8 acpiphp_get_latch_status(struct acpiphp_slot *slot) |
1814 | { | 1814 | { |
@@ -1816,7 +1816,7 @@ u8 acpiphp_get_latch_status(struct acpiphp_slot *slot) | |||
1816 | 1816 | ||
1817 | sta = get_slot_status(slot); | 1817 | sta = get_slot_status(slot); |
1818 | 1818 | ||
1819 | return (sta & ACPI_STA_SHOW_IN_UI) ? 1 : 0; | 1819 | return (sta & ACPI_STA_SHOW_IN_UI) ? 0 : 1; |
1820 | } | 1820 | } |
1821 | 1821 | ||
1822 | 1822 | ||
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index b1c0c707d96c..194f1d21d3d7 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -265,6 +265,13 @@ static int pci_device_remove(struct device * dev) | |||
265 | } | 265 | } |
266 | 266 | ||
267 | /* | 267 | /* |
268 | * If the device is still on, set the power state as "unknown", | ||
269 | * since it might change by the next time we load the driver. | ||
270 | */ | ||
271 | if (pci_dev->current_state == PCI_D0) | ||
272 | pci_dev->current_state = PCI_UNKNOWN; | ||
273 | |||
274 | /* | ||
268 | * We would love to complain here if pci_dev->is_enabled is set, that | 275 | * We would love to complain here if pci_dev->is_enabled is set, that |
269 | * the driver should have called pci_disable_device(), but the | 276 | * the driver should have called pci_disable_device(), but the |
270 | * unfortunate fact is there are too many odd BIOS and bridge setups | 277 | * unfortunate fact is there are too many odd BIOS and bridge setups |
@@ -288,6 +295,12 @@ static int pci_device_suspend(struct device * dev, pm_message_t state) | |||
288 | suspend_report_result(drv->suspend, i); | 295 | suspend_report_result(drv->suspend, i); |
289 | } else { | 296 | } else { |
290 | pci_save_state(pci_dev); | 297 | pci_save_state(pci_dev); |
298 | /* | ||
299 | * mark its power state as "unknown", since we don't know if | ||
300 | * e.g. the BIOS will change its device state when we suspend. | ||
301 | */ | ||
302 | if (pci_dev->current_state == PCI_D0) | ||
303 | pci_dev->current_state = PCI_UNKNOWN; | ||
291 | } | 304 | } |
292 | return i; | 305 | return i; |
293 | } | 306 | } |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e8a7f1b1b2bc..204b1c8e972b 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -714,33 +714,6 @@ static void __devinit quirk_vt82c598_id(struct pci_dev *dev) | |||
714 | } | 714 | } |
715 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); | 715 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); |
716 | 716 | ||
717 | #ifdef CONFIG_ACPI_SLEEP | ||
718 | |||
719 | /* | ||
720 | * Some VIA systems boot with the abnormal status flag set. This can cause | ||
721 | * the BIOS to re-POST the system on resume rather than passing control | ||
722 | * back to the OS. Clear the flag on boot | ||
723 | */ | ||
724 | static void __devinit quirk_via_abnormal_poweroff(struct pci_dev *dev) | ||
725 | { | ||
726 | u32 reg; | ||
727 | |||
728 | acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS, | ||
729 | ®); | ||
730 | |||
731 | if (reg & 0x800) { | ||
732 | printk("Clearing abnormal poweroff flag\n"); | ||
733 | acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, | ||
734 | ACPI_REGISTER_PM1_STATUS, | ||
735 | (u16)0x800); | ||
736 | } | ||
737 | } | ||
738 | |||
739 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_via_abnormal_poweroff); | ||
740 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_abnormal_poweroff); | ||
741 | |||
742 | #endif | ||
743 | |||
744 | /* | 717 | /* |
745 | * CardBus controllers have a legacy base address that enables them | 718 | * CardBus controllers have a legacy base address that enables them |
746 | * to respond as i82365 pcmcia controllers. We don't want them to | 719 | * to respond as i82365 pcmcia controllers. We don't want them to |
@@ -1619,52 +1592,6 @@ static void __devinit fixup_rev1_53c810(struct pci_dev* dev) | |||
1619 | } | 1592 | } |
1620 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810); | 1593 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810); |
1621 | 1594 | ||
1622 | /* | ||
1623 | * Fixup to mark boot BIOS video selected by BIOS before it changes | ||
1624 | * | ||
1625 | * From information provided by "Jon Smirl" <jonsmirl@gmail.com> | ||
1626 | * | ||
1627 | * The standard boot ROM sequence for an x86 machine uses the BIOS | ||
1628 | * to select an initial video card for boot display. This boot video | ||
1629 | * card will have it's BIOS copied to C0000 in system RAM. | ||
1630 | * IORESOURCE_ROM_SHADOW is used to associate the boot video | ||
1631 | * card with this copy. On laptops this copy has to be used since | ||
1632 | * the main ROM may be compressed or combined with another image. | ||
1633 | * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW | ||
1634 | * is marked here since the boot video device will be the only enabled | ||
1635 | * video device at this point. | ||
1636 | */ | ||
1637 | |||
1638 | static void __devinit fixup_video(struct pci_dev *pdev) | ||
1639 | { | ||
1640 | struct pci_dev *bridge; | ||
1641 | struct pci_bus *bus; | ||
1642 | u16 config; | ||
1643 | |||
1644 | if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) | ||
1645 | return; | ||
1646 | |||
1647 | /* Is VGA routed to us? */ | ||
1648 | bus = pdev->bus; | ||
1649 | while (bus) { | ||
1650 | bridge = bus->self; | ||
1651 | if (bridge) { | ||
1652 | pci_read_config_word(bridge, PCI_BRIDGE_CONTROL, | ||
1653 | &config); | ||
1654 | if (!(config & PCI_BRIDGE_CTL_VGA)) | ||
1655 | return; | ||
1656 | } | ||
1657 | bus = bus->parent; | ||
1658 | } | ||
1659 | pci_read_config_word(pdev, PCI_COMMAND, &config); | ||
1660 | if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { | ||
1661 | pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; | ||
1662 | printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev)); | ||
1663 | } | ||
1664 | } | ||
1665 | DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, fixup_video); | ||
1666 | |||
1667 | |||
1668 | static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end) | 1595 | static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end) |
1669 | { | 1596 | { |
1670 | while (f < end) { | 1597 | while (f < end) { |
diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index 43e4a49f2cc4..e1dcefc69bb4 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c | |||
@@ -72,8 +72,9 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | |||
72 | int last_image; | 72 | int last_image; |
73 | 73 | ||
74 | /* | 74 | /* |
75 | * IORESOURCE_ROM_SHADOW set if the VGA enable bit of the Bridge Control | 75 | * IORESOURCE_ROM_SHADOW set on x86, x86_64 and IA64 supports legacy |
76 | * register is set for embedded VGA. | 76 | * memory map if the VGA enable bit of the Bridge Control register is |
77 | * set for embedded VGA. | ||
77 | */ | 78 | */ |
78 | if (res->flags & IORESOURCE_ROM_SHADOW) { | 79 | if (res->flags & IORESOURCE_ROM_SHADOW) { |
79 | /* primary video rom always starts here */ | 80 | /* primary video rom always starts here */ |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index a2dee5bf5a17..ad7f7e1c0163 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -271,10 +271,6 @@ static int css_evaluate_known_subchannel(struct subchannel *sch, int slow) | |||
271 | /* Reset intparm to zeroes. */ | 271 | /* Reset intparm to zeroes. */ |
272 | sch->schib.pmcw.intparm = 0; | 272 | sch->schib.pmcw.intparm = 0; |
273 | cio_modify(sch); | 273 | cio_modify(sch); |
274 | |||
275 | /* Probe if necessary. */ | ||
276 | if (action == UNREGISTER_PROBE) | ||
277 | ret = css_probe_device(sch->schid); | ||
278 | break; | 274 | break; |
279 | case REPROBE: | 275 | case REPROBE: |
280 | device_trigger_reprobe(sch); | 276 | device_trigger_reprobe(sch); |
@@ -283,6 +279,9 @@ static int css_evaluate_known_subchannel(struct subchannel *sch, int slow) | |||
283 | break; | 279 | break; |
284 | } | 280 | } |
285 | spin_unlock_irqrestore(&sch->lock, flags); | 281 | spin_unlock_irqrestore(&sch->lock, flags); |
282 | /* Probe if necessary. */ | ||
283 | if (action == UNREGISTER_PROBE) | ||
284 | ret = css_probe_device(sch->schid); | ||
286 | 285 | ||
287 | return ret; | 286 | return ret; |
288 | } | 287 | } |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 94bdd4d8a4c9..39c98f940507 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -532,8 +532,7 @@ device_remove_files(struct device *dev) | |||
532 | 532 | ||
533 | /* this is a simple abstraction for device_register that sets the | 533 | /* this is a simple abstraction for device_register that sets the |
534 | * correct bus type and adds the bus specific files */ | 534 | * correct bus type and adds the bus specific files */ |
535 | int | 535 | static int ccw_device_register(struct ccw_device *cdev) |
536 | ccw_device_register(struct ccw_device *cdev) | ||
537 | { | 536 | { |
538 | struct device *dev = &cdev->dev; | 537 | struct device *dev = &cdev->dev; |
539 | int ret; | 538 | int ret; |
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index c6140cc97a80..9233b5c0bcc8 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h | |||
@@ -78,7 +78,6 @@ void io_subchannel_recog_done(struct ccw_device *cdev); | |||
78 | 78 | ||
79 | int ccw_device_cancel_halt_clear(struct ccw_device *); | 79 | int ccw_device_cancel_halt_clear(struct ccw_device *); |
80 | 80 | ||
81 | int ccw_device_register(struct ccw_device *); | ||
82 | void ccw_device_do_unreg_rereg(void *); | 81 | void ccw_device_do_unreg_rereg(void *); |
83 | void ccw_device_call_sch_unregister(void *); | 82 | void ccw_device_call_sch_unregister(void *); |
84 | 83 | ||
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index c5ccd20b110c..79d89c368919 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -739,11 +739,16 @@ static void ap_scan_bus(void *data) | |||
739 | dev = bus_find_device(&ap_bus_type, NULL, | 739 | dev = bus_find_device(&ap_bus_type, NULL, |
740 | (void *)(unsigned long)qid, | 740 | (void *)(unsigned long)qid, |
741 | __ap_scan_bus); | 741 | __ap_scan_bus); |
742 | rc = ap_query_queue(qid, &queue_depth, &device_type); | ||
743 | if (dev && rc) { | ||
744 | put_device(dev); | ||
745 | device_unregister(dev); | ||
746 | continue; | ||
747 | } | ||
742 | if (dev) { | 748 | if (dev) { |
743 | put_device(dev); | 749 | put_device(dev); |
744 | continue; | 750 | continue; |
745 | } | 751 | } |
746 | rc = ap_query_queue(qid, &queue_depth, &device_type); | ||
747 | if (rc) | 752 | if (rc) |
748 | continue; | 753 | continue; |
749 | rc = ap_init_queue(qid); | 754 | rc = ap_init_queue(qid); |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 8f882690994d..74c0eac083e4 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -107,6 +107,10 @@ zfcp_address_to_sg(void *address, struct scatterlist *list) | |||
107 | (ZFCP_MAX_SBALS_PER_REQ * ZFCP_MAX_SBALES_PER_SBAL - 2) | 107 | (ZFCP_MAX_SBALS_PER_REQ * ZFCP_MAX_SBALES_PER_SBAL - 2) |
108 | /* request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */ | 108 | /* request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */ |
109 | 109 | ||
110 | #define ZFCP_MAX_SECTORS (ZFCP_MAX_SBALES_PER_REQ * 8) | ||
111 | /* max. number of (data buffer) SBALEs in largest SBAL chain | ||
112 | multiplied with number of sectors per 4k block */ | ||
113 | |||
110 | /* FIXME(tune): free space should be one max. SBAL chain plus what? */ | 114 | /* FIXME(tune): free space should be one max. SBAL chain plus what? */ |
111 | #define ZFCP_QDIO_PCI_INTERVAL (QDIO_MAX_BUFFERS_PER_Q \ | 115 | #define ZFCP_QDIO_PCI_INTERVAL (QDIO_MAX_BUFFERS_PER_Q \ |
112 | - (ZFCP_MAX_SBALS_PER_REQ + 4)) | 116 | - (ZFCP_MAX_SBALS_PER_REQ + 4)) |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 4d2bc7981324..452d96f92a14 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -58,6 +58,7 @@ struct zfcp_data zfcp_data = { | |||
58 | .cmd_per_lun = 1, | 58 | .cmd_per_lun = 1, |
59 | .use_clustering = 1, | 59 | .use_clustering = 1, |
60 | .sdev_attrs = zfcp_sysfs_sdev_attrs, | 60 | .sdev_attrs = zfcp_sysfs_sdev_attrs, |
61 | .max_sectors = ZFCP_MAX_SECTORS, | ||
61 | }, | 62 | }, |
62 | .driver_version = ZFCP_VERSION, | 63 | .driver_version = ZFCP_VERSION, |
63 | }; | 64 | }; |
diff --git a/drivers/sbus/sbus.c b/drivers/sbus/sbus.c index 935952ef88f1..98fcbb3d5560 100644 --- a/drivers/sbus/sbus.c +++ b/drivers/sbus/sbus.c | |||
@@ -61,11 +61,11 @@ static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sde | |||
61 | else | 61 | else |
62 | sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev; | 62 | sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev; |
63 | sdev->ofdev.dev.bus = &sbus_bus_type; | 63 | sdev->ofdev.dev.bus = &sbus_bus_type; |
64 | strcpy(sdev->ofdev.dev.bus_id, dp->path_component_name); | 64 | sprintf(sdev->ofdev.dev.bus_id, "sbus[%08x]", dp->node); |
65 | 65 | ||
66 | if (of_device_register(&sdev->ofdev) != 0) | 66 | if (of_device_register(&sdev->ofdev) != 0) |
67 | printk(KERN_DEBUG "sbus: device registration error for %s!\n", | 67 | printk(KERN_DEBUG "sbus: device registration error for %s!\n", |
68 | sdev->ofdev.dev.bus_id); | 68 | dp->path_component_name); |
69 | } | 69 | } |
70 | 70 | ||
71 | static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus) | 71 | static void __init sbus_bus_ranges_init(struct device_node *dp, struct sbus_bus *sbus) |
diff --git a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h index df3346b5caf8..170a4344cbb2 100644 --- a/drivers/scsi/aic7xxx/aic79xx.h +++ b/drivers/scsi/aic7xxx/aic79xx.h | |||
@@ -53,14 +53,6 @@ struct ahd_platform_data; | |||
53 | struct scb_platform_data; | 53 | struct scb_platform_data; |
54 | 54 | ||
55 | /****************************** Useful Macros *********************************/ | 55 | /****************************** Useful Macros *********************************/ |
56 | #ifndef MAX | ||
57 | #define MAX(a,b) (((a) > (b)) ? (a) : (b)) | ||
58 | #endif | ||
59 | |||
60 | #ifndef MIN | ||
61 | #define MIN(a,b) (((a) < (b)) ? (a) : (b)) | ||
62 | #endif | ||
63 | |||
64 | #ifndef TRUE | 56 | #ifndef TRUE |
65 | #define TRUE 1 | 57 | #define TRUE 1 |
66 | #endif | 58 | #endif |
@@ -972,8 +964,6 @@ int ahd_read_seeprom(struct ahd_softc *ahd, uint16_t *buf, | |||
972 | 964 | ||
973 | int ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf, | 965 | int ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf, |
974 | u_int start_addr, u_int count); | 966 | u_int start_addr, u_int count); |
975 | int ahd_wait_seeprom(struct ahd_softc *ahd); | ||
976 | int ahd_verify_vpd_cksum(struct vpd_config *vpd); | ||
977 | int ahd_verify_cksum(struct seeprom_config *sc); | 967 | int ahd_verify_cksum(struct seeprom_config *sc); |
978 | int ahd_acquire_seeprom(struct ahd_softc *ahd); | 968 | int ahd_acquire_seeprom(struct ahd_softc *ahd); |
979 | void ahd_release_seeprom(struct ahd_softc *ahd); | 969 | void ahd_release_seeprom(struct ahd_softc *ahd); |
@@ -1320,8 +1310,6 @@ struct ahd_pci_identity { | |||
1320 | char *name; | 1310 | char *name; |
1321 | ahd_device_setup_t *setup; | 1311 | ahd_device_setup_t *setup; |
1322 | }; | 1312 | }; |
1323 | extern struct ahd_pci_identity ahd_pci_ident_table []; | ||
1324 | extern const u_int ahd_num_pci_devs; | ||
1325 | 1313 | ||
1326 | /***************************** VL/EISA Declarations ***************************/ | 1314 | /***************************** VL/EISA Declarations ***************************/ |
1327 | struct aic7770_identity { | 1315 | struct aic7770_identity { |
@@ -1339,15 +1327,6 @@ extern const int ahd_num_aic7770_devs; | |||
1339 | /*************************** Function Declarations ****************************/ | 1327 | /*************************** Function Declarations ****************************/ |
1340 | /******************************************************************************/ | 1328 | /******************************************************************************/ |
1341 | void ahd_reset_cmds_pending(struct ahd_softc *ahd); | 1329 | void ahd_reset_cmds_pending(struct ahd_softc *ahd); |
1342 | u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl); | ||
1343 | void ahd_busy_tcl(struct ahd_softc *ahd, | ||
1344 | u_int tcl, u_int busyid); | ||
1345 | static __inline void ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl); | ||
1346 | static __inline void | ||
1347 | ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl) | ||
1348 | { | ||
1349 | ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL); | ||
1350 | } | ||
1351 | 1330 | ||
1352 | /***************************** PCI Front End *********************************/ | 1331 | /***************************** PCI Front End *********************************/ |
1353 | struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t); | 1332 | struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t); |
@@ -1356,7 +1335,6 @@ int ahd_pci_config(struct ahd_softc *, | |||
1356 | int ahd_pci_test_register_access(struct ahd_softc *); | 1335 | int ahd_pci_test_register_access(struct ahd_softc *); |
1357 | 1336 | ||
1358 | /************************** SCB and SCB queue management **********************/ | 1337 | /************************** SCB and SCB queue management **********************/ |
1359 | int ahd_probe_scbs(struct ahd_softc *); | ||
1360 | void ahd_qinfifo_requeue_tail(struct ahd_softc *ahd, | 1338 | void ahd_qinfifo_requeue_tail(struct ahd_softc *ahd, |
1361 | struct scb *scb); | 1339 | struct scb *scb); |
1362 | int ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, | 1340 | int ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, |
@@ -1374,33 +1352,20 @@ int ahd_parse_vpddata(struct ahd_softc *ahd, | |||
1374 | int ahd_parse_cfgdata(struct ahd_softc *ahd, | 1352 | int ahd_parse_cfgdata(struct ahd_softc *ahd, |
1375 | struct seeprom_config *sc); | 1353 | struct seeprom_config *sc); |
1376 | void ahd_intr_enable(struct ahd_softc *ahd, int enable); | 1354 | void ahd_intr_enable(struct ahd_softc *ahd, int enable); |
1377 | void ahd_update_coalescing_values(struct ahd_softc *ahd, | ||
1378 | u_int timer, | ||
1379 | u_int maxcmds, | ||
1380 | u_int mincmds); | ||
1381 | void ahd_enable_coalescing(struct ahd_softc *ahd, | ||
1382 | int enable); | ||
1383 | void ahd_pause_and_flushwork(struct ahd_softc *ahd); | 1355 | void ahd_pause_and_flushwork(struct ahd_softc *ahd); |
1384 | int ahd_suspend(struct ahd_softc *ahd); | 1356 | int ahd_suspend(struct ahd_softc *ahd); |
1385 | int ahd_resume(struct ahd_softc *ahd); | ||
1386 | void ahd_set_unit(struct ahd_softc *, int); | 1357 | void ahd_set_unit(struct ahd_softc *, int); |
1387 | void ahd_set_name(struct ahd_softc *, char *); | 1358 | void ahd_set_name(struct ahd_softc *, char *); |
1388 | struct scb *ahd_get_scb(struct ahd_softc *ahd, u_int col_idx); | 1359 | struct scb *ahd_get_scb(struct ahd_softc *ahd, u_int col_idx); |
1389 | void ahd_free_scb(struct ahd_softc *ahd, struct scb *scb); | 1360 | void ahd_free_scb(struct ahd_softc *ahd, struct scb *scb); |
1390 | void ahd_alloc_scbs(struct ahd_softc *ahd); | ||
1391 | void ahd_free(struct ahd_softc *ahd); | 1361 | void ahd_free(struct ahd_softc *ahd); |
1392 | int ahd_reset(struct ahd_softc *ahd, int reinit); | 1362 | int ahd_reset(struct ahd_softc *ahd, int reinit); |
1393 | void ahd_shutdown(void *arg); | ||
1394 | int ahd_write_flexport(struct ahd_softc *ahd, | 1363 | int ahd_write_flexport(struct ahd_softc *ahd, |
1395 | u_int addr, u_int value); | 1364 | u_int addr, u_int value); |
1396 | int ahd_read_flexport(struct ahd_softc *ahd, u_int addr, | 1365 | int ahd_read_flexport(struct ahd_softc *ahd, u_int addr, |
1397 | uint8_t *value); | 1366 | uint8_t *value); |
1398 | int ahd_wait_flexport(struct ahd_softc *ahd); | ||
1399 | 1367 | ||
1400 | /*************************** Interrupt Services *******************************/ | 1368 | /*************************** Interrupt Services *******************************/ |
1401 | void ahd_pci_intr(struct ahd_softc *ahd); | ||
1402 | void ahd_clear_intstat(struct ahd_softc *ahd); | ||
1403 | void ahd_flush_qoutfifo(struct ahd_softc *ahd); | ||
1404 | void ahd_run_qoutfifo(struct ahd_softc *ahd); | 1369 | void ahd_run_qoutfifo(struct ahd_softc *ahd); |
1405 | #ifdef AHD_TARGET_MODE | 1370 | #ifdef AHD_TARGET_MODE |
1406 | void ahd_run_tqinfifo(struct ahd_softc *ahd, int paused); | 1371 | void ahd_run_tqinfifo(struct ahd_softc *ahd, int paused); |
@@ -1409,7 +1374,6 @@ void ahd_handle_hwerrint(struct ahd_softc *ahd); | |||
1409 | void ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat); | 1374 | void ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat); |
1410 | void ahd_handle_scsiint(struct ahd_softc *ahd, | 1375 | void ahd_handle_scsiint(struct ahd_softc *ahd, |
1411 | u_int intstat); | 1376 | u_int intstat); |
1412 | void ahd_clear_critical_section(struct ahd_softc *ahd); | ||
1413 | 1377 | ||
1414 | /***************************** Error Recovery *********************************/ | 1378 | /***************************** Error Recovery *********************************/ |
1415 | typedef enum { | 1379 | typedef enum { |
@@ -1426,23 +1390,9 @@ int ahd_search_disc_list(struct ahd_softc *ahd, int target, | |||
1426 | char channel, int lun, u_int tag, | 1390 | char channel, int lun, u_int tag, |
1427 | int stop_on_first, int remove, | 1391 | int stop_on_first, int remove, |
1428 | int save_state); | 1392 | int save_state); |
1429 | void ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb); | ||
1430 | int ahd_reset_channel(struct ahd_softc *ahd, char channel, | 1393 | int ahd_reset_channel(struct ahd_softc *ahd, char channel, |
1431 | int initiate_reset); | 1394 | int initiate_reset); |
1432 | int ahd_abort_scbs(struct ahd_softc *ahd, int target, | ||
1433 | char channel, int lun, u_int tag, | ||
1434 | role_t role, uint32_t status); | ||
1435 | void ahd_restart(struct ahd_softc *ahd); | ||
1436 | void ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo); | ||
1437 | void ahd_handle_scb_status(struct ahd_softc *ahd, | ||
1438 | struct scb *scb); | ||
1439 | void ahd_handle_scsi_status(struct ahd_softc *ahd, | ||
1440 | struct scb *scb); | ||
1441 | void ahd_calc_residual(struct ahd_softc *ahd, | ||
1442 | struct scb *scb); | ||
1443 | /*************************** Utility Functions ********************************/ | 1395 | /*************************** Utility Functions ********************************/ |
1444 | struct ahd_phase_table_entry* | ||
1445 | ahd_lookup_phase_entry(int phase); | ||
1446 | void ahd_compile_devinfo(struct ahd_devinfo *devinfo, | 1396 | void ahd_compile_devinfo(struct ahd_devinfo *devinfo, |
1447 | u_int our_id, u_int target, | 1397 | u_int our_id, u_int target, |
1448 | u_int lun, char channel, | 1398 | u_int lun, char channel, |
@@ -1450,14 +1400,6 @@ void ahd_compile_devinfo(struct ahd_devinfo *devinfo, | |||
1450 | /************************** Transfer Negotiation ******************************/ | 1400 | /************************** Transfer Negotiation ******************************/ |
1451 | void ahd_find_syncrate(struct ahd_softc *ahd, u_int *period, | 1401 | void ahd_find_syncrate(struct ahd_softc *ahd, u_int *period, |
1452 | u_int *ppr_options, u_int maxsync); | 1402 | u_int *ppr_options, u_int maxsync); |
1453 | void ahd_validate_offset(struct ahd_softc *ahd, | ||
1454 | struct ahd_initiator_tinfo *tinfo, | ||
1455 | u_int period, u_int *offset, | ||
1456 | int wide, role_t role); | ||
1457 | void ahd_validate_width(struct ahd_softc *ahd, | ||
1458 | struct ahd_initiator_tinfo *tinfo, | ||
1459 | u_int *bus_width, | ||
1460 | role_t role); | ||
1461 | /* | 1403 | /* |
1462 | * Negotiation types. These are used to qualify if we should renegotiate | 1404 | * Negotiation types. These are used to qualify if we should renegotiate |
1463 | * even if our goal and current transport parameters are identical. | 1405 | * even if our goal and current transport parameters are identical. |
@@ -1486,11 +1428,6 @@ typedef enum { | |||
1486 | AHD_QUEUE_TAGGED | 1428 | AHD_QUEUE_TAGGED |
1487 | } ahd_queue_alg; | 1429 | } ahd_queue_alg; |
1488 | 1430 | ||
1489 | void ahd_set_tags(struct ahd_softc *ahd, | ||
1490 | struct scsi_cmnd *cmd, | ||
1491 | struct ahd_devinfo *devinfo, | ||
1492 | ahd_queue_alg alg); | ||
1493 | |||
1494 | /**************************** Target Mode *************************************/ | 1431 | /**************************** Target Mode *************************************/ |
1495 | #ifdef AHD_TARGET_MODE | 1432 | #ifdef AHD_TARGET_MODE |
1496 | void ahd_send_lstate_events(struct ahd_softc *, | 1433 | void ahd_send_lstate_events(struct ahd_softc *, |
@@ -1528,10 +1465,8 @@ extern uint32_t ahd_debug; | |||
1528 | #define AHD_SHOW_INT_COALESCING 0x10000 | 1465 | #define AHD_SHOW_INT_COALESCING 0x10000 |
1529 | #define AHD_DEBUG_SEQUENCER 0x20000 | 1466 | #define AHD_DEBUG_SEQUENCER 0x20000 |
1530 | #endif | 1467 | #endif |
1531 | void ahd_print_scb(struct scb *scb); | ||
1532 | void ahd_print_devinfo(struct ahd_softc *ahd, | 1468 | void ahd_print_devinfo(struct ahd_softc *ahd, |
1533 | struct ahd_devinfo *devinfo); | 1469 | struct ahd_devinfo *devinfo); |
1534 | void ahd_dump_sglist(struct scb *scb); | ||
1535 | void ahd_dump_card_state(struct ahd_softc *ahd); | 1470 | void ahd_dump_card_state(struct ahd_softc *ahd); |
1536 | int ahd_print_register(ahd_reg_parse_entry_t *table, | 1471 | int ahd_print_register(ahd_reg_parse_entry_t *table, |
1537 | u_int num_entries, | 1472 | u_int num_entries, |
@@ -1540,5 +1475,4 @@ int ahd_print_register(ahd_reg_parse_entry_t *table, | |||
1540 | u_int value, | 1475 | u_int value, |
1541 | u_int *cur_column, | 1476 | u_int *cur_column, |
1542 | u_int wrap_point); | 1477 | u_int wrap_point); |
1543 | void ahd_dump_scbs(struct ahd_softc *ahd); | ||
1544 | #endif /* _AIC79XX_H_ */ | 1478 | #endif /* _AIC79XX_H_ */ |
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 653818d2f802..07a86a30f676 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c | |||
@@ -52,7 +52,7 @@ | |||
52 | 52 | ||
53 | 53 | ||
54 | /***************************** Lookup Tables **********************************/ | 54 | /***************************** Lookup Tables **********************************/ |
55 | char *ahd_chip_names[] = | 55 | static char *ahd_chip_names[] = |
56 | { | 56 | { |
57 | "NONE", | 57 | "NONE", |
58 | "aic7901", | 58 | "aic7901", |
@@ -237,10 +237,33 @@ static int ahd_handle_target_cmd(struct ahd_softc *ahd, | |||
237 | struct target_cmd *cmd); | 237 | struct target_cmd *cmd); |
238 | #endif | 238 | #endif |
239 | 239 | ||
240 | static int ahd_abort_scbs(struct ahd_softc *ahd, int target, | ||
241 | char channel, int lun, u_int tag, | ||
242 | role_t role, uint32_t status); | ||
243 | static void ahd_alloc_scbs(struct ahd_softc *ahd); | ||
244 | static void ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, | ||
245 | u_int scbid); | ||
246 | static void ahd_calc_residual(struct ahd_softc *ahd, | ||
247 | struct scb *scb); | ||
248 | static void ahd_clear_critical_section(struct ahd_softc *ahd); | ||
249 | static void ahd_clear_intstat(struct ahd_softc *ahd); | ||
250 | static void ahd_enable_coalescing(struct ahd_softc *ahd, | ||
251 | int enable); | ||
252 | static u_int ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl); | ||
253 | static void ahd_freeze_devq(struct ahd_softc *ahd, | ||
254 | struct scb *scb); | ||
255 | static void ahd_handle_scb_status(struct ahd_softc *ahd, | ||
256 | struct scb *scb); | ||
257 | static struct ahd_phase_table_entry* ahd_lookup_phase_entry(int phase); | ||
258 | static void ahd_shutdown(void *arg); | ||
259 | static void ahd_update_coalescing_values(struct ahd_softc *ahd, | ||
260 | u_int timer, | ||
261 | u_int maxcmds, | ||
262 | u_int mincmds); | ||
263 | static int ahd_verify_vpd_cksum(struct vpd_config *vpd); | ||
264 | static int ahd_wait_seeprom(struct ahd_softc *ahd); | ||
265 | |||
240 | /******************************** Private Inlines *****************************/ | 266 | /******************************** Private Inlines *****************************/ |
241 | static __inline void ahd_assert_atn(struct ahd_softc *ahd); | ||
242 | static __inline int ahd_currently_packetized(struct ahd_softc *ahd); | ||
243 | static __inline int ahd_set_active_fifo(struct ahd_softc *ahd); | ||
244 | 267 | ||
245 | static __inline void | 268 | static __inline void |
246 | ahd_assert_atn(struct ahd_softc *ahd) | 269 | ahd_assert_atn(struct ahd_softc *ahd) |
@@ -294,11 +317,44 @@ ahd_set_active_fifo(struct ahd_softc *ahd) | |||
294 | } | 317 | } |
295 | } | 318 | } |
296 | 319 | ||
320 | static __inline void | ||
321 | ahd_unbusy_tcl(struct ahd_softc *ahd, u_int tcl) | ||
322 | { | ||
323 | ahd_busy_tcl(ahd, tcl, SCB_LIST_NULL); | ||
324 | } | ||
325 | |||
326 | /* | ||
327 | * Determine whether the sequencer reported a residual | ||
328 | * for this SCB/transaction. | ||
329 | */ | ||
330 | static __inline void | ||
331 | ahd_update_residual(struct ahd_softc *ahd, struct scb *scb) | ||
332 | { | ||
333 | uint32_t sgptr; | ||
334 | |||
335 | sgptr = ahd_le32toh(scb->hscb->sgptr); | ||
336 | if ((sgptr & SG_STATUS_VALID) != 0) | ||
337 | ahd_calc_residual(ahd, scb); | ||
338 | } | ||
339 | |||
340 | static __inline void | ||
341 | ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb) | ||
342 | { | ||
343 | uint32_t sgptr; | ||
344 | |||
345 | sgptr = ahd_le32toh(scb->hscb->sgptr); | ||
346 | if ((sgptr & SG_STATUS_VALID) != 0) | ||
347 | ahd_handle_scb_status(ahd, scb); | ||
348 | else | ||
349 | ahd_done(ahd, scb); | ||
350 | } | ||
351 | |||
352 | |||
297 | /************************* Sequencer Execution Control ************************/ | 353 | /************************* Sequencer Execution Control ************************/ |
298 | /* | 354 | /* |
299 | * Restart the sequencer program from address zero | 355 | * Restart the sequencer program from address zero |
300 | */ | 356 | */ |
301 | void | 357 | static void |
302 | ahd_restart(struct ahd_softc *ahd) | 358 | ahd_restart(struct ahd_softc *ahd) |
303 | { | 359 | { |
304 | 360 | ||
@@ -342,7 +398,7 @@ ahd_restart(struct ahd_softc *ahd) | |||
342 | ahd_unpause(ahd); | 398 | ahd_unpause(ahd); |
343 | } | 399 | } |
344 | 400 | ||
345 | void | 401 | static void |
346 | ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo) | 402 | ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo) |
347 | { | 403 | { |
348 | ahd_mode_state saved_modes; | 404 | ahd_mode_state saved_modes; |
@@ -366,7 +422,7 @@ ahd_clear_fifo(struct ahd_softc *ahd, u_int fifo) | |||
366 | * Flush and completed commands that are sitting in the command | 422 | * Flush and completed commands that are sitting in the command |
367 | * complete queues down on the chip but have yet to be dma'ed back up. | 423 | * complete queues down on the chip but have yet to be dma'ed back up. |
368 | */ | 424 | */ |
369 | void | 425 | static void |
370 | ahd_flush_qoutfifo(struct ahd_softc *ahd) | 426 | ahd_flush_qoutfifo(struct ahd_softc *ahd) |
371 | { | 427 | { |
372 | struct scb *scb; | 428 | struct scb *scb; |
@@ -905,6 +961,51 @@ ahd_handle_hwerrint(struct ahd_softc *ahd) | |||
905 | ahd_free(ahd); | 961 | ahd_free(ahd); |
906 | } | 962 | } |
907 | 963 | ||
964 | #ifdef AHD_DEBUG | ||
965 | static void | ||
966 | ahd_dump_sglist(struct scb *scb) | ||
967 | { | ||
968 | int i; | ||
969 | |||
970 | if (scb->sg_count > 0) { | ||
971 | if ((scb->ahd_softc->flags & AHD_64BIT_ADDRESSING) != 0) { | ||
972 | struct ahd_dma64_seg *sg_list; | ||
973 | |||
974 | sg_list = (struct ahd_dma64_seg*)scb->sg_list; | ||
975 | for (i = 0; i < scb->sg_count; i++) { | ||
976 | uint64_t addr; | ||
977 | uint32_t len; | ||
978 | |||
979 | addr = ahd_le64toh(sg_list[i].addr); | ||
980 | len = ahd_le32toh(sg_list[i].len); | ||
981 | printf("sg[%d] - Addr 0x%x%x : Length %d%s\n", | ||
982 | i, | ||
983 | (uint32_t)((addr >> 32) & 0xFFFFFFFF), | ||
984 | (uint32_t)(addr & 0xFFFFFFFF), | ||
985 | sg_list[i].len & AHD_SG_LEN_MASK, | ||
986 | (sg_list[i].len & AHD_DMA_LAST_SEG) | ||
987 | ? " Last" : ""); | ||
988 | } | ||
989 | } else { | ||
990 | struct ahd_dma_seg *sg_list; | ||
991 | |||
992 | sg_list = (struct ahd_dma_seg*)scb->sg_list; | ||
993 | for (i = 0; i < scb->sg_count; i++) { | ||
994 | uint32_t len; | ||
995 | |||
996 | len = ahd_le32toh(sg_list[i].len); | ||
997 | printf("sg[%d] - Addr 0x%x%x : Length %d%s\n", | ||
998 | i, | ||
999 | (len & AHD_SG_HIGH_ADDR_MASK) >> 24, | ||
1000 | ahd_le32toh(sg_list[i].addr), | ||
1001 | len & AHD_SG_LEN_MASK, | ||
1002 | len & AHD_DMA_LAST_SEG ? " Last" : ""); | ||
1003 | } | ||
1004 | } | ||
1005 | } | ||
1006 | } | ||
1007 | #endif /* AHD_DEBUG */ | ||
1008 | |||
908 | void | 1009 | void |
909 | ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | 1010 | ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) |
910 | { | 1011 | { |
@@ -1053,10 +1154,12 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | |||
1053 | * If a target takes us into the command phase | 1154 | * If a target takes us into the command phase |
1054 | * assume that it has been externally reset and | 1155 | * assume that it has been externally reset and |
1055 | * has thus lost our previous packetized negotiation | 1156 | * has thus lost our previous packetized negotiation |
1056 | * agreement. | 1157 | * agreement. Since we have not sent an identify |
1057 | * Revert to async/narrow transfers until we | 1158 | * message and may not have fully qualified the |
1058 | * can renegotiate with the device and notify | 1159 | * connection, we change our command to TUR, assert |
1059 | * the OSM about the reset. | 1160 | * ATN and ABORT the task when we go to message in |
1161 | * phase. The OSM will see the REQUEUE_REQUEST | ||
1162 | * status and retry the command. | ||
1060 | */ | 1163 | */ |
1061 | scbid = ahd_get_scbptr(ahd); | 1164 | scbid = ahd_get_scbptr(ahd); |
1062 | scb = ahd_lookup_scb(ahd, scbid); | 1165 | scb = ahd_lookup_scb(ahd, scbid); |
@@ -1083,7 +1186,28 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | |||
1083 | ahd_set_syncrate(ahd, &devinfo, /*period*/0, | 1186 | ahd_set_syncrate(ahd, &devinfo, /*period*/0, |
1084 | /*offset*/0, /*ppr_options*/0, | 1187 | /*offset*/0, /*ppr_options*/0, |
1085 | AHD_TRANS_ACTIVE, /*paused*/TRUE); | 1188 | AHD_TRANS_ACTIVE, /*paused*/TRUE); |
1086 | scb->flags |= SCB_EXTERNAL_RESET; | 1189 | /* Hand-craft TUR command */ |
1190 | ahd_outb(ahd, SCB_CDB_STORE, 0); | ||
1191 | ahd_outb(ahd, SCB_CDB_STORE+1, 0); | ||
1192 | ahd_outb(ahd, SCB_CDB_STORE+2, 0); | ||
1193 | ahd_outb(ahd, SCB_CDB_STORE+3, 0); | ||
1194 | ahd_outb(ahd, SCB_CDB_STORE+4, 0); | ||
1195 | ahd_outb(ahd, SCB_CDB_STORE+5, 0); | ||
1196 | ahd_outb(ahd, SCB_CDB_LEN, 6); | ||
1197 | scb->hscb->control &= ~(TAG_ENB|SCB_TAG_TYPE); | ||
1198 | scb->hscb->control |= MK_MESSAGE; | ||
1199 | ahd_outb(ahd, SCB_CONTROL, scb->hscb->control); | ||
1200 | ahd_outb(ahd, MSG_OUT, HOST_MSG); | ||
1201 | ahd_outb(ahd, SAVED_SCSIID, scb->hscb->scsiid); | ||
1202 | /* | ||
1203 | * The lun is 0, regardless of the SCB's lun | ||
1204 | * as we have not sent an identify message. | ||
1205 | */ | ||
1206 | ahd_outb(ahd, SAVED_LUN, 0); | ||
1207 | ahd_outb(ahd, SEQ_FLAGS, 0); | ||
1208 | ahd_assert_atn(ahd); | ||
1209 | scb->flags &= ~SCB_PACKETIZED; | ||
1210 | scb->flags |= SCB_ABORT|SCB_EXTERNAL_RESET; | ||
1087 | ahd_freeze_devq(ahd, scb); | 1211 | ahd_freeze_devq(ahd, scb); |
1088 | ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); | 1212 | ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); |
1089 | ahd_freeze_scb(scb); | 1213 | ahd_freeze_scb(scb); |
@@ -1519,8 +1643,10 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) | |||
1519 | /* | 1643 | /* |
1520 | * Ignore external resets after a bus reset. | 1644 | * Ignore external resets after a bus reset. |
1521 | */ | 1645 | */ |
1522 | if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE)) | 1646 | if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE)) { |
1647 | ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI); | ||
1523 | return; | 1648 | return; |
1649 | } | ||
1524 | 1650 | ||
1525 | /* | 1651 | /* |
1526 | * Clear bus reset flag | 1652 | * Clear bus reset flag |
@@ -2200,6 +2326,22 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) | |||
2200 | if (sent_msg == MSG_ABORT_TAG) | 2326 | if (sent_msg == MSG_ABORT_TAG) |
2201 | tag = SCB_GET_TAG(scb); | 2327 | tag = SCB_GET_TAG(scb); |
2202 | 2328 | ||
2329 | if ((scb->flags & SCB_EXTERNAL_RESET) != 0) { | ||
2330 | /* | ||
2331 | * This abort is in response to an | ||
2332 | * unexpected switch to command phase | ||
2333 | * for a packetized connection. Since | ||
2334 | * the identify message was never sent, | ||
2335 | * "saved lun" is 0. We really want to | ||
2336 | * abort only the SCB that encountered | ||
2337 | * this error, which could have a different | ||
2338 | * lun. The SCB will be retried so the OS | ||
2339 | * will see the UA after renegotiating to | ||
2340 | * packetized. | ||
2341 | */ | ||
2342 | tag = SCB_GET_TAG(scb); | ||
2343 | saved_lun = scb->hscb->lun; | ||
2344 | } | ||
2203 | found = ahd_abort_scbs(ahd, target, 'A', saved_lun, | 2345 | found = ahd_abort_scbs(ahd, target, 'A', saved_lun, |
2204 | tag, ROLE_INITIATOR, | 2346 | tag, ROLE_INITIATOR, |
2205 | CAM_REQ_ABORTED); | 2347 | CAM_REQ_ABORTED); |
@@ -2523,7 +2665,7 @@ ahd_force_renegotiation(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) | |||
2523 | } | 2665 | } |
2524 | 2666 | ||
2525 | #define AHD_MAX_STEPS 2000 | 2667 | #define AHD_MAX_STEPS 2000 |
2526 | void | 2668 | static void |
2527 | ahd_clear_critical_section(struct ahd_softc *ahd) | 2669 | ahd_clear_critical_section(struct ahd_softc *ahd) |
2528 | { | 2670 | { |
2529 | ahd_mode_state saved_modes; | 2671 | ahd_mode_state saved_modes; |
@@ -2646,7 +2788,7 @@ ahd_clear_critical_section(struct ahd_softc *ahd) | |||
2646 | /* | 2788 | /* |
2647 | * Clear any pending interrupt status. | 2789 | * Clear any pending interrupt status. |
2648 | */ | 2790 | */ |
2649 | void | 2791 | static void |
2650 | ahd_clear_intstat(struct ahd_softc *ahd) | 2792 | ahd_clear_intstat(struct ahd_softc *ahd) |
2651 | { | 2793 | { |
2652 | AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK), | 2794 | AHD_ASSERT_MODES(ahd, ~(AHD_MODE_UNKNOWN_MSK|AHD_MODE_CFG_MSK), |
@@ -2677,6 +2819,8 @@ ahd_clear_intstat(struct ahd_softc *ahd) | |||
2677 | #ifdef AHD_DEBUG | 2819 | #ifdef AHD_DEBUG |
2678 | uint32_t ahd_debug = AHD_DEBUG_OPTS; | 2820 | uint32_t ahd_debug = AHD_DEBUG_OPTS; |
2679 | #endif | 2821 | #endif |
2822 | |||
2823 | #if 0 | ||
2680 | void | 2824 | void |
2681 | ahd_print_scb(struct scb *scb) | 2825 | ahd_print_scb(struct scb *scb) |
2682 | { | 2826 | { |
@@ -2701,49 +2845,7 @@ ahd_print_scb(struct scb *scb) | |||
2701 | SCB_GET_TAG(scb)); | 2845 | SCB_GET_TAG(scb)); |
2702 | ahd_dump_sglist(scb); | 2846 | ahd_dump_sglist(scb); |
2703 | } | 2847 | } |
2704 | 2848 | #endif /* 0 */ | |
2705 | void | ||
2706 | ahd_dump_sglist(struct scb *scb) | ||
2707 | { | ||
2708 | int i; | ||
2709 | |||
2710 | if (scb->sg_count > 0) { | ||
2711 | if ((scb->ahd_softc->flags & AHD_64BIT_ADDRESSING) != 0) { | ||
2712 | struct ahd_dma64_seg *sg_list; | ||
2713 | |||
2714 | sg_list = (struct ahd_dma64_seg*)scb->sg_list; | ||
2715 | for (i = 0; i < scb->sg_count; i++) { | ||
2716 | uint64_t addr; | ||
2717 | uint32_t len; | ||
2718 | |||
2719 | addr = ahd_le64toh(sg_list[i].addr); | ||
2720 | len = ahd_le32toh(sg_list[i].len); | ||
2721 | printf("sg[%d] - Addr 0x%x%x : Length %d%s\n", | ||
2722 | i, | ||
2723 | (uint32_t)((addr >> 32) & 0xFFFFFFFF), | ||
2724 | (uint32_t)(addr & 0xFFFFFFFF), | ||
2725 | sg_list[i].len & AHD_SG_LEN_MASK, | ||
2726 | (sg_list[i].len & AHD_DMA_LAST_SEG) | ||
2727 | ? " Last" : ""); | ||
2728 | } | ||
2729 | } else { | ||
2730 | struct ahd_dma_seg *sg_list; | ||
2731 | |||
2732 | sg_list = (struct ahd_dma_seg*)scb->sg_list; | ||
2733 | for (i = 0; i < scb->sg_count; i++) { | ||
2734 | uint32_t len; | ||
2735 | |||
2736 | len = ahd_le32toh(sg_list[i].len); | ||
2737 | printf("sg[%d] - Addr 0x%x%x : Length %d%s\n", | ||
2738 | i, | ||
2739 | (len & AHD_SG_HIGH_ADDR_MASK) >> 24, | ||
2740 | ahd_le32toh(sg_list[i].addr), | ||
2741 | len & AHD_SG_LEN_MASK, | ||
2742 | len & AHD_DMA_LAST_SEG ? " Last" : ""); | ||
2743 | } | ||
2744 | } | ||
2745 | } | ||
2746 | } | ||
2747 | 2849 | ||
2748 | /************************* Transfer Negotiation *******************************/ | 2850 | /************************* Transfer Negotiation *******************************/ |
2749 | /* | 2851 | /* |
@@ -2850,14 +2952,14 @@ ahd_devlimited_syncrate(struct ahd_softc *ahd, | |||
2850 | transinfo = &tinfo->goal; | 2952 | transinfo = &tinfo->goal; |
2851 | *ppr_options &= (transinfo->ppr_options|MSG_EXT_PPR_PCOMP_EN); | 2953 | *ppr_options &= (transinfo->ppr_options|MSG_EXT_PPR_PCOMP_EN); |
2852 | if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) { | 2954 | if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) { |
2853 | maxsync = MAX(maxsync, AHD_SYNCRATE_ULTRA2); | 2955 | maxsync = max(maxsync, (u_int)AHD_SYNCRATE_ULTRA2); |
2854 | *ppr_options &= ~MSG_EXT_PPR_DT_REQ; | 2956 | *ppr_options &= ~MSG_EXT_PPR_DT_REQ; |
2855 | } | 2957 | } |
2856 | if (transinfo->period == 0) { | 2958 | if (transinfo->period == 0) { |
2857 | *period = 0; | 2959 | *period = 0; |
2858 | *ppr_options = 0; | 2960 | *ppr_options = 0; |
2859 | } else { | 2961 | } else { |
2860 | *period = MAX(*period, transinfo->period); | 2962 | *period = max(*period, (u_int)transinfo->period); |
2861 | ahd_find_syncrate(ahd, period, ppr_options, maxsync); | 2963 | ahd_find_syncrate(ahd, period, ppr_options, maxsync); |
2862 | } | 2964 | } |
2863 | } | 2965 | } |
@@ -2906,7 +3008,7 @@ ahd_find_syncrate(struct ahd_softc *ahd, u_int *period, | |||
2906 | * Truncate the given synchronous offset to a value the | 3008 | * Truncate the given synchronous offset to a value the |
2907 | * current adapter type and syncrate are capable of. | 3009 | * current adapter type and syncrate are capable of. |
2908 | */ | 3010 | */ |
2909 | void | 3011 | static void |
2910 | ahd_validate_offset(struct ahd_softc *ahd, | 3012 | ahd_validate_offset(struct ahd_softc *ahd, |
2911 | struct ahd_initiator_tinfo *tinfo, | 3013 | struct ahd_initiator_tinfo *tinfo, |
2912 | u_int period, u_int *offset, int wide, | 3014 | u_int period, u_int *offset, int wide, |
@@ -2924,12 +3026,12 @@ ahd_validate_offset(struct ahd_softc *ahd, | |||
2924 | maxoffset = MAX_OFFSET_PACED; | 3026 | maxoffset = MAX_OFFSET_PACED; |
2925 | } else | 3027 | } else |
2926 | maxoffset = MAX_OFFSET_NON_PACED; | 3028 | maxoffset = MAX_OFFSET_NON_PACED; |
2927 | *offset = MIN(*offset, maxoffset); | 3029 | *offset = min(*offset, maxoffset); |
2928 | if (tinfo != NULL) { | 3030 | if (tinfo != NULL) { |
2929 | if (role == ROLE_TARGET) | 3031 | if (role == ROLE_TARGET) |
2930 | *offset = MIN(*offset, tinfo->user.offset); | 3032 | *offset = min(*offset, (u_int)tinfo->user.offset); |
2931 | else | 3033 | else |
2932 | *offset = MIN(*offset, tinfo->goal.offset); | 3034 | *offset = min(*offset, (u_int)tinfo->goal.offset); |
2933 | } | 3035 | } |
2934 | } | 3036 | } |
2935 | 3037 | ||
@@ -2937,7 +3039,7 @@ ahd_validate_offset(struct ahd_softc *ahd, | |||
2937 | * Truncate the given transfer width parameter to a value the | 3039 | * Truncate the given transfer width parameter to a value the |
2938 | * current adapter type is capable of. | 3040 | * current adapter type is capable of. |
2939 | */ | 3041 | */ |
2940 | void | 3042 | static void |
2941 | ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo, | 3043 | ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo, |
2942 | u_int *bus_width, role_t role) | 3044 | u_int *bus_width, role_t role) |
2943 | { | 3045 | { |
@@ -2955,9 +3057,9 @@ ahd_validate_width(struct ahd_softc *ahd, struct ahd_initiator_tinfo *tinfo, | |||
2955 | } | 3057 | } |
2956 | if (tinfo != NULL) { | 3058 | if (tinfo != NULL) { |
2957 | if (role == ROLE_TARGET) | 3059 | if (role == ROLE_TARGET) |
2958 | *bus_width = MIN(tinfo->user.width, *bus_width); | 3060 | *bus_width = min((u_int)tinfo->user.width, *bus_width); |
2959 | else | 3061 | else |
2960 | *bus_width = MIN(tinfo->goal.width, *bus_width); | 3062 | *bus_width = min((u_int)tinfo->goal.width, *bus_width); |
2961 | } | 3063 | } |
2962 | } | 3064 | } |
2963 | 3065 | ||
@@ -3210,7 +3312,7 @@ ahd_set_width(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, | |||
3210 | /* | 3312 | /* |
3211 | * Update the current state of tagged queuing for a given target. | 3313 | * Update the current state of tagged queuing for a given target. |
3212 | */ | 3314 | */ |
3213 | void | 3315 | static void |
3214 | ahd_set_tags(struct ahd_softc *ahd, struct scsi_cmnd *cmd, | 3316 | ahd_set_tags(struct ahd_softc *ahd, struct scsi_cmnd *cmd, |
3215 | struct ahd_devinfo *devinfo, ahd_queue_alg alg) | 3317 | struct ahd_devinfo *devinfo, ahd_queue_alg alg) |
3216 | { | 3318 | { |
@@ -3466,7 +3568,7 @@ ahd_print_devinfo(struct ahd_softc *ahd, struct ahd_devinfo *devinfo) | |||
3466 | devinfo->target, devinfo->lun); | 3568 | devinfo->target, devinfo->lun); |
3467 | } | 3569 | } |
3468 | 3570 | ||
3469 | struct ahd_phase_table_entry* | 3571 | static struct ahd_phase_table_entry* |
3470 | ahd_lookup_phase_entry(int phase) | 3572 | ahd_lookup_phase_entry(int phase) |
3471 | { | 3573 | { |
3472 | struct ahd_phase_table_entry *entry; | 3574 | struct ahd_phase_table_entry *entry; |
@@ -5351,7 +5453,7 @@ ahd_free(struct ahd_softc *ahd) | |||
5351 | return; | 5453 | return; |
5352 | } | 5454 | } |
5353 | 5455 | ||
5354 | void | 5456 | static void |
5355 | ahd_shutdown(void *arg) | 5457 | ahd_shutdown(void *arg) |
5356 | { | 5458 | { |
5357 | struct ahd_softc *ahd; | 5459 | struct ahd_softc *ahd; |
@@ -5480,7 +5582,7 @@ ahd_reset(struct ahd_softc *ahd, int reinit) | |||
5480 | /* | 5582 | /* |
5481 | * Determine the number of SCBs available on the controller | 5583 | * Determine the number of SCBs available on the controller |
5482 | */ | 5584 | */ |
5483 | int | 5585 | static int |
5484 | ahd_probe_scbs(struct ahd_softc *ahd) { | 5586 | ahd_probe_scbs(struct ahd_softc *ahd) { |
5485 | int i; | 5587 | int i; |
5486 | 5588 | ||
@@ -5929,7 +6031,7 @@ ahd_free_scb(struct ahd_softc *ahd, struct scb *scb) | |||
5929 | ahd_platform_scb_free(ahd, scb); | 6031 | ahd_platform_scb_free(ahd, scb); |
5930 | } | 6032 | } |
5931 | 6033 | ||
5932 | void | 6034 | static void |
5933 | ahd_alloc_scbs(struct ahd_softc *ahd) | 6035 | ahd_alloc_scbs(struct ahd_softc *ahd) |
5934 | { | 6036 | { |
5935 | struct scb_data *scb_data; | 6037 | struct scb_data *scb_data; |
@@ -6057,9 +6159,9 @@ ahd_alloc_scbs(struct ahd_softc *ahd) | |||
6057 | #endif | 6159 | #endif |
6058 | } | 6160 | } |
6059 | 6161 | ||
6060 | newcount = MIN(scb_data->sense_left, scb_data->scbs_left); | 6162 | newcount = min(scb_data->sense_left, scb_data->scbs_left); |
6061 | newcount = MIN(newcount, scb_data->sgs_left); | 6163 | newcount = min(newcount, scb_data->sgs_left); |
6062 | newcount = MIN(newcount, (AHD_SCB_MAX_ALLOC - scb_data->numscbs)); | 6164 | newcount = min(newcount, (AHD_SCB_MAX_ALLOC - scb_data->numscbs)); |
6063 | for (i = 0; i < newcount; i++) { | 6165 | for (i = 0; i < newcount; i++) { |
6064 | struct scb_platform_data *pdata; | 6166 | struct scb_platform_data *pdata; |
6065 | u_int col_tag; | 6167 | u_int col_tag; |
@@ -6982,7 +7084,7 @@ ahd_intr_enable(struct ahd_softc *ahd, int enable) | |||
6982 | ahd_outb(ahd, HCNTRL, hcntrl); | 7084 | ahd_outb(ahd, HCNTRL, hcntrl); |
6983 | } | 7085 | } |
6984 | 7086 | ||
6985 | void | 7087 | static void |
6986 | ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds, | 7088 | ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds, |
6987 | u_int mincmds) | 7089 | u_int mincmds) |
6988 | { | 7090 | { |
@@ -7000,7 +7102,7 @@ ahd_update_coalescing_values(struct ahd_softc *ahd, u_int timer, u_int maxcmds, | |||
7000 | ahd_outb(ahd, INT_COALESCING_MINCMDS, -mincmds); | 7102 | ahd_outb(ahd, INT_COALESCING_MINCMDS, -mincmds); |
7001 | } | 7103 | } |
7002 | 7104 | ||
7003 | void | 7105 | static void |
7004 | ahd_enable_coalescing(struct ahd_softc *ahd, int enable) | 7106 | ahd_enable_coalescing(struct ahd_softc *ahd, int enable) |
7005 | { | 7107 | { |
7006 | 7108 | ||
@@ -7070,6 +7172,7 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd) | |||
7070 | ahd->flags &= ~AHD_ALL_INTERRUPTS; | 7172 | ahd->flags &= ~AHD_ALL_INTERRUPTS; |
7071 | } | 7173 | } |
7072 | 7174 | ||
7175 | #if 0 | ||
7073 | int | 7176 | int |
7074 | ahd_suspend(struct ahd_softc *ahd) | 7177 | ahd_suspend(struct ahd_softc *ahd) |
7075 | { | 7178 | { |
@@ -7083,7 +7186,9 @@ ahd_suspend(struct ahd_softc *ahd) | |||
7083 | ahd_shutdown(ahd); | 7186 | ahd_shutdown(ahd); |
7084 | return (0); | 7187 | return (0); |
7085 | } | 7188 | } |
7189 | #endif /* 0 */ | ||
7086 | 7190 | ||
7191 | #if 0 | ||
7087 | int | 7192 | int |
7088 | ahd_resume(struct ahd_softc *ahd) | 7193 | ahd_resume(struct ahd_softc *ahd) |
7089 | { | 7194 | { |
@@ -7093,6 +7198,7 @@ ahd_resume(struct ahd_softc *ahd) | |||
7093 | ahd_restart(ahd); | 7198 | ahd_restart(ahd); |
7094 | return (0); | 7199 | return (0); |
7095 | } | 7200 | } |
7201 | #endif /* 0 */ | ||
7096 | 7202 | ||
7097 | /************************** Busy Target Table *********************************/ | 7203 | /************************** Busy Target Table *********************************/ |
7098 | /* | 7204 | /* |
@@ -7125,7 +7231,7 @@ ahd_index_busy_tcl(struct ahd_softc *ahd, u_int *saved_scbid, u_int tcl) | |||
7125 | /* | 7231 | /* |
7126 | * Return the untagged transaction id for a given target/channel lun. | 7232 | * Return the untagged transaction id for a given target/channel lun. |
7127 | */ | 7233 | */ |
7128 | u_int | 7234 | static u_int |
7129 | ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl) | 7235 | ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl) |
7130 | { | 7236 | { |
7131 | u_int scbid; | 7237 | u_int scbid; |
@@ -7138,7 +7244,7 @@ ahd_find_busy_tcl(struct ahd_softc *ahd, u_int tcl) | |||
7138 | return (scbid); | 7244 | return (scbid); |
7139 | } | 7245 | } |
7140 | 7246 | ||
7141 | void | 7247 | static void |
7142 | ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, u_int scbid) | 7248 | ahd_busy_tcl(struct ahd_softc *ahd, u_int tcl, u_int scbid) |
7143 | { | 7249 | { |
7144 | u_int scb_offset; | 7250 | u_int scb_offset; |
@@ -7186,7 +7292,7 @@ ahd_match_scb(struct ahd_softc *ahd, struct scb *scb, int target, | |||
7186 | return match; | 7292 | return match; |
7187 | } | 7293 | } |
7188 | 7294 | ||
7189 | void | 7295 | static void |
7190 | ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb) | 7296 | ahd_freeze_devq(struct ahd_softc *ahd, struct scb *scb) |
7191 | { | 7297 | { |
7192 | int target; | 7298 | int target; |
@@ -7690,7 +7796,7 @@ ahd_add_scb_to_free_list(struct ahd_softc *ahd, u_int scbid) | |||
7690 | * been modified from CAM_REQ_INPROG. This routine assumes that the sequencer | 7796 | * been modified from CAM_REQ_INPROG. This routine assumes that the sequencer |
7691 | * is paused before it is called. | 7797 | * is paused before it is called. |
7692 | */ | 7798 | */ |
7693 | int | 7799 | static int |
7694 | ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel, | 7800 | ahd_abort_scbs(struct ahd_softc *ahd, int target, char channel, |
7695 | int lun, u_int tag, role_t role, uint32_t status) | 7801 | int lun, u_int tag, role_t role, uint32_t status) |
7696 | { | 7802 | { |
@@ -7920,6 +8026,11 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
7920 | ahd_clear_fifo(ahd, 1); | 8026 | ahd_clear_fifo(ahd, 1); |
7921 | 8027 | ||
7922 | /* | 8028 | /* |
8029 | * Clear SCSI interrupt status | ||
8030 | */ | ||
8031 | ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI); | ||
8032 | |||
8033 | /* | ||
7923 | * Reenable selections | 8034 | * Reenable selections |
7924 | */ | 8035 | */ |
7925 | ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST); | 8036 | ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST); |
@@ -7952,10 +8063,6 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
7952 | } | 8063 | } |
7953 | } | 8064 | } |
7954 | #endif | 8065 | #endif |
7955 | /* Notify the XPT that a bus reset occurred */ | ||
7956 | ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD, | ||
7957 | CAM_LUN_WILDCARD, AC_BUS_RESET); | ||
7958 | |||
7959 | /* | 8066 | /* |
7960 | * Revert to async/narrow transfers until we renegotiate. | 8067 | * Revert to async/narrow transfers until we renegotiate. |
7961 | */ | 8068 | */ |
@@ -7977,6 +8084,10 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
7977 | } | 8084 | } |
7978 | } | 8085 | } |
7979 | 8086 | ||
8087 | /* Notify the XPT that a bus reset occurred */ | ||
8088 | ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD, | ||
8089 | CAM_LUN_WILDCARD, AC_BUS_RESET); | ||
8090 | |||
7980 | ahd_restart(ahd); | 8091 | ahd_restart(ahd); |
7981 | 8092 | ||
7982 | return (found); | 8093 | return (found); |
@@ -8019,18 +8130,8 @@ ahd_stat_timer(void *arg) | |||
8019 | } | 8130 | } |
8020 | 8131 | ||
8021 | /****************************** Status Processing *****************************/ | 8132 | /****************************** Status Processing *****************************/ |
8022 | void | ||
8023 | ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb) | ||
8024 | { | ||
8025 | if (scb->hscb->shared_data.istatus.scsi_status != 0) { | ||
8026 | ahd_handle_scsi_status(ahd, scb); | ||
8027 | } else { | ||
8028 | ahd_calc_residual(ahd, scb); | ||
8029 | ahd_done(ahd, scb); | ||
8030 | } | ||
8031 | } | ||
8032 | 8133 | ||
8033 | void | 8134 | static void |
8034 | ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb) | 8135 | ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb) |
8035 | { | 8136 | { |
8036 | struct hardware_scb *hscb; | 8137 | struct hardware_scb *hscb; |
@@ -8238,10 +8339,21 @@ ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb) | |||
8238 | } | 8339 | } |
8239 | } | 8340 | } |
8240 | 8341 | ||
8342 | static void | ||
8343 | ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb) | ||
8344 | { | ||
8345 | if (scb->hscb->shared_data.istatus.scsi_status != 0) { | ||
8346 | ahd_handle_scsi_status(ahd, scb); | ||
8347 | } else { | ||
8348 | ahd_calc_residual(ahd, scb); | ||
8349 | ahd_done(ahd, scb); | ||
8350 | } | ||
8351 | } | ||
8352 | |||
8241 | /* | 8353 | /* |
8242 | * Calculate the residual for a just completed SCB. | 8354 | * Calculate the residual for a just completed SCB. |
8243 | */ | 8355 | */ |
8244 | void | 8356 | static void |
8245 | ahd_calc_residual(struct ahd_softc *ahd, struct scb *scb) | 8357 | ahd_calc_residual(struct ahd_softc *ahd, struct scb *scb) |
8246 | { | 8358 | { |
8247 | struct hardware_scb *hscb; | 8359 | struct hardware_scb *hscb; |
@@ -8668,7 +8780,7 @@ ahd_resolve_seqaddr(struct ahd_softc *ahd, u_int address) | |||
8668 | if (skip_addr > i) { | 8780 | if (skip_addr > i) { |
8669 | int end_addr; | 8781 | int end_addr; |
8670 | 8782 | ||
8671 | end_addr = MIN(address, skip_addr); | 8783 | end_addr = min(address, skip_addr); |
8672 | address_offset += end_addr - i; | 8784 | address_offset += end_addr - i; |
8673 | i = skip_addr; | 8785 | i = skip_addr; |
8674 | } else { | 8786 | } else { |
@@ -9092,6 +9204,7 @@ ahd_dump_card_state(struct ahd_softc *ahd) | |||
9092 | ahd_unpause(ahd); | 9204 | ahd_unpause(ahd); |
9093 | } | 9205 | } |
9094 | 9206 | ||
9207 | #if 0 | ||
9095 | void | 9208 | void |
9096 | ahd_dump_scbs(struct ahd_softc *ahd) | 9209 | ahd_dump_scbs(struct ahd_softc *ahd) |
9097 | { | 9210 | { |
@@ -9117,6 +9230,7 @@ ahd_dump_scbs(struct ahd_softc *ahd) | |||
9117 | ahd_set_scbptr(ahd, saved_scb_index); | 9230 | ahd_set_scbptr(ahd, saved_scb_index); |
9118 | ahd_restore_modes(ahd, saved_modes); | 9231 | ahd_restore_modes(ahd, saved_modes); |
9119 | } | 9232 | } |
9233 | #endif /* 0 */ | ||
9120 | 9234 | ||
9121 | /**************************** Flexport Logic **********************************/ | 9235 | /**************************** Flexport Logic **********************************/ |
9122 | /* | 9236 | /* |
@@ -9219,7 +9333,7 @@ ahd_write_seeprom(struct ahd_softc *ahd, uint16_t *buf, | |||
9219 | /* | 9333 | /* |
9220 | * Wait ~100us for the serial eeprom to satisfy our request. | 9334 | * Wait ~100us for the serial eeprom to satisfy our request. |
9221 | */ | 9335 | */ |
9222 | int | 9336 | static int |
9223 | ahd_wait_seeprom(struct ahd_softc *ahd) | 9337 | ahd_wait_seeprom(struct ahd_softc *ahd) |
9224 | { | 9338 | { |
9225 | int cnt; | 9339 | int cnt; |
@@ -9237,7 +9351,7 @@ ahd_wait_seeprom(struct ahd_softc *ahd) | |||
9237 | * Validate the two checksums in the per_channel | 9351 | * Validate the two checksums in the per_channel |
9238 | * vital product data struct. | 9352 | * vital product data struct. |
9239 | */ | 9353 | */ |
9240 | int | 9354 | static int |
9241 | ahd_verify_vpd_cksum(struct vpd_config *vpd) | 9355 | ahd_verify_vpd_cksum(struct vpd_config *vpd) |
9242 | { | 9356 | { |
9243 | int i; | 9357 | int i; |
@@ -9316,6 +9430,24 @@ ahd_release_seeprom(struct ahd_softc *ahd) | |||
9316 | /* Currently a no-op */ | 9430 | /* Currently a no-op */ |
9317 | } | 9431 | } |
9318 | 9432 | ||
9433 | /* | ||
9434 | * Wait at most 2 seconds for flexport arbitration to succeed. | ||
9435 | */ | ||
9436 | static int | ||
9437 | ahd_wait_flexport(struct ahd_softc *ahd) | ||
9438 | { | ||
9439 | int cnt; | ||
9440 | |||
9441 | AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK); | ||
9442 | cnt = 1000000 * 2 / 5; | ||
9443 | while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt) | ||
9444 | ahd_delay(5); | ||
9445 | |||
9446 | if (cnt == 0) | ||
9447 | return (ETIMEDOUT); | ||
9448 | return (0); | ||
9449 | } | ||
9450 | |||
9319 | int | 9451 | int |
9320 | ahd_write_flexport(struct ahd_softc *ahd, u_int addr, u_int value) | 9452 | ahd_write_flexport(struct ahd_softc *ahd, u_int addr, u_int value) |
9321 | { | 9453 | { |
@@ -9357,24 +9489,6 @@ ahd_read_flexport(struct ahd_softc *ahd, u_int addr, uint8_t *value) | |||
9357 | return (0); | 9489 | return (0); |
9358 | } | 9490 | } |
9359 | 9491 | ||
9360 | /* | ||
9361 | * Wait at most 2 seconds for flexport arbitration to succeed. | ||
9362 | */ | ||
9363 | int | ||
9364 | ahd_wait_flexport(struct ahd_softc *ahd) | ||
9365 | { | ||
9366 | int cnt; | ||
9367 | |||
9368 | AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK); | ||
9369 | cnt = 1000000 * 2 / 5; | ||
9370 | while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt) | ||
9371 | ahd_delay(5); | ||
9372 | |||
9373 | if (cnt == 0) | ||
9374 | return (ETIMEDOUT); | ||
9375 | return (0); | ||
9376 | } | ||
9377 | |||
9378 | /************************* Target Mode ****************************************/ | 9492 | /************************* Target Mode ****************************************/ |
9379 | #ifdef AHD_TARGET_MODE | 9493 | #ifdef AHD_TARGET_MODE |
9380 | cam_status | 9494 | cam_status |
diff --git a/drivers/scsi/aic7xxx/aic79xx_inline.h b/drivers/scsi/aic7xxx/aic79xx_inline.h index a3266e066c00..2ceb67f4af2a 100644 --- a/drivers/scsi/aic7xxx/aic79xx_inline.h +++ b/drivers/scsi/aic7xxx/aic79xx_inline.h | |||
@@ -418,10 +418,6 @@ ahd_targetcmd_offset(struct ahd_softc *ahd, u_int index) | |||
418 | } | 418 | } |
419 | 419 | ||
420 | /*********************** Miscelaneous Support Functions ***********************/ | 420 | /*********************** Miscelaneous Support Functions ***********************/ |
421 | static __inline void ahd_complete_scb(struct ahd_softc *ahd, | ||
422 | struct scb *scb); | ||
423 | static __inline void ahd_update_residual(struct ahd_softc *ahd, | ||
424 | struct scb *scb); | ||
425 | static __inline struct ahd_initiator_tinfo * | 421 | static __inline struct ahd_initiator_tinfo * |
426 | ahd_fetch_transinfo(struct ahd_softc *ahd, | 422 | ahd_fetch_transinfo(struct ahd_softc *ahd, |
427 | char channel, u_int our_id, | 423 | char channel, u_int our_id, |
@@ -467,32 +463,6 @@ static __inline uint32_t | |||
467 | ahd_get_sense_bufaddr(struct ahd_softc *ahd, | 463 | ahd_get_sense_bufaddr(struct ahd_softc *ahd, |
468 | struct scb *scb); | 464 | struct scb *scb); |
469 | 465 | ||
470 | static __inline void | ||
471 | ahd_complete_scb(struct ahd_softc *ahd, struct scb *scb) | ||
472 | { | ||
473 | uint32_t sgptr; | ||
474 | |||
475 | sgptr = ahd_le32toh(scb->hscb->sgptr); | ||
476 | if ((sgptr & SG_STATUS_VALID) != 0) | ||
477 | ahd_handle_scb_status(ahd, scb); | ||
478 | else | ||
479 | ahd_done(ahd, scb); | ||
480 | } | ||
481 | |||
482 | /* | ||
483 | * Determine whether the sequencer reported a residual | ||
484 | * for this SCB/transaction. | ||
485 | */ | ||
486 | static __inline void | ||
487 | ahd_update_residual(struct ahd_softc *ahd, struct scb *scb) | ||
488 | { | ||
489 | uint32_t sgptr; | ||
490 | |||
491 | sgptr = ahd_le32toh(scb->hscb->sgptr); | ||
492 | if ((sgptr & SG_STATUS_VALID) != 0) | ||
493 | ahd_calc_residual(ahd, scb); | ||
494 | } | ||
495 | |||
496 | /* | 466 | /* |
497 | * Return pointers to the transfer negotiation information | 467 | * Return pointers to the transfer negotiation information |
498 | * for the specified our_id/remote_id pair. | 468 | * for the specified our_id/remote_id pair. |
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index f8e60486167d..9bfcca5ede08 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c | |||
@@ -293,7 +293,7 @@ static uint32_t aic79xx_seltime; | |||
293 | * force all outstanding transactions to be serviced prior to a new | 293 | * force all outstanding transactions to be serviced prior to a new |
294 | * transaction. | 294 | * transaction. |
295 | */ | 295 | */ |
296 | uint32_t aic79xx_periodic_otag; | 296 | static uint32_t aic79xx_periodic_otag; |
297 | 297 | ||
298 | /* Some storage boxes are using an LSI chip which has a bug making it | 298 | /* Some storage boxes are using an LSI chip which has a bug making it |
299 | * impossible to use aic79xx Rev B chip in 320 speeds. The following | 299 | * impossible to use aic79xx Rev B chip in 320 speeds. The following |
@@ -773,6 +773,7 @@ struct scsi_host_template aic79xx_driver_template = { | |||
773 | #endif | 773 | #endif |
774 | .can_queue = AHD_MAX_QUEUE, | 774 | .can_queue = AHD_MAX_QUEUE, |
775 | .this_id = -1, | 775 | .this_id = -1, |
776 | .max_sectors = 8192, | ||
776 | .cmd_per_lun = 2, | 777 | .cmd_per_lun = 2, |
777 | .use_clustering = ENABLE_CLUSTERING, | 778 | .use_clustering = ENABLE_CLUSTERING, |
778 | .slave_alloc = ahd_linux_slave_alloc, | 779 | .slave_alloc = ahd_linux_slave_alloc, |
@@ -1813,9 +1814,9 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, | |||
1813 | u_int sense_offset; | 1814 | u_int sense_offset; |
1814 | 1815 | ||
1815 | if (scb->flags & SCB_SENSE) { | 1816 | if (scb->flags & SCB_SENSE) { |
1816 | sense_size = MIN(sizeof(struct scsi_sense_data) | 1817 | sense_size = min(sizeof(struct scsi_sense_data) |
1817 | - ahd_get_sense_residual(scb), | 1818 | - ahd_get_sense_residual(scb), |
1818 | sizeof(cmd->sense_buffer)); | 1819 | (u_long)sizeof(cmd->sense_buffer)); |
1819 | sense_offset = 0; | 1820 | sense_offset = 0; |
1820 | } else { | 1821 | } else { |
1821 | /* | 1822 | /* |
@@ -1824,7 +1825,8 @@ ahd_linux_handle_scsi_status(struct ahd_softc *ahd, | |||
1824 | */ | 1825 | */ |
1825 | siu = (struct scsi_status_iu_header *) | 1826 | siu = (struct scsi_status_iu_header *) |
1826 | scb->sense_data; | 1827 | scb->sense_data; |
1827 | sense_size = MIN(scsi_4btoul(siu->sense_length), | 1828 | sense_size = min_t(size_t, |
1829 | scsi_4btoul(siu->sense_length), | ||
1828 | sizeof(cmd->sense_buffer)); | 1830 | sizeof(cmd->sense_buffer)); |
1829 | sense_offset = SIU_SENSE_OFFSET(siu); | 1831 | sense_offset = SIU_SENSE_OFFSET(siu); |
1830 | } | 1832 | } |
@@ -2634,8 +2636,22 @@ static void ahd_linux_set_pcomp_en(struct scsi_target *starget, int pcomp) | |||
2634 | pcomp ? "Enable" : "Disable"); | 2636 | pcomp ? "Enable" : "Disable"); |
2635 | #endif | 2637 | #endif |
2636 | 2638 | ||
2637 | if (pcomp) | 2639 | if (pcomp) { |
2640 | uint8_t precomp; | ||
2641 | |||
2642 | if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) { | ||
2643 | struct ahd_linux_iocell_opts *iocell_opts; | ||
2644 | |||
2645 | iocell_opts = &aic79xx_iocell_info[ahd->unit]; | ||
2646 | precomp = iocell_opts->precomp; | ||
2647 | } else { | ||
2648 | precomp = AIC79XX_DEFAULT_PRECOMP; | ||
2649 | } | ||
2638 | ppr_options |= MSG_EXT_PPR_PCOMP_EN; | 2650 | ppr_options |= MSG_EXT_PPR_PCOMP_EN; |
2651 | AHD_SET_PRECOMP(ahd, precomp); | ||
2652 | } else { | ||
2653 | AHD_SET_PRECOMP(ahd, 0); | ||
2654 | } | ||
2639 | 2655 | ||
2640 | ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, | 2656 | ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, |
2641 | starget->channel + 'A', ROLE_INITIATOR); | 2657 | starget->channel + 'A', ROLE_INITIATOR); |
@@ -2678,7 +2694,25 @@ static void ahd_linux_set_hold_mcs(struct scsi_target *starget, int hold) | |||
2678 | ahd_unlock(ahd, &flags); | 2694 | ahd_unlock(ahd, &flags); |
2679 | } | 2695 | } |
2680 | 2696 | ||
2697 | static void ahd_linux_get_signalling(struct Scsi_Host *shost) | ||
2698 | { | ||
2699 | struct ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata; | ||
2700 | unsigned long flags; | ||
2701 | u8 mode; | ||
2702 | |||
2703 | ahd_lock(ahd, &flags); | ||
2704 | ahd_pause(ahd); | ||
2705 | mode = ahd_inb(ahd, SBLKCTL); | ||
2706 | ahd_unpause(ahd); | ||
2707 | ahd_unlock(ahd, &flags); | ||
2681 | 2708 | ||
2709 | if (mode & ENAB40) | ||
2710 | spi_signalling(shost) = SPI_SIGNAL_LVD; | ||
2711 | else if (mode & ENAB20) | ||
2712 | spi_signalling(shost) = SPI_SIGNAL_SE; | ||
2713 | else | ||
2714 | spi_signalling(shost) = SPI_SIGNAL_UNKNOWN; | ||
2715 | } | ||
2682 | 2716 | ||
2683 | static struct spi_function_template ahd_linux_transport_functions = { | 2717 | static struct spi_function_template ahd_linux_transport_functions = { |
2684 | .set_offset = ahd_linux_set_offset, | 2718 | .set_offset = ahd_linux_set_offset, |
@@ -2703,6 +2737,7 @@ static struct spi_function_template ahd_linux_transport_functions = { | |||
2703 | .show_pcomp_en = 1, | 2737 | .show_pcomp_en = 1, |
2704 | .set_hold_mcs = ahd_linux_set_hold_mcs, | 2738 | .set_hold_mcs = ahd_linux_set_hold_mcs, |
2705 | .show_hold_mcs = 1, | 2739 | .show_hold_mcs = 1, |
2740 | .get_signalling = ahd_linux_get_signalling, | ||
2706 | }; | 2741 | }; |
2707 | 2742 | ||
2708 | static int __init | 2743 | static int __init |
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h index fb3d4dd54413..3a67fc578d78 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.h +++ b/drivers/scsi/aic7xxx/aic79xx_osm.h | |||
@@ -506,9 +506,6 @@ struct info_str { | |||
506 | int pos; | 506 | int pos; |
507 | }; | 507 | }; |
508 | 508 | ||
509 | void ahd_format_transinfo(struct info_str *info, | ||
510 | struct ahd_transinfo *tinfo); | ||
511 | |||
512 | /******************************** Locking *************************************/ | 509 | /******************************** Locking *************************************/ |
513 | static __inline void | 510 | static __inline void |
514 | ahd_lockinit(struct ahd_softc *ahd) | 511 | ahd_lockinit(struct ahd_softc *ahd) |
@@ -582,8 +579,6 @@ ahd_unlock(struct ahd_softc *ahd, unsigned long *flags) | |||
582 | #define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */ | 579 | #define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */ |
583 | #define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */ | 580 | #define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */ |
584 | 581 | ||
585 | extern struct pci_driver aic79xx_pci_driver; | ||
586 | |||
587 | typedef enum | 582 | typedef enum |
588 | { | 583 | { |
589 | AHD_POWER_STATE_D0, | 584 | AHD_POWER_STATE_D0, |
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c index 4b5354201807..2001fe890e71 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm_pci.c | |||
@@ -82,7 +82,7 @@ static struct pci_device_id ahd_linux_pci_id_table[] = { | |||
82 | 82 | ||
83 | MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table); | 83 | MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table); |
84 | 84 | ||
85 | struct pci_driver aic79xx_pci_driver = { | 85 | static struct pci_driver aic79xx_pci_driver = { |
86 | .name = "aic79xx", | 86 | .name = "aic79xx", |
87 | .probe = ahd_linux_pci_dev_probe, | 87 | .probe = ahd_linux_pci_dev_probe, |
88 | .remove = ahd_linux_pci_dev_remove, | 88 | .remove = ahd_linux_pci_dev_remove, |
diff --git a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c index 14850f31aafa..c07735819cd1 100644 --- a/drivers/scsi/aic7xxx/aic79xx_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_pci.c | |||
@@ -97,7 +97,7 @@ static ahd_device_setup_t ahd_aic7901A_setup; | |||
97 | static ahd_device_setup_t ahd_aic7902_setup; | 97 | static ahd_device_setup_t ahd_aic7902_setup; |
98 | static ahd_device_setup_t ahd_aic790X_setup; | 98 | static ahd_device_setup_t ahd_aic790X_setup; |
99 | 99 | ||
100 | struct ahd_pci_identity ahd_pci_ident_table [] = | 100 | static struct ahd_pci_identity ahd_pci_ident_table [] = |
101 | { | 101 | { |
102 | /* aic7901 based controllers */ | 102 | /* aic7901 based controllers */ |
103 | { | 103 | { |
@@ -201,7 +201,7 @@ struct ahd_pci_identity ahd_pci_ident_table [] = | |||
201 | } | 201 | } |
202 | }; | 202 | }; |
203 | 203 | ||
204 | const u_int ahd_num_pci_devs = ARRAY_SIZE(ahd_pci_ident_table); | 204 | static const u_int ahd_num_pci_devs = ARRAY_SIZE(ahd_pci_ident_table); |
205 | 205 | ||
206 | #define DEVCONFIG 0x40 | 206 | #define DEVCONFIG 0x40 |
207 | #define PCIXINITPAT 0x0000E000ul | 207 | #define PCIXINITPAT 0x0000E000ul |
@@ -245,6 +245,7 @@ static int ahd_check_extport(struct ahd_softc *ahd); | |||
245 | static void ahd_configure_termination(struct ahd_softc *ahd, | 245 | static void ahd_configure_termination(struct ahd_softc *ahd, |
246 | u_int adapter_control); | 246 | u_int adapter_control); |
247 | static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat); | 247 | static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat); |
248 | static void ahd_pci_intr(struct ahd_softc *ahd); | ||
248 | 249 | ||
249 | struct ahd_pci_identity * | 250 | struct ahd_pci_identity * |
250 | ahd_find_pci_device(ahd_dev_softc_t pci) | 251 | ahd_find_pci_device(ahd_dev_softc_t pci) |
@@ -757,7 +758,7 @@ static const char *pci_status_strings[] = | |||
757 | "%s: Address or Write Phase Parity Error Detected in %s.\n" | 758 | "%s: Address or Write Phase Parity Error Detected in %s.\n" |
758 | }; | 759 | }; |
759 | 760 | ||
760 | void | 761 | static void |
761 | ahd_pci_intr(struct ahd_softc *ahd) | 762 | ahd_pci_intr(struct ahd_softc *ahd) |
762 | { | 763 | { |
763 | uint8_t pci_status[8]; | 764 | uint8_t pci_status[8]; |
diff --git a/drivers/scsi/aic7xxx/aic79xx_proc.c b/drivers/scsi/aic7xxx/aic79xx_proc.c index c5f0ee591509..6b28bebcbca0 100644 --- a/drivers/scsi/aic7xxx/aic79xx_proc.c +++ b/drivers/scsi/aic7xxx/aic79xx_proc.c | |||
@@ -136,7 +136,7 @@ copy_info(struct info_str *info, char *fmt, ...) | |||
136 | return (len); | 136 | return (len); |
137 | } | 137 | } |
138 | 138 | ||
139 | void | 139 | static void |
140 | ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) | 140 | ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) |
141 | { | 141 | { |
142 | u_int speed; | 142 | u_int speed; |
diff --git a/drivers/scsi/aic7xxx/aic7xxx.h b/drivers/scsi/aic7xxx/aic7xxx.h index 62ff8c3dc2bb..954c7c24501d 100644 --- a/drivers/scsi/aic7xxx/aic7xxx.h +++ b/drivers/scsi/aic7xxx/aic7xxx.h | |||
@@ -54,14 +54,6 @@ struct scb_platform_data; | |||
54 | struct seeprom_descriptor; | 54 | struct seeprom_descriptor; |
55 | 55 | ||
56 | /****************************** Useful Macros *********************************/ | 56 | /****************************** Useful Macros *********************************/ |
57 | #ifndef MAX | ||
58 | #define MAX(a,b) (((a) > (b)) ? (a) : (b)) | ||
59 | #endif | ||
60 | |||
61 | #ifndef MIN | ||
62 | #define MIN(a,b) (((a) < (b)) ? (a) : (b)) | ||
63 | #endif | ||
64 | |||
65 | #ifndef TRUE | 57 | #ifndef TRUE |
66 | #define TRUE 1 | 58 | #define TRUE 1 |
67 | #endif | 59 | #endif |
@@ -1135,8 +1127,6 @@ struct ahc_pci_identity { | |||
1135 | char *name; | 1127 | char *name; |
1136 | ahc_device_setup_t *setup; | 1128 | ahc_device_setup_t *setup; |
1137 | }; | 1129 | }; |
1138 | extern struct ahc_pci_identity ahc_pci_ident_table[]; | ||
1139 | extern const u_int ahc_num_pci_devs; | ||
1140 | 1130 | ||
1141 | /***************************** VL/EISA Declarations ***************************/ | 1131 | /***************************** VL/EISA Declarations ***************************/ |
1142 | struct aic7770_identity { | 1132 | struct aic7770_identity { |
@@ -1289,6 +1279,7 @@ typedef enum { | |||
1289 | } ahc_queue_alg; | 1279 | } ahc_queue_alg; |
1290 | 1280 | ||
1291 | void ahc_set_tags(struct ahc_softc *ahc, | 1281 | void ahc_set_tags(struct ahc_softc *ahc, |
1282 | struct scsi_cmnd *cmd, | ||
1292 | struct ahc_devinfo *devinfo, | 1283 | struct ahc_devinfo *devinfo, |
1293 | ahc_queue_alg alg); | 1284 | ahc_queue_alg alg); |
1294 | 1285 | ||
diff --git a/drivers/scsi/aic7xxx/aic7xxx_core.c b/drivers/scsi/aic7xxx/aic7xxx_core.c index 93e4e40944b6..50ef785224de 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_core.c +++ b/drivers/scsi/aic7xxx/aic7xxx_core.c | |||
@@ -1671,7 +1671,7 @@ ahc_devlimited_syncrate(struct ahc_softc *ahc, | |||
1671 | transinfo = &tinfo->goal; | 1671 | transinfo = &tinfo->goal; |
1672 | *ppr_options &= transinfo->ppr_options; | 1672 | *ppr_options &= transinfo->ppr_options; |
1673 | if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) { | 1673 | if (transinfo->width == MSG_EXT_WDTR_BUS_8_BIT) { |
1674 | maxsync = MAX(maxsync, AHC_SYNCRATE_ULTRA2); | 1674 | maxsync = max(maxsync, (u_int)AHC_SYNCRATE_ULTRA2); |
1675 | *ppr_options &= ~MSG_EXT_PPR_DT_REQ; | 1675 | *ppr_options &= ~MSG_EXT_PPR_DT_REQ; |
1676 | } | 1676 | } |
1677 | if (transinfo->period == 0) { | 1677 | if (transinfo->period == 0) { |
@@ -1679,7 +1679,7 @@ ahc_devlimited_syncrate(struct ahc_softc *ahc, | |||
1679 | *ppr_options = 0; | 1679 | *ppr_options = 0; |
1680 | return (NULL); | 1680 | return (NULL); |
1681 | } | 1681 | } |
1682 | *period = MAX(*period, transinfo->period); | 1682 | *period = max(*period, (u_int)transinfo->period); |
1683 | return (ahc_find_syncrate(ahc, period, ppr_options, maxsync)); | 1683 | return (ahc_find_syncrate(ahc, period, ppr_options, maxsync)); |
1684 | } | 1684 | } |
1685 | 1685 | ||
@@ -1804,12 +1804,12 @@ ahc_validate_offset(struct ahc_softc *ahc, | |||
1804 | else | 1804 | else |
1805 | maxoffset = MAX_OFFSET_8BIT; | 1805 | maxoffset = MAX_OFFSET_8BIT; |
1806 | } | 1806 | } |
1807 | *offset = MIN(*offset, maxoffset); | 1807 | *offset = min(*offset, maxoffset); |
1808 | if (tinfo != NULL) { | 1808 | if (tinfo != NULL) { |
1809 | if (role == ROLE_TARGET) | 1809 | if (role == ROLE_TARGET) |
1810 | *offset = MIN(*offset, tinfo->user.offset); | 1810 | *offset = min(*offset, (u_int)tinfo->user.offset); |
1811 | else | 1811 | else |
1812 | *offset = MIN(*offset, tinfo->goal.offset); | 1812 | *offset = min(*offset, (u_int)tinfo->goal.offset); |
1813 | } | 1813 | } |
1814 | } | 1814 | } |
1815 | 1815 | ||
@@ -1835,9 +1835,9 @@ ahc_validate_width(struct ahc_softc *ahc, struct ahc_initiator_tinfo *tinfo, | |||
1835 | } | 1835 | } |
1836 | if (tinfo != NULL) { | 1836 | if (tinfo != NULL) { |
1837 | if (role == ROLE_TARGET) | 1837 | if (role == ROLE_TARGET) |
1838 | *bus_width = MIN(tinfo->user.width, *bus_width); | 1838 | *bus_width = min((u_int)tinfo->user.width, *bus_width); |
1839 | else | 1839 | else |
1840 | *bus_width = MIN(tinfo->goal.width, *bus_width); | 1840 | *bus_width = min((u_int)tinfo->goal.width, *bus_width); |
1841 | } | 1841 | } |
1842 | } | 1842 | } |
1843 | 1843 | ||
@@ -1986,7 +1986,7 @@ ahc_set_syncrate(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | |||
1986 | tinfo->curr.ppr_options = ppr_options; | 1986 | tinfo->curr.ppr_options = ppr_options; |
1987 | 1987 | ||
1988 | ahc_send_async(ahc, devinfo->channel, devinfo->target, | 1988 | ahc_send_async(ahc, devinfo->channel, devinfo->target, |
1989 | CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL); | 1989 | CAM_LUN_WILDCARD, AC_TRANSFER_NEG); |
1990 | if (bootverbose) { | 1990 | if (bootverbose) { |
1991 | if (offset != 0) { | 1991 | if (offset != 0) { |
1992 | printf("%s: target %d synchronous at %sMHz%s, " | 1992 | printf("%s: target %d synchronous at %sMHz%s, " |
@@ -2056,7 +2056,7 @@ ahc_set_width(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | |||
2056 | tinfo->curr.width = width; | 2056 | tinfo->curr.width = width; |
2057 | 2057 | ||
2058 | ahc_send_async(ahc, devinfo->channel, devinfo->target, | 2058 | ahc_send_async(ahc, devinfo->channel, devinfo->target, |
2059 | CAM_LUN_WILDCARD, AC_TRANSFER_NEG, NULL); | 2059 | CAM_LUN_WILDCARD, AC_TRANSFER_NEG); |
2060 | if (bootverbose) { | 2060 | if (bootverbose) { |
2061 | printf("%s: target %d using %dbit transfers\n", | 2061 | printf("%s: target %d using %dbit transfers\n", |
2062 | ahc_name(ahc), devinfo->target, | 2062 | ahc_name(ahc), devinfo->target, |
@@ -2074,12 +2074,14 @@ ahc_set_width(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | |||
2074 | * Update the current state of tagged queuing for a given target. | 2074 | * Update the current state of tagged queuing for a given target. |
2075 | */ | 2075 | */ |
2076 | void | 2076 | void |
2077 | ahc_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | 2077 | ahc_set_tags(struct ahc_softc *ahc, struct scsi_cmnd *cmd, |
2078 | ahc_queue_alg alg) | 2078 | struct ahc_devinfo *devinfo, ahc_queue_alg alg) |
2079 | { | 2079 | { |
2080 | ahc_platform_set_tags(ahc, devinfo, alg); | 2080 | struct scsi_device *sdev = cmd->device; |
2081 | |||
2082 | ahc_platform_set_tags(ahc, sdev, devinfo, alg); | ||
2081 | ahc_send_async(ahc, devinfo->channel, devinfo->target, | 2083 | ahc_send_async(ahc, devinfo->channel, devinfo->target, |
2082 | devinfo->lun, AC_TRANSFER_NEG, &alg); | 2084 | devinfo->lun, AC_TRANSFER_NEG); |
2083 | } | 2085 | } |
2084 | 2086 | ||
2085 | /* | 2087 | /* |
@@ -3489,7 +3491,7 @@ ahc_handle_msg_reject(struct ahc_softc *ahc, struct ahc_devinfo *devinfo) | |||
3489 | printf("(%s:%c:%d:%d): refuses tagged commands. " | 3491 | printf("(%s:%c:%d:%d): refuses tagged commands. " |
3490 | "Performing non-tagged I/O\n", ahc_name(ahc), | 3492 | "Performing non-tagged I/O\n", ahc_name(ahc), |
3491 | devinfo->channel, devinfo->target, devinfo->lun); | 3493 | devinfo->channel, devinfo->target, devinfo->lun); |
3492 | ahc_set_tags(ahc, devinfo, AHC_QUEUE_NONE); | 3494 | ahc_set_tags(ahc, scb->io_ctx, devinfo, AHC_QUEUE_NONE); |
3493 | mask = ~0x23; | 3495 | mask = ~0x23; |
3494 | } else { | 3496 | } else { |
3495 | printf("(%s:%c:%d:%d): refuses %s tagged commands. " | 3497 | printf("(%s:%c:%d:%d): refuses %s tagged commands. " |
@@ -3497,7 +3499,7 @@ ahc_handle_msg_reject(struct ahc_softc *ahc, struct ahc_devinfo *devinfo) | |||
3497 | ahc_name(ahc), devinfo->channel, devinfo->target, | 3499 | ahc_name(ahc), devinfo->channel, devinfo->target, |
3498 | devinfo->lun, tag_type == MSG_ORDERED_TASK | 3500 | devinfo->lun, tag_type == MSG_ORDERED_TASK |
3499 | ? "ordered" : "head of queue"); | 3501 | ? "ordered" : "head of queue"); |
3500 | ahc_set_tags(ahc, devinfo, AHC_QUEUE_BASIC); | 3502 | ahc_set_tags(ahc, scb->io_ctx, devinfo, AHC_QUEUE_BASIC); |
3501 | mask = ~0x03; | 3503 | mask = ~0x03; |
3502 | } | 3504 | } |
3503 | 3505 | ||
@@ -3763,7 +3765,7 @@ ahc_handle_devreset(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | |||
3763 | 3765 | ||
3764 | if (status != CAM_SEL_TIMEOUT) | 3766 | if (status != CAM_SEL_TIMEOUT) |
3765 | ahc_send_async(ahc, devinfo->channel, devinfo->target, | 3767 | ahc_send_async(ahc, devinfo->channel, devinfo->target, |
3766 | CAM_LUN_WILDCARD, AC_SENT_BDR, NULL); | 3768 | CAM_LUN_WILDCARD, AC_SENT_BDR); |
3767 | 3769 | ||
3768 | if (message != NULL | 3770 | if (message != NULL |
3769 | && (verbose_level <= bootverbose)) | 3771 | && (verbose_level <= bootverbose)) |
@@ -4406,7 +4408,7 @@ ahc_alloc_scbs(struct ahc_softc *ahc) | |||
4406 | physaddr = sg_map->sg_physaddr; | 4408 | physaddr = sg_map->sg_physaddr; |
4407 | 4409 | ||
4408 | newcount = (PAGE_SIZE / (AHC_NSEG * sizeof(struct ahc_dma_seg))); | 4410 | newcount = (PAGE_SIZE / (AHC_NSEG * sizeof(struct ahc_dma_seg))); |
4409 | newcount = MIN(newcount, (AHC_SCB_MAX_ALLOC - scb_data->numscbs)); | 4411 | newcount = min(newcount, (AHC_SCB_MAX_ALLOC - scb_data->numscbs)); |
4410 | for (i = 0; i < newcount; i++) { | 4412 | for (i = 0; i < newcount; i++) { |
4411 | struct scb_platform_data *pdata; | 4413 | struct scb_platform_data *pdata; |
4412 | #ifndef __linux__ | 4414 | #ifndef __linux__ |
@@ -6018,7 +6020,7 @@ ahc_reset_channel(struct ahc_softc *ahc, char channel, int initiate_reset) | |||
6018 | #endif | 6020 | #endif |
6019 | /* Notify the XPT that a bus reset occurred */ | 6021 | /* Notify the XPT that a bus reset occurred */ |
6020 | ahc_send_async(ahc, devinfo.channel, CAM_TARGET_WILDCARD, | 6022 | ahc_send_async(ahc, devinfo.channel, CAM_TARGET_WILDCARD, |
6021 | CAM_LUN_WILDCARD, AC_BUS_RESET, NULL); | 6023 | CAM_LUN_WILDCARD, AC_BUS_RESET); |
6022 | 6024 | ||
6023 | /* | 6025 | /* |
6024 | * Revert to async/narrow transfers until we renegotiate. | 6026 | * Revert to async/narrow transfers until we renegotiate. |
@@ -6442,7 +6444,7 @@ ahc_download_instr(struct ahc_softc *ahc, u_int instrptr, uint8_t *dconsts) | |||
6442 | if (skip_addr > i) { | 6444 | if (skip_addr > i) { |
6443 | int end_addr; | 6445 | int end_addr; |
6444 | 6446 | ||
6445 | end_addr = MIN(address, skip_addr); | 6447 | end_addr = min(address, skip_addr); |
6446 | address_offset += end_addr - i; | 6448 | address_offset += end_addr - i; |
6447 | i = skip_addr; | 6449 | i = skip_addr; |
6448 | } else { | 6450 | } else { |
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index 43ab753d2739..660f26e23a38 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c | |||
@@ -328,7 +328,7 @@ static uint32_t aic7xxx_seltime; | |||
328 | * force all outstanding transactions to be serviced prior to a new | 328 | * force all outstanding transactions to be serviced prior to a new |
329 | * transaction. | 329 | * transaction. |
330 | */ | 330 | */ |
331 | uint32_t aic7xxx_periodic_otag; | 331 | static uint32_t aic7xxx_periodic_otag; |
332 | 332 | ||
333 | /* | 333 | /* |
334 | * Module information and settable options. | 334 | * Module information and settable options. |
@@ -512,7 +512,6 @@ ahc_linux_target_alloc(struct scsi_target *starget) | |||
512 | struct seeprom_config *sc = ahc->seep_config; | 512 | struct seeprom_config *sc = ahc->seep_config; |
513 | unsigned long flags; | 513 | unsigned long flags; |
514 | struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget); | 514 | struct scsi_target **ahc_targp = ahc_linux_target_in_softc(starget); |
515 | struct ahc_linux_target *targ = scsi_transport_target_data(starget); | ||
516 | unsigned short scsirate; | 515 | unsigned short scsirate; |
517 | struct ahc_devinfo devinfo; | 516 | struct ahc_devinfo devinfo; |
518 | struct ahc_initiator_tinfo *tinfo; | 517 | struct ahc_initiator_tinfo *tinfo; |
@@ -533,7 +532,6 @@ ahc_linux_target_alloc(struct scsi_target *starget) | |||
533 | BUG_ON(*ahc_targp != NULL); | 532 | BUG_ON(*ahc_targp != NULL); |
534 | 533 | ||
535 | *ahc_targp = starget; | 534 | *ahc_targp = starget; |
536 | memset(targ, 0, sizeof(*targ)); | ||
537 | 535 | ||
538 | if (sc) { | 536 | if (sc) { |
539 | int maxsync = AHC_SYNCRATE_DT; | 537 | int maxsync = AHC_SYNCRATE_DT; |
@@ -594,14 +592,11 @@ ahc_linux_slave_alloc(struct scsi_device *sdev) | |||
594 | struct ahc_softc *ahc = | 592 | struct ahc_softc *ahc = |
595 | *((struct ahc_softc **)sdev->host->hostdata); | 593 | *((struct ahc_softc **)sdev->host->hostdata); |
596 | struct scsi_target *starget = sdev->sdev_target; | 594 | struct scsi_target *starget = sdev->sdev_target; |
597 | struct ahc_linux_target *targ = scsi_transport_target_data(starget); | ||
598 | struct ahc_linux_device *dev; | 595 | struct ahc_linux_device *dev; |
599 | 596 | ||
600 | if (bootverbose) | 597 | if (bootverbose) |
601 | printf("%s: Slave Alloc %d\n", ahc_name(ahc), sdev->id); | 598 | printf("%s: Slave Alloc %d\n", ahc_name(ahc), sdev->id); |
602 | 599 | ||
603 | BUG_ON(targ->sdev[sdev->lun] != NULL); | ||
604 | |||
605 | dev = scsi_transport_device_data(sdev); | 600 | dev = scsi_transport_device_data(sdev); |
606 | memset(dev, 0, sizeof(*dev)); | 601 | memset(dev, 0, sizeof(*dev)); |
607 | 602 | ||
@@ -618,8 +613,6 @@ ahc_linux_slave_alloc(struct scsi_device *sdev) | |||
618 | */ | 613 | */ |
619 | dev->maxtags = 0; | 614 | dev->maxtags = 0; |
620 | 615 | ||
621 | targ->sdev[sdev->lun] = sdev; | ||
622 | |||
623 | spi_period(starget) = 0; | 616 | spi_period(starget) = 0; |
624 | 617 | ||
625 | return 0; | 618 | return 0; |
@@ -644,22 +637,6 @@ ahc_linux_slave_configure(struct scsi_device *sdev) | |||
644 | return 0; | 637 | return 0; |
645 | } | 638 | } |
646 | 639 | ||
647 | static void | ||
648 | ahc_linux_slave_destroy(struct scsi_device *sdev) | ||
649 | { | ||
650 | struct ahc_softc *ahc; | ||
651 | struct ahc_linux_device *dev = scsi_transport_device_data(sdev); | ||
652 | struct ahc_linux_target *targ = scsi_transport_target_data(sdev->sdev_target); | ||
653 | |||
654 | ahc = *((struct ahc_softc **)sdev->host->hostdata); | ||
655 | if (bootverbose) | ||
656 | printf("%s: Slave Destroy %d\n", ahc_name(ahc), sdev->id); | ||
657 | |||
658 | BUG_ON(dev->active); | ||
659 | |||
660 | targ->sdev[sdev->lun] = NULL; | ||
661 | } | ||
662 | |||
663 | #if defined(__i386__) | 640 | #if defined(__i386__) |
664 | /* | 641 | /* |
665 | * Return the disk geometry for the given SCSI device. | 642 | * Return the disk geometry for the given SCSI device. |
@@ -777,11 +754,11 @@ struct scsi_host_template aic7xxx_driver_template = { | |||
777 | #endif | 754 | #endif |
778 | .can_queue = AHC_MAX_QUEUE, | 755 | .can_queue = AHC_MAX_QUEUE, |
779 | .this_id = -1, | 756 | .this_id = -1, |
757 | .max_sectors = 8192, | ||
780 | .cmd_per_lun = 2, | 758 | .cmd_per_lun = 2, |
781 | .use_clustering = ENABLE_CLUSTERING, | 759 | .use_clustering = ENABLE_CLUSTERING, |
782 | .slave_alloc = ahc_linux_slave_alloc, | 760 | .slave_alloc = ahc_linux_slave_alloc, |
783 | .slave_configure = ahc_linux_slave_configure, | 761 | .slave_configure = ahc_linux_slave_configure, |
784 | .slave_destroy = ahc_linux_slave_destroy, | ||
785 | .target_alloc = ahc_linux_target_alloc, | 762 | .target_alloc = ahc_linux_target_alloc, |
786 | .target_destroy = ahc_linux_target_destroy, | 763 | .target_destroy = ahc_linux_target_destroy, |
787 | }; | 764 | }; |
@@ -1203,21 +1180,13 @@ void | |||
1203 | ahc_platform_free(struct ahc_softc *ahc) | 1180 | ahc_platform_free(struct ahc_softc *ahc) |
1204 | { | 1181 | { |
1205 | struct scsi_target *starget; | 1182 | struct scsi_target *starget; |
1206 | int i, j; | 1183 | int i; |
1207 | 1184 | ||
1208 | if (ahc->platform_data != NULL) { | 1185 | if (ahc->platform_data != NULL) { |
1209 | /* destroy all of the device and target objects */ | 1186 | /* destroy all of the device and target objects */ |
1210 | for (i = 0; i < AHC_NUM_TARGETS; i++) { | 1187 | for (i = 0; i < AHC_NUM_TARGETS; i++) { |
1211 | starget = ahc->platform_data->starget[i]; | 1188 | starget = ahc->platform_data->starget[i]; |
1212 | if (starget != NULL) { | 1189 | if (starget != NULL) { |
1213 | for (j = 0; j < AHC_NUM_LUNS; j++) { | ||
1214 | struct ahc_linux_target *targ = | ||
1215 | scsi_transport_target_data(starget); | ||
1216 | |||
1217 | if (targ->sdev[j] == NULL) | ||
1218 | continue; | ||
1219 | targ->sdev[j] = NULL; | ||
1220 | } | ||
1221 | ahc->platform_data->starget[i] = NULL; | 1190 | ahc->platform_data->starget[i] = NULL; |
1222 | } | 1191 | } |
1223 | } | 1192 | } |
@@ -1251,24 +1220,13 @@ ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb) | |||
1251 | } | 1220 | } |
1252 | 1221 | ||
1253 | void | 1222 | void |
1254 | ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo, | 1223 | ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, |
1255 | ahc_queue_alg alg) | 1224 | struct ahc_devinfo *devinfo, ahc_queue_alg alg) |
1256 | { | 1225 | { |
1257 | struct scsi_target *starget; | ||
1258 | struct ahc_linux_target *targ; | ||
1259 | struct ahc_linux_device *dev; | 1226 | struct ahc_linux_device *dev; |
1260 | struct scsi_device *sdev; | ||
1261 | u_int target_offset; | ||
1262 | int was_queuing; | 1227 | int was_queuing; |
1263 | int now_queuing; | 1228 | int now_queuing; |
1264 | 1229 | ||
1265 | target_offset = devinfo->target; | ||
1266 | if (devinfo->channel != 'A') | ||
1267 | target_offset += 8; | ||
1268 | starget = ahc->platform_data->starget[target_offset]; | ||
1269 | targ = scsi_transport_target_data(starget); | ||
1270 | BUG_ON(targ == NULL); | ||
1271 | sdev = targ->sdev[devinfo->lun]; | ||
1272 | if (sdev == NULL) | 1230 | if (sdev == NULL) |
1273 | return; | 1231 | return; |
1274 | dev = scsi_transport_device_data(sdev); | 1232 | dev = scsi_transport_device_data(sdev); |
@@ -1401,11 +1359,15 @@ ahc_linux_device_queue_depth(struct scsi_device *sdev) | |||
1401 | tags = ahc_linux_user_tagdepth(ahc, &devinfo); | 1359 | tags = ahc_linux_user_tagdepth(ahc, &devinfo); |
1402 | if (tags != 0 && sdev->tagged_supported != 0) { | 1360 | if (tags != 0 && sdev->tagged_supported != 0) { |
1403 | 1361 | ||
1404 | ahc_set_tags(ahc, &devinfo, AHC_QUEUE_TAGGED); | 1362 | ahc_platform_set_tags(ahc, sdev, &devinfo, AHC_QUEUE_TAGGED); |
1363 | ahc_send_async(ahc, devinfo.channel, devinfo.target, | ||
1364 | devinfo.lun, AC_TRANSFER_NEG); | ||
1405 | ahc_print_devinfo(ahc, &devinfo); | 1365 | ahc_print_devinfo(ahc, &devinfo); |
1406 | printf("Tagged Queuing enabled. Depth %d\n", tags); | 1366 | printf("Tagged Queuing enabled. Depth %d\n", tags); |
1407 | } else { | 1367 | } else { |
1408 | ahc_set_tags(ahc, &devinfo, AHC_QUEUE_NONE); | 1368 | ahc_platform_set_tags(ahc, sdev, &devinfo, AHC_QUEUE_NONE); |
1369 | ahc_send_async(ahc, devinfo.channel, devinfo.target, | ||
1370 | devinfo.lun, AC_TRANSFER_NEG); | ||
1409 | } | 1371 | } |
1410 | } | 1372 | } |
1411 | 1373 | ||
@@ -1629,7 +1591,7 @@ ahc_platform_flushwork(struct ahc_softc *ahc) | |||
1629 | 1591 | ||
1630 | void | 1592 | void |
1631 | ahc_send_async(struct ahc_softc *ahc, char channel, | 1593 | ahc_send_async(struct ahc_softc *ahc, char channel, |
1632 | u_int target, u_int lun, ac_code code, void *arg) | 1594 | u_int target, u_int lun, ac_code code) |
1633 | { | 1595 | { |
1634 | switch (code) { | 1596 | switch (code) { |
1635 | case AC_TRANSFER_NEG: | 1597 | case AC_TRANSFER_NEG: |
@@ -1875,9 +1837,9 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc, | |||
1875 | if (scb->flags & SCB_SENSE) { | 1837 | if (scb->flags & SCB_SENSE) { |
1876 | u_int sense_size; | 1838 | u_int sense_size; |
1877 | 1839 | ||
1878 | sense_size = MIN(sizeof(struct scsi_sense_data) | 1840 | sense_size = min(sizeof(struct scsi_sense_data) |
1879 | - ahc_get_sense_residual(scb), | 1841 | - ahc_get_sense_residual(scb), |
1880 | sizeof(cmd->sense_buffer)); | 1842 | (u_long)sizeof(cmd->sense_buffer)); |
1881 | memcpy(cmd->sense_buffer, | 1843 | memcpy(cmd->sense_buffer, |
1882 | ahc_get_sense_buf(ahc, scb), sense_size); | 1844 | ahc_get_sense_buf(ahc, scb), sense_size); |
1883 | if (sense_size < sizeof(cmd->sense_buffer)) | 1845 | if (sense_size < sizeof(cmd->sense_buffer)) |
@@ -1946,7 +1908,7 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc, | |||
1946 | } | 1908 | } |
1947 | ahc_set_transaction_status(scb, CAM_REQUEUE_REQ); | 1909 | ahc_set_transaction_status(scb, CAM_REQUEUE_REQ); |
1948 | ahc_set_scsi_status(scb, SCSI_STATUS_OK); | 1910 | ahc_set_scsi_status(scb, SCSI_STATUS_OK); |
1949 | ahc_platform_set_tags(ahc, &devinfo, | 1911 | ahc_platform_set_tags(ahc, sdev, &devinfo, |
1950 | (dev->flags & AHC_DEV_Q_BASIC) | 1912 | (dev->flags & AHC_DEV_Q_BASIC) |
1951 | ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED); | 1913 | ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED); |
1952 | break; | 1914 | break; |
@@ -1957,7 +1919,7 @@ ahc_linux_handle_scsi_status(struct ahc_softc *ahc, | |||
1957 | */ | 1919 | */ |
1958 | dev->openings = 1; | 1920 | dev->openings = 1; |
1959 | ahc_set_scsi_status(scb, SCSI_STATUS_BUSY); | 1921 | ahc_set_scsi_status(scb, SCSI_STATUS_BUSY); |
1960 | ahc_platform_set_tags(ahc, &devinfo, | 1922 | ahc_platform_set_tags(ahc, sdev, &devinfo, |
1961 | (dev->flags & AHC_DEV_Q_BASIC) | 1923 | (dev->flags & AHC_DEV_Q_BASIC) |
1962 | ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED); | 1924 | ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED); |
1963 | break; | 1925 | break; |
@@ -2599,8 +2561,6 @@ ahc_linux_init(void) | |||
2599 | if (!ahc_linux_transport_template) | 2561 | if (!ahc_linux_transport_template) |
2600 | return -ENODEV; | 2562 | return -ENODEV; |
2601 | 2563 | ||
2602 | scsi_transport_reserve_target(ahc_linux_transport_template, | ||
2603 | sizeof(struct ahc_linux_target)); | ||
2604 | scsi_transport_reserve_device(ahc_linux_transport_template, | 2564 | scsi_transport_reserve_device(ahc_linux_transport_template, |
2605 | sizeof(struct ahc_linux_device)); | 2565 | sizeof(struct ahc_linux_device)); |
2606 | 2566 | ||
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h index a87a4ce090df..85ae5d836fa4 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.h +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h | |||
@@ -256,7 +256,6 @@ typedef enum { | |||
256 | AHC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */ | 256 | AHC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */ |
257 | } ahc_linux_dev_flags; | 257 | } ahc_linux_dev_flags; |
258 | 258 | ||
259 | struct ahc_linux_target; | ||
260 | struct ahc_linux_device { | 259 | struct ahc_linux_device { |
261 | /* | 260 | /* |
262 | * The number of transactions currently | 261 | * The number of transactions currently |
@@ -329,12 +328,6 @@ struct ahc_linux_device { | |||
329 | #define AHC_OTAG_THRESH 500 | 328 | #define AHC_OTAG_THRESH 500 |
330 | }; | 329 | }; |
331 | 330 | ||
332 | struct ahc_linux_target { | ||
333 | struct scsi_device *sdev[AHC_NUM_LUNS]; | ||
334 | struct ahc_transinfo last_tinfo; | ||
335 | struct ahc_softc *ahc; | ||
336 | }; | ||
337 | |||
338 | /********************* Definitions Required by the Core ***********************/ | 331 | /********************* Definitions Required by the Core ***********************/ |
339 | /* | 332 | /* |
340 | * Number of SG segments we require. So long as the S/G segments for | 333 | * Number of SG segments we require. So long as the S/G segments for |
@@ -533,8 +526,6 @@ ahc_unlock(struct ahc_softc *ahc, unsigned long *flags) | |||
533 | #define PCIR_SUBVEND_0 0x2c | 526 | #define PCIR_SUBVEND_0 0x2c |
534 | #define PCIR_SUBDEV_0 0x2e | 527 | #define PCIR_SUBDEV_0 0x2e |
535 | 528 | ||
536 | extern struct pci_driver aic7xxx_pci_driver; | ||
537 | |||
538 | typedef enum | 529 | typedef enum |
539 | { | 530 | { |
540 | AHC_POWER_STATE_D0, | 531 | AHC_POWER_STATE_D0, |
@@ -824,7 +815,7 @@ ahc_freeze_scb(struct scb *scb) | |||
824 | } | 815 | } |
825 | } | 816 | } |
826 | 817 | ||
827 | void ahc_platform_set_tags(struct ahc_softc *ahc, | 818 | void ahc_platform_set_tags(struct ahc_softc *ahc, struct scsi_device *sdev, |
828 | struct ahc_devinfo *devinfo, ahc_queue_alg); | 819 | struct ahc_devinfo *devinfo, ahc_queue_alg); |
829 | int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, | 820 | int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target, |
830 | char channel, int lun, u_int tag, | 821 | char channel, int lun, u_int tag, |
@@ -834,7 +825,7 @@ irqreturn_t | |||
834 | void ahc_platform_flushwork(struct ahc_softc *ahc); | 825 | void ahc_platform_flushwork(struct ahc_softc *ahc); |
835 | void ahc_done(struct ahc_softc*, struct scb*); | 826 | void ahc_done(struct ahc_softc*, struct scb*); |
836 | void ahc_send_async(struct ahc_softc *, char channel, | 827 | void ahc_send_async(struct ahc_softc *, char channel, |
837 | u_int target, u_int lun, ac_code, void *); | 828 | u_int target, u_int lun, ac_code); |
838 | void ahc_print_path(struct ahc_softc *, struct scb *); | 829 | void ahc_print_path(struct ahc_softc *, struct scb *); |
839 | void ahc_platform_dump_card_state(struct ahc_softc *ahc); | 830 | void ahc_platform_dump_card_state(struct ahc_softc *ahc); |
840 | 831 | ||
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c index d20ca514e9f3..ea5687df732d 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c | |||
@@ -130,7 +130,7 @@ static struct pci_device_id ahc_linux_pci_id_table[] = { | |||
130 | 130 | ||
131 | MODULE_DEVICE_TABLE(pci, ahc_linux_pci_id_table); | 131 | MODULE_DEVICE_TABLE(pci, ahc_linux_pci_id_table); |
132 | 132 | ||
133 | struct pci_driver aic7xxx_pci_driver = { | 133 | static struct pci_driver aic7xxx_pci_driver = { |
134 | .name = "aic7xxx", | 134 | .name = "aic7xxx", |
135 | .probe = ahc_linux_pci_dev_probe, | 135 | .probe = ahc_linux_pci_dev_probe, |
136 | .remove = ahc_linux_pci_dev_remove, | 136 | .remove = ahc_linux_pci_dev_remove, |
diff --git a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c index 63cab2d74552..09c8172c9e5e 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c | |||
@@ -168,7 +168,7 @@ static ahc_device_setup_t ahc_aha394XX_setup; | |||
168 | static ahc_device_setup_t ahc_aha494XX_setup; | 168 | static ahc_device_setup_t ahc_aha494XX_setup; |
169 | static ahc_device_setup_t ahc_aha398XX_setup; | 169 | static ahc_device_setup_t ahc_aha398XX_setup; |
170 | 170 | ||
171 | struct ahc_pci_identity ahc_pci_ident_table [] = | 171 | static struct ahc_pci_identity ahc_pci_ident_table [] = |
172 | { | 172 | { |
173 | /* aic7850 based controllers */ | 173 | /* aic7850 based controllers */ |
174 | { | 174 | { |
@@ -559,7 +559,7 @@ struct ahc_pci_identity ahc_pci_ident_table [] = | |||
559 | } | 559 | } |
560 | }; | 560 | }; |
561 | 561 | ||
562 | const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table); | 562 | static const u_int ahc_num_pci_devs = ARRAY_SIZE(ahc_pci_ident_table); |
563 | 563 | ||
564 | #define AHC_394X_SLOT_CHANNEL_A 4 | 564 | #define AHC_394X_SLOT_CHANNEL_A 4 |
565 | #define AHC_394X_SLOT_CHANNEL_B 5 | 565 | #define AHC_394X_SLOT_CHANNEL_B 5 |
diff --git a/drivers/scsi/aic7xxx/aic7xxx_proc.c b/drivers/scsi/aic7xxx/aic7xxx_proc.c index 5914b4aa4a8f..99e5443e7535 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_proc.c +++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c | |||
@@ -182,7 +182,6 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info, | |||
182 | u_int our_id, char channel, u_int target_id, | 182 | u_int our_id, char channel, u_int target_id, |
183 | u_int target_offset) | 183 | u_int target_offset) |
184 | { | 184 | { |
185 | struct ahc_linux_target *targ; | ||
186 | struct scsi_target *starget; | 185 | struct scsi_target *starget; |
187 | struct ahc_initiator_tinfo *tinfo; | 186 | struct ahc_initiator_tinfo *tinfo; |
188 | struct ahc_tmode_tstate *tstate; | 187 | struct ahc_tmode_tstate *tstate; |
@@ -198,7 +197,6 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info, | |||
198 | starget = ahc->platform_data->starget[target_offset]; | 197 | starget = ahc->platform_data->starget[target_offset]; |
199 | if (!starget) | 198 | if (!starget) |
200 | return; | 199 | return; |
201 | targ = scsi_transport_target_data(starget); | ||
202 | 200 | ||
203 | copy_info(info, "\tGoal: "); | 201 | copy_info(info, "\tGoal: "); |
204 | ahc_format_transinfo(info, &tinfo->goal); | 202 | ahc_format_transinfo(info, &tinfo->goal); |
@@ -208,7 +206,7 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info, | |||
208 | for (lun = 0; lun < AHC_NUM_LUNS; lun++) { | 206 | for (lun = 0; lun < AHC_NUM_LUNS; lun++) { |
209 | struct scsi_device *sdev; | 207 | struct scsi_device *sdev; |
210 | 208 | ||
211 | sdev = targ->sdev[lun]; | 209 | sdev = scsi_device_lookup_by_target(starget, lun); |
212 | 210 | ||
213 | if (sdev == NULL) | 211 | if (sdev == NULL) |
214 | continue; | 212 | continue; |
@@ -383,11 +381,11 @@ ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, | |||
383 | } | 381 | } |
384 | copy_info(&info, "\n"); | 382 | copy_info(&info, "\n"); |
385 | 383 | ||
386 | max_targ = 15; | 384 | max_targ = 16; |
387 | if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0) | 385 | if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0) |
388 | max_targ = 7; | 386 | max_targ = 8; |
389 | 387 | ||
390 | for (i = 0; i <= max_targ; i++) { | 388 | for (i = 0; i < max_targ; i++) { |
391 | u_int our_id; | 389 | u_int our_id; |
392 | u_int target_id; | 390 | u_int target_id; |
393 | char channel; | 391 | char channel; |
diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c index bcd7fffab907..46eed10b25d9 100644 --- a/drivers/scsi/aic7xxx_old.c +++ b/drivers/scsi/aic7xxx_old.c | |||
@@ -2646,7 +2646,7 @@ static void aic7xxx_done_cmds_complete(struct aic7xxx_host *p) | |||
2646 | 2646 | ||
2647 | while (p->completeq.head != NULL) { | 2647 | while (p->completeq.head != NULL) { |
2648 | cmd = p->completeq.head; | 2648 | cmd = p->completeq.head; |
2649 | p->completeq.head = (struct scsi_Cmnd *) cmd->host_scribble; | 2649 | p->completeq.head = (struct scsi_cmnd *) cmd->host_scribble; |
2650 | cmd->host_scribble = NULL; | 2650 | cmd->host_scribble = NULL; |
2651 | cmd->scsi_done(cmd); | 2651 | cmd->scsi_done(cmd); |
2652 | } | 2652 | } |
diff --git a/drivers/scsi/aic94xx/aic94xx_hwi.h b/drivers/scsi/aic94xx/aic94xx_hwi.h index 14319d1d6804..7b6aca02cf70 100644 --- a/drivers/scsi/aic94xx/aic94xx_hwi.h +++ b/drivers/scsi/aic94xx/aic94xx_hwi.h | |||
@@ -46,6 +46,7 @@ | |||
46 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR10 0x410 | 46 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR10 0x410 |
47 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR12 0x412 | 47 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR12 0x412 |
48 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR1E 0x41E | 48 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR1E 0x41E |
49 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR1F 0x41F | ||
49 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR30 0x430 | 50 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR30 0x430 |
50 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR32 0x432 | 51 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR32 0x432 |
51 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR3E 0x43E | 52 | #define PCI_DEVICE_ID_ADAPTEC2_RAZOR3E 0x43E |
diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic94xx_init.c index 99743ca29ca1..a4cc432bbdab 100644 --- a/drivers/scsi/aic94xx/aic94xx_init.c +++ b/drivers/scsi/aic94xx/aic94xx_init.c | |||
@@ -814,6 +814,8 @@ static const struct pci_device_id aic94xx_pci_table[] __devinitdata = { | |||
814 | 0, 0, 1}, | 814 | 0, 0, 1}, |
815 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR1E), | 815 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR1E), |
816 | 0, 0, 1}, | 816 | 0, 0, 1}, |
817 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR1F), | ||
818 | 0, 0, 1}, | ||
817 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR30), | 819 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR30), |
818 | 0, 0, 2}, | 820 | 0, 0, 2}, |
819 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR32), | 821 | {PCI_DEVICE(PCI_VENDOR_ID_ADAPTEC2, PCI_DEVICE_ID_ADAPTEC2_RAZOR32), |
diff --git a/drivers/scsi/aic94xx/aic94xx_sds.c b/drivers/scsi/aic94xx/aic94xx_sds.c index 83574b5b4e69..de7c04d4254d 100644 --- a/drivers/scsi/aic94xx/aic94xx_sds.c +++ b/drivers/scsi/aic94xx/aic94xx_sds.c | |||
@@ -630,10 +630,6 @@ static int asd_flash_getid(struct asd_ha_struct *asd_ha) | |||
630 | 630 | ||
631 | reg = asd_read_reg_dword(asd_ha, EXSICNFGR); | 631 | reg = asd_read_reg_dword(asd_ha, EXSICNFGR); |
632 | 632 | ||
633 | if (!(reg & FLASHEX)) { | ||
634 | ASD_DPRINTK("flash doesn't exist\n"); | ||
635 | return -ENOENT; | ||
636 | } | ||
637 | if (pci_read_config_dword(asd_ha->pcidev, PCI_CONF_FLSH_BAR, | 633 | if (pci_read_config_dword(asd_ha->pcidev, PCI_CONF_FLSH_BAR, |
638 | &asd_ha->hw_prof.flash.bar)) { | 634 | &asd_ha->hw_prof.flash.bar)) { |
639 | asd_printk("couldn't read PCI_CONF_FLSH_BAR of %s\n", | 635 | asd_printk("couldn't read PCI_CONF_FLSH_BAR of %s\n", |
diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c index 65e6e7b7ba07..5d4ea6f77953 100644 --- a/drivers/scsi/fdomain.c +++ b/drivers/scsi/fdomain.c | |||
@@ -387,6 +387,7 @@ static void __iomem * bios_mem; | |||
387 | static int bios_major; | 387 | static int bios_major; |
388 | static int bios_minor; | 388 | static int bios_minor; |
389 | static int PCI_bus; | 389 | static int PCI_bus; |
390 | static struct pci_dev *PCI_dev; | ||
390 | static int Quantum; /* Quantum board variant */ | 391 | static int Quantum; /* Quantum board variant */ |
391 | static int interrupt_level; | 392 | static int interrupt_level; |
392 | static volatile int in_command; | 393 | static volatile int in_command; |
@@ -812,9 +813,10 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ | |||
812 | PCI_DEVICE_ID_FD_36C70 ); | 813 | PCI_DEVICE_ID_FD_36C70 ); |
813 | #endif | 814 | #endif |
814 | 815 | ||
815 | if ((pdev = pci_find_device(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70, pdev)) == NULL) | 816 | if ((pdev = pci_get_device(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70, pdev)) == NULL) |
816 | return 0; | 817 | return 0; |
817 | if (pci_enable_device(pdev)) return 0; | 818 | if (pci_enable_device(pdev)) |
819 | goto fail; | ||
818 | 820 | ||
819 | #if DEBUG_DETECT | 821 | #if DEBUG_DETECT |
820 | printk( "scsi: <fdomain> TMC-3260 detect:" | 822 | printk( "scsi: <fdomain> TMC-3260 detect:" |
@@ -831,7 +833,7 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ | |||
831 | pci_irq = pdev->irq; | 833 | pci_irq = pdev->irq; |
832 | 834 | ||
833 | if (!request_region( pci_base, 0x10, "fdomain" )) | 835 | if (!request_region( pci_base, 0x10, "fdomain" )) |
834 | return 0; | 836 | goto fail; |
835 | 837 | ||
836 | /* Now we have the I/O base address and interrupt from the PCI | 838 | /* Now we have the I/O base address and interrupt from the PCI |
837 | configuration registers. */ | 839 | configuration registers. */ |
@@ -848,17 +850,22 @@ static int fdomain_pci_bios_detect( int *irq, int *iobase, struct pci_dev **ret_ | |||
848 | if (!fdomain_is_valid_port(pci_base)) { | 850 | if (!fdomain_is_valid_port(pci_base)) { |
849 | printk(KERN_ERR "scsi: <fdomain> PCI card detected, but driver not loaded (invalid port)\n" ); | 851 | printk(KERN_ERR "scsi: <fdomain> PCI card detected, but driver not loaded (invalid port)\n" ); |
850 | release_region(pci_base, 0x10); | 852 | release_region(pci_base, 0x10); |
851 | return 0; | 853 | goto fail; |
852 | } | 854 | } |
853 | 855 | ||
854 | /* Fill in a few global variables. Ugh. */ | 856 | /* Fill in a few global variables. Ugh. */ |
855 | bios_major = bios_minor = -1; | 857 | bios_major = bios_minor = -1; |
856 | PCI_bus = 1; | 858 | PCI_bus = 1; |
859 | PCI_dev = pdev; | ||
857 | Quantum = 0; | 860 | Quantum = 0; |
858 | bios_base = 0; | 861 | bios_base = 0; |
859 | 862 | ||
860 | return 1; | 863 | return 1; |
864 | fail: | ||
865 | pci_dev_put(pdev); | ||
866 | return 0; | ||
861 | } | 867 | } |
868 | |||
862 | #endif | 869 | #endif |
863 | 870 | ||
864 | struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) | 871 | struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) |
@@ -909,8 +916,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) | |||
909 | if (setup_called) { | 916 | if (setup_called) { |
910 | printk(KERN_ERR "scsi: <fdomain> Bad LILO/INSMOD parameters?\n"); | 917 | printk(KERN_ERR "scsi: <fdomain> Bad LILO/INSMOD parameters?\n"); |
911 | } | 918 | } |
912 | release_region(port_base, 0x10); | 919 | goto fail; |
913 | return NULL; | ||
914 | } | 920 | } |
915 | 921 | ||
916 | if (this_id) { | 922 | if (this_id) { |
@@ -942,8 +948,7 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) | |||
942 | /* Log IRQ with kernel */ | 948 | /* Log IRQ with kernel */ |
943 | if (!interrupt_level) { | 949 | if (!interrupt_level) { |
944 | printk(KERN_ERR "scsi: <fdomain> Card Detected, but driver not loaded (no IRQ)\n" ); | 950 | printk(KERN_ERR "scsi: <fdomain> Card Detected, but driver not loaded (no IRQ)\n" ); |
945 | release_region(port_base, 0x10); | 951 | goto fail; |
946 | return NULL; | ||
947 | } else { | 952 | } else { |
948 | /* Register the IRQ with the kernel */ | 953 | /* Register the IRQ with the kernel */ |
949 | 954 | ||
@@ -964,11 +969,14 @@ struct Scsi_Host *__fdomain_16x0_detect(struct scsi_host_template *tpnt ) | |||
964 | printk(KERN_ERR " Send mail to faith@acm.org\n" ); | 969 | printk(KERN_ERR " Send mail to faith@acm.org\n" ); |
965 | } | 970 | } |
966 | printk(KERN_ERR "scsi: <fdomain> Detected, but driver not loaded (IRQ)\n" ); | 971 | printk(KERN_ERR "scsi: <fdomain> Detected, but driver not loaded (IRQ)\n" ); |
967 | release_region(port_base, 0x10); | 972 | goto fail; |
968 | return NULL; | ||
969 | } | 973 | } |
970 | } | 974 | } |
971 | return shpnt; | 975 | return shpnt; |
976 | fail: | ||
977 | pci_dev_put(pdev); | ||
978 | release_region(port_base, 0x10); | ||
979 | return NULL; | ||
972 | } | 980 | } |
973 | 981 | ||
974 | static int fdomain_16x0_detect(struct scsi_host_template *tpnt) | 982 | static int fdomain_16x0_detect(struct scsi_host_template *tpnt) |
@@ -1714,6 +1722,8 @@ static int fdomain_16x0_release(struct Scsi_Host *shpnt) | |||
1714 | free_irq(shpnt->irq, shpnt); | 1722 | free_irq(shpnt->irq, shpnt); |
1715 | if (shpnt->io_port && shpnt->n_io_port) | 1723 | if (shpnt->io_port && shpnt->n_io_port) |
1716 | release_region(shpnt->io_port, shpnt->n_io_port); | 1724 | release_region(shpnt->io_port, shpnt->n_io_port); |
1725 | if (PCI_bus) | ||
1726 | pci_dev_put(PCI_dev); | ||
1717 | return 0; | 1727 | return 0; |
1718 | } | 1728 | } |
1719 | 1729 | ||
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 669ea4fff166..fbc1d5c3b0a7 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
@@ -1213,7 +1213,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq, | |||
1213 | "ibmvscsi: Re-enabling adapter!\n"); | 1213 | "ibmvscsi: Re-enabling adapter!\n"); |
1214 | purge_requests(hostdata, DID_REQUEUE); | 1214 | purge_requests(hostdata, DID_REQUEUE); |
1215 | if ((ibmvscsi_reenable_crq_queue(&hostdata->queue, | 1215 | if ((ibmvscsi_reenable_crq_queue(&hostdata->queue, |
1216 | hostdata) == 0) || | 1216 | hostdata)) || |
1217 | (ibmvscsi_send_crq(hostdata, | 1217 | (ibmvscsi_send_crq(hostdata, |
1218 | 0xC001000000000000LL, 0))) { | 1218 | 0xC001000000000000LL, 0))) { |
1219 | atomic_set(&hostdata->request_limit, | 1219 | atomic_set(&hostdata->request_limit, |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index c542d0e95e68..2865ebd557ef 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -481,8 +481,8 @@ int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, | |||
481 | break; | 481 | break; |
482 | case ISCSI_OP_ASYNC_EVENT: | 482 | case ISCSI_OP_ASYNC_EVENT: |
483 | conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; | 483 | conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1; |
484 | /* we need sth like iscsi_async_event_rsp() */ | 484 | if (iscsi_recv_pdu(conn->cls_conn, hdr, data, datalen)) |
485 | rc = ISCSI_ERR_BAD_OPCODE; | 485 | rc = ISCSI_ERR_CONN_FAILED; |
486 | break; | 486 | break; |
487 | default: | 487 | default: |
488 | rc = ISCSI_ERR_BAD_OPCODE; | 488 | rc = ISCSI_ERR_BAD_OPCODE; |
@@ -578,6 +578,27 @@ void iscsi_conn_failure(struct iscsi_conn *conn, enum iscsi_err err) | |||
578 | } | 578 | } |
579 | EXPORT_SYMBOL_GPL(iscsi_conn_failure); | 579 | EXPORT_SYMBOL_GPL(iscsi_conn_failure); |
580 | 580 | ||
581 | static int iscsi_xmit_imm_task(struct iscsi_conn *conn) | ||
582 | { | ||
583 | struct iscsi_hdr *hdr = conn->mtask->hdr; | ||
584 | int rc, was_logout = 0; | ||
585 | |||
586 | if ((hdr->opcode & ISCSI_OPCODE_MASK) == ISCSI_OP_LOGOUT) { | ||
587 | conn->session->state = ISCSI_STATE_IN_RECOVERY; | ||
588 | iscsi_block_session(session_to_cls(conn->session)); | ||
589 | was_logout = 1; | ||
590 | } | ||
591 | rc = conn->session->tt->xmit_mgmt_task(conn, conn->mtask); | ||
592 | if (rc) | ||
593 | return rc; | ||
594 | |||
595 | if (was_logout) { | ||
596 | set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx); | ||
597 | return -ENODATA; | ||
598 | } | ||
599 | return 0; | ||
600 | } | ||
601 | |||
581 | /** | 602 | /** |
582 | * iscsi_data_xmit - xmit any command into the scheduled connection | 603 | * iscsi_data_xmit - xmit any command into the scheduled connection |
583 | * @conn: iscsi connection | 604 | * @conn: iscsi connection |
@@ -623,7 +644,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) | |||
623 | conn->ctask = NULL; | 644 | conn->ctask = NULL; |
624 | } | 645 | } |
625 | if (conn->mtask) { | 646 | if (conn->mtask) { |
626 | rc = tt->xmit_mgmt_task(conn, conn->mtask); | 647 | rc = iscsi_xmit_imm_task(conn); |
627 | if (rc) | 648 | if (rc) |
628 | goto again; | 649 | goto again; |
629 | /* done with this in-progress mtask */ | 650 | /* done with this in-progress mtask */ |
@@ -638,7 +659,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) | |||
638 | list_add_tail(&conn->mtask->running, | 659 | list_add_tail(&conn->mtask->running, |
639 | &conn->mgmt_run_list); | 660 | &conn->mgmt_run_list); |
640 | spin_unlock_bh(&conn->session->lock); | 661 | spin_unlock_bh(&conn->session->lock); |
641 | rc = tt->xmit_mgmt_task(conn, conn->mtask); | 662 | rc = iscsi_xmit_imm_task(conn); |
642 | if (rc) | 663 | if (rc) |
643 | goto again; | 664 | goto again; |
644 | } | 665 | } |
@@ -661,8 +682,6 @@ static int iscsi_data_xmit(struct iscsi_conn *conn) | |||
661 | spin_unlock_bh(&conn->session->lock); | 682 | spin_unlock_bh(&conn->session->lock); |
662 | 683 | ||
663 | rc = tt->xmit_cmd_task(conn, conn->ctask); | 684 | rc = tt->xmit_cmd_task(conn, conn->ctask); |
664 | if (rc) | ||
665 | goto again; | ||
666 | 685 | ||
667 | spin_lock_bh(&conn->session->lock); | 686 | spin_lock_bh(&conn->session->lock); |
668 | __iscsi_put_ctask(conn->ctask); | 687 | __iscsi_put_ctask(conn->ctask); |
@@ -778,6 +797,10 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) | |||
778 | } | 797 | } |
779 | 798 | ||
780 | conn = session->leadconn; | 799 | conn = session->leadconn; |
800 | if (!conn) { | ||
801 | reason = FAILURE_SESSION_FREED; | ||
802 | goto fault; | ||
803 | } | ||
781 | 804 | ||
782 | if (!__kfifo_get(session->cmdpool.queue, (void*)&ctask, | 805 | if (!__kfifo_get(session->cmdpool.queue, (void*)&ctask, |
783 | sizeof(void*))) { | 806 | sizeof(void*))) { |
@@ -1377,7 +1400,6 @@ iscsi_session_setup(struct iscsi_transport *iscsit, | |||
1377 | } | 1400 | } |
1378 | 1401 | ||
1379 | spin_lock_init(&session->lock); | 1402 | spin_lock_init(&session->lock); |
1380 | INIT_LIST_HEAD(&session->connections); | ||
1381 | 1403 | ||
1382 | /* initialize immediate command pool */ | 1404 | /* initialize immediate command pool */ |
1383 | if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max, | 1405 | if (iscsi_pool_init(&session->mgmtpool, session->mgmtpool_max, |
@@ -1580,16 +1602,11 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn) | |||
1580 | kfree(conn->persistent_address); | 1602 | kfree(conn->persistent_address); |
1581 | __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, | 1603 | __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, |
1582 | sizeof(void*)); | 1604 | sizeof(void*)); |
1583 | list_del(&conn->item); | 1605 | if (session->leadconn == conn) { |
1584 | if (list_empty(&session->connections)) | ||
1585 | session->leadconn = NULL; | 1606 | session->leadconn = NULL; |
1586 | if (session->leadconn && session->leadconn == conn) | ||
1587 | session->leadconn = container_of(session->connections.next, | ||
1588 | struct iscsi_conn, item); | ||
1589 | |||
1590 | if (session->leadconn == NULL) | ||
1591 | /* no connections exits.. reset sequencing */ | 1607 | /* no connections exits.. reset sequencing */ |
1592 | session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1; | 1608 | session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1; |
1609 | } | ||
1593 | spin_unlock_bh(&session->lock); | 1610 | spin_unlock_bh(&session->lock); |
1594 | 1611 | ||
1595 | kfifo_free(conn->immqueue); | 1612 | kfifo_free(conn->immqueue); |
@@ -1777,32 +1794,12 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session, | |||
1777 | struct iscsi_cls_conn *cls_conn, int is_leading) | 1794 | struct iscsi_cls_conn *cls_conn, int is_leading) |
1778 | { | 1795 | { |
1779 | struct iscsi_session *session = class_to_transport_session(cls_session); | 1796 | struct iscsi_session *session = class_to_transport_session(cls_session); |
1780 | struct iscsi_conn *tmp = ERR_PTR(-EEXIST), *conn = cls_conn->dd_data; | 1797 | struct iscsi_conn *conn = cls_conn->dd_data; |
1781 | 1798 | ||
1782 | /* lookup for existing connection */ | ||
1783 | spin_lock_bh(&session->lock); | 1799 | spin_lock_bh(&session->lock); |
1784 | list_for_each_entry(tmp, &session->connections, item) { | ||
1785 | if (tmp == conn) { | ||
1786 | if (conn->c_stage != ISCSI_CONN_STOPPED || | ||
1787 | conn->stop_stage == STOP_CONN_TERM) { | ||
1788 | printk(KERN_ERR "iscsi: can't bind " | ||
1789 | "non-stopped connection (%d:%d)\n", | ||
1790 | conn->c_stage, conn->stop_stage); | ||
1791 | spin_unlock_bh(&session->lock); | ||
1792 | return -EIO; | ||
1793 | } | ||
1794 | break; | ||
1795 | } | ||
1796 | } | ||
1797 | if (tmp != conn) { | ||
1798 | /* bind new iSCSI connection to session */ | ||
1799 | conn->session = session; | ||
1800 | list_add(&conn->item, &session->connections); | ||
1801 | } | ||
1802 | spin_unlock_bh(&session->lock); | ||
1803 | |||
1804 | if (is_leading) | 1800 | if (is_leading) |
1805 | session->leadconn = conn; | 1801 | session->leadconn = conn; |
1802 | spin_unlock_bh(&session->lock); | ||
1806 | 1803 | ||
1807 | /* | 1804 | /* |
1808 | * Unblock xmitworker(), Login Phase will pass through. | 1805 | * Unblock xmitworker(), Login Phase will pass through. |
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 9496e87c135e..2a4e02e7a392 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -594,7 +594,8 @@ lpfc_soft_wwpn_show(struct class_device *cdev, char *buf) | |||
594 | { | 594 | { |
595 | struct Scsi_Host *host = class_to_shost(cdev); | 595 | struct Scsi_Host *host = class_to_shost(cdev); |
596 | struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; | 596 | struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata; |
597 | return snprintf(buf, PAGE_SIZE, "0x%llx\n", phba->cfg_soft_wwpn); | 597 | return snprintf(buf, PAGE_SIZE, "0x%llx\n", |
598 | (unsigned long long)phba->cfg_soft_wwpn); | ||
598 | } | 599 | } |
599 | 600 | ||
600 | 601 | ||
diff --git a/drivers/scsi/lpfc/lpfc_ct.c b/drivers/scsi/lpfc/lpfc_ct.c index 1b53afb1cb57..3add7c237859 100644 --- a/drivers/scsi/lpfc/lpfc_ct.c +++ b/drivers/scsi/lpfc/lpfc_ct.c | |||
@@ -188,7 +188,8 @@ lpfc_alloc_ct_rsp(struct lpfc_hba * phba, int cmdcode, struct ulp_bde64 * bpl, | |||
188 | 188 | ||
189 | if (!mp->virt) { | 189 | if (!mp->virt) { |
190 | kfree(mp); | 190 | kfree(mp); |
191 | lpfc_free_ct_rsp(phba, mlist); | 191 | if (mlist) |
192 | lpfc_free_ct_rsp(phba, mlist); | ||
192 | return NULL; | 193 | return NULL; |
193 | } | 194 | } |
194 | 195 | ||
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index b1d346049525..f2d79c3f0b8e 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c | |||
@@ -183,7 +183,7 @@ static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ... | |||
183 | * Clenaup parameters and call done() functions. | 183 | * Clenaup parameters and call done() functions. |
184 | * You must be set SCpnt->result before call this function. | 184 | * You must be set SCpnt->result before call this function. |
185 | */ | 185 | */ |
186 | static void nsp_scsi_done(Scsi_Cmnd *SCpnt) | 186 | static void nsp_scsi_done(struct scsi_cmnd *SCpnt) |
187 | { | 187 | { |
188 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 188 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
189 | 189 | ||
@@ -192,7 +192,8 @@ static void nsp_scsi_done(Scsi_Cmnd *SCpnt) | |||
192 | SCpnt->scsi_done(SCpnt); | 192 | SCpnt->scsi_done(SCpnt); |
193 | } | 193 | } |
194 | 194 | ||
195 | static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) | 195 | static int nsp_queuecommand(struct scsi_cmnd *SCpnt, |
196 | void (*done)(struct scsi_cmnd *)) | ||
196 | { | 197 | { |
197 | #ifdef NSP_DEBUG | 198 | #ifdef NSP_DEBUG |
198 | /*unsigned int host_id = SCpnt->device->host->this_id;*/ | 199 | /*unsigned int host_id = SCpnt->device->host->this_id;*/ |
@@ -365,7 +366,7 @@ static int nsphw_init(nsp_hw_data *data) | |||
365 | /* | 366 | /* |
366 | * Start selection phase | 367 | * Start selection phase |
367 | */ | 368 | */ |
368 | static int nsphw_start_selection(Scsi_Cmnd *SCpnt) | 369 | static int nsphw_start_selection(struct scsi_cmnd *SCpnt) |
369 | { | 370 | { |
370 | unsigned int host_id = SCpnt->device->host->this_id; | 371 | unsigned int host_id = SCpnt->device->host->this_id; |
371 | unsigned int base = SCpnt->device->host->io_port; | 372 | unsigned int base = SCpnt->device->host->io_port; |
@@ -446,7 +447,7 @@ static struct nsp_sync_table nsp_sync_table_20M[] = { | |||
446 | /* | 447 | /* |
447 | * setup synchronous data transfer mode | 448 | * setup synchronous data transfer mode |
448 | */ | 449 | */ |
449 | static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt) | 450 | static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt) |
450 | { | 451 | { |
451 | unsigned char target = scmd_id(SCpnt); | 452 | unsigned char target = scmd_id(SCpnt); |
452 | // unsigned char lun = SCpnt->device->lun; | 453 | // unsigned char lun = SCpnt->device->lun; |
@@ -504,7 +505,7 @@ static int nsp_analyze_sdtr(Scsi_Cmnd *SCpnt) | |||
504 | /* | 505 | /* |
505 | * start ninja hardware timer | 506 | * start ninja hardware timer |
506 | */ | 507 | */ |
507 | static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time) | 508 | static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time) |
508 | { | 509 | { |
509 | unsigned int base = SCpnt->device->host->io_port; | 510 | unsigned int base = SCpnt->device->host->io_port; |
510 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 511 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
@@ -517,7 +518,8 @@ static void nsp_start_timer(Scsi_Cmnd *SCpnt, int time) | |||
517 | /* | 518 | /* |
518 | * wait for bus phase change | 519 | * wait for bus phase change |
519 | */ | 520 | */ |
520 | static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str) | 521 | static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask, |
522 | char *str) | ||
521 | { | 523 | { |
522 | unsigned int base = SCpnt->device->host->io_port; | 524 | unsigned int base = SCpnt->device->host->io_port; |
523 | unsigned char reg; | 525 | unsigned char reg; |
@@ -544,9 +546,9 @@ static int nsp_negate_signal(Scsi_Cmnd *SCpnt, unsigned char mask, char *str) | |||
544 | /* | 546 | /* |
545 | * expect Ninja Irq | 547 | * expect Ninja Irq |
546 | */ | 548 | */ |
547 | static int nsp_expect_signal(Scsi_Cmnd *SCpnt, | 549 | static int nsp_expect_signal(struct scsi_cmnd *SCpnt, |
548 | unsigned char current_phase, | 550 | unsigned char current_phase, |
549 | unsigned char mask) | 551 | unsigned char mask) |
550 | { | 552 | { |
551 | unsigned int base = SCpnt->device->host->io_port; | 553 | unsigned int base = SCpnt->device->host->io_port; |
552 | int time_out; | 554 | int time_out; |
@@ -579,7 +581,7 @@ static int nsp_expect_signal(Scsi_Cmnd *SCpnt, | |||
579 | /* | 581 | /* |
580 | * transfer SCSI message | 582 | * transfer SCSI message |
581 | */ | 583 | */ |
582 | static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase) | 584 | static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase) |
583 | { | 585 | { |
584 | unsigned int base = SCpnt->device->host->io_port; | 586 | unsigned int base = SCpnt->device->host->io_port; |
585 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 587 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
@@ -619,7 +621,7 @@ static int nsp_xfer(Scsi_Cmnd *SCpnt, int phase) | |||
619 | /* | 621 | /* |
620 | * get extra SCSI data from fifo | 622 | * get extra SCSI data from fifo |
621 | */ | 623 | */ |
622 | static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt) | 624 | static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt) |
623 | { | 625 | { |
624 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 626 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
625 | unsigned int count; | 627 | unsigned int count; |
@@ -651,7 +653,7 @@ static int nsp_dataphase_bypass(Scsi_Cmnd *SCpnt) | |||
651 | /* | 653 | /* |
652 | * accept reselection | 654 | * accept reselection |
653 | */ | 655 | */ |
654 | static int nsp_reselected(Scsi_Cmnd *SCpnt) | 656 | static int nsp_reselected(struct scsi_cmnd *SCpnt) |
655 | { | 657 | { |
656 | unsigned int base = SCpnt->device->host->io_port; | 658 | unsigned int base = SCpnt->device->host->io_port; |
657 | unsigned int host_id = SCpnt->device->host->this_id; | 659 | unsigned int host_id = SCpnt->device->host->this_id; |
@@ -690,7 +692,7 @@ static int nsp_reselected(Scsi_Cmnd *SCpnt) | |||
690 | /* | 692 | /* |
691 | * count how many data transferd | 693 | * count how many data transferd |
692 | */ | 694 | */ |
693 | static int nsp_fifo_count(Scsi_Cmnd *SCpnt) | 695 | static int nsp_fifo_count(struct scsi_cmnd *SCpnt) |
694 | { | 696 | { |
695 | unsigned int base = SCpnt->device->host->io_port; | 697 | unsigned int base = SCpnt->device->host->io_port; |
696 | unsigned int count; | 698 | unsigned int count; |
@@ -717,7 +719,7 @@ static int nsp_fifo_count(Scsi_Cmnd *SCpnt) | |||
717 | /* | 719 | /* |
718 | * read data in DATA IN phase | 720 | * read data in DATA IN phase |
719 | */ | 721 | */ |
720 | static void nsp_pio_read(Scsi_Cmnd *SCpnt) | 722 | static void nsp_pio_read(struct scsi_cmnd *SCpnt) |
721 | { | 723 | { |
722 | unsigned int base = SCpnt->device->host->io_port; | 724 | unsigned int base = SCpnt->device->host->io_port; |
723 | unsigned long mmio_base = SCpnt->device->host->base; | 725 | unsigned long mmio_base = SCpnt->device->host->base; |
@@ -812,7 +814,7 @@ static void nsp_pio_read(Scsi_Cmnd *SCpnt) | |||
812 | /* | 814 | /* |
813 | * write data in DATA OUT phase | 815 | * write data in DATA OUT phase |
814 | */ | 816 | */ |
815 | static void nsp_pio_write(Scsi_Cmnd *SCpnt) | 817 | static void nsp_pio_write(struct scsi_cmnd *SCpnt) |
816 | { | 818 | { |
817 | unsigned int base = SCpnt->device->host->io_port; | 819 | unsigned int base = SCpnt->device->host->io_port; |
818 | unsigned long mmio_base = SCpnt->device->host->base; | 820 | unsigned long mmio_base = SCpnt->device->host->base; |
@@ -905,7 +907,7 @@ static void nsp_pio_write(Scsi_Cmnd *SCpnt) | |||
905 | /* | 907 | /* |
906 | * setup synchronous/asynchronous data transfer mode | 908 | * setup synchronous/asynchronous data transfer mode |
907 | */ | 909 | */ |
908 | static int nsp_nexus(Scsi_Cmnd *SCpnt) | 910 | static int nsp_nexus(struct scsi_cmnd *SCpnt) |
909 | { | 911 | { |
910 | unsigned int base = SCpnt->device->host->io_port; | 912 | unsigned int base = SCpnt->device->host->io_port; |
911 | unsigned char target = scmd_id(SCpnt); | 913 | unsigned char target = scmd_id(SCpnt); |
@@ -952,7 +954,7 @@ static irqreturn_t nspintr(int irq, void *dev_id) | |||
952 | { | 954 | { |
953 | unsigned int base; | 955 | unsigned int base; |
954 | unsigned char irq_status, irq_phase, phase; | 956 | unsigned char irq_status, irq_phase, phase; |
955 | Scsi_Cmnd *tmpSC; | 957 | struct scsi_cmnd *tmpSC; |
956 | unsigned char target, lun; | 958 | unsigned char target, lun; |
957 | unsigned int *sync_neg; | 959 | unsigned int *sync_neg; |
958 | int i, tmp; | 960 | int i, tmp; |
@@ -1530,7 +1532,7 @@ nsp_proc_info( | |||
1530 | /*---------------------------------------------------------------*/ | 1532 | /*---------------------------------------------------------------*/ |
1531 | 1533 | ||
1532 | /* | 1534 | /* |
1533 | static int nsp_eh_abort(Scsi_Cmnd *SCpnt) | 1535 | static int nsp_eh_abort(struct scsi_cmnd *SCpnt) |
1534 | { | 1536 | { |
1535 | nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); | 1537 | nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); |
1536 | 1538 | ||
@@ -1558,7 +1560,7 @@ static int nsp_bus_reset(nsp_hw_data *data) | |||
1558 | return SUCCESS; | 1560 | return SUCCESS; |
1559 | } | 1561 | } |
1560 | 1562 | ||
1561 | static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) | 1563 | static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt) |
1562 | { | 1564 | { |
1563 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 1565 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
1564 | 1566 | ||
@@ -1567,7 +1569,7 @@ static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt) | |||
1567 | return nsp_bus_reset(data); | 1569 | return nsp_bus_reset(data); |
1568 | } | 1570 | } |
1569 | 1571 | ||
1570 | static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt) | 1572 | static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt) |
1571 | { | 1573 | { |
1572 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 1574 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
1573 | 1575 | ||
diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index a88714f4c05b..625ca97da52d 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h | |||
@@ -266,7 +266,7 @@ typedef struct _nsp_hw_data { | |||
266 | 266 | ||
267 | int TimerCount; | 267 | int TimerCount; |
268 | int SelectionTimeOut; | 268 | int SelectionTimeOut; |
269 | Scsi_Cmnd *CurrentSC; | 269 | struct scsi_cmnd *CurrentSC; |
270 | //int CurrnetTarget; | 270 | //int CurrnetTarget; |
271 | 271 | ||
272 | int FifoCount; | 272 | int FifoCount; |
@@ -319,30 +319,34 @@ static int nsp_proc_info ( | |||
319 | int hostno, | 319 | int hostno, |
320 | #endif | 320 | #endif |
321 | int inout); | 321 | int inout); |
322 | static int nsp_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *SCpnt)); | 322 | static int nsp_queuecommand(struct scsi_cmnd *SCpnt, |
323 | void (* done)(struct scsi_cmnd *SCpnt)); | ||
323 | 324 | ||
324 | /* Error handler */ | 325 | /* Error handler */ |
325 | /*static int nsp_eh_abort (Scsi_Cmnd *SCpnt);*/ | 326 | /*static int nsp_eh_abort (struct scsi_cmnd *SCpnt);*/ |
326 | /*static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);*/ | 327 | /*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/ |
327 | static int nsp_eh_bus_reset (Scsi_Cmnd *SCpnt); | 328 | static int nsp_eh_bus_reset (struct scsi_cmnd *SCpnt); |
328 | static int nsp_eh_host_reset (Scsi_Cmnd *SCpnt); | 329 | static int nsp_eh_host_reset (struct scsi_cmnd *SCpnt); |
329 | static int nsp_bus_reset (nsp_hw_data *data); | 330 | static int nsp_bus_reset (nsp_hw_data *data); |
330 | 331 | ||
331 | /* */ | 332 | /* */ |
332 | static int nsphw_init (nsp_hw_data *data); | 333 | static int nsphw_init (nsp_hw_data *data); |
333 | static int nsphw_start_selection(Scsi_Cmnd *SCpnt); | 334 | static int nsphw_start_selection(struct scsi_cmnd *SCpnt); |
334 | static void nsp_start_timer (Scsi_Cmnd *SCpnt, int time); | 335 | static void nsp_start_timer (struct scsi_cmnd *SCpnt, int time); |
335 | static int nsp_fifo_count (Scsi_Cmnd *SCpnt); | 336 | static int nsp_fifo_count (struct scsi_cmnd *SCpnt); |
336 | static void nsp_pio_read (Scsi_Cmnd *SCpnt); | 337 | static void nsp_pio_read (struct scsi_cmnd *SCpnt); |
337 | static void nsp_pio_write (Scsi_Cmnd *SCpnt); | 338 | static void nsp_pio_write (struct scsi_cmnd *SCpnt); |
338 | static int nsp_nexus (Scsi_Cmnd *SCpnt); | 339 | static int nsp_nexus (struct scsi_cmnd *SCpnt); |
339 | static void nsp_scsi_done (Scsi_Cmnd *SCpnt); | 340 | static void nsp_scsi_done (struct scsi_cmnd *SCpnt); |
340 | static int nsp_analyze_sdtr (Scsi_Cmnd *SCpnt); | 341 | static int nsp_analyze_sdtr (struct scsi_cmnd *SCpnt); |
341 | static int nsp_negate_signal (Scsi_Cmnd *SCpnt, unsigned char mask, char *str); | 342 | static int nsp_negate_signal (struct scsi_cmnd *SCpnt, |
342 | static int nsp_expect_signal (Scsi_Cmnd *SCpnt, unsigned char current_phase, unsigned char mask); | 343 | unsigned char mask, char *str); |
343 | static int nsp_xfer (Scsi_Cmnd *SCpnt, int phase); | 344 | static int nsp_expect_signal (struct scsi_cmnd *SCpnt, |
344 | static int nsp_dataphase_bypass (Scsi_Cmnd *SCpnt); | 345 | unsigned char current_phase, |
345 | static int nsp_reselected (Scsi_Cmnd *SCpnt); | 346 | unsigned char mask); |
347 | static int nsp_xfer (struct scsi_cmnd *SCpnt, int phase); | ||
348 | static int nsp_dataphase_bypass (struct scsi_cmnd *SCpnt); | ||
349 | static int nsp_reselected (struct scsi_cmnd *SCpnt); | ||
346 | static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht); | 350 | static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht); |
347 | 351 | ||
348 | /* Interrupt handler */ | 352 | /* Interrupt handler */ |
@@ -355,8 +359,8 @@ static void __exit nsp_cs_exit(void); | |||
355 | 359 | ||
356 | /* Debug */ | 360 | /* Debug */ |
357 | #ifdef NSP_DEBUG | 361 | #ifdef NSP_DEBUG |
358 | static void show_command (Scsi_Cmnd *SCpnt); | 362 | static void show_command (struct scsi_cmnd *SCpnt); |
359 | static void show_phase (Scsi_Cmnd *SCpnt); | 363 | static void show_phase (struct scsi_cmnd *SCpnt); |
360 | static void show_busphase(unsigned char stat); | 364 | static void show_busphase(unsigned char stat); |
361 | static void show_message (nsp_hw_data *data); | 365 | static void show_message (nsp_hw_data *data); |
362 | #else | 366 | #else |
diff --git a/drivers/scsi/pcmcia/nsp_debug.c b/drivers/scsi/pcmcia/nsp_debug.c index 62e5c60067fd..2f75fe6e35a7 100644 --- a/drivers/scsi/pcmcia/nsp_debug.c +++ b/drivers/scsi/pcmcia/nsp_debug.c | |||
@@ -138,12 +138,12 @@ static void print_commandk (unsigned char *command) | |||
138 | printk("\n"); | 138 | printk("\n"); |
139 | } | 139 | } |
140 | 140 | ||
141 | static void show_command(Scsi_Cmnd *SCpnt) | 141 | static void show_command(struct scsi_cmnd *SCpnt) |
142 | { | 142 | { |
143 | print_commandk(SCpnt->cmnd); | 143 | print_commandk(SCpnt->cmnd); |
144 | } | 144 | } |
145 | 145 | ||
146 | static void show_phase(Scsi_Cmnd *SCpnt) | 146 | static void show_phase(struct scsi_cmnd *SCpnt) |
147 | { | 147 | { |
148 | int i = SCpnt->SCp.phase; | 148 | int i = SCpnt->SCp.phase; |
149 | 149 | ||
diff --git a/drivers/scsi/pcmcia/nsp_message.c b/drivers/scsi/pcmcia/nsp_message.c index d7057737ff34..ef593b70d0f0 100644 --- a/drivers/scsi/pcmcia/nsp_message.c +++ b/drivers/scsi/pcmcia/nsp_message.c | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | /* $Id: nsp_message.c,v 1.6 2003/07/26 14:21:09 elca Exp $ */ | 9 | /* $Id: nsp_message.c,v 1.6 2003/07/26 14:21:09 elca Exp $ */ |
10 | 10 | ||
11 | static void nsp_message_in(Scsi_Cmnd *SCpnt) | 11 | static void nsp_message_in(struct scsi_cmnd *SCpnt) |
12 | { | 12 | { |
13 | unsigned int base = SCpnt->device->host->io_port; | 13 | unsigned int base = SCpnt->device->host->io_port; |
14 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 14 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
@@ -50,7 +50,7 @@ static void nsp_message_in(Scsi_Cmnd *SCpnt) | |||
50 | 50 | ||
51 | } | 51 | } |
52 | 52 | ||
53 | static void nsp_message_out(Scsi_Cmnd *SCpnt) | 53 | static void nsp_message_out(struct scsi_cmnd *SCpnt) |
54 | { | 54 | { |
55 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; | 55 | nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; |
56 | int ret = 1; | 56 | int ret = 1; |
diff --git a/drivers/scsi/psi240i.c b/drivers/scsi/psi240i.c index a720c9265e66..ac0419e2714a 100644 --- a/drivers/scsi/psi240i.c +++ b/drivers/scsi/psi240i.c | |||
@@ -87,11 +87,11 @@ typedef struct | |||
87 | { | 87 | { |
88 | USHORT ports[13]; | 88 | USHORT ports[13]; |
89 | OUR_DEVICE device[8]; | 89 | OUR_DEVICE device[8]; |
90 | Scsi_Cmnd *pSCmnd; | 90 | struct scsi_cmnd *pSCmnd; |
91 | IDE_STRUCT ide; | 91 | IDE_STRUCT ide; |
92 | ULONG startSector; | 92 | ULONG startSector; |
93 | USHORT sectorCount; | 93 | USHORT sectorCount; |
94 | Scsi_Cmnd *SCpnt; | 94 | struct scsi_cmnd *SCpnt; |
95 | VOID *buffer; | 95 | VOID *buffer; |
96 | USHORT expectingIRQ; | 96 | USHORT expectingIRQ; |
97 | } ADAPTER240I, *PADAPTER240I; | 97 | } ADAPTER240I, *PADAPTER240I; |
@@ -253,12 +253,12 @@ static ULONG DecodeError (struct Scsi_Host *pshost, UCHAR status) | |||
253 | ****************************************************************/ | 253 | ****************************************************************/ |
254 | static void Irq_Handler (int irq, void *dev_id) | 254 | static void Irq_Handler (int irq, void *dev_id) |
255 | { | 255 | { |
256 | struct Scsi_Host *shost; // Pointer to host data block | 256 | struct Scsi_Host *shost; // Pointer to host data block |
257 | PADAPTER240I padapter; // Pointer to adapter control structure | 257 | PADAPTER240I padapter; // Pointer to adapter control structure |
258 | USHORT *pports; // I/O port array | 258 | USHORT *pports; // I/O port array |
259 | Scsi_Cmnd *SCpnt; | 259 | struct scsi_cmnd *SCpnt; |
260 | UCHAR status; | 260 | UCHAR status; |
261 | int z; | 261 | int z; |
262 | 262 | ||
263 | DEB(printk ("\npsi240i received interrupt\n")); | 263 | DEB(printk ("\npsi240i received interrupt\n")); |
264 | 264 | ||
@@ -389,12 +389,17 @@ static irqreturn_t do_Irq_Handler (int irq, void *dev_id) | |||
389 | * Returns: Status code. | 389 | * Returns: Status code. |
390 | * | 390 | * |
391 | ****************************************************************/ | 391 | ****************************************************************/ |
392 | static int Psi240i_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) | 392 | static int Psi240i_QueueCommand(struct scsi_cmnd *SCpnt, |
393 | void (*done)(struct scsi_cmnd *)) | ||
393 | { | 394 | { |
394 | UCHAR *cdb = (UCHAR *)SCpnt->cmnd; // Pointer to SCSI CDB | 395 | UCHAR *cdb = (UCHAR *)SCpnt->cmnd; |
395 | PADAPTER240I padapter = HOSTDATA (SCpnt->device->host); // Pointer to adapter control structure | 396 | // Pointer to SCSI CDB |
396 | POUR_DEVICE pdev = &padapter->device [SCpnt->device->id];// Pointer to device information | 397 | PADAPTER240I padapter = HOSTDATA (SCpnt->device->host); |
397 | UCHAR rc; // command return code | 398 | // Pointer to adapter control structure |
399 | POUR_DEVICE pdev = &padapter->device [SCpnt->device->id]; | ||
400 | // Pointer to device information | ||
401 | UCHAR rc; | ||
402 | // command return code | ||
398 | 403 | ||
399 | SCpnt->scsi_done = done; | 404 | SCpnt->scsi_done = done; |
400 | padapter->ide.ide.ides.spigot = pdev->spigot; | 405 | padapter->ide.ide.ides.spigot = pdev->spigot; |
diff --git a/drivers/scsi/psi240i.h b/drivers/scsi/psi240i.h index 6a598766df51..21ebb9214004 100644 --- a/drivers/scsi/psi240i.h +++ b/drivers/scsi/psi240i.h | |||
@@ -309,7 +309,7 @@ typedef struct _IDENTIFY_DATA2 { | |||
309 | #endif // PSI_EIDE_SCSIOP | 309 | #endif // PSI_EIDE_SCSIOP |
310 | 310 | ||
311 | // function prototypes | 311 | // function prototypes |
312 | int Psi240i_Command (Scsi_Cmnd *SCpnt); | 312 | int Psi240i_Command(struct scsi_cmnd *SCpnt); |
313 | int Psi240i_Abort (Scsi_Cmnd *SCpnt); | 313 | int Psi240i_Abort(struct scsi_cmnd *SCpnt); |
314 | int Psi240i_Reset (Scsi_Cmnd *SCpnt, unsigned int flags); | 314 | int Psi240i_Reset(struct scsi_cmnd *SCpnt, unsigned int flags); |
315 | #endif | 315 | #endif |
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index 2521d548dd59..16af5b79e587 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c | |||
@@ -931,11 +931,10 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action) | |||
931 | 931 | ||
932 | case BUS_RESET: | 932 | case BUS_RESET: |
933 | if (qla1280_verbose) | 933 | if (qla1280_verbose) |
934 | printk(KERN_INFO "qla1280(%ld:%d): Issuing BUS " | 934 | printk(KERN_INFO "qla1280(%ld:%d): Issued bus " |
935 | "DEVICE RESET\n", ha->host_no, bus); | 935 | "reset.\n", ha->host_no, bus); |
936 | if (qla1280_bus_reset(ha, bus == 0)) | 936 | if (qla1280_bus_reset(ha, bus) == 0) |
937 | result = SUCCESS; | 937 | result = SUCCESS; |
938 | |||
939 | break; | 938 | break; |
940 | 939 | ||
941 | case ADAPTER_RESET: | 940 | case ADAPTER_RESET: |
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index ee75a71f3c66..285c8e8ff1a0 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -379,21 +379,37 @@ static struct bin_attribute sysfs_sfp_attr = { | |||
379 | .read = qla2x00_sysfs_read_sfp, | 379 | .read = qla2x00_sysfs_read_sfp, |
380 | }; | 380 | }; |
381 | 381 | ||
382 | static struct sysfs_entry { | ||
383 | char *name; | ||
384 | struct bin_attribute *attr; | ||
385 | int is4GBp_only; | ||
386 | } bin_file_entries[] = { | ||
387 | { "fw_dump", &sysfs_fw_dump_attr, }, | ||
388 | { "nvram", &sysfs_nvram_attr, }, | ||
389 | { "optrom", &sysfs_optrom_attr, }, | ||
390 | { "optrom_ctl", &sysfs_optrom_ctl_attr, }, | ||
391 | { "vpd", &sysfs_vpd_attr, 1 }, | ||
392 | { "sfp", &sysfs_sfp_attr, 1 }, | ||
393 | { 0 }, | ||
394 | }; | ||
395 | |||
382 | void | 396 | void |
383 | qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) | 397 | qla2x00_alloc_sysfs_attr(scsi_qla_host_t *ha) |
384 | { | 398 | { |
385 | struct Scsi_Host *host = ha->host; | 399 | struct Scsi_Host *host = ha->host; |
400 | struct sysfs_entry *iter; | ||
401 | int ret; | ||
386 | 402 | ||
387 | sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr); | 403 | for (iter = bin_file_entries; iter->name; iter++) { |
388 | sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); | 404 | if (iter->is4GBp_only && (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))) |
389 | sysfs_create_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr); | 405 | continue; |
390 | sysfs_create_bin_file(&host->shost_gendev.kobj, | 406 | |
391 | &sysfs_optrom_ctl_attr); | 407 | ret = sysfs_create_bin_file(&host->shost_gendev.kobj, |
392 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | 408 | iter->attr); |
393 | sysfs_create_bin_file(&host->shost_gendev.kobj, | 409 | if (ret) |
394 | &sysfs_vpd_attr); | 410 | qla_printk(KERN_INFO, ha, |
395 | sysfs_create_bin_file(&host->shost_gendev.kobj, | 411 | "Unable to create sysfs %s binary attribute " |
396 | &sysfs_sfp_attr); | 412 | "(%d).\n", iter->name, ret); |
397 | } | 413 | } |
398 | } | 414 | } |
399 | 415 | ||
@@ -401,17 +417,14 @@ void | |||
401 | qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) | 417 | qla2x00_free_sysfs_attr(scsi_qla_host_t *ha) |
402 | { | 418 | { |
403 | struct Scsi_Host *host = ha->host; | 419 | struct Scsi_Host *host = ha->host; |
420 | struct sysfs_entry *iter; | ||
421 | |||
422 | for (iter = bin_file_entries; iter->name; iter++) { | ||
423 | if (iter->is4GBp_only && (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))) | ||
424 | continue; | ||
404 | 425 | ||
405 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_fw_dump_attr); | ||
406 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_nvram_attr); | ||
407 | sysfs_remove_bin_file(&host->shost_gendev.kobj, &sysfs_optrom_attr); | ||
408 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | ||
409 | &sysfs_optrom_ctl_attr); | ||
410 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | ||
411 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | ||
412 | &sysfs_vpd_attr); | ||
413 | sysfs_remove_bin_file(&host->shost_gendev.kobj, | 426 | sysfs_remove_bin_file(&host->shost_gendev.kobj, |
414 | &sysfs_sfp_attr); | 427 | iter->attr); |
415 | } | 428 | } |
416 | 429 | ||
417 | if (ha->beacon_blink_led == 1) | 430 | if (ha->beacon_blink_led == 1) |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h index 90dad7e88985..5b12278968e0 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h | |||
@@ -38,7 +38,7 @@ | |||
38 | * Macros use for debugging the driver. | 38 | * Macros use for debugging the driver. |
39 | */ | 39 | */ |
40 | 40 | ||
41 | #define DEBUG(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 41 | #define DEBUG(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
42 | 42 | ||
43 | #if defined(QL_DEBUG_LEVEL_1) | 43 | #if defined(QL_DEBUG_LEVEL_1) |
44 | #define DEBUG1(x) do {x;} while (0) | 44 | #define DEBUG1(x) do {x;} while (0) |
@@ -46,12 +46,12 @@ | |||
46 | #define DEBUG1(x) do {} while (0) | 46 | #define DEBUG1(x) do {} while (0) |
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | #define DEBUG2(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 49 | #define DEBUG2(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
50 | #define DEBUG2_3(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 50 | #define DEBUG2_3(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
51 | #define DEBUG2_3_11(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 51 | #define DEBUG2_3_11(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
52 | #define DEBUG2_9_10(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 52 | #define DEBUG2_9_10(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
53 | #define DEBUG2_11(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 53 | #define DEBUG2_11(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
54 | #define DEBUG2_13(x) do { if (qla2_extended_error_logging) { x; } } while (0) | 54 | #define DEBUG2_13(x) do { if (ql2xextended_error_logging) { x; } } while (0) |
55 | 55 | ||
56 | #if defined(QL_DEBUG_LEVEL_3) | 56 | #if defined(QL_DEBUG_LEVEL_3) |
57 | #define DEBUG3(x) do {x;} while (0) | 57 | #define DEBUG3(x) do {x;} while (0) |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index bab33f6d0bdb..c4fc40f8e8ca 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -1545,6 +1545,9 @@ typedef struct fc_port { | |||
1545 | spinlock_t rport_lock; | 1545 | spinlock_t rport_lock; |
1546 | struct fc_rport *rport, *drport; | 1546 | struct fc_rport *rport, *drport; |
1547 | u32 supported_classes; | 1547 | u32 supported_classes; |
1548 | |||
1549 | unsigned long last_queue_full; | ||
1550 | unsigned long last_ramp_up; | ||
1548 | } fc_port_t; | 1551 | } fc_port_t; |
1549 | 1552 | ||
1550 | /* | 1553 | /* |
@@ -2255,6 +2258,7 @@ typedef struct scsi_qla_host { | |||
2255 | uint16_t mgmt_svr_loop_id; | 2258 | uint16_t mgmt_svr_loop_id; |
2256 | 2259 | ||
2257 | uint32_t login_retry_count; | 2260 | uint32_t login_retry_count; |
2261 | int max_q_depth; | ||
2258 | 2262 | ||
2259 | /* Fibre Channel Device List. */ | 2263 | /* Fibre Channel Device List. */ |
2260 | struct list_head fcports; | 2264 | struct list_head fcports; |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 7da69832d74c..32ebeec45ff0 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -48,6 +48,7 @@ extern void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *); | |||
48 | extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *); | 48 | extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *); |
49 | 49 | ||
50 | extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *); | 50 | extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *); |
51 | extern void qla2x00_try_to_stop_firmware(scsi_qla_host_t *); | ||
51 | 52 | ||
52 | /* | 53 | /* |
53 | * Global Data in qla_os.c source file. | 54 | * Global Data in qla_os.c source file. |
@@ -60,7 +61,8 @@ extern int ql2xplogiabsentdevice; | |||
60 | extern int ql2xloginretrycount; | 61 | extern int ql2xloginretrycount; |
61 | extern int ql2xfdmienable; | 62 | extern int ql2xfdmienable; |
62 | extern int ql2xallocfwdump; | 63 | extern int ql2xallocfwdump; |
63 | extern int qla2_extended_error_logging; | 64 | extern int ql2xextended_error_logging; |
65 | extern int ql2xqfullrampup; | ||
64 | 66 | ||
65 | extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *); | 67 | extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *); |
66 | 68 | ||
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 833b93085fd3..08cb5e3fb553 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -1644,7 +1644,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha) | |||
1644 | * Set host adapter parameters. | 1644 | * Set host adapter parameters. |
1645 | */ | 1645 | */ |
1646 | if (nv->host_p[0] & BIT_7) | 1646 | if (nv->host_p[0] & BIT_7) |
1647 | qla2_extended_error_logging = 1; | 1647 | ql2xextended_error_logging = 1; |
1648 | ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0); | 1648 | ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0); |
1649 | /* Always load RISC code on non ISP2[12]00 chips. */ | 1649 | /* Always load RISC code on non ISP2[12]00 chips. */ |
1650 | if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) | 1650 | if (!IS_QLA2100(ha) && !IS_QLA2200(ha)) |
@@ -3948,3 +3948,24 @@ qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) | |||
3948 | fail_fw_integrity: | 3948 | fail_fw_integrity: |
3949 | return QLA_FUNCTION_FAILED; | 3949 | return QLA_FUNCTION_FAILED; |
3950 | } | 3950 | } |
3951 | |||
3952 | void | ||
3953 | qla2x00_try_to_stop_firmware(scsi_qla_host_t *ha) | ||
3954 | { | ||
3955 | int ret, retries; | ||
3956 | |||
3957 | if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha)) | ||
3958 | return; | ||
3959 | |||
3960 | ret = qla2x00_stop_firmware(ha); | ||
3961 | for (retries = 5; ret != QLA_SUCCESS && retries ; retries--) { | ||
3962 | qla2x00_reset_chip(ha); | ||
3963 | if (qla2x00_chip_diag(ha) != QLA_SUCCESS) | ||
3964 | continue; | ||
3965 | if (qla2x00_setup_chip(ha) != QLA_SUCCESS) | ||
3966 | continue; | ||
3967 | qla_printk(KERN_INFO, ha, | ||
3968 | "Attempting retry of stop-firmware command...\n"); | ||
3969 | ret = qla2x00_stop_firmware(ha); | ||
3970 | } | ||
3971 | } | ||
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 626c7178a434..d3b6df4d55c8 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -6,6 +6,8 @@ | |||
6 | */ | 6 | */ |
7 | #include "qla_def.h" | 7 | #include "qla_def.h" |
8 | 8 | ||
9 | #include <scsi/scsi_tcq.h> | ||
10 | |||
9 | static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t); | 11 | static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t); |
10 | static void qla2x00_async_event(scsi_qla_host_t *, uint16_t *); | 12 | static void qla2x00_async_event(scsi_qla_host_t *, uint16_t *); |
11 | static void qla2x00_process_completed_request(struct scsi_qla_host *, uint32_t); | 13 | static void qla2x00_process_completed_request(struct scsi_qla_host *, uint32_t); |
@@ -593,6 +595,67 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) | |||
593 | } | 595 | } |
594 | } | 596 | } |
595 | 597 | ||
598 | static void | ||
599 | qla2x00_adjust_sdev_qdepth_up(struct scsi_device *sdev, void *data) | ||
600 | { | ||
601 | fc_port_t *fcport = data; | ||
602 | |||
603 | if (fcport->ha->max_q_depth <= sdev->queue_depth) | ||
604 | return; | ||
605 | |||
606 | if (sdev->ordered_tags) | ||
607 | scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, | ||
608 | sdev->queue_depth + 1); | ||
609 | else | ||
610 | scsi_adjust_queue_depth(sdev, MSG_SIMPLE_TAG, | ||
611 | sdev->queue_depth + 1); | ||
612 | |||
613 | fcport->last_ramp_up = jiffies; | ||
614 | |||
615 | DEBUG2(qla_printk(KERN_INFO, fcport->ha, | ||
616 | "scsi(%ld:%d:%d:%d): Queue depth adjusted-up to %d.\n", | ||
617 | fcport->ha->host_no, sdev->channel, sdev->id, sdev->lun, | ||
618 | sdev->queue_depth)); | ||
619 | } | ||
620 | |||
621 | static void | ||
622 | qla2x00_adjust_sdev_qdepth_down(struct scsi_device *sdev, void *data) | ||
623 | { | ||
624 | fc_port_t *fcport = data; | ||
625 | |||
626 | if (!scsi_track_queue_full(sdev, sdev->queue_depth - 1)) | ||
627 | return; | ||
628 | |||
629 | DEBUG2(qla_printk(KERN_INFO, fcport->ha, | ||
630 | "scsi(%ld:%d:%d:%d): Queue depth adjusted-down to %d.\n", | ||
631 | fcport->ha->host_no, sdev->channel, sdev->id, sdev->lun, | ||
632 | sdev->queue_depth)); | ||
633 | } | ||
634 | |||
635 | static inline void | ||
636 | qla2x00_ramp_up_queue_depth(scsi_qla_host_t *ha, srb_t *sp) | ||
637 | { | ||
638 | fc_port_t *fcport; | ||
639 | struct scsi_device *sdev; | ||
640 | |||
641 | sdev = sp->cmd->device; | ||
642 | if (sdev->queue_depth >= ha->max_q_depth) | ||
643 | return; | ||
644 | |||
645 | fcport = sp->fcport; | ||
646 | if (time_before(jiffies, | ||
647 | fcport->last_ramp_up + ql2xqfullrampup * HZ)) | ||
648 | return; | ||
649 | if (time_before(jiffies, | ||
650 | fcport->last_queue_full + ql2xqfullrampup * HZ)) | ||
651 | return; | ||
652 | |||
653 | spin_unlock_irq(&ha->hardware_lock); | ||
654 | starget_for_each_device(sdev->sdev_target, fcport, | ||
655 | qla2x00_adjust_sdev_qdepth_up); | ||
656 | spin_lock_irq(&ha->hardware_lock); | ||
657 | } | ||
658 | |||
596 | /** | 659 | /** |
597 | * qla2x00_process_completed_request() - Process a Fast Post response. | 660 | * qla2x00_process_completed_request() - Process a Fast Post response. |
598 | * @ha: SCSI driver HA context | 661 | * @ha: SCSI driver HA context |
@@ -624,6 +687,8 @@ qla2x00_process_completed_request(struct scsi_qla_host *ha, uint32_t index) | |||
624 | 687 | ||
625 | /* Save ISP completion status */ | 688 | /* Save ISP completion status */ |
626 | sp->cmd->result = DID_OK << 16; | 689 | sp->cmd->result = DID_OK << 16; |
690 | |||
691 | qla2x00_ramp_up_queue_depth(ha, sp); | ||
627 | qla2x00_sp_compl(ha, sp); | 692 | qla2x00_sp_compl(ha, sp); |
628 | } else { | 693 | } else { |
629 | DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n", | 694 | DEBUG2(printk("scsi(%ld): Invalid ISP SCSI completion handle\n", |
@@ -823,6 +888,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
823 | */ | 888 | */ |
824 | switch (comp_status) { | 889 | switch (comp_status) { |
825 | case CS_COMPLETE: | 890 | case CS_COMPLETE: |
891 | case CS_QUEUE_FULL: | ||
826 | if (scsi_status == 0) { | 892 | if (scsi_status == 0) { |
827 | cp->result = DID_OK << 16; | 893 | cp->result = DID_OK << 16; |
828 | break; | 894 | break; |
@@ -849,6 +915,20 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
849 | } | 915 | } |
850 | cp->result = DID_OK << 16 | lscsi_status; | 916 | cp->result = DID_OK << 16 | lscsi_status; |
851 | 917 | ||
918 | if (lscsi_status == SAM_STAT_TASK_SET_FULL) { | ||
919 | DEBUG2(printk(KERN_INFO | ||
920 | "scsi(%ld): QUEUE FULL status detected " | ||
921 | "0x%x-0x%x.\n", ha->host_no, comp_status, | ||
922 | scsi_status)); | ||
923 | |||
924 | /* Adjust queue depth for all luns on the port. */ | ||
925 | fcport->last_queue_full = jiffies; | ||
926 | spin_unlock_irq(&ha->hardware_lock); | ||
927 | starget_for_each_device(cp->device->sdev_target, | ||
928 | fcport, qla2x00_adjust_sdev_qdepth_down); | ||
929 | spin_lock_irq(&ha->hardware_lock); | ||
930 | break; | ||
931 | } | ||
852 | if (lscsi_status != SS_CHECK_CONDITION) | 932 | if (lscsi_status != SS_CHECK_CONDITION) |
853 | break; | 933 | break; |
854 | 934 | ||
@@ -1066,17 +1146,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
1066 | qla2x00_mark_device_lost(ha, fcport, 1, 1); | 1146 | qla2x00_mark_device_lost(ha, fcport, 1, 1); |
1067 | break; | 1147 | break; |
1068 | 1148 | ||
1069 | case CS_QUEUE_FULL: | ||
1070 | DEBUG2(printk(KERN_INFO | ||
1071 | "scsi(%ld): QUEUE FULL status detected 0x%x-0x%x.\n", | ||
1072 | ha->host_no, comp_status, scsi_status)); | ||
1073 | |||
1074 | /* SCSI Mid-Layer handles device queue full */ | ||
1075 | |||
1076 | cp->result = DID_OK << 16 | lscsi_status; | ||
1077 | |||
1078 | break; | ||
1079 | |||
1080 | default: | 1149 | default: |
1081 | DEBUG3(printk("scsi(%ld): Error detected (unknown status) " | 1150 | DEBUG3(printk("scsi(%ld): Error detected (unknown status) " |
1082 | "0x%x-0x%x.\n", ha->host_no, comp_status, scsi_status)); | 1151 | "0x%x-0x%x.\n", ha->host_no, comp_status, scsi_status)); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 3f20d765563e..208607be78c7 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -61,9 +61,9 @@ MODULE_PARM_DESC(ql2xallocfwdump, | |||
61 | "during HBA initialization. Memory allocation requirements " | 61 | "during HBA initialization. Memory allocation requirements " |
62 | "vary by ISP type. Default is 1 - allocate memory."); | 62 | "vary by ISP type. Default is 1 - allocate memory."); |
63 | 63 | ||
64 | int qla2_extended_error_logging; | 64 | int ql2xextended_error_logging; |
65 | module_param(qla2_extended_error_logging, int, S_IRUGO|S_IRUSR); | 65 | module_param(ql2xextended_error_logging, int, S_IRUGO|S_IRUSR); |
66 | MODULE_PARM_DESC(qla2_extended_error_logging, | 66 | MODULE_PARM_DESC(ql2xextended_error_logging, |
67 | "Option to enable extended error logging, " | 67 | "Option to enable extended error logging, " |
68 | "Default is 0 - no logging. 1 - log errors."); | 68 | "Default is 0 - no logging. 1 - log errors."); |
69 | 69 | ||
@@ -77,6 +77,19 @@ MODULE_PARM_DESC(ql2xfdmienable, | |||
77 | "Enables FDMI registratons " | 77 | "Enables FDMI registratons " |
78 | "Default is 0 - no FDMI. 1 - perfom FDMI."); | 78 | "Default is 0 - no FDMI. 1 - perfom FDMI."); |
79 | 79 | ||
80 | #define MAX_Q_DEPTH 32 | ||
81 | static int ql2xmaxqdepth = MAX_Q_DEPTH; | ||
82 | module_param(ql2xmaxqdepth, int, S_IRUGO|S_IWUSR); | ||
83 | MODULE_PARM_DESC(ql2xmaxqdepth, | ||
84 | "Maximum queue depth to report for target devices."); | ||
85 | |||
86 | int ql2xqfullrampup = 120; | ||
87 | module_param(ql2xqfullrampup, int, S_IRUGO|S_IWUSR); | ||
88 | MODULE_PARM_DESC(ql2xqfullrampup, | ||
89 | "Number of seconds to wait to begin to ramp-up the queue " | ||
90 | "depth for a device after a queue-full condition has been " | ||
91 | "detected. Default is 120 seconds."); | ||
92 | |||
80 | /* | 93 | /* |
81 | * SCSI host template entry points | 94 | * SCSI host template entry points |
82 | */ | 95 | */ |
@@ -1104,9 +1117,9 @@ qla2xxx_slave_configure(struct scsi_device *sdev) | |||
1104 | struct fc_rport *rport = starget_to_rport(sdev->sdev_target); | 1117 | struct fc_rport *rport = starget_to_rport(sdev->sdev_target); |
1105 | 1118 | ||
1106 | if (sdev->tagged_supported) | 1119 | if (sdev->tagged_supported) |
1107 | scsi_activate_tcq(sdev, 32); | 1120 | scsi_activate_tcq(sdev, ha->max_q_depth); |
1108 | else | 1121 | else |
1109 | scsi_deactivate_tcq(sdev, 32); | 1122 | scsi_deactivate_tcq(sdev, ha->max_q_depth); |
1110 | 1123 | ||
1111 | rport->dev_loss_tmo = ha->port_down_retry_count + 5; | 1124 | rport->dev_loss_tmo = ha->port_down_retry_count + 5; |
1112 | 1125 | ||
@@ -1413,6 +1426,10 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1413 | ha->link_data_rate = PORT_SPEED_UNKNOWN; | 1426 | ha->link_data_rate = PORT_SPEED_UNKNOWN; |
1414 | ha->optrom_size = OPTROM_SIZE_2300; | 1427 | ha->optrom_size = OPTROM_SIZE_2300; |
1415 | 1428 | ||
1429 | ha->max_q_depth = MAX_Q_DEPTH; | ||
1430 | if (ql2xmaxqdepth != 0 && ql2xmaxqdepth <= 0xffffU) | ||
1431 | ha->max_q_depth = ql2xmaxqdepth; | ||
1432 | |||
1416 | /* Assign ISP specific operations. */ | 1433 | /* Assign ISP specific operations. */ |
1417 | ha->isp_ops.pci_config = qla2100_pci_config; | 1434 | ha->isp_ops.pci_config = qla2100_pci_config; |
1418 | ha->isp_ops.reset_chip = qla2x00_reset_chip; | 1435 | ha->isp_ops.reset_chip = qla2x00_reset_chip; |
@@ -1712,8 +1729,10 @@ qla2x00_free_device(scsi_qla_host_t *ha) | |||
1712 | if (ha->eft) | 1729 | if (ha->eft) |
1713 | qla2x00_trace_control(ha, TC_DISABLE, 0, 0); | 1730 | qla2x00_trace_control(ha, TC_DISABLE, 0, 0); |
1714 | 1731 | ||
1732 | ha->flags.online = 0; | ||
1733 | |||
1715 | /* Stop currently executing firmware. */ | 1734 | /* Stop currently executing firmware. */ |
1716 | qla2x00_stop_firmware(ha); | 1735 | qla2x00_try_to_stop_firmware(ha); |
1717 | 1736 | ||
1718 | /* turn-off interrupts on the card */ | 1737 | /* turn-off interrupts on the card */ |
1719 | if (ha->interrupts_on) | 1738 | if (ha->interrupts_on) |
@@ -1721,8 +1740,6 @@ qla2x00_free_device(scsi_qla_host_t *ha) | |||
1721 | 1740 | ||
1722 | qla2x00_mem_free(ha); | 1741 | qla2x00_mem_free(ha); |
1723 | 1742 | ||
1724 | ha->flags.online = 0; | ||
1725 | |||
1726 | /* Detach interrupts */ | 1743 | /* Detach interrupts */ |
1727 | if (ha->host->irq) | 1744 | if (ha->host->irq) |
1728 | free_irq(ha->host->irq, ha); | 1745 | free_irq(ha->host->irq, ha); |
@@ -2697,7 +2714,7 @@ qla2x00_module_init(void) | |||
2697 | 2714 | ||
2698 | /* Derive version string. */ | 2715 | /* Derive version string. */ |
2699 | strcpy(qla2x00_version_str, QLA2XXX_VERSION); | 2716 | strcpy(qla2x00_version_str, QLA2XXX_VERSION); |
2700 | if (qla2_extended_error_logging) | 2717 | if (ql2xextended_error_logging) |
2701 | strcat(qla2x00_version_str, "-debug"); | 2718 | strcat(qla2x00_version_str, "-debug"); |
2702 | 2719 | ||
2703 | qla2xxx_transport_template = | 2720 | qla2xxx_transport_template = |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index e57bf45a3393..1fa0bce6b24e 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
@@ -7,7 +7,7 @@ | |||
7 | /* | 7 | /* |
8 | * Driver version | 8 | * Driver version |
9 | */ | 9 | */ |
10 | #define QLA2XXX_VERSION "8.01.07-k2" | 10 | #define QLA2XXX_VERSION "8.01.07-k3" |
11 | 11 | ||
12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
13 | #define QLA_DRIVER_MINOR_VER 1 | 13 | #define QLA_DRIVER_MINOR_VER 1 |
diff --git a/drivers/scsi/qla4xxx/ql4_dbg.h b/drivers/scsi/qla4xxx/ql4_dbg.h index 3e99dcfd5a9f..d861c3b411c8 100644 --- a/drivers/scsi/qla4xxx/ql4_dbg.h +++ b/drivers/scsi/qla4xxx/ql4_dbg.h | |||
@@ -22,14 +22,14 @@ | |||
22 | #endif | 22 | #endif |
23 | 23 | ||
24 | #if defined(QL_DEBUG_LEVEL_2) | 24 | #if defined(QL_DEBUG_LEVEL_2) |
25 | #define DEBUG2(x) do {if(qla4_extended_error_logging == 2) x;} while (0); | 25 | #define DEBUG2(x) do {if(ql4xextended_error_logging == 2) x;} while (0); |
26 | #define DEBUG2_3(x) do {x;} while (0); | 26 | #define DEBUG2_3(x) do {x;} while (0); |
27 | #else /* */ | 27 | #else /* */ |
28 | #define DEBUG2(x) do {} while (0); | 28 | #define DEBUG2(x) do {} while (0); |
29 | #endif /* */ | 29 | #endif /* */ |
30 | 30 | ||
31 | #if defined(QL_DEBUG_LEVEL_3) | 31 | #if defined(QL_DEBUG_LEVEL_3) |
32 | #define DEBUG3(x) do {if(qla4_extended_error_logging == 3) x;} while (0); | 32 | #define DEBUG3(x) do {if(ql4xextended_error_logging == 3) x;} while (0); |
33 | #else /* */ | 33 | #else /* */ |
34 | #define DEBUG3(x) do {} while (0); | 34 | #define DEBUG3(x) do {} while (0); |
35 | #if !defined(QL_DEBUG_LEVEL_2) | 35 | #if !defined(QL_DEBUG_LEVEL_2) |
diff --git a/drivers/scsi/qla4xxx/ql4_glbl.h b/drivers/scsi/qla4xxx/ql4_glbl.h index 2c803edf2de8..1b221ff0f6f7 100644 --- a/drivers/scsi/qla4xxx/ql4_glbl.h +++ b/drivers/scsi/qla4xxx/ql4_glbl.h | |||
@@ -72,7 +72,7 @@ int qla4xxx_reinitialize_ddb_list(struct scsi_qla_host * ha); | |||
72 | int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha, | 72 | int qla4xxx_process_ddb_changed(struct scsi_qla_host * ha, |
73 | uint32_t fw_ddb_index, uint32_t state); | 73 | uint32_t fw_ddb_index, uint32_t state); |
74 | 74 | ||
75 | extern int qla4_extended_error_logging; | 75 | extern int ql4xextended_error_logging; |
76 | extern int ql4xdiscoverywait; | 76 | extern int ql4xdiscoverywait; |
77 | extern int ql4xdontresethba; | 77 | extern int ql4xdontresethba; |
78 | #endif /* _QLA4x_GBL_H */ | 78 | #endif /* _QLA4x_GBL_H */ |
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c index ef82399c0858..b721dc5dd711 100644 --- a/drivers/scsi/qla4xxx/ql4_mbx.c +++ b/drivers/scsi/qla4xxx/ql4_mbx.c | |||
@@ -701,7 +701,7 @@ void qla4xxx_get_conn_event_log(struct scsi_qla_host * ha) | |||
701 | DEBUG3(printk("scsi%ld: Connection Event Log Dump (%d entries):\n", | 701 | DEBUG3(printk("scsi%ld: Connection Event Log Dump (%d entries):\n", |
702 | ha->host_no, num_valid_entries)); | 702 | ha->host_no, num_valid_entries)); |
703 | 703 | ||
704 | if (qla4_extended_error_logging == 3) { | 704 | if (ql4xextended_error_logging == 3) { |
705 | if (oldest_entry == 0) { | 705 | if (oldest_entry == 0) { |
706 | /* Circular Buffer has not wrapped around */ | 706 | /* Circular Buffer has not wrapped around */ |
707 | for (i=0; i < num_valid_entries; i++) { | 707 | for (i=0; i < num_valid_entries; i++) { |
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 178fcddcfd81..5b8db6109536 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
@@ -34,9 +34,9 @@ MODULE_PARM_DESC(ql4xdontresethba, | |||
34 | " default it will reset hba :0" | 34 | " default it will reset hba :0" |
35 | " set to 1 to avoid resetting HBA"); | 35 | " set to 1 to avoid resetting HBA"); |
36 | 36 | ||
37 | int qla4_extended_error_logging = 0; /* 0 = off, 1 = log errors */ | 37 | int ql4xextended_error_logging = 0; /* 0 = off, 1 = log errors */ |
38 | module_param(qla4_extended_error_logging, int, S_IRUGO | S_IRUSR); | 38 | module_param(ql4xextended_error_logging, int, S_IRUGO | S_IRUSR); |
39 | MODULE_PARM_DESC(qla4_extended_error_logging, | 39 | MODULE_PARM_DESC(ql4xextended_error_logging, |
40 | "Option to enable extended error logging, " | 40 | "Option to enable extended error logging, " |
41 | "Default is 0 - no logging, 1 - debug logging"); | 41 | "Default is 0 - no logging, 1 - debug logging"); |
42 | 42 | ||
@@ -1714,7 +1714,7 @@ static int __init qla4xxx_module_init(void) | |||
1714 | 1714 | ||
1715 | /* Derive version string. */ | 1715 | /* Derive version string. */ |
1716 | strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION); | 1716 | strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION); |
1717 | if (qla4_extended_error_logging) | 1717 | if (ql4xextended_error_logging) |
1718 | strcat(qla4xxx_version_str, "-debug"); | 1718 | strcat(qla4xxx_version_str, "-debug"); |
1719 | 1719 | ||
1720 | qla4xxx_scsi_transport = | 1720 | qla4xxx_scsi_transport = |
@@ -1724,13 +1724,13 @@ static int __init qla4xxx_module_init(void) | |||
1724 | goto release_srb_cache; | 1724 | goto release_srb_cache; |
1725 | } | 1725 | } |
1726 | 1726 | ||
1727 | printk(KERN_INFO "QLogic iSCSI HBA Driver\n"); | ||
1728 | ret = pci_register_driver(&qla4xxx_pci_driver); | 1727 | ret = pci_register_driver(&qla4xxx_pci_driver); |
1729 | if (ret) | 1728 | if (ret) |
1730 | goto unregister_transport; | 1729 | goto unregister_transport; |
1731 | 1730 | ||
1732 | printk(KERN_INFO "QLogic iSCSI HBA Driver\n"); | 1731 | printk(KERN_INFO "QLogic iSCSI HBA Driver\n"); |
1733 | return 0; | 1732 | return 0; |
1733 | |||
1734 | unregister_transport: | 1734 | unregister_transport: |
1735 | iscsi_unregister_transport(&qla4xxx_iscsi_transport); | 1735 | iscsi_unregister_transport(&qla4xxx_iscsi_transport); |
1736 | release_srb_cache: | 1736 | release_srb_cache: |
diff --git a/drivers/scsi/qlogicfas408.c b/drivers/scsi/qlogicfas408.c index e0725353c99c..2e7db18f5aef 100644 --- a/drivers/scsi/qlogicfas408.c +++ b/drivers/scsi/qlogicfas408.c | |||
@@ -209,7 +209,7 @@ static int ql_wai(struct qlogicfas408_priv *priv) | |||
209 | * caller must hold host lock | 209 | * caller must hold host lock |
210 | */ | 210 | */ |
211 | 211 | ||
212 | static void ql_icmd(Scsi_Cmnd * cmd) | 212 | static void ql_icmd(struct scsi_cmnd *cmd) |
213 | { | 213 | { |
214 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); | 214 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); |
215 | int qbase = priv->qbase; | 215 | int qbase = priv->qbase; |
@@ -256,7 +256,7 @@ static void ql_icmd(Scsi_Cmnd * cmd) | |||
256 | * Process scsi command - usually after interrupt | 256 | * Process scsi command - usually after interrupt |
257 | */ | 257 | */ |
258 | 258 | ||
259 | static unsigned int ql_pcmd(Scsi_Cmnd * cmd) | 259 | static unsigned int ql_pcmd(struct scsi_cmnd *cmd) |
260 | { | 260 | { |
261 | unsigned int i, j; | 261 | unsigned int i, j; |
262 | unsigned long k; | 262 | unsigned long k; |
@@ -407,7 +407,7 @@ static unsigned int ql_pcmd(Scsi_Cmnd * cmd) | |||
407 | 407 | ||
408 | static void ql_ihandl(void *dev_id) | 408 | static void ql_ihandl(void *dev_id) |
409 | { | 409 | { |
410 | Scsi_Cmnd *icmd; | 410 | struct scsi_cmnd *icmd; |
411 | struct Scsi_Host *host = dev_id; | 411 | struct Scsi_Host *host = dev_id; |
412 | struct qlogicfas408_priv *priv = get_priv_by_host(host); | 412 | struct qlogicfas408_priv *priv = get_priv_by_host(host); |
413 | int qbase = priv->qbase; | 413 | int qbase = priv->qbase; |
@@ -447,7 +447,8 @@ irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id) | |||
447 | * Queued command | 447 | * Queued command |
448 | */ | 448 | */ |
449 | 449 | ||
450 | int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) | 450 | int qlogicfas408_queuecommand(struct scsi_cmnd *cmd, |
451 | void (*done) (struct scsi_cmnd *)) | ||
451 | { | 452 | { |
452 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); | 453 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); |
453 | if (scmd_id(cmd) == priv->qinitid) { | 454 | if (scmd_id(cmd) == priv->qinitid) { |
@@ -470,9 +471,8 @@ int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)) | |||
470 | * Return bios parameters | 471 | * Return bios parameters |
471 | */ | 472 | */ |
472 | 473 | ||
473 | int qlogicfas408_biosparam(struct scsi_device * disk, | 474 | int qlogicfas408_biosparam(struct scsi_device *disk, struct block_device *dev, |
474 | struct block_device *dev, | 475 | sector_t capacity, int ip[]) |
475 | sector_t capacity, int ip[]) | ||
476 | { | 476 | { |
477 | /* This should mimic the DOS Qlogic driver's behavior exactly */ | 477 | /* This should mimic the DOS Qlogic driver's behavior exactly */ |
478 | ip[0] = 0x40; | 478 | ip[0] = 0x40; |
@@ -494,7 +494,7 @@ int qlogicfas408_biosparam(struct scsi_device * disk, | |||
494 | * Abort a command in progress | 494 | * Abort a command in progress |
495 | */ | 495 | */ |
496 | 496 | ||
497 | int qlogicfas408_abort(Scsi_Cmnd * cmd) | 497 | int qlogicfas408_abort(struct scsi_cmnd *cmd) |
498 | { | 498 | { |
499 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); | 499 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); |
500 | priv->qabort = 1; | 500 | priv->qabort = 1; |
@@ -508,7 +508,7 @@ int qlogicfas408_abort(Scsi_Cmnd * cmd) | |||
508 | * the PCMCIA qlogic_stub code. This wants fixing | 508 | * the PCMCIA qlogic_stub code. This wants fixing |
509 | */ | 509 | */ |
510 | 510 | ||
511 | int qlogicfas408_bus_reset(Scsi_Cmnd * cmd) | 511 | int qlogicfas408_bus_reset(struct scsi_cmnd *cmd) |
512 | { | 512 | { |
513 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); | 513 | struct qlogicfas408_priv *priv = get_priv_by_cmd(cmd); |
514 | unsigned long flags; | 514 | unsigned long flags; |
diff --git a/drivers/scsi/qlogicfas408.h b/drivers/scsi/qlogicfas408.h index 8fd5555c75b1..260626427a32 100644 --- a/drivers/scsi/qlogicfas408.h +++ b/drivers/scsi/qlogicfas408.h | |||
@@ -75,15 +75,15 @@ | |||
75 | /*----------------------------------------------------------------*/ | 75 | /*----------------------------------------------------------------*/ |
76 | 76 | ||
77 | struct qlogicfas408_priv { | 77 | struct qlogicfas408_priv { |
78 | int qbase; /* Port */ | 78 | int qbase; /* Port */ |
79 | int qinitid; /* initiator ID */ | 79 | int qinitid; /* initiator ID */ |
80 | int qabort; /* Flag to cause an abort */ | 80 | int qabort; /* Flag to cause an abort */ |
81 | int qlirq; /* IRQ being used */ | 81 | int qlirq; /* IRQ being used */ |
82 | int int_type; /* type of irq, 2 for ISA board, 0 for PCMCIA */ | 82 | int int_type; /* type of irq, 2 for ISA board, 0 for PCMCIA */ |
83 | char qinfo[80]; /* description */ | 83 | char qinfo[80]; /* description */ |
84 | Scsi_Cmnd *qlcmd; /* current command being processed */ | 84 | struct scsi_cmnd *qlcmd; /* current command being processed */ |
85 | struct Scsi_Host *shost; /* pointer back to host */ | 85 | struct Scsi_Host *shost; /* pointer back to host */ |
86 | struct qlogicfas408_priv *next; /* next private struct */ | 86 | struct qlogicfas408_priv *next; /* next private struct */ |
87 | }; | 87 | }; |
88 | 88 | ||
89 | /* The qlogic card uses two register maps - These macros select which one */ | 89 | /* The qlogic card uses two register maps - These macros select which one */ |
@@ -103,12 +103,13 @@ struct qlogicfas408_priv { | |||
103 | #define get_priv_by_host(x) (struct qlogicfas408_priv *)&((x)->hostdata[0]) | 103 | #define get_priv_by_host(x) (struct qlogicfas408_priv *)&((x)->hostdata[0]) |
104 | 104 | ||
105 | irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id); | 105 | irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id); |
106 | int qlogicfas408_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)); | 106 | int qlogicfas408_queuecommand(struct scsi_cmnd * cmd, |
107 | void (*done) (struct scsi_cmnd *)); | ||
107 | int qlogicfas408_biosparam(struct scsi_device * disk, | 108 | int qlogicfas408_biosparam(struct scsi_device * disk, |
108 | struct block_device *dev, | 109 | struct block_device *dev, |
109 | sector_t capacity, int ip[]); | 110 | sector_t capacity, int ip[]); |
110 | int qlogicfas408_abort(Scsi_Cmnd * cmd); | 111 | int qlogicfas408_abort(struct scsi_cmnd * cmd); |
111 | int qlogicfas408_bus_reset(Scsi_Cmnd * cmd); | 112 | int qlogicfas408_bus_reset(struct scsi_cmnd * cmd); |
112 | const char *qlogicfas408_info(struct Scsi_Host *host); | 113 | const char *qlogicfas408_info(struct Scsi_Host *host); |
113 | int qlogicfas408_get_chip_type(int qbase, int int_type); | 114 | int qlogicfas408_get_chip_type(int qbase, int int_type); |
114 | void qlogicfas408_setup(int qbase, int id, int int_type); | 115 | void qlogicfas408_setup(int qbase, int id, int int_type); |
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 9c0f35820e3e..30ee3d72c021 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c | |||
@@ -52,7 +52,7 @@ | |||
52 | #include "scsi_debug.h" | 52 | #include "scsi_debug.h" |
53 | 53 | ||
54 | #define SCSI_DEBUG_VERSION "1.80" | 54 | #define SCSI_DEBUG_VERSION "1.80" |
55 | static const char * scsi_debug_version_date = "20060914"; | 55 | static const char * scsi_debug_version_date = "20061018"; |
56 | 56 | ||
57 | /* Additional Sense Code (ASC) used */ | 57 | /* Additional Sense Code (ASC) used */ |
58 | #define NO_ADDITIONAL_SENSE 0x0 | 58 | #define NO_ADDITIONAL_SENSE 0x0 |
@@ -254,6 +254,8 @@ static int resp_requests(struct scsi_cmnd * SCpnt, | |||
254 | struct sdebug_dev_info * devip); | 254 | struct sdebug_dev_info * devip); |
255 | static int resp_start_stop(struct scsi_cmnd * scp, | 255 | static int resp_start_stop(struct scsi_cmnd * scp, |
256 | struct sdebug_dev_info * devip); | 256 | struct sdebug_dev_info * devip); |
257 | static int resp_report_tgtpgs(struct scsi_cmnd * scp, | ||
258 | struct sdebug_dev_info * devip); | ||
257 | static int resp_readcap(struct scsi_cmnd * SCpnt, | 259 | static int resp_readcap(struct scsi_cmnd * SCpnt, |
258 | struct sdebug_dev_info * devip); | 260 | struct sdebug_dev_info * devip); |
259 | static int resp_readcap16(struct scsi_cmnd * SCpnt, | 261 | static int resp_readcap16(struct scsi_cmnd * SCpnt, |
@@ -287,9 +289,9 @@ static void __init sdebug_build_parts(unsigned char * ramp); | |||
287 | static void __init init_all_queued(void); | 289 | static void __init init_all_queued(void); |
288 | static void stop_all_queued(void); | 290 | static void stop_all_queued(void); |
289 | static int stop_queued_cmnd(struct scsi_cmnd * cmnd); | 291 | static int stop_queued_cmnd(struct scsi_cmnd * cmnd); |
290 | static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, | 292 | static int inquiry_evpd_83(unsigned char * arr, int port_group_id, |
291 | int dev_id_num, const char * dev_id_str, | 293 | int target_dev_id, int dev_id_num, |
292 | int dev_id_str_len); | 294 | const char * dev_id_str, int dev_id_str_len); |
293 | static int inquiry_evpd_88(unsigned char * arr, int target_dev_id); | 295 | static int inquiry_evpd_88(unsigned char * arr, int target_dev_id); |
294 | static int do_create_driverfs_files(void); | 296 | static int do_create_driverfs_files(void); |
295 | static void do_remove_driverfs_files(void); | 297 | static void do_remove_driverfs_files(void); |
@@ -422,6 +424,15 @@ int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done) | |||
422 | } | 424 | } |
423 | errsts = resp_readcap16(SCpnt, devip); | 425 | errsts = resp_readcap16(SCpnt, devip); |
424 | break; | 426 | break; |
427 | case MAINTENANCE_IN: | ||
428 | if (MI_REPORT_TARGET_PGS != cmd[1]) { | ||
429 | mk_sense_buffer(devip, ILLEGAL_REQUEST, | ||
430 | INVALID_OPCODE, 0); | ||
431 | errsts = check_condition_result; | ||
432 | break; | ||
433 | } | ||
434 | errsts = resp_report_tgtpgs(SCpnt, devip); | ||
435 | break; | ||
425 | case READ_16: | 436 | case READ_16: |
426 | case READ_12: | 437 | case READ_12: |
427 | case READ_10: | 438 | case READ_10: |
@@ -665,8 +676,9 @@ static const char * inq_vendor_id = "Linux "; | |||
665 | static const char * inq_product_id = "scsi_debug "; | 676 | static const char * inq_product_id = "scsi_debug "; |
666 | static const char * inq_product_rev = "0004"; | 677 | static const char * inq_product_rev = "0004"; |
667 | 678 | ||
668 | static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, | 679 | static int inquiry_evpd_83(unsigned char * arr, int port_group_id, |
669 | int dev_id_num, const char * dev_id_str, | 680 | int target_dev_id, int dev_id_num, |
681 | const char * dev_id_str, | ||
670 | int dev_id_str_len) | 682 | int dev_id_str_len) |
671 | { | 683 | { |
672 | int num, port_a; | 684 | int num, port_a; |
@@ -720,6 +732,15 @@ static int inquiry_evpd_83(unsigned char * arr, int target_dev_id, | |||
720 | arr[num++] = (port_a >> 16) & 0xff; | 732 | arr[num++] = (port_a >> 16) & 0xff; |
721 | arr[num++] = (port_a >> 8) & 0xff; | 733 | arr[num++] = (port_a >> 8) & 0xff; |
722 | arr[num++] = port_a & 0xff; | 734 | arr[num++] = port_a & 0xff; |
735 | /* NAA-5, Target port group identifier */ | ||
736 | arr[num++] = 0x61; /* proto=sas, binary */ | ||
737 | arr[num++] = 0x95; /* piv=1, target port group id */ | ||
738 | arr[num++] = 0x0; | ||
739 | arr[num++] = 0x4; | ||
740 | arr[num++] = 0; | ||
741 | arr[num++] = 0; | ||
742 | arr[num++] = (port_group_id >> 8) & 0xff; | ||
743 | arr[num++] = port_group_id & 0xff; | ||
723 | /* NAA-5, Target device identifier */ | 744 | /* NAA-5, Target device identifier */ |
724 | arr[num++] = 0x61; /* proto=sas, binary */ | 745 | arr[num++] = 0x61; /* proto=sas, binary */ |
725 | arr[num++] = 0xa3; /* piv=1, target device, naa */ | 746 | arr[num++] = 0xa3; /* piv=1, target device, naa */ |
@@ -928,12 +949,12 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
928 | struct sdebug_dev_info * devip) | 949 | struct sdebug_dev_info * devip) |
929 | { | 950 | { |
930 | unsigned char pq_pdt; | 951 | unsigned char pq_pdt; |
931 | unsigned char arr[SDEBUG_MAX_INQ_ARR_SZ]; | 952 | unsigned char * arr; |
932 | unsigned char *cmd = (unsigned char *)scp->cmnd; | 953 | unsigned char *cmd = (unsigned char *)scp->cmnd; |
933 | int alloc_len, n; | 954 | int alloc_len, n, ret; |
934 | 955 | ||
935 | alloc_len = (cmd[3] << 8) + cmd[4]; | 956 | alloc_len = (cmd[3] << 8) + cmd[4]; |
936 | memset(arr, 0, SDEBUG_MAX_INQ_ARR_SZ); | 957 | arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_KERNEL); |
937 | if (devip->wlun) | 958 | if (devip->wlun) |
938 | pq_pdt = 0x1e; /* present, wlun */ | 959 | pq_pdt = 0x1e; /* present, wlun */ |
939 | else if (scsi_debug_no_lun_0 && (0 == devip->lun)) | 960 | else if (scsi_debug_no_lun_0 && (0 == devip->lun)) |
@@ -944,12 +965,15 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
944 | if (0x2 & cmd[1]) { /* CMDDT bit set */ | 965 | if (0x2 & cmd[1]) { /* CMDDT bit set */ |
945 | mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, | 966 | mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, |
946 | 0); | 967 | 0); |
968 | kfree(arr); | ||
947 | return check_condition_result; | 969 | return check_condition_result; |
948 | } else if (0x1 & cmd[1]) { /* EVPD bit set */ | 970 | } else if (0x1 & cmd[1]) { /* EVPD bit set */ |
949 | int lu_id_num, target_dev_id, len; | 971 | int lu_id_num, port_group_id, target_dev_id, len; |
950 | char lu_id_str[6]; | 972 | char lu_id_str[6]; |
951 | int host_no = devip->sdbg_host->shost->host_no; | 973 | int host_no = devip->sdbg_host->shost->host_no; |
952 | 974 | ||
975 | port_group_id = (((host_no + 1) & 0x7f) << 8) + | ||
976 | (devip->channel & 0x7f); | ||
953 | if (0 == scsi_debug_vpd_use_hostno) | 977 | if (0 == scsi_debug_vpd_use_hostno) |
954 | host_no = 0; | 978 | host_no = 0; |
955 | lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) + | 979 | lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) + |
@@ -977,8 +1001,9 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
977 | memcpy(&arr[4], lu_id_str, len); | 1001 | memcpy(&arr[4], lu_id_str, len); |
978 | } else if (0x83 == cmd[2]) { /* device identification */ | 1002 | } else if (0x83 == cmd[2]) { /* device identification */ |
979 | arr[1] = cmd[2]; /*sanity */ | 1003 | arr[1] = cmd[2]; /*sanity */ |
980 | arr[3] = inquiry_evpd_83(&arr[4], target_dev_id, | 1004 | arr[3] = inquiry_evpd_83(&arr[4], port_group_id, |
981 | lu_id_num, lu_id_str, len); | 1005 | target_dev_id, lu_id_num, |
1006 | lu_id_str, len); | ||
982 | } else if (0x84 == cmd[2]) { /* Software interface ident. */ | 1007 | } else if (0x84 == cmd[2]) { /* Software interface ident. */ |
983 | arr[1] = cmd[2]; /*sanity */ | 1008 | arr[1] = cmd[2]; /*sanity */ |
984 | arr[3] = inquiry_evpd_84(&arr[4]); | 1009 | arr[3] = inquiry_evpd_84(&arr[4]); |
@@ -1012,17 +1037,22 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
1012 | /* Illegal request, invalid field in cdb */ | 1037 | /* Illegal request, invalid field in cdb */ |
1013 | mk_sense_buffer(devip, ILLEGAL_REQUEST, | 1038 | mk_sense_buffer(devip, ILLEGAL_REQUEST, |
1014 | INVALID_FIELD_IN_CDB, 0); | 1039 | INVALID_FIELD_IN_CDB, 0); |
1040 | kfree(arr); | ||
1015 | return check_condition_result; | 1041 | return check_condition_result; |
1016 | } | 1042 | } |
1017 | len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len); | 1043 | len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len); |
1018 | return fill_from_dev_buffer(scp, arr, | 1044 | ret = fill_from_dev_buffer(scp, arr, |
1019 | min(len, SDEBUG_MAX_INQ_ARR_SZ)); | 1045 | min(len, SDEBUG_MAX_INQ_ARR_SZ)); |
1046 | kfree(arr); | ||
1047 | return ret; | ||
1020 | } | 1048 | } |
1021 | /* drops through here for a standard inquiry */ | 1049 | /* drops through here for a standard inquiry */ |
1022 | arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */ | 1050 | arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */ |
1023 | arr[2] = scsi_debug_scsi_level; | 1051 | arr[2] = scsi_debug_scsi_level; |
1024 | arr[3] = 2; /* response_data_format==2 */ | 1052 | arr[3] = 2; /* response_data_format==2 */ |
1025 | arr[4] = SDEBUG_LONG_INQ_SZ - 5; | 1053 | arr[4] = SDEBUG_LONG_INQ_SZ - 5; |
1054 | if (0 == scsi_debug_vpd_use_hostno) | ||
1055 | arr[5] = 0x10; /* claim: implicit TGPS */ | ||
1026 | arr[6] = 0x10; /* claim: MultiP */ | 1056 | arr[6] = 0x10; /* claim: MultiP */ |
1027 | /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */ | 1057 | /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */ |
1028 | arr[7] = 0xa; /* claim: LINKED + CMDQUE */ | 1058 | arr[7] = 0xa; /* claim: LINKED + CMDQUE */ |
@@ -1039,8 +1069,10 @@ static int resp_inquiry(struct scsi_cmnd * scp, int target, | |||
1039 | arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */ | 1069 | arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */ |
1040 | } | 1070 | } |
1041 | arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */ | 1071 | arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */ |
1042 | return fill_from_dev_buffer(scp, arr, | 1072 | ret = fill_from_dev_buffer(scp, arr, |
1043 | min(alloc_len, SDEBUG_LONG_INQ_SZ)); | 1073 | min(alloc_len, SDEBUG_LONG_INQ_SZ)); |
1074 | kfree(arr); | ||
1075 | return ret; | ||
1044 | } | 1076 | } |
1045 | 1077 | ||
1046 | static int resp_requests(struct scsi_cmnd * scp, | 1078 | static int resp_requests(struct scsi_cmnd * scp, |
@@ -1171,6 +1203,87 @@ static int resp_readcap16(struct scsi_cmnd * scp, | |||
1171 | min(alloc_len, SDEBUG_READCAP16_ARR_SZ)); | 1203 | min(alloc_len, SDEBUG_READCAP16_ARR_SZ)); |
1172 | } | 1204 | } |
1173 | 1205 | ||
1206 | #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412 | ||
1207 | |||
1208 | static int resp_report_tgtpgs(struct scsi_cmnd * scp, | ||
1209 | struct sdebug_dev_info * devip) | ||
1210 | { | ||
1211 | unsigned char *cmd = (unsigned char *)scp->cmnd; | ||
1212 | unsigned char * arr; | ||
1213 | int host_no = devip->sdbg_host->shost->host_no; | ||
1214 | int n, ret, alen, rlen; | ||
1215 | int port_group_a, port_group_b, port_a, port_b; | ||
1216 | |||
1217 | alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8) | ||
1218 | + cmd[9]); | ||
1219 | |||
1220 | arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_KERNEL); | ||
1221 | /* | ||
1222 | * EVPD page 0x88 states we have two ports, one | ||
1223 | * real and a fake port with no device connected. | ||
1224 | * So we create two port groups with one port each | ||
1225 | * and set the group with port B to unavailable. | ||
1226 | */ | ||
1227 | port_a = 0x1; /* relative port A */ | ||
1228 | port_b = 0x2; /* relative port B */ | ||
1229 | port_group_a = (((host_no + 1) & 0x7f) << 8) + | ||
1230 | (devip->channel & 0x7f); | ||
1231 | port_group_b = (((host_no + 1) & 0x7f) << 8) + | ||
1232 | (devip->channel & 0x7f) + 0x80; | ||
1233 | |||
1234 | /* | ||
1235 | * The asymmetric access state is cycled according to the host_id. | ||
1236 | */ | ||
1237 | n = 4; | ||
1238 | if (0 == scsi_debug_vpd_use_hostno) { | ||
1239 | arr[n++] = host_no % 3; /* Asymm access state */ | ||
1240 | arr[n++] = 0x0F; /* claim: all states are supported */ | ||
1241 | } else { | ||
1242 | arr[n++] = 0x0; /* Active/Optimized path */ | ||
1243 | arr[n++] = 0x01; /* claim: only support active/optimized paths */ | ||
1244 | } | ||
1245 | arr[n++] = (port_group_a >> 8) & 0xff; | ||
1246 | arr[n++] = port_group_a & 0xff; | ||
1247 | arr[n++] = 0; /* Reserved */ | ||
1248 | arr[n++] = 0; /* Status code */ | ||
1249 | arr[n++] = 0; /* Vendor unique */ | ||
1250 | arr[n++] = 0x1; /* One port per group */ | ||
1251 | arr[n++] = 0; /* Reserved */ | ||
1252 | arr[n++] = 0; /* Reserved */ | ||
1253 | arr[n++] = (port_a >> 8) & 0xff; | ||
1254 | arr[n++] = port_a & 0xff; | ||
1255 | arr[n++] = 3; /* Port unavailable */ | ||
1256 | arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */ | ||
1257 | arr[n++] = (port_group_b >> 8) & 0xff; | ||
1258 | arr[n++] = port_group_b & 0xff; | ||
1259 | arr[n++] = 0; /* Reserved */ | ||
1260 | arr[n++] = 0; /* Status code */ | ||
1261 | arr[n++] = 0; /* Vendor unique */ | ||
1262 | arr[n++] = 0x1; /* One port per group */ | ||
1263 | arr[n++] = 0; /* Reserved */ | ||
1264 | arr[n++] = 0; /* Reserved */ | ||
1265 | arr[n++] = (port_b >> 8) & 0xff; | ||
1266 | arr[n++] = port_b & 0xff; | ||
1267 | |||
1268 | rlen = n - 4; | ||
1269 | arr[0] = (rlen >> 24) & 0xff; | ||
1270 | arr[1] = (rlen >> 16) & 0xff; | ||
1271 | arr[2] = (rlen >> 8) & 0xff; | ||
1272 | arr[3] = rlen & 0xff; | ||
1273 | |||
1274 | /* | ||
1275 | * Return the smallest value of either | ||
1276 | * - The allocated length | ||
1277 | * - The constructed command length | ||
1278 | * - The maximum array size | ||
1279 | */ | ||
1280 | rlen = min(alen,n); | ||
1281 | ret = fill_from_dev_buffer(scp, arr, | ||
1282 | min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ)); | ||
1283 | kfree(arr); | ||
1284 | return ret; | ||
1285 | } | ||
1286 | |||
1174 | /* <<Following mode page info copied from ST318451LW>> */ | 1287 | /* <<Following mode page info copied from ST318451LW>> */ |
1175 | 1288 | ||
1176 | static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target) | 1289 | static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target) |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 743f67ed7640..d2c02df12fdc 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -1084,7 +1084,7 @@ static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) | |||
1084 | { | 1084 | { |
1085 | struct request *req = cmd->request; | 1085 | struct request *req = cmd->request; |
1086 | 1086 | ||
1087 | BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd)); | 1087 | BUILD_BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd)); |
1088 | memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); | 1088 | memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); |
1089 | cmd->cmd_len = req->cmd_len; | 1089 | cmd->cmd_len = req->cmd_len; |
1090 | if (!req->data_len) | 1090 | if (!req->data_len) |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index e7fe565b96de..e1a91665d1c2 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -192,6 +192,7 @@ static CLASS_DEVICE_ATTR(state, S_IRUGO | S_IWUSR, show_shost_state, store_shost | |||
192 | shost_rd_attr(unique_id, "%u\n"); | 192 | shost_rd_attr(unique_id, "%u\n"); |
193 | shost_rd_attr(host_busy, "%hu\n"); | 193 | shost_rd_attr(host_busy, "%hu\n"); |
194 | shost_rd_attr(cmd_per_lun, "%hd\n"); | 194 | shost_rd_attr(cmd_per_lun, "%hd\n"); |
195 | shost_rd_attr(can_queue, "%hd\n"); | ||
195 | shost_rd_attr(sg_tablesize, "%hu\n"); | 196 | shost_rd_attr(sg_tablesize, "%hu\n"); |
196 | shost_rd_attr(unchecked_isa_dma, "%d\n"); | 197 | shost_rd_attr(unchecked_isa_dma, "%d\n"); |
197 | shost_rd_attr2(proc_name, hostt->proc_name, "%s\n"); | 198 | shost_rd_attr2(proc_name, hostt->proc_name, "%s\n"); |
@@ -200,6 +201,7 @@ static struct class_device_attribute *scsi_sysfs_shost_attrs[] = { | |||
200 | &class_device_attr_unique_id, | 201 | &class_device_attr_unique_id, |
201 | &class_device_attr_host_busy, | 202 | &class_device_attr_host_busy, |
202 | &class_device_attr_cmd_per_lun, | 203 | &class_device_attr_cmd_per_lun, |
204 | &class_device_attr_can_queue, | ||
203 | &class_device_attr_sg_tablesize, | 205 | &class_device_attr_sg_tablesize, |
204 | &class_device_attr_unchecked_isa_dma, | 206 | &class_device_attr_unchecked_isa_dma, |
205 | &class_device_attr_proc_name, | 207 | &class_device_attr_proc_name, |
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 7b0019cccce3..2d3baa99ca25 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
@@ -21,7 +21,6 @@ | |||
21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 21 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
22 | */ | 22 | */ |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/mempool.h> | ||
25 | #include <linux/mutex.h> | 24 | #include <linux/mutex.h> |
26 | #include <net/tcp.h> | 25 | #include <net/tcp.h> |
27 | #include <scsi/scsi.h> | 26 | #include <scsi/scsi.h> |
@@ -149,30 +148,6 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, | |||
149 | static struct sock *nls; | 148 | static struct sock *nls; |
150 | static DEFINE_MUTEX(rx_queue_mutex); | 149 | static DEFINE_MUTEX(rx_queue_mutex); |
151 | 150 | ||
152 | struct mempool_zone { | ||
153 | mempool_t *pool; | ||
154 | atomic_t allocated; | ||
155 | int size; | ||
156 | int hiwat; | ||
157 | struct list_head freequeue; | ||
158 | spinlock_t freelock; | ||
159 | }; | ||
160 | |||
161 | static struct mempool_zone *z_reply; | ||
162 | |||
163 | /* | ||
164 | * Z_MAX_* - actual mempool size allocated at the mempool_zone_init() time | ||
165 | * Z_HIWAT_* - zone's high watermark when if_error bit will be set to -ENOMEM | ||
166 | * so daemon will notice OOM on NETLINK tranposrt level and will | ||
167 | * be able to predict or change operational behavior | ||
168 | */ | ||
169 | #define Z_MAX_REPLY 8 | ||
170 | #define Z_HIWAT_REPLY 6 | ||
171 | #define Z_MAX_PDU 8 | ||
172 | #define Z_HIWAT_PDU 6 | ||
173 | #define Z_MAX_ERROR 16 | ||
174 | #define Z_HIWAT_ERROR 12 | ||
175 | |||
176 | static LIST_HEAD(sesslist); | 151 | static LIST_HEAD(sesslist); |
177 | static DEFINE_SPINLOCK(sesslock); | 152 | static DEFINE_SPINLOCK(sesslock); |
178 | static LIST_HEAD(connlist); | 153 | static LIST_HEAD(connlist); |
@@ -414,59 +389,11 @@ int iscsi_destroy_session(struct iscsi_cls_session *session) | |||
414 | } | 389 | } |
415 | EXPORT_SYMBOL_GPL(iscsi_destroy_session); | 390 | EXPORT_SYMBOL_GPL(iscsi_destroy_session); |
416 | 391 | ||
417 | static void mempool_zone_destroy(struct mempool_zone *zp) | ||
418 | { | ||
419 | mempool_destroy(zp->pool); | ||
420 | kfree(zp); | ||
421 | } | ||
422 | |||
423 | static void* | ||
424 | mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data) | ||
425 | { | ||
426 | struct mempool_zone *zone = pool_data; | ||
427 | |||
428 | return alloc_skb(zone->size, gfp_mask); | ||
429 | } | ||
430 | |||
431 | static void | ||
432 | mempool_zone_free_skb(void *element, void *pool_data) | ||
433 | { | ||
434 | kfree_skb(element); | ||
435 | } | ||
436 | |||
437 | static struct mempool_zone * | ||
438 | mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) | ||
439 | { | ||
440 | struct mempool_zone *zp; | ||
441 | |||
442 | zp = kzalloc(sizeof(*zp), GFP_KERNEL); | ||
443 | if (!zp) | ||
444 | return NULL; | ||
445 | |||
446 | zp->size = size; | ||
447 | zp->hiwat = hiwat; | ||
448 | INIT_LIST_HEAD(&zp->freequeue); | ||
449 | spin_lock_init(&zp->freelock); | ||
450 | atomic_set(&zp->allocated, 0); | ||
451 | |||
452 | zp->pool = mempool_create(max, mempool_zone_alloc_skb, | ||
453 | mempool_zone_free_skb, zp); | ||
454 | if (!zp->pool) { | ||
455 | kfree(zp); | ||
456 | return NULL; | ||
457 | } | ||
458 | |||
459 | return zp; | ||
460 | } | ||
461 | |||
462 | static void iscsi_conn_release(struct device *dev) | 392 | static void iscsi_conn_release(struct device *dev) |
463 | { | 393 | { |
464 | struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); | 394 | struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); |
465 | struct device *parent = conn->dev.parent; | 395 | struct device *parent = conn->dev.parent; |
466 | 396 | ||
467 | mempool_zone_destroy(conn->z_pdu); | ||
468 | mempool_zone_destroy(conn->z_error); | ||
469 | |||
470 | kfree(conn); | 397 | kfree(conn); |
471 | put_device(parent); | 398 | put_device(parent); |
472 | } | 399 | } |
@@ -476,31 +403,6 @@ static int iscsi_is_conn_dev(const struct device *dev) | |||
476 | return dev->release == iscsi_conn_release; | 403 | return dev->release == iscsi_conn_release; |
477 | } | 404 | } |
478 | 405 | ||
479 | static int iscsi_create_event_pools(struct iscsi_cls_conn *conn) | ||
480 | { | ||
481 | conn->z_pdu = mempool_zone_init(Z_MAX_PDU, | ||
482 | NLMSG_SPACE(sizeof(struct iscsi_uevent) + | ||
483 | sizeof(struct iscsi_hdr) + | ||
484 | DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH), | ||
485 | Z_HIWAT_PDU); | ||
486 | if (!conn->z_pdu) { | ||
487 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " | ||
488 | "pdu zone for new conn\n"); | ||
489 | return -ENOMEM; | ||
490 | } | ||
491 | |||
492 | conn->z_error = mempool_zone_init(Z_MAX_ERROR, | ||
493 | NLMSG_SPACE(sizeof(struct iscsi_uevent)), | ||
494 | Z_HIWAT_ERROR); | ||
495 | if (!conn->z_error) { | ||
496 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " | ||
497 | "error zone for new conn\n"); | ||
498 | mempool_zone_destroy(conn->z_pdu); | ||
499 | return -ENOMEM; | ||
500 | } | ||
501 | return 0; | ||
502 | } | ||
503 | |||
504 | /** | 406 | /** |
505 | * iscsi_create_conn - create iscsi class connection | 407 | * iscsi_create_conn - create iscsi class connection |
506 | * @session: iscsi cls session | 408 | * @session: iscsi cls session |
@@ -533,12 +435,9 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) | |||
533 | conn->transport = transport; | 435 | conn->transport = transport; |
534 | conn->cid = cid; | 436 | conn->cid = cid; |
535 | 437 | ||
536 | if (iscsi_create_event_pools(conn)) | ||
537 | goto free_conn; | ||
538 | |||
539 | /* this is released in the dev's release function */ | 438 | /* this is released in the dev's release function */ |
540 | if (!get_device(&session->dev)) | 439 | if (!get_device(&session->dev)) |
541 | goto free_conn_pools; | 440 | goto free_conn; |
542 | 441 | ||
543 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", | 442 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", |
544 | session->sid, cid); | 443 | session->sid, cid); |
@@ -555,8 +454,6 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) | |||
555 | 454 | ||
556 | release_parent_ref: | 455 | release_parent_ref: |
557 | put_device(&session->dev); | 456 | put_device(&session->dev); |
558 | free_conn_pools: | ||
559 | |||
560 | free_conn: | 457 | free_conn: |
561 | kfree(conn); | 458 | kfree(conn); |
562 | return NULL; | 459 | return NULL; |
@@ -599,81 +496,31 @@ iscsi_if_transport_lookup(struct iscsi_transport *tt) | |||
599 | return NULL; | 496 | return NULL; |
600 | } | 497 | } |
601 | 498 | ||
602 | static inline struct list_head *skb_to_lh(struct sk_buff *skb) | ||
603 | { | ||
604 | return (struct list_head *)&skb->cb; | ||
605 | } | ||
606 | |||
607 | static void | ||
608 | mempool_zone_complete(struct mempool_zone *zone) | ||
609 | { | ||
610 | unsigned long flags; | ||
611 | struct list_head *lh, *n; | ||
612 | |||
613 | spin_lock_irqsave(&zone->freelock, flags); | ||
614 | list_for_each_safe(lh, n, &zone->freequeue) { | ||
615 | struct sk_buff *skb = (struct sk_buff *)((char *)lh - | ||
616 | offsetof(struct sk_buff, cb)); | ||
617 | if (!skb_shared(skb)) { | ||
618 | list_del(skb_to_lh(skb)); | ||
619 | mempool_free(skb, zone->pool); | ||
620 | atomic_dec(&zone->allocated); | ||
621 | } | ||
622 | } | ||
623 | spin_unlock_irqrestore(&zone->freelock, flags); | ||
624 | } | ||
625 | |||
626 | static struct sk_buff* | ||
627 | mempool_zone_get_skb(struct mempool_zone *zone) | ||
628 | { | ||
629 | struct sk_buff *skb; | ||
630 | |||
631 | skb = mempool_alloc(zone->pool, GFP_ATOMIC); | ||
632 | if (skb) | ||
633 | atomic_inc(&zone->allocated); | ||
634 | return skb; | ||
635 | } | ||
636 | |||
637 | static int | 499 | static int |
638 | iscsi_broadcast_skb(struct mempool_zone *zone, struct sk_buff *skb, gfp_t gfp) | 500 | iscsi_broadcast_skb(struct sk_buff *skb, gfp_t gfp) |
639 | { | 501 | { |
640 | unsigned long flags; | ||
641 | int rc; | 502 | int rc; |
642 | 503 | ||
643 | skb_get(skb); | ||
644 | rc = netlink_broadcast(nls, skb, 0, 1, gfp); | 504 | rc = netlink_broadcast(nls, skb, 0, 1, gfp); |
645 | if (rc < 0) { | 505 | if (rc < 0) { |
646 | mempool_free(skb, zone->pool); | ||
647 | printk(KERN_ERR "iscsi: can not broadcast skb (%d)\n", rc); | 506 | printk(KERN_ERR "iscsi: can not broadcast skb (%d)\n", rc); |
648 | return rc; | 507 | return rc; |
649 | } | 508 | } |
650 | 509 | ||
651 | spin_lock_irqsave(&zone->freelock, flags); | ||
652 | INIT_LIST_HEAD(skb_to_lh(skb)); | ||
653 | list_add(skb_to_lh(skb), &zone->freequeue); | ||
654 | spin_unlock_irqrestore(&zone->freelock, flags); | ||
655 | return 0; | 510 | return 0; |
656 | } | 511 | } |
657 | 512 | ||
658 | static int | 513 | static int |
659 | iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid) | 514 | iscsi_unicast_skb(struct sk_buff *skb, int pid) |
660 | { | 515 | { |
661 | unsigned long flags; | ||
662 | int rc; | 516 | int rc; |
663 | 517 | ||
664 | skb_get(skb); | ||
665 | rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT); | 518 | rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT); |
666 | if (rc < 0) { | 519 | if (rc < 0) { |
667 | mempool_free(skb, zone->pool); | ||
668 | printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc); | 520 | printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc); |
669 | return rc; | 521 | return rc; |
670 | } | 522 | } |
671 | 523 | ||
672 | spin_lock_irqsave(&zone->freelock, flags); | ||
673 | INIT_LIST_HEAD(skb_to_lh(skb)); | ||
674 | list_add(skb_to_lh(skb), &zone->freequeue); | ||
675 | spin_unlock_irqrestore(&zone->freelock, flags); | ||
676 | |||
677 | return 0; | 524 | return 0; |
678 | } | 525 | } |
679 | 526 | ||
@@ -692,9 +539,7 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, | |||
692 | if (!priv) | 539 | if (!priv) |
693 | return -EINVAL; | 540 | return -EINVAL; |
694 | 541 | ||
695 | mempool_zone_complete(conn->z_pdu); | 542 | skb = alloc_skb(len, GFP_ATOMIC); |
696 | |||
697 | skb = mempool_zone_get_skb(conn->z_pdu); | ||
698 | if (!skb) { | 543 | if (!skb) { |
699 | iscsi_conn_error(conn, ISCSI_ERR_CONN_FAILED); | 544 | iscsi_conn_error(conn, ISCSI_ERR_CONN_FAILED); |
700 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not deliver " | 545 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not deliver " |
@@ -707,15 +552,13 @@ int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, | |||
707 | memset(ev, 0, sizeof(*ev)); | 552 | memset(ev, 0, sizeof(*ev)); |
708 | ev->transport_handle = iscsi_handle(conn->transport); | 553 | ev->transport_handle = iscsi_handle(conn->transport); |
709 | ev->type = ISCSI_KEVENT_RECV_PDU; | 554 | ev->type = ISCSI_KEVENT_RECV_PDU; |
710 | if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) | ||
711 | ev->iferror = -ENOMEM; | ||
712 | ev->r.recv_req.cid = conn->cid; | 555 | ev->r.recv_req.cid = conn->cid; |
713 | ev->r.recv_req.sid = iscsi_conn_get_sid(conn); | 556 | ev->r.recv_req.sid = iscsi_conn_get_sid(conn); |
714 | pdu = (char*)ev + sizeof(*ev); | 557 | pdu = (char*)ev + sizeof(*ev); |
715 | memcpy(pdu, hdr, sizeof(struct iscsi_hdr)); | 558 | memcpy(pdu, hdr, sizeof(struct iscsi_hdr)); |
716 | memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size); | 559 | memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size); |
717 | 560 | ||
718 | return iscsi_unicast_skb(conn->z_pdu, skb, priv->daemon_pid); | 561 | return iscsi_unicast_skb(skb, priv->daemon_pid); |
719 | } | 562 | } |
720 | EXPORT_SYMBOL_GPL(iscsi_recv_pdu); | 563 | EXPORT_SYMBOL_GPL(iscsi_recv_pdu); |
721 | 564 | ||
@@ -731,9 +574,7 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) | |||
731 | if (!priv) | 574 | if (!priv) |
732 | return; | 575 | return; |
733 | 576 | ||
734 | mempool_zone_complete(conn->z_error); | 577 | skb = alloc_skb(len, GFP_ATOMIC); |
735 | |||
736 | skb = mempool_zone_get_skb(conn->z_error); | ||
737 | if (!skb) { | 578 | if (!skb) { |
738 | dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored " | 579 | dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored " |
739 | "conn error (%d)\n", error); | 580 | "conn error (%d)\n", error); |
@@ -744,13 +585,11 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) | |||
744 | ev = NLMSG_DATA(nlh); | 585 | ev = NLMSG_DATA(nlh); |
745 | ev->transport_handle = iscsi_handle(conn->transport); | 586 | ev->transport_handle = iscsi_handle(conn->transport); |
746 | ev->type = ISCSI_KEVENT_CONN_ERROR; | 587 | ev->type = ISCSI_KEVENT_CONN_ERROR; |
747 | if (atomic_read(&conn->z_error->allocated) >= conn->z_error->hiwat) | ||
748 | ev->iferror = -ENOMEM; | ||
749 | ev->r.connerror.error = error; | 588 | ev->r.connerror.error = error; |
750 | ev->r.connerror.cid = conn->cid; | 589 | ev->r.connerror.cid = conn->cid; |
751 | ev->r.connerror.sid = iscsi_conn_get_sid(conn); | 590 | ev->r.connerror.sid = iscsi_conn_get_sid(conn); |
752 | 591 | ||
753 | iscsi_broadcast_skb(conn->z_error, skb, GFP_ATOMIC); | 592 | iscsi_broadcast_skb(skb, GFP_ATOMIC); |
754 | 593 | ||
755 | dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", | 594 | dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", |
756 | error); | 595 | error); |
@@ -767,9 +606,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi, | |||
767 | int flags = multi ? NLM_F_MULTI : 0; | 606 | int flags = multi ? NLM_F_MULTI : 0; |
768 | int t = done ? NLMSG_DONE : type; | 607 | int t = done ? NLMSG_DONE : type; |
769 | 608 | ||
770 | mempool_zone_complete(z_reply); | 609 | skb = alloc_skb(len, GFP_ATOMIC); |
771 | |||
772 | skb = mempool_zone_get_skb(z_reply); | ||
773 | /* | 610 | /* |
774 | * FIXME: | 611 | * FIXME: |
775 | * user is supposed to react on iferror == -ENOMEM; | 612 | * user is supposed to react on iferror == -ENOMEM; |
@@ -780,7 +617,7 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi, | |||
780 | nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0); | 617 | nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0); |
781 | nlh->nlmsg_flags = flags; | 618 | nlh->nlmsg_flags = flags; |
782 | memcpy(NLMSG_DATA(nlh), payload, size); | 619 | memcpy(NLMSG_DATA(nlh), payload, size); |
783 | return iscsi_unicast_skb(z_reply, skb, pid); | 620 | return iscsi_unicast_skb(skb, pid); |
784 | } | 621 | } |
785 | 622 | ||
786 | static int | 623 | static int |
@@ -810,9 +647,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) | |||
810 | do { | 647 | do { |
811 | int actual_size; | 648 | int actual_size; |
812 | 649 | ||
813 | mempool_zone_complete(conn->z_pdu); | 650 | skbstat = alloc_skb(len, GFP_ATOMIC); |
814 | |||
815 | skbstat = mempool_zone_get_skb(conn->z_pdu); | ||
816 | if (!skbstat) { | 651 | if (!skbstat) { |
817 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not " | 652 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not " |
818 | "deliver stats: OOM\n"); | 653 | "deliver stats: OOM\n"); |
@@ -825,8 +660,6 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) | |||
825 | memset(evstat, 0, sizeof(*evstat)); | 660 | memset(evstat, 0, sizeof(*evstat)); |
826 | evstat->transport_handle = iscsi_handle(conn->transport); | 661 | evstat->transport_handle = iscsi_handle(conn->transport); |
827 | evstat->type = nlh->nlmsg_type; | 662 | evstat->type = nlh->nlmsg_type; |
828 | if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) | ||
829 | evstat->iferror = -ENOMEM; | ||
830 | evstat->u.get_stats.cid = | 663 | evstat->u.get_stats.cid = |
831 | ev->u.get_stats.cid; | 664 | ev->u.get_stats.cid; |
832 | evstat->u.get_stats.sid = | 665 | evstat->u.get_stats.sid = |
@@ -845,7 +678,7 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) | |||
845 | skb_trim(skbstat, NLMSG_ALIGN(actual_size)); | 678 | skb_trim(skbstat, NLMSG_ALIGN(actual_size)); |
846 | nlhstat->nlmsg_len = actual_size; | 679 | nlhstat->nlmsg_len = actual_size; |
847 | 680 | ||
848 | err = iscsi_unicast_skb(conn->z_pdu, skbstat, priv->daemon_pid); | 681 | err = iscsi_unicast_skb(skbstat, priv->daemon_pid); |
849 | } while (err < 0 && err != -ECONNREFUSED); | 682 | } while (err < 0 && err != -ECONNREFUSED); |
850 | 683 | ||
851 | return err; | 684 | return err; |
@@ -876,9 +709,7 @@ int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn) | |||
876 | session = iscsi_dev_to_session(conn->dev.parent); | 709 | session = iscsi_dev_to_session(conn->dev.parent); |
877 | shost = iscsi_session_to_shost(session); | 710 | shost = iscsi_session_to_shost(session); |
878 | 711 | ||
879 | mempool_zone_complete(conn->z_pdu); | 712 | skb = alloc_skb(len, GFP_KERNEL); |
880 | |||
881 | skb = mempool_zone_get_skb(conn->z_pdu); | ||
882 | if (!skb) { | 713 | if (!skb) { |
883 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | 714 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " |
884 | "session creation event\n"); | 715 | "session creation event\n"); |
@@ -896,7 +727,7 @@ int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn) | |||
896 | * this will occur if the daemon is not up, so we just warn | 727 | * this will occur if the daemon is not up, so we just warn |
897 | * the user and when the daemon is restarted it will handle it | 728 | * the user and when the daemon is restarted it will handle it |
898 | */ | 729 | */ |
899 | rc = iscsi_broadcast_skb(conn->z_pdu, skb, GFP_KERNEL); | 730 | rc = iscsi_broadcast_skb(skb, GFP_KERNEL); |
900 | if (rc < 0) | 731 | if (rc < 0) |
901 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | 732 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " |
902 | "session destruction event. Check iscsi daemon\n"); | 733 | "session destruction event. Check iscsi daemon\n"); |
@@ -939,9 +770,7 @@ int iscsi_if_create_session_done(struct iscsi_cls_conn *conn) | |||
939 | session = iscsi_dev_to_session(conn->dev.parent); | 770 | session = iscsi_dev_to_session(conn->dev.parent); |
940 | shost = iscsi_session_to_shost(session); | 771 | shost = iscsi_session_to_shost(session); |
941 | 772 | ||
942 | mempool_zone_complete(conn->z_pdu); | 773 | skb = alloc_skb(len, GFP_KERNEL); |
943 | |||
944 | skb = mempool_zone_get_skb(conn->z_pdu); | ||
945 | if (!skb) { | 774 | if (!skb) { |
946 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | 775 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " |
947 | "session creation event\n"); | 776 | "session creation event\n"); |
@@ -959,7 +788,7 @@ int iscsi_if_create_session_done(struct iscsi_cls_conn *conn) | |||
959 | * this will occur if the daemon is not up, so we just warn | 788 | * this will occur if the daemon is not up, so we just warn |
960 | * the user and when the daemon is restarted it will handle it | 789 | * the user and when the daemon is restarted it will handle it |
961 | */ | 790 | */ |
962 | rc = iscsi_broadcast_skb(conn->z_pdu, skb, GFP_KERNEL); | 791 | rc = iscsi_broadcast_skb(skb, GFP_KERNEL); |
963 | if (rc < 0) | 792 | if (rc < 0) |
964 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | 793 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " |
965 | "session creation event. Check iscsi daemon\n"); | 794 | "session creation event. Check iscsi daemon\n"); |
@@ -1278,9 +1107,6 @@ iscsi_if_rx(struct sock *sk, int len) | |||
1278 | err = iscsi_if_send_reply( | 1107 | err = iscsi_if_send_reply( |
1279 | NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq, | 1108 | NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq, |
1280 | nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); | 1109 | nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); |
1281 | if (atomic_read(&z_reply->allocated) >= | ||
1282 | z_reply->hiwat) | ||
1283 | ev->iferror = -ENOMEM; | ||
1284 | } while (err < 0 && err != -ECONNREFUSED); | 1110 | } while (err < 0 && err != -ECONNREFUSED); |
1285 | skb_pull(skb, rlen); | 1111 | skb_pull(skb, rlen); |
1286 | } | 1112 | } |
@@ -1584,32 +1410,6 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) | |||
1584 | } | 1410 | } |
1585 | EXPORT_SYMBOL_GPL(iscsi_unregister_transport); | 1411 | EXPORT_SYMBOL_GPL(iscsi_unregister_transport); |
1586 | 1412 | ||
1587 | static int | ||
1588 | iscsi_rcv_nl_event(struct notifier_block *this, unsigned long event, void *ptr) | ||
1589 | { | ||
1590 | struct netlink_notify *n = ptr; | ||
1591 | |||
1592 | if (event == NETLINK_URELEASE && | ||
1593 | n->protocol == NETLINK_ISCSI && n->pid) { | ||
1594 | struct iscsi_cls_conn *conn; | ||
1595 | unsigned long flags; | ||
1596 | |||
1597 | mempool_zone_complete(z_reply); | ||
1598 | spin_lock_irqsave(&connlock, flags); | ||
1599 | list_for_each_entry(conn, &connlist, conn_list) { | ||
1600 | mempool_zone_complete(conn->z_error); | ||
1601 | mempool_zone_complete(conn->z_pdu); | ||
1602 | } | ||
1603 | spin_unlock_irqrestore(&connlock, flags); | ||
1604 | } | ||
1605 | |||
1606 | return NOTIFY_DONE; | ||
1607 | } | ||
1608 | |||
1609 | static struct notifier_block iscsi_nl_notifier = { | ||
1610 | .notifier_call = iscsi_rcv_nl_event, | ||
1611 | }; | ||
1612 | |||
1613 | static __init int iscsi_transport_init(void) | 1413 | static __init int iscsi_transport_init(void) |
1614 | { | 1414 | { |
1615 | int err; | 1415 | int err; |
@@ -1633,25 +1433,15 @@ static __init int iscsi_transport_init(void) | |||
1633 | if (err) | 1433 | if (err) |
1634 | goto unregister_conn_class; | 1434 | goto unregister_conn_class; |
1635 | 1435 | ||
1636 | err = netlink_register_notifier(&iscsi_nl_notifier); | ||
1637 | if (err) | ||
1638 | goto unregister_session_class; | ||
1639 | |||
1640 | nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx, | 1436 | nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx, |
1641 | THIS_MODULE); | 1437 | THIS_MODULE); |
1642 | if (!nls) { | 1438 | if (!nls) { |
1643 | err = -ENOBUFS; | 1439 | err = -ENOBUFS; |
1644 | goto unregister_notifier; | 1440 | goto unregister_session_class; |
1645 | } | 1441 | } |
1646 | 1442 | ||
1647 | z_reply = mempool_zone_init(Z_MAX_REPLY, | 1443 | return 0; |
1648 | NLMSG_SPACE(sizeof(struct iscsi_uevent)), Z_HIWAT_REPLY); | ||
1649 | if (z_reply) | ||
1650 | return 0; | ||
1651 | 1444 | ||
1652 | sock_release(nls->sk_socket); | ||
1653 | unregister_notifier: | ||
1654 | netlink_unregister_notifier(&iscsi_nl_notifier); | ||
1655 | unregister_session_class: | 1445 | unregister_session_class: |
1656 | transport_class_unregister(&iscsi_session_class); | 1446 | transport_class_unregister(&iscsi_session_class); |
1657 | unregister_conn_class: | 1447 | unregister_conn_class: |
@@ -1665,9 +1455,7 @@ unregister_transport_class: | |||
1665 | 1455 | ||
1666 | static void __exit iscsi_transport_exit(void) | 1456 | static void __exit iscsi_transport_exit(void) |
1667 | { | 1457 | { |
1668 | mempool_zone_destroy(z_reply); | ||
1669 | sock_release(nls->sk_socket); | 1458 | sock_release(nls->sk_socket); |
1670 | netlink_unregister_notifier(&iscsi_nl_notifier); | ||
1671 | transport_class_unregister(&iscsi_connection_class); | 1459 | transport_class_unregister(&iscsi_connection_class); |
1672 | transport_class_unregister(&iscsi_session_class); | 1460 | transport_class_unregister(&iscsi_session_class); |
1673 | transport_class_unregister(&iscsi_host_class); | 1461 | transport_class_unregister(&iscsi_host_class); |
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 3babdc76b3fb..e1a52c525ed4 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
@@ -1177,7 +1177,10 @@ static int st_open(struct inode *inode, struct file *filp) | |||
1177 | goto err_out; | 1177 | goto err_out; |
1178 | if ((filp->f_flags & O_NONBLOCK) == 0 && | 1178 | if ((filp->f_flags & O_NONBLOCK) == 0 && |
1179 | retval != CHKRES_READY) { | 1179 | retval != CHKRES_READY) { |
1180 | retval = (-EIO); | 1180 | if (STp->ready == NO_TAPE) |
1181 | retval = (-ENOMEDIUM); | ||
1182 | else | ||
1183 | retval = (-EIO); | ||
1181 | goto err_out; | 1184 | goto err_out; |
1182 | } | 1185 | } |
1183 | return 0; | 1186 | return 0; |
diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c index 5ec5af8e3379..3b3f3050a877 100644 --- a/drivers/scsi/sun3_NCR5380.c +++ b/drivers/scsi/sun3_NCR5380.c | |||
@@ -266,8 +266,8 @@ static struct scsi_host_template *the_template = NULL; | |||
266 | (struct NCR5380_hostdata *)(in)->hostdata | 266 | (struct NCR5380_hostdata *)(in)->hostdata |
267 | #define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata) | 267 | #define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata) |
268 | 268 | ||
269 | #define NEXT(cmd) ((Scsi_Cmnd *)((cmd)->host_scribble)) | 269 | #define NEXT(cmd) ((struct scsi_cmnd *)((cmd)->host_scribble)) |
270 | #define NEXTADDR(cmd) ((Scsi_Cmnd **)&((cmd)->host_scribble)) | 270 | #define NEXTADDR(cmd) ((struct scsi_cmnd **)&((cmd)->host_scribble)) |
271 | 271 | ||
272 | #define HOSTNO instance->host_no | 272 | #define HOSTNO instance->host_no |
273 | #define H_NO(cmd) (cmd)->device->host->host_no | 273 | #define H_NO(cmd) (cmd)->device->host->host_no |
@@ -360,7 +360,7 @@ static void __init init_tags( void ) | |||
360 | * conditions. | 360 | * conditions. |
361 | */ | 361 | */ |
362 | 362 | ||
363 | static int is_lun_busy( Scsi_Cmnd *cmd, int should_be_tagged ) | 363 | static int is_lun_busy(struct scsi_cmnd *cmd, int should_be_tagged) |
364 | { | 364 | { |
365 | SETUP_HOSTDATA(cmd->device->host); | 365 | SETUP_HOSTDATA(cmd->device->host); |
366 | 366 | ||
@@ -384,7 +384,7 @@ static int is_lun_busy( Scsi_Cmnd *cmd, int should_be_tagged ) | |||
384 | * untagged. | 384 | * untagged. |
385 | */ | 385 | */ |
386 | 386 | ||
387 | static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged ) | 387 | static void cmd_get_tag(struct scsi_cmnd *cmd, int should_be_tagged) |
388 | { | 388 | { |
389 | SETUP_HOSTDATA(cmd->device->host); | 389 | SETUP_HOSTDATA(cmd->device->host); |
390 | 390 | ||
@@ -416,7 +416,7 @@ static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged ) | |||
416 | * unlock the LUN. | 416 | * unlock the LUN. |
417 | */ | 417 | */ |
418 | 418 | ||
419 | static void cmd_free_tag( Scsi_Cmnd *cmd ) | 419 | static void cmd_free_tag(struct scsi_cmnd *cmd) |
420 | { | 420 | { |
421 | SETUP_HOSTDATA(cmd->device->host); | 421 | SETUP_HOSTDATA(cmd->device->host); |
422 | 422 | ||
@@ -460,18 +460,18 @@ static void free_all_tags( void ) | |||
460 | 460 | ||
461 | 461 | ||
462 | /* | 462 | /* |
463 | * Function: void merge_contiguous_buffers( Scsi_Cmnd *cmd ) | 463 | * Function: void merge_contiguous_buffers(struct scsi_cmnd *cmd) |
464 | * | 464 | * |
465 | * Purpose: Try to merge several scatter-gather requests into one DMA | 465 | * Purpose: Try to merge several scatter-gather requests into one DMA |
466 | * transfer. This is possible if the scatter buffers lie on | 466 | * transfer. This is possible if the scatter buffers lie on |
467 | * physical contiguous addresses. | 467 | * physical contiguous addresses. |
468 | * | 468 | * |
469 | * Parameters: Scsi_Cmnd *cmd | 469 | * Parameters: struct scsi_cmnd *cmd |
470 | * The command to work on. The first scatter buffer's data are | 470 | * The command to work on. The first scatter buffer's data are |
471 | * assumed to be already transfered into ptr/this_residual. | 471 | * assumed to be already transfered into ptr/this_residual. |
472 | */ | 472 | */ |
473 | 473 | ||
474 | static void merge_contiguous_buffers( Scsi_Cmnd *cmd ) | 474 | static void merge_contiguous_buffers(struct scsi_cmnd *cmd) |
475 | { | 475 | { |
476 | unsigned long endaddr; | 476 | unsigned long endaddr; |
477 | #if (NDEBUG & NDEBUG_MERGING) | 477 | #if (NDEBUG & NDEBUG_MERGING) |
@@ -501,15 +501,15 @@ static void merge_contiguous_buffers( Scsi_Cmnd *cmd ) | |||
501 | } | 501 | } |
502 | 502 | ||
503 | /* | 503 | /* |
504 | * Function : void initialize_SCp(Scsi_Cmnd *cmd) | 504 | * Function : void initialize_SCp(struct scsi_cmnd *cmd) |
505 | * | 505 | * |
506 | * Purpose : initialize the saved data pointers for cmd to point to the | 506 | * Purpose : initialize the saved data pointers for cmd to point to the |
507 | * start of the buffer. | 507 | * start of the buffer. |
508 | * | 508 | * |
509 | * Inputs : cmd - Scsi_Cmnd structure to have pointers reset. | 509 | * Inputs : cmd - struct scsi_cmnd structure to have pointers reset. |
510 | */ | 510 | */ |
511 | 511 | ||
512 | static __inline__ void initialize_SCp(Scsi_Cmnd *cmd) | 512 | static __inline__ void initialize_SCp(struct scsi_cmnd *cmd) |
513 | { | 513 | { |
514 | /* | 514 | /* |
515 | * Initialize the Scsi Pointer field so that all of the commands in the | 515 | * Initialize the Scsi Pointer field so that all of the commands in the |
@@ -753,14 +753,15 @@ static void NCR5380_print_status (struct Scsi_Host *instance) | |||
753 | do { if (pos + strlen(fmt) + 20 /* slop */ < buffer + length) \ | 753 | do { if (pos + strlen(fmt) + 20 /* slop */ < buffer + length) \ |
754 | pos += sprintf(pos, fmt , ## args); } while(0) | 754 | pos += sprintf(pos, fmt , ## args); } while(0) |
755 | static | 755 | static |
756 | char *lprint_Scsi_Cmnd (Scsi_Cmnd *cmd, char *pos, char *buffer, int length); | 756 | char *lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, char *pos, char *buffer, |
757 | int length); | ||
757 | 758 | ||
758 | static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **start, | 759 | static int NCR5380_proc_info(struct Scsi_Host *instance, char *buffer, |
759 | off_t offset, int length, int inout) | 760 | char **start, off_t offset, int length, int inout) |
760 | { | 761 | { |
761 | char *pos = buffer; | 762 | char *pos = buffer; |
762 | struct NCR5380_hostdata *hostdata; | 763 | struct NCR5380_hostdata *hostdata; |
763 | Scsi_Cmnd *ptr; | 764 | struct scsi_cmnd *ptr; |
764 | unsigned long flags; | 765 | unsigned long flags; |
765 | off_t begin = 0; | 766 | off_t begin = 0; |
766 | #define check_offset() \ | 767 | #define check_offset() \ |
@@ -784,18 +785,19 @@ static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **s | |||
784 | if (!hostdata->connected) | 785 | if (!hostdata->connected) |
785 | SPRINTF("scsi%d: no currently connected command\n", HOSTNO); | 786 | SPRINTF("scsi%d: no currently connected command\n", HOSTNO); |
786 | else | 787 | else |
787 | pos = lprint_Scsi_Cmnd ((Scsi_Cmnd *) hostdata->connected, | 788 | pos = lprint_Scsi_Cmnd ((struct scsi_cmnd *) hostdata->connected, |
788 | pos, buffer, length); | 789 | pos, buffer, length); |
789 | SPRINTF("scsi%d: issue_queue\n", HOSTNO); | 790 | SPRINTF("scsi%d: issue_queue\n", HOSTNO); |
790 | check_offset(); | 791 | check_offset(); |
791 | for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = NEXT(ptr)) { | 792 | for (ptr = (struct scsi_cmnd *) hostdata->issue_queue; ptr; ptr = NEXT(ptr)) |
793 | { | ||
792 | pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); | 794 | pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); |
793 | check_offset(); | 795 | check_offset(); |
794 | } | 796 | } |
795 | 797 | ||
796 | SPRINTF("scsi%d: disconnected_queue\n", HOSTNO); | 798 | SPRINTF("scsi%d: disconnected_queue\n", HOSTNO); |
797 | check_offset(); | 799 | check_offset(); |
798 | for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; | 800 | for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr; |
799 | ptr = NEXT(ptr)) { | 801 | ptr = NEXT(ptr)) { |
800 | pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); | 802 | pos = lprint_Scsi_Cmnd (ptr, pos, buffer, length); |
801 | check_offset(); | 803 | check_offset(); |
@@ -810,8 +812,8 @@ static int NCR5380_proc_info (struct Scsi_Host *instance, char *buffer, char **s | |||
810 | return length; | 812 | return length; |
811 | } | 813 | } |
812 | 814 | ||
813 | static char * | 815 | static char *lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, char *pos, char *buffer, |
814 | lprint_Scsi_Cmnd (Scsi_Cmnd *cmd, char *pos, char *buffer, int length) | 816 | int length) |
815 | { | 817 | { |
816 | int i, s; | 818 | int i, s; |
817 | unsigned char *command; | 819 | unsigned char *command; |
@@ -888,8 +890,8 @@ static int NCR5380_init (struct Scsi_Host *instance, int flags) | |||
888 | } | 890 | } |
889 | 891 | ||
890 | /* | 892 | /* |
891 | * Function : int NCR5380_queue_command (Scsi_Cmnd *cmd, | 893 | * Function : int NCR5380_queue_command (struct scsi_cmnd *cmd, |
892 | * void (*done)(Scsi_Cmnd *)) | 894 | * void (*done)(struct scsi_cmnd *)) |
893 | * | 895 | * |
894 | * Purpose : enqueues a SCSI command | 896 | * Purpose : enqueues a SCSI command |
895 | * | 897 | * |
@@ -906,10 +908,11 @@ static int NCR5380_init (struct Scsi_Host *instance, int flags) | |||
906 | */ | 908 | */ |
907 | 909 | ||
908 | /* Only make static if a wrapper function is used */ | 910 | /* Only make static if a wrapper function is used */ |
909 | static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) | 911 | static int NCR5380_queue_command(struct scsi_cmnd *cmd, |
912 | void (*done)(struct scsi_cmnd *)) | ||
910 | { | 913 | { |
911 | SETUP_HOSTDATA(cmd->device->host); | 914 | SETUP_HOSTDATA(cmd->device->host); |
912 | Scsi_Cmnd *tmp; | 915 | struct scsi_cmnd *tmp; |
913 | unsigned long flags; | 916 | unsigned long flags; |
914 | 917 | ||
915 | #if (NDEBUG & NDEBUG_NO_WRITE) | 918 | #if (NDEBUG & NDEBUG_NO_WRITE) |
@@ -990,7 +993,7 @@ static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) | |||
990 | NEXT(cmd) = hostdata->issue_queue; | 993 | NEXT(cmd) = hostdata->issue_queue; |
991 | hostdata->issue_queue = cmd; | 994 | hostdata->issue_queue = cmd; |
992 | } else { | 995 | } else { |
993 | for (tmp = (Scsi_Cmnd *)hostdata->issue_queue; | 996 | for (tmp = (struct scsi_cmnd *)hostdata->issue_queue; |
994 | NEXT(tmp); tmp = NEXT(tmp)) | 997 | NEXT(tmp); tmp = NEXT(tmp)) |
995 | ; | 998 | ; |
996 | LIST(cmd, tmp); | 999 | LIST(cmd, tmp); |
@@ -1030,7 +1033,7 @@ static int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) | |||
1030 | 1033 | ||
1031 | static void NCR5380_main (void *bl) | 1034 | static void NCR5380_main (void *bl) |
1032 | { | 1035 | { |
1033 | Scsi_Cmnd *tmp, *prev; | 1036 | struct scsi_cmnd *tmp, *prev; |
1034 | struct Scsi_Host *instance = first_instance; | 1037 | struct Scsi_Host *instance = first_instance; |
1035 | struct NCR5380_hostdata *hostdata = HOSTDATA(instance); | 1038 | struct NCR5380_hostdata *hostdata = HOSTDATA(instance); |
1036 | int done; | 1039 | int done; |
@@ -1073,12 +1076,12 @@ static void NCR5380_main (void *bl) | |||
1073 | * for a target that's not busy. | 1076 | * for a target that's not busy. |
1074 | */ | 1077 | */ |
1075 | #if (NDEBUG & NDEBUG_LISTS) | 1078 | #if (NDEBUG & NDEBUG_LISTS) |
1076 | for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; | 1079 | for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL; |
1077 | tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp)) | 1080 | tmp && (tmp != prev); prev = tmp, tmp = NEXT(tmp)) |
1078 | ; | 1081 | ; |
1079 | if ((tmp == prev) && tmp) printk(" LOOP\n");/* else printk("\n");*/ | 1082 | if ((tmp == prev) && tmp) printk(" LOOP\n");/* else printk("\n");*/ |
1080 | #endif | 1083 | #endif |
1081 | for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, | 1084 | for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, |
1082 | prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp) ) { | 1085 | prev = NULL; tmp; prev = tmp, tmp = NEXT(tmp) ) { |
1083 | 1086 | ||
1084 | #if (NDEBUG & NDEBUG_LISTS) | 1087 | #if (NDEBUG & NDEBUG_LISTS) |
@@ -1339,7 +1342,8 @@ static irqreturn_t NCR5380_intr (int irq, void *dev_id) | |||
1339 | } | 1342 | } |
1340 | 1343 | ||
1341 | #ifdef NCR5380_STATS | 1344 | #ifdef NCR5380_STATS |
1342 | static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd) | 1345 | static void collect_stats(struct NCR5380_hostdata *hostdata, |
1346 | struct scsi_cmnd *cmd) | ||
1343 | { | 1347 | { |
1344 | # ifdef NCR5380_STAT_LIMIT | 1348 | # ifdef NCR5380_STAT_LIMIT |
1345 | if (cmd->request_bufflen > NCR5380_STAT_LIMIT) | 1349 | if (cmd->request_bufflen > NCR5380_STAT_LIMIT) |
@@ -1365,8 +1369,8 @@ static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd) | |||
1365 | #endif | 1369 | #endif |
1366 | 1370 | ||
1367 | /* | 1371 | /* |
1368 | * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd, | 1372 | * Function : int NCR5380_select(struct Scsi_Host *instance, |
1369 | * int tag); | 1373 | * struct scsi_cmnd *cmd, int tag); |
1370 | * | 1374 | * |
1371 | * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command, | 1375 | * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command, |
1372 | * including ARBITRATION, SELECTION, and initial message out for | 1376 | * including ARBITRATION, SELECTION, and initial message out for |
@@ -1395,7 +1399,8 @@ static void collect_stats(struct NCR5380_hostdata* hostdata, Scsi_Cmnd* cmd) | |||
1395 | * cmd->result host byte set to DID_BAD_TARGET. | 1399 | * cmd->result host byte set to DID_BAD_TARGET. |
1396 | */ | 1400 | */ |
1397 | 1401 | ||
1398 | static int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd, int tag) | 1402 | static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd, |
1403 | int tag) | ||
1399 | { | 1404 | { |
1400 | SETUP_HOSTDATA(instance); | 1405 | SETUP_HOSTDATA(instance); |
1401 | unsigned char tmp[3], phase; | 1406 | unsigned char tmp[3], phase; |
@@ -1985,7 +1990,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) | |||
1985 | #endif | 1990 | #endif |
1986 | unsigned char *data; | 1991 | unsigned char *data; |
1987 | unsigned char phase, tmp, extended_msg[10], old_phase=0xff; | 1992 | unsigned char phase, tmp, extended_msg[10], old_phase=0xff; |
1988 | Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected; | 1993 | struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected; |
1989 | 1994 | ||
1990 | #ifdef SUN3_SCSI_VME | 1995 | #ifdef SUN3_SCSI_VME |
1991 | dregs->csr |= CSR_INTR; | 1996 | dregs->csr |= CSR_INTR; |
@@ -2272,7 +2277,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) | |||
2272 | local_irq_save(flags); | 2277 | local_irq_save(flags); |
2273 | LIST(cmd,hostdata->issue_queue); | 2278 | LIST(cmd,hostdata->issue_queue); |
2274 | NEXT(cmd) = hostdata->issue_queue; | 2279 | NEXT(cmd) = hostdata->issue_queue; |
2275 | hostdata->issue_queue = (Scsi_Cmnd *) cmd; | 2280 | hostdata->issue_queue = (struct scsi_cmnd *) cmd; |
2276 | local_irq_restore(flags); | 2281 | local_irq_restore(flags); |
2277 | QU_PRINTK("scsi%d: REQUEST SENSE added to head of " | 2282 | QU_PRINTK("scsi%d: REQUEST SENSE added to head of " |
2278 | "issue queue\n", H_NO(cmd)); | 2283 | "issue queue\n", H_NO(cmd)); |
@@ -2502,7 +2507,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) | |||
2502 | * Function : void NCR5380_reselect (struct Scsi_Host *instance) | 2507 | * Function : void NCR5380_reselect (struct Scsi_Host *instance) |
2503 | * | 2508 | * |
2504 | * Purpose : does reselection, initializing the instance->connected | 2509 | * Purpose : does reselection, initializing the instance->connected |
2505 | * field to point to the Scsi_Cmnd for which the I_T_L or I_T_L_Q | 2510 | * field to point to the struct scsi_cmnd for which the I_T_L or I_T_L_Q |
2506 | * nexus has been reestablished, | 2511 | * nexus has been reestablished, |
2507 | * | 2512 | * |
2508 | * Inputs : instance - this instance of the NCR5380. | 2513 | * Inputs : instance - this instance of the NCR5380. |
@@ -2521,7 +2526,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance) | |||
2521 | unsigned char tag; | 2526 | unsigned char tag; |
2522 | #endif | 2527 | #endif |
2523 | unsigned char msg[3]; | 2528 | unsigned char msg[3]; |
2524 | Scsi_Cmnd *tmp = NULL, *prev; | 2529 | struct scsi_cmnd *tmp = NULL, *prev; |
2525 | /* unsigned long flags; */ | 2530 | /* unsigned long flags; */ |
2526 | 2531 | ||
2527 | /* | 2532 | /* |
@@ -2577,7 +2582,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance) | |||
2577 | * just reestablished, and remove it from the disconnected queue. | 2582 | * just reestablished, and remove it from the disconnected queue. |
2578 | */ | 2583 | */ |
2579 | 2584 | ||
2580 | for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL; | 2585 | for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL; |
2581 | tmp; prev = tmp, tmp = NEXT(tmp) ) { | 2586 | tmp; prev = tmp, tmp = NEXT(tmp) ) { |
2582 | if ((target_mask == (1 << tmp->device->id)) && (lun == tmp->device->lun) | 2587 | if ((target_mask == (1 << tmp->device->id)) && (lun == tmp->device->lun) |
2583 | #ifdef SUPPORT_TAGS | 2588 | #ifdef SUPPORT_TAGS |
@@ -2668,11 +2673,11 @@ static void NCR5380_reselect (struct Scsi_Host *instance) | |||
2668 | 2673 | ||
2669 | 2674 | ||
2670 | /* | 2675 | /* |
2671 | * Function : int NCR5380_abort (Scsi_Cmnd *cmd) | 2676 | * Function : int NCR5380_abort(struct scsi_cmnd *cmd) |
2672 | * | 2677 | * |
2673 | * Purpose : abort a command | 2678 | * Purpose : abort a command |
2674 | * | 2679 | * |
2675 | * Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the | 2680 | * Inputs : cmd - the struct scsi_cmnd to abort, code - code to set the |
2676 | * host byte of the result field to, if zero DID_ABORTED is | 2681 | * host byte of the result field to, if zero DID_ABORTED is |
2677 | * used. | 2682 | * used. |
2678 | * | 2683 | * |
@@ -2684,11 +2689,11 @@ static void NCR5380_reselect (struct Scsi_Host *instance) | |||
2684 | * called where the loop started in NCR5380_main(). | 2689 | * called where the loop started in NCR5380_main(). |
2685 | */ | 2690 | */ |
2686 | 2691 | ||
2687 | static int NCR5380_abort (Scsi_Cmnd *cmd) | 2692 | static int NCR5380_abort(struct scsi_cmnd *cmd) |
2688 | { | 2693 | { |
2689 | struct Scsi_Host *instance = cmd->device->host; | 2694 | struct Scsi_Host *instance = cmd->device->host; |
2690 | SETUP_HOSTDATA(instance); | 2695 | SETUP_HOSTDATA(instance); |
2691 | Scsi_Cmnd *tmp, **prev; | 2696 | struct scsi_cmnd *tmp, **prev; |
2692 | unsigned long flags; | 2697 | unsigned long flags; |
2693 | 2698 | ||
2694 | printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO); | 2699 | printk(KERN_NOTICE "scsi%d: aborting command\n", HOSTNO); |
@@ -2753,9 +2758,9 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2753 | * Case 2 : If the command hasn't been issued yet, we simply remove it | 2758 | * Case 2 : If the command hasn't been issued yet, we simply remove it |
2754 | * from the issue queue. | 2759 | * from the issue queue. |
2755 | */ | 2760 | */ |
2756 | for (prev = (Scsi_Cmnd **) &(hostdata->issue_queue), | 2761 | for (prev = (struct scsi_cmnd **) &(hostdata->issue_queue), |
2757 | tmp = (Scsi_Cmnd *) hostdata->issue_queue; | 2762 | tmp = (struct scsi_cmnd *) hostdata->issue_queue; |
2758 | tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) ) | 2763 | tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp)) |
2759 | if (cmd == tmp) { | 2764 | if (cmd == tmp) { |
2760 | REMOVE(5, *prev, tmp, NEXT(tmp)); | 2765 | REMOVE(5, *prev, tmp, NEXT(tmp)); |
2761 | (*prev) = NEXT(tmp); | 2766 | (*prev) = NEXT(tmp); |
@@ -2812,7 +2817,7 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2812 | * it from the disconnected queue. | 2817 | * it from the disconnected queue. |
2813 | */ | 2818 | */ |
2814 | 2819 | ||
2815 | for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp; | 2820 | for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp; |
2816 | tmp = NEXT(tmp)) | 2821 | tmp = NEXT(tmp)) |
2817 | if (cmd == tmp) { | 2822 | if (cmd == tmp) { |
2818 | local_irq_restore(flags); | 2823 | local_irq_restore(flags); |
@@ -2826,8 +2831,8 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2826 | do_abort (instance); | 2831 | do_abort (instance); |
2827 | 2832 | ||
2828 | local_irq_save(flags); | 2833 | local_irq_save(flags); |
2829 | for (prev = (Scsi_Cmnd **) &(hostdata->disconnected_queue), | 2834 | for (prev = (struct scsi_cmnd **) &(hostdata->disconnected_queue), |
2830 | tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; | 2835 | tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; |
2831 | tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) ) | 2836 | tmp; prev = NEXTADDR(tmp), tmp = NEXT(tmp) ) |
2832 | if (cmd == tmp) { | 2837 | if (cmd == tmp) { |
2833 | REMOVE(5, *prev, tmp, NEXT(tmp)); | 2838 | REMOVE(5, *prev, tmp, NEXT(tmp)); |
@@ -2868,7 +2873,7 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2868 | 2873 | ||
2869 | 2874 | ||
2870 | /* | 2875 | /* |
2871 | * Function : int NCR5380_bus_reset (Scsi_Cmnd *cmd) | 2876 | * Function : int NCR5380_bus_reset(struct scsi_cmnd *cmd) |
2872 | * | 2877 | * |
2873 | * Purpose : reset the SCSI bus. | 2878 | * Purpose : reset the SCSI bus. |
2874 | * | 2879 | * |
@@ -2876,13 +2881,13 @@ static int NCR5380_abort (Scsi_Cmnd *cmd) | |||
2876 | * | 2881 | * |
2877 | */ | 2882 | */ |
2878 | 2883 | ||
2879 | static int NCR5380_bus_reset( Scsi_Cmnd *cmd) | 2884 | static int NCR5380_bus_reset(struct scsi_cmnd *cmd) |
2880 | { | 2885 | { |
2881 | SETUP_HOSTDATA(cmd->device->host); | 2886 | SETUP_HOSTDATA(cmd->device->host); |
2882 | int i; | 2887 | int i; |
2883 | unsigned long flags; | 2888 | unsigned long flags; |
2884 | #if 1 | 2889 | #if 1 |
2885 | Scsi_Cmnd *connected, *disconnected_queue; | 2890 | struct scsi_cmnd *connected, *disconnected_queue; |
2886 | #endif | 2891 | #endif |
2887 | 2892 | ||
2888 | 2893 | ||
@@ -2914,9 +2919,9 @@ static int NCR5380_bus_reset( Scsi_Cmnd *cmd) | |||
2914 | * remembered in local variables first. | 2919 | * remembered in local variables first. |
2915 | */ | 2920 | */ |
2916 | local_irq_save(flags); | 2921 | local_irq_save(flags); |
2917 | connected = (Scsi_Cmnd *)hostdata->connected; | 2922 | connected = (struct scsi_cmnd *)hostdata->connected; |
2918 | hostdata->connected = NULL; | 2923 | hostdata->connected = NULL; |
2919 | disconnected_queue = (Scsi_Cmnd *)hostdata->disconnected_queue; | 2924 | disconnected_queue = (struct scsi_cmnd *)hostdata->disconnected_queue; |
2920 | hostdata->disconnected_queue = NULL; | 2925 | hostdata->disconnected_queue = NULL; |
2921 | #ifdef SUPPORT_TAGS | 2926 | #ifdef SUPPORT_TAGS |
2922 | free_all_tags(); | 2927 | free_all_tags(); |
diff --git a/drivers/scsi/sun3_scsi.c b/drivers/scsi/sun3_scsi.c index e625b4c5833a..d56d85dd9ba0 100644 --- a/drivers/scsi/sun3_scsi.c +++ b/drivers/scsi/sun3_scsi.c | |||
@@ -119,7 +119,7 @@ module_param(setup_use_tagged_queuing, int, 0); | |||
119 | static int setup_hostid = -1; | 119 | static int setup_hostid = -1; |
120 | module_param(setup_hostid, int, 0); | 120 | module_param(setup_hostid, int, 0); |
121 | 121 | ||
122 | static Scsi_Cmnd *sun3_dma_setup_done = NULL; | 122 | static struct scsi_cmnd *sun3_dma_setup_done = NULL; |
123 | 123 | ||
124 | #define AFTER_RESET_DELAY (HZ/2) | 124 | #define AFTER_RESET_DELAY (HZ/2) |
125 | 125 | ||
@@ -521,8 +521,9 @@ static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance) | |||
521 | return last_residual; | 521 | return last_residual; |
522 | } | 522 | } |
523 | 523 | ||
524 | static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, Scsi_Cmnd *cmd, | 524 | static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, |
525 | int write_flag) | 525 | struct scsi_cmnd *cmd, |
526 | int write_flag) | ||
526 | { | 527 | { |
527 | if(blk_fs_request(cmd->request)) | 528 | if(blk_fs_request(cmd->request)) |
528 | return wanted; | 529 | return wanted; |
diff --git a/drivers/scsi/sun3_scsi.h b/drivers/scsi/sun3_scsi.h index 834dab428019..a1103b3e2034 100644 --- a/drivers/scsi/sun3_scsi.h +++ b/drivers/scsi/sun3_scsi.h | |||
@@ -47,11 +47,12 @@ | |||
47 | 47 | ||
48 | #define IOBASE_SUN3_VMESCSI 0xff200000 | 48 | #define IOBASE_SUN3_VMESCSI 0xff200000 |
49 | 49 | ||
50 | static int sun3scsi_abort (Scsi_Cmnd *); | 50 | static int sun3scsi_abort(struct scsi_cmnd *); |
51 | static int sun3scsi_detect (struct scsi_host_template *); | 51 | static int sun3scsi_detect (struct scsi_host_template *); |
52 | static const char *sun3scsi_info (struct Scsi_Host *); | 52 | static const char *sun3scsi_info (struct Scsi_Host *); |
53 | static int sun3scsi_bus_reset(Scsi_Cmnd *); | 53 | static int sun3scsi_bus_reset(struct scsi_cmnd *); |
54 | static int sun3scsi_queue_command (Scsi_Cmnd *, void (*done)(Scsi_Cmnd *)); | 54 | static int sun3scsi_queue_command(struct scsi_cmnd *, |
55 | void (*done)(struct scsi_cmnd *)); | ||
55 | static int sun3scsi_release (struct Scsi_Host *); | 56 | static int sun3scsi_release (struct Scsi_Host *); |
56 | 57 | ||
57 | #ifndef CMD_PER_LUN | 58 | #ifndef CMD_PER_LUN |
diff --git a/drivers/scsi/sun3_scsi_vme.c b/drivers/scsi/sun3_scsi_vme.c index e8faab16567b..92def310a84c 100644 --- a/drivers/scsi/sun3_scsi_vme.c +++ b/drivers/scsi/sun3_scsi_vme.c | |||
@@ -84,7 +84,7 @@ module_param(setup_use_tagged_queuing, int, 0); | |||
84 | static int setup_hostid = -1; | 84 | static int setup_hostid = -1; |
85 | module_param(setup_hostid, int, 0); | 85 | module_param(setup_hostid, int, 0); |
86 | 86 | ||
87 | static Scsi_Cmnd *sun3_dma_setup_done = NULL; | 87 | static struct scsi_cmnd *sun3_dma_setup_done = NULL; |
88 | 88 | ||
89 | #define AFTER_RESET_DELAY (HZ/2) | 89 | #define AFTER_RESET_DELAY (HZ/2) |
90 | 90 | ||
@@ -455,8 +455,9 @@ static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance) | |||
455 | return last_residual; | 455 | return last_residual; |
456 | } | 456 | } |
457 | 457 | ||
458 | static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, Scsi_Cmnd *cmd, | 458 | static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, |
459 | int write_flag) | 459 | struct scsi_cmnd *cmd, |
460 | int write_flag) | ||
460 | { | 461 | { |
461 | if(blk_fs_request(cmd->request)) | 462 | if(blk_fs_request(cmd->request)) |
462 | return wanted; | 463 | return wanted; |
diff --git a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c index d03aa6ce8fe8..fa5382e354be 100644 --- a/drivers/scsi/tmscsim.c +++ b/drivers/scsi/tmscsim.c | |||
@@ -2304,6 +2304,7 @@ static struct scsi_host_template driver_template = { | |||
2304 | .sg_tablesize = SG_ALL, | 2304 | .sg_tablesize = SG_ALL, |
2305 | .cmd_per_lun = 1, | 2305 | .cmd_per_lun = 1, |
2306 | .use_clustering = ENABLE_CLUSTERING, | 2306 | .use_clustering = ENABLE_CLUSTERING, |
2307 | .max_sectors = 0x4000, /* 8MiB = 16 * 1024 * 512 */ | ||
2307 | }; | 2308 | }; |
2308 | 2309 | ||
2309 | /*********************************************************************** | 2310 | /*********************************************************************** |
diff --git a/drivers/video/backlight/corgi_bl.c b/drivers/video/backlight/corgi_bl.c index 2ebbfd95145f..d07ecb53c68b 100644 --- a/drivers/video/backlight/corgi_bl.c +++ b/drivers/video/backlight/corgi_bl.c | |||
@@ -111,7 +111,7 @@ static struct backlight_properties corgibl_data = { | |||
111 | .update_status = corgibl_set_intensity, | 111 | .update_status = corgibl_set_intensity, |
112 | }; | 112 | }; |
113 | 113 | ||
114 | static int __init corgibl_probe(struct platform_device *pdev) | 114 | static int corgibl_probe(struct platform_device *pdev) |
115 | { | 115 | { |
116 | struct corgibl_machinfo *machinfo = pdev->dev.platform_data; | 116 | struct corgibl_machinfo *machinfo = pdev->dev.platform_data; |
117 | 117 | ||
@@ -166,4 +166,4 @@ module_exit(corgibl_exit); | |||
166 | 166 | ||
167 | MODULE_AUTHOR("Richard Purdie <rpurdie@rpsys.net>"); | 167 | MODULE_AUTHOR("Richard Purdie <rpurdie@rpsys.net>"); |
168 | MODULE_DESCRIPTION("Corgi Backlight Driver"); | 168 | MODULE_DESCRIPTION("Corgi Backlight Driver"); |
169 | MODULE_LICENSE("GPLv2"); | 169 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/video/intelfb/intelfbhw.c b/drivers/video/intelfb/intelfbhw.c index eeeeff9a09eb..a95836839e1e 100644 --- a/drivers/video/intelfb/intelfbhw.c +++ b/drivers/video/intelfb/intelfbhw.c | |||
@@ -161,7 +161,7 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size, | |||
161 | return 1; | 161 | return 1; |
162 | 162 | ||
163 | /* Find the bridge device. It is always 0:0.0 */ | 163 | /* Find the bridge device. It is always 0:0.0 */ |
164 | if (!(bridge_dev = pci_find_slot(0, PCI_DEVFN(0, 0)))) { | 164 | if (!(bridge_dev = pci_get_bus_and_slot(0, PCI_DEVFN(0, 0)))) { |
165 | ERR_MSG("cannot find bridge device\n"); | 165 | ERR_MSG("cannot find bridge device\n"); |
166 | return 1; | 166 | return 1; |
167 | } | 167 | } |
@@ -169,6 +169,8 @@ intelfbhw_get_memory(struct pci_dev *pdev, int *aperture_size, | |||
169 | /* Get the fb aperture size and "stolen" memory amount. */ | 169 | /* Get the fb aperture size and "stolen" memory amount. */ |
170 | tmp = 0; | 170 | tmp = 0; |
171 | pci_read_config_word(bridge_dev, INTEL_GMCH_CTRL, &tmp); | 171 | pci_read_config_word(bridge_dev, INTEL_GMCH_CTRL, &tmp); |
172 | pci_dev_put(bridge_dev); | ||
173 | |||
172 | switch (pdev->device) { | 174 | switch (pdev->device) { |
173 | case PCI_DEVICE_ID_INTEL_915G: | 175 | case PCI_DEVICE_ID_INTEL_915G: |
174 | case PCI_DEVICE_ID_INTEL_915GM: | 176 | case PCI_DEVICE_ID_INTEL_915GM: |
@@ -662,7 +664,7 @@ intelfbhw_print_hw_state(struct intelfb_info *dinfo, struct intelfb_hwstate *hw) | |||
662 | int index = dinfo->pll_index; | 664 | int index = dinfo->pll_index; |
663 | DBG_MSG("intelfbhw_print_hw_state\n"); | 665 | DBG_MSG("intelfbhw_print_hw_state\n"); |
664 | 666 | ||
665 | if (!hw || !dinfo) | 667 | if (!hw) |
666 | return; | 668 | return; |
667 | /* Read in as much of the HW state as possible. */ | 669 | /* Read in as much of the HW state as possible. */ |
668 | printk("hw state dump start\n"); | 670 | printk("hw state dump start\n"); |
diff --git a/fs/Kconfig b/fs/Kconfig index fee318e6f4bb..133dcc8a4150 100644 --- a/fs/Kconfig +++ b/fs/Kconfig | |||
@@ -1777,6 +1777,7 @@ config RPCSEC_GSS_KRB5 | |||
1777 | select CRYPTO | 1777 | select CRYPTO |
1778 | select CRYPTO_MD5 | 1778 | select CRYPTO_MD5 |
1779 | select CRYPTO_DES | 1779 | select CRYPTO_DES |
1780 | select CRYPTO_CBC | ||
1780 | help | 1781 | help |
1781 | Provides for secure RPC calls by means of a gss-api | 1782 | Provides for secure RPC calls by means of a gss-api |
1782 | mechanism based on Kerberos V5. This is required for | 1783 | mechanism based on Kerberos V5. This is required for |
@@ -1795,6 +1796,7 @@ config RPCSEC_GSS_SPKM3 | |||
1795 | select CRYPTO_MD5 | 1796 | select CRYPTO_MD5 |
1796 | select CRYPTO_DES | 1797 | select CRYPTO_DES |
1797 | select CRYPTO_CAST5 | 1798 | select CRYPTO_CAST5 |
1799 | select CRYPTO_CBC | ||
1798 | help | 1800 | help |
1799 | Provides for secure RPC calls by means of a gss-api | 1801 | Provides for secure RPC calls by means of a gss-api |
1800 | mechanism based on the SPKM3 public-key mechanism. | 1802 | mechanism based on the SPKM3 public-key mechanism. |
diff --git a/fs/block_dev.c b/fs/block_dev.c index bc8f27cc4483..702b88cbd91d 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -1131,6 +1131,8 @@ static int blkdev_open(struct inode * inode, struct file * filp) | |||
1131 | filp->f_flags |= O_LARGEFILE; | 1131 | filp->f_flags |= O_LARGEFILE; |
1132 | 1132 | ||
1133 | bdev = bd_acquire(inode); | 1133 | bdev = bd_acquire(inode); |
1134 | if (bdev == NULL) | ||
1135 | return -ENOMEM; | ||
1134 | 1136 | ||
1135 | res = do_open(bdev, filp, BD_MUTEX_NORMAL); | 1137 | res = do_open(bdev, filp, BD_MUTEX_NORMAL); |
1136 | if (res) | 1138 | if (res) |
diff --git a/fs/dcache.c b/fs/dcache.c index a1ff91eef108..fd4a428998ef 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -478,11 +478,12 @@ static void prune_dcache(int count, struct super_block *sb) | |||
478 | up_read(s_umount); | 478 | up_read(s_umount); |
479 | } | 479 | } |
480 | spin_unlock(&dentry->d_lock); | 480 | spin_unlock(&dentry->d_lock); |
481 | /* Cannot remove the first dentry, and it isn't appropriate | 481 | /* |
482 | * to move it to the head of the list, so give up, and try | 482 | * Insert dentry at the head of the list as inserting at the |
483 | * later | 483 | * tail leads to a cycle. |
484 | */ | 484 | */ |
485 | break; | 485 | list_add(&dentry->d_lru, &dentry_unused); |
486 | dentry_stat.nr_unused++; | ||
486 | } | 487 | } |
487 | spin_unlock(&dcache_lock); | 488 | spin_unlock(&dcache_lock); |
488 | } | 489 | } |
@@ -556,6 +557,7 @@ repeat: | |||
556 | static void shrink_dcache_for_umount_subtree(struct dentry *dentry) | 557 | static void shrink_dcache_for_umount_subtree(struct dentry *dentry) |
557 | { | 558 | { |
558 | struct dentry *parent; | 559 | struct dentry *parent; |
560 | unsigned detached = 0; | ||
559 | 561 | ||
560 | BUG_ON(!IS_ROOT(dentry)); | 562 | BUG_ON(!IS_ROOT(dentry)); |
561 | 563 | ||
@@ -620,7 +622,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) | |||
620 | atomic_dec(&parent->d_count); | 622 | atomic_dec(&parent->d_count); |
621 | 623 | ||
622 | list_del(&dentry->d_u.d_child); | 624 | list_del(&dentry->d_u.d_child); |
623 | dentry_stat.nr_dentry--; /* For d_free, below */ | 625 | detached++; |
624 | 626 | ||
625 | inode = dentry->d_inode; | 627 | inode = dentry->d_inode; |
626 | if (inode) { | 628 | if (inode) { |
@@ -638,7 +640,7 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) | |||
638 | * otherwise we ascend to the parent and move to the | 640 | * otherwise we ascend to the parent and move to the |
639 | * next sibling if there is one */ | 641 | * next sibling if there is one */ |
640 | if (!parent) | 642 | if (!parent) |
641 | return; | 643 | goto out; |
642 | 644 | ||
643 | dentry = parent; | 645 | dentry = parent; |
644 | 646 | ||
@@ -647,6 +649,11 @@ static void shrink_dcache_for_umount_subtree(struct dentry *dentry) | |||
647 | dentry = list_entry(dentry->d_subdirs.next, | 649 | dentry = list_entry(dentry->d_subdirs.next, |
648 | struct dentry, d_u.d_child); | 650 | struct dentry, d_u.d_child); |
649 | } | 651 | } |
652 | out: | ||
653 | /* several dentries were freed, need to correct nr_dentry */ | ||
654 | spin_lock(&dcache_lock); | ||
655 | dentry_stat.nr_dentry -= detached; | ||
656 | spin_unlock(&dcache_lock); | ||
650 | } | 657 | } |
651 | 658 | ||
652 | /* | 659 | /* |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 1e9578052cd3..4fe49c3661b2 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -69,44 +69,49 @@ static int verify_group_input(struct super_block *sb, | |||
69 | else if (outside(input->block_bitmap, start, end)) | 69 | else if (outside(input->block_bitmap, start, end)) |
70 | ext4_warning(sb, __FUNCTION__, | 70 | ext4_warning(sb, __FUNCTION__, |
71 | "Block bitmap not in group (block %llu)", | 71 | "Block bitmap not in group (block %llu)", |
72 | input->block_bitmap); | 72 | (unsigned long long)input->block_bitmap); |
73 | else if (outside(input->inode_bitmap, start, end)) | 73 | else if (outside(input->inode_bitmap, start, end)) |
74 | ext4_warning(sb, __FUNCTION__, | 74 | ext4_warning(sb, __FUNCTION__, |
75 | "Inode bitmap not in group (block %llu)", | 75 | "Inode bitmap not in group (block %llu)", |
76 | input->inode_bitmap); | 76 | (unsigned long long)input->inode_bitmap); |
77 | else if (outside(input->inode_table, start, end) || | 77 | else if (outside(input->inode_table, start, end) || |
78 | outside(itend - 1, start, end)) | 78 | outside(itend - 1, start, end)) |
79 | ext4_warning(sb, __FUNCTION__, | 79 | ext4_warning(sb, __FUNCTION__, |
80 | "Inode table not in group (blocks %llu-%llu)", | 80 | "Inode table not in group (blocks %llu-%llu)", |
81 | input->inode_table, itend - 1); | 81 | (unsigned long long)input->inode_table, itend - 1); |
82 | else if (input->inode_bitmap == input->block_bitmap) | 82 | else if (input->inode_bitmap == input->block_bitmap) |
83 | ext4_warning(sb, __FUNCTION__, | 83 | ext4_warning(sb, __FUNCTION__, |
84 | "Block bitmap same as inode bitmap (%llu)", | 84 | "Block bitmap same as inode bitmap (%llu)", |
85 | input->block_bitmap); | 85 | (unsigned long long)input->block_bitmap); |
86 | else if (inside(input->block_bitmap, input->inode_table, itend)) | 86 | else if (inside(input->block_bitmap, input->inode_table, itend)) |
87 | ext4_warning(sb, __FUNCTION__, | 87 | ext4_warning(sb, __FUNCTION__, |
88 | "Block bitmap (%llu) in inode table (%llu-%llu)", | 88 | "Block bitmap (%llu) in inode table (%llu-%llu)", |
89 | input->block_bitmap, input->inode_table, itend-1); | 89 | (unsigned long long)input->block_bitmap, |
90 | (unsigned long long)input->inode_table, itend - 1); | ||
90 | else if (inside(input->inode_bitmap, input->inode_table, itend)) | 91 | else if (inside(input->inode_bitmap, input->inode_table, itend)) |
91 | ext4_warning(sb, __FUNCTION__, | 92 | ext4_warning(sb, __FUNCTION__, |
92 | "Inode bitmap (%llu) in inode table (%llu-%llu)", | 93 | "Inode bitmap (%llu) in inode table (%llu-%llu)", |
93 | input->inode_bitmap, input->inode_table, itend-1); | 94 | (unsigned long long)input->inode_bitmap, |
95 | (unsigned long long)input->inode_table, itend - 1); | ||
94 | else if (inside(input->block_bitmap, start, metaend)) | 96 | else if (inside(input->block_bitmap, start, metaend)) |
95 | ext4_warning(sb, __FUNCTION__, | 97 | ext4_warning(sb, __FUNCTION__, |
96 | "Block bitmap (%llu) in GDT table" | 98 | "Block bitmap (%llu) in GDT table" |
97 | " (%llu-%llu)", | 99 | " (%llu-%llu)", |
98 | input->block_bitmap, start, metaend - 1); | 100 | (unsigned long long)input->block_bitmap, |
101 | start, metaend - 1); | ||
99 | else if (inside(input->inode_bitmap, start, metaend)) | 102 | else if (inside(input->inode_bitmap, start, metaend)) |
100 | ext4_warning(sb, __FUNCTION__, | 103 | ext4_warning(sb, __FUNCTION__, |
101 | "Inode bitmap (%llu) in GDT table" | 104 | "Inode bitmap (%llu) in GDT table" |
102 | " (%llu-%llu)", | 105 | " (%llu-%llu)", |
103 | input->inode_bitmap, start, metaend - 1); | 106 | (unsigned long long)input->inode_bitmap, |
107 | start, metaend - 1); | ||
104 | else if (inside(input->inode_table, start, metaend) || | 108 | else if (inside(input->inode_table, start, metaend) || |
105 | inside(itend - 1, start, metaend)) | 109 | inside(itend - 1, start, metaend)) |
106 | ext4_warning(sb, __FUNCTION__, | 110 | ext4_warning(sb, __FUNCTION__, |
107 | "Inode table (%llu-%llu) overlaps" | 111 | "Inode table (%llu-%llu) overlaps" |
108 | "GDT table (%llu-%llu)", | 112 | "GDT table (%llu-%llu)", |
109 | input->inode_table, itend - 1, start, metaend - 1); | 113 | (unsigned long long)input->inode_table, |
114 | itend - 1, start, metaend - 1); | ||
110 | else | 115 | else |
111 | err = 0; | 116 | err = 0; |
112 | brelse(bh); | 117 | brelse(bh); |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 4ee3f006b861..0bea6a619e10 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -271,26 +271,24 @@ static void hugetlbfs_drop_inode(struct inode *inode) | |||
271 | hugetlbfs_forget_inode(inode); | 271 | hugetlbfs_forget_inode(inode); |
272 | } | 272 | } |
273 | 273 | ||
274 | /* | ||
275 | * h_pgoff is in HPAGE_SIZE units. | ||
276 | * vma->vm_pgoff is in PAGE_SIZE units. | ||
277 | */ | ||
278 | static inline void | 274 | static inline void |
279 | hugetlb_vmtruncate_list(struct prio_tree_root *root, unsigned long h_pgoff) | 275 | hugetlb_vmtruncate_list(struct prio_tree_root *root, pgoff_t pgoff) |
280 | { | 276 | { |
281 | struct vm_area_struct *vma; | 277 | struct vm_area_struct *vma; |
282 | struct prio_tree_iter iter; | 278 | struct prio_tree_iter iter; |
283 | 279 | ||
284 | vma_prio_tree_foreach(vma, &iter, root, h_pgoff, ULONG_MAX) { | 280 | vma_prio_tree_foreach(vma, &iter, root, pgoff, ULONG_MAX) { |
285 | unsigned long h_vm_pgoff; | ||
286 | unsigned long v_offset; | 281 | unsigned long v_offset; |
287 | 282 | ||
288 | h_vm_pgoff = vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT); | ||
289 | v_offset = (h_pgoff - h_vm_pgoff) << HPAGE_SHIFT; | ||
290 | /* | 283 | /* |
291 | * Is this VMA fully outside the truncation point? | 284 | * Can the expression below overflow on 32-bit arches? |
285 | * No, because the prio_tree returns us only those vmas | ||
286 | * which overlap the truncated area starting at pgoff, | ||
287 | * and no vma on a 32-bit arch can span beyond the 4GB. | ||
292 | */ | 288 | */ |
293 | if (h_vm_pgoff >= h_pgoff) | 289 | if (vma->vm_pgoff < pgoff) |
290 | v_offset = (pgoff - vma->vm_pgoff) << PAGE_SHIFT; | ||
291 | else | ||
294 | v_offset = 0; | 292 | v_offset = 0; |
295 | 293 | ||
296 | __unmap_hugepage_range(vma, | 294 | __unmap_hugepage_range(vma, |
@@ -303,14 +301,14 @@ hugetlb_vmtruncate_list(struct prio_tree_root *root, unsigned long h_pgoff) | |||
303 | */ | 301 | */ |
304 | static int hugetlb_vmtruncate(struct inode *inode, loff_t offset) | 302 | static int hugetlb_vmtruncate(struct inode *inode, loff_t offset) |
305 | { | 303 | { |
306 | unsigned long pgoff; | 304 | pgoff_t pgoff; |
307 | struct address_space *mapping = inode->i_mapping; | 305 | struct address_space *mapping = inode->i_mapping; |
308 | 306 | ||
309 | if (offset > inode->i_size) | 307 | if (offset > inode->i_size) |
310 | return -EINVAL; | 308 | return -EINVAL; |
311 | 309 | ||
312 | BUG_ON(offset & ~HPAGE_MASK); | 310 | BUG_ON(offset & ~HPAGE_MASK); |
313 | pgoff = offset >> HPAGE_SHIFT; | 311 | pgoff = offset >> PAGE_SHIFT; |
314 | 312 | ||
315 | inode->i_size = offset; | 313 | inode->i_size = offset; |
316 | spin_lock(&mapping->i_mmap_lock); | 314 | spin_lock(&mapping->i_mmap_lock); |
@@ -624,7 +622,6 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig) | |||
624 | do_div(size, 100); | 622 | do_div(size, 100); |
625 | rest++; | 623 | rest++; |
626 | } | 624 | } |
627 | size &= HPAGE_MASK; | ||
628 | pconfig->nr_blocks = (size >> HPAGE_SHIFT); | 625 | pconfig->nr_blocks = (size >> HPAGE_SHIFT); |
629 | value = rest; | 626 | value = rest; |
630 | } else if (!strcmp(opt,"nr_inodes")) { | 627 | } else if (!strcmp(opt,"nr_inodes")) { |
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index d5c63047a8b3..4f82bcd63e48 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
@@ -967,6 +967,13 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
967 | */ | 967 | */ |
968 | jbd_lock_bh_state(bh); | 968 | jbd_lock_bh_state(bh); |
969 | spin_lock(&journal->j_list_lock); | 969 | spin_lock(&journal->j_list_lock); |
970 | |||
971 | /* Now that we have bh_state locked, are we really still mapped? */ | ||
972 | if (!buffer_mapped(bh)) { | ||
973 | JBUFFER_TRACE(jh, "unmapped buffer, bailing out"); | ||
974 | goto no_journal; | ||
975 | } | ||
976 | |||
970 | if (jh->b_transaction) { | 977 | if (jh->b_transaction) { |
971 | JBUFFER_TRACE(jh, "has transaction"); | 978 | JBUFFER_TRACE(jh, "has transaction"); |
972 | if (jh->b_transaction != handle->h_transaction) { | 979 | if (jh->b_transaction != handle->h_transaction) { |
@@ -1028,6 +1035,11 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
1028 | sync_dirty_buffer(bh); | 1035 | sync_dirty_buffer(bh); |
1029 | jbd_lock_bh_state(bh); | 1036 | jbd_lock_bh_state(bh); |
1030 | spin_lock(&journal->j_list_lock); | 1037 | spin_lock(&journal->j_list_lock); |
1038 | /* Since we dropped the lock... */ | ||
1039 | if (!buffer_mapped(bh)) { | ||
1040 | JBUFFER_TRACE(jh, "buffer got unmapped"); | ||
1041 | goto no_journal; | ||
1042 | } | ||
1031 | /* The buffer may become locked again at any | 1043 | /* The buffer may become locked again at any |
1032 | time if it is redirtied */ | 1044 | time if it is redirtied */ |
1033 | } | 1045 | } |
@@ -1824,6 +1836,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1824 | } | 1836 | } |
1825 | } | 1837 | } |
1826 | } else if (transaction == journal->j_committing_transaction) { | 1838 | } else if (transaction == journal->j_committing_transaction) { |
1839 | JBUFFER_TRACE(jh, "on committing transaction"); | ||
1827 | if (jh->b_jlist == BJ_Locked) { | 1840 | if (jh->b_jlist == BJ_Locked) { |
1828 | /* | 1841 | /* |
1829 | * The buffer is on the committing transaction's locked | 1842 | * The buffer is on the committing transaction's locked |
@@ -1838,7 +1851,6 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1838 | * can remove it's next_transaction pointer from the | 1851 | * can remove it's next_transaction pointer from the |
1839 | * running transaction if that is set, but nothing | 1852 | * running transaction if that is set, but nothing |
1840 | * else. */ | 1853 | * else. */ |
1841 | JBUFFER_TRACE(jh, "on committing transaction"); | ||
1842 | set_buffer_freed(bh); | 1854 | set_buffer_freed(bh); |
1843 | if (jh->b_next_transaction) { | 1855 | if (jh->b_next_transaction) { |
1844 | J_ASSERT(jh->b_next_transaction == | 1856 | J_ASSERT(jh->b_next_transaction == |
@@ -1858,6 +1870,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1858 | * i_size already for this truncate so recovery will not | 1870 | * i_size already for this truncate so recovery will not |
1859 | * expose the disk blocks we are discarding here.) */ | 1871 | * expose the disk blocks we are discarding here.) */ |
1860 | J_ASSERT_JH(jh, transaction == journal->j_running_transaction); | 1872 | J_ASSERT_JH(jh, transaction == journal->j_running_transaction); |
1873 | JBUFFER_TRACE(jh, "on running transaction"); | ||
1861 | may_free = __dispose_buffer(jh, transaction); | 1874 | may_free = __dispose_buffer(jh, transaction); |
1862 | } | 1875 | } |
1863 | 1876 | ||
diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c index b6cf2be845a1..c051a94c8a97 100644 --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c | |||
@@ -967,6 +967,13 @@ int jbd2_journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
967 | */ | 967 | */ |
968 | jbd_lock_bh_state(bh); | 968 | jbd_lock_bh_state(bh); |
969 | spin_lock(&journal->j_list_lock); | 969 | spin_lock(&journal->j_list_lock); |
970 | |||
971 | /* Now that we have bh_state locked, are we really still mapped? */ | ||
972 | if (!buffer_mapped(bh)) { | ||
973 | JBUFFER_TRACE(jh, "unmapped buffer, bailing out"); | ||
974 | goto no_journal; | ||
975 | } | ||
976 | |||
970 | if (jh->b_transaction) { | 977 | if (jh->b_transaction) { |
971 | JBUFFER_TRACE(jh, "has transaction"); | 978 | JBUFFER_TRACE(jh, "has transaction"); |
972 | if (jh->b_transaction != handle->h_transaction) { | 979 | if (jh->b_transaction != handle->h_transaction) { |
@@ -1028,6 +1035,11 @@ int jbd2_journal_dirty_data(handle_t *handle, struct buffer_head *bh) | |||
1028 | sync_dirty_buffer(bh); | 1035 | sync_dirty_buffer(bh); |
1029 | jbd_lock_bh_state(bh); | 1036 | jbd_lock_bh_state(bh); |
1030 | spin_lock(&journal->j_list_lock); | 1037 | spin_lock(&journal->j_list_lock); |
1038 | /* Since we dropped the lock... */ | ||
1039 | if (!buffer_mapped(bh)) { | ||
1040 | JBUFFER_TRACE(jh, "buffer got unmapped"); | ||
1041 | goto no_journal; | ||
1042 | } | ||
1031 | /* The buffer may become locked again at any | 1043 | /* The buffer may become locked again at any |
1032 | time if it is redirtied */ | 1044 | time if it is redirtied */ |
1033 | } | 1045 | } |
@@ -1824,6 +1836,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1824 | } | 1836 | } |
1825 | } | 1837 | } |
1826 | } else if (transaction == journal->j_committing_transaction) { | 1838 | } else if (transaction == journal->j_committing_transaction) { |
1839 | JBUFFER_TRACE(jh, "on committing transaction"); | ||
1827 | if (jh->b_jlist == BJ_Locked) { | 1840 | if (jh->b_jlist == BJ_Locked) { |
1828 | /* | 1841 | /* |
1829 | * The buffer is on the committing transaction's locked | 1842 | * The buffer is on the committing transaction's locked |
@@ -1838,7 +1851,6 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1838 | * can remove it's next_transaction pointer from the | 1851 | * can remove it's next_transaction pointer from the |
1839 | * running transaction if that is set, but nothing | 1852 | * running transaction if that is set, but nothing |
1840 | * else. */ | 1853 | * else. */ |
1841 | JBUFFER_TRACE(jh, "on committing transaction"); | ||
1842 | set_buffer_freed(bh); | 1854 | set_buffer_freed(bh); |
1843 | if (jh->b_next_transaction) { | 1855 | if (jh->b_next_transaction) { |
1844 | J_ASSERT(jh->b_next_transaction == | 1856 | J_ASSERT(jh->b_next_transaction == |
@@ -1858,6 +1870,7 @@ static int journal_unmap_buffer(journal_t *journal, struct buffer_head *bh) | |||
1858 | * i_size already for this truncate so recovery will not | 1870 | * i_size already for this truncate so recovery will not |
1859 | * expose the disk blocks we are discarding here.) */ | 1871 | * expose the disk blocks we are discarding here.) */ |
1860 | J_ASSERT_JH(jh, transaction == journal->j_running_transaction); | 1872 | J_ASSERT_JH(jh, transaction == journal->j_running_transaction); |
1873 | JBUFFER_TRACE(jh, "on running transaction"); | ||
1861 | may_free = __dispose_buffer(jh, transaction); | 1874 | may_free = __dispose_buffer(jh, transaction); |
1862 | } | 1875 | } |
1863 | 1876 | ||
diff --git a/fs/splice.c b/fs/splice.c index 49fb9f129938..8d705954d294 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -74,7 +74,7 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe, | |||
74 | wait_on_page_writeback(page); | 74 | wait_on_page_writeback(page); |
75 | 75 | ||
76 | if (PagePrivate(page)) | 76 | if (PagePrivate(page)) |
77 | try_to_release_page(page, mapping_gfp_mask(mapping)); | 77 | try_to_release_page(page, GFP_KERNEL); |
78 | 78 | ||
79 | /* | 79 | /* |
80 | * If we succeeded in removing the mapping, set LRU flag | 80 | * If we succeeded in removing the mapping, set LRU flag |
@@ -333,7 +333,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos, | |||
333 | break; | 333 | break; |
334 | 334 | ||
335 | error = add_to_page_cache_lru(page, mapping, index, | 335 | error = add_to_page_cache_lru(page, mapping, index, |
336 | mapping_gfp_mask(mapping)); | 336 | GFP_KERNEL); |
337 | if (unlikely(error)) { | 337 | if (unlikely(error)) { |
338 | page_cache_release(page); | 338 | page_cache_release(page); |
339 | if (error == -EEXIST) | 339 | if (error == -EEXIST) |
@@ -557,7 +557,6 @@ static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
557 | { | 557 | { |
558 | struct file *file = sd->file; | 558 | struct file *file = sd->file; |
559 | struct address_space *mapping = file->f_mapping; | 559 | struct address_space *mapping = file->f_mapping; |
560 | gfp_t gfp_mask = mapping_gfp_mask(mapping); | ||
561 | unsigned int offset, this_len; | 560 | unsigned int offset, this_len; |
562 | struct page *page; | 561 | struct page *page; |
563 | pgoff_t index; | 562 | pgoff_t index; |
@@ -591,7 +590,7 @@ static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf, | |||
591 | goto find_page; | 590 | goto find_page; |
592 | 591 | ||
593 | page = buf->page; | 592 | page = buf->page; |
594 | if (add_to_page_cache(page, mapping, index, gfp_mask)) { | 593 | if (add_to_page_cache(page, mapping, index, GFP_KERNEL)) { |
595 | unlock_page(page); | 594 | unlock_page(page); |
596 | goto find_page; | 595 | goto find_page; |
597 | } | 596 | } |
@@ -613,7 +612,7 @@ find_page: | |||
613 | * This will also lock the page | 612 | * This will also lock the page |
614 | */ | 613 | */ |
615 | ret = add_to_page_cache_lru(page, mapping, index, | 614 | ret = add_to_page_cache_lru(page, mapping, index, |
616 | gfp_mask); | 615 | GFP_KERNEL); |
617 | if (unlikely(ret)) | 616 | if (unlikely(ret)) |
618 | goto out; | 617 | goto out; |
619 | } | 618 | } |
diff --git a/include/asm-arm/arch-pxa/irqs.h b/include/asm-arm/arch-pxa/irqs.h index f3bc70eee35b..67ed43674c63 100644 --- a/include/asm-arm/arch-pxa/irqs.h +++ b/include/asm-arm/arch-pxa/irqs.h | |||
@@ -73,7 +73,7 @@ | |||
73 | #define IRQ_TO_GPIO(i) (((i) < IRQ_GPIO(2)) ? ((i) - IRQ_GPIO0) : IRQ_TO_GPIO_2_x(i)) | 73 | #define IRQ_TO_GPIO(i) (((i) < IRQ_GPIO(2)) ? ((i) - IRQ_GPIO0) : IRQ_TO_GPIO_2_x(i)) |
74 | 74 | ||
75 | #if defined(CONFIG_PXA25x) | 75 | #if defined(CONFIG_PXA25x) |
76 | #define PXA_LAST_GPIO 80 | 76 | #define PXA_LAST_GPIO 84 |
77 | #elif defined(CONFIG_PXA27x) | 77 | #elif defined(CONFIG_PXA27x) |
78 | #define PXA_LAST_GPIO 127 | 78 | #define PXA_LAST_GPIO 127 |
79 | #endif | 79 | #endif |
diff --git a/include/asm-avr32/atomic.h b/include/asm-avr32/atomic.h index e0b9c44c126c..c40b6032c480 100644 --- a/include/asm-avr32/atomic.h +++ b/include/asm-avr32/atomic.h | |||
@@ -41,7 +41,7 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
41 | " stcond %1, %0\n" | 41 | " stcond %1, %0\n" |
42 | " brne 1b" | 42 | " brne 1b" |
43 | : "=&r"(result), "=o"(v->counter) | 43 | : "=&r"(result), "=o"(v->counter) |
44 | : "m"(v->counter), "ir"(i) | 44 | : "m"(v->counter), "rKs21"(i) |
45 | : "cc"); | 45 | : "cc"); |
46 | 46 | ||
47 | return result; | 47 | return result; |
@@ -58,7 +58,7 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
58 | { | 58 | { |
59 | int result; | 59 | int result; |
60 | 60 | ||
61 | if (__builtin_constant_p(i)) | 61 | if (__builtin_constant_p(i) && (i >= -1048575) && (i <= 1048576)) |
62 | result = atomic_sub_return(-i, v); | 62 | result = atomic_sub_return(-i, v); |
63 | else | 63 | else |
64 | asm volatile( | 64 | asm volatile( |
@@ -101,7 +101,7 @@ static inline int atomic_sub_unless(atomic_t *v, int a, int u) | |||
101 | " mov %1, 1\n" | 101 | " mov %1, 1\n" |
102 | "1:" | 102 | "1:" |
103 | : "=&r"(tmp), "=&r"(result), "=o"(v->counter) | 103 | : "=&r"(tmp), "=&r"(result), "=o"(v->counter) |
104 | : "m"(v->counter), "ir"(a), "ir"(u) | 104 | : "m"(v->counter), "rKs21"(a), "rKs21"(u) |
105 | : "cc", "memory"); | 105 | : "cc", "memory"); |
106 | 106 | ||
107 | return result; | 107 | return result; |
@@ -121,7 +121,7 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) | |||
121 | { | 121 | { |
122 | int tmp, result; | 122 | int tmp, result; |
123 | 123 | ||
124 | if (__builtin_constant_p(a)) | 124 | if (__builtin_constant_p(a) && (a >= -1048575) && (a <= 1048576)) |
125 | result = atomic_sub_unless(v, -a, u); | 125 | result = atomic_sub_unless(v, -a, u); |
126 | else { | 126 | else { |
127 | result = 0; | 127 | result = 0; |
diff --git a/include/asm-avr32/io.h b/include/asm-avr32/io.h index 2fc8f111dce9..eec47500fa66 100644 --- a/include/asm-avr32/io.h +++ b/include/asm-avr32/io.h | |||
@@ -76,6 +76,39 @@ static inline unsigned int readl(const volatile void __iomem *addr) | |||
76 | #define readsw(p, d, l) __raw_readsw((unsigned int)p, d, l) | 76 | #define readsw(p, d, l) __raw_readsw((unsigned int)p, d, l) |
77 | #define readsl(p, d, l) __raw_readsl((unsigned int)p, d, l) | 77 | #define readsl(p, d, l) __raw_readsl((unsigned int)p, d, l) |
78 | 78 | ||
79 | |||
80 | /* | ||
81 | * io{read,write}{8,16,32} macros in both le (for PCI style consumers) and native be | ||
82 | */ | ||
83 | #ifndef ioread8 | ||
84 | |||
85 | #define ioread8(p) ({ unsigned int __v = __raw_readb(p); __v; }) | ||
86 | |||
87 | #define ioread16(p) ({ unsigned int __v = le16_to_cpu(__raw_readw(p)); __v; }) | ||
88 | #define ioread16be(p) ({ unsigned int __v = be16_to_cpu(__raw_readw(p)); __v; }) | ||
89 | |||
90 | #define ioread32(p) ({ unsigned int __v = le32_to_cpu(__raw_readl(p)); __v; }) | ||
91 | #define ioread32be(p) ({ unsigned int __v = be32_to_cpu(__raw_readl(p)); __v; }) | ||
92 | |||
93 | #define iowrite8(v,p) __raw_writeb(v, p) | ||
94 | |||
95 | #define iowrite16(v,p) __raw_writew(cpu_to_le16(v), p) | ||
96 | #define iowrite16be(v,p) __raw_writew(cpu_to_be16(v), p) | ||
97 | |||
98 | #define iowrite32(v,p) __raw_writel(cpu_to_le32(v), p) | ||
99 | #define iowrite32be(v,p) __raw_writel(cpu_to_be32(v), p) | ||
100 | |||
101 | #define ioread8_rep(p,d,c) __raw_readsb(p,d,c) | ||
102 | #define ioread16_rep(p,d,c) __raw_readsw(p,d,c) | ||
103 | #define ioread32_rep(p,d,c) __raw_readsl(p,d,c) | ||
104 | |||
105 | #define iowrite8_rep(p,s,c) __raw_writesb(p,s,c) | ||
106 | #define iowrite16_rep(p,s,c) __raw_writesw(p,s,c) | ||
107 | #define iowrite32_rep(p,s,c) __raw_writesl(p,s,c) | ||
108 | |||
109 | #endif | ||
110 | |||
111 | |||
79 | /* | 112 | /* |
80 | * These two are only here because ALSA _thinks_ it needs them... | 113 | * These two are only here because ALSA _thinks_ it needs them... |
81 | */ | 114 | */ |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 9d0d11c180d9..9d873163a7ab 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
@@ -213,3 +213,20 @@ | |||
213 | 213 | ||
214 | #define NOTES \ | 214 | #define NOTES \ |
215 | .notes : { *(.note.*) } :note | 215 | .notes : { *(.note.*) } :note |
216 | |||
217 | #define INITCALLS \ | ||
218 | *(.initcall1.init) \ | ||
219 | *(.initcall1s.init) \ | ||
220 | *(.initcall2.init) \ | ||
221 | *(.initcall2s.init) \ | ||
222 | *(.initcall3.init) \ | ||
223 | *(.initcall3s.init) \ | ||
224 | *(.initcall4.init) \ | ||
225 | *(.initcall4s.init) \ | ||
226 | *(.initcall5.init) \ | ||
227 | *(.initcall5s.init) \ | ||
228 | *(.initcall6.init) \ | ||
229 | *(.initcall6s.init) \ | ||
230 | *(.initcall7.init) \ | ||
231 | *(.initcall7s.init) | ||
232 | |||
diff --git a/include/asm-i386/mach-visws/do_timer.h b/include/asm-i386/mach-visws/do_timer.h deleted file mode 100644 index 21cd696d4d0f..000000000000 --- a/include/asm-i386/mach-visws/do_timer.h +++ /dev/null | |||
@@ -1,53 +0,0 @@ | |||
1 | /* defines for inline arch setup functions */ | ||
2 | |||
3 | #include <asm/fixmap.h> | ||
4 | #include <asm/i8259.h> | ||
5 | #include "cobalt.h" | ||
6 | |||
7 | static inline void do_timer_interrupt_hook(void) | ||
8 | { | ||
9 | /* Clear the interrupt */ | ||
10 | co_cpu_write(CO_CPU_STAT,co_cpu_read(CO_CPU_STAT) & ~CO_STAT_TIMEINTR); | ||
11 | |||
12 | do_timer(1); | ||
13 | #ifndef CONFIG_SMP | ||
14 | update_process_times(user_mode_vm(irq_regs)); | ||
15 | #endif | ||
16 | /* | ||
17 | * In the SMP case we use the local APIC timer interrupt to do the | ||
18 | * profiling, except when we simulate SMP mode on a uniprocessor | ||
19 | * system, in that case we have to call the local interrupt handler. | ||
20 | */ | ||
21 | #ifndef CONFIG_X86_LOCAL_APIC | ||
22 | profile_tick(CPU_PROFILING); | ||
23 | #else | ||
24 | if (!using_apic_timer) | ||
25 | smp_local_timer_interrupt(); | ||
26 | #endif | ||
27 | } | ||
28 | |||
29 | static inline int do_timer_overflow(int count) | ||
30 | { | ||
31 | int i; | ||
32 | |||
33 | spin_lock(&i8259A_lock); | ||
34 | /* | ||
35 | * This is tricky when I/O APICs are used; | ||
36 | * see do_timer_interrupt(). | ||
37 | */ | ||
38 | i = inb(0x20); | ||
39 | spin_unlock(&i8259A_lock); | ||
40 | |||
41 | /* assumption about timer being IRQ0 */ | ||
42 | if (i & 0x01) { | ||
43 | /* | ||
44 | * We cannot detect lost timer interrupts ... | ||
45 | * well, that's why we call them lost, don't we? :) | ||
46 | * [hmm, on the Pentium and Alpha we can ... sort of] | ||
47 | */ | ||
48 | count -= LATCH; | ||
49 | } else { | ||
50 | printk("do_slow_gettimeoffset(): hardware timer problem?\n"); | ||
51 | } | ||
52 | return count; | ||
53 | } | ||
diff --git a/include/asm-i386/mach-visws/mach_apic.h b/include/asm-i386/mach-visws/mach_apic.h index de438c7147a8..18afe6b6fc4d 100644 --- a/include/asm-i386/mach-visws/mach_apic.h +++ b/include/asm-i386/mach-visws/mach_apic.h | |||
@@ -51,6 +51,11 @@ static inline void clustered_apic_check(void) | |||
51 | { | 51 | { |
52 | } | 52 | } |
53 | 53 | ||
54 | static inline int apicid_to_node(int logical_apicid) | ||
55 | { | ||
56 | return 0; | ||
57 | } | ||
58 | |||
54 | /* Mapping from cpu number to logical apicid */ | 59 | /* Mapping from cpu number to logical apicid */ |
55 | static inline int cpu_to_logical_apicid(int cpu) | 60 | static inline int cpu_to_logical_apicid(int cpu) |
56 | { | 61 | { |
diff --git a/include/asm-powerpc/asm-compat.h b/include/asm-powerpc/asm-compat.h index 8e64be0cc47d..c89bd58ee283 100644 --- a/include/asm-powerpc/asm-compat.h +++ b/include/asm-powerpc/asm-compat.h | |||
@@ -14,6 +14,58 @@ | |||
14 | # define ASM_CONST(x) __ASM_CONST(x) | 14 | # define ASM_CONST(x) __ASM_CONST(x) |
15 | #endif | 15 | #endif |
16 | 16 | ||
17 | |||
18 | /* | ||
19 | * Feature section common macros | ||
20 | * | ||
21 | * Note that the entries now contain offsets between the table entry | ||
22 | * and the code rather than absolute code pointers in order to be | ||
23 | * useable with the vdso shared library. There is also an assumption | ||
24 | * that values will be negative, that is, the fixup table has to be | ||
25 | * located after the code it fixes up. | ||
26 | */ | ||
27 | #ifdef CONFIG_PPC64 | ||
28 | #ifdef __powerpc64__ | ||
29 | /* 64 bits kernel, 64 bits code */ | ||
30 | #define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ | ||
31 | 99: \ | ||
32 | .section sect,"a"; \ | ||
33 | .align 3; \ | ||
34 | 98: \ | ||
35 | .llong msk; \ | ||
36 | .llong val; \ | ||
37 | .llong label##b-98b; \ | ||
38 | .llong 99b-98b; \ | ||
39 | .previous | ||
40 | #else /* __powerpc64__ */ | ||
41 | /* 64 bits kernel, 32 bits code (ie. vdso32) */ | ||
42 | #define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ | ||
43 | 99: \ | ||
44 | .section sect,"a"; \ | ||
45 | .align 3; \ | ||
46 | 98: \ | ||
47 | .llong msk; \ | ||
48 | .llong val; \ | ||
49 | .long 0xffffffff; \ | ||
50 | .long label##b-98b; \ | ||
51 | .long 0xffffffff; \ | ||
52 | .long 99b-98b; \ | ||
53 | .previous | ||
54 | #endif /* !__powerpc64__ */ | ||
55 | #else /* CONFIG_PPC64 */ | ||
56 | /* 32 bits kernel, 32 bits code */ | ||
57 | #define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \ | ||
58 | 99: \ | ||
59 | .section sect,"a"; \ | ||
60 | .align 2; \ | ||
61 | 98: \ | ||
62 | .long msk; \ | ||
63 | .long val; \ | ||
64 | .long label##b-98b; \ | ||
65 | .long 99b-98b; \ | ||
66 | .previous | ||
67 | #endif /* !CONFIG_PPC64 */ | ||
68 | |||
17 | #ifdef __powerpc64__ | 69 | #ifdef __powerpc64__ |
18 | 70 | ||
19 | /* operations for longs and pointers */ | 71 | /* operations for longs and pointers */ |
diff --git a/include/asm-powerpc/cputable.h b/include/asm-powerpc/cputable.h index 12707ab9dc98..a9a40149a7c0 100644 --- a/include/asm-powerpc/cputable.h +++ b/include/asm-powerpc/cputable.h | |||
@@ -89,8 +89,11 @@ struct cpu_spec { | |||
89 | 89 | ||
90 | extern struct cpu_spec *cur_cpu_spec; | 90 | extern struct cpu_spec *cur_cpu_spec; |
91 | 91 | ||
92 | extern void identify_cpu(unsigned long offset, unsigned long cpu); | 92 | extern unsigned int __start___ftr_fixup, __stop___ftr_fixup; |
93 | extern void do_cpu_ftr_fixups(unsigned long offset); | 93 | |
94 | extern struct cpu_spec *identify_cpu(unsigned long offset); | ||
95 | extern void do_feature_fixups(unsigned long value, void *fixup_start, | ||
96 | void *fixup_end); | ||
94 | 97 | ||
95 | #endif /* __ASSEMBLY__ */ | 98 | #endif /* __ASSEMBLY__ */ |
96 | 99 | ||
@@ -144,6 +147,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
144 | #define CPU_FTR_CI_LARGE_PAGE LONG_ASM_CONST(0x0000100000000000) | 147 | #define CPU_FTR_CI_LARGE_PAGE LONG_ASM_CONST(0x0000100000000000) |
145 | #define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000) | 148 | #define CPU_FTR_PAUSE_ZERO LONG_ASM_CONST(0x0000200000000000) |
146 | #define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) | 149 | #define CPU_FTR_PURR LONG_ASM_CONST(0x0000400000000000) |
150 | #define CPU_FTR_CELL_TB_BUG LONG_ASM_CONST(0x0000800000000000) | ||
147 | 151 | ||
148 | #ifndef __ASSEMBLY__ | 152 | #ifndef __ASSEMBLY__ |
149 | 153 | ||
@@ -332,7 +336,7 @@ extern void do_cpu_ftr_fixups(unsigned long offset); | |||
332 | #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ | 336 | #define CPU_FTRS_CELL (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
333 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 337 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
334 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 338 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
335 | CPU_FTR_PAUSE_ZERO | CPU_FTR_CI_LARGE_PAGE) | 339 | CPU_FTR_PAUSE_ZERO | CPU_FTR_CI_LARGE_PAGE | CPU_FTR_CELL_TB_BUG) |
336 | #define CPU_FTRS_PA6T (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ | 340 | #define CPU_FTRS_PA6T (CPU_FTR_SPLIT_ID_CACHE | CPU_FTR_USE_TB | \ |
337 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ | 341 | CPU_FTR_HPTE_TABLE | CPU_FTR_PPCAS_ARCH_V2 | \ |
338 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CI_LARGE_PAGE | \ | 342 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CI_LARGE_PAGE | \ |
@@ -431,29 +435,12 @@ static inline int cpu_has_feature(unsigned long feature) | |||
431 | 435 | ||
432 | #ifdef __ASSEMBLY__ | 436 | #ifdef __ASSEMBLY__ |
433 | 437 | ||
434 | #define BEGIN_FTR_SECTION 98: | 438 | #define BEGIN_FTR_SECTION_NESTED(label) label: |
435 | 439 | #define BEGIN_FTR_SECTION BEGIN_FTR_SECTION_NESTED(97) | |
436 | #ifndef __powerpc64__ | 440 | #define END_FTR_SECTION_NESTED(msk, val, label) \ |
441 | MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup) | ||
437 | #define END_FTR_SECTION(msk, val) \ | 442 | #define END_FTR_SECTION(msk, val) \ |
438 | 99: \ | 443 | END_FTR_SECTION_NESTED(msk, val, 97) |
439 | .section __ftr_fixup,"a"; \ | ||
440 | .align 2; \ | ||
441 | .long msk; \ | ||
442 | .long val; \ | ||
443 | .long 98b; \ | ||
444 | .long 99b; \ | ||
445 | .previous | ||
446 | #else /* __powerpc64__ */ | ||
447 | #define END_FTR_SECTION(msk, val) \ | ||
448 | 99: \ | ||
449 | .section __ftr_fixup,"a"; \ | ||
450 | .align 3; \ | ||
451 | .llong msk; \ | ||
452 | .llong val; \ | ||
453 | .llong 98b; \ | ||
454 | .llong 99b; \ | ||
455 | .previous | ||
456 | #endif /* __powerpc64__ */ | ||
457 | 444 | ||
458 | #define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk)) | 445 | #define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk)) |
459 | #define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0) | 446 | #define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0) |
diff --git a/include/asm-powerpc/firmware.h b/include/asm-powerpc/firmware.h index 1022737f4f34..fdf9aff71150 100644 --- a/include/asm-powerpc/firmware.h +++ b/include/asm-powerpc/firmware.h | |||
@@ -96,19 +96,16 @@ extern void machine_check_fwnmi(void); | |||
96 | /* This is true if we are using the firmware NMI handler (typically LPAR) */ | 96 | /* This is true if we are using the firmware NMI handler (typically LPAR) */ |
97 | extern int fwnmi_active; | 97 | extern int fwnmi_active; |
98 | 98 | ||
99 | #else /* __ASSEMBLY__ */ | 99 | extern unsigned int __start___fw_ftr_fixup, __stop___fw_ftr_fixup; |
100 | 100 | ||
101 | #define BEGIN_FW_FTR_SECTION 96: | 101 | #else /* __ASSEMBLY__ */ |
102 | 102 | ||
103 | #define BEGIN_FW_FTR_SECTION_NESTED(label) label: | ||
104 | #define BEGIN_FW_FTR_SECTION BEGIN_FW_FTR_SECTION_NESTED(97) | ||
105 | #define END_FW_FTR_SECTION_NESTED(msk, val, label) \ | ||
106 | MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup) | ||
103 | #define END_FW_FTR_SECTION(msk, val) \ | 107 | #define END_FW_FTR_SECTION(msk, val) \ |
104 | 97: \ | 108 | END_FW_FTR_SECTION_NESTED(msk, val, 97) |
105 | .section __fw_ftr_fixup,"a"; \ | ||
106 | .align 3; \ | ||
107 | .llong msk; \ | ||
108 | .llong val; \ | ||
109 | .llong 96b; \ | ||
110 | .llong 97b; \ | ||
111 | .previous | ||
112 | 109 | ||
113 | #define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk)) | 110 | #define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk)) |
114 | #define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0) | 111 | #define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0) |
diff --git a/include/asm-powerpc/i8259.h b/include/asm-powerpc/i8259.h index 78489fb8d140..db1362f8c603 100644 --- a/include/asm-powerpc/i8259.h +++ b/include/asm-powerpc/i8259.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #ifdef CONFIG_PPC_MERGE | 7 | #ifdef CONFIG_PPC_MERGE |
8 | extern void i8259_init(struct device_node *node, unsigned long intack_addr); | 8 | extern void i8259_init(struct device_node *node, unsigned long intack_addr); |
9 | extern unsigned int i8259_irq(void); | 9 | extern unsigned int i8259_irq(void); |
10 | extern struct irq_host *i8259_get_host(void); | ||
10 | #else | 11 | #else |
11 | extern void i8259_init(unsigned long intack_addr, int offset); | 12 | extern void i8259_init(unsigned long intack_addr, int offset); |
12 | extern int i8259_irq(void); | 13 | extern int i8259_irq(void); |
diff --git a/include/asm-powerpc/ppc_asm.h b/include/asm-powerpc/ppc_asm.h index a940cfe040da..fa083d8e4663 100644 --- a/include/asm-powerpc/ppc_asm.h +++ b/include/asm-powerpc/ppc_asm.h | |||
@@ -30,9 +30,9 @@ BEGIN_FTR_SECTION; \ | |||
30 | mfspr ra,SPRN_PURR; /* get processor util. reg */ \ | 30 | mfspr ra,SPRN_PURR; /* get processor util. reg */ \ |
31 | END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ | 31 | END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ |
32 | BEGIN_FTR_SECTION; \ | 32 | BEGIN_FTR_SECTION; \ |
33 | mftb ra; /* or get TB if no PURR */ \ | 33 | MFTB(ra); /* or get TB if no PURR */ \ |
34 | END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ | 34 | END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ |
35 | ld rb,PACA_STARTPURR(r13); \ | 35 | ld rb,PACA_STARTPURR(r13); \ |
36 | std ra,PACA_STARTPURR(r13); \ | 36 | std ra,PACA_STARTPURR(r13); \ |
37 | subf rb,rb,ra; /* subtract start value */ \ | 37 | subf rb,rb,ra; /* subtract start value */ \ |
38 | ld ra,PACA_USER_TIME(r13); \ | 38 | ld ra,PACA_USER_TIME(r13); \ |
@@ -45,9 +45,9 @@ BEGIN_FTR_SECTION; \ | |||
45 | mfspr ra,SPRN_PURR; /* get processor util. reg */ \ | 45 | mfspr ra,SPRN_PURR; /* get processor util. reg */ \ |
46 | END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ | 46 | END_FTR_SECTION_IFSET(CPU_FTR_PURR); \ |
47 | BEGIN_FTR_SECTION; \ | 47 | BEGIN_FTR_SECTION; \ |
48 | mftb ra; /* or get TB if no PURR */ \ | 48 | MFTB(ra); /* or get TB if no PURR */ \ |
49 | END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ | 49 | END_FTR_SECTION_IFCLR(CPU_FTR_PURR); \ |
50 | ld rb,PACA_STARTPURR(r13); \ | 50 | ld rb,PACA_STARTPURR(r13); \ |
51 | std ra,PACA_STARTPURR(r13); \ | 51 | std ra,PACA_STARTPURR(r13); \ |
52 | subf rb,rb,ra; /* subtract start value */ \ | 52 | subf rb,rb,ra; /* subtract start value */ \ |
53 | ld ra,PACA_SYSTEM_TIME(r13); \ | 53 | ld ra,PACA_SYSTEM_TIME(r13); \ |
@@ -274,6 +274,16 @@ END_FTR_SECTION_IFSET(CPU_FTR_601) | |||
274 | #define ISYNC_601 | 274 | #define ISYNC_601 |
275 | #endif | 275 | #endif |
276 | 276 | ||
277 | #ifdef CONFIG_PPC_CELL | ||
278 | #define MFTB(dest) \ | ||
279 | 90: mftb dest; \ | ||
280 | BEGIN_FTR_SECTION_NESTED(96); \ | ||
281 | cmpwi dest,0; \ | ||
282 | beq- 90b; \ | ||
283 | END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) | ||
284 | #else | ||
285 | #define MFTB(dest) mftb dest | ||
286 | #endif | ||
277 | 287 | ||
278 | #ifndef CONFIG_SMP | 288 | #ifndef CONFIG_SMP |
279 | #define TLBSYNC | 289 | #define TLBSYNC |
diff --git a/include/asm-powerpc/prom.h b/include/asm-powerpc/prom.h index 524629769336..ec11d44eaeb5 100644 --- a/include/asm-powerpc/prom.h +++ b/include/asm-powerpc/prom.h | |||
@@ -134,7 +134,7 @@ extern struct device_node *of_find_all_nodes(struct device_node *prev); | |||
134 | extern struct device_node *of_get_parent(const struct device_node *node); | 134 | extern struct device_node *of_get_parent(const struct device_node *node); |
135 | extern struct device_node *of_get_next_child(const struct device_node *node, | 135 | extern struct device_node *of_get_next_child(const struct device_node *node, |
136 | struct device_node *prev); | 136 | struct device_node *prev); |
137 | extern struct property *of_find_property(struct device_node *np, | 137 | extern struct property *of_find_property(const struct device_node *np, |
138 | const char *name, | 138 | const char *name, |
139 | int *lenp); | 139 | int *lenp); |
140 | extern struct device_node *of_node_get(struct device_node *node); | 140 | extern struct device_node *of_node_get(struct device_node *node); |
@@ -158,10 +158,12 @@ extern void of_detach_node(const struct device_node *); | |||
158 | extern void finish_device_tree(void); | 158 | extern void finish_device_tree(void); |
159 | extern void unflatten_device_tree(void); | 159 | extern void unflatten_device_tree(void); |
160 | extern void early_init_devtree(void *); | 160 | extern void early_init_devtree(void *); |
161 | extern int device_is_compatible(struct device_node *device, const char *); | 161 | extern int device_is_compatible(const struct device_node *device, |
162 | const char *); | ||
162 | extern int machine_is_compatible(const char *compat); | 163 | extern int machine_is_compatible(const char *compat); |
163 | extern const void *get_property(struct device_node *node, const char *name, | 164 | extern const void *get_property(const struct device_node *node, |
164 | int *lenp); | 165 | const char *name, |
166 | int *lenp); | ||
165 | extern void print_properties(struct device_node *node); | 167 | extern void print_properties(struct device_node *node); |
166 | extern int prom_n_addr_cells(struct device_node* np); | 168 | extern int prom_n_addr_cells(struct device_node* np); |
167 | extern int prom_n_size_cells(struct device_node* np); | 169 | extern int prom_n_size_cells(struct device_node* np); |
diff --git a/include/asm-powerpc/reg.h b/include/asm-powerpc/reg.h index 8fb96811b55d..6faae7b14d55 100644 --- a/include/asm-powerpc/reg.h +++ b/include/asm-powerpc/reg.h | |||
@@ -591,6 +591,7 @@ | |||
591 | #define PV_630 0x0040 | 591 | #define PV_630 0x0040 |
592 | #define PV_630p 0x0041 | 592 | #define PV_630p 0x0041 |
593 | #define PV_970MP 0x0044 | 593 | #define PV_970MP 0x0044 |
594 | #define PV_970GX 0x0045 | ||
594 | #define PV_BE 0x0070 | 595 | #define PV_BE 0x0070 |
595 | #define PV_PA6T 0x0090 | 596 | #define PV_PA6T 0x0090 |
596 | 597 | ||
@@ -618,10 +619,35 @@ | |||
618 | : "=r" (rval)); rval;}) | 619 | : "=r" (rval)); rval;}) |
619 | #define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v)) | 620 | #define mtspr(rn, v) asm volatile("mtspr " __stringify(rn) ",%0" : : "r" (v)) |
620 | 621 | ||
622 | #ifdef __powerpc64__ | ||
623 | #ifdef CONFIG_PPC_CELL | ||
624 | #define mftb() ({unsigned long rval; \ | ||
625 | asm volatile( \ | ||
626 | "90: mftb %0;\n" \ | ||
627 | "97: cmpwi %0,0;\n" \ | ||
628 | " beq- 90b;\n" \ | ||
629 | "99:\n" \ | ||
630 | ".section __ftr_fixup,\"a\"\n" \ | ||
631 | ".align 3\n" \ | ||
632 | "98:\n" \ | ||
633 | " .llong %1\n" \ | ||
634 | " .llong %1\n" \ | ||
635 | " .llong 97b-98b\n" \ | ||
636 | " .llong 99b-98b\n" \ | ||
637 | ".previous" \ | ||
638 | : "=r" (rval) : "i" (CPU_FTR_CELL_TB_BUG)); rval;}) | ||
639 | #else | ||
621 | #define mftb() ({unsigned long rval; \ | 640 | #define mftb() ({unsigned long rval; \ |
622 | asm volatile("mftb %0" : "=r" (rval)); rval;}) | 641 | asm volatile("mftb %0" : "=r" (rval)); rval;}) |
642 | #endif /* !CONFIG_PPC_CELL */ | ||
643 | |||
644 | #else /* __powerpc64__ */ | ||
645 | |||
623 | #define mftbl() ({unsigned long rval; \ | 646 | #define mftbl() ({unsigned long rval; \ |
624 | asm volatile("mftbl %0" : "=r" (rval)); rval;}) | 647 | asm volatile("mftbl %0" : "=r" (rval)); rval;}) |
648 | #define mftbu() ({unsigned long rval; \ | ||
649 | asm volatile("mftbu %0" : "=r" (rval)); rval;}) | ||
650 | #endif /* !__powerpc64__ */ | ||
625 | 651 | ||
626 | #define mttbl(v) asm volatile("mttbl %0":: "r"(v)) | 652 | #define mttbl(v) asm volatile("mttbl %0":: "r"(v)) |
627 | #define mttbu(v) asm volatile("mttbu %0":: "r"(v)) | 653 | #define mttbu(v) asm volatile("mttbu %0":: "r"(v)) |
diff --git a/include/asm-powerpc/time.h b/include/asm-powerpc/time.h index b051d4c88c3b..a78285010d62 100644 --- a/include/asm-powerpc/time.h +++ b/include/asm-powerpc/time.h | |||
@@ -82,30 +82,35 @@ struct div_result { | |||
82 | #define __USE_RTC() 0 | 82 | #define __USE_RTC() 0 |
83 | #endif | 83 | #endif |
84 | 84 | ||
85 | /* On ppc64 this gets us the whole timebase; on ppc32 just the lower half */ | 85 | #ifdef CONFIG_PPC64 |
86 | |||
87 | /* For compatibility, get_tbl() is defined as get_tb() on ppc64 */ | ||
88 | #define get_tbl get_tb | ||
89 | |||
90 | #else | ||
91 | |||
86 | static inline unsigned long get_tbl(void) | 92 | static inline unsigned long get_tbl(void) |
87 | { | 93 | { |
88 | unsigned long tbl; | ||
89 | |||
90 | #if defined(CONFIG_403GCX) | 94 | #if defined(CONFIG_403GCX) |
95 | unsigned long tbl; | ||
91 | asm volatile("mfspr %0, 0x3dd" : "=r" (tbl)); | 96 | asm volatile("mfspr %0, 0x3dd" : "=r" (tbl)); |
97 | return tbl; | ||
92 | #else | 98 | #else |
93 | asm volatile("mftb %0" : "=r" (tbl)); | 99 | return mftbl(); |
94 | #endif | 100 | #endif |
95 | return tbl; | ||
96 | } | 101 | } |
97 | 102 | ||
98 | static inline unsigned int get_tbu(void) | 103 | static inline unsigned int get_tbu(void) |
99 | { | 104 | { |
105 | #ifdef CONFIG_403GCX | ||
100 | unsigned int tbu; | 106 | unsigned int tbu; |
101 | |||
102 | #if defined(CONFIG_403GCX) | ||
103 | asm volatile("mfspr %0, 0x3dc" : "=r" (tbu)); | 107 | asm volatile("mfspr %0, 0x3dc" : "=r" (tbu)); |
108 | return tbu; | ||
104 | #else | 109 | #else |
105 | asm volatile("mftbu %0" : "=r" (tbu)); | 110 | return mftbu(); |
106 | #endif | 111 | #endif |
107 | return tbu; | ||
108 | } | 112 | } |
113 | #endif /* !CONFIG_PPC64 */ | ||
109 | 114 | ||
110 | static inline unsigned int get_rtcl(void) | 115 | static inline unsigned int get_rtcl(void) |
111 | { | 116 | { |
@@ -131,7 +136,7 @@ static inline u64 get_tb(void) | |||
131 | { | 136 | { |
132 | return mftb(); | 137 | return mftb(); |
133 | } | 138 | } |
134 | #else | 139 | #else /* CONFIG_PPC64 */ |
135 | static inline u64 get_tb(void) | 140 | static inline u64 get_tb(void) |
136 | { | 141 | { |
137 | unsigned int tbhi, tblo, tbhi2; | 142 | unsigned int tbhi, tblo, tbhi2; |
@@ -144,7 +149,7 @@ static inline u64 get_tb(void) | |||
144 | 149 | ||
145 | return ((u64)tbhi << 32) | tblo; | 150 | return ((u64)tbhi << 32) | tblo; |
146 | } | 151 | } |
147 | #endif | 152 | #endif /* !CONFIG_PPC64 */ |
148 | 153 | ||
149 | static inline void set_tb(unsigned int upper, unsigned int lower) | 154 | static inline void set_tb(unsigned int upper, unsigned int lower) |
150 | { | 155 | { |
diff --git a/include/asm-powerpc/timex.h b/include/asm-powerpc/timex.h index 3b9a8e786806..92dedde761d1 100644 --- a/include/asm-powerpc/timex.h +++ b/include/asm-powerpc/timex.h | |||
@@ -8,6 +8,7 @@ | |||
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <asm/cputable.h> | 10 | #include <asm/cputable.h> |
11 | #include <asm/reg.h> | ||
11 | 12 | ||
12 | #define CLOCK_TICK_RATE 1024000 /* Underlying HZ */ | 13 | #define CLOCK_TICK_RATE 1024000 /* Underlying HZ */ |
13 | 14 | ||
@@ -15,13 +16,11 @@ typedef unsigned long cycles_t; | |||
15 | 16 | ||
16 | static inline cycles_t get_cycles(void) | 17 | static inline cycles_t get_cycles(void) |
17 | { | 18 | { |
18 | cycles_t ret; | ||
19 | |||
20 | #ifdef __powerpc64__ | 19 | #ifdef __powerpc64__ |
21 | 20 | return mftb(); | |
22 | __asm__ __volatile__("mftb %0" : "=r" (ret) : ); | ||
23 | |||
24 | #else | 21 | #else |
22 | cycles_t ret; | ||
23 | |||
25 | /* | 24 | /* |
26 | * For the "cycle" counter we use the timebase lower half. | 25 | * For the "cycle" counter we use the timebase lower half. |
27 | * Currently only used on SMP. | 26 | * Currently only used on SMP. |
@@ -30,18 +29,19 @@ static inline cycles_t get_cycles(void) | |||
30 | ret = 0; | 29 | ret = 0; |
31 | 30 | ||
32 | __asm__ __volatile__( | 31 | __asm__ __volatile__( |
33 | "98: mftb %0\n" | 32 | "97: mftb %0\n" |
34 | "99:\n" | 33 | "99:\n" |
35 | ".section __ftr_fixup,\"a\"\n" | 34 | ".section __ftr_fixup,\"a\"\n" |
35 | ".align 2\n" | ||
36 | "98:\n" | ||
36 | " .long %1\n" | 37 | " .long %1\n" |
37 | " .long 0\n" | 38 | " .long 0\n" |
38 | " .long 98b\n" | 39 | " .long 97b-98b\n" |
39 | " .long 99b\n" | 40 | " .long 99b-98b\n" |
40 | ".previous" | 41 | ".previous" |
41 | : "=r" (ret) : "i" (CPU_FTR_601)); | 42 | : "=r" (ret) : "i" (CPU_FTR_601)); |
42 | #endif | ||
43 | |||
44 | return ret; | 43 | return ret; |
44 | #endif | ||
45 | } | 45 | } |
46 | 46 | ||
47 | #endif /* __KERNEL__ */ | 47 | #endif /* __KERNEL__ */ |
diff --git a/include/asm-x86_64/hw_irq.h b/include/asm-x86_64/hw_irq.h index 792dd52fcd70..179cce755aa7 100644 --- a/include/asm-x86_64/hw_irq.h +++ b/include/asm-x86_64/hw_irq.h | |||
@@ -76,6 +76,8 @@ | |||
76 | #ifndef __ASSEMBLY__ | 76 | #ifndef __ASSEMBLY__ |
77 | typedef int vector_irq_t[NR_VECTORS]; | 77 | typedef int vector_irq_t[NR_VECTORS]; |
78 | DECLARE_PER_CPU(vector_irq_t, vector_irq); | 78 | DECLARE_PER_CPU(vector_irq_t, vector_irq); |
79 | extern void __setup_vector_irq(int cpu); | ||
80 | extern spinlock_t vector_lock; | ||
79 | 81 | ||
80 | /* | 82 | /* |
81 | * Various low-level irq details needed by irq.c, process.c, | 83 | * Various low-level irq details needed by irq.c, process.c, |
diff --git a/include/linux/compat.h b/include/linux/compat.h index f4ebf96f5308..f1553196826f 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
@@ -196,7 +196,7 @@ asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp, | |||
196 | #define BITS_TO_COMPAT_LONGS(bits) \ | 196 | #define BITS_TO_COMPAT_LONGS(bits) \ |
197 | (((bits)+BITS_PER_COMPAT_LONG-1)/BITS_PER_COMPAT_LONG) | 197 | (((bits)+BITS_PER_COMPAT_LONG-1)/BITS_PER_COMPAT_LONG) |
198 | 198 | ||
199 | long compat_get_bitmap(unsigned long *mask, compat_ulong_t __user *umask, | 199 | long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask, |
200 | unsigned long bitmap_size); | 200 | unsigned long bitmap_size); |
201 | long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask, | 201 | long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask, |
202 | unsigned long bitmap_size); | 202 | unsigned long bitmap_size); |
diff --git a/include/linux/init.h b/include/linux/init.h index e92b1455d7af..ff40ea118e3a 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
@@ -84,19 +84,29 @@ extern void setup_arch(char **); | |||
84 | * by link order. | 84 | * by link order. |
85 | * For backwards compatibility, initcall() puts the call in | 85 | * For backwards compatibility, initcall() puts the call in |
86 | * the device init subsection. | 86 | * the device init subsection. |
87 | * | ||
88 | * The `id' arg to __define_initcall() is needed so that multiple initcalls | ||
89 | * can point at the same handler without causing duplicate-symbol build errors. | ||
87 | */ | 90 | */ |
88 | 91 | ||
89 | #define __define_initcall(level,fn) \ | 92 | #define __define_initcall(level,fn,id) \ |
90 | static initcall_t __initcall_##fn __attribute_used__ \ | 93 | static initcall_t __initcall_##fn##id __attribute_used__ \ |
91 | __attribute__((__section__(".initcall" level ".init"))) = fn | 94 | __attribute__((__section__(".initcall" level ".init"))) = fn |
92 | 95 | ||
93 | #define core_initcall(fn) __define_initcall("1",fn) | 96 | #define core_initcall(fn) __define_initcall("1",fn,1) |
94 | #define postcore_initcall(fn) __define_initcall("2",fn) | 97 | #define core_initcall_sync(fn) __define_initcall("1s",fn,1s) |
95 | #define arch_initcall(fn) __define_initcall("3",fn) | 98 | #define postcore_initcall(fn) __define_initcall("2",fn,2) |
96 | #define subsys_initcall(fn) __define_initcall("4",fn) | 99 | #define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s) |
97 | #define fs_initcall(fn) __define_initcall("5",fn) | 100 | #define arch_initcall(fn) __define_initcall("3",fn,3) |
98 | #define device_initcall(fn) __define_initcall("6",fn) | 101 | #define arch_initcall_sync(fn) __define_initcall("3s",fn,3s) |
99 | #define late_initcall(fn) __define_initcall("7",fn) | 102 | #define subsys_initcall(fn) __define_initcall("4",fn,4) |
103 | #define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s) | ||
104 | #define fs_initcall(fn) __define_initcall("5",fn,5) | ||
105 | #define fs_initcall_sync(fn) __define_initcall("5s",fn,5s) | ||
106 | #define device_initcall(fn) __define_initcall("6",fn,6) | ||
107 | #define device_initcall_sync(fn) __define_initcall("6s",fn,6s) | ||
108 | #define late_initcall(fn) __define_initcall("7",fn,7) | ||
109 | #define late_initcall_sync(fn) __define_initcall("7s",fn,7s) | ||
100 | 110 | ||
101 | #define __initcall(fn) device_initcall(fn) | 111 | #define __initcall(fn) device_initcall(fn) |
102 | 112 | ||
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index ed0762b283a9..e06683e2bea3 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h | |||
@@ -218,13 +218,9 @@ struct zone { | |||
218 | * under - it drives the swappiness decision: whether to unmap mapped | 218 | * under - it drives the swappiness decision: whether to unmap mapped |
219 | * pages. | 219 | * pages. |
220 | * | 220 | * |
221 | * temp_priority is used to remember the scanning priority at which | 221 | * Access to both this field is quite racy even on uniprocessor. But |
222 | * this zone was successfully refilled to free_pages == pages_high. | ||
223 | * | ||
224 | * Access to both these fields is quite racy even on uniprocessor. But | ||
225 | * it is expected to average out OK. | 222 | * it is expected to average out OK. |
226 | */ | 223 | */ |
227 | int temp_priority; | ||
228 | int prev_priority; | 224 | int prev_priority; |
229 | 225 | ||
230 | 226 | ||
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 64f950925151..c3e255bf8594 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
@@ -52,19 +52,23 @@ static inline void mapping_set_gfp_mask(struct address_space *m, gfp_t mask) | |||
52 | void release_pages(struct page **pages, int nr, int cold); | 52 | void release_pages(struct page **pages, int nr, int cold); |
53 | 53 | ||
54 | #ifdef CONFIG_NUMA | 54 | #ifdef CONFIG_NUMA |
55 | extern struct page *page_cache_alloc(struct address_space *x); | 55 | extern struct page *__page_cache_alloc(gfp_t gfp); |
56 | extern struct page *page_cache_alloc_cold(struct address_space *x); | ||
57 | #else | 56 | #else |
57 | static inline struct page *__page_cache_alloc(gfp_t gfp) | ||
58 | { | ||
59 | return alloc_pages(gfp, 0); | ||
60 | } | ||
61 | #endif | ||
62 | |||
58 | static inline struct page *page_cache_alloc(struct address_space *x) | 63 | static inline struct page *page_cache_alloc(struct address_space *x) |
59 | { | 64 | { |
60 | return alloc_pages(mapping_gfp_mask(x), 0); | 65 | return __page_cache_alloc(mapping_gfp_mask(x)); |
61 | } | 66 | } |
62 | 67 | ||
63 | static inline struct page *page_cache_alloc_cold(struct address_space *x) | 68 | static inline struct page *page_cache_alloc_cold(struct address_space *x) |
64 | { | 69 | { |
65 | return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0); | 70 | return __page_cache_alloc(mapping_gfp_mask(x)|__GFP_COLD); |
66 | } | 71 | } |
67 | #endif | ||
68 | 72 | ||
69 | typedef int filler_t(void *, struct page *); | 73 | typedef int filler_t(void *, struct page *); |
70 | 74 | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index 6735c1cf334c..eafe4a7b8237 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -466,7 +466,6 @@ struct signal_struct { | |||
466 | struct pacct_struct pacct; /* per-process accounting information */ | 466 | struct pacct_struct pacct; /* per-process accounting information */ |
467 | #endif | 467 | #endif |
468 | #ifdef CONFIG_TASKSTATS | 468 | #ifdef CONFIG_TASKSTATS |
469 | spinlock_t stats_lock; | ||
470 | struct taskstats *stats; | 469 | struct taskstats *stats; |
471 | #endif | 470 | #endif |
472 | }; | 471 | }; |
diff --git a/include/linux/taskstats_kern.h b/include/linux/taskstats_kern.h index 16894b7edcc8..6562a2050a25 100644 --- a/include/linux/taskstats_kern.h +++ b/include/linux/taskstats_kern.h | |||
@@ -23,25 +23,26 @@ static inline void taskstats_exit_free(struct taskstats *tidstats) | |||
23 | 23 | ||
24 | static inline void taskstats_tgid_init(struct signal_struct *sig) | 24 | static inline void taskstats_tgid_init(struct signal_struct *sig) |
25 | { | 25 | { |
26 | spin_lock_init(&sig->stats_lock); | ||
27 | sig->stats = NULL; | 26 | sig->stats = NULL; |
28 | } | 27 | } |
29 | 28 | ||
30 | static inline void taskstats_tgid_alloc(struct signal_struct *sig) | 29 | static inline void taskstats_tgid_alloc(struct task_struct *tsk) |
31 | { | 30 | { |
31 | struct signal_struct *sig = tsk->signal; | ||
32 | struct taskstats *stats; | 32 | struct taskstats *stats; |
33 | unsigned long flags; | ||
34 | 33 | ||
35 | stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL); | 34 | if (sig->stats != NULL) |
36 | if (!stats) | ||
37 | return; | 35 | return; |
38 | 36 | ||
39 | spin_lock_irqsave(&sig->stats_lock, flags); | 37 | /* No problem if kmem_cache_zalloc() fails */ |
38 | stats = kmem_cache_zalloc(taskstats_cache, SLAB_KERNEL); | ||
39 | |||
40 | spin_lock_irq(&tsk->sighand->siglock); | ||
40 | if (!sig->stats) { | 41 | if (!sig->stats) { |
41 | sig->stats = stats; | 42 | sig->stats = stats; |
42 | stats = NULL; | 43 | stats = NULL; |
43 | } | 44 | } |
44 | spin_unlock_irqrestore(&sig->stats_lock, flags); | 45 | spin_unlock_irq(&tsk->sighand->siglock); |
45 | 46 | ||
46 | if (stats) | 47 | if (stats) |
47 | kmem_cache_free(taskstats_cache, stats); | 48 | kmem_cache_free(taskstats_cache, stats); |
@@ -49,23 +50,13 @@ static inline void taskstats_tgid_alloc(struct signal_struct *sig) | |||
49 | 50 | ||
50 | static inline void taskstats_tgid_free(struct signal_struct *sig) | 51 | static inline void taskstats_tgid_free(struct signal_struct *sig) |
51 | { | 52 | { |
52 | struct taskstats *stats = NULL; | 53 | if (sig->stats) |
53 | unsigned long flags; | 54 | kmem_cache_free(taskstats_cache, sig->stats); |
54 | |||
55 | spin_lock_irqsave(&sig->stats_lock, flags); | ||
56 | if (sig->stats) { | ||
57 | stats = sig->stats; | ||
58 | sig->stats = NULL; | ||
59 | } | ||
60 | spin_unlock_irqrestore(&sig->stats_lock, flags); | ||
61 | if (stats) | ||
62 | kmem_cache_free(taskstats_cache, stats); | ||
63 | } | 55 | } |
64 | 56 | ||
65 | extern void taskstats_exit_alloc(struct taskstats **, unsigned int *); | 57 | extern void taskstats_exit_alloc(struct taskstats **, unsigned int *); |
66 | extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int, unsigned int); | 58 | extern void taskstats_exit_send(struct task_struct *, struct taskstats *, int, unsigned int); |
67 | extern void taskstats_init_early(void); | 59 | extern void taskstats_init_early(void); |
68 | extern void taskstats_tgid_alloc(struct signal_struct *); | ||
69 | #else | 60 | #else |
70 | static inline void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu) | 61 | static inline void taskstats_exit_alloc(struct taskstats **ptidstats, unsigned int *mycpu) |
71 | {} | 62 | {} |
@@ -77,7 +68,7 @@ static inline void taskstats_exit_send(struct task_struct *tsk, | |||
77 | {} | 68 | {} |
78 | static inline void taskstats_tgid_init(struct signal_struct *sig) | 69 | static inline void taskstats_tgid_init(struct signal_struct *sig) |
79 | {} | 70 | {} |
80 | static inline void taskstats_tgid_alloc(struct signal_struct *sig) | 71 | static inline void taskstats_tgid_alloc(struct task_struct *tsk) |
81 | {} | 72 | {} |
82 | static inline void taskstats_tgid_free(struct signal_struct *sig) | 73 | static inline void taskstats_tgid_free(struct signal_struct *sig) |
83 | {} | 74 | {} |
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index ce5f1482e6be..dc9a29d84abc 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -60,7 +60,8 @@ extern struct vm_struct *get_vm_area(unsigned long size, unsigned long flags); | |||
60 | extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, | 60 | extern struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, |
61 | unsigned long start, unsigned long end); | 61 | unsigned long start, unsigned long end); |
62 | extern struct vm_struct *get_vm_area_node(unsigned long size, | 62 | extern struct vm_struct *get_vm_area_node(unsigned long size, |
63 | unsigned long flags, int node); | 63 | unsigned long flags, int node, |
64 | gfp_t gfp_mask); | ||
64 | extern struct vm_struct *remove_vm_area(void *addr); | 65 | extern struct vm_struct *remove_vm_area(void *addr); |
65 | extern int map_vm_area(struct vm_struct *area, pgprot_t prot, | 66 | extern int map_vm_area(struct vm_struct *area, pgprot_t prot, |
66 | struct page ***pages); | 67 | struct page ***pages); |
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h index 401192e56e50..61eebec00a7b 100644 --- a/include/scsi/libiscsi.h +++ b/include/scsi/libiscsi.h | |||
@@ -136,7 +136,6 @@ struct iscsi_conn { | |||
136 | 136 | ||
137 | /* control data */ | 137 | /* control data */ |
138 | int id; /* CID */ | 138 | int id; /* CID */ |
139 | struct list_head item; /* maintains list of conns */ | ||
140 | int c_stage; /* connection state */ | 139 | int c_stage; /* connection state */ |
141 | /* | 140 | /* |
142 | * Preallocated buffer for pdus that have data but do not | 141 | * Preallocated buffer for pdus that have data but do not |
@@ -235,10 +234,8 @@ struct iscsi_session { | |||
235 | * - mgmtpool, * | 234 | * - mgmtpool, * |
236 | * - r2tpool */ | 235 | * - r2tpool */ |
237 | int state; /* session state */ | 236 | int state; /* session state */ |
238 | struct list_head item; | ||
239 | int age; /* counts session re-opens */ | 237 | int age; /* counts session re-opens */ |
240 | 238 | ||
241 | struct list_head connections; /* list of connections */ | ||
242 | int cmds_max; /* size of cmds array */ | 239 | int cmds_max; /* size of cmds array */ |
243 | struct iscsi_cmd_task **cmds; /* Original Cmds arr */ | 240 | struct iscsi_cmd_task **cmds; /* Original Cmds arr */ |
244 | struct iscsi_queue cmdpool; /* PDU's pool */ | 241 | struct iscsi_queue cmdpool; /* PDU's pool */ |
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index 84a6d5fe0920..5c0e9791441c 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h | |||
@@ -97,6 +97,7 @@ extern const unsigned char scsi_command_size[8]; | |||
97 | #define PERSISTENT_RESERVE_IN 0x5e | 97 | #define PERSISTENT_RESERVE_IN 0x5e |
98 | #define PERSISTENT_RESERVE_OUT 0x5f | 98 | #define PERSISTENT_RESERVE_OUT 0x5f |
99 | #define REPORT_LUNS 0xa0 | 99 | #define REPORT_LUNS 0xa0 |
100 | #define MAINTENANCE_IN 0xa3 | ||
100 | #define MOVE_MEDIUM 0xa5 | 101 | #define MOVE_MEDIUM 0xa5 |
101 | #define EXCHANGE_MEDIUM 0xa6 | 102 | #define EXCHANGE_MEDIUM 0xa6 |
102 | #define READ_12 0xa8 | 103 | #define READ_12 0xa8 |
@@ -114,6 +115,8 @@ extern const unsigned char scsi_command_size[8]; | |||
114 | #define SERVICE_ACTION_IN 0x9e | 115 | #define SERVICE_ACTION_IN 0x9e |
115 | /* values for service action in */ | 116 | /* values for service action in */ |
116 | #define SAI_READ_CAPACITY_16 0x10 | 117 | #define SAI_READ_CAPACITY_16 0x10 |
118 | /* values for maintenance in */ | ||
119 | #define MI_REPORT_TARGET_PGS 0x0a | ||
117 | 120 | ||
118 | /* Values for T10/04-262r7 */ | 121 | /* Values for T10/04-262r7 */ |
119 | #define ATA_16 0x85 /* 16-byte pass-thru */ | 122 | #define ATA_16 0x85 /* 16-byte pass-thru */ |
@@ -430,7 +433,7 @@ struct scsi_lun { | |||
430 | #define SCSI_IOCTL_GET_PCI 0x5387 | 433 | #define SCSI_IOCTL_GET_PCI 0x5387 |
431 | 434 | ||
432 | /* Pull a u32 out of a SCSI message (using BE SCSI conventions) */ | 435 | /* Pull a u32 out of a SCSI message (using BE SCSI conventions) */ |
433 | static inline u32 scsi_to_u32(u8 *ptr) | 436 | static inline __u32 scsi_to_u32(__u8 *ptr) |
434 | { | 437 | { |
435 | return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3]; | 438 | return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3]; |
436 | } | 439 | } |
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index 39e833260bd0..4b95c89c95c9 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h | |||
@@ -29,7 +29,6 @@ | |||
29 | struct scsi_transport_template; | 29 | struct scsi_transport_template; |
30 | struct iscsi_transport; | 30 | struct iscsi_transport; |
31 | struct Scsi_Host; | 31 | struct Scsi_Host; |
32 | struct mempool_zone; | ||
33 | struct iscsi_cls_conn; | 32 | struct iscsi_cls_conn; |
34 | struct iscsi_conn; | 33 | struct iscsi_conn; |
35 | struct iscsi_cmd_task; | 34 | struct iscsi_cmd_task; |
@@ -157,9 +156,6 @@ struct iscsi_cls_conn { | |||
157 | 156 | ||
158 | int active; /* must be accessed with the connlock */ | 157 | int active; /* must be accessed with the connlock */ |
159 | struct device dev; /* sysfs transport/container device */ | 158 | struct device dev; /* sysfs transport/container device */ |
160 | struct mempool_zone *z_error; | ||
161 | struct mempool_zone *z_pdu; | ||
162 | struct list_head freequeue; | ||
163 | }; | 159 | }; |
164 | 160 | ||
165 | #define iscsi_dev_to_conn(_dev) \ | 161 | #define iscsi_dev_to_conn(_dev) \ |
diff --git a/kernel/compat.c b/kernel/compat.c index 75573e5d27b0..d4898aad6cfa 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
@@ -678,7 +678,7 @@ int get_compat_sigevent(struct sigevent *event, | |||
678 | ? -EFAULT : 0; | 678 | ? -EFAULT : 0; |
679 | } | 679 | } |
680 | 680 | ||
681 | long compat_get_bitmap(unsigned long *mask, compat_ulong_t __user *umask, | 681 | long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask, |
682 | unsigned long bitmap_size) | 682 | unsigned long bitmap_size) |
683 | { | 683 | { |
684 | int i, j; | 684 | int i, j; |
diff --git a/kernel/cpu.c b/kernel/cpu.c index 27dd3ee47099..663c920b2234 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -150,18 +150,18 @@ static int _cpu_down(unsigned int cpu) | |||
150 | p = __stop_machine_run(take_cpu_down, NULL, cpu); | 150 | p = __stop_machine_run(take_cpu_down, NULL, cpu); |
151 | mutex_unlock(&cpu_bitmask_lock); | 151 | mutex_unlock(&cpu_bitmask_lock); |
152 | 152 | ||
153 | if (IS_ERR(p)) { | 153 | if (IS_ERR(p) || cpu_online(cpu)) { |
154 | /* CPU didn't die: tell everyone. Can't complain. */ | 154 | /* CPU didn't die: tell everyone. Can't complain. */ |
155 | if (raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED, | 155 | if (raw_notifier_call_chain(&cpu_chain, CPU_DOWN_FAILED, |
156 | (void *)(long)cpu) == NOTIFY_BAD) | 156 | (void *)(long)cpu) == NOTIFY_BAD) |
157 | BUG(); | 157 | BUG(); |
158 | 158 | ||
159 | err = PTR_ERR(p); | 159 | if (IS_ERR(p)) { |
160 | goto out_allowed; | 160 | err = PTR_ERR(p); |
161 | } | 161 | goto out_allowed; |
162 | 162 | } | |
163 | if (cpu_online(cpu)) | ||
164 | goto out_thread; | 163 | goto out_thread; |
164 | } | ||
165 | 165 | ||
166 | /* Wait for it to sleep (leaving idle task). */ | 166 | /* Wait for it to sleep (leaving idle task). */ |
167 | while (!idle_cpu(cpu)) | 167 | while (!idle_cpu(cpu)) |
diff --git a/kernel/exit.c b/kernel/exit.c index f250a5e3e281..06de6c4e8ca3 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -128,6 +128,7 @@ static void __exit_signal(struct task_struct *tsk) | |||
128 | flush_sigqueue(&tsk->pending); | 128 | flush_sigqueue(&tsk->pending); |
129 | if (sig) { | 129 | if (sig) { |
130 | flush_sigqueue(&sig->shared_pending); | 130 | flush_sigqueue(&sig->shared_pending); |
131 | taskstats_tgid_free(sig); | ||
131 | __cleanup_signal(sig); | 132 | __cleanup_signal(sig); |
132 | } | 133 | } |
133 | } | 134 | } |
diff --git a/kernel/fork.c b/kernel/fork.c index 29ebb30850ed..3da978eec791 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
@@ -830,7 +830,7 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts | |||
830 | if (clone_flags & CLONE_THREAD) { | 830 | if (clone_flags & CLONE_THREAD) { |
831 | atomic_inc(¤t->signal->count); | 831 | atomic_inc(¤t->signal->count); |
832 | atomic_inc(¤t->signal->live); | 832 | atomic_inc(¤t->signal->live); |
833 | taskstats_tgid_alloc(current->signal); | 833 | taskstats_tgid_alloc(current); |
834 | return 0; | 834 | return 0; |
835 | } | 835 | } |
836 | sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); | 836 | sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); |
@@ -897,7 +897,6 @@ static inline int copy_signal(unsigned long clone_flags, struct task_struct * ts | |||
897 | void __cleanup_signal(struct signal_struct *sig) | 897 | void __cleanup_signal(struct signal_struct *sig) |
898 | { | 898 | { |
899 | exit_thread_group_keys(sig); | 899 | exit_thread_group_keys(sig); |
900 | taskstats_tgid_free(sig); | ||
901 | kmem_cache_free(signal_cachep, sig); | 900 | kmem_cache_free(signal_cachep, sig); |
902 | } | 901 | } |
903 | 902 | ||
diff --git a/kernel/module.c b/kernel/module.c index 67009bd56c52..5072a943fe35 100644 --- a/kernel/module.c +++ b/kernel/module.c | |||
@@ -1342,7 +1342,7 @@ static void set_license(struct module *mod, const char *license) | |||
1342 | 1342 | ||
1343 | if (!license_is_gpl_compatible(license)) { | 1343 | if (!license_is_gpl_compatible(license)) { |
1344 | if (!(tainted & TAINT_PROPRIETARY_MODULE)) | 1344 | if (!(tainted & TAINT_PROPRIETARY_MODULE)) |
1345 | printk(KERN_WARNING "%s: module license '%s' taints" | 1345 | printk(KERN_WARNING "%s: module license '%s' taints " |
1346 | "kernel.\n", mod->name, license); | 1346 | "kernel.\n", mod->name, license); |
1347 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); | 1347 | add_taint_module(mod, TAINT_PROPRIETARY_MODULE); |
1348 | } | 1348 | } |
diff --git a/kernel/taskstats.c b/kernel/taskstats.c index 5d6a8c54ee85..2039585ec5e1 100644 --- a/kernel/taskstats.c +++ b/kernel/taskstats.c | |||
@@ -77,7 +77,8 @@ static int prepare_reply(struct genl_info *info, u8 cmd, struct sk_buff **skbp, | |||
77 | /* | 77 | /* |
78 | * If new attributes are added, please revisit this allocation | 78 | * If new attributes are added, please revisit this allocation |
79 | */ | 79 | */ |
80 | skb = nlmsg_new(genlmsg_total_size(size), GFP_KERNEL); | 80 | size = nlmsg_total_size(genlmsg_total_size(size)); |
81 | skb = nlmsg_new(size, GFP_KERNEL); | ||
81 | if (!skb) | 82 | if (!skb) |
82 | return -ENOMEM; | 83 | return -ENOMEM; |
83 | 84 | ||
@@ -174,21 +175,19 @@ static void send_cpu_listeners(struct sk_buff *skb, unsigned int cpu) | |||
174 | up_write(&listeners->sem); | 175 | up_write(&listeners->sem); |
175 | } | 176 | } |
176 | 177 | ||
177 | static int fill_pid(pid_t pid, struct task_struct *pidtsk, | 178 | static int fill_pid(pid_t pid, struct task_struct *tsk, |
178 | struct taskstats *stats) | 179 | struct taskstats *stats) |
179 | { | 180 | { |
180 | int rc = 0; | 181 | int rc = 0; |
181 | struct task_struct *tsk = pidtsk; | ||
182 | 182 | ||
183 | if (!pidtsk) { | 183 | if (!tsk) { |
184 | read_lock(&tasklist_lock); | 184 | rcu_read_lock(); |
185 | tsk = find_task_by_pid(pid); | 185 | tsk = find_task_by_pid(pid); |
186 | if (!tsk) { | 186 | if (tsk) |
187 | read_unlock(&tasklist_lock); | 187 | get_task_struct(tsk); |
188 | rcu_read_unlock(); | ||
189 | if (!tsk) | ||
188 | return -ESRCH; | 190 | return -ESRCH; |
189 | } | ||
190 | get_task_struct(tsk); | ||
191 | read_unlock(&tasklist_lock); | ||
192 | } else | 191 | } else |
193 | get_task_struct(tsk); | 192 | get_task_struct(tsk); |
194 | 193 | ||
@@ -214,39 +213,30 @@ static int fill_pid(pid_t pid, struct task_struct *pidtsk, | |||
214 | 213 | ||
215 | } | 214 | } |
216 | 215 | ||
217 | static int fill_tgid(pid_t tgid, struct task_struct *tgidtsk, | 216 | static int fill_tgid(pid_t tgid, struct task_struct *first, |
218 | struct taskstats *stats) | 217 | struct taskstats *stats) |
219 | { | 218 | { |
220 | struct task_struct *tsk, *first; | 219 | struct task_struct *tsk; |
221 | unsigned long flags; | 220 | unsigned long flags; |
221 | int rc = -ESRCH; | ||
222 | 222 | ||
223 | /* | 223 | /* |
224 | * Add additional stats from live tasks except zombie thread group | 224 | * Add additional stats from live tasks except zombie thread group |
225 | * leaders who are already counted with the dead tasks | 225 | * leaders who are already counted with the dead tasks |
226 | */ | 226 | */ |
227 | first = tgidtsk; | 227 | rcu_read_lock(); |
228 | if (!first) { | 228 | if (!first) |
229 | read_lock(&tasklist_lock); | ||
230 | first = find_task_by_pid(tgid); | 229 | first = find_task_by_pid(tgid); |
231 | if (!first) { | ||
232 | read_unlock(&tasklist_lock); | ||
233 | return -ESRCH; | ||
234 | } | ||
235 | get_task_struct(first); | ||
236 | read_unlock(&tasklist_lock); | ||
237 | } else | ||
238 | get_task_struct(first); | ||
239 | 230 | ||
240 | /* Start with stats from dead tasks */ | 231 | if (!first || !lock_task_sighand(first, &flags)) |
241 | spin_lock_irqsave(&first->signal->stats_lock, flags); | 232 | goto out; |
233 | |||
242 | if (first->signal->stats) | 234 | if (first->signal->stats) |
243 | memcpy(stats, first->signal->stats, sizeof(*stats)); | 235 | memcpy(stats, first->signal->stats, sizeof(*stats)); |
244 | spin_unlock_irqrestore(&first->signal->stats_lock, flags); | ||
245 | 236 | ||
246 | tsk = first; | 237 | tsk = first; |
247 | read_lock(&tasklist_lock); | ||
248 | do { | 238 | do { |
249 | if (tsk->exit_state == EXIT_ZOMBIE && thread_group_leader(tsk)) | 239 | if (tsk->exit_state) |
250 | continue; | 240 | continue; |
251 | /* | 241 | /* |
252 | * Accounting subsystem can call its functions here to | 242 | * Accounting subsystem can call its functions here to |
@@ -257,15 +247,18 @@ static int fill_tgid(pid_t tgid, struct task_struct *tgidtsk, | |||
257 | delayacct_add_tsk(stats, tsk); | 247 | delayacct_add_tsk(stats, tsk); |
258 | 248 | ||
259 | } while_each_thread(first, tsk); | 249 | } while_each_thread(first, tsk); |
260 | read_unlock(&tasklist_lock); | ||
261 | stats->version = TASKSTATS_VERSION; | ||
262 | 250 | ||
251 | unlock_task_sighand(first, &flags); | ||
252 | rc = 0; | ||
253 | out: | ||
254 | rcu_read_unlock(); | ||
255 | |||
256 | stats->version = TASKSTATS_VERSION; | ||
263 | /* | 257 | /* |
264 | * Accounting subsytems can also add calls here to modify | 258 | * Accounting subsytems can also add calls here to modify |
265 | * fields of taskstats. | 259 | * fields of taskstats. |
266 | */ | 260 | */ |
267 | 261 | return rc; | |
268 | return 0; | ||
269 | } | 262 | } |
270 | 263 | ||
271 | 264 | ||
@@ -273,7 +266,7 @@ static void fill_tgid_exit(struct task_struct *tsk) | |||
273 | { | 266 | { |
274 | unsigned long flags; | 267 | unsigned long flags; |
275 | 268 | ||
276 | spin_lock_irqsave(&tsk->signal->stats_lock, flags); | 269 | spin_lock_irqsave(&tsk->sighand->siglock, flags); |
277 | if (!tsk->signal->stats) | 270 | if (!tsk->signal->stats) |
278 | goto ret; | 271 | goto ret; |
279 | 272 | ||
@@ -285,7 +278,7 @@ static void fill_tgid_exit(struct task_struct *tsk) | |||
285 | */ | 278 | */ |
286 | delayacct_add_tsk(tsk->signal->stats, tsk); | 279 | delayacct_add_tsk(tsk->signal->stats, tsk); |
287 | ret: | 280 | ret: |
288 | spin_unlock_irqrestore(&tsk->signal->stats_lock, flags); | 281 | spin_unlock_irqrestore(&tsk->sighand->siglock, flags); |
289 | return; | 282 | return; |
290 | } | 283 | } |
291 | 284 | ||
@@ -419,7 +412,7 @@ static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info) | |||
419 | return send_reply(rep_skb, info->snd_pid); | 412 | return send_reply(rep_skb, info->snd_pid); |
420 | 413 | ||
421 | nla_put_failure: | 414 | nla_put_failure: |
422 | return genlmsg_cancel(rep_skb, reply); | 415 | rc = genlmsg_cancel(rep_skb, reply); |
423 | err: | 416 | err: |
424 | nlmsg_free(rep_skb); | 417 | nlmsg_free(rep_skb); |
425 | return rc; | 418 | return rc; |
@@ -461,15 +454,10 @@ void taskstats_exit_send(struct task_struct *tsk, struct taskstats *tidstats, | |||
461 | size_t size; | 454 | size_t size; |
462 | int is_thread_group; | 455 | int is_thread_group; |
463 | struct nlattr *na; | 456 | struct nlattr *na; |
464 | unsigned long flags; | ||
465 | 457 | ||
466 | if (!family_registered || !tidstats) | 458 | if (!family_registered || !tidstats) |
467 | return; | 459 | return; |
468 | 460 | ||
469 | spin_lock_irqsave(&tsk->signal->stats_lock, flags); | ||
470 | is_thread_group = tsk->signal->stats ? 1 : 0; | ||
471 | spin_unlock_irqrestore(&tsk->signal->stats_lock, flags); | ||
472 | |||
473 | rc = 0; | 461 | rc = 0; |
474 | /* | 462 | /* |
475 | * Size includes space for nested attributes | 463 | * Size includes space for nested attributes |
@@ -477,6 +465,7 @@ void taskstats_exit_send(struct task_struct *tsk, struct taskstats *tidstats, | |||
477 | size = nla_total_size(sizeof(u32)) + | 465 | size = nla_total_size(sizeof(u32)) + |
478 | nla_total_size(sizeof(struct taskstats)) + nla_total_size(0); | 466 | nla_total_size(sizeof(struct taskstats)) + nla_total_size(0); |
479 | 467 | ||
468 | is_thread_group = (tsk->signal->stats != NULL); | ||
480 | if (is_thread_group) | 469 | if (is_thread_group) |
481 | size = 2 * size; /* PID + STATS + TGID + STATS */ | 470 | size = 2 * size; /* PID + STATS + TGID + STATS */ |
482 | 471 | ||
@@ -519,7 +508,6 @@ send: | |||
519 | 508 | ||
520 | nla_put_failure: | 509 | nla_put_failure: |
521 | genlmsg_cancel(rep_skb, reply); | 510 | genlmsg_cancel(rep_skb, reply); |
522 | goto ret; | ||
523 | err_skb: | 511 | err_skb: |
524 | nlmsg_free(rep_skb); | 512 | nlmsg_free(rep_skb); |
525 | ret: | 513 | ret: |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 47195fa0ec4f..3afeaa3a73f9 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -161,9 +161,9 @@ void second_overflow(void) | |||
161 | time_adjust += MAX_TICKADJ; | 161 | time_adjust += MAX_TICKADJ; |
162 | tick_length -= MAX_TICKADJ_SCALED; | 162 | tick_length -= MAX_TICKADJ_SCALED; |
163 | } else { | 163 | } else { |
164 | time_adjust = 0; | ||
165 | tick_length += (s64)(time_adjust * NSEC_PER_USEC / | 164 | tick_length += (s64)(time_adjust * NSEC_PER_USEC / |
166 | HZ) << TICK_LENGTH_SHIFT; | 165 | HZ) << TICK_LENGTH_SHIFT; |
166 | time_adjust = 0; | ||
167 | } | 167 | } |
168 | } | 168 | } |
169 | } | 169 | } |
diff --git a/kernel/tsacct.c b/kernel/tsacct.c index db443221ba5b..65a5036a3d95 100644 --- a/kernel/tsacct.c +++ b/kernel/tsacct.c | |||
@@ -36,7 +36,7 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk) | |||
36 | 36 | ||
37 | /* calculate task elapsed time in timespec */ | 37 | /* calculate task elapsed time in timespec */ |
38 | do_posix_clock_monotonic_gettime(&uptime); | 38 | do_posix_clock_monotonic_gettime(&uptime); |
39 | ts = timespec_sub(uptime, current->group_leader->start_time); | 39 | ts = timespec_sub(uptime, tsk->start_time); |
40 | /* rebase elapsed time to usec */ | 40 | /* rebase elapsed time to usec */ |
41 | ac_etime = timespec_to_ns(&ts); | 41 | ac_etime = timespec_to_ns(&ts); |
42 | do_div(ac_etime, NSEC_PER_USEC); | 42 | do_div(ac_etime, NSEC_PER_USEC); |
@@ -58,7 +58,10 @@ void bacct_add_tsk(struct taskstats *stats, struct task_struct *tsk) | |||
58 | stats->ac_uid = tsk->uid; | 58 | stats->ac_uid = tsk->uid; |
59 | stats->ac_gid = tsk->gid; | 59 | stats->ac_gid = tsk->gid; |
60 | stats->ac_pid = tsk->pid; | 60 | stats->ac_pid = tsk->pid; |
61 | stats->ac_ppid = (tsk->parent) ? tsk->parent->pid : 0; | 61 | rcu_read_lock(); |
62 | stats->ac_ppid = pid_alive(tsk) ? | ||
63 | rcu_dereference(tsk->real_parent)->tgid : 0; | ||
64 | rcu_read_unlock(); | ||
62 | stats->ac_utime = cputime_to_msecs(tsk->utime) * USEC_PER_MSEC; | 65 | stats->ac_utime = cputime_to_msecs(tsk->utime) * USEC_PER_MSEC; |
63 | stats->ac_stime = cputime_to_msecs(tsk->stime) * USEC_PER_MSEC; | 66 | stats->ac_stime = cputime_to_msecs(tsk->stime) * USEC_PER_MSEC; |
64 | stats->ac_minflt = tsk->min_flt; | 67 | stats->ac_minflt = tsk->min_flt; |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 3df9bfc7ff78..17c2f03d2c27 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
@@ -99,7 +99,7 @@ static void __queue_work(struct cpu_workqueue_struct *cwq, | |||
99 | * @wq: workqueue to use | 99 | * @wq: workqueue to use |
100 | * @work: work to queue | 100 | * @work: work to queue |
101 | * | 101 | * |
102 | * Returns non-zero if it was successfully added. | 102 | * Returns 0 if @work was already on a queue, non-zero otherwise. |
103 | * | 103 | * |
104 | * We queue the work to the CPU it was submitted, but there is no | 104 | * We queue the work to the CPU it was submitted, but there is no |
105 | * guarantee that it will be processed by that CPU. | 105 | * guarantee that it will be processed by that CPU. |
@@ -138,7 +138,7 @@ static void delayed_work_timer_fn(unsigned long __data) | |||
138 | * @work: work to queue | 138 | * @work: work to queue |
139 | * @delay: number of jiffies to wait before queueing | 139 | * @delay: number of jiffies to wait before queueing |
140 | * | 140 | * |
141 | * Returns non-zero if it was successfully added. | 141 | * Returns 0 if @work was already on a queue, non-zero otherwise. |
142 | */ | 142 | */ |
143 | int fastcall queue_delayed_work(struct workqueue_struct *wq, | 143 | int fastcall queue_delayed_work(struct workqueue_struct *wq, |
144 | struct work_struct *work, unsigned long delay) | 144 | struct work_struct *work, unsigned long delay) |
@@ -169,7 +169,7 @@ EXPORT_SYMBOL_GPL(queue_delayed_work); | |||
169 | * @work: work to queue | 169 | * @work: work to queue |
170 | * @delay: number of jiffies to wait before queueing | 170 | * @delay: number of jiffies to wait before queueing |
171 | * | 171 | * |
172 | * Returns non-zero if it was successfully added. | 172 | * Returns 0 if @work was already on a queue, non-zero otherwise. |
173 | */ | 173 | */ |
174 | int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | 174 | int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, |
175 | struct work_struct *work, unsigned long delay) | 175 | struct work_struct *work, unsigned long delay) |
diff --git a/lib/string.c b/lib/string.c index 63077267367e..a485d75962af 100644 --- a/lib/string.c +++ b/lib/string.c | |||
@@ -320,7 +320,7 @@ char *strstrip(char *s) | |||
320 | return s; | 320 | return s; |
321 | 321 | ||
322 | end = s + size - 1; | 322 | end = s + size - 1; |
323 | while (end != s && isspace(*end)) | 323 | while (end >= s && isspace(*end)) |
324 | end--; | 324 | end--; |
325 | *(end + 1) = '\0'; | 325 | *(end + 1) = '\0'; |
326 | 326 | ||
diff --git a/mm/filemap.c b/mm/filemap.c index cb26e33fd0ff..7b84dc814347 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -467,25 +467,15 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping, | |||
467 | } | 467 | } |
468 | 468 | ||
469 | #ifdef CONFIG_NUMA | 469 | #ifdef CONFIG_NUMA |
470 | struct page *page_cache_alloc(struct address_space *x) | 470 | struct page *__page_cache_alloc(gfp_t gfp) |
471 | { | 471 | { |
472 | if (cpuset_do_page_mem_spread()) { | 472 | if (cpuset_do_page_mem_spread()) { |
473 | int n = cpuset_mem_spread_node(); | 473 | int n = cpuset_mem_spread_node(); |
474 | return alloc_pages_node(n, mapping_gfp_mask(x), 0); | 474 | return alloc_pages_node(n, gfp, 0); |
475 | } | 475 | } |
476 | return alloc_pages(mapping_gfp_mask(x), 0); | 476 | return alloc_pages(gfp, 0); |
477 | } | 477 | } |
478 | EXPORT_SYMBOL(page_cache_alloc); | 478 | EXPORT_SYMBOL(__page_cache_alloc); |
479 | |||
480 | struct page *page_cache_alloc_cold(struct address_space *x) | ||
481 | { | ||
482 | if (cpuset_do_page_mem_spread()) { | ||
483 | int n = cpuset_mem_spread_node(); | ||
484 | return alloc_pages_node(n, mapping_gfp_mask(x)|__GFP_COLD, 0); | ||
485 | } | ||
486 | return alloc_pages(mapping_gfp_mask(x)|__GFP_COLD, 0); | ||
487 | } | ||
488 | EXPORT_SYMBOL(page_cache_alloc_cold); | ||
489 | #endif | 479 | #endif |
490 | 480 | ||
491 | static int __sleep_on_page_lock(void *word) | 481 | static int __sleep_on_page_lock(void *word) |
@@ -826,7 +816,6 @@ struct page * | |||
826 | grab_cache_page_nowait(struct address_space *mapping, unsigned long index) | 816 | grab_cache_page_nowait(struct address_space *mapping, unsigned long index) |
827 | { | 817 | { |
828 | struct page *page = find_get_page(mapping, index); | 818 | struct page *page = find_get_page(mapping, index); |
829 | gfp_t gfp_mask; | ||
830 | 819 | ||
831 | if (page) { | 820 | if (page) { |
832 | if (!TestSetPageLocked(page)) | 821 | if (!TestSetPageLocked(page)) |
@@ -834,9 +823,8 @@ grab_cache_page_nowait(struct address_space *mapping, unsigned long index) | |||
834 | page_cache_release(page); | 823 | page_cache_release(page); |
835 | return NULL; | 824 | return NULL; |
836 | } | 825 | } |
837 | gfp_mask = mapping_gfp_mask(mapping) & ~__GFP_FS; | 826 | page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~__GFP_FS); |
838 | page = alloc_pages(gfp_mask, 0); | 827 | if (page && add_to_page_cache_lru(page, mapping, index, GFP_KERNEL)) { |
839 | if (page && add_to_page_cache_lru(page, mapping, index, gfp_mask)) { | ||
840 | page_cache_release(page); | 828 | page_cache_release(page); |
841 | page = NULL; | 829 | page = NULL; |
842 | } | 830 | } |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 2dbec90dc3ba..a088f593a807 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -478,6 +478,9 @@ int hugetlb_no_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
478 | retry: | 478 | retry: |
479 | page = find_lock_page(mapping, idx); | 479 | page = find_lock_page(mapping, idx); |
480 | if (!page) { | 480 | if (!page) { |
481 | size = i_size_read(mapping->host) >> HPAGE_SHIFT; | ||
482 | if (idx >= size) | ||
483 | goto out; | ||
481 | if (hugetlb_get_quota(mapping)) | 484 | if (hugetlb_get_quota(mapping)) |
482 | goto out; | 485 | goto out; |
483 | page = alloc_huge_page(vma, address); | 486 | page = alloc_huge_page(vma, address); |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index f5fc45472d5c..b55bb358b832 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -2261,7 +2261,7 @@ unsigned long __init __absent_pages_in_range(int nid, | |||
2261 | 2261 | ||
2262 | /* Account for ranges past physical memory on this node */ | 2262 | /* Account for ranges past physical memory on this node */ |
2263 | if (range_end_pfn > prev_end_pfn) | 2263 | if (range_end_pfn > prev_end_pfn) |
2264 | hole_pages = range_end_pfn - | 2264 | hole_pages += range_end_pfn - |
2265 | max(range_start_pfn, prev_end_pfn); | 2265 | max(range_start_pfn, prev_end_pfn); |
2266 | 2266 | ||
2267 | return hole_pages; | 2267 | return hole_pages; |
@@ -2407,7 +2407,7 @@ static void __meminit free_area_init_core(struct pglist_data *pgdat, | |||
2407 | zone->zone_pgdat = pgdat; | 2407 | zone->zone_pgdat = pgdat; |
2408 | zone->free_pages = 0; | 2408 | zone->free_pages = 0; |
2409 | 2409 | ||
2410 | zone->temp_priority = zone->prev_priority = DEF_PRIORITY; | 2410 | zone->prev_priority = DEF_PRIORITY; |
2411 | 2411 | ||
2412 | zone_pcp_init(zone); | 2412 | zone_pcp_init(zone); |
2413 | INIT_LIST_HEAD(&zone->active_list); | 2413 | INIT_LIST_HEAD(&zone->active_list); |
diff --git a/mm/sparse.c b/mm/sparse.c index 86c52ab80878..b3c82ba30012 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
@@ -211,7 +211,7 @@ static struct page *__kmalloc_section_memmap(unsigned long nr_pages) | |||
211 | struct page *page, *ret; | 211 | struct page *page, *ret; |
212 | unsigned long memmap_size = sizeof(struct page) * nr_pages; | 212 | unsigned long memmap_size = sizeof(struct page) * nr_pages; |
213 | 213 | ||
214 | page = alloc_pages(GFP_KERNEL, get_order(memmap_size)); | 214 | page = alloc_pages(GFP_KERNEL|__GFP_NOWARN, get_order(memmap_size)); |
215 | if (page) | 215 | if (page) |
216 | goto got_map_page; | 216 | goto got_map_page; |
217 | 217 | ||
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 1133dd3aafcf..46606c133e82 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -160,13 +160,15 @@ int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages) | |||
160 | return err; | 160 | return err; |
161 | } | 161 | } |
162 | 162 | ||
163 | struct vm_struct *__get_vm_area_node(unsigned long size, unsigned long flags, | 163 | static struct vm_struct *__get_vm_area_node(unsigned long size, unsigned long flags, |
164 | unsigned long start, unsigned long end, int node) | 164 | unsigned long start, unsigned long end, |
165 | int node, gfp_t gfp_mask) | ||
165 | { | 166 | { |
166 | struct vm_struct **p, *tmp, *area; | 167 | struct vm_struct **p, *tmp, *area; |
167 | unsigned long align = 1; | 168 | unsigned long align = 1; |
168 | unsigned long addr; | 169 | unsigned long addr; |
169 | 170 | ||
171 | BUG_ON(in_interrupt()); | ||
170 | if (flags & VM_IOREMAP) { | 172 | if (flags & VM_IOREMAP) { |
171 | int bit = fls(size); | 173 | int bit = fls(size); |
172 | 174 | ||
@@ -180,7 +182,7 @@ struct vm_struct *__get_vm_area_node(unsigned long size, unsigned long flags, | |||
180 | addr = ALIGN(start, align); | 182 | addr = ALIGN(start, align); |
181 | size = PAGE_ALIGN(size); | 183 | size = PAGE_ALIGN(size); |
182 | 184 | ||
183 | area = kmalloc_node(sizeof(*area), GFP_KERNEL, node); | 185 | area = kmalloc_node(sizeof(*area), gfp_mask & GFP_LEVEL_MASK, node); |
184 | if (unlikely(!area)) | 186 | if (unlikely(!area)) |
185 | return NULL; | 187 | return NULL; |
186 | 188 | ||
@@ -236,7 +238,7 @@ out: | |||
236 | struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, | 238 | struct vm_struct *__get_vm_area(unsigned long size, unsigned long flags, |
237 | unsigned long start, unsigned long end) | 239 | unsigned long start, unsigned long end) |
238 | { | 240 | { |
239 | return __get_vm_area_node(size, flags, start, end, -1); | 241 | return __get_vm_area_node(size, flags, start, end, -1, GFP_KERNEL); |
240 | } | 242 | } |
241 | 243 | ||
242 | /** | 244 | /** |
@@ -253,9 +255,11 @@ struct vm_struct *get_vm_area(unsigned long size, unsigned long flags) | |||
253 | return __get_vm_area(size, flags, VMALLOC_START, VMALLOC_END); | 255 | return __get_vm_area(size, flags, VMALLOC_START, VMALLOC_END); |
254 | } | 256 | } |
255 | 257 | ||
256 | struct vm_struct *get_vm_area_node(unsigned long size, unsigned long flags, int node) | 258 | struct vm_struct *get_vm_area_node(unsigned long size, unsigned long flags, |
259 | int node, gfp_t gfp_mask) | ||
257 | { | 260 | { |
258 | return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END, node); | 261 | return __get_vm_area_node(size, flags, VMALLOC_START, VMALLOC_END, node, |
262 | gfp_mask); | ||
259 | } | 263 | } |
260 | 264 | ||
261 | /* Caller must hold vmlist_lock */ | 265 | /* Caller must hold vmlist_lock */ |
@@ -487,7 +491,7 @@ static void *__vmalloc_node(unsigned long size, gfp_t gfp_mask, pgprot_t prot, | |||
487 | if (!size || (size >> PAGE_SHIFT) > num_physpages) | 491 | if (!size || (size >> PAGE_SHIFT) > num_physpages) |
488 | return NULL; | 492 | return NULL; |
489 | 493 | ||
490 | area = get_vm_area_node(size, VM_ALLOC, node); | 494 | area = get_vm_area_node(size, VM_ALLOC, node, gfp_mask); |
491 | if (!area) | 495 | if (!area) |
492 | return NULL; | 496 | return NULL; |
493 | 497 | ||
diff --git a/mm/vmscan.c b/mm/vmscan.c index f05527bf792b..518540a4a2a6 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
@@ -723,6 +723,20 @@ done: | |||
723 | return nr_reclaimed; | 723 | return nr_reclaimed; |
724 | } | 724 | } |
725 | 725 | ||
726 | /* | ||
727 | * We are about to scan this zone at a certain priority level. If that priority | ||
728 | * level is smaller (ie: more urgent) than the previous priority, then note | ||
729 | * that priority level within the zone. This is done so that when the next | ||
730 | * process comes in to scan this zone, it will immediately start out at this | ||
731 | * priority level rather than having to build up its own scanning priority. | ||
732 | * Here, this priority affects only the reclaim-mapped threshold. | ||
733 | */ | ||
734 | static inline void note_zone_scanning_priority(struct zone *zone, int priority) | ||
735 | { | ||
736 | if (priority < zone->prev_priority) | ||
737 | zone->prev_priority = priority; | ||
738 | } | ||
739 | |||
726 | static inline int zone_is_near_oom(struct zone *zone) | 740 | static inline int zone_is_near_oom(struct zone *zone) |
727 | { | 741 | { |
728 | return zone->pages_scanned >= (zone->nr_active + zone->nr_inactive)*3; | 742 | return zone->pages_scanned >= (zone->nr_active + zone->nr_inactive)*3; |
@@ -746,7 +760,7 @@ static inline int zone_is_near_oom(struct zone *zone) | |||
746 | * But we had to alter page->flags anyway. | 760 | * But we had to alter page->flags anyway. |
747 | */ | 761 | */ |
748 | static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | 762 | static void shrink_active_list(unsigned long nr_pages, struct zone *zone, |
749 | struct scan_control *sc) | 763 | struct scan_control *sc, int priority) |
750 | { | 764 | { |
751 | unsigned long pgmoved; | 765 | unsigned long pgmoved; |
752 | int pgdeactivate = 0; | 766 | int pgdeactivate = 0; |
@@ -770,7 +784,7 @@ static void shrink_active_list(unsigned long nr_pages, struct zone *zone, | |||
770 | * `distress' is a measure of how much trouble we're having | 784 | * `distress' is a measure of how much trouble we're having |
771 | * reclaiming pages. 0 -> no problems. 100 -> great trouble. | 785 | * reclaiming pages. 0 -> no problems. 100 -> great trouble. |
772 | */ | 786 | */ |
773 | distress = 100 >> zone->prev_priority; | 787 | distress = 100 >> min(zone->prev_priority, priority); |
774 | 788 | ||
775 | /* | 789 | /* |
776 | * The point of this algorithm is to decide when to start | 790 | * The point of this algorithm is to decide when to start |
@@ -922,7 +936,7 @@ static unsigned long shrink_zone(int priority, struct zone *zone, | |||
922 | nr_to_scan = min(nr_active, | 936 | nr_to_scan = min(nr_active, |
923 | (unsigned long)sc->swap_cluster_max); | 937 | (unsigned long)sc->swap_cluster_max); |
924 | nr_active -= nr_to_scan; | 938 | nr_active -= nr_to_scan; |
925 | shrink_active_list(nr_to_scan, zone, sc); | 939 | shrink_active_list(nr_to_scan, zone, sc, priority); |
926 | } | 940 | } |
927 | 941 | ||
928 | if (nr_inactive) { | 942 | if (nr_inactive) { |
@@ -972,9 +986,7 @@ static unsigned long shrink_zones(int priority, struct zone **zones, | |||
972 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) | 986 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) |
973 | continue; | 987 | continue; |
974 | 988 | ||
975 | zone->temp_priority = priority; | 989 | note_zone_scanning_priority(zone, priority); |
976 | if (zone->prev_priority > priority) | ||
977 | zone->prev_priority = priority; | ||
978 | 990 | ||
979 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) | 991 | if (zone->all_unreclaimable && priority != DEF_PRIORITY) |
980 | continue; /* Let kswapd poll it */ | 992 | continue; /* Let kswapd poll it */ |
@@ -1024,7 +1036,6 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask) | |||
1024 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) | 1036 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) |
1025 | continue; | 1037 | continue; |
1026 | 1038 | ||
1027 | zone->temp_priority = DEF_PRIORITY; | ||
1028 | lru_pages += zone->nr_active + zone->nr_inactive; | 1039 | lru_pages += zone->nr_active + zone->nr_inactive; |
1029 | } | 1040 | } |
1030 | 1041 | ||
@@ -1065,13 +1076,22 @@ unsigned long try_to_free_pages(struct zone **zones, gfp_t gfp_mask) | |||
1065 | if (!sc.all_unreclaimable) | 1076 | if (!sc.all_unreclaimable) |
1066 | ret = 1; | 1077 | ret = 1; |
1067 | out: | 1078 | out: |
1079 | /* | ||
1080 | * Now that we've scanned all the zones at this priority level, note | ||
1081 | * that level within the zone so that the next thread which performs | ||
1082 | * scanning of this zone will immediately start out at this priority | ||
1083 | * level. This affects only the decision whether or not to bring | ||
1084 | * mapped pages onto the inactive list. | ||
1085 | */ | ||
1086 | if (priority < 0) | ||
1087 | priority = 0; | ||
1068 | for (i = 0; zones[i] != 0; i++) { | 1088 | for (i = 0; zones[i] != 0; i++) { |
1069 | struct zone *zone = zones[i]; | 1089 | struct zone *zone = zones[i]; |
1070 | 1090 | ||
1071 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) | 1091 | if (!cpuset_zone_allowed(zone, __GFP_HARDWALL)) |
1072 | continue; | 1092 | continue; |
1073 | 1093 | ||
1074 | zone->prev_priority = zone->temp_priority; | 1094 | zone->prev_priority = priority; |
1075 | } | 1095 | } |
1076 | return ret; | 1096 | return ret; |
1077 | } | 1097 | } |
@@ -1111,6 +1131,11 @@ static unsigned long balance_pgdat(pg_data_t *pgdat, int order) | |||
1111 | .swap_cluster_max = SWAP_CLUSTER_MAX, | 1131 | .swap_cluster_max = SWAP_CLUSTER_MAX, |
1112 | .swappiness = vm_swappiness, | 1132 | .swappiness = vm_swappiness, |
1113 | }; | 1133 | }; |
1134 | /* | ||
1135 | * temp_priority is used to remember the scanning priority at which | ||
1136 | * this zone was successfully refilled to free_pages == pages_high. | ||
1137 | */ | ||
1138 | int temp_priority[MAX_NR_ZONES]; | ||
1114 | 1139 | ||
1115 | loop_again: | 1140 | loop_again: |
1116 | total_scanned = 0; | 1141 | total_scanned = 0; |
@@ -1118,11 +1143,8 @@ loop_again: | |||
1118 | sc.may_writepage = !laptop_mode; | 1143 | sc.may_writepage = !laptop_mode; |
1119 | count_vm_event(PAGEOUTRUN); | 1144 | count_vm_event(PAGEOUTRUN); |
1120 | 1145 | ||
1121 | for (i = 0; i < pgdat->nr_zones; i++) { | 1146 | for (i = 0; i < pgdat->nr_zones; i++) |
1122 | struct zone *zone = pgdat->node_zones + i; | 1147 | temp_priority[i] = DEF_PRIORITY; |
1123 | |||
1124 | zone->temp_priority = DEF_PRIORITY; | ||
1125 | } | ||
1126 | 1148 | ||
1127 | for (priority = DEF_PRIORITY; priority >= 0; priority--) { | 1149 | for (priority = DEF_PRIORITY; priority >= 0; priority--) { |
1128 | int end_zone = 0; /* Inclusive. 0 = ZONE_DMA */ | 1150 | int end_zone = 0; /* Inclusive. 0 = ZONE_DMA */ |
@@ -1183,10 +1205,9 @@ scan: | |||
1183 | if (!zone_watermark_ok(zone, order, zone->pages_high, | 1205 | if (!zone_watermark_ok(zone, order, zone->pages_high, |
1184 | end_zone, 0)) | 1206 | end_zone, 0)) |
1185 | all_zones_ok = 0; | 1207 | all_zones_ok = 0; |
1186 | zone->temp_priority = priority; | 1208 | temp_priority[i] = priority; |
1187 | if (zone->prev_priority > priority) | ||
1188 | zone->prev_priority = priority; | ||
1189 | sc.nr_scanned = 0; | 1209 | sc.nr_scanned = 0; |
1210 | note_zone_scanning_priority(zone, priority); | ||
1190 | nr_reclaimed += shrink_zone(priority, zone, &sc); | 1211 | nr_reclaimed += shrink_zone(priority, zone, &sc); |
1191 | reclaim_state->reclaimed_slab = 0; | 1212 | reclaim_state->reclaimed_slab = 0; |
1192 | nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, | 1213 | nr_slab = shrink_slab(sc.nr_scanned, GFP_KERNEL, |
@@ -1226,10 +1247,15 @@ scan: | |||
1226 | break; | 1247 | break; |
1227 | } | 1248 | } |
1228 | out: | 1249 | out: |
1250 | /* | ||
1251 | * Note within each zone the priority level at which this zone was | ||
1252 | * brought into a happy state. So that the next thread which scans this | ||
1253 | * zone will start out at that priority level. | ||
1254 | */ | ||
1229 | for (i = 0; i < pgdat->nr_zones; i++) { | 1255 | for (i = 0; i < pgdat->nr_zones; i++) { |
1230 | struct zone *zone = pgdat->node_zones + i; | 1256 | struct zone *zone = pgdat->node_zones + i; |
1231 | 1257 | ||
1232 | zone->prev_priority = zone->temp_priority; | 1258 | zone->prev_priority = temp_priority[i]; |
1233 | } | 1259 | } |
1234 | if (!all_zones_ok) { | 1260 | if (!all_zones_ok) { |
1235 | cond_resched(); | 1261 | cond_resched(); |
@@ -1358,7 +1384,7 @@ static unsigned long shrink_all_zones(unsigned long nr_pages, int pass, | |||
1358 | if (zone->nr_scan_active >= nr_pages || pass > 3) { | 1384 | if (zone->nr_scan_active >= nr_pages || pass > 3) { |
1359 | zone->nr_scan_active = 0; | 1385 | zone->nr_scan_active = 0; |
1360 | nr_to_scan = min(nr_pages, zone->nr_active); | 1386 | nr_to_scan = min(nr_pages, zone->nr_active); |
1361 | shrink_active_list(nr_to_scan, zone, sc); | 1387 | shrink_active_list(nr_to_scan, zone, sc, prio); |
1362 | } | 1388 | } |
1363 | } | 1389 | } |
1364 | 1390 | ||
@@ -1614,6 +1640,7 @@ static int __zone_reclaim(struct zone *zone, gfp_t gfp_mask, unsigned int order) | |||
1614 | */ | 1640 | */ |
1615 | priority = ZONE_RECLAIM_PRIORITY; | 1641 | priority = ZONE_RECLAIM_PRIORITY; |
1616 | do { | 1642 | do { |
1643 | note_zone_scanning_priority(zone, priority); | ||
1617 | nr_reclaimed += shrink_zone(priority, zone, &sc); | 1644 | nr_reclaimed += shrink_zone(priority, zone, &sc); |
1618 | priority--; | 1645 | priority--; |
1619 | } while (priority >= 0 && nr_reclaimed < nr_pages); | 1646 | } while (priority >= 0 && nr_reclaimed < nr_pages); |
diff --git a/mm/vmstat.c b/mm/vmstat.c index 45b124e012f5..8614e8f6743b 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c | |||
@@ -587,11 +587,9 @@ static int zoneinfo_show(struct seq_file *m, void *arg) | |||
587 | seq_printf(m, | 587 | seq_printf(m, |
588 | "\n all_unreclaimable: %u" | 588 | "\n all_unreclaimable: %u" |
589 | "\n prev_priority: %i" | 589 | "\n prev_priority: %i" |
590 | "\n temp_priority: %i" | ||
591 | "\n start_pfn: %lu", | 590 | "\n start_pfn: %lu", |
592 | zone->all_unreclaimable, | 591 | zone->all_unreclaimable, |
593 | zone->prev_priority, | 592 | zone->prev_priority, |
594 | zone->temp_priority, | ||
595 | zone->zone_start_pfn); | 593 | zone->zone_start_pfn); |
596 | spin_unlock_irqrestore(&zone->lock, flags); | 594 | spin_unlock_irqrestore(&zone->lock, flags); |
597 | seq_putc(m, '\n'); | 595 | seq_putc(m, '\n'); |
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c index 96bcb2ff59ab..de9d1a9473f2 100644 --- a/net/bridge/br_sysfs_br.c +++ b/net/bridge/br_sysfs_br.c | |||
@@ -376,7 +376,7 @@ int br_sysfs_addbr(struct net_device *dev) | |||
376 | 376 | ||
377 | err = sysfs_create_bin_file(brobj, &bridge_forward); | 377 | err = sysfs_create_bin_file(brobj, &bridge_forward); |
378 | if (err) { | 378 | if (err) { |
379 | pr_info("%s: can't create attribue file %s/%s\n", | 379 | pr_info("%s: can't create attribute file %s/%s\n", |
380 | __FUNCTION__, dev->name, bridge_forward.attr.name); | 380 | __FUNCTION__, dev->name, bridge_forward.attr.name); |
381 | goto out2; | 381 | goto out2; |
382 | } | 382 | } |
diff --git a/net/ieee80211/Kconfig b/net/ieee80211/Kconfig index f7e84e9d13ad..a64be6cdf078 100644 --- a/net/ieee80211/Kconfig +++ b/net/ieee80211/Kconfig | |||
@@ -32,6 +32,7 @@ config IEEE80211_CRYPT_WEP | |||
32 | depends on IEEE80211 | 32 | depends on IEEE80211 |
33 | select CRYPTO | 33 | select CRYPTO |
34 | select CRYPTO_ARC4 | 34 | select CRYPTO_ARC4 |
35 | select CRYPTO_ECB | ||
35 | select CRC32 | 36 | select CRC32 |
36 | ---help--- | 37 | ---help--- |
37 | Include software based cipher suites in support of IEEE | 38 | Include software based cipher suites in support of IEEE |
@@ -58,6 +59,7 @@ config IEEE80211_CRYPT_TKIP | |||
58 | depends on IEEE80211 && NET_RADIO | 59 | depends on IEEE80211 && NET_RADIO |
59 | select CRYPTO | 60 | select CRYPTO |
60 | select CRYPTO_MICHAEL_MIC | 61 | select CRYPTO_MICHAEL_MIC |
62 | select CRYPTO_ECB | ||
61 | select CRC32 | 63 | select CRC32 |
62 | ---help--- | 64 | ---help--- |
63 | Include software based cipher suites in support of IEEE 802.11i | 65 | Include software based cipher suites in support of IEEE 802.11i |
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index a60ef38d75c6..6ad184802266 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c | |||
@@ -190,7 +190,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
190 | */ | 190 | */ |
191 | 191 | ||
192 | /* change the unit from HZ to bictcp_HZ */ | 192 | /* change the unit from HZ to bictcp_HZ */ |
193 | t = ((tcp_time_stamp + ca->delay_min - ca->epoch_start) | 193 | t = ((tcp_time_stamp + (ca->delay_min>>3) - ca->epoch_start) |
194 | << BICTCP_HZ) / HZ; | 194 | << BICTCP_HZ) / HZ; |
195 | 195 | ||
196 | if (t < ca->bic_K) /* t - K */ | 196 | if (t < ca->bic_K) /* t - K */ |
@@ -259,7 +259,7 @@ static inline void measure_delay(struct sock *sk) | |||
259 | (s32)(tcp_time_stamp - ca->epoch_start) < HZ) | 259 | (s32)(tcp_time_stamp - ca->epoch_start) < HZ) |
260 | return; | 260 | return; |
261 | 261 | ||
262 | delay = tcp_time_stamp - tp->rx_opt.rcv_tsecr; | 262 | delay = (tcp_time_stamp - tp->rx_opt.rcv_tsecr)<<3; |
263 | if (delay == 0) | 263 | if (delay == 0) |
264 | delay = 1; | 264 | delay = 1; |
265 | 265 | ||
@@ -366,7 +366,7 @@ static int __init cubictcp_register(void) | |||
366 | 366 | ||
367 | beta_scale = 8*(BICTCP_BETA_SCALE+beta)/ 3 / (BICTCP_BETA_SCALE - beta); | 367 | beta_scale = 8*(BICTCP_BETA_SCALE+beta)/ 3 / (BICTCP_BETA_SCALE - beta); |
368 | 368 | ||
369 | cube_rtt_scale = (bic_scale << 3) / 10; /* 1024*c/rtt */ | 369 | cube_rtt_scale = (bic_scale * 10); /* 1024*c/rtt */ |
370 | 370 | ||
371 | /* calculate the "K" for (wmax-cwnd) = c/rtt * K^3 | 371 | /* calculate the "K" for (wmax-cwnd) = c/rtt * K^3 |
372 | * so K = cubic_root( (wmax-cwnd)*rtt/c ) | 372 | * so K = cubic_root( (wmax-cwnd)*rtt/c ) |
diff --git a/net/ipv4/tcp_htcp.c b/net/ipv4/tcp_htcp.c index 682e7d5b6f2f..283be3cb4667 100644 --- a/net/ipv4/tcp_htcp.c +++ b/net/ipv4/tcp_htcp.c | |||
@@ -23,7 +23,7 @@ module_param(use_bandwidth_switch, int, 0644); | |||
23 | MODULE_PARM_DESC(use_bandwidth_switch, "turn on/off bandwidth switcher"); | 23 | MODULE_PARM_DESC(use_bandwidth_switch, "turn on/off bandwidth switcher"); |
24 | 24 | ||
25 | struct htcp { | 25 | struct htcp { |
26 | u16 alpha; /* Fixed point arith, << 7 */ | 26 | u32 alpha; /* Fixed point arith, << 7 */ |
27 | u8 beta; /* Fixed point arith, << 7 */ | 27 | u8 beta; /* Fixed point arith, << 7 */ |
28 | u8 modeswitch; /* Delay modeswitch until we had at least one congestion event */ | 28 | u8 modeswitch; /* Delay modeswitch until we had at least one congestion event */ |
29 | u32 last_cong; /* Time since last congestion event end */ | 29 | u32 last_cong; /* Time since last congestion event end */ |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 41277963f47a..2e1141623147 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -921,6 +921,8 @@ static int init_section_ref_ok(const char *name) | |||
921 | ".fixup", | 921 | ".fixup", |
922 | ".smp_locks", | 922 | ".smp_locks", |
923 | ".plt", /* seen on ARCH=um build on x86_64. Harmless */ | 923 | ".plt", /* seen on ARCH=um build on x86_64. Harmless */ |
924 | "__ftr_fixup", /* powerpc cpu feature fixup */ | ||
925 | "__fw_ftr_fixup", /* powerpc firmware feature fixup */ | ||
924 | NULL | 926 | NULL |
925 | }; | 927 | }; |
926 | /* Start of section names */ | 928 | /* Start of section names */ |