aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/core-card.c
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2011-04-22 09:13:54 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2011-05-10 16:53:44 -0400
commitf30e6d3e419bfb5540fa82ba7eca01d578556e6b (patch)
treee4d6e7bad161a76b09557bf7513358ae1ce8f7fb /drivers/firewire/core-card.c
parent020abf03cd659388f94cb328e1e1df0656e0d7ff (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.c16
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 }