Lines Matching refs:agent

272 	struct sbp_management_agent *agent, struct sbp_management_request *req,  in sbp_management_request_login()  argument
275 struct sbp_tport *tport = agent->tport; in sbp_management_request_login()
491 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_query_logins() argument
503 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_reconnect() argument
506 struct sbp_tport *tport = agent->tport; in sbp_management_request_reconnect()
562 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_logout() argument
565 struct sbp_tport *tport = agent->tport; in sbp_management_request_logout()
682 struct sbp_target_agent *agent) in tgt_agent_rw_agent_state() argument
690 spin_lock_bh(&agent->lock); in tgt_agent_rw_agent_state()
691 state = agent->state; in tgt_agent_rw_agent_state()
692 spin_unlock_bh(&agent->lock); in tgt_agent_rw_agent_state()
708 struct sbp_target_agent *agent) in tgt_agent_rw_agent_reset() argument
713 spin_lock_bh(&agent->lock); in tgt_agent_rw_agent_reset()
714 agent->state = AGENT_STATE_RESET; in tgt_agent_rw_agent_reset()
715 spin_unlock_bh(&agent->lock); in tgt_agent_rw_agent_reset()
724 struct sbp_target_agent *agent) in tgt_agent_rw_orb_pointer() argument
730 spin_lock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
731 if (agent->state != AGENT_STATE_SUSPENDED && in tgt_agent_rw_orb_pointer()
732 agent->state != AGENT_STATE_RESET) { in tgt_agent_rw_orb_pointer()
733 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
737 agent->state = AGENT_STATE_ACTIVE; in tgt_agent_rw_orb_pointer()
738 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
740 agent->orb_pointer = sbp2_pointer_to_addr(ptr); in tgt_agent_rw_orb_pointer()
741 agent->doorbell = false; in tgt_agent_rw_orb_pointer()
744 agent->orb_pointer); in tgt_agent_rw_orb_pointer()
746 queue_work(system_unbound_wq, &agent->work); in tgt_agent_rw_orb_pointer()
752 spin_lock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
753 addr_to_sbp2_pointer(agent->orb_pointer, ptr); in tgt_agent_rw_orb_pointer()
754 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
763 struct sbp_target_agent *agent) in tgt_agent_rw_doorbell() argument
767 spin_lock_bh(&agent->lock); in tgt_agent_rw_doorbell()
768 if (agent->state != AGENT_STATE_SUSPENDED) { in tgt_agent_rw_doorbell()
769 spin_unlock_bh(&agent->lock); in tgt_agent_rw_doorbell()
773 agent->state = AGENT_STATE_ACTIVE; in tgt_agent_rw_doorbell()
774 spin_unlock_bh(&agent->lock); in tgt_agent_rw_doorbell()
776 agent->doorbell = true; in tgt_agent_rw_doorbell()
780 queue_work(system_unbound_wq, &agent->work); in tgt_agent_rw_doorbell()
793 int tcode, void *data, struct sbp_target_agent *agent) in tgt_agent_rw_unsolicited_status_enable() argument
814 struct sbp_target_agent *agent = callback_data; in tgt_agent_rw() local
815 struct sbp_session *sess = agent->login->sess; in tgt_agent_rw()
837 offset -= agent->handler.offset; in tgt_agent_rw()
841 rcode = tgt_agent_rw_agent_state(card, tcode, data, agent); in tgt_agent_rw()
844 rcode = tgt_agent_rw_agent_reset(card, tcode, data, agent); in tgt_agent_rw()
847 rcode = tgt_agent_rw_orb_pointer(card, tcode, data, agent); in tgt_agent_rw()
850 rcode = tgt_agent_rw_doorbell(card, tcode, data, agent); in tgt_agent_rw()
854 data, agent); in tgt_agent_rw()
912 static inline bool tgt_agent_check_active(struct sbp_target_agent *agent) in tgt_agent_check_active() argument
916 spin_lock_bh(&agent->lock); in tgt_agent_check_active()
917 active = (agent->state == AGENT_STATE_ACTIVE); in tgt_agent_check_active()
918 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()
1004 if (tgt_agent_check_active(agent) && !doorbell) { in tgt_agent_fetch_work()
1012 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
1013 doorbell = agent->doorbell = false; in tgt_agent_fetch_work()
1017 agent->orb_pointer = next_orb; in tgt_agent_fetch_work()
1019 agent->state = AGENT_STATE_SUSPENDED; in tgt_agent_fetch_work()
1021 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
1028 struct sbp_target_agent *agent; in sbp_target_agent_register() local
1031 agent = kmalloc(sizeof(*agent), GFP_KERNEL); in sbp_target_agent_register()
1032 if (!agent) in sbp_target_agent_register()
1035 spin_lock_init(&agent->lock); in sbp_target_agent_register()
1037 agent->handler.length = 0x20; in sbp_target_agent_register()
1038 agent->handler.address_callback = tgt_agent_rw; in sbp_target_agent_register()
1039 agent->handler.callback_data = agent; in sbp_target_agent_register()
1041 agent->login = login; in sbp_target_agent_register()
1042 agent->state = AGENT_STATE_RESET; in sbp_target_agent_register()
1043 INIT_WORK(&agent->work, tgt_agent_fetch_work); in sbp_target_agent_register()
1044 agent->orb_pointer = 0; in sbp_target_agent_register()
1045 agent->doorbell = false; in sbp_target_agent_register()
1047 ret = fw_core_add_address_handler(&agent->handler, in sbp_target_agent_register()
1050 kfree(agent); in sbp_target_agent_register()
1054 return agent; in sbp_target_agent_register()
1057 static void sbp_target_agent_unregister(struct sbp_target_agent *agent) in sbp_target_agent_unregister() argument
1059 fw_core_remove_address_handler(&agent->handler); in sbp_target_agent_unregister()
1060 cancel_work_sync(&agent->work); in sbp_target_agent_unregister()
1061 kfree(agent); in sbp_target_agent_unregister()
1468 struct sbp_management_agent *agent = in sbp_mgt_agent_process() local
1470 struct sbp_management_request *req = agent->request; in sbp_mgt_agent_process()
1477 agent->orb_offset, &req->orb, sizeof(req->orb)); in sbp_mgt_agent_process()
1497 sbp_management_request_login(agent, req, &status_data_len); in sbp_mgt_agent_process()
1501 sbp_management_request_query_logins(agent, req, in sbp_mgt_agent_process()
1506 sbp_management_request_reconnect(agent, req, &status_data_len); in sbp_mgt_agent_process()
1519 sbp_management_request_logout(agent, req, &status_data_len); in sbp_mgt_agent_process()
1572 STATUS_BLOCK_ORB_OFFSET_HIGH(agent->orb_offset >> 32)); in sbp_mgt_agent_process()
1573 req->status.orb_low = cpu_to_be32(agent->orb_offset); in sbp_mgt_agent_process()
1589 spin_lock_bh(&agent->lock); in sbp_mgt_agent_process()
1590 agent->state = MANAGEMENT_AGENT_STATE_IDLE; in sbp_mgt_agent_process()
1591 spin_unlock_bh(&agent->lock); in sbp_mgt_agent_process()
1599 struct sbp_management_agent *agent = callback_data; in sbp_mgt_agent_rw() local
1603 if (!agent->tport->enable) in sbp_mgt_agent_rw()
1606 if ((offset != agent->handler.offset) || (length != 8)) in sbp_mgt_agent_rw()
1613 spin_lock_bh(&agent->lock); in sbp_mgt_agent_rw()
1614 prev_state = agent->state; in sbp_mgt_agent_rw()
1615 agent->state = MANAGEMENT_AGENT_STATE_BUSY; in sbp_mgt_agent_rw()
1616 spin_unlock_bh(&agent->lock); in sbp_mgt_agent_rw()
1634 agent->orb_offset = sbp2_pointer_to_addr(ptr); in sbp_mgt_agent_rw()
1635 agent->request = req; in sbp_mgt_agent_rw()
1637 queue_work(system_unbound_wq, &agent->work); in sbp_mgt_agent_rw()
1640 addr_to_sbp2_pointer(agent->orb_offset, ptr); in sbp_mgt_agent_rw()
1654 struct sbp_management_agent *agent; in sbp_management_agent_register() local
1656 agent = kmalloc(sizeof(*agent), GFP_KERNEL); in sbp_management_agent_register()
1657 if (!agent) in sbp_management_agent_register()
1660 spin_lock_init(&agent->lock); in sbp_management_agent_register()
1661 agent->tport = tport; in sbp_management_agent_register()
1662 agent->handler.length = 0x08; in sbp_management_agent_register()
1663 agent->handler.address_callback = sbp_mgt_agent_rw; in sbp_management_agent_register()
1664 agent->handler.callback_data = agent; in sbp_management_agent_register()
1665 agent->state = MANAGEMENT_AGENT_STATE_IDLE; in sbp_management_agent_register()
1666 INIT_WORK(&agent->work, sbp_mgt_agent_process); in sbp_management_agent_register()
1667 agent->orb_offset = 0; in sbp_management_agent_register()
1668 agent->request = NULL; in sbp_management_agent_register()
1670 ret = fw_core_add_address_handler(&agent->handler, in sbp_management_agent_register()
1673 kfree(agent); in sbp_management_agent_register()
1677 return agent; in sbp_management_agent_register()
1680 static void sbp_management_agent_unregister(struct sbp_management_agent *agent) in sbp_management_agent_unregister() argument
1682 fw_core_remove_address_handler(&agent->handler); in sbp_management_agent_unregister()
1683 cancel_work_sync(&agent->work); in sbp_management_agent_unregister()
1684 kfree(agent); in sbp_management_agent_unregister()