diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2011-04-22 09:13:54 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2011-05-10 16:53:44 -0400 |
commit | f30e6d3e419bfb5540fa82ba7eca01d578556e6b (patch) | |
tree | e4d6e7bad161a76b09557bf7513358ae1ce8f7fb /drivers/firewire/core-card.c | |
parent | 020abf03cd659388f94cb328e1e1df0656e0d7ff (diff) |
firewire: octlet AT payloads can be stack-allocated
We do not need slab allocations anymore in order to satisfy
streaming DMA mapping constraints, thanks to commit da28947e7e36
"firewire: ohci: avoid separate DMA mapping for small AT payloads".
(Besides, the slab-allocated buffers that firewire-core, firewire-sbp2,
and firedtv used to provide for 8-byte write and lock requests were
still not fully portable since they crossed cacheline boundaries or
shared a cacheline with unrelated CPU-accessed data. snd-firewire-lib
got this aspect right by using an extra kmalloc/ kfree just for the
8-byte transaction buffer.)
This change replaces kmalloc'ed lock transaction scratch buffers in
firewire-core, firedtv, and snd-firewire-lib by local stack allocations.
Perhaps the most notable result of the change is simpler locking because
there is no need to serialize usages of preallocated per-device buffers
anymore. Also, allocations and deallocations are simpler.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Acked-by: Clemens Ladisch <clemens@ladisch.de>
Diffstat (limited to 'drivers/firewire/core-card.c')
-rw-r--r-- | drivers/firewire/core-card.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c index 3c44fbc81acb..e119f1e6ba47 100644 --- a/drivers/firewire/core-card.c +++ b/drivers/firewire/core-card.c | |||
@@ -258,8 +258,7 @@ static void allocate_broadcast_channel(struct fw_card *card, int generation) | |||
258 | 258 | ||
259 | if (!card->broadcast_channel_allocated) { | 259 | if (!card->broadcast_channel_allocated) { |
260 | fw_iso_resource_manage(card, generation, 1ULL << 31, | 260 | fw_iso_resource_manage(card, generation, 1ULL << 31, |
261 | &channel, &bandwidth, true, | 261 | &channel, &bandwidth, true); |
262 | card->bm_transaction_data); | ||
263 | if (channel != 31) { | 262 | if (channel != 31) { |
264 | fw_notify("failed to allocate broadcast channel\n"); | 263 | fw_notify("failed to allocate broadcast channel\n"); |
265 | return; | 264 | return; |
@@ -294,6 +293,7 @@ static void bm_work(struct work_struct *work) | |||
294 | bool root_device_is_cmc; | 293 | bool root_device_is_cmc; |
295 | bool irm_is_1394_1995_only; | 294 | bool irm_is_1394_1995_only; |
296 | bool keep_this_irm; | 295 | bool keep_this_irm; |
296 | __be32 transaction_data[2]; | ||
297 | 297 | ||
298 | spin_lock_irq(&card->lock); | 298 | spin_lock_irq(&card->lock); |
299 | 299 | ||
@@ -355,21 +355,21 @@ static void bm_work(struct work_struct *work) | |||
355 | goto pick_me; | 355 | goto pick_me; |
356 | } | 356 | } |
357 | 357 | ||
358 | card->bm_transaction_data[0] = cpu_to_be32(0x3f); | 358 | transaction_data[0] = cpu_to_be32(0x3f); |
359 | card->bm_transaction_data[1] = cpu_to_be32(local_id); | 359 | transaction_data[1] = cpu_to_be32(local_id); |
360 | 360 | ||
361 | spin_unlock_irq(&card->lock); | 361 | spin_unlock_irq(&card->lock); |
362 | 362 | ||
363 | rcode = fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP, | 363 | rcode = fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP, |
364 | irm_id, generation, SCODE_100, | 364 | irm_id, generation, SCODE_100, |
365 | CSR_REGISTER_BASE + CSR_BUS_MANAGER_ID, | 365 | CSR_REGISTER_BASE + CSR_BUS_MANAGER_ID, |
366 | card->bm_transaction_data, 8); | 366 | transaction_data, 8); |
367 | 367 | ||
368 | if (rcode == RCODE_GENERATION) | 368 | if (rcode == RCODE_GENERATION) |
369 | /* Another bus reset, BM work has been rescheduled. */ | 369 | /* Another bus reset, BM work has been rescheduled. */ |
370 | goto out; | 370 | goto out; |
371 | 371 | ||
372 | bm_id = be32_to_cpu(card->bm_transaction_data[0]); | 372 | bm_id = be32_to_cpu(transaction_data[0]); |
373 | 373 | ||
374 | spin_lock_irq(&card->lock); | 374 | spin_lock_irq(&card->lock); |
375 | if (rcode == RCODE_COMPLETE && generation == card->generation) | 375 | if (rcode == RCODE_COMPLETE && generation == card->generation) |
@@ -490,11 +490,11 @@ static void bm_work(struct work_struct *work) | |||
490 | /* | 490 | /* |
491 | * Make sure that the cycle master sends cycle start packets. | 491 | * Make sure that the cycle master sends cycle start packets. |
492 | */ | 492 | */ |
493 | card->bm_transaction_data[0] = cpu_to_be32(CSR_STATE_BIT_CMSTR); | 493 | transaction_data[0] = cpu_to_be32(CSR_STATE_BIT_CMSTR); |
494 | rcode = fw_run_transaction(card, TCODE_WRITE_QUADLET_REQUEST, | 494 | rcode = fw_run_transaction(card, TCODE_WRITE_QUADLET_REQUEST, |
495 | root_id, generation, SCODE_100, | 495 | root_id, generation, SCODE_100, |
496 | CSR_REGISTER_BASE + CSR_STATE_SET, | 496 | CSR_REGISTER_BASE + CSR_STATE_SET, |
497 | card->bm_transaction_data, 4); | 497 | transaction_data, 4); |
498 | if (rcode == RCODE_GENERATION) | 498 | if (rcode == RCODE_GENERATION) |
499 | goto out; | 499 | goto out; |
500 | } | 500 | } |