Lines Matching refs:agent
293 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_login() argument
296 struct sbp_tport *tport = agent->tport; in sbp_management_request_login()
513 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_query_logins() argument
525 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_reconnect() argument
528 struct sbp_tport *tport = agent->tport; in sbp_management_request_reconnect()
584 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_logout() argument
587 struct sbp_tport *tport = agent->tport; in sbp_management_request_logout()
704 struct sbp_target_agent *agent) in tgt_agent_rw_agent_state() argument
712 spin_lock_bh(&agent->lock); in tgt_agent_rw_agent_state()
713 state = agent->state; in tgt_agent_rw_agent_state()
714 spin_unlock_bh(&agent->lock); in tgt_agent_rw_agent_state()
730 struct sbp_target_agent *agent) in tgt_agent_rw_agent_reset() argument
735 spin_lock_bh(&agent->lock); in tgt_agent_rw_agent_reset()
736 agent->state = AGENT_STATE_RESET; in tgt_agent_rw_agent_reset()
737 spin_unlock_bh(&agent->lock); in tgt_agent_rw_agent_reset()
746 struct sbp_target_agent *agent) in tgt_agent_rw_orb_pointer() argument
752 spin_lock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
753 if (agent->state != AGENT_STATE_SUSPENDED && in tgt_agent_rw_orb_pointer()
754 agent->state != AGENT_STATE_RESET) { in tgt_agent_rw_orb_pointer()
755 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
759 agent->state = AGENT_STATE_ACTIVE; in tgt_agent_rw_orb_pointer()
760 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
762 agent->orb_pointer = sbp2_pointer_to_addr(ptr); in tgt_agent_rw_orb_pointer()
763 agent->doorbell = false; in tgt_agent_rw_orb_pointer()
766 agent->orb_pointer); in tgt_agent_rw_orb_pointer()
768 queue_work(system_unbound_wq, &agent->work); in tgt_agent_rw_orb_pointer()
774 spin_lock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
775 addr_to_sbp2_pointer(agent->orb_pointer, ptr); in tgt_agent_rw_orb_pointer()
776 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
785 struct sbp_target_agent *agent) in tgt_agent_rw_doorbell() argument
789 spin_lock_bh(&agent->lock); in tgt_agent_rw_doorbell()
790 if (agent->state != AGENT_STATE_SUSPENDED) { in tgt_agent_rw_doorbell()
791 spin_unlock_bh(&agent->lock); in tgt_agent_rw_doorbell()
795 agent->state = AGENT_STATE_ACTIVE; in tgt_agent_rw_doorbell()
796 spin_unlock_bh(&agent->lock); in tgt_agent_rw_doorbell()
798 agent->doorbell = true; in tgt_agent_rw_doorbell()
802 queue_work(system_unbound_wq, &agent->work); in tgt_agent_rw_doorbell()
815 int tcode, void *data, struct sbp_target_agent *agent) in tgt_agent_rw_unsolicited_status_enable() argument
836 struct sbp_target_agent *agent = callback_data; in tgt_agent_rw() local
837 struct sbp_session *sess = agent->login->sess; in tgt_agent_rw()
859 offset -= agent->handler.offset; in tgt_agent_rw()
863 rcode = tgt_agent_rw_agent_state(card, tcode, data, agent); in tgt_agent_rw()
866 rcode = tgt_agent_rw_agent_reset(card, tcode, data, agent); in tgt_agent_rw()
869 rcode = tgt_agent_rw_orb_pointer(card, tcode, data, agent); in tgt_agent_rw()
872 rcode = tgt_agent_rw_doorbell(card, tcode, data, agent); in tgt_agent_rw()
876 data, agent); in tgt_agent_rw()
936 static inline bool tgt_agent_check_active(struct sbp_target_agent *agent) in tgt_agent_check_active() argument
940 spin_lock_bh(&agent->lock); in tgt_agent_check_active()
941 active = (agent->state == AGENT_STATE_ACTIVE); in tgt_agent_check_active()
942 spin_unlock_bh(&agent->lock); in tgt_agent_check_active()
949 struct sbp_target_agent *agent = in tgt_agent_fetch_work() local
951 struct sbp_session *sess = agent->login->sess; in tgt_agent_fetch_work()
954 bool doorbell = agent->doorbell; in tgt_agent_fetch_work()
955 u64 next_orb = agent->orb_pointer; in tgt_agent_fetch_work()
957 while (next_orb && tgt_agent_check_active(agent)) { in tgt_agent_fetch_work()
960 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
961 agent->state = AGENT_STATE_DEAD; in tgt_agent_fetch_work()
962 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
966 req->login = agent->login; in tgt_agent_fetch_work()
989 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
990 agent->state = AGENT_STATE_DEAD; in tgt_agent_fetch_work()
991 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
1009 if (tgt_agent_check_active(agent) && !doorbell) { in tgt_agent_fetch_work()
1017 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
1018 doorbell = agent->doorbell = false; in tgt_agent_fetch_work()
1022 agent->orb_pointer = next_orb; in tgt_agent_fetch_work()
1024 agent->state = AGENT_STATE_SUSPENDED; in tgt_agent_fetch_work()
1026 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
1033 struct sbp_target_agent *agent; in sbp_target_agent_register() local
1036 agent = kmalloc(sizeof(*agent), GFP_KERNEL); in sbp_target_agent_register()
1037 if (!agent) in sbp_target_agent_register()
1040 spin_lock_init(&agent->lock); in sbp_target_agent_register()
1042 agent->handler.length = 0x20; in sbp_target_agent_register()
1043 agent->handler.address_callback = tgt_agent_rw; in sbp_target_agent_register()
1044 agent->handler.callback_data = agent; in sbp_target_agent_register()
1046 agent->login = login; in sbp_target_agent_register()
1047 agent->state = AGENT_STATE_RESET; in sbp_target_agent_register()
1048 INIT_WORK(&agent->work, tgt_agent_fetch_work); in sbp_target_agent_register()
1049 agent->orb_pointer = 0; in sbp_target_agent_register()
1050 agent->doorbell = false; in sbp_target_agent_register()
1052 ret = fw_core_add_address_handler(&agent->handler, in sbp_target_agent_register()
1055 kfree(agent); in sbp_target_agent_register()
1059 return agent; in sbp_target_agent_register()
1062 static void sbp_target_agent_unregister(struct sbp_target_agent *agent) in sbp_target_agent_unregister() argument
1064 fw_core_remove_address_handler(&agent->handler); in sbp_target_agent_unregister()
1065 cancel_work_sync(&agent->work); in sbp_target_agent_unregister()
1066 kfree(agent); in sbp_target_agent_unregister()
1461 struct sbp_management_agent *agent = in sbp_mgt_agent_process() local
1463 struct sbp_management_request *req = agent->request; in sbp_mgt_agent_process()
1470 agent->orb_offset, &req->orb, sizeof(req->orb)); in sbp_mgt_agent_process()
1490 sbp_management_request_login(agent, req, &status_data_len); in sbp_mgt_agent_process()
1494 sbp_management_request_query_logins(agent, req, in sbp_mgt_agent_process()
1499 sbp_management_request_reconnect(agent, req, &status_data_len); in sbp_mgt_agent_process()
1512 sbp_management_request_logout(agent, req, &status_data_len); in sbp_mgt_agent_process()
1565 STATUS_BLOCK_ORB_OFFSET_HIGH(agent->orb_offset >> 32)); in sbp_mgt_agent_process()
1566 req->status.orb_low = cpu_to_be32(agent->orb_offset); in sbp_mgt_agent_process()
1582 spin_lock_bh(&agent->lock); in sbp_mgt_agent_process()
1583 agent->state = MANAGEMENT_AGENT_STATE_IDLE; in sbp_mgt_agent_process()
1584 spin_unlock_bh(&agent->lock); in sbp_mgt_agent_process()
1592 struct sbp_management_agent *agent = callback_data; in sbp_mgt_agent_rw() local
1596 if (!agent->tport->enable) in sbp_mgt_agent_rw()
1599 if ((offset != agent->handler.offset) || (length != 8)) in sbp_mgt_agent_rw()
1606 spin_lock_bh(&agent->lock); in sbp_mgt_agent_rw()
1607 prev_state = agent->state; in sbp_mgt_agent_rw()
1608 agent->state = MANAGEMENT_AGENT_STATE_BUSY; in sbp_mgt_agent_rw()
1609 spin_unlock_bh(&agent->lock); in sbp_mgt_agent_rw()
1628 agent->orb_offset = sbp2_pointer_to_addr(ptr); in sbp_mgt_agent_rw()
1629 agent->request = req; in sbp_mgt_agent_rw()
1631 queue_work(system_unbound_wq, &agent->work); in sbp_mgt_agent_rw()
1634 addr_to_sbp2_pointer(agent->orb_offset, ptr); in sbp_mgt_agent_rw()
1648 struct sbp_management_agent *agent; in sbp_management_agent_register() local
1650 agent = kmalloc(sizeof(*agent), GFP_KERNEL); in sbp_management_agent_register()
1651 if (!agent) in sbp_management_agent_register()
1654 spin_lock_init(&agent->lock); in sbp_management_agent_register()
1655 agent->tport = tport; in sbp_management_agent_register()
1656 agent->handler.length = 0x08; in sbp_management_agent_register()
1657 agent->handler.address_callback = sbp_mgt_agent_rw; in sbp_management_agent_register()
1658 agent->handler.callback_data = agent; in sbp_management_agent_register()
1659 agent->state = MANAGEMENT_AGENT_STATE_IDLE; in sbp_management_agent_register()
1660 INIT_WORK(&agent->work, sbp_mgt_agent_process); in sbp_management_agent_register()
1661 agent->orb_offset = 0; in sbp_management_agent_register()
1662 agent->request = NULL; in sbp_management_agent_register()
1664 ret = fw_core_add_address_handler(&agent->handler, in sbp_management_agent_register()
1667 kfree(agent); in sbp_management_agent_register()
1671 return agent; in sbp_management_agent_register()
1674 static void sbp_management_agent_unregister(struct sbp_management_agent *agent) in sbp_management_agent_unregister() argument
1676 fw_core_remove_address_handler(&agent->handler); in sbp_management_agent_unregister()
1677 cancel_work_sync(&agent->work); in sbp_management_agent_unregister()
1678 kfree(agent); in sbp_management_agent_unregister()