Lines Matching refs:agent
290 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_login() argument
293 struct sbp_tport *tport = agent->tport; in sbp_management_request_login()
509 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_query_logins() argument
521 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_reconnect() argument
524 struct sbp_tport *tport = agent->tport; in sbp_management_request_reconnect()
580 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_logout() argument
583 struct sbp_tport *tport = agent->tport; in sbp_management_request_logout()
700 struct sbp_target_agent *agent) in tgt_agent_rw_agent_state() argument
708 spin_lock_bh(&agent->lock); in tgt_agent_rw_agent_state()
709 state = agent->state; in tgt_agent_rw_agent_state()
710 spin_unlock_bh(&agent->lock); in tgt_agent_rw_agent_state()
726 struct sbp_target_agent *agent) in tgt_agent_rw_agent_reset() argument
731 spin_lock_bh(&agent->lock); in tgt_agent_rw_agent_reset()
732 agent->state = AGENT_STATE_RESET; in tgt_agent_rw_agent_reset()
733 spin_unlock_bh(&agent->lock); in tgt_agent_rw_agent_reset()
742 struct sbp_target_agent *agent) in tgt_agent_rw_orb_pointer() argument
748 spin_lock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
749 if (agent->state != AGENT_STATE_SUSPENDED && in tgt_agent_rw_orb_pointer()
750 agent->state != AGENT_STATE_RESET) { in tgt_agent_rw_orb_pointer()
751 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
755 agent->state = AGENT_STATE_ACTIVE; in tgt_agent_rw_orb_pointer()
756 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
758 agent->orb_pointer = sbp2_pointer_to_addr(ptr); in tgt_agent_rw_orb_pointer()
759 agent->doorbell = false; in tgt_agent_rw_orb_pointer()
762 agent->orb_pointer); in tgt_agent_rw_orb_pointer()
764 queue_work(system_unbound_wq, &agent->work); in tgt_agent_rw_orb_pointer()
770 spin_lock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
771 addr_to_sbp2_pointer(agent->orb_pointer, ptr); in tgt_agent_rw_orb_pointer()
772 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
781 struct sbp_target_agent *agent) in tgt_agent_rw_doorbell() argument
785 spin_lock_bh(&agent->lock); in tgt_agent_rw_doorbell()
786 if (agent->state != AGENT_STATE_SUSPENDED) { in tgt_agent_rw_doorbell()
787 spin_unlock_bh(&agent->lock); in tgt_agent_rw_doorbell()
791 agent->state = AGENT_STATE_ACTIVE; in tgt_agent_rw_doorbell()
792 spin_unlock_bh(&agent->lock); in tgt_agent_rw_doorbell()
794 agent->doorbell = true; in tgt_agent_rw_doorbell()
798 queue_work(system_unbound_wq, &agent->work); in tgt_agent_rw_doorbell()
811 int tcode, void *data, struct sbp_target_agent *agent) in tgt_agent_rw_unsolicited_status_enable() argument
832 struct sbp_target_agent *agent = callback_data; in tgt_agent_rw() local
833 struct sbp_session *sess = agent->login->sess; in tgt_agent_rw()
855 offset -= agent->handler.offset; in tgt_agent_rw()
859 rcode = tgt_agent_rw_agent_state(card, tcode, data, agent); in tgt_agent_rw()
862 rcode = tgt_agent_rw_agent_reset(card, tcode, data, agent); in tgt_agent_rw()
865 rcode = tgt_agent_rw_orb_pointer(card, tcode, data, agent); in tgt_agent_rw()
868 rcode = tgt_agent_rw_doorbell(card, tcode, data, agent); in tgt_agent_rw()
872 data, agent); in tgt_agent_rw()
932 static inline bool tgt_agent_check_active(struct sbp_target_agent *agent) in tgt_agent_check_active() argument
936 spin_lock_bh(&agent->lock); in tgt_agent_check_active()
937 active = (agent->state == AGENT_STATE_ACTIVE); in tgt_agent_check_active()
938 spin_unlock_bh(&agent->lock); in tgt_agent_check_active()
945 struct sbp_target_agent *agent = in tgt_agent_fetch_work() local
947 struct sbp_session *sess = agent->login->sess; in tgt_agent_fetch_work()
950 bool doorbell = agent->doorbell; in tgt_agent_fetch_work()
951 u64 next_orb = agent->orb_pointer; in tgt_agent_fetch_work()
953 while (next_orb && tgt_agent_check_active(agent)) { in tgt_agent_fetch_work()
956 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
957 agent->state = AGENT_STATE_DEAD; in tgt_agent_fetch_work()
958 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
962 req->login = agent->login; in tgt_agent_fetch_work()
985 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
986 agent->state = AGENT_STATE_DEAD; in tgt_agent_fetch_work()
987 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
1005 if (tgt_agent_check_active(agent) && !doorbell) { in tgt_agent_fetch_work()
1013 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
1014 doorbell = agent->doorbell = false; in tgt_agent_fetch_work()
1018 agent->orb_pointer = next_orb; in tgt_agent_fetch_work()
1020 agent->state = AGENT_STATE_SUSPENDED; in tgt_agent_fetch_work()
1022 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
1029 struct sbp_target_agent *agent; in sbp_target_agent_register() local
1032 agent = kmalloc(sizeof(*agent), GFP_KERNEL); in sbp_target_agent_register()
1033 if (!agent) in sbp_target_agent_register()
1036 spin_lock_init(&agent->lock); in sbp_target_agent_register()
1038 agent->handler.length = 0x20; in sbp_target_agent_register()
1039 agent->handler.address_callback = tgt_agent_rw; in sbp_target_agent_register()
1040 agent->handler.callback_data = agent; in sbp_target_agent_register()
1042 agent->login = login; in sbp_target_agent_register()
1043 agent->state = AGENT_STATE_RESET; in sbp_target_agent_register()
1044 INIT_WORK(&agent->work, tgt_agent_fetch_work); in sbp_target_agent_register()
1045 agent->orb_pointer = 0; in sbp_target_agent_register()
1046 agent->doorbell = false; in sbp_target_agent_register()
1048 ret = fw_core_add_address_handler(&agent->handler, in sbp_target_agent_register()
1051 kfree(agent); in sbp_target_agent_register()
1055 return agent; in sbp_target_agent_register()
1058 static void sbp_target_agent_unregister(struct sbp_target_agent *agent) in sbp_target_agent_unregister() argument
1060 fw_core_remove_address_handler(&agent->handler); in sbp_target_agent_unregister()
1061 cancel_work_sync(&agent->work); in sbp_target_agent_unregister()
1062 kfree(agent); in sbp_target_agent_unregister()
1459 struct sbp_management_agent *agent = in sbp_mgt_agent_process() local
1461 struct sbp_management_request *req = agent->request; in sbp_mgt_agent_process()
1468 agent->orb_offset, &req->orb, sizeof(req->orb)); in sbp_mgt_agent_process()
1488 sbp_management_request_login(agent, req, &status_data_len); in sbp_mgt_agent_process()
1492 sbp_management_request_query_logins(agent, req, in sbp_mgt_agent_process()
1497 sbp_management_request_reconnect(agent, req, &status_data_len); in sbp_mgt_agent_process()
1510 sbp_management_request_logout(agent, req, &status_data_len); in sbp_mgt_agent_process()
1563 STATUS_BLOCK_ORB_OFFSET_HIGH(agent->orb_offset >> 32)); in sbp_mgt_agent_process()
1564 req->status.orb_low = cpu_to_be32(agent->orb_offset); in sbp_mgt_agent_process()
1580 spin_lock_bh(&agent->lock); in sbp_mgt_agent_process()
1581 agent->state = MANAGEMENT_AGENT_STATE_IDLE; in sbp_mgt_agent_process()
1582 spin_unlock_bh(&agent->lock); in sbp_mgt_agent_process()
1590 struct sbp_management_agent *agent = callback_data; in sbp_mgt_agent_rw() local
1594 if (!agent->tport->enable) in sbp_mgt_agent_rw()
1597 if ((offset != agent->handler.offset) || (length != 8)) in sbp_mgt_agent_rw()
1604 spin_lock_bh(&agent->lock); in sbp_mgt_agent_rw()
1605 prev_state = agent->state; in sbp_mgt_agent_rw()
1606 agent->state = MANAGEMENT_AGENT_STATE_BUSY; in sbp_mgt_agent_rw()
1607 spin_unlock_bh(&agent->lock); in sbp_mgt_agent_rw()
1626 agent->orb_offset = sbp2_pointer_to_addr(ptr); in sbp_mgt_agent_rw()
1627 agent->request = req; in sbp_mgt_agent_rw()
1629 queue_work(system_unbound_wq, &agent->work); in sbp_mgt_agent_rw()
1632 addr_to_sbp2_pointer(agent->orb_offset, ptr); in sbp_mgt_agent_rw()
1646 struct sbp_management_agent *agent; in sbp_management_agent_register() local
1648 agent = kmalloc(sizeof(*agent), GFP_KERNEL); in sbp_management_agent_register()
1649 if (!agent) in sbp_management_agent_register()
1652 spin_lock_init(&agent->lock); in sbp_management_agent_register()
1653 agent->tport = tport; in sbp_management_agent_register()
1654 agent->handler.length = 0x08; in sbp_management_agent_register()
1655 agent->handler.address_callback = sbp_mgt_agent_rw; in sbp_management_agent_register()
1656 agent->handler.callback_data = agent; in sbp_management_agent_register()
1657 agent->state = MANAGEMENT_AGENT_STATE_IDLE; in sbp_management_agent_register()
1658 INIT_WORK(&agent->work, sbp_mgt_agent_process); in sbp_management_agent_register()
1659 agent->orb_offset = 0; in sbp_management_agent_register()
1660 agent->request = NULL; in sbp_management_agent_register()
1662 ret = fw_core_add_address_handler(&agent->handler, in sbp_management_agent_register()
1665 kfree(agent); in sbp_management_agent_register()
1669 return agent; in sbp_management_agent_register()
1672 static void sbp_management_agent_unregister(struct sbp_management_agent *agent) in sbp_management_agent_unregister() argument
1674 fw_core_remove_address_handler(&agent->handler); in sbp_management_agent_unregister()
1675 cancel_work_sync(&agent->work); in sbp_management_agent_unregister()
1676 kfree(agent); in sbp_management_agent_unregister()