Lines Matching refs:card
41 void func(const struct fw_card *card, const char *fmt, ...) \
50 dev_name(card->device), &vaf); \
103 static void generate_config_rom(struct fw_card *card, __be32 *config_rom) in generate_config_rom() argument
121 BIB_LINK_SPEED(card->link_speed) | in generate_config_rom()
122 BIB_GENERATION(card->config_rom_generation++ % 14 + 2) | in generate_config_rom()
124 BIB_MAX_RECEIVE(card->max_receive) | in generate_config_rom()
126 config_rom[3] = cpu_to_be32(card->guid >> 32); in generate_config_rom()
127 config_rom[4] = cpu_to_be32(card->guid); in generate_config_rom()
165 struct fw_card *card; in update_config_roms() local
167 list_for_each_entry (card, &card_list, link) { in update_config_roms()
168 generate_config_rom(card, tmp_config_rom); in update_config_roms()
169 card->driver->set_config_rom(card, tmp_config_rom, in update_config_roms()
232 static int reset_bus(struct fw_card *card, bool short_reset) in reset_bus() argument
237 return card->driver->update_phy_reg(card, reg, 0, bit); in reset_bus()
240 void fw_schedule_bus_reset(struct fw_card *card, bool delayed, bool short_reset) in fw_schedule_bus_reset() argument
243 card->br_short = short_reset; in fw_schedule_bus_reset()
246 fw_card_get(card); in fw_schedule_bus_reset()
247 if (!queue_delayed_work(fw_workqueue, &card->br_work, in fw_schedule_bus_reset()
249 fw_card_put(card); in fw_schedule_bus_reset()
255 struct fw_card *card = container_of(work, struct fw_card, br_work.work); in br_work() local
258 if (card->reset_jiffies != 0 && in br_work()
259 time_before64(get_jiffies_64(), card->reset_jiffies + 2 * HZ)) { in br_work()
260 if (!queue_delayed_work(fw_workqueue, &card->br_work, 2 * HZ)) in br_work()
261 fw_card_put(card); in br_work()
265 fw_send_phy_config(card, FW_PHY_CONFIG_NO_NODE_ID, card->generation, in br_work()
267 reset_bus(card, card->br_short); in br_work()
268 fw_card_put(card); in br_work()
271 static void allocate_broadcast_channel(struct fw_card *card, int generation) in allocate_broadcast_channel() argument
275 if (!card->broadcast_channel_allocated) { in allocate_broadcast_channel()
276 fw_iso_resource_manage(card, generation, 1ULL << 31, in allocate_broadcast_channel()
279 fw_notice(card, "failed to allocate broadcast channel\n"); in allocate_broadcast_channel()
282 card->broadcast_channel_allocated = true; in allocate_broadcast_channel()
285 device_for_each_child(card->device, (void *)(long)generation, in allocate_broadcast_channel()
293 void fw_schedule_bm_work(struct fw_card *card, unsigned long delay) in fw_schedule_bm_work() argument
295 fw_card_get(card); in fw_schedule_bm_work()
296 if (!schedule_delayed_work(&card->bm_work, delay)) in fw_schedule_bm_work()
297 fw_card_put(card); in fw_schedule_bm_work()
302 struct fw_card *card = container_of(work, struct fw_card, bm_work.work); in bm_work() local
314 spin_lock_irq(&card->lock); in bm_work()
316 if (card->local_node == NULL) { in bm_work()
317 spin_unlock_irq(&card->lock); in bm_work()
321 generation = card->generation; in bm_work()
323 root_node = card->root_node; in bm_work()
330 irm_device = card->irm_node->data; in bm_work()
339 irm_id = card->irm_node->node_id; in bm_work()
340 local_id = card->local_node->node_id; in bm_work()
343 card->reset_jiffies + DIV_ROUND_UP(HZ, 8)); in bm_work()
345 if ((is_next_generation(generation, card->bm_generation) && in bm_work()
346 !card->bm_abdicate) || in bm_work()
347 (card->bm_generation != generation && grace)) { in bm_work()
360 if (!card->irm_node->link_on) { in bm_work()
362 fw_notice(card, "%s, making local node (%02x) root\n", in bm_work()
369 fw_notice(card, "%s, making local node (%02x) root\n", in bm_work()
377 spin_unlock_irq(&card->lock); in bm_work()
379 rcode = fw_run_transaction(card, TCODE_LOCK_COMPARE_SWAP, in bm_work()
390 spin_lock_irq(&card->lock); in bm_work()
391 if (rcode == RCODE_COMPLETE && generation == card->generation) in bm_work()
392 card->bm_node_id = in bm_work()
394 spin_unlock_irq(&card->lock); in bm_work()
399 allocate_broadcast_channel(card, generation); in bm_work()
410 fw_schedule_bm_work(card, DIV_ROUND_UP(HZ, 8)); in bm_work()
414 spin_lock_irq(&card->lock); in bm_work()
424 fw_notice(card, "BM lock failed (%s), making local node (%02x) root\n", in bm_work()
428 } else if (card->bm_generation != generation) { in bm_work()
433 spin_unlock_irq(&card->lock); in bm_work()
434 fw_schedule_bm_work(card, DIV_ROUND_UP(HZ, 8)); in bm_work()
443 card->bm_generation = generation; in bm_work()
456 spin_unlock_irq(&card->lock); in bm_work()
478 if (!card->beta_repeaters_present && in bm_work()
490 if (card->bm_retries++ < 5 && in bm_work()
491 (card->gap_count != gap_count || new_root_id != root_id)) in bm_work()
494 spin_unlock_irq(&card->lock); in bm_work()
497 fw_notice(card, "phy config: new root=%x, gap_count=%d\n", in bm_work()
499 fw_send_phy_config(card, new_root_id, generation, gap_count); in bm_work()
500 reset_bus(card, true); in bm_work()
510 rcode = fw_run_transaction(card, TCODE_WRITE_QUADLET_REQUEST, in bm_work()
519 allocate_broadcast_channel(card, generation); in bm_work()
524 fw_card_put(card); in bm_work()
527 void fw_card_initialize(struct fw_card *card, in fw_card_initialize() argument
533 card->index = atomic_inc_return(&index); in fw_card_initialize()
534 card->driver = driver; in fw_card_initialize()
535 card->device = device; in fw_card_initialize()
536 card->current_tlabel = 0; in fw_card_initialize()
537 card->tlabel_mask = 0; in fw_card_initialize()
538 card->split_timeout_hi = DEFAULT_SPLIT_TIMEOUT / 8000; in fw_card_initialize()
539 card->split_timeout_lo = (DEFAULT_SPLIT_TIMEOUT % 8000) << 19; in fw_card_initialize()
540 card->split_timeout_cycles = DEFAULT_SPLIT_TIMEOUT; in fw_card_initialize()
541 card->split_timeout_jiffies = in fw_card_initialize()
543 card->color = 0; in fw_card_initialize()
544 card->broadcast_channel = BROADCAST_CHANNEL_INITIAL; in fw_card_initialize()
546 kref_init(&card->kref); in fw_card_initialize()
547 init_completion(&card->done); in fw_card_initialize()
548 INIT_LIST_HEAD(&card->transaction_list); in fw_card_initialize()
549 INIT_LIST_HEAD(&card->phy_receiver_list); in fw_card_initialize()
550 spin_lock_init(&card->lock); in fw_card_initialize()
552 card->local_node = NULL; in fw_card_initialize()
554 INIT_DELAYED_WORK(&card->br_work, br_work); in fw_card_initialize()
555 INIT_DELAYED_WORK(&card->bm_work, bm_work); in fw_card_initialize()
559 int fw_card_add(struct fw_card *card, in fw_card_add() argument
564 card->max_receive = max_receive; in fw_card_add()
565 card->link_speed = link_speed; in fw_card_add()
566 card->guid = guid; in fw_card_add()
570 generate_config_rom(card, tmp_config_rom); in fw_card_add()
571 ret = card->driver->enable(card, tmp_config_rom, config_rom_length); in fw_card_add()
573 list_add_tail(&card->link, &card_list); in fw_card_add()
594 static int dummy_read_phy_reg(struct fw_card *card, int address) in dummy_read_phy_reg() argument
599 static int dummy_update_phy_reg(struct fw_card *card, int address, in dummy_update_phy_reg() argument
605 static void dummy_send_request(struct fw_card *card, struct fw_packet *packet) in dummy_send_request() argument
607 packet->callback(packet, card, RCODE_CANCELLED); in dummy_send_request()
610 static void dummy_send_response(struct fw_card *card, struct fw_packet *packet) in dummy_send_response() argument
612 packet->callback(packet, card, RCODE_CANCELLED); in dummy_send_response()
615 static int dummy_cancel_packet(struct fw_card *card, struct fw_packet *packet) in dummy_cancel_packet() argument
620 static int dummy_enable_phys_dma(struct fw_card *card, in dummy_enable_phys_dma() argument
626 static struct fw_iso_context *dummy_allocate_iso_context(struct fw_card *card, in dummy_allocate_iso_context() argument
675 struct fw_card *card = container_of(kref, struct fw_card, kref); in fw_card_release() local
677 complete(&card->done); in fw_card_release()
681 void fw_core_remove_card(struct fw_card *card) in fw_core_remove_card() argument
685 card->driver->update_phy_reg(card, 4, in fw_core_remove_card()
687 fw_schedule_bus_reset(card, false, true); in fw_core_remove_card()
690 list_del_init(&card->link); in fw_core_remove_card()
694 dummy_driver.free_iso_context = card->driver->free_iso_context; in fw_core_remove_card()
695 dummy_driver.stop_iso = card->driver->stop_iso; in fw_core_remove_card()
696 card->driver = &dummy_driver; in fw_core_remove_card()
698 fw_destroy_nodes(card); in fw_core_remove_card()
701 fw_card_put(card); in fw_core_remove_card()
702 wait_for_completion(&card->done); in fw_core_remove_card()
704 WARN_ON(!list_empty(&card->transaction_list)); in fw_core_remove_card()