diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2009-10-08 00:42:27 +0200 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2009-10-14 23:10:48 +0200 |
commit | fe242579e9f33150868f1bb79c7e262ad7953f17 (patch) | |
tree | 6b6ca473ed6e506372f0c0e7d97faac02bc1f88c | |
parent | firewire: optimize config ROM creation (diff) | |
download | linux-fe242579e9f33150868f1bb79c7e262ad7953f17.tar.xz linux-fe242579e9f33150868f1bb79c7e262ad7953f17.zip |
firewire: core: clarify generate_config_rom usage
Move the static config ROM buffer into the scope of the two callers of
generate_config_rom(). That way the ROM length can be passed over as
return value rather than through a pointer argument.
It also becomes more obvious that accesses to the config ROM buffer have
to be serialized and how this is accomplished. And firewire-core.ko
shrinks a bit as well.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
-rw-r--r-- | drivers/firewire/core-card.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c index f73e3bdfc84c..f58130789990 100644 --- a/drivers/firewire/core-card.c +++ b/drivers/firewire/core-card.c @@ -69,6 +69,8 @@ static LIST_HEAD(card_list); static LIST_HEAD(descriptor_list); static int descriptor_count; +static __be32 tmp_config_rom[256]; + #define BIB_CRC(v) ((v) << 0) #define BIB_CRC_LENGTH(v) ((v) << 16) #define BIB_INFO_LENGTH(v) ((v) << 24) @@ -84,10 +86,9 @@ static int descriptor_count; #define BIB_CMC ((1) << 30) #define BIB_IMC ((1) << 31) -static __be32 *generate_config_rom(struct fw_card *card, size_t *rom_length) +static size_t generate_config_rom(struct fw_card *card, __be32 *config_rom) { struct fw_descriptor *desc; - static __be32 config_rom[256]; int i, j, k, length; /* @@ -142,20 +143,17 @@ static __be32 *generate_config_rom(struct fw_card *card, size_t *rom_length) for (i = 0; i < j; i += length + 1) length = __compute_block_crc(config_rom + i); - *rom_length = j; - - return config_rom; + return j; } static void update_config_roms(void) { struct fw_card *card; - __be32 *config_rom; size_t length; list_for_each_entry (card, &card_list, link) { - config_rom = generate_config_rom(card, &length); - card->driver->set_config_rom(card, config_rom, length); + length = generate_config_rom(card, tmp_config_rom); + card->driver->set_config_rom(card, tmp_config_rom, length); } } @@ -443,7 +441,6 @@ EXPORT_SYMBOL(fw_card_initialize); int fw_card_add(struct fw_card *card, u32 max_receive, u32 link_speed, u64 guid) { - __be32 *config_rom; size_t length; int ret; @@ -453,8 +450,8 @@ int fw_card_add(struct fw_card *card, mutex_lock(&card_mutex); - config_rom = generate_config_rom(card, &length); - ret = card->driver->enable(card, config_rom, length); + length = generate_config_rom(card, tmp_config_rom); + ret = card->driver->enable(card, tmp_config_rom, length); if (ret == 0) list_add_tail(&card->link, &card_list); |