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