Lines Matching refs:req
67 static int read_peer_guid(u64 *guid, const struct sbp_management_request *req) in read_peer_guid() argument
72 ret = sbp_run_transaction(req->card, TCODE_READ_QUADLET_REQUEST, in read_peer_guid()
73 req->node_addr, req->generation, req->speed, in read_peer_guid()
79 ret = sbp_run_transaction(req->card, TCODE_READ_QUADLET_REQUEST, in read_peer_guid()
80 req->node_addr, req->generation, req->speed, in read_peer_guid()
290 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_login() argument
303 LOGIN_ORB_LUN(be32_to_cpu(req->orb.misc)), &ret); in sbp_management_request_login()
306 LOGIN_ORB_LUN(be32_to_cpu(req->orb.misc))); in sbp_management_request_login()
308 req->status.status = cpu_to_be32( in sbp_management_request_login()
314 ret = read_peer_guid(&guid, req); in sbp_management_request_login()
318 req->status.status = cpu_to_be32( in sbp_management_request_login()
356 if (LOGIN_ORB_EXCLUSIVE(be32_to_cpu(req->orb.misc)) && in sbp_management_request_login()
360 req->status.status = cpu_to_be32( in sbp_management_request_login()
373 req->status.status = cpu_to_be32( in sbp_management_request_login()
387 req->status.status = cpu_to_be32( in sbp_management_request_login()
405 req->status.status = cpu_to_be32( in sbp_management_request_login()
412 sess->node_id = req->node_addr; in sbp_management_request_login()
413 sess->card = fw_card_get(req->card); in sbp_management_request_login()
414 sess->generation = req->generation; in sbp_management_request_login()
415 sess->speed = req->speed; in sbp_management_request_login()
423 1 << LOGIN_ORB_RECONNECT(be32_to_cpu(req->orb.misc)), in sbp_management_request_login()
432 req->status.status = cpu_to_be32( in sbp_management_request_login()
440 login->status_fifo_addr = sbp2_pointer_to_addr(&req->orb.status_fifo); in sbp_management_request_login()
441 login->exclusive = LOGIN_ORB_EXCLUSIVE(be32_to_cpu(req->orb.misc)); in sbp_management_request_login()
452 req->status.status = cpu_to_be32( in sbp_management_request_login()
469 req->status.status = cpu_to_be32( in sbp_management_request_login()
476 LOGIN_ORB_RESPONSE_LENGTH(be32_to_cpu(req->orb.length)), in sbp_management_request_login()
487 sbp2_pointer_to_addr(&req->orb.ptr2), response, in sbp_management_request_login()
495 req->status.status = cpu_to_be32( in sbp_management_request_login()
503 req->status.status = cpu_to_be32( in sbp_management_request_login()
509 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_query_logins() argument
515 req->status.status = cpu_to_be32( in sbp_management_request_query_logins()
521 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_reconnect() argument
530 ret = read_peer_guid(&guid, req); in sbp_management_request_reconnect()
534 req->status.status = cpu_to_be32( in sbp_management_request_reconnect()
543 RECONNECT_ORB_LOGIN_ID(be32_to_cpu(req->orb.misc))); in sbp_management_request_reconnect()
548 req->status.status = cpu_to_be32( in sbp_management_request_reconnect()
557 req->status.status = cpu_to_be32( in sbp_management_request_reconnect()
568 login->sess->generation = req->generation; in sbp_management_request_reconnect()
569 login->sess->node_id = req->node_addr; in sbp_management_request_reconnect()
570 login->sess->card = fw_card_get(req->card); in sbp_management_request_reconnect()
571 login->sess->speed = req->speed; in sbp_management_request_reconnect()
574 req->status.status = cpu_to_be32( in sbp_management_request_reconnect()
580 struct sbp_management_agent *agent, struct sbp_management_request *req, in sbp_management_request_logout() argument
588 id = LOGOUT_ORB_LOGIN_ID(be32_to_cpu(req->orb.misc)); in sbp_management_request_logout()
594 req->status.status = cpu_to_be32( in sbp_management_request_logout()
603 if (req->node_addr != login->sess->node_id) { in sbp_management_request_logout()
606 req->status.status = cpu_to_be32( in sbp_management_request_logout()
614 req->status.status = cpu_to_be32( in sbp_management_request_logout()
887 struct sbp_target_request *req = in tgt_agent_process_work() local
891 req->orb_pointer, in tgt_agent_process_work()
892 sbp2_pointer_to_addr(&req->orb.next_orb), in tgt_agent_process_work()
893 sbp2_pointer_to_addr(&req->orb.data_descriptor), in tgt_agent_process_work()
894 be32_to_cpu(req->orb.misc)); in tgt_agent_process_work()
896 if (req->orb_pointer >> 32) in tgt_agent_process_work()
899 switch (ORB_REQUEST_FORMAT(be32_to_cpu(req->orb.misc))) { in tgt_agent_process_work()
901 sbp_handle_command(req); in tgt_agent_process_work()
905 req->status.status |= cpu_to_be32( in tgt_agent_process_work()
912 sbp_send_status(req); in tgt_agent_process_work()
913 sbp_free_request(req); in tgt_agent_process_work()
916 req->status.status |= cpu_to_be32( in tgt_agent_process_work()
923 sbp_send_status(req); in tgt_agent_process_work()
924 sbp_free_request(req); in tgt_agent_process_work()
948 struct sbp_target_request *req; in tgt_agent_fetch_work() local
954 req = kzalloc(sizeof(*req), GFP_KERNEL); in tgt_agent_fetch_work()
955 if (!req) { in tgt_agent_fetch_work()
962 req->login = agent->login; in tgt_agent_fetch_work()
963 req->orb_pointer = next_orb; in tgt_agent_fetch_work()
965 req->status.status = cpu_to_be32(STATUS_BLOCK_ORB_OFFSET_HIGH( in tgt_agent_fetch_work()
966 req->orb_pointer >> 32)); in tgt_agent_fetch_work()
967 req->status.orb_low = cpu_to_be32( in tgt_agent_fetch_work()
968 req->orb_pointer & 0xfffffffc); in tgt_agent_fetch_work()
973 req->orb_pointer, &req->orb, sizeof(req->orb)); in tgt_agent_fetch_work()
976 req->status.status |= cpu_to_be32( in tgt_agent_fetch_work()
989 sbp_send_status(req); in tgt_agent_fetch_work()
990 sbp_free_request(req); in tgt_agent_fetch_work()
995 if (be32_to_cpu(req->orb.next_orb.high) & 0x80000000) { in tgt_agent_fetch_work()
997 req->status.status |= cpu_to_be32(STATUS_BLOCK_SRC( in tgt_agent_fetch_work()
1000 next_orb = sbp2_pointer_to_addr(&req->orb.next_orb); in tgt_agent_fetch_work()
1001 req->status.status |= cpu_to_be32(STATUS_BLOCK_SRC( in tgt_agent_fetch_work()
1006 INIT_WORK(&req->work, tgt_agent_process_work); in tgt_agent_fetch_work()
1007 queue_work(system_unbound_wq, &req->work); in tgt_agent_fetch_work()
1010 sbp_free_request(req); in tgt_agent_fetch_work()
1099 static int sbp_run_request_transaction(struct sbp_target_request *req, in sbp_run_request_transaction() argument
1103 struct sbp_login_descriptor *login = req->login; in sbp_run_request_transaction()
1123 static int sbp_fetch_command(struct sbp_target_request *req) in sbp_fetch_command() argument
1127 cmd_len = scsi_command_size(req->orb.command_block); in sbp_fetch_command()
1129 req->cmd_buf = kmalloc(cmd_len, GFP_KERNEL); in sbp_fetch_command()
1130 if (!req->cmd_buf) in sbp_fetch_command()
1133 memcpy(req->cmd_buf, req->orb.command_block, in sbp_fetch_command()
1134 min_t(int, cmd_len, sizeof(req->orb.command_block))); in sbp_fetch_command()
1136 if (cmd_len > sizeof(req->orb.command_block)) { in sbp_fetch_command()
1138 copy_len = cmd_len - sizeof(req->orb.command_block); in sbp_fetch_command()
1140 ret = sbp_run_request_transaction(req, in sbp_fetch_command()
1142 req->orb_pointer + sizeof(req->orb), in sbp_fetch_command()
1143 req->cmd_buf + sizeof(req->orb.command_block), in sbp_fetch_command()
1152 static int sbp_fetch_page_table(struct sbp_target_request *req) in sbp_fetch_page_table() argument
1157 if (!CMDBLK_ORB_PG_TBL_PRESENT(be32_to_cpu(req->orb.misc))) in sbp_fetch_page_table()
1160 pg_tbl_sz = CMDBLK_ORB_DATA_SIZE(be32_to_cpu(req->orb.misc)) * in sbp_fetch_page_table()
1167 ret = sbp_run_request_transaction(req, TCODE_READ_BLOCK_REQUEST, in sbp_fetch_page_table()
1168 sbp2_pointer_to_addr(&req->orb.data_descriptor), in sbp_fetch_page_table()
1175 req->pg_tbl = pg_tbl; in sbp_fetch_page_table()
1179 static void sbp_calc_data_length_direction(struct sbp_target_request *req, in sbp_calc_data_length_direction() argument
1184 data_size = CMDBLK_ORB_DATA_SIZE(be32_to_cpu(req->orb.misc)); in sbp_calc_data_length_direction()
1185 direction = CMDBLK_ORB_DIRECTION(be32_to_cpu(req->orb.misc)); in sbp_calc_data_length_direction()
1195 if (req->pg_tbl) { in sbp_calc_data_length_direction()
1199 req->pg_tbl[idx].segment_length); in sbp_calc_data_length_direction()
1206 static void sbp_handle_command(struct sbp_target_request *req) in sbp_handle_command() argument
1208 struct sbp_login_descriptor *login = req->login; in sbp_handle_command()
1214 ret = sbp_fetch_command(req); in sbp_handle_command()
1220 ret = sbp_fetch_page_table(req); in sbp_handle_command()
1227 unpacked_lun = req->login->login_lun; in sbp_handle_command()
1228 sbp_calc_data_length_direction(req, &data_length, &data_dir); in sbp_handle_command()
1231 req->orb_pointer, unpacked_lun, data_length, data_dir); in sbp_handle_command()
1234 req->se_cmd.tag = req->orb_pointer; in sbp_handle_command()
1235 if (target_submit_cmd(&req->se_cmd, sess->se_sess, req->cmd_buf, in sbp_handle_command()
1236 req->sense_buf, unpacked_lun, data_length, in sbp_handle_command()
1243 req->status.status |= cpu_to_be32( in sbp_handle_command()
1248 sbp_send_status(req); in sbp_handle_command()
1249 sbp_free_request(req); in sbp_handle_command()
1256 static int sbp_rw_data(struct sbp_target_request *req) in sbp_rw_data() argument
1258 struct sbp_session *sess = req->login->sess; in sbp_rw_data()
1267 if (req->se_cmd.data_direction == DMA_FROM_DEVICE) { in sbp_rw_data()
1275 max_payload = 4 << CMDBLK_ORB_MAX_PAYLOAD(be32_to_cpu(req->orb.misc)); in sbp_rw_data()
1276 speed = CMDBLK_ORB_SPEED(be32_to_cpu(req->orb.misc)); in sbp_rw_data()
1278 pg_size = CMDBLK_ORB_PG_SIZE(be32_to_cpu(req->orb.misc)); in sbp_rw_data()
1290 if (req->pg_tbl) { in sbp_rw_data()
1291 pte = req->pg_tbl; in sbp_rw_data()
1292 num_pte = CMDBLK_ORB_DATA_SIZE(be32_to_cpu(req->orb.misc)); in sbp_rw_data()
1300 offset = sbp2_pointer_to_addr(&req->orb.data_descriptor); in sbp_rw_data()
1301 length = req->se_cmd.data_length; in sbp_rw_data()
1304 sg_miter_start(&iter, req->se_cmd.t_data_sg, req->se_cmd.t_data_nents, in sbp_rw_data()
1346 static int sbp_send_status(struct sbp_target_request *req) in sbp_send_status() argument
1349 struct sbp_login_descriptor *login = req->login; in sbp_send_status()
1351 length = (((be32_to_cpu(req->status.status) >> 24) & 0x07) + 1) * 4; in sbp_send_status()
1353 ret = sbp_run_request_transaction(req, TCODE_WRITE_BLOCK_REQUEST, in sbp_send_status()
1354 login->status_fifo_addr, &req->status, length); in sbp_send_status()
1361 req->orb_pointer); in sbp_send_status()
1366 static void sbp_sense_mangle(struct sbp_target_request *req) in sbp_sense_mangle() argument
1368 struct se_cmd *se_cmd = &req->se_cmd; in sbp_sense_mangle()
1369 u8 *sense = req->sense_buf; in sbp_sense_mangle()
1370 u8 *status = req->status.data; in sbp_sense_mangle()
1390 req->status.status |= cpu_to_be32( in sbp_sense_mangle()
1426 req->status.status |= cpu_to_be32( in sbp_sense_mangle()
1433 static int sbp_send_sense(struct sbp_target_request *req) in sbp_send_sense() argument
1435 struct se_cmd *se_cmd = &req->se_cmd; in sbp_send_sense()
1438 sbp_sense_mangle(req); in sbp_send_sense()
1440 req->status.status |= cpu_to_be32( in sbp_send_sense()
1447 return sbp_send_status(req); in sbp_send_sense()
1450 static void sbp_free_request(struct sbp_target_request *req) in sbp_free_request() argument
1452 kfree(req->pg_tbl); in sbp_free_request()
1453 kfree(req->cmd_buf); in sbp_free_request()
1454 kfree(req); in sbp_free_request()
1461 struct sbp_management_request *req = agent->request; in sbp_mgt_agent_process() local
1466 ret = sbp_run_transaction(req->card, TCODE_READ_BLOCK_REQUEST, in sbp_mgt_agent_process()
1467 req->node_addr, req->generation, req->speed, in sbp_mgt_agent_process()
1468 agent->orb_offset, &req->orb, sizeof(req->orb)); in sbp_mgt_agent_process()
1475 sbp2_pointer_to_addr(&req->orb.ptr1), in sbp_mgt_agent_process()
1476 sbp2_pointer_to_addr(&req->orb.ptr2), in sbp_mgt_agent_process()
1477 be32_to_cpu(req->orb.misc), be32_to_cpu(req->orb.length), in sbp_mgt_agent_process()
1478 sbp2_pointer_to_addr(&req->orb.status_fifo)); in sbp_mgt_agent_process()
1480 if (!ORB_NOTIFY(be32_to_cpu(req->orb.misc)) || in sbp_mgt_agent_process()
1481 ORB_REQUEST_FORMAT(be32_to_cpu(req->orb.misc)) != 0) { in sbp_mgt_agent_process()
1486 switch (MANAGEMENT_ORB_FUNCTION(be32_to_cpu(req->orb.misc))) { 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()
1503 req->status.status = cpu_to_be32( in sbp_mgt_agent_process()
1510 sbp_management_request_logout(agent, req, &status_data_len); in sbp_mgt_agent_process()
1516 req->status.status = cpu_to_be32( in sbp_mgt_agent_process()
1525 req->status.status = cpu_to_be32( in sbp_mgt_agent_process()
1534 req->status.status = cpu_to_be32( in sbp_mgt_agent_process()
1543 req->status.status = cpu_to_be32( in sbp_mgt_agent_process()
1551 MANAGEMENT_ORB_FUNCTION(be32_to_cpu(req->orb.misc))); in sbp_mgt_agent_process()
1553 req->status.status = cpu_to_be32( in sbp_mgt_agent_process()
1560 req->status.status |= cpu_to_be32( in sbp_mgt_agent_process()
1564 req->status.orb_low = cpu_to_be32(agent->orb_offset); in sbp_mgt_agent_process()
1567 ret = sbp_run_transaction(req->card, TCODE_WRITE_BLOCK_REQUEST, in sbp_mgt_agent_process()
1568 req->node_addr, req->generation, req->speed, in sbp_mgt_agent_process()
1569 sbp2_pointer_to_addr(&req->orb.status_fifo), in sbp_mgt_agent_process()
1570 &req->status, 8 + status_data_len); in sbp_mgt_agent_process()
1577 fw_card_put(req->card); in sbp_mgt_agent_process()
1578 kfree(req); in sbp_mgt_agent_process()
1601 struct sbp_management_request *req; in sbp_mgt_agent_rw() local
1615 req = kzalloc(sizeof(*req), GFP_ATOMIC); in sbp_mgt_agent_rw()
1616 if (!req) { in sbp_mgt_agent_rw()
1621 req->card = fw_card_get(card); in sbp_mgt_agent_rw()
1622 req->generation = generation; in sbp_mgt_agent_rw()
1623 req->node_addr = source; in sbp_mgt_agent_rw()
1624 req->speed = fw_get_request_speed(request); in sbp_mgt_agent_rw()
1627 agent->request = req; in sbp_mgt_agent_rw()
1715 struct sbp_target_request *req = container_of(se_cmd, in sbp_release_cmd() local
1718 sbp_free_request(req); in sbp_release_cmd()
1738 struct sbp_target_request *req = container_of(se_cmd, in sbp_write_pending() local
1742 ret = sbp_rw_data(req); in sbp_write_pending()
1744 req->status.status |= cpu_to_be32( in sbp_write_pending()
1751 sbp_send_status(req); in sbp_write_pending()
1776 struct sbp_target_request *req = container_of(se_cmd, in sbp_queue_data_in() local
1780 ret = sbp_rw_data(req); in sbp_queue_data_in()
1782 req->status.status |= cpu_to_be32( in sbp_queue_data_in()
1787 sbp_send_status(req); in sbp_queue_data_in()
1791 return sbp_send_sense(req); in sbp_queue_data_in()
1800 struct sbp_target_request *req = container_of(se_cmd, in sbp_queue_status() local
1803 return sbp_send_sense(req); in sbp_queue_status()
1817 struct sbp_target_request *req = container_of(se_cmd, in sbp_check_stop_free() local
1820 transport_generic_free_cmd(&req->se_cmd, 0); in sbp_check_stop_free()