aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/core-topology.c
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2009-10-07 18:42:53 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2009-10-14 17:10:48 -0400
commitcb7c96da3651111efbe088fa12f9bed61836ea93 (patch)
treed31d9ba7e321206cd5b32753f444aabc2c76efeb /drivers/firewire/core-topology.c
parentfe242579e9f33150868f1bb79c7e262ad7953f17 (diff)
firewire: core: optimize Topology Map creation
The Topology Map of the local node was created in CPU byte order, then a temporary big endian copy was created to compute the CRC, and when a read request to the Topology Map arrived it had to be converted to big endian byte order again. We now generate it in big endian byte order in the first place. This also rids us of 1000 bytes stack usage in tasklet context. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/core-topology.c')
-rw-r--r--drivers/firewire/core-topology.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/firewire/core-topology.c b/drivers/firewire/core-topology.c
index fddf2b35893..9a5f38c80b0 100644
--- a/drivers/firewire/core-topology.c
+++ b/drivers/firewire/core-topology.c
@@ -28,9 +28,9 @@
28#include <linux/module.h> 28#include <linux/module.h>
29#include <linux/slab.h> 29#include <linux/slab.h>
30#include <linux/spinlock.h> 30#include <linux/spinlock.h>
31#include <linux/string.h>
32 31
33#include <asm/atomic.h> 32#include <asm/atomic.h>
33#include <asm/byteorder.h>
34#include <asm/system.h> 34#include <asm/system.h>
35 35
36#include "core.h" 36#include "core.h"
@@ -510,13 +510,16 @@ static void update_tree(struct fw_card *card, struct fw_node *root)
510static void update_topology_map(struct fw_card *card, 510static void update_topology_map(struct fw_card *card,
511 u32 *self_ids, int self_id_count) 511 u32 *self_ids, int self_id_count)
512{ 512{
513 int node_count; 513 int node_count = (card->root_node->node_id & 0x3f) + 1;
514 __be32 *map = card->topology_map;
515
516 *map++ = cpu_to_be32((self_id_count + 2) << 16);
517 *map++ = cpu_to_be32(be32_to_cpu(card->topology_map[1]) + 1);
518 *map++ = cpu_to_be32((node_count << 16) | self_id_count);
519
520 while (self_id_count--)
521 *map++ = cpu_to_be32p(self_ids++);
514 522
515 card->topology_map[1]++;
516 node_count = (card->root_node->node_id & 0x3f) + 1;
517 card->topology_map[2] = (node_count << 16) | self_id_count;
518 card->topology_map[0] = (self_id_count + 2) << 16;
519 memcpy(&card->topology_map[3], self_ids, self_id_count * 4);
520 fw_compute_block_crc(card->topology_map); 523 fw_compute_block_crc(card->topology_map);
521} 524}
522 525