Lines Matching refs:agent

259 	struct sbp_management_agent *agent, struct sbp_management_request *req,  in sbp_management_request_login()  argument
262 struct sbp_tport *tport = agent->tport; in sbp_management_request_login()
478 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_query_logins() argument
490 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_reconnect() argument
493 struct sbp_tport *tport = agent->tport; in sbp_management_request_reconnect()
549 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_logout() argument
552 struct sbp_tport *tport = agent->tport; in sbp_management_request_logout()
669 struct sbp_target_agent *agent) in tgt_agent_rw_agent_state() argument
677 spin_lock_bh(&agent->lock); in tgt_agent_rw_agent_state()
678 state = agent->state; in tgt_agent_rw_agent_state()
679 spin_unlock_bh(&agent->lock); in tgt_agent_rw_agent_state()
695 struct sbp_target_agent *agent) in tgt_agent_rw_agent_reset() argument
700 spin_lock_bh(&agent->lock); in tgt_agent_rw_agent_reset()
701 agent->state = AGENT_STATE_RESET; in tgt_agent_rw_agent_reset()
702 spin_unlock_bh(&agent->lock); in tgt_agent_rw_agent_reset()
711 struct sbp_target_agent *agent) in tgt_agent_rw_orb_pointer() argument
717 spin_lock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
718 if (agent->state != AGENT_STATE_SUSPENDED && in tgt_agent_rw_orb_pointer()
719 agent->state != AGENT_STATE_RESET) { in tgt_agent_rw_orb_pointer()
720 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
724 agent->state = AGENT_STATE_ACTIVE; in tgt_agent_rw_orb_pointer()
725 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
727 agent->orb_pointer = sbp2_pointer_to_addr(ptr); in tgt_agent_rw_orb_pointer()
728 agent->doorbell = false; in tgt_agent_rw_orb_pointer()
731 agent->orb_pointer); in tgt_agent_rw_orb_pointer()
733 queue_work(system_unbound_wq, &agent->work); in tgt_agent_rw_orb_pointer()
739 spin_lock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
740 addr_to_sbp2_pointer(agent->orb_pointer, ptr); in tgt_agent_rw_orb_pointer()
741 spin_unlock_bh(&agent->lock); in tgt_agent_rw_orb_pointer()
750 struct sbp_target_agent *agent) in tgt_agent_rw_doorbell() argument
754 spin_lock_bh(&agent->lock); in tgt_agent_rw_doorbell()
755 if (agent->state != AGENT_STATE_SUSPENDED) { in tgt_agent_rw_doorbell()
756 spin_unlock_bh(&agent->lock); in tgt_agent_rw_doorbell()
760 agent->state = AGENT_STATE_ACTIVE; in tgt_agent_rw_doorbell()
761 spin_unlock_bh(&agent->lock); in tgt_agent_rw_doorbell()
763 agent->doorbell = true; in tgt_agent_rw_doorbell()
767 queue_work(system_unbound_wq, &agent->work); in tgt_agent_rw_doorbell()
780 int tcode, void *data, struct sbp_target_agent *agent) in tgt_agent_rw_unsolicited_status_enable() argument
801 struct sbp_target_agent *agent = callback_data; in tgt_agent_rw() local
802 struct sbp_session *sess = agent->login->sess; in tgt_agent_rw()
824 offset -= agent->handler.offset; in tgt_agent_rw()
828 rcode = tgt_agent_rw_agent_state(card, tcode, data, agent); in tgt_agent_rw()
831 rcode = tgt_agent_rw_agent_reset(card, tcode, data, agent); in tgt_agent_rw()
834 rcode = tgt_agent_rw_orb_pointer(card, tcode, data, agent); in tgt_agent_rw()
837 rcode = tgt_agent_rw_doorbell(card, tcode, data, agent); in tgt_agent_rw()
841 data, agent); in tgt_agent_rw()
899 static inline bool tgt_agent_check_active(struct sbp_target_agent *agent) in tgt_agent_check_active() argument
903 spin_lock_bh(&agent->lock); in tgt_agent_check_active()
904 active = (agent->state == AGENT_STATE_ACTIVE); in tgt_agent_check_active()
905 spin_unlock_bh(&agent->lock); in tgt_agent_check_active()
932 struct sbp_target_agent *agent = in tgt_agent_fetch_work() local
934 struct sbp_session *sess = agent->login->sess; in tgt_agent_fetch_work()
937 bool doorbell = agent->doorbell; in tgt_agent_fetch_work()
938 u64 next_orb = agent->orb_pointer; in tgt_agent_fetch_work()
940 while (next_orb && tgt_agent_check_active(agent)) { in tgt_agent_fetch_work()
943 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
944 agent->state = AGENT_STATE_DEAD; in tgt_agent_fetch_work()
945 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
949 req->login = agent->login; in tgt_agent_fetch_work()
972 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
973 agent->state = AGENT_STATE_DEAD; in tgt_agent_fetch_work()
974 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
991 if (tgt_agent_check_active(agent) && !doorbell) { in tgt_agent_fetch_work()
999 spin_lock_bh(&agent->lock); in tgt_agent_fetch_work()
1000 doorbell = agent->doorbell = false; in tgt_agent_fetch_work()
1004 agent->orb_pointer = next_orb; in tgt_agent_fetch_work()
1006 agent->state = AGENT_STATE_SUSPENDED; in tgt_agent_fetch_work()
1008 spin_unlock_bh(&agent->lock); in tgt_agent_fetch_work()
1015 struct sbp_target_agent *agent; in sbp_target_agent_register() local
1018 agent = kmalloc(sizeof(*agent), GFP_KERNEL); in sbp_target_agent_register()
1019 if (!agent) in sbp_target_agent_register()
1022 spin_lock_init(&agent->lock); in sbp_target_agent_register()
1024 agent->handler.length = 0x20; in sbp_target_agent_register()
1025 agent->handler.address_callback = tgt_agent_rw; in sbp_target_agent_register()
1026 agent->handler.callback_data = agent; in sbp_target_agent_register()
1028 agent->login = login; in sbp_target_agent_register()
1029 agent->state = AGENT_STATE_RESET; in sbp_target_agent_register()
1030 INIT_WORK(&agent->work, tgt_agent_fetch_work); in sbp_target_agent_register()
1031 agent->orb_pointer = 0; in sbp_target_agent_register()
1032 agent->doorbell = false; in sbp_target_agent_register()
1034 ret = fw_core_add_address_handler(&agent->handler, in sbp_target_agent_register()
1037 kfree(agent); in sbp_target_agent_register()
1041 return agent; in sbp_target_agent_register()
1044 static void sbp_target_agent_unregister(struct sbp_target_agent *agent) in sbp_target_agent_unregister() argument
1046 fw_core_remove_address_handler(&agent->handler); in sbp_target_agent_unregister()
1047 cancel_work_sync(&agent->work); in sbp_target_agent_unregister()
1048 kfree(agent); in sbp_target_agent_unregister()
1452 struct sbp_management_agent *agent = in sbp_mgt_agent_process() local
1454 struct sbp_management_request *req = agent->request; in sbp_mgt_agent_process()
1461 agent->orb_offset, &req->orb, sizeof(req->orb)); in sbp_mgt_agent_process()
1481 sbp_management_request_login(agent, req, &status_data_len); in sbp_mgt_agent_process()
1485 sbp_management_request_query_logins(agent, req, in sbp_mgt_agent_process()
1490 sbp_management_request_reconnect(agent, req, &status_data_len); in sbp_mgt_agent_process()
1503 sbp_management_request_logout(agent, req, &status_data_len); in sbp_mgt_agent_process()
1556 STATUS_BLOCK_ORB_OFFSET_HIGH(agent->orb_offset >> 32)); in sbp_mgt_agent_process()
1557 req->status.orb_low = cpu_to_be32(agent->orb_offset); in sbp_mgt_agent_process()
1573 spin_lock_bh(&agent->lock); in sbp_mgt_agent_process()
1574 agent->state = MANAGEMENT_AGENT_STATE_IDLE; in sbp_mgt_agent_process()
1575 spin_unlock_bh(&agent->lock); in sbp_mgt_agent_process()
1583 struct sbp_management_agent *agent = callback_data; in sbp_mgt_agent_rw() local
1587 if (!agent->tport->enable) in sbp_mgt_agent_rw()
1590 if ((offset != agent->handler.offset) || (length != 8)) in sbp_mgt_agent_rw()
1597 spin_lock_bh(&agent->lock); in sbp_mgt_agent_rw()
1598 prev_state = agent->state; in sbp_mgt_agent_rw()
1599 agent->state = MANAGEMENT_AGENT_STATE_BUSY; in sbp_mgt_agent_rw()
1600 spin_unlock_bh(&agent->lock); in sbp_mgt_agent_rw()
1618 agent->orb_offset = sbp2_pointer_to_addr(ptr); in sbp_mgt_agent_rw()
1619 agent->request = req; in sbp_mgt_agent_rw()
1621 queue_work(system_unbound_wq, &agent->work); in sbp_mgt_agent_rw()
1624 addr_to_sbp2_pointer(agent->orb_offset, ptr); in sbp_mgt_agent_rw()
1638 struct sbp_management_agent *agent; in sbp_management_agent_register() local
1640 agent = kmalloc(sizeof(*agent), GFP_KERNEL); in sbp_management_agent_register()
1641 if (!agent) in sbp_management_agent_register()
1644 spin_lock_init(&agent->lock); in sbp_management_agent_register()
1645 agent->tport = tport; in sbp_management_agent_register()
1646 agent->handler.length = 0x08; in sbp_management_agent_register()
1647 agent->handler.address_callback = sbp_mgt_agent_rw; in sbp_management_agent_register()
1648 agent->handler.callback_data = agent; in sbp_management_agent_register()
1649 agent->state = MANAGEMENT_AGENT_STATE_IDLE; in sbp_management_agent_register()
1650 INIT_WORK(&agent->work, sbp_mgt_agent_process); in sbp_management_agent_register()
1651 agent->orb_offset = 0; in sbp_management_agent_register()
1652 agent->request = NULL; in sbp_management_agent_register()
1654 ret = fw_core_add_address_handler(&agent->handler, in sbp_management_agent_register()
1657 kfree(agent); in sbp_management_agent_register()
1661 return agent; in sbp_management_agent_register()
1664 static void sbp_management_agent_unregister(struct sbp_management_agent *agent) in sbp_management_agent_unregister() argument
1666 fw_core_remove_address_handler(&agent->handler); in sbp_management_agent_unregister()
1667 cancel_work_sync(&agent->work); in sbp_management_agent_unregister()
1668 kfree(agent); in sbp_management_agent_unregister()