#include "core.h"
 
-static int __compute_block_crc(__be32 *block)
+int fw_compute_block_crc(__be32 *block)
 {
        int length;
        u16 crc;
        return length;
 }
 
-int fw_compute_block_crc(u32 *block)
-{
-       __be32 be32_block[256];
-       int i, length;
-
-       length = (*block >> 16) & 0xff;
-       for (i = 0; i < length; i++)
-               be32_block[i] = cpu_to_be32(block[i + 1]);
-       *block |= crc_itu_t(0, (u8 *) be32_block, length * 4);
-
-       return length;
-}
-
 static DEFINE_MUTEX(card_mutex);
 static LIST_HEAD(card_list);
 
         * the bus info block, which is always the case for this
         * implementation. */
        for (i = 0; i < j; i += length + 1)
-               length = __compute_block_crc(config_rom + i);
+               length = fw_compute_block_crc(config_rom + i);
 
        return j;
 }
 
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
-#include <linux/string.h>
 
 #include <asm/atomic.h>
+#include <asm/byteorder.h>
 #include <asm/system.h>
 
 #include "core.h"
 static void update_topology_map(struct fw_card *card,
                                u32 *self_ids, int self_id_count)
 {
-       int node_count;
+       int node_count = (card->root_node->node_id & 0x3f) + 1;
+       __be32 *map = card->topology_map;
+
+       *map++ = cpu_to_be32((self_id_count + 2) << 16);
+       *map++ = cpu_to_be32(be32_to_cpu(card->topology_map[1]) + 1);
+       *map++ = cpu_to_be32((node_count << 16) | self_id_count);
+
+       while (self_id_count--)
+               *map++ = cpu_to_be32p(self_ids++);
 
-       card->topology_map[1]++;
-       node_count = (card->root_node->node_id & 0x3f) + 1;
-       card->topology_map[2] = (node_count << 16) | self_id_count;
-       card->topology_map[0] = (self_id_count + 2) << 16;
-       memcpy(&card->topology_map[3], self_ids, self_id_count * 4);
        fw_compute_block_crc(card->topology_map);
 }
 
 
                int speed, unsigned long long offset,
                void *payload, size_t length, void *callback_data)
 {
-       int i, start, end;
-       __be32 *map;
+       int start;
 
        if (!TCODE_IS_READ_REQUEST(tcode)) {
                fw_send_response(card, request, RCODE_TYPE_ERROR);
        }
 
        start = (offset - topology_map_region.start) / 4;
-       end = start + length / 4;
-       map = payload;
-
-       for (i = 0; i < length / 4; i++)
-               map[i] = cpu_to_be32(card->topology_map[start + i]);
+       memcpy(payload, &card->topology_map[start], length);
 
        fw_send_response(card, request, RCODE_COMPLETE);
 }
 
                u32 max_receive, u32 link_speed, u64 guid);
 void fw_core_remove_card(struct fw_card *card);
 int fw_core_initiate_bus_reset(struct fw_card *card, int short_reset);
-int fw_compute_block_crc(u32 *block);
+int fw_compute_block_crc(__be32 *block);
 void fw_schedule_bm_work(struct fw_card *card, unsigned long delay);
 
 static inline struct fw_card *fw_card_get(struct fw_card *card)
 
 
        bool broadcast_channel_allocated;
        u32 broadcast_channel;
-       u32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];
+       __be32 topology_map[(CSR_TOPOLOGY_MAP_END - CSR_TOPOLOGY_MAP) / 4];
 };
 
 struct fw_attribute_group {