Lines Matching refs:lu

143 static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay)  in sbp2_queue_work()  argument
145 queue_delayed_work(fw_workqueue, &lu->work, delay); in sbp2_queue_work()
180 static const struct device *lu_dev(const struct sbp2_logical_unit *lu) in lu_dev() argument
182 return &lu->tgt->unit->device; in lu_dev()
262 struct sbp2_logical_unit *lu; member
411 struct sbp2_logical_unit *lu = callback_data; in sbp2_status_write() local
429 dev_notice(lu_dev(lu), in sbp2_status_write()
436 spin_lock_irqsave(&lu->tgt->lock, flags); in sbp2_status_write()
437 list_for_each_entry(iter, &lu->orb_list, link) { in sbp2_status_write()
446 spin_unlock_irqrestore(&lu->tgt->lock, flags); in sbp2_status_write()
452 dev_err(lu_dev(lu), "status write for unknown ORB\n"); in sbp2_status_write()
473 spin_lock_irqsave(&orb->lu->tgt->lock, flags); in complete_transaction()
479 spin_unlock_irqrestore(&orb->lu->tgt->lock, flags); in complete_transaction()
484 spin_unlock_irqrestore(&orb->lu->tgt->lock, flags); in complete_transaction()
490 static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu, in sbp2_send_orb() argument
493 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_send_orb()
500 orb->lu = lu; in sbp2_send_orb()
501 spin_lock_irqsave(&lu->tgt->lock, flags); in sbp2_send_orb()
502 list_add_tail(&orb->link, &lu->orb_list); in sbp2_send_orb()
503 spin_unlock_irqrestore(&lu->tgt->lock, flags); in sbp2_send_orb()
513 static int sbp2_cancel_orbs(struct sbp2_logical_unit *lu) in sbp2_cancel_orbs() argument
515 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_cancel_orbs()
521 spin_lock_irq(&lu->tgt->lock); in sbp2_cancel_orbs()
522 list_splice_init(&lu->orb_list, &list); in sbp2_cancel_orbs()
523 spin_unlock_irq(&lu->tgt->lock); in sbp2_cancel_orbs()
549 static int sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, in sbp2_send_management_orb() argument
553 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_send_management_orb()
583 cpu_to_be32(lu->address_handler.offset >> 32); in sbp2_send_management_orb()
585 cpu_to_be32(lu->address_handler.offset); in sbp2_send_management_orb()
592 timeout = lu->tgt->mgt_orb_timeout; in sbp2_send_management_orb()
606 sbp2_send_orb(&orb->base, lu, node_id, generation, in sbp2_send_management_orb()
607 lu->tgt->management_agent_address); in sbp2_send_management_orb()
612 if (sbp2_cancel_orbs(lu) == 0) { in sbp2_send_management_orb()
613 dev_err(lu_dev(lu), "ORB reply timed out, rcode 0x%02x\n", in sbp2_send_management_orb()
619 dev_err(lu_dev(lu), "management write failed, rcode 0x%02x\n", in sbp2_send_management_orb()
626 dev_err(lu_dev(lu), "error status: %d:%d\n", in sbp2_send_management_orb()
647 static void sbp2_agent_reset(struct sbp2_logical_unit *lu) in sbp2_agent_reset() argument
649 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_agent_reset()
653 lu->tgt->node_id, lu->generation, device->max_speed, in sbp2_agent_reset()
654 lu->command_block_agent_address + SBP2_AGENT_RESET, in sbp2_agent_reset()
664 static void sbp2_agent_reset_no_wait(struct sbp2_logical_unit *lu) in sbp2_agent_reset_no_wait() argument
666 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_agent_reset_no_wait()
675 lu->tgt->node_id, lu->generation, device->max_speed, in sbp2_agent_reset_no_wait()
676 lu->command_block_agent_address + SBP2_AGENT_RESET, in sbp2_agent_reset_no_wait()
697 static void sbp2_conditionally_block(struct sbp2_logical_unit *lu) in sbp2_conditionally_block() argument
699 struct sbp2_target *tgt = lu->tgt; in sbp2_conditionally_block()
706 if (!tgt->dont_block && !lu->blocked && in sbp2_conditionally_block()
707 lu->generation != card->generation) { in sbp2_conditionally_block()
708 lu->blocked = true; in sbp2_conditionally_block()
721 static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu) in sbp2_conditionally_unblock() argument
723 struct sbp2_target *tgt = lu->tgt; in sbp2_conditionally_unblock()
730 if (lu->blocked && lu->generation == card->generation) { in sbp2_conditionally_unblock()
731 lu->blocked = false; in sbp2_conditionally_unblock()
785 static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) in sbp2_set_busy_timeout() argument
787 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_set_busy_timeout()
791 lu->tgt->node_id, lu->generation, device->max_speed, in sbp2_set_busy_timeout()
799 struct sbp2_logical_unit *lu = in sbp2_login() local
801 struct sbp2_target *tgt = lu->tgt; in sbp2_login()
817 if (lu->has_sdev) in sbp2_login()
818 sbp2_send_management_orb(lu, device->node_id, generation, in sbp2_login()
819 SBP2_LOGOUT_REQUEST, lu->login_id, NULL); in sbp2_login()
821 if (sbp2_send_management_orb(lu, node_id, generation, in sbp2_login()
822 SBP2_LOGIN_REQUEST, lu->lun, &response) < 0) { in sbp2_login()
823 if (lu->retries++ < 5) { in sbp2_login()
824 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); in sbp2_login()
827 lu->lun); in sbp2_login()
829 sbp2_unblock(lu->tgt); in sbp2_login()
837 lu->generation = generation; in sbp2_login()
839 lu->command_block_agent_address = in sbp2_login()
842 lu->login_id = be32_to_cpu(response.misc) & 0xffff; in sbp2_login()
845 lu->lun, lu->retries); in sbp2_login()
848 sbp2_set_busy_timeout(lu); in sbp2_login()
850 lu->workfn = sbp2_reconnect; in sbp2_login()
851 sbp2_agent_reset(lu); in sbp2_login()
854 if (lu->has_sdev) { in sbp2_login()
855 sbp2_cancel_orbs(lu); in sbp2_login()
856 sbp2_conditionally_unblock(lu); in sbp2_login()
861 if (lu->tgt->workarounds & SBP2_WORKAROUND_DELAY_INQUIRY) in sbp2_login()
865 sdev = __scsi_add_device(shost, 0, 0, sbp2_lun2int(lu->lun), lu); in sbp2_login()
887 lu->has_sdev = true; in sbp2_login()
898 sbp2_send_management_orb(lu, device->node_id, generation, in sbp2_login()
899 SBP2_LOGOUT_REQUEST, lu->login_id, NULL); in sbp2_login()
904 lu->workfn = sbp2_login; in sbp2_login()
909 struct sbp2_logical_unit *lu = in sbp2_reconnect() local
911 struct sbp2_target *tgt = lu->tgt; in sbp2_reconnect()
923 if (sbp2_send_management_orb(lu, node_id, generation, in sbp2_reconnect()
925 lu->login_id, NULL) < 0) { in sbp2_reconnect()
935 lu->retries++ >= 5) { in sbp2_reconnect()
937 lu->retries = 0; in sbp2_reconnect()
938 lu->workfn = sbp2_login; in sbp2_reconnect()
940 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); in sbp2_reconnect()
948 lu->generation = generation; in sbp2_reconnect()
951 lu->lun, lu->retries); in sbp2_reconnect()
953 sbp2_agent_reset(lu); in sbp2_reconnect()
954 sbp2_cancel_orbs(lu); in sbp2_reconnect()
955 sbp2_conditionally_unblock(lu); in sbp2_reconnect()
960 struct sbp2_logical_unit *lu = container_of(to_delayed_work(work), in sbp2_lu_workfn() local
962 lu->workfn(work); in sbp2_lu_workfn()
967 struct sbp2_logical_unit *lu; in sbp2_add_logical_unit() local
969 lu = kmalloc(sizeof(*lu), GFP_KERNEL); in sbp2_add_logical_unit()
970 if (!lu) in sbp2_add_logical_unit()
973 lu->address_handler.length = 0x100; in sbp2_add_logical_unit()
974 lu->address_handler.address_callback = sbp2_status_write; in sbp2_add_logical_unit()
975 lu->address_handler.callback_data = lu; in sbp2_add_logical_unit()
977 if (fw_core_add_address_handler(&lu->address_handler, in sbp2_add_logical_unit()
979 kfree(lu); in sbp2_add_logical_unit()
983 lu->tgt = tgt; in sbp2_add_logical_unit()
984 lu->lun = lun_entry & 0xffff; in sbp2_add_logical_unit()
985 lu->login_id = INVALID_LOGIN_ID; in sbp2_add_logical_unit()
986 lu->retries = 0; in sbp2_add_logical_unit()
987 lu->has_sdev = false; in sbp2_add_logical_unit()
988 lu->blocked = false; in sbp2_add_logical_unit()
990 INIT_LIST_HEAD(&lu->orb_list); in sbp2_add_logical_unit()
991 lu->workfn = sbp2_login; in sbp2_add_logical_unit()
992 INIT_DELAYED_WORK(&lu->work, sbp2_lu_workfn); in sbp2_add_logical_unit()
994 list_add_tail(&lu->link, &tgt->lu_list); in sbp2_add_logical_unit()
1128 struct sbp2_logical_unit *lu; in sbp2_probe() local
1180 list_for_each_entry(lu, &tgt->lu_list, link) in sbp2_probe()
1181 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); in sbp2_probe()
1197 struct sbp2_logical_unit *lu; in sbp2_update() local
1205 list_for_each_entry(lu, &tgt->lu_list, link) { in sbp2_update()
1206 sbp2_conditionally_block(lu); in sbp2_update()
1207 lu->retries = 0; in sbp2_update()
1208 sbp2_queue_work(lu, 0); in sbp2_update()
1216 struct sbp2_logical_unit *lu, *next; in sbp2_remove() local
1224 list_for_each_entry_safe(lu, next, &tgt->lu_list, link) { in sbp2_remove()
1225 cancel_delayed_work_sync(&lu->work); in sbp2_remove()
1226 sdev = scsi_device_lookup(shost, 0, 0, sbp2_lun2int(lu->lun)); in sbp2_remove()
1231 if (lu->login_id != INVALID_LOGIN_ID) { in sbp2_remove()
1241 sbp2_send_management_orb(lu, node_id, generation, in sbp2_remove()
1243 lu->login_id, NULL); in sbp2_remove()
1245 fw_core_remove_address_handler(&lu->address_handler); in sbp2_remove()
1246 list_del(&lu->link); in sbp2_remove()
1247 kfree(lu); in sbp2_remove()
1341 struct fw_device *device = target_parent_device(base_orb->lu->tgt); in complete_command_orb()
1346 sbp2_agent_reset_no_wait(base_orb->lu); in complete_command_orb()
1372 sbp2_conditionally_block(base_orb->lu); in complete_command_orb()
1384 struct fw_device *device, struct sbp2_logical_unit *lu) in sbp2_map_scatterlist() argument
1402 cpu_to_be32(lu->tgt->address_high); in sbp2_map_scatterlist()
1428 orb->request.data_descriptor.high = cpu_to_be32(lu->tgt->address_high); in sbp2_map_scatterlist()
1446 struct sbp2_logical_unit *lu = cmd->device->hostdata; in sbp2_scsi_queuecommand() local
1447 struct fw_device *device = target_parent_device(lu->tgt); in sbp2_scsi_queuecommand()
1461 COMMAND_ORB_MAX_PAYLOAD(lu->tgt->max_payload) | in sbp2_scsi_queuecommand()
1471 if (scsi_sg_count(cmd) && sbp2_map_scatterlist(orb, device, lu) < 0) in sbp2_scsi_queuecommand()
1485 sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, generation, in sbp2_scsi_queuecommand()
1486 lu->command_block_agent_address + SBP2_ORB_POINTER); in sbp2_scsi_queuecommand()
1495 struct sbp2_logical_unit *lu = sdev->hostdata; in sbp2_scsi_slave_alloc() local
1498 if (!lu) in sbp2_scsi_slave_alloc()
1509 if (lu->tgt->workarounds & SBP2_WORKAROUND_INQUIRY_36) in sbp2_scsi_slave_alloc()
1517 struct sbp2_logical_unit *lu = sdev->hostdata; in sbp2_scsi_slave_configure() local
1531 lu->tgt->workarounds & SBP2_WORKAROUND_MODE_SENSE_8) in sbp2_scsi_slave_configure()
1534 if (lu->tgt->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) in sbp2_scsi_slave_configure()
1537 if (lu->tgt->workarounds & SBP2_WORKAROUND_POWER_CONDITION) in sbp2_scsi_slave_configure()
1540 if (lu->tgt->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS) in sbp2_scsi_slave_configure()
1552 struct sbp2_logical_unit *lu = cmd->device->hostdata; in sbp2_scsi_abort() local
1554 dev_notice(lu_dev(lu), "sbp2_scsi_abort\n"); in sbp2_scsi_abort()
1555 sbp2_agent_reset(lu); in sbp2_scsi_abort()
1556 sbp2_cancel_orbs(lu); in sbp2_scsi_abort()
1572 struct sbp2_logical_unit *lu; in sbp2_sysfs_ieee1394_id_show() local
1577 lu = sdev->hostdata; in sbp2_sysfs_ieee1394_id_show()
1580 (unsigned long long)lu->tgt->guid, in sbp2_sysfs_ieee1394_id_show()
1581 lu->tgt->directory_id, lu->lun); in sbp2_sysfs_ieee1394_id_show()