Lines Matching refs:lu

142 static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay)  in sbp2_queue_work()  argument
144 queue_delayed_work(fw_workqueue, &lu->work, delay); in sbp2_queue_work()
179 static const struct device *lu_dev(const struct sbp2_logical_unit *lu) in lu_dev() argument
181 return &lu->tgt->unit->device; in lu_dev()
261 struct sbp2_logical_unit *lu; member
410 struct sbp2_logical_unit *lu = callback_data; in sbp2_status_write() local
428 dev_notice(lu_dev(lu), in sbp2_status_write()
435 spin_lock_irqsave(&lu->tgt->lock, flags); in sbp2_status_write()
436 list_for_each_entry(iter, &lu->orb_list, link) { in sbp2_status_write()
445 spin_unlock_irqrestore(&lu->tgt->lock, flags); in sbp2_status_write()
451 dev_err(lu_dev(lu), "status write for unknown ORB\n"); in sbp2_status_write()
472 spin_lock_irqsave(&orb->lu->tgt->lock, flags); in complete_transaction()
478 spin_unlock_irqrestore(&orb->lu->tgt->lock, flags); in complete_transaction()
483 spin_unlock_irqrestore(&orb->lu->tgt->lock, flags); in complete_transaction()
489 static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu, in sbp2_send_orb() argument
492 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_send_orb()
499 orb->lu = lu; in sbp2_send_orb()
500 spin_lock_irqsave(&lu->tgt->lock, flags); in sbp2_send_orb()
501 list_add_tail(&orb->link, &lu->orb_list); in sbp2_send_orb()
502 spin_unlock_irqrestore(&lu->tgt->lock, flags); in sbp2_send_orb()
512 static int sbp2_cancel_orbs(struct sbp2_logical_unit *lu) in sbp2_cancel_orbs() argument
514 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_cancel_orbs()
520 spin_lock_irq(&lu->tgt->lock); in sbp2_cancel_orbs()
521 list_splice_init(&lu->orb_list, &list); in sbp2_cancel_orbs()
522 spin_unlock_irq(&lu->tgt->lock); in sbp2_cancel_orbs()
548 static int sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, in sbp2_send_management_orb() argument
552 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_send_management_orb()
582 cpu_to_be32(lu->address_handler.offset >> 32); in sbp2_send_management_orb()
584 cpu_to_be32(lu->address_handler.offset); in sbp2_send_management_orb()
591 timeout = lu->tgt->mgt_orb_timeout; in sbp2_send_management_orb()
605 sbp2_send_orb(&orb->base, lu, node_id, generation, in sbp2_send_management_orb()
606 lu->tgt->management_agent_address); in sbp2_send_management_orb()
611 if (sbp2_cancel_orbs(lu) == 0) { in sbp2_send_management_orb()
612 dev_err(lu_dev(lu), "ORB reply timed out, rcode 0x%02x\n", in sbp2_send_management_orb()
618 dev_err(lu_dev(lu), "management write failed, rcode 0x%02x\n", in sbp2_send_management_orb()
625 dev_err(lu_dev(lu), "error status: %d:%d\n", in sbp2_send_management_orb()
646 static void sbp2_agent_reset(struct sbp2_logical_unit *lu) in sbp2_agent_reset() argument
648 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_agent_reset()
652 lu->tgt->node_id, lu->generation, device->max_speed, in sbp2_agent_reset()
653 lu->command_block_agent_address + SBP2_AGENT_RESET, in sbp2_agent_reset()
663 static void sbp2_agent_reset_no_wait(struct sbp2_logical_unit *lu) in sbp2_agent_reset_no_wait() argument
665 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_agent_reset_no_wait()
674 lu->tgt->node_id, lu->generation, device->max_speed, in sbp2_agent_reset_no_wait()
675 lu->command_block_agent_address + SBP2_AGENT_RESET, in sbp2_agent_reset_no_wait()
696 static void sbp2_conditionally_block(struct sbp2_logical_unit *lu) in sbp2_conditionally_block() argument
698 struct sbp2_target *tgt = lu->tgt; in sbp2_conditionally_block()
705 if (!tgt->dont_block && !lu->blocked && in sbp2_conditionally_block()
706 lu->generation != card->generation) { in sbp2_conditionally_block()
707 lu->blocked = true; in sbp2_conditionally_block()
720 static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu) in sbp2_conditionally_unblock() argument
722 struct sbp2_target *tgt = lu->tgt; in sbp2_conditionally_unblock()
729 if (lu->blocked && lu->generation == card->generation) { in sbp2_conditionally_unblock()
730 lu->blocked = false; in sbp2_conditionally_unblock()
784 static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) in sbp2_set_busy_timeout() argument
786 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_set_busy_timeout()
790 lu->tgt->node_id, lu->generation, device->max_speed, in sbp2_set_busy_timeout()
798 struct sbp2_logical_unit *lu = in sbp2_login() local
800 struct sbp2_target *tgt = lu->tgt; in sbp2_login()
816 if (lu->has_sdev) in sbp2_login()
817 sbp2_send_management_orb(lu, device->node_id, generation, in sbp2_login()
818 SBP2_LOGOUT_REQUEST, lu->login_id, NULL); in sbp2_login()
820 if (sbp2_send_management_orb(lu, node_id, generation, in sbp2_login()
821 SBP2_LOGIN_REQUEST, lu->lun, &response) < 0) { in sbp2_login()
822 if (lu->retries++ < 5) { in sbp2_login()
823 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); in sbp2_login()
826 lu->lun); in sbp2_login()
828 sbp2_unblock(lu->tgt); in sbp2_login()
836 lu->generation = generation; in sbp2_login()
838 lu->command_block_agent_address = in sbp2_login()
841 lu->login_id = be32_to_cpu(response.misc) & 0xffff; in sbp2_login()
844 lu->lun, lu->retries); in sbp2_login()
847 sbp2_set_busy_timeout(lu); in sbp2_login()
849 lu->workfn = sbp2_reconnect; in sbp2_login()
850 sbp2_agent_reset(lu); in sbp2_login()
853 if (lu->has_sdev) { in sbp2_login()
854 sbp2_cancel_orbs(lu); in sbp2_login()
855 sbp2_conditionally_unblock(lu); in sbp2_login()
860 if (lu->tgt->workarounds & SBP2_WORKAROUND_DELAY_INQUIRY) in sbp2_login()
864 sdev = __scsi_add_device(shost, 0, 0, sbp2_lun2int(lu->lun), lu); in sbp2_login()
886 lu->has_sdev = true; in sbp2_login()
897 sbp2_send_management_orb(lu, device->node_id, generation, in sbp2_login()
898 SBP2_LOGOUT_REQUEST, lu->login_id, NULL); in sbp2_login()
903 lu->workfn = sbp2_login; in sbp2_login()
908 struct sbp2_logical_unit *lu = in sbp2_reconnect() local
910 struct sbp2_target *tgt = lu->tgt; in sbp2_reconnect()
922 if (sbp2_send_management_orb(lu, node_id, generation, in sbp2_reconnect()
924 lu->login_id, NULL) < 0) { in sbp2_reconnect()
934 lu->retries++ >= 5) { in sbp2_reconnect()
936 lu->retries = 0; in sbp2_reconnect()
937 lu->workfn = sbp2_login; in sbp2_reconnect()
939 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); in sbp2_reconnect()
947 lu->generation = generation; in sbp2_reconnect()
950 lu->lun, lu->retries); in sbp2_reconnect()
952 sbp2_agent_reset(lu); in sbp2_reconnect()
953 sbp2_cancel_orbs(lu); in sbp2_reconnect()
954 sbp2_conditionally_unblock(lu); in sbp2_reconnect()
959 struct sbp2_logical_unit *lu = container_of(to_delayed_work(work), in sbp2_lu_workfn() local
961 lu->workfn(work); in sbp2_lu_workfn()
966 struct sbp2_logical_unit *lu; in sbp2_add_logical_unit() local
968 lu = kmalloc(sizeof(*lu), GFP_KERNEL); in sbp2_add_logical_unit()
969 if (!lu) in sbp2_add_logical_unit()
972 lu->address_handler.length = 0x100; in sbp2_add_logical_unit()
973 lu->address_handler.address_callback = sbp2_status_write; in sbp2_add_logical_unit()
974 lu->address_handler.callback_data = lu; in sbp2_add_logical_unit()
976 if (fw_core_add_address_handler(&lu->address_handler, in sbp2_add_logical_unit()
978 kfree(lu); in sbp2_add_logical_unit()
982 lu->tgt = tgt; in sbp2_add_logical_unit()
983 lu->lun = lun_entry & 0xffff; in sbp2_add_logical_unit()
984 lu->login_id = INVALID_LOGIN_ID; in sbp2_add_logical_unit()
985 lu->retries = 0; in sbp2_add_logical_unit()
986 lu->has_sdev = false; in sbp2_add_logical_unit()
987 lu->blocked = false; in sbp2_add_logical_unit()
989 INIT_LIST_HEAD(&lu->orb_list); in sbp2_add_logical_unit()
990 lu->workfn = sbp2_login; in sbp2_add_logical_unit()
991 INIT_DELAYED_WORK(&lu->work, sbp2_lu_workfn); in sbp2_add_logical_unit()
993 list_add_tail(&lu->link, &tgt->lu_list); in sbp2_add_logical_unit()
1127 struct sbp2_logical_unit *lu; in sbp2_probe() local
1179 list_for_each_entry(lu, &tgt->lu_list, link) in sbp2_probe()
1180 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); in sbp2_probe()
1196 struct sbp2_logical_unit *lu; in sbp2_update() local
1204 list_for_each_entry(lu, &tgt->lu_list, link) { in sbp2_update()
1205 sbp2_conditionally_block(lu); in sbp2_update()
1206 lu->retries = 0; in sbp2_update()
1207 sbp2_queue_work(lu, 0); in sbp2_update()
1215 struct sbp2_logical_unit *lu, *next; in sbp2_remove() local
1223 list_for_each_entry_safe(lu, next, &tgt->lu_list, link) { in sbp2_remove()
1224 cancel_delayed_work_sync(&lu->work); in sbp2_remove()
1225 sdev = scsi_device_lookup(shost, 0, 0, sbp2_lun2int(lu->lun)); in sbp2_remove()
1230 if (lu->login_id != INVALID_LOGIN_ID) { in sbp2_remove()
1240 sbp2_send_management_orb(lu, node_id, generation, in sbp2_remove()
1242 lu->login_id, NULL); in sbp2_remove()
1244 fw_core_remove_address_handler(&lu->address_handler); in sbp2_remove()
1245 list_del(&lu->link); in sbp2_remove()
1246 kfree(lu); in sbp2_remove()
1340 struct fw_device *device = target_parent_device(base_orb->lu->tgt); in complete_command_orb()
1345 sbp2_agent_reset_no_wait(base_orb->lu); in complete_command_orb()
1371 sbp2_conditionally_block(base_orb->lu); in complete_command_orb()
1383 struct fw_device *device, struct sbp2_logical_unit *lu) in sbp2_map_scatterlist() argument
1401 cpu_to_be32(lu->tgt->address_high); in sbp2_map_scatterlist()
1427 orb->request.data_descriptor.high = cpu_to_be32(lu->tgt->address_high); in sbp2_map_scatterlist()
1445 struct sbp2_logical_unit *lu = cmd->device->hostdata; in sbp2_scsi_queuecommand() local
1446 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_scsi_queuecommand()
1460 COMMAND_ORB_MAX_PAYLOAD(lu->tgt->max_payload) | in sbp2_scsi_queuecommand()
1470 if (scsi_sg_count(cmd) && sbp2_map_scatterlist(orb, device, lu) < 0) in sbp2_scsi_queuecommand()
1484 sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, generation, in sbp2_scsi_queuecommand()
1485 lu->command_block_agent_address + SBP2_ORB_POINTER); in sbp2_scsi_queuecommand()
1494 struct sbp2_logical_unit *lu = sdev->hostdata; in sbp2_scsi_slave_alloc() local
1497 if (!lu) in sbp2_scsi_slave_alloc()
1508 if (lu->tgt->workarounds & SBP2_WORKAROUND_INQUIRY_36) in sbp2_scsi_slave_alloc()
1516 struct sbp2_logical_unit *lu = sdev->hostdata; in sbp2_scsi_slave_configure() local
1527 lu->tgt->workarounds & SBP2_WORKAROUND_MODE_SENSE_8) in sbp2_scsi_slave_configure()
1530 if (lu->tgt->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) in sbp2_scsi_slave_configure()
1533 if (lu->tgt->workarounds & SBP2_WORKAROUND_POWER_CONDITION) in sbp2_scsi_slave_configure()
1536 if (lu->tgt->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS) in sbp2_scsi_slave_configure()
1548 struct sbp2_logical_unit *lu = cmd->device->hostdata; in sbp2_scsi_abort() local
1550 dev_notice(lu_dev(lu), "sbp2_scsi_abort\n"); in sbp2_scsi_abort()
1551 sbp2_agent_reset(lu); in sbp2_scsi_abort()
1552 sbp2_cancel_orbs(lu); in sbp2_scsi_abort()
1568 struct sbp2_logical_unit *lu; in sbp2_sysfs_ieee1394_id_show() local
1573 lu = sdev->hostdata; in sbp2_sysfs_ieee1394_id_show()
1576 (unsigned long long)lu->tgt->guid, in sbp2_sysfs_ieee1394_id_show()
1577 lu->tgt->directory_id, lu->lun); in sbp2_sysfs_ieee1394_id_show()