aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MAINTAINERS4
-rw-r--r--arch/ia64/Kconfig2
-rw-r--r--arch/ia64/kernel/module.c11
-rw-r--r--arch/powerpc/Kconfig2
-rw-r--r--arch/sparc64/Kconfig2
-rw-r--r--arch/sparc64/mm/init.c5
-rw-r--r--arch/x86/kernel/test_nx.c5
-rw-r--r--arch/x86/lib/usercopy_32.c2
-rw-r--r--drivers/firewire/fw-cdev.c3
-rw-r--r--drivers/firewire/fw-device.c38
-rw-r--r--drivers/firewire/fw-device.h12
-rw-r--r--drivers/firewire/fw-ohci.c390
-rw-r--r--drivers/firewire/fw-sbp2.c127
-rw-r--r--drivers/firewire/fw-topology.c6
-rw-r--r--drivers/firewire/fw-transaction.c4
-rw-r--r--drivers/ieee1394/dma.c39
-rw-r--r--drivers/ieee1394/ieee1394_transactions.c68
-rw-r--r--drivers/ieee1394/ohci1394.c12
-rw-r--r--drivers/ieee1394/raw1394.c4
-rw-r--r--drivers/ieee1394/sbp2.c52
-rw-r--r--drivers/ieee1394/sbp2.h1
-rw-r--r--include/asm-alpha/tlbflush.h1
-rw-r--r--include/asm-ia64/percpu.h35
-rw-r--r--include/asm-powerpc/percpu.h31
-rw-r--r--include/asm-s390/percpu.h42
-rw-r--r--include/asm-sparc64/percpu.h22
-rw-r--r--include/asm-x86/thread_info_64.h4
-rw-r--r--include/linux/percpu.h4
28 files changed, 468 insertions, 460 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index ba05e8058689..2d5ff3e34699 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1595,7 +1595,7 @@ P: Alexander Viro
1595M: viro@zeniv.linux.org.uk 1595M: viro@zeniv.linux.org.uk
1596S: Maintained 1596S: Maintained
1597 1597
1598FIREWIRE SUBSYSTEM 1598FIREWIRE SUBSYSTEM (drivers/firewire, <linux/firewire*.h>)
1599P: Kristian Hoegsberg, Stefan Richter 1599P: Kristian Hoegsberg, Stefan Richter
1600M: krh@redhat.com, stefanr@s5r6.in-berlin.de 1600M: krh@redhat.com, stefanr@s5r6.in-berlin.de
1601L: linux1394-devel@lists.sourceforge.net 1601L: linux1394-devel@lists.sourceforge.net
@@ -1917,7 +1917,7 @@ L: linux-ide@vger.kernel.org
1917L: linux-scsi@vger.kernel.org 1917L: linux-scsi@vger.kernel.org
1918S: Orphan 1918S: Orphan
1919 1919
1920IEEE 1394 SUBSYSTEM 1920IEEE 1394 SUBSYSTEM (drivers/ieee1394)
1921P: Ben Collins 1921P: Ben Collins
1922M: ben.collins@ubuntu.com 1922M: ben.collins@ubuntu.com
1923P: Stefan Richter 1923P: Stefan Richter
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 5a41e75ae1fe..c9307c99a1dc 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -80,7 +80,7 @@ config GENERIC_TIME_VSYSCALL
80 bool 80 bool
81 default y 81 default y
82 82
83config ARCH_SETS_UP_PER_CPU_AREA 83config HAVE_SETUP_PER_CPU_AREA
84 def_bool y 84 def_bool y
85 85
86config DMI 86config DMI
diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c
index e699eb6c44be..e58f4367cf11 100644
--- a/arch/ia64/kernel/module.c
+++ b/arch/ia64/kernel/module.c
@@ -940,14 +940,3 @@ module_arch_cleanup (struct module *mod)
940 if (mod->arch.core_unw_table) 940 if (mod->arch.core_unw_table)
941 unw_remove_unwind_table(mod->arch.core_unw_table); 941 unw_remove_unwind_table(mod->arch.core_unw_table);
942} 942}
943
944#ifdef CONFIG_SMP
945void
946percpu_modcopy (void *pcpudst, const void *src, unsigned long size)
947{
948 unsigned int i;
949 for_each_possible_cpu(i) {
950 memcpy(pcpudst + per_cpu_offset(i), src, size);
951 }
952}
953#endif /* CONFIG_SMP */
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 2bf2f3f53029..9c44af3db8d9 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -42,7 +42,7 @@ config GENERIC_HARDIRQS
42 bool 42 bool
43 default y 43 default y
44 44
45config ARCH_SETS_UP_PER_CPU_AREA 45config HAVE_SETUP_PER_CPU_AREA
46 def_bool PPC64 46 def_bool PPC64
47 47
48config IRQ_PER_CPU 48config IRQ_PER_CPU
diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig
index 26f5791baa33..73fc05d0bfad 100644
--- a/arch/sparc64/Kconfig
+++ b/arch/sparc64/Kconfig
@@ -66,7 +66,7 @@ config AUDIT_ARCH
66 bool 66 bool
67 default y 67 default y
68 68
69config ARCH_SETS_UP_PER_CPU_AREA 69config HAVE_SETUP_PER_CPU_AREA
70 def_bool y 70 def_bool y
71 71
72config ARCH_NO_VIRT_TO_BUS 72config ARCH_NO_VIRT_TO_BUS
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
index fbeb55d71e76..523e993ee90c 100644
--- a/arch/sparc64/mm/init.c
+++ b/arch/sparc64/mm/init.c
@@ -1328,6 +1328,11 @@ pgd_t swapper_pg_dir[2048];
1328static void sun4u_pgprot_init(void); 1328static void sun4u_pgprot_init(void);
1329static void sun4v_pgprot_init(void); 1329static void sun4v_pgprot_init(void);
1330 1330
1331/* Dummy function */
1332void __init setup_per_cpu_areas(void)
1333{
1334}
1335
1331void __init paging_init(void) 1336void __init paging_init(void)
1332{ 1337{
1333 unsigned long end_pfn, pages_avail, shift, phys_base; 1338 unsigned long end_pfn, pages_avail, shift, phys_base;
diff --git a/arch/x86/kernel/test_nx.c b/arch/x86/kernel/test_nx.c
index 6d7ef11e7975..ae0ef2e304c7 100644
--- a/arch/x86/kernel/test_nx.c
+++ b/arch/x86/kernel/test_nx.c
@@ -91,8 +91,13 @@ static noinline int test_address(void *address)
91 ".previous\n" 91 ".previous\n"
92 ".section __ex_table,\"a\"\n" 92 ".section __ex_table,\"a\"\n"
93 " .align 8\n" 93 " .align 8\n"
94#ifdef CONFIG_X86_32
95 " .long 0b\n"
96 " .long 2b\n"
97#else
94 " .quad 0b\n" 98 " .quad 0b\n"
95 " .quad 2b\n" 99 " .quad 2b\n"
100#endif
96 ".previous\n" 101 ".previous\n"
97 : [rslt] "=r" (result) 102 : [rslt] "=r" (result)
98 : [fake_code] "r" (address), [zero] "r" (0UL), "0" (result) 103 : [fake_code] "r" (address), [zero] "r" (0UL), "0" (result)
diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c
index 8bab2b2efaff..9c4ffd5bedb2 100644
--- a/arch/x86/lib/usercopy_32.c
+++ b/arch/x86/lib/usercopy_32.c
@@ -817,6 +817,7 @@ unsigned long __copy_from_user_ll_nocache(void *to, const void __user *from,
817#endif 817#endif
818 return n; 818 return n;
819} 819}
820EXPORT_SYMBOL(__copy_from_user_ll_nocache);
820 821
821unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *from, 822unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *from,
822 unsigned long n) 823 unsigned long n)
@@ -831,6 +832,7 @@ unsigned long __copy_from_user_ll_nocache_nozero(void *to, const void __user *fr
831#endif 832#endif
832 return n; 833 return n;
833} 834}
835EXPORT_SYMBOL(__copy_from_user_ll_nocache_nozero);
834 836
835/** 837/**
836 * copy_to_user: - Copy a block of data into user space. 838 * copy_to_user: - Copy a block of data into user space.
diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c
index 60f1a8924a95..7e73cbaa4121 100644
--- a/drivers/firewire/fw-cdev.c
+++ b/drivers/firewire/fw-cdev.c
@@ -206,12 +206,13 @@ fill_bus_reset_event(struct fw_cdev_event_bus_reset *event,
206 206
207 event->closure = client->bus_reset_closure; 207 event->closure = client->bus_reset_closure;
208 event->type = FW_CDEV_EVENT_BUS_RESET; 208 event->type = FW_CDEV_EVENT_BUS_RESET;
209 event->generation = client->device->generation;
210 smp_rmb(); /* node_id must not be older than generation */
209 event->node_id = client->device->node_id; 211 event->node_id = client->device->node_id;
210 event->local_node_id = card->local_node->node_id; 212 event->local_node_id = card->local_node->node_id;
211 event->bm_node_id = 0; /* FIXME: We don't track the BM. */ 213 event->bm_node_id = 0; /* FIXME: We don't track the BM. */
212 event->irm_node_id = card->irm_node->node_id; 214 event->irm_node_id = card->irm_node->node_id;
213 event->root_node_id = card->root_node->node_id; 215 event->root_node_id = card->root_node->node_id;
214 event->generation = card->generation;
215} 216}
216 217
217static void 218static void
diff --git a/drivers/firewire/fw-device.c b/drivers/firewire/fw-device.c
index 56681b3b297b..de9066e69adf 100644
--- a/drivers/firewire/fw-device.c
+++ b/drivers/firewire/fw-device.c
@@ -27,6 +27,7 @@
27#include <linux/idr.h> 27#include <linux/idr.h>
28#include <linux/rwsem.h> 28#include <linux/rwsem.h>
29#include <asm/semaphore.h> 29#include <asm/semaphore.h>
30#include <asm/system.h>
30#include <linux/ctype.h> 31#include <linux/ctype.h>
31#include "fw-transaction.h" 32#include "fw-transaction.h"
32#include "fw-topology.h" 33#include "fw-topology.h"
@@ -182,9 +183,14 @@ static void fw_device_release(struct device *dev)
182 183
183int fw_device_enable_phys_dma(struct fw_device *device) 184int fw_device_enable_phys_dma(struct fw_device *device)
184{ 185{
186 int generation = device->generation;
187
188 /* device->node_id, accessed below, must not be older than generation */
189 smp_rmb();
190
185 return device->card->driver->enable_phys_dma(device->card, 191 return device->card->driver->enable_phys_dma(device->card,
186 device->node_id, 192 device->node_id,
187 device->generation); 193 generation);
188} 194}
189EXPORT_SYMBOL(fw_device_enable_phys_dma); 195EXPORT_SYMBOL(fw_device_enable_phys_dma);
190 196
@@ -384,17 +390,21 @@ complete_transaction(struct fw_card *card, int rcode,
384 complete(&callback_data->done); 390 complete(&callback_data->done);
385} 391}
386 392
387static int read_rom(struct fw_device *device, int index, u32 * data) 393static int
394read_rom(struct fw_device *device, int generation, int index, u32 *data)
388{ 395{
389 struct read_quadlet_callback_data callback_data; 396 struct read_quadlet_callback_data callback_data;
390 struct fw_transaction t; 397 struct fw_transaction t;
391 u64 offset; 398 u64 offset;
392 399
400 /* device->node_id, accessed below, must not be older than generation */
401 smp_rmb();
402
393 init_completion(&callback_data.done); 403 init_completion(&callback_data.done);
394 404
395 offset = 0xfffff0000400ULL + index * 4; 405 offset = 0xfffff0000400ULL + index * 4;
396 fw_send_request(device->card, &t, TCODE_READ_QUADLET_REQUEST, 406 fw_send_request(device->card, &t, TCODE_READ_QUADLET_REQUEST,
397 device->node_id, device->generation, device->max_speed, 407 device->node_id, generation, device->max_speed,
398 offset, NULL, 4, complete_transaction, &callback_data); 408 offset, NULL, 4, complete_transaction, &callback_data);
399 409
400 wait_for_completion(&callback_data.done); 410 wait_for_completion(&callback_data.done);
@@ -404,7 +414,14 @@ static int read_rom(struct fw_device *device, int index, u32 * data)
404 return callback_data.rcode; 414 return callback_data.rcode;
405} 415}
406 416
407static int read_bus_info_block(struct fw_device *device) 417/*
418 * Read the bus info block, perform a speed probe, and read all of the rest of
419 * the config ROM. We do all this with a cached bus generation. If the bus
420 * generation changes under us, read_bus_info_block will fail and get retried.
421 * It's better to start all over in this case because the node from which we
422 * are reading the ROM may have changed the ROM during the reset.
423 */
424static int read_bus_info_block(struct fw_device *device, int generation)
408{ 425{
409 static u32 rom[256]; 426 static u32 rom[256];
410 u32 stack[16], sp, key; 427 u32 stack[16], sp, key;
@@ -414,7 +431,7 @@ static int read_bus_info_block(struct fw_device *device)
414 431
415 /* First read the bus info block. */ 432 /* First read the bus info block. */
416 for (i = 0; i < 5; i++) { 433 for (i = 0; i < 5; i++) {
417 if (read_rom(device, i, &rom[i]) != RCODE_COMPLETE) 434 if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE)
418 return -1; 435 return -1;
419 /* 436 /*
420 * As per IEEE1212 7.2, during power-up, devices can 437 * As per IEEE1212 7.2, during power-up, devices can
@@ -449,7 +466,8 @@ static int read_bus_info_block(struct fw_device *device)
449 device->max_speed = device->card->link_speed; 466 device->max_speed = device->card->link_speed;
450 467
451 while (device->max_speed > SCODE_100) { 468 while (device->max_speed > SCODE_100) {
452 if (read_rom(device, 0, &dummy) == RCODE_COMPLETE) 469 if (read_rom(device, generation, 0, &dummy) ==
470 RCODE_COMPLETE)
453 break; 471 break;
454 device->max_speed--; 472 device->max_speed--;
455 } 473 }
@@ -482,7 +500,7 @@ static int read_bus_info_block(struct fw_device *device)
482 return -1; 500 return -1;
483 501
484 /* Read header quadlet for the block to get the length. */ 502 /* Read header quadlet for the block to get the length. */
485 if (read_rom(device, i, &rom[i]) != RCODE_COMPLETE) 503 if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE)
486 return -1; 504 return -1;
487 end = i + (rom[i] >> 16) + 1; 505 end = i + (rom[i] >> 16) + 1;
488 i++; 506 i++;
@@ -501,7 +519,8 @@ static int read_bus_info_block(struct fw_device *device)
501 * it references another block, and push it in that case. 519 * it references another block, and push it in that case.
502 */ 520 */
503 while (i < end) { 521 while (i < end) {
504 if (read_rom(device, i, &rom[i]) != RCODE_COMPLETE) 522 if (read_rom(device, generation, i, &rom[i]) !=
523 RCODE_COMPLETE)
505 return -1; 524 return -1;
506 if ((key >> 30) == 3 && (rom[i] >> 30) > 1 && 525 if ((key >> 30) == 3 && (rom[i] >> 30) > 1 &&
507 sp < ARRAY_SIZE(stack)) 526 sp < ARRAY_SIZE(stack))
@@ -648,7 +667,7 @@ static void fw_device_init(struct work_struct *work)
648 * device. 667 * device.
649 */ 668 */
650 669
651 if (read_bus_info_block(device) < 0) { 670 if (read_bus_info_block(device, device->generation) < 0) {
652 if (device->config_rom_retries < MAX_RETRIES) { 671 if (device->config_rom_retries < MAX_RETRIES) {
653 device->config_rom_retries++; 672 device->config_rom_retries++;
654 schedule_delayed_work(&device->work, RETRY_DELAY); 673 schedule_delayed_work(&device->work, RETRY_DELAY);
@@ -801,6 +820,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
801 820
802 device = node->data; 821 device = node->data;
803 device->node_id = node->node_id; 822 device->node_id = node->node_id;
823 smp_wmb(); /* update node_id before generation */
804 device->generation = card->generation; 824 device->generation = card->generation;
805 if (atomic_read(&device->state) == FW_DEVICE_RUNNING) { 825 if (atomic_read(&device->state) == FW_DEVICE_RUNNING) {
806 PREPARE_DELAYED_WORK(&device->work, fw_device_update); 826 PREPARE_DELAYED_WORK(&device->work, fw_device_update);
diff --git a/drivers/firewire/fw-device.h b/drivers/firewire/fw-device.h
index 894d4a92a18e..0854fe2bc110 100644
--- a/drivers/firewire/fw-device.h
+++ b/drivers/firewire/fw-device.h
@@ -35,6 +35,18 @@ struct fw_attribute_group {
35 struct attribute *attrs[11]; 35 struct attribute *attrs[11];
36}; 36};
37 37
38/*
39 * Note, fw_device.generation always has to be read before fw_device.node_id.
40 * Use SMP memory barriers to ensure this. Otherwise requests will be sent
41 * to an outdated node_id if the generation was updated in the meantime due
42 * to a bus reset.
43 *
44 * Likewise, fw-core will take care to update .node_id before .generation so
45 * that whenever fw_device.generation is current WRT the actual bus generation,
46 * fw_device.node_id is guaranteed to be current too.
47 *
48 * The same applies to fw_device.card->node_id vs. fw_device.generation.
49 */
38struct fw_device { 50struct fw_device {
39 atomic_t state; 51 atomic_t state;
40 struct fw_node *node; 52 struct fw_node *node;
diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
index 436a855a4c60..7ebad3c14cb8 100644
--- a/drivers/firewire/fw-ohci.c
+++ b/drivers/firewire/fw-ohci.c
@@ -98,17 +98,48 @@ struct context;
98typedef int (*descriptor_callback_t)(struct context *ctx, 98typedef int (*descriptor_callback_t)(struct context *ctx,
99 struct descriptor *d, 99 struct descriptor *d,
100 struct descriptor *last); 100 struct descriptor *last);
101
102/*
103 * A buffer that contains a block of DMA-able coherent memory used for
104 * storing a portion of a DMA descriptor program.
105 */
106struct descriptor_buffer {
107 struct list_head list;
108 dma_addr_t buffer_bus;
109 size_t buffer_size;
110 size_t used;
111 struct descriptor buffer[0];
112};
113
101struct context { 114struct context {
102 struct fw_ohci *ohci; 115 struct fw_ohci *ohci;
103 u32 regs; 116 u32 regs;
117 int total_allocation;
104 118
105 struct descriptor *buffer; 119 /*
106 dma_addr_t buffer_bus; 120 * List of page-sized buffers for storing DMA descriptors.
107 size_t buffer_size; 121 * Head of list contains buffers in use and tail of list contains
108 struct descriptor *head_descriptor; 122 * free buffers.
109 struct descriptor *tail_descriptor; 123 */
110 struct descriptor *tail_descriptor_last; 124 struct list_head buffer_list;
111 struct descriptor *prev_descriptor; 125
126 /*
127 * Pointer to a buffer inside buffer_list that contains the tail
128 * end of the current DMA program.
129 */
130 struct descriptor_buffer *buffer_tail;
131
132 /*
133 * The descriptor containing the branch address of the first
134 * descriptor that has not yet been filled by the device.
135 */
136 struct descriptor *last;
137
138 /*
139 * The last descriptor in the DMA program. It contains the branch
140 * address that must be updated upon appending a new descriptor.
141 */
142 struct descriptor *prev;
112 143
113 descriptor_callback_t callback; 144 descriptor_callback_t callback;
114 145
@@ -125,6 +156,7 @@ struct context {
125struct iso_context { 156struct iso_context {
126 struct fw_iso_context base; 157 struct fw_iso_context base;
127 struct context context; 158 struct context context;
159 int excess_bytes;
128 void *header; 160 void *header;
129 size_t header_length; 161 size_t header_length;
130}; 162};
@@ -197,8 +229,6 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card)
197#define SELF_ID_BUF_SIZE 0x800 229#define SELF_ID_BUF_SIZE 0x800
198#define OHCI_TCODE_PHY_PACKET 0x0e 230#define OHCI_TCODE_PHY_PACKET 0x0e
199#define OHCI_VERSION_1_1 0x010010 231#define OHCI_VERSION_1_1 0x010010
200#define ISO_BUFFER_SIZE (64 * 1024)
201#define AT_BUFFER_SIZE 4096
202 232
203static char ohci_driver_name[] = KBUILD_MODNAME; 233static char ohci_driver_name[] = KBUILD_MODNAME;
204 234
@@ -455,71 +485,108 @@ find_branch_descriptor(struct descriptor *d, int z)
455static void context_tasklet(unsigned long data) 485static void context_tasklet(unsigned long data)
456{ 486{
457 struct context *ctx = (struct context *) data; 487 struct context *ctx = (struct context *) data;
458 struct fw_ohci *ohci = ctx->ohci;
459 struct descriptor *d, *last; 488 struct descriptor *d, *last;
460 u32 address; 489 u32 address;
461 int z; 490 int z;
491 struct descriptor_buffer *desc;
462 492
463 dma_sync_single_for_cpu(ohci->card.device, ctx->buffer_bus, 493 desc = list_entry(ctx->buffer_list.next,
464 ctx->buffer_size, DMA_TO_DEVICE); 494 struct descriptor_buffer, list);
465 495 last = ctx->last;
466 d = ctx->tail_descriptor;
467 last = ctx->tail_descriptor_last;
468
469 while (last->branch_address != 0) { 496 while (last->branch_address != 0) {
497 struct descriptor_buffer *old_desc = desc;
470 address = le32_to_cpu(last->branch_address); 498 address = le32_to_cpu(last->branch_address);
471 z = address & 0xf; 499 z = address & 0xf;
472 d = ctx->buffer + (address - ctx->buffer_bus) / sizeof(*d); 500 address &= ~0xf;
501
502 /* If the branch address points to a buffer outside of the
503 * current buffer, advance to the next buffer. */
504 if (address < desc->buffer_bus ||
505 address >= desc->buffer_bus + desc->used)
506 desc = list_entry(desc->list.next,
507 struct descriptor_buffer, list);
508 d = desc->buffer + (address - desc->buffer_bus) / sizeof(*d);
473 last = find_branch_descriptor(d, z); 509 last = find_branch_descriptor(d, z);
474 510
475 if (!ctx->callback(ctx, d, last)) 511 if (!ctx->callback(ctx, d, last))
476 break; 512 break;
477 513
478 ctx->tail_descriptor = d; 514 if (old_desc != desc) {
479 ctx->tail_descriptor_last = last; 515 /* If we've advanced to the next buffer, move the
516 * previous buffer to the free list. */
517 unsigned long flags;
518 old_desc->used = 0;
519 spin_lock_irqsave(&ctx->ohci->lock, flags);
520 list_move_tail(&old_desc->list, &ctx->buffer_list);
521 spin_unlock_irqrestore(&ctx->ohci->lock, flags);
522 }
523 ctx->last = last;
480 } 524 }
481} 525}
482 526
527/*
528 * Allocate a new buffer and add it to the list of free buffers for this
529 * context. Must be called with ohci->lock held.
530 */
531static int
532context_add_buffer(struct context *ctx)
533{
534 struct descriptor_buffer *desc;
535 dma_addr_t bus_addr;
536 int offset;
537
538 /*
539 * 16MB of descriptors should be far more than enough for any DMA
540 * program. This will catch run-away userspace or DoS attacks.
541 */
542 if (ctx->total_allocation >= 16*1024*1024)
543 return -ENOMEM;
544
545 desc = dma_alloc_coherent(ctx->ohci->card.device, PAGE_SIZE,
546 &bus_addr, GFP_ATOMIC);
547 if (!desc)
548 return -ENOMEM;
549
550 offset = (void *)&desc->buffer - (void *)desc;
551 desc->buffer_size = PAGE_SIZE - offset;
552 desc->buffer_bus = bus_addr + offset;
553 desc->used = 0;
554
555 list_add_tail(&desc->list, &ctx->buffer_list);
556 ctx->total_allocation += PAGE_SIZE;
557
558 return 0;
559}
560
483static int 561static int
484context_init(struct context *ctx, struct fw_ohci *ohci, 562context_init(struct context *ctx, struct fw_ohci *ohci,
485 size_t buffer_size, u32 regs, 563 u32 regs, descriptor_callback_t callback)
486 descriptor_callback_t callback)
487{ 564{
488 ctx->ohci = ohci; 565 ctx->ohci = ohci;
489 ctx->regs = regs; 566 ctx->regs = regs;
490 ctx->buffer_size = buffer_size; 567 ctx->total_allocation = 0;
491 ctx->buffer = kmalloc(buffer_size, GFP_KERNEL); 568
492 if (ctx->buffer == NULL) 569 INIT_LIST_HEAD(&ctx->buffer_list);
570 if (context_add_buffer(ctx) < 0)
493 return -ENOMEM; 571 return -ENOMEM;
494 572
573 ctx->buffer_tail = list_entry(ctx->buffer_list.next,
574 struct descriptor_buffer, list);
575
495 tasklet_init(&ctx->tasklet, context_tasklet, (unsigned long)ctx); 576 tasklet_init(&ctx->tasklet, context_tasklet, (unsigned long)ctx);
496 ctx->callback = callback; 577 ctx->callback = callback;
497 578
498 ctx->buffer_bus =
499 dma_map_single(ohci->card.device, ctx->buffer,
500 buffer_size, DMA_TO_DEVICE);
501 if (dma_mapping_error(ctx->buffer_bus)) {
502 kfree(ctx->buffer);
503 return -ENOMEM;
504 }
505
506 ctx->head_descriptor = ctx->buffer;
507 ctx->prev_descriptor = ctx->buffer;
508 ctx->tail_descriptor = ctx->buffer;
509 ctx->tail_descriptor_last = ctx->buffer;
510
511 /* 579 /*
512 * We put a dummy descriptor in the buffer that has a NULL 580 * We put a dummy descriptor in the buffer that has a NULL
513 * branch address and looks like it's been sent. That way we 581 * branch address and looks like it's been sent. That way we
514 * have a descriptor to append DMA programs to. Also, the 582 * have a descriptor to append DMA programs to.
515 * ring buffer invariant is that it always has at least one
516 * element so that head == tail means buffer full.
517 */ 583 */
518 584 memset(ctx->buffer_tail->buffer, 0, sizeof(*ctx->buffer_tail->buffer));
519 memset(ctx->head_descriptor, 0, sizeof(*ctx->head_descriptor)); 585 ctx->buffer_tail->buffer->control = cpu_to_le16(DESCRIPTOR_OUTPUT_LAST);
520 ctx->head_descriptor->control = cpu_to_le16(DESCRIPTOR_OUTPUT_LAST); 586 ctx->buffer_tail->buffer->transfer_status = cpu_to_le16(0x8011);
521 ctx->head_descriptor->transfer_status = cpu_to_le16(0x8011); 587 ctx->buffer_tail->used += sizeof(*ctx->buffer_tail->buffer);
522 ctx->head_descriptor++; 588 ctx->last = ctx->buffer_tail->buffer;
589 ctx->prev = ctx->buffer_tail->buffer;
523 590
524 return 0; 591 return 0;
525} 592}
@@ -528,35 +595,42 @@ static void
528context_release(struct context *ctx) 595context_release(struct context *ctx)
529{ 596{
530 struct fw_card *card = &ctx->ohci->card; 597 struct fw_card *card = &ctx->ohci->card;
598 struct descriptor_buffer *desc, *tmp;
531 599
532 dma_unmap_single(card->device, ctx->buffer_bus, 600 list_for_each_entry_safe(desc, tmp, &ctx->buffer_list, list)
533 ctx->buffer_size, DMA_TO_DEVICE); 601 dma_free_coherent(card->device, PAGE_SIZE, desc,
534 kfree(ctx->buffer); 602 desc->buffer_bus -
603 ((void *)&desc->buffer - (void *)desc));
535} 604}
536 605
606/* Must be called with ohci->lock held */
537static struct descriptor * 607static struct descriptor *
538context_get_descriptors(struct context *ctx, int z, dma_addr_t *d_bus) 608context_get_descriptors(struct context *ctx, int z, dma_addr_t *d_bus)
539{ 609{
540 struct descriptor *d, *tail, *end; 610 struct descriptor *d = NULL;
541 611 struct descriptor_buffer *desc = ctx->buffer_tail;
542 d = ctx->head_descriptor; 612
543 tail = ctx->tail_descriptor; 613 if (z * sizeof(*d) > desc->buffer_size)
544 end = ctx->buffer + ctx->buffer_size / sizeof(*d); 614 return NULL;
545
546 if (d + z <= tail) {
547 goto has_space;
548 } else if (d > tail && d + z <= end) {
549 goto has_space;
550 } else if (d > tail && ctx->buffer + z <= tail) {
551 d = ctx->buffer;
552 goto has_space;
553 }
554 615
555 return NULL; 616 if (z * sizeof(*d) > desc->buffer_size - desc->used) {
617 /* No room for the descriptor in this buffer, so advance to the
618 * next one. */
619
620 if (desc->list.next == &ctx->buffer_list) {
621 /* If there is no free buffer next in the list,
622 * allocate one. */
623 if (context_add_buffer(ctx) < 0)
624 return NULL;
625 }
626 desc = list_entry(desc->list.next,
627 struct descriptor_buffer, list);
628 ctx->buffer_tail = desc;
629 }
556 630
557 has_space: 631 d = desc->buffer + desc->used / sizeof(*d);
558 memset(d, 0, z * sizeof(*d)); 632 memset(d, 0, z * sizeof(*d));
559 *d_bus = ctx->buffer_bus + (d - ctx->buffer) * sizeof(*d); 633 *d_bus = desc->buffer_bus + desc->used;
560 634
561 return d; 635 return d;
562} 636}
@@ -566,7 +640,7 @@ static void context_run(struct context *ctx, u32 extra)
566 struct fw_ohci *ohci = ctx->ohci; 640 struct fw_ohci *ohci = ctx->ohci;
567 641
568 reg_write(ohci, COMMAND_PTR(ctx->regs), 642 reg_write(ohci, COMMAND_PTR(ctx->regs),
569 le32_to_cpu(ctx->tail_descriptor_last->branch_address)); 643 le32_to_cpu(ctx->last->branch_address));
570 reg_write(ohci, CONTROL_CLEAR(ctx->regs), ~0); 644 reg_write(ohci, CONTROL_CLEAR(ctx->regs), ~0);
571 reg_write(ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN | extra); 645 reg_write(ohci, CONTROL_SET(ctx->regs), CONTEXT_RUN | extra);
572 flush_writes(ohci); 646 flush_writes(ohci);
@@ -576,15 +650,13 @@ static void context_append(struct context *ctx,
576 struct descriptor *d, int z, int extra) 650 struct descriptor *d, int z, int extra)
577{ 651{
578 dma_addr_t d_bus; 652 dma_addr_t d_bus;
653 struct descriptor_buffer *desc = ctx->buffer_tail;
579 654
580 d_bus = ctx->buffer_bus + (d - ctx->buffer) * sizeof(*d); 655 d_bus = desc->buffer_bus + (d - desc->buffer) * sizeof(*d);
581 656
582 ctx->head_descriptor = d + z + extra; 657 desc->used += (z + extra) * sizeof(*d);
583 ctx->prev_descriptor->branch_address = cpu_to_le32(d_bus | z); 658 ctx->prev->branch_address = cpu_to_le32(d_bus | z);
584 ctx->prev_descriptor = find_branch_descriptor(d, z); 659 ctx->prev = find_branch_descriptor(d, z);
585
586 dma_sync_single_for_device(ctx->ohci->card.device, ctx->buffer_bus,
587 ctx->buffer_size, DMA_TO_DEVICE);
588 660
589 reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_WAKE); 661 reg_write(ctx->ohci, CONTROL_SET(ctx->regs), CONTEXT_WAKE);
590 flush_writes(ctx->ohci); 662 flush_writes(ctx->ohci);
@@ -1078,6 +1150,13 @@ static irqreturn_t irq_handler(int irq, void *data)
1078 if (unlikely(event & OHCI1394_postedWriteErr)) 1150 if (unlikely(event & OHCI1394_postedWriteErr))
1079 fw_error("PCI posted write error\n"); 1151 fw_error("PCI posted write error\n");
1080 1152
1153 if (unlikely(event & OHCI1394_cycleTooLong)) {
1154 if (printk_ratelimit())
1155 fw_notify("isochronous cycle too long\n");
1156 reg_write(ohci, OHCI1394_LinkControlSet,
1157 OHCI1394_LinkControl_cycleMaster);
1158 }
1159
1081 if (event & OHCI1394_cycle64Seconds) { 1160 if (event & OHCI1394_cycle64Seconds) {
1082 cycle_time = reg_read(ohci, OHCI1394_IsochronousCycleTimer); 1161 cycle_time = reg_read(ohci, OHCI1394_IsochronousCycleTimer);
1083 if ((cycle_time & 0x80000000) == 0) 1162 if ((cycle_time & 0x80000000) == 0)
@@ -1151,8 +1230,8 @@ static int ohci_enable(struct fw_card *card, u32 *config_rom, size_t length)
1151 OHCI1394_RQPkt | OHCI1394_RSPkt | 1230 OHCI1394_RQPkt | OHCI1394_RSPkt |
1152 OHCI1394_reqTxComplete | OHCI1394_respTxComplete | 1231 OHCI1394_reqTxComplete | OHCI1394_respTxComplete |
1153 OHCI1394_isochRx | OHCI1394_isochTx | 1232 OHCI1394_isochRx | OHCI1394_isochTx |
1154 OHCI1394_postedWriteErr | OHCI1394_cycle64Seconds | 1233 OHCI1394_postedWriteErr | OHCI1394_cycleTooLong |
1155 OHCI1394_masterIntEnable); 1234 OHCI1394_cycle64Seconds | OHCI1394_masterIntEnable);
1156 1235
1157 /* Activate link_on bit and contender bit in our self ID packets.*/ 1236 /* Activate link_on bit and contender bit in our self ID packets.*/
1158 if (ohci_update_phy_reg(card, 4, 0, 1237 if (ohci_update_phy_reg(card, 4, 0,
@@ -1408,9 +1487,13 @@ static int handle_ir_dualbuffer_packet(struct context *context,
1408 void *p, *end; 1487 void *p, *end;
1409 int i; 1488 int i;
1410 1489
1411 if (db->first_res_count > 0 && db->second_res_count > 0) 1490 if (db->first_res_count > 0 && db->second_res_count > 0) {
1412 /* This descriptor isn't done yet, stop iteration. */ 1491 if (ctx->excess_bytes <= le16_to_cpu(db->second_req_count)) {
1413 return 0; 1492 /* This descriptor isn't done yet, stop iteration. */
1493 return 0;
1494 }
1495 ctx->excess_bytes -= le16_to_cpu(db->second_req_count);
1496 }
1414 1497
1415 header_length = le16_to_cpu(db->first_req_count) - 1498 header_length = le16_to_cpu(db->first_req_count) -
1416 le16_to_cpu(db->first_res_count); 1499 le16_to_cpu(db->first_res_count);
@@ -1429,11 +1512,15 @@ static int handle_ir_dualbuffer_packet(struct context *context,
1429 *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4)); 1512 *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4));
1430 memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4); 1513 memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4);
1431 i += ctx->base.header_size; 1514 i += ctx->base.header_size;
1515 ctx->excess_bytes +=
1516 (le32_to_cpu(*(u32 *)(p + 4)) >> 16) & 0xffff;
1432 p += ctx->base.header_size + 4; 1517 p += ctx->base.header_size + 4;
1433 } 1518 }
1434
1435 ctx->header_length = i; 1519 ctx->header_length = i;
1436 1520
1521 ctx->excess_bytes -= le16_to_cpu(db->second_req_count) -
1522 le16_to_cpu(db->second_res_count);
1523
1437 if (le16_to_cpu(db->control) & DESCRIPTOR_IRQ_ALWAYS) { 1524 if (le16_to_cpu(db->control) & DESCRIPTOR_IRQ_ALWAYS) {
1438 ir_header = (__le32 *) (db + 1); 1525 ir_header = (__le32 *) (db + 1);
1439 ctx->base.callback(&ctx->base, 1526 ctx->base.callback(&ctx->base,
@@ -1452,24 +1539,24 @@ static int handle_ir_packet_per_buffer(struct context *context,
1452{ 1539{
1453 struct iso_context *ctx = 1540 struct iso_context *ctx =
1454 container_of(context, struct iso_context, context); 1541 container_of(context, struct iso_context, context);
1455 struct descriptor *pd = d + 1; 1542 struct descriptor *pd;
1456 __le32 *ir_header; 1543 __le32 *ir_header;
1457 size_t header_length; 1544 void *p;
1458 void *p, *end; 1545 int i;
1459 int i, z;
1460 1546
1461 if (pd->res_count == pd->req_count) 1547 for (pd = d; pd <= last; pd++) {
1548 if (pd->transfer_status)
1549 break;
1550 }
1551 if (pd > last)
1462 /* Descriptor(s) not done yet, stop iteration */ 1552 /* Descriptor(s) not done yet, stop iteration */
1463 return 0; 1553 return 0;
1464 1554
1465 header_length = le16_to_cpu(d->req_count);
1466
1467 i = ctx->header_length; 1555 i = ctx->header_length;
1468 z = le32_to_cpu(pd->branch_address) & 0xf; 1556 p = last + 1;
1469 p = d + z;
1470 end = p + header_length;
1471 1557
1472 while (p < end && i + ctx->base.header_size <= PAGE_SIZE) { 1558 if (ctx->base.header_size > 0 &&
1559 i + ctx->base.header_size <= PAGE_SIZE) {
1473 /* 1560 /*
1474 * The iso header is byteswapped to little endian by 1561 * The iso header is byteswapped to little endian by
1475 * the controller, but the remaining header quadlets 1562 * the controller, but the remaining header quadlets
@@ -1478,14 +1565,11 @@ static int handle_ir_packet_per_buffer(struct context *context,
1478 */ 1565 */
1479 *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4)); 1566 *(u32 *) (ctx->header + i) = __swab32(*(u32 *) (p + 4));
1480 memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4); 1567 memcpy(ctx->header + i + 4, p + 8, ctx->base.header_size - 4);
1481 i += ctx->base.header_size; 1568 ctx->header_length += ctx->base.header_size;
1482 p += ctx->base.header_size + 4;
1483 } 1569 }
1484 1570
1485 ctx->header_length = i; 1571 if (le16_to_cpu(last->control) & DESCRIPTOR_IRQ_ALWAYS) {
1486 1572 ir_header = (__le32 *) p;
1487 if (le16_to_cpu(pd->control) & DESCRIPTOR_IRQ_ALWAYS) {
1488 ir_header = (__le32 *) (d + z);
1489 ctx->base.callback(&ctx->base, 1573 ctx->base.callback(&ctx->base,
1490 le32_to_cpu(ir_header[0]) & 0xffff, 1574 le32_to_cpu(ir_header[0]) & 0xffff,
1491 ctx->header_length, ctx->header, 1575 ctx->header_length, ctx->header,
@@ -1493,7 +1577,6 @@ static int handle_ir_packet_per_buffer(struct context *context,
1493 ctx->header_length = 0; 1577 ctx->header_length = 0;
1494 } 1578 }
1495 1579
1496
1497 return 1; 1580 return 1;
1498} 1581}
1499 1582
@@ -1559,8 +1642,7 @@ ohci_allocate_iso_context(struct fw_card *card, int type, size_t header_size)
1559 if (ctx->header == NULL) 1642 if (ctx->header == NULL)
1560 goto out; 1643 goto out;
1561 1644
1562 retval = context_init(&ctx->context, ohci, ISO_BUFFER_SIZE, 1645 retval = context_init(&ctx->context, ohci, regs, callback);
1563 regs, callback);
1564 if (retval < 0) 1646 if (retval < 0)
1565 goto out_with_header; 1647 goto out_with_header;
1566 1648
@@ -1775,19 +1857,6 @@ ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
1775 * packet, retransmit or terminate.. 1857 * packet, retransmit or terminate..
1776 */ 1858 */
1777 1859
1778 if (packet->skip) {
1779 d = context_get_descriptors(&ctx->context, 2, &d_bus);
1780 if (d == NULL)
1781 return -ENOMEM;
1782
1783 db = (struct db_descriptor *) d;
1784 db->control = cpu_to_le16(DESCRIPTOR_STATUS |
1785 DESCRIPTOR_BRANCH_ALWAYS |
1786 DESCRIPTOR_WAIT);
1787 db->first_size = cpu_to_le16(ctx->base.header_size + 4);
1788 context_append(&ctx->context, d, 2, 0);
1789 }
1790
1791 p = packet; 1860 p = packet;
1792 z = 2; 1861 z = 2;
1793 1862
@@ -1815,11 +1884,18 @@ ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
1815 db->control = cpu_to_le16(DESCRIPTOR_STATUS | 1884 db->control = cpu_to_le16(DESCRIPTOR_STATUS |
1816 DESCRIPTOR_BRANCH_ALWAYS); 1885 DESCRIPTOR_BRANCH_ALWAYS);
1817 db->first_size = cpu_to_le16(ctx->base.header_size + 4); 1886 db->first_size = cpu_to_le16(ctx->base.header_size + 4);
1818 db->first_req_count = cpu_to_le16(header_size); 1887 if (p->skip && rest == p->payload_length) {
1888 db->control |= cpu_to_le16(DESCRIPTOR_WAIT);
1889 db->first_req_count = db->first_size;
1890 } else {
1891 db->first_req_count = cpu_to_le16(header_size);
1892 }
1819 db->first_res_count = db->first_req_count; 1893 db->first_res_count = db->first_req_count;
1820 db->first_buffer = cpu_to_le32(d_bus + sizeof(*db)); 1894 db->first_buffer = cpu_to_le32(d_bus + sizeof(*db));
1821 1895
1822 if (offset + rest < PAGE_SIZE) 1896 if (p->skip && rest == p->payload_length)
1897 length = 4;
1898 else if (offset + rest < PAGE_SIZE)
1823 length = rest; 1899 length = rest;
1824 else 1900 else
1825 length = PAGE_SIZE - offset; 1901 length = PAGE_SIZE - offset;
@@ -1835,7 +1911,8 @@ ohci_queue_iso_receive_dualbuffer(struct fw_iso_context *base,
1835 context_append(&ctx->context, d, z, header_z); 1911 context_append(&ctx->context, d, z, header_z);
1836 offset = (offset + length) & ~PAGE_MASK; 1912 offset = (offset + length) & ~PAGE_MASK;
1837 rest -= length; 1913 rest -= length;
1838 page++; 1914 if (offset == 0)
1915 page++;
1839 } 1916 }
1840 1917
1841 return 0; 1918 return 0;
@@ -1849,67 +1926,70 @@ ohci_queue_iso_receive_packet_per_buffer(struct fw_iso_context *base,
1849{ 1926{
1850 struct iso_context *ctx = container_of(base, struct iso_context, base); 1927 struct iso_context *ctx = container_of(base, struct iso_context, base);
1851 struct descriptor *d = NULL, *pd = NULL; 1928 struct descriptor *d = NULL, *pd = NULL;
1852 struct fw_iso_packet *p; 1929 struct fw_iso_packet *p = packet;
1853 dma_addr_t d_bus, page_bus; 1930 dma_addr_t d_bus, page_bus;
1854 u32 z, header_z, rest; 1931 u32 z, header_z, rest;
1855 int i, page, offset, packet_count, header_size; 1932 int i, j, length;
1856 1933 int page, offset, packet_count, header_size, payload_per_buffer;
1857 if (packet->skip) {
1858 d = context_get_descriptors(&ctx->context, 1, &d_bus);
1859 if (d == NULL)
1860 return -ENOMEM;
1861
1862 d->control = cpu_to_le16(DESCRIPTOR_STATUS |
1863 DESCRIPTOR_INPUT_LAST |
1864 DESCRIPTOR_BRANCH_ALWAYS |
1865 DESCRIPTOR_WAIT);
1866 context_append(&ctx->context, d, 1, 0);
1867 }
1868
1869 /* one descriptor for header, one for payload */
1870 /* FIXME: handle cases where we need multiple desc. for payload */
1871 z = 2;
1872 p = packet;
1873 1934
1874 /* 1935 /*
1875 * The OHCI controller puts the status word in the 1936 * The OHCI controller puts the status word in the
1876 * buffer too, so we need 4 extra bytes per packet. 1937 * buffer too, so we need 4 extra bytes per packet.
1877 */ 1938 */
1878 packet_count = p->header_length / ctx->base.header_size; 1939 packet_count = p->header_length / ctx->base.header_size;
1879 header_size = packet_count * (ctx->base.header_size + 4); 1940 header_size = ctx->base.header_size + 4;
1880 1941
1881 /* Get header size in number of descriptors. */ 1942 /* Get header size in number of descriptors. */
1882 header_z = DIV_ROUND_UP(header_size, sizeof(*d)); 1943 header_z = DIV_ROUND_UP(header_size, sizeof(*d));
1883 page = payload >> PAGE_SHIFT; 1944 page = payload >> PAGE_SHIFT;
1884 offset = payload & ~PAGE_MASK; 1945 offset = payload & ~PAGE_MASK;
1885 rest = p->payload_length; 1946 payload_per_buffer = p->payload_length / packet_count;
1886 1947
1887 for (i = 0; i < packet_count; i++) { 1948 for (i = 0; i < packet_count; i++) {
1888 /* d points to the header descriptor */ 1949 /* d points to the header descriptor */
1950 z = DIV_ROUND_UP(payload_per_buffer + offset, PAGE_SIZE) + 1;
1889 d = context_get_descriptors(&ctx->context, 1951 d = context_get_descriptors(&ctx->context,
1890 z + header_z, &d_bus); 1952 z + header_z, &d_bus);
1891 if (d == NULL) 1953 if (d == NULL)
1892 return -ENOMEM; 1954 return -ENOMEM;
1893 1955
1894 d->control = cpu_to_le16(DESCRIPTOR_INPUT_MORE); 1956 d->control = cpu_to_le16(DESCRIPTOR_STATUS |
1957 DESCRIPTOR_INPUT_MORE);
1958 if (p->skip && i == 0)
1959 d->control |= cpu_to_le16(DESCRIPTOR_WAIT);
1895 d->req_count = cpu_to_le16(header_size); 1960 d->req_count = cpu_to_le16(header_size);
1896 d->res_count = d->req_count; 1961 d->res_count = d->req_count;
1962 d->transfer_status = 0;
1897 d->data_address = cpu_to_le32(d_bus + (z * sizeof(*d))); 1963 d->data_address = cpu_to_le32(d_bus + (z * sizeof(*d)));
1898 1964
1899 /* pd points to the payload descriptor */ 1965 rest = payload_per_buffer;
1900 pd = d + 1; 1966 for (j = 1; j < z; j++) {
1967 pd = d + j;
1968 pd->control = cpu_to_le16(DESCRIPTOR_STATUS |
1969 DESCRIPTOR_INPUT_MORE);
1970
1971 if (offset + rest < PAGE_SIZE)
1972 length = rest;
1973 else
1974 length = PAGE_SIZE - offset;
1975 pd->req_count = cpu_to_le16(length);
1976 pd->res_count = pd->req_count;
1977 pd->transfer_status = 0;
1978
1979 page_bus = page_private(buffer->pages[page]);
1980 pd->data_address = cpu_to_le32(page_bus + offset);
1981
1982 offset = (offset + length) & ~PAGE_MASK;
1983 rest -= length;
1984 if (offset == 0)
1985 page++;
1986 }
1901 pd->control = cpu_to_le16(DESCRIPTOR_STATUS | 1987 pd->control = cpu_to_le16(DESCRIPTOR_STATUS |
1902 DESCRIPTOR_INPUT_LAST | 1988 DESCRIPTOR_INPUT_LAST |
1903 DESCRIPTOR_BRANCH_ALWAYS); 1989 DESCRIPTOR_BRANCH_ALWAYS);
1904 if (p->interrupt) 1990 if (p->interrupt && i == packet_count - 1)
1905 pd->control |= cpu_to_le16(DESCRIPTOR_IRQ_ALWAYS); 1991 pd->control |= cpu_to_le16(DESCRIPTOR_IRQ_ALWAYS);
1906 1992
1907 pd->req_count = cpu_to_le16(rest);
1908 pd->res_count = pd->req_count;
1909
1910 page_bus = page_private(buffer->pages[page]);
1911 pd->data_address = cpu_to_le32(page_bus + offset);
1912
1913 context_append(&ctx->context, d, z, header_z); 1993 context_append(&ctx->context, d, z, header_z);
1914 } 1994 }
1915 1995
@@ -1923,16 +2003,22 @@ ohci_queue_iso(struct fw_iso_context *base,
1923 unsigned long payload) 2003 unsigned long payload)
1924{ 2004{
1925 struct iso_context *ctx = container_of(base, struct iso_context, base); 2005 struct iso_context *ctx = container_of(base, struct iso_context, base);
2006 unsigned long flags;
2007 int retval;
1926 2008
2009 spin_lock_irqsave(&ctx->context.ohci->lock, flags);
1927 if (base->type == FW_ISO_CONTEXT_TRANSMIT) 2010 if (base->type == FW_ISO_CONTEXT_TRANSMIT)
1928 return ohci_queue_iso_transmit(base, packet, buffer, payload); 2011 retval = ohci_queue_iso_transmit(base, packet, buffer, payload);
1929 else if (ctx->context.ohci->version >= OHCI_VERSION_1_1) 2012 else if (ctx->context.ohci->version >= OHCI_VERSION_1_1)
1930 return ohci_queue_iso_receive_dualbuffer(base, packet, 2013 retval = ohci_queue_iso_receive_dualbuffer(base, packet,
1931 buffer, payload); 2014 buffer, payload);
1932 else 2015 else
1933 return ohci_queue_iso_receive_packet_per_buffer(base, packet, 2016 retval = ohci_queue_iso_receive_packet_per_buffer(base, packet,
1934 buffer, 2017 buffer,
1935 payload); 2018 payload);
2019 spin_unlock_irqrestore(&ctx->context.ohci->lock, flags);
2020
2021 return retval;
1936} 2022}
1937 2023
1938static const struct fw_card_driver ohci_driver = { 2024static const struct fw_card_driver ohci_driver = {
@@ -2004,10 +2090,10 @@ pci_probe(struct pci_dev *dev, const struct pci_device_id *ent)
2004 ar_context_init(&ohci->ar_response_ctx, ohci, 2090 ar_context_init(&ohci->ar_response_ctx, ohci,
2005 OHCI1394_AsRspRcvContextControlSet); 2091 OHCI1394_AsRspRcvContextControlSet);
2006 2092
2007 context_init(&ohci->at_request_ctx, ohci, AT_BUFFER_SIZE, 2093 context_init(&ohci->at_request_ctx, ohci,
2008 OHCI1394_AsReqTrContextControlSet, handle_at_packet); 2094 OHCI1394_AsReqTrContextControlSet, handle_at_packet);
2009 2095
2010 context_init(&ohci->at_response_ctx, ohci, AT_BUFFER_SIZE, 2096 context_init(&ohci->at_response_ctx, ohci,
2011 OHCI1394_AsRspTrContextControlSet, handle_at_packet); 2097 OHCI1394_AsRspTrContextControlSet, handle_at_packet);
2012 2098
2013 reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, ~0); 2099 reg_write(ohci, OHCI1394_IsoRecvIntMaskSet, ~0);
diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
index c2169d215bf7..19ece9b6d742 100644
--- a/drivers/firewire/fw-sbp2.c
+++ b/drivers/firewire/fw-sbp2.c
@@ -40,6 +40,7 @@
40#include <linux/stringify.h> 40#include <linux/stringify.h>
41#include <linux/timer.h> 41#include <linux/timer.h>
42#include <linux/workqueue.h> 42#include <linux/workqueue.h>
43#include <asm/system.h>
43 44
44#include <scsi/scsi.h> 45#include <scsi/scsi.h>
45#include <scsi/scsi_cmnd.h> 46#include <scsi/scsi_cmnd.h>
@@ -148,18 +149,26 @@ struct sbp2_target {
148 149
149 unsigned workarounds; 150 unsigned workarounds;
150 struct list_head lu_list; 151 struct list_head lu_list;
152
153 unsigned int mgt_orb_timeout;
151}; 154};
152 155
153#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 156/*
154#define SBP2_MAX_SECTORS 255 /* Max sectors supported */ 157 * Per section 7.4.8 of the SBP-2 spec, a mgt_ORB_timeout value can be
158 * provided in the config rom. Most devices do provide a value, which
159 * we'll use for login management orbs, but with some sane limits.
160 */
161#define SBP2_MIN_LOGIN_ORB_TIMEOUT 5000U /* Timeout in ms */
162#define SBP2_MAX_LOGIN_ORB_TIMEOUT 40000U /* Timeout in ms */
155#define SBP2_ORB_TIMEOUT 2000 /* Timeout in ms */ 163#define SBP2_ORB_TIMEOUT 2000 /* Timeout in ms */
156
157#define SBP2_ORB_NULL 0x80000000 164#define SBP2_ORB_NULL 0x80000000
165#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
158 166
159#define SBP2_DIRECTION_TO_MEDIA 0x0 167#define SBP2_DIRECTION_TO_MEDIA 0x0
160#define SBP2_DIRECTION_FROM_MEDIA 0x1 168#define SBP2_DIRECTION_FROM_MEDIA 0x1
161 169
162/* Unit directory keys */ 170/* Unit directory keys */
171#define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a
163#define SBP2_CSR_FIRMWARE_REVISION 0x3c 172#define SBP2_CSR_FIRMWARE_REVISION 0x3c
164#define SBP2_CSR_LOGICAL_UNIT_NUMBER 0x14 173#define SBP2_CSR_LOGICAL_UNIT_NUMBER 0x14
165#define SBP2_CSR_LOGICAL_UNIT_DIRECTORY 0xd4 174#define SBP2_CSR_LOGICAL_UNIT_DIRECTORY 0xd4
@@ -489,6 +498,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
489{ 498{
490 struct fw_device *device = fw_device(lu->tgt->unit->device.parent); 499 struct fw_device *device = fw_device(lu->tgt->unit->device.parent);
491 struct sbp2_management_orb *orb; 500 struct sbp2_management_orb *orb;
501 unsigned int timeout;
492 int retval = -ENOMEM; 502 int retval = -ENOMEM;
493 503
494 orb = kzalloc(sizeof(*orb), GFP_ATOMIC); 504 orb = kzalloc(sizeof(*orb), GFP_ATOMIC);
@@ -516,9 +526,13 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
516 orb->request.status_fifo.low = lu->address_handler.offset; 526 orb->request.status_fifo.low = lu->address_handler.offset;
517 527
518 if (function == SBP2_LOGIN_REQUEST) { 528 if (function == SBP2_LOGIN_REQUEST) {
529 /* Ask for 2^2 == 4 seconds reconnect grace period */
519 orb->request.misc |= 530 orb->request.misc |=
520 MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login) | 531 MANAGEMENT_ORB_RECONNECT(2) |
521 MANAGEMENT_ORB_RECONNECT(0); 532 MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login);
533 timeout = lu->tgt->mgt_orb_timeout;
534 } else {
535 timeout = SBP2_ORB_TIMEOUT;
522 } 536 }
523 537
524 fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request)); 538 fw_memcpy_to_be32(&orb->request, &orb->request, sizeof(orb->request));
@@ -535,8 +549,7 @@ sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
535 sbp2_send_orb(&orb->base, lu, node_id, generation, 549 sbp2_send_orb(&orb->base, lu, node_id, generation,
536 lu->tgt->management_agent_address); 550 lu->tgt->management_agent_address);
537 551
538 wait_for_completion_timeout(&orb->done, 552 wait_for_completion_timeout(&orb->done, msecs_to_jiffies(timeout));
539 msecs_to_jiffies(SBP2_ORB_TIMEOUT));
540 553
541 retval = -EIO; 554 retval = -EIO;
542 if (sbp2_cancel_orbs(lu) == 0) { 555 if (sbp2_cancel_orbs(lu) == 0) {
@@ -608,13 +621,17 @@ static void sbp2_release_target(struct kref *kref)
608 struct sbp2_logical_unit *lu, *next; 621 struct sbp2_logical_unit *lu, *next;
609 struct Scsi_Host *shost = 622 struct Scsi_Host *shost =
610 container_of((void *)tgt, struct Scsi_Host, hostdata[0]); 623 container_of((void *)tgt, struct Scsi_Host, hostdata[0]);
624 struct fw_device *device = fw_device(tgt->unit->device.parent);
611 625
612 list_for_each_entry_safe(lu, next, &tgt->lu_list, link) { 626 list_for_each_entry_safe(lu, next, &tgt->lu_list, link) {
613 if (lu->sdev) 627 if (lu->sdev)
614 scsi_remove_device(lu->sdev); 628 scsi_remove_device(lu->sdev);
615 629
616 sbp2_send_management_orb(lu, tgt->node_id, lu->generation, 630 if (!fw_device_is_shutdown(device))
617 SBP2_LOGOUT_REQUEST, lu->login_id, NULL); 631 sbp2_send_management_orb(lu, tgt->node_id,
632 lu->generation, SBP2_LOGOUT_REQUEST,
633 lu->login_id, NULL);
634
618 fw_core_remove_address_handler(&lu->address_handler); 635 fw_core_remove_address_handler(&lu->address_handler);
619 list_del(&lu->link); 636 list_del(&lu->link);
620 kfree(lu); 637 kfree(lu);
@@ -628,6 +645,21 @@ static void sbp2_release_target(struct kref *kref)
628 645
629static struct workqueue_struct *sbp2_wq; 646static struct workqueue_struct *sbp2_wq;
630 647
648/*
649 * Always get the target's kref when scheduling work on one its units.
650 * Each workqueue job is responsible to call sbp2_target_put() upon return.
651 */
652static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay)
653{
654 if (queue_delayed_work(sbp2_wq, &lu->work, delay))
655 kref_get(&lu->tgt->kref);
656}
657
658static void sbp2_target_put(struct sbp2_target *tgt)
659{
660 kref_put(&tgt->kref, sbp2_release_target);
661}
662
631static void sbp2_reconnect(struct work_struct *work); 663static void sbp2_reconnect(struct work_struct *work);
632 664
633static void sbp2_login(struct work_struct *work) 665static void sbp2_login(struct work_struct *work)
@@ -643,22 +675,19 @@ static void sbp2_login(struct work_struct *work)
643 struct sbp2_login_response response; 675 struct sbp2_login_response response;
644 int generation, node_id, local_node_id; 676 int generation, node_id, local_node_id;
645 677
646 generation = device->card->generation; 678 generation = device->generation;
647 node_id = device->node->node_id; 679 smp_rmb(); /* node_id must not be older than generation */
648 local_node_id = device->card->local_node->node_id; 680 node_id = device->node_id;
681 local_node_id = device->card->node_id;
649 682
650 if (sbp2_send_management_orb(lu, node_id, generation, 683 if (sbp2_send_management_orb(lu, node_id, generation,
651 SBP2_LOGIN_REQUEST, lu->lun, &response) < 0) { 684 SBP2_LOGIN_REQUEST, lu->lun, &response) < 0) {
652 if (lu->retries++ < 5) { 685 if (lu->retries++ < 5)
653 if (queue_delayed_work(sbp2_wq, &lu->work, 686 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
654 DIV_ROUND_UP(HZ, 5))) 687 else
655 kref_get(&lu->tgt->kref);
656 } else {
657 fw_error("failed to login to %s LUN %04x\n", 688 fw_error("failed to login to %s LUN %04x\n",
658 unit->device.bus_id, lu->lun); 689 unit->device.bus_id, lu->lun);
659 } 690 goto out;
660 kref_put(&lu->tgt->kref, sbp2_release_target);
661 return;
662 } 691 }
663 692
664 lu->generation = generation; 693 lu->generation = generation;
@@ -700,7 +729,8 @@ static void sbp2_login(struct work_struct *work)
700 lu->sdev = sdev; 729 lu->sdev = sdev;
701 scsi_device_put(sdev); 730 scsi_device_put(sdev);
702 } 731 }
703 kref_put(&lu->tgt->kref, sbp2_release_target); 732 out:
733 sbp2_target_put(lu->tgt);
704} 734}
705 735
706static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) 736static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry)
@@ -750,6 +780,7 @@ static int sbp2_scan_unit_dir(struct sbp2_target *tgt, u32 *directory,
750{ 780{
751 struct fw_csr_iterator ci; 781 struct fw_csr_iterator ci;
752 int key, value; 782 int key, value;
783 unsigned int timeout;
753 784
754 fw_csr_iterator_init(&ci, directory); 785 fw_csr_iterator_init(&ci, directory);
755 while (fw_csr_iterator_next(&ci, &key, &value)) { 786 while (fw_csr_iterator_next(&ci, &key, &value)) {
@@ -772,6 +803,21 @@ static int sbp2_scan_unit_dir(struct sbp2_target *tgt, u32 *directory,
772 *firmware_revision = value; 803 *firmware_revision = value;
773 break; 804 break;
774 805
806 case SBP2_CSR_UNIT_CHARACTERISTICS:
807 /* the timeout value is stored in 500ms units */
808 timeout = ((unsigned int) value >> 8 & 0xff) * 500;
809 timeout = max(timeout, SBP2_MIN_LOGIN_ORB_TIMEOUT);
810 tgt->mgt_orb_timeout =
811 min(timeout, SBP2_MAX_LOGIN_ORB_TIMEOUT);
812
813 if (timeout > tgt->mgt_orb_timeout)
814 fw_notify("%s: config rom contains %ds "
815 "management ORB timeout, limiting "
816 "to %ds\n", tgt->unit->device.bus_id,
817 timeout / 1000,
818 tgt->mgt_orb_timeout / 1000);
819 break;
820
775 case SBP2_CSR_LOGICAL_UNIT_NUMBER: 821 case SBP2_CSR_LOGICAL_UNIT_NUMBER:
776 if (sbp2_add_logical_unit(tgt, value) < 0) 822 if (sbp2_add_logical_unit(tgt, value) < 0)
777 return -ENOMEM; 823 return -ENOMEM;
@@ -865,18 +911,13 @@ static int sbp2_probe(struct device *dev)
865 911
866 get_device(&unit->device); 912 get_device(&unit->device);
867 913
868 /* 914 /* Do the login in a workqueue so we can easily reschedule retries. */
869 * We schedule work to do the login so we can easily
870 * reschedule retries. Always get the ref before scheduling
871 * work.
872 */
873 list_for_each_entry(lu, &tgt->lu_list, link) 915 list_for_each_entry(lu, &tgt->lu_list, link)
874 if (queue_delayed_work(sbp2_wq, &lu->work, 0)) 916 sbp2_queue_work(lu, 0);
875 kref_get(&tgt->kref);
876 return 0; 917 return 0;
877 918
878 fail_tgt_put: 919 fail_tgt_put:
879 kref_put(&tgt->kref, sbp2_release_target); 920 sbp2_target_put(tgt);
880 return -ENOMEM; 921 return -ENOMEM;
881 922
882 fail_shost_put: 923 fail_shost_put:
@@ -889,7 +930,7 @@ static int sbp2_remove(struct device *dev)
889 struct fw_unit *unit = fw_unit(dev); 930 struct fw_unit *unit = fw_unit(dev);
890 struct sbp2_target *tgt = unit->device.driver_data; 931 struct sbp2_target *tgt = unit->device.driver_data;
891 932
892 kref_put(&tgt->kref, sbp2_release_target); 933 sbp2_target_put(tgt);
893 return 0; 934 return 0;
894} 935}
895 936
@@ -901,9 +942,10 @@ static void sbp2_reconnect(struct work_struct *work)
901 struct fw_device *device = fw_device(unit->device.parent); 942 struct fw_device *device = fw_device(unit->device.parent);
902 int generation, node_id, local_node_id; 943 int generation, node_id, local_node_id;
903 944
904 generation = device->card->generation; 945 generation = device->generation;
905 node_id = device->node->node_id; 946 smp_rmb(); /* node_id must not be older than generation */
906 local_node_id = device->card->local_node->node_id; 947 node_id = device->node_id;
948 local_node_id = device->card->node_id;
907 949
908 if (sbp2_send_management_orb(lu, node_id, generation, 950 if (sbp2_send_management_orb(lu, node_id, generation,
909 SBP2_RECONNECT_REQUEST, 951 SBP2_RECONNECT_REQUEST,
@@ -915,10 +957,8 @@ static void sbp2_reconnect(struct work_struct *work)
915 lu->retries = 0; 957 lu->retries = 0;
916 PREPARE_DELAYED_WORK(&lu->work, sbp2_login); 958 PREPARE_DELAYED_WORK(&lu->work, sbp2_login);
917 } 959 }
918 if (queue_delayed_work(sbp2_wq, &lu->work, DIV_ROUND_UP(HZ, 5))) 960 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
919 kref_get(&lu->tgt->kref); 961 goto out;
920 kref_put(&lu->tgt->kref, sbp2_release_target);
921 return;
922 } 962 }
923 963
924 lu->generation = generation; 964 lu->generation = generation;
@@ -930,8 +970,8 @@ static void sbp2_reconnect(struct work_struct *work)
930 970
931 sbp2_agent_reset(lu); 971 sbp2_agent_reset(lu);
932 sbp2_cancel_orbs(lu); 972 sbp2_cancel_orbs(lu);
933 973 out:
934 kref_put(&lu->tgt->kref, sbp2_release_target); 974 sbp2_target_put(lu->tgt);
935} 975}
936 976
937static void sbp2_update(struct fw_unit *unit) 977static void sbp2_update(struct fw_unit *unit)
@@ -947,8 +987,7 @@ static void sbp2_update(struct fw_unit *unit)
947 */ 987 */
948 list_for_each_entry(lu, &tgt->lu_list, link) { 988 list_for_each_entry(lu, &tgt->lu_list, link) {
949 lu->retries = 0; 989 lu->retries = 0;
950 if (queue_delayed_work(sbp2_wq, &lu->work, 0)) 990 sbp2_queue_work(lu, 0);
951 kref_get(&tgt->kref);
952 } 991 }
953} 992}
954 993
@@ -1103,9 +1142,9 @@ sbp2_map_scatterlist(struct sbp2_command_orb *orb, struct fw_device *device,
1103 * elements larger than 65535 bytes, some IOMMUs may merge sg elements 1142 * elements larger than 65535 bytes, some IOMMUs may merge sg elements
1104 * during DMA mapping, and Linux currently doesn't prevent this. 1143 * during DMA mapping, and Linux currently doesn't prevent this.
1105 */ 1144 */
1106 for (i = 0, j = 0; i < count; i++) { 1145 for (i = 0, j = 0; i < count; i++, sg = sg_next(sg)) {
1107 sg_len = sg_dma_len(sg + i); 1146 sg_len = sg_dma_len(sg);
1108 sg_addr = sg_dma_address(sg + i); 1147 sg_addr = sg_dma_address(sg);
1109 while (sg_len) { 1148 while (sg_len) {
1110 /* FIXME: This won't get us out of the pinch. */ 1149 /* FIXME: This won't get us out of the pinch. */
1111 if (unlikely(j >= ARRAY_SIZE(orb->page_table))) { 1150 if (unlikely(j >= ARRAY_SIZE(orb->page_table))) {
diff --git a/drivers/firewire/fw-topology.c b/drivers/firewire/fw-topology.c
index 0fc9b000e99d..172c1867e9aa 100644
--- a/drivers/firewire/fw-topology.c
+++ b/drivers/firewire/fw-topology.c
@@ -21,6 +21,7 @@
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/wait.h> 22#include <linux/wait.h>
23#include <linux/errno.h> 23#include <linux/errno.h>
24#include <asm/system.h>
24#include "fw-transaction.h" 25#include "fw-transaction.h"
25#include "fw-topology.h" 26#include "fw-topology.h"
26 27
@@ -518,6 +519,11 @@ fw_core_handle_bus_reset(struct fw_card *card,
518 card->bm_retries = 0; 519 card->bm_retries = 0;
519 520
520 card->node_id = node_id; 521 card->node_id = node_id;
522 /*
523 * Update node_id before generation to prevent anybody from using
524 * a stale node_id together with a current generation.
525 */
526 smp_wmb();
521 card->generation = generation; 527 card->generation = generation;
522 card->reset_jiffies = jiffies; 528 card->reset_jiffies = jiffies;
523 schedule_delayed_work(&card->work, 0); 529 schedule_delayed_work(&card->work, 0);
diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c
index c00d4a9b39e5..7fcc59dedf08 100644
--- a/drivers/firewire/fw-transaction.c
+++ b/drivers/firewire/fw-transaction.c
@@ -153,7 +153,7 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
153 int ext_tcode; 153 int ext_tcode;
154 154
155 if (tcode > 0x10) { 155 if (tcode > 0x10) {
156 ext_tcode = tcode - 0x10; 156 ext_tcode = tcode & ~0x10;
157 tcode = TCODE_LOCK_REQUEST; 157 tcode = TCODE_LOCK_REQUEST;
158 } else 158 } else
159 ext_tcode = 0; 159 ext_tcode = 0;
@@ -650,7 +650,7 @@ fw_core_handle_request(struct fw_card *card, struct fw_packet *p)
650 HEADER_GET_OFFSET_HIGH(p->header[1]) << 32) | p->header[2]; 650 HEADER_GET_OFFSET_HIGH(p->header[1]) << 32) | p->header[2];
651 tcode = HEADER_GET_TCODE(p->header[0]); 651 tcode = HEADER_GET_TCODE(p->header[0]);
652 destination = HEADER_GET_DESTINATION(p->header[0]); 652 destination = HEADER_GET_DESTINATION(p->header[0]);
653 source = HEADER_GET_SOURCE(p->header[0]); 653 source = HEADER_GET_SOURCE(p->header[1]);
654 654
655 spin_lock_irqsave(&address_handler_lock, flags); 655 spin_lock_irqsave(&address_handler_lock, flags);
656 handler = lookup_enclosing_address_handler(&address_handler_list, 656 handler = lookup_enclosing_address_handler(&address_handler_list,
diff --git a/drivers/ieee1394/dma.c b/drivers/ieee1394/dma.c
index 7c4eb39b7024..73685e7dc7e4 100644
--- a/drivers/ieee1394/dma.c
+++ b/drivers/ieee1394/dma.c
@@ -231,37 +231,24 @@ void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset,
231 231
232#ifdef CONFIG_MMU 232#ifdef CONFIG_MMU
233 233
234/* nopage() handler for mmap access */ 234static int dma_region_pagefault(struct vm_area_struct *vma,
235 235 struct vm_fault *vmf)
236static struct page *dma_region_pagefault(struct vm_area_struct *area,
237 unsigned long address, int *type)
238{ 236{
239 unsigned long offset; 237 struct dma_region *dma = (struct dma_region *)vma->vm_private_data;
240 unsigned long kernel_virt_addr;
241 struct page *ret = NOPAGE_SIGBUS;
242
243 struct dma_region *dma = (struct dma_region *)area->vm_private_data;
244 238
245 if (!dma->kvirt) 239 if (!dma->kvirt)
246 goto out; 240 return VM_FAULT_SIGBUS;
247 241
248 if ((address < (unsigned long)area->vm_start) || 242 if (vmf->pgoff >= dma->n_pages)
249 (address > 243 return VM_FAULT_SIGBUS;
250 (unsigned long)area->vm_start + (dma->n_pages << PAGE_SHIFT))) 244
251 goto out; 245 vmf->page = vmalloc_to_page(dma->kvirt + (vmf->pgoff << PAGE_SHIFT));
252 246 get_page(vmf->page);
253 if (type) 247 return 0;
254 *type = VM_FAULT_MINOR;
255 offset = address - area->vm_start;
256 kernel_virt_addr = (unsigned long)dma->kvirt + offset;
257 ret = vmalloc_to_page((void *)kernel_virt_addr);
258 get_page(ret);
259 out:
260 return ret;
261} 248}
262 249
263static struct vm_operations_struct dma_region_vm_ops = { 250static struct vm_operations_struct dma_region_vm_ops = {
264 .nopage = dma_region_pagefault, 251 .fault = dma_region_pagefault,
265}; 252};
266 253
267/** 254/**
@@ -275,7 +262,7 @@ int dma_region_mmap(struct dma_region *dma, struct file *file,
275 if (!dma->kvirt) 262 if (!dma->kvirt)
276 return -EINVAL; 263 return -EINVAL;
277 264
278 /* must be page-aligned */ 265 /* must be page-aligned (XXX: comment is wrong, we could allow pgoff) */
279 if (vma->vm_pgoff != 0) 266 if (vma->vm_pgoff != 0)
280 return -EINVAL; 267 return -EINVAL;
281 268
diff --git a/drivers/ieee1394/ieee1394_transactions.c b/drivers/ieee1394/ieee1394_transactions.c
index 677989320951..10c3d9f8c038 100644
--- a/drivers/ieee1394/ieee1394_transactions.c
+++ b/drivers/ieee1394/ieee1394_transactions.c
@@ -570,71 +570,3 @@ int hpsb_write(struct hpsb_host *host, nodeid_t node, unsigned int generation,
570 570
571 return retval; 571 return retval;
572} 572}
573
574#if 0
575
576int hpsb_lock(struct hpsb_host *host, nodeid_t node, unsigned int generation,
577 u64 addr, int extcode, quadlet_t * data, quadlet_t arg)
578{
579 struct hpsb_packet *packet;
580 int retval = 0;
581
582 BUG_ON(in_interrupt()); // We can't be called in an interrupt, yet
583
584 packet = hpsb_make_lockpacket(host, node, addr, extcode, data, arg);
585 if (!packet)
586 return -ENOMEM;
587
588 packet->generation = generation;
589 retval = hpsb_send_packet_and_wait(packet);
590 if (retval < 0)
591 goto hpsb_lock_fail;
592
593 retval = hpsb_packet_success(packet);
594
595 if (retval == 0) {
596 *data = packet->data[0];
597 }
598
599 hpsb_lock_fail:
600 hpsb_free_tlabel(packet);
601 hpsb_free_packet(packet);
602
603 return retval;
604}
605
606int hpsb_send_gasp(struct hpsb_host *host, int channel, unsigned int generation,
607 quadlet_t * buffer, size_t length, u32 specifier_id,
608 unsigned int version)
609{
610 struct hpsb_packet *packet;
611 int retval = 0;
612 u16 specifier_id_hi = (specifier_id & 0x00ffff00) >> 8;
613 u8 specifier_id_lo = specifier_id & 0xff;
614
615 HPSB_VERBOSE("Send GASP: channel = %d, length = %Zd", channel, length);
616
617 length += 8;
618
619 packet = hpsb_make_streampacket(host, NULL, length, channel, 3, 0);
620 if (!packet)
621 return -ENOMEM;
622
623 packet->data[0] = cpu_to_be32((host->node_id << 16) | specifier_id_hi);
624 packet->data[1] =
625 cpu_to_be32((specifier_id_lo << 24) | (version & 0x00ffffff));
626
627 memcpy(&(packet->data[2]), buffer, length - 8);
628
629 packet->generation = generation;
630
631 packet->no_waiter = 1;
632
633 retval = hpsb_send_packet(packet);
634 if (retval < 0)
635 hpsb_free_packet(packet);
636
637 return retval;
638}
639
640#endif /* 0 */
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c
index 372c5c16eb31..969de2a2d633 100644
--- a/drivers/ieee1394/ohci1394.c
+++ b/drivers/ieee1394/ohci1394.c
@@ -2126,10 +2126,14 @@ static void ohci_schedule_iso_tasklets(struct ti_ohci *ohci,
2126 list_for_each_entry(t, &ohci->iso_tasklet_list, link) { 2126 list_for_each_entry(t, &ohci->iso_tasklet_list, link) {
2127 mask = 1 << t->context; 2127 mask = 1 << t->context;
2128 2128
2129 if (t->type == OHCI_ISO_TRANSMIT && tx_event & mask) 2129 if (t->type == OHCI_ISO_TRANSMIT) {
2130 tasklet_schedule(&t->tasklet); 2130 if (tx_event & mask)
2131 else if (rx_event & mask) 2131 tasklet_schedule(&t->tasklet);
2132 tasklet_schedule(&t->tasklet); 2132 } else {
2133 /* OHCI_ISO_RECEIVE or OHCI_ISO_MULTICHANNEL_RECEIVE */
2134 if (rx_event & mask)
2135 tasklet_schedule(&t->tasklet);
2136 }
2133 } 2137 }
2134 2138
2135 spin_unlock_irqrestore(&ohci->iso_tasklet_list_lock, flags); 2139 spin_unlock_irqrestore(&ohci->iso_tasklet_list_lock, flags);
diff --git a/drivers/ieee1394/raw1394.c b/drivers/ieee1394/raw1394.c
index cadf0479cce5..37e7e109af38 100644
--- a/drivers/ieee1394/raw1394.c
+++ b/drivers/ieee1394/raw1394.c
@@ -858,7 +858,7 @@ static int arm_read(struct hpsb_host *host, int nodeid, quadlet_t * buffer,
858 int found = 0, size = 0, rcode = -1; 858 int found = 0, size = 0, rcode = -1;
859 struct arm_request_response *arm_req_resp = NULL; 859 struct arm_request_response *arm_req_resp = NULL;
860 860
861 DBGMSG("arm_read called by node: %X" 861 DBGMSG("arm_read called by node: %X "
862 "addr: %4.4x %8.8x length: %Zu", nodeid, 862 "addr: %4.4x %8.8x length: %Zu", nodeid,
863 (u16) ((addr >> 32) & 0xFFFF), (u32) (addr & 0xFFFFFFFF), 863 (u16) ((addr >> 32) & 0xFFFF), (u32) (addr & 0xFFFFFFFF),
864 length); 864 length);
@@ -1012,7 +1012,7 @@ static int arm_write(struct hpsb_host *host, int nodeid, int destid,
1012 int found = 0, size = 0, rcode = -1, length_conflict = 0; 1012 int found = 0, size = 0, rcode = -1, length_conflict = 0;
1013 struct arm_request_response *arm_req_resp = NULL; 1013 struct arm_request_response *arm_req_resp = NULL;
1014 1014
1015 DBGMSG("arm_write called by node: %X" 1015 DBGMSG("arm_write called by node: %X "
1016 "addr: %4.4x %8.8x length: %Zu", nodeid, 1016 "addr: %4.4x %8.8x length: %Zu", nodeid,
1017 (u16) ((addr >> 32) & 0xFFFF), (u32) (addr & 0xFFFFFFFF), 1017 (u16) ((addr >> 32) & 0xFFFF), (u32) (addr & 0xFFFFFFFF),
1018 length); 1018 length);
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
index 1eda11abeb1e..2b889d91e673 100644
--- a/drivers/ieee1394/sbp2.c
+++ b/drivers/ieee1394/sbp2.c
@@ -51,6 +51,7 @@
51 * Grep for inline FIXME comments below. 51 * Grep for inline FIXME comments below.
52 */ 52 */
53 53
54#include <linux/blkdev.h>
54#include <linux/compiler.h> 55#include <linux/compiler.h>
55#include <linux/delay.h> 56#include <linux/delay.h>
56#include <linux/device.h> 57#include <linux/device.h>
@@ -127,17 +128,21 @@ MODULE_PARM_DESC(serialize_io, "Serialize requests coming from SCSI drivers "
127 "(default = Y, faster but buggy = N)"); 128 "(default = Y, faster but buggy = N)");
128 129
129/* 130/*
130 * Bump up max_sectors if you'd like to support very large sized 131 * Adjust max_sectors if you'd like to influence how many sectors each SCSI
131 * transfers. Please note that some older sbp2 bridge chips are broken for 132 * command can transfer at most. Please note that some older SBP-2 bridge
132 * transfers greater or equal to 128KB. Default is a value of 255 133 * chips are broken for transfers greater or equal to 128KB, therefore
133 * sectors, or just under 128KB (at 512 byte sector size). I can note that 134 * max_sectors used to be a safe 255 sectors for many years. We now have a
134 * the Oxsemi sbp2 chipsets have no problems supporting very large 135 * default of 0 here which means that we let the SCSI stack choose a limit.
135 * transfer sizes. 136 *
137 * The SBP2_WORKAROUND_128K_MAX_TRANS flag, if set either in the workarounds
138 * module parameter or in the sbp2_workarounds_table[], will override the
139 * value of max_sectors. We should use sbp2_workarounds_table[] to cover any
140 * bridge chip which becomes known to need the 255 sectors limit.
136 */ 141 */
137static int sbp2_max_sectors = SBP2_MAX_SECTORS; 142static int sbp2_max_sectors;
138module_param_named(max_sectors, sbp2_max_sectors, int, 0444); 143module_param_named(max_sectors, sbp2_max_sectors, int, 0444);
139MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported " 144MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported "
140 "(default = " __stringify(SBP2_MAX_SECTORS) ")"); 145 "(default = 0 = use SCSI stack's default)");
141 146
142/* 147/*
143 * Exclusive login to sbp2 device? In most cases, the sbp2 driver should 148 * Exclusive login to sbp2 device? In most cases, the sbp2 driver should
@@ -1451,7 +1456,7 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb,
1451 struct sbp2_fwhost_info *hi, 1456 struct sbp2_fwhost_info *hi,
1452 struct sbp2_command_info *cmd, 1457 struct sbp2_command_info *cmd,
1453 unsigned int scsi_use_sg, 1458 unsigned int scsi_use_sg,
1454 struct scatterlist *sgpnt, 1459 struct scatterlist *sg,
1455 u32 orb_direction, 1460 u32 orb_direction,
1456 enum dma_data_direction dma_dir) 1461 enum dma_data_direction dma_dir)
1457{ 1462{
@@ -1461,12 +1466,12 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb,
1461 1466
1462 /* special case if only one element (and less than 64KB in size) */ 1467 /* special case if only one element (and less than 64KB in size) */
1463 if ((scsi_use_sg == 1) && 1468 if ((scsi_use_sg == 1) &&
1464 (sgpnt[0].length <= SBP2_MAX_SG_ELEMENT_LENGTH)) { 1469 (sg_dma_len(sg) <= SBP2_MAX_SG_ELEMENT_LENGTH)) {
1465 1470
1466 cmd->dma_size = sgpnt[0].length; 1471 cmd->dma_size = sg_dma_len(sg);
1467 cmd->dma_type = CMD_DMA_PAGE; 1472 cmd->dma_type = CMD_DMA_PAGE;
1468 cmd->cmd_dma = dma_map_page(hi->host->device.parent, 1473 cmd->cmd_dma = dma_map_page(hi->host->device.parent,
1469 sg_page(&sgpnt[0]), sgpnt[0].offset, 1474 sg_page(sg), sg->offset,
1470 cmd->dma_size, cmd->dma_dir); 1475 cmd->dma_size, cmd->dma_dir);
1471 1476
1472 orb->data_descriptor_lo = cmd->cmd_dma; 1477 orb->data_descriptor_lo = cmd->cmd_dma;
@@ -1477,11 +1482,11 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb,
1477 &cmd->scatter_gather_element[0]; 1482 &cmd->scatter_gather_element[0];
1478 u32 sg_count, sg_len; 1483 u32 sg_count, sg_len;
1479 dma_addr_t sg_addr; 1484 dma_addr_t sg_addr;
1480 int i, count = dma_map_sg(hi->host->device.parent, sgpnt, 1485 int i, count = dma_map_sg(hi->host->device.parent, sg,
1481 scsi_use_sg, dma_dir); 1486 scsi_use_sg, dma_dir);
1482 1487
1483 cmd->dma_size = scsi_use_sg; 1488 cmd->dma_size = scsi_use_sg;
1484 cmd->sge_buffer = sgpnt; 1489 cmd->sge_buffer = sg;
1485 1490
1486 /* use page tables (s/g) */ 1491 /* use page tables (s/g) */
1487 orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1); 1492 orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1);
@@ -1489,9 +1494,9 @@ static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb,
1489 1494
1490 /* loop through and fill out our SBP-2 page tables 1495 /* loop through and fill out our SBP-2 page tables
1491 * (and split up anything too large) */ 1496 * (and split up anything too large) */
1492 for (i = 0, sg_count = 0 ; i < count; i++, sgpnt++) { 1497 for (i = 0, sg_count = 0; i < count; i++, sg = sg_next(sg)) {
1493 sg_len = sg_dma_len(sgpnt); 1498 sg_len = sg_dma_len(sg);
1494 sg_addr = sg_dma_address(sgpnt); 1499 sg_addr = sg_dma_address(sg);
1495 while (sg_len) { 1500 while (sg_len) {
1496 sg_element[sg_count].segment_base_lo = sg_addr; 1501 sg_element[sg_count].segment_base_lo = sg_addr;
1497 if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) { 1502 if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
@@ -1521,11 +1526,10 @@ static void sbp2_create_command_orb(struct sbp2_lu *lu,
1521 unchar *scsi_cmd, 1526 unchar *scsi_cmd,
1522 unsigned int scsi_use_sg, 1527 unsigned int scsi_use_sg,
1523 unsigned int scsi_request_bufflen, 1528 unsigned int scsi_request_bufflen,
1524 void *scsi_request_buffer, 1529 struct scatterlist *sg,
1525 enum dma_data_direction dma_dir) 1530 enum dma_data_direction dma_dir)
1526{ 1531{
1527 struct sbp2_fwhost_info *hi = lu->hi; 1532 struct sbp2_fwhost_info *hi = lu->hi;
1528 struct scatterlist *sgpnt = (struct scatterlist *)scsi_request_buffer;
1529 struct sbp2_command_orb *orb = &cmd->command_orb; 1533 struct sbp2_command_orb *orb = &cmd->command_orb;
1530 u32 orb_direction; 1534 u32 orb_direction;
1531 1535
@@ -1560,7 +1564,7 @@ static void sbp2_create_command_orb(struct sbp2_lu *lu,
1560 orb->data_descriptor_lo = 0x0; 1564 orb->data_descriptor_lo = 0x0;
1561 orb->misc |= ORB_SET_DIRECTION(1); 1565 orb->misc |= ORB_SET_DIRECTION(1);
1562 } else 1566 } else
1563 sbp2_prep_command_orb_sg(orb, hi, cmd, scsi_use_sg, sgpnt, 1567 sbp2_prep_command_orb_sg(orb, hi, cmd, scsi_use_sg, sg,
1564 orb_direction, dma_dir); 1568 orb_direction, dma_dir);
1565 1569
1566 sbp2util_cpu_to_be32_buffer(orb, sizeof(*orb)); 1570 sbp2util_cpu_to_be32_buffer(orb, sizeof(*orb));
@@ -1650,7 +1654,6 @@ static int sbp2_send_command(struct sbp2_lu *lu, struct scsi_cmnd *SCpnt,
1650 void (*done)(struct scsi_cmnd *)) 1654 void (*done)(struct scsi_cmnd *))
1651{ 1655{
1652 unchar *scsi_cmd = (unchar *)SCpnt->cmnd; 1656 unchar *scsi_cmd = (unchar *)SCpnt->cmnd;
1653 unsigned int request_bufflen = scsi_bufflen(SCpnt);
1654 struct sbp2_command_info *cmd; 1657 struct sbp2_command_info *cmd;
1655 1658
1656 cmd = sbp2util_allocate_command_orb(lu, SCpnt, done); 1659 cmd = sbp2util_allocate_command_orb(lu, SCpnt, done);
@@ -1658,7 +1661,7 @@ static int sbp2_send_command(struct sbp2_lu *lu, struct scsi_cmnd *SCpnt,
1658 return -EIO; 1661 return -EIO;
1659 1662
1660 sbp2_create_command_orb(lu, cmd, scsi_cmd, scsi_sg_count(SCpnt), 1663 sbp2_create_command_orb(lu, cmd, scsi_cmd, scsi_sg_count(SCpnt),
1661 request_bufflen, scsi_sglist(SCpnt), 1664 scsi_bufflen(SCpnt), scsi_sglist(SCpnt),
1662 SCpnt->sc_data_direction); 1665 SCpnt->sc_data_direction);
1663 sbp2_link_orb_command(lu, cmd); 1666 sbp2_link_orb_command(lu, cmd);
1664 1667
@@ -1987,6 +1990,8 @@ static int sbp2scsi_slave_configure(struct scsi_device *sdev)
1987 sdev->skip_ms_page_8 = 1; 1990 sdev->skip_ms_page_8 = 1;
1988 if (lu->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) 1991 if (lu->workarounds & SBP2_WORKAROUND_FIX_CAPACITY)
1989 sdev->fix_capacity = 1; 1992 sdev->fix_capacity = 1;
1993 if (lu->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS)
1994 blk_queue_max_sectors(sdev->request_queue, 128 * 1024 / 512);
1990 return 0; 1995 return 0;
1991} 1996}
1992 1997
@@ -2093,9 +2098,6 @@ static int sbp2_module_init(void)
2093 sbp2_shost_template.cmd_per_lun = 1; 2098 sbp2_shost_template.cmd_per_lun = 1;
2094 } 2099 }
2095 2100
2096 if (sbp2_default_workarounds & SBP2_WORKAROUND_128K_MAX_TRANS &&
2097 (sbp2_max_sectors * 512) > (128 * 1024))
2098 sbp2_max_sectors = 128 * 1024 / 512;
2099 sbp2_shost_template.max_sectors = sbp2_max_sectors; 2101 sbp2_shost_template.max_sectors = sbp2_max_sectors;
2100 2102
2101 hpsb_register_highlevel(&sbp2_highlevel); 2103 hpsb_register_highlevel(&sbp2_highlevel);
diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h
index 333a4bb76743..d2ecb0d8a1bb 100644
--- a/drivers/ieee1394/sbp2.h
+++ b/drivers/ieee1394/sbp2.h
@@ -222,7 +222,6 @@ struct sbp2_status_block {
222 */ 222 */
223 223
224#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000 224#define SBP2_MAX_SG_ELEMENT_LENGTH 0xf000
225#define SBP2_MAX_SECTORS 255
226/* There is no real limitation of the queue depth (i.e. length of the linked 225/* There is no real limitation of the queue depth (i.e. length of the linked
227 * list of command ORBs) at the target. The chosen depth is merely an 226 * list of command ORBs) at the target. The chosen depth is merely an
228 * implementation detail of the sbp2 driver. */ 227 * implementation detail of the sbp2 driver. */
diff --git a/include/asm-alpha/tlbflush.h b/include/asm-alpha/tlbflush.h
index eefab3fb51ae..b9e9147226f7 100644
--- a/include/asm-alpha/tlbflush.h
+++ b/include/asm-alpha/tlbflush.h
@@ -3,6 +3,7 @@
3 3
4#include <linux/mm.h> 4#include <linux/mm.h>
5#include <asm/compiler.h> 5#include <asm/compiler.h>
6#include <asm/pgalloc.h>
6 7
7#ifndef __EXTERN_INLINE 8#ifndef __EXTERN_INLINE
8#define __EXTERN_INLINE extern inline 9#define __EXTERN_INLINE extern inline
diff --git a/include/asm-ia64/percpu.h b/include/asm-ia64/percpu.h
index 0095bcf79848..77f30b664b4e 100644
--- a/include/asm-ia64/percpu.h
+++ b/include/asm-ia64/percpu.h
@@ -15,38 +15,20 @@
15 15
16#include <linux/threads.h> 16#include <linux/threads.h>
17 17
18#ifdef CONFIG_SMP
19
18#ifdef HAVE_MODEL_SMALL_ATTRIBUTE 20#ifdef HAVE_MODEL_SMALL_ATTRIBUTE
19# define PER_CPU_ATTRIBUTES __attribute__((__model__ (__small__))) 21# define PER_CPU_ATTRIBUTES __attribute__((__model__ (__small__)))
20#endif 22#endif
21 23
22#define DECLARE_PER_CPU(type, name) \ 24#define __my_cpu_offset __ia64_per_cpu_var(local_per_cpu_offset)
23 extern PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name
24
25/*
26 * Pretty much a literal copy of asm-generic/percpu.h, except that percpu_modcopy() is an
27 * external routine, to avoid include-hell.
28 */
29#ifdef CONFIG_SMP
30
31extern unsigned long __per_cpu_offset[NR_CPUS];
32#define per_cpu_offset(x) (__per_cpu_offset[x])
33
34/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */
35DECLARE_PER_CPU(unsigned long, local_per_cpu_offset);
36 25
37#define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset[cpu]))
38#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset)))
39#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __ia64_per_cpu_var(local_per_cpu_offset)))
40
41extern void percpu_modcopy(void *pcpudst, const void *src, unsigned long size);
42extern void setup_per_cpu_areas (void);
43extern void *per_cpu_init(void); 26extern void *per_cpu_init(void);
44 27
45#else /* ! SMP */ 28#else /* ! SMP */
46 29
47#define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var)) 30#define PER_CPU_ATTRIBUTES __attribute__((__section__(".data.percpu")))
48#define __get_cpu_var(var) per_cpu__##var 31
49#define __raw_get_cpu_var(var) per_cpu__##var
50#define per_cpu_init() (__phys_per_cpu_start) 32#define per_cpu_init() (__phys_per_cpu_start)
51 33
52#endif /* SMP */ 34#endif /* SMP */
@@ -57,7 +39,12 @@ extern void *per_cpu_init(void);
57 * On the positive side, using __ia64_per_cpu_var() instead of __get_cpu_var() is slightly 39 * On the positive side, using __ia64_per_cpu_var() instead of __get_cpu_var() is slightly
58 * more efficient. 40 * more efficient.
59 */ 41 */
60#define __ia64_per_cpu_var(var) (per_cpu__##var) 42#define __ia64_per_cpu_var(var) per_cpu__##var
43
44#include <asm-generic/percpu.h>
45
46/* Equal to __per_cpu_offset[smp_processor_id()], but faster to access: */
47DECLARE_PER_CPU(unsigned long, local_per_cpu_offset);
61 48
62#endif /* !__ASSEMBLY__ */ 49#endif /* !__ASSEMBLY__ */
63 50
diff --git a/include/asm-powerpc/percpu.h b/include/asm-powerpc/percpu.h
index cc1cbf656b02..ccb0523eb3b4 100644
--- a/include/asm-powerpc/percpu.h
+++ b/include/asm-powerpc/percpu.h
@@ -13,37 +13,12 @@
13#include <asm/paca.h> 13#include <asm/paca.h>
14 14
15#define __per_cpu_offset(cpu) (paca[cpu].data_offset) 15#define __per_cpu_offset(cpu) (paca[cpu].data_offset)
16#define __my_cpu_offset() get_paca()->data_offset 16#define __my_cpu_offset get_paca()->data_offset
17#define per_cpu_offset(x) (__per_cpu_offset(x)) 17#define per_cpu_offset(x) (__per_cpu_offset(x))
18 18
19/* var is in discarded region: offset to particular copy we want */ 19#endif /* CONFIG_SMP */
20#define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) 20#endif /* __powerpc64__ */
21#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset()))
22#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, local_paca->data_offset))
23 21
24/* A macro to avoid #include hell... */
25#define percpu_modcopy(pcpudst, src, size) \
26do { \
27 unsigned int __i; \
28 for_each_possible_cpu(__i) \
29 memcpy((pcpudst)+__per_cpu_offset(__i), \
30 (src), (size)); \
31} while (0)
32
33extern void setup_per_cpu_areas(void);
34
35#else /* ! SMP */
36
37#define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var))
38#define __get_cpu_var(var) per_cpu__##var
39#define __raw_get_cpu_var(var) per_cpu__##var
40
41#endif /* SMP */
42
43#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
44
45#else
46#include <asm-generic/percpu.h> 22#include <asm-generic/percpu.h>
47#endif
48 23
49#endif /* _ASM_POWERPC_PERCPU_H_ */ 24#endif /* _ASM_POWERPC_PERCPU_H_ */
diff --git a/include/asm-s390/percpu.h b/include/asm-s390/percpu.h
index 2d676a873858..408d60b4f75b 100644
--- a/include/asm-s390/percpu.h
+++ b/include/asm-s390/percpu.h
@@ -13,49 +13,25 @@
13 */ 13 */
14#if defined(__s390x__) && defined(MODULE) 14#if defined(__s390x__) && defined(MODULE)
15 15
16#define __reloc_hide(var,offset) (*({ \ 16#define SHIFT_PERCPU_PTR(ptr,offset) (({ \
17 extern int simple_identifier_##var(void); \ 17 extern int simple_identifier_##var(void); \
18 unsigned long *__ptr; \ 18 unsigned long *__ptr; \
19 asm ( "larl %0,per_cpu__"#var"@GOTENT" \ 19 asm ( "larl %0, %1@GOTENT" \
20 : "=a" (__ptr) : "X" (per_cpu__##var) ); \ 20 : "=a" (__ptr) : "X" (ptr) ); \
21 (typeof(&per_cpu__##var))((*__ptr) + (offset)); })) 21 (typeof(ptr))((*__ptr) + (offset)); }))
22 22
23#else 23#else
24 24
25#define __reloc_hide(var, offset) (*({ \ 25#define SHIFT_PERCPU_PTR(ptr, offset) (({ \
26 extern int simple_identifier_##var(void); \ 26 extern int simple_identifier_##var(void); \
27 unsigned long __ptr; \ 27 unsigned long __ptr; \
28 asm ( "" : "=a" (__ptr) : "0" (&per_cpu__##var) ); \ 28 asm ( "" : "=a" (__ptr) : "0" (ptr) ); \
29 (typeof(&per_cpu__##var)) (__ptr + (offset)); })) 29 (typeof(ptr)) (__ptr + (offset)); }))
30 30
31#endif 31#endif
32 32
33#ifdef CONFIG_SMP 33#define __my_cpu_offset S390_lowcore.percpu_offset
34 34
35extern unsigned long __per_cpu_offset[NR_CPUS]; 35#include <asm-generic/percpu.h>
36
37#define __get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset)
38#define __raw_get_cpu_var(var) __reloc_hide(var,S390_lowcore.percpu_offset)
39#define per_cpu(var,cpu) __reloc_hide(var,__per_cpu_offset[cpu])
40#define per_cpu_offset(x) (__per_cpu_offset[x])
41
42/* A macro to avoid #include hell... */
43#define percpu_modcopy(pcpudst, src, size) \
44do { \
45 unsigned int __i; \
46 for_each_possible_cpu(__i) \
47 memcpy((pcpudst)+__per_cpu_offset[__i], \
48 (src), (size)); \
49} while (0)
50
51#else /* ! SMP */
52
53#define __get_cpu_var(var) __reloc_hide(var,0)
54#define __raw_get_cpu_var(var) __reloc_hide(var,0)
55#define per_cpu(var,cpu) __reloc_hide(var,0)
56
57#endif /* SMP */
58
59#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name
60 36
61#endif /* __ARCH_S390_PERCPU__ */ 37#endif /* __ARCH_S390_PERCPU__ */
diff --git a/include/asm-sparc64/percpu.h b/include/asm-sparc64/percpu.h
index c7e52decba98..bee64593023e 100644
--- a/include/asm-sparc64/percpu.h
+++ b/include/asm-sparc64/percpu.h
@@ -7,7 +7,6 @@ register unsigned long __local_per_cpu_offset asm("g5");
7 7
8#ifdef CONFIG_SMP 8#ifdef CONFIG_SMP
9 9
10#define setup_per_cpu_areas() do { } while (0)
11extern void real_setup_per_cpu_areas(void); 10extern void real_setup_per_cpu_areas(void);
12 11
13extern unsigned long __per_cpu_base; 12extern unsigned long __per_cpu_base;
@@ -16,29 +15,14 @@ extern unsigned long __per_cpu_shift;
16 (__per_cpu_base + ((unsigned long)(__cpu) << __per_cpu_shift)) 15 (__per_cpu_base + ((unsigned long)(__cpu) << __per_cpu_shift))
17#define per_cpu_offset(x) (__per_cpu_offset(x)) 16#define per_cpu_offset(x) (__per_cpu_offset(x))
18 17
19/* var is in discarded region: offset to particular copy we want */ 18#define __my_cpu_offset __local_per_cpu_offset
20#define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) 19
21#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset))
22#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __local_per_cpu_offset))
23
24/* A macro to avoid #include hell... */
25#define percpu_modcopy(pcpudst, src, size) \
26do { \
27 unsigned int __i; \
28 for_each_possible_cpu(__i) \
29 memcpy((pcpudst)+__per_cpu_offset(__i), \
30 (src), (size)); \
31} while (0)
32#else /* ! SMP */ 20#else /* ! SMP */
33 21
34#define real_setup_per_cpu_areas() do { } while (0) 22#define real_setup_per_cpu_areas() do { } while (0)
35 23
36#define per_cpu(var, cpu) (*((void)cpu, &per_cpu__##var))
37#define __get_cpu_var(var) per_cpu__##var
38#define __raw_get_cpu_var(var) per_cpu__##var
39
40#endif /* SMP */ 24#endif /* SMP */
41 25
42#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name 26#include <asm-generic/percpu.h>
43 27
44#endif /* __ARCH_SPARC64_PERCPU__ */ 28#endif /* __ARCH_SPARC64_PERCPU__ */
diff --git a/include/asm-x86/thread_info_64.h b/include/asm-x86/thread_info_64.h
index 9b531ea015a8..6c9b214b8fc3 100644
--- a/include/asm-x86/thread_info_64.h
+++ b/include/asm-x86/thread_info_64.h
@@ -123,8 +123,8 @@ static inline struct thread_info *stack_thread_info(void)
123#define TIF_FREEZE 23 /* is freezing for suspend */ 123#define TIF_FREEZE 23 /* is freezing for suspend */
124#define TIF_FORCED_TF 24 /* true if TF in eflags artificially */ 124#define TIF_FORCED_TF 24 /* true if TF in eflags artificially */
125#define TIF_DEBUGCTLMSR 25 /* uses thread_struct.debugctlmsr */ 125#define TIF_DEBUGCTLMSR 25 /* uses thread_struct.debugctlmsr */
126#define TIF_DS_AREA_MSR 25 /* uses thread_struct.ds_area_msr */ 126#define TIF_DS_AREA_MSR 26 /* uses thread_struct.ds_area_msr */
127#define TIF_BTS_TRACE_TS 26 /* record scheduling event timestamps */ 127#define TIF_BTS_TRACE_TS 27 /* record scheduling event timestamps */
128 128
129#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) 129#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
130#define _TIF_SIGPENDING (1<<TIF_SIGPENDING) 130#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
diff --git a/include/linux/percpu.h b/include/linux/percpu.h
index 00412bb494c4..50faa0ea28e4 100644
--- a/include/linux/percpu.h
+++ b/include/linux/percpu.h
@@ -9,10 +9,6 @@
9 9
10#include <asm/percpu.h> 10#include <asm/percpu.h>
11 11
12#ifndef PER_CPU_ATTRIBUTES
13#define PER_CPU_ATTRIBUTES
14#endif
15
16#ifdef CONFIG_SMP 12#ifdef CONFIG_SMP
17#define DEFINE_PER_CPU(type, name) \ 13#define DEFINE_PER_CPU(type, name) \
18 __attribute__((__section__(".data.percpu"))) \ 14 __attribute__((__section__(".data.percpu"))) \