| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * QLogic iSCSI Offload Driver |
|---|
| 3 | 4 | * Copyright (c) 2016 Cavium Inc. |
|---|
| 4 | | - * |
|---|
| 5 | | - * This software is available under the terms of the GNU General Public License |
|---|
| 6 | | - * (GPL) Version 2, available from the file COPYING in the main directory of |
|---|
| 7 | | - * this source tree. |
|---|
| 8 | 5 | */ |
|---|
| 9 | 6 | |
|---|
| 10 | 7 | #include <linux/blkdev.h> |
|---|
| .. | .. |
|---|
| 76 | 73 | spin_unlock(&qedi_conn->list_lock); |
|---|
| 77 | 74 | |
|---|
| 78 | 75 | cmd->state = RESPONSE_RECEIVED; |
|---|
| 79 | | - qedi_clear_task_idx(qedi, cmd->task_id); |
|---|
| 80 | 76 | __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr, NULL, 0); |
|---|
| 81 | 77 | |
|---|
| 82 | 78 | spin_unlock(&session->back_lock); |
|---|
| .. | .. |
|---|
| 141 | 137 | spin_unlock(&qedi_conn->list_lock); |
|---|
| 142 | 138 | |
|---|
| 143 | 139 | cmd->state = RESPONSE_RECEIVED; |
|---|
| 144 | | - qedi_clear_task_idx(qedi, cmd->task_id); |
|---|
| 145 | 140 | |
|---|
| 146 | 141 | __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr_ptr, |
|---|
| 147 | 142 | qedi_conn->gen_pdu.resp_buf, |
|---|
| .. | .. |
|---|
| 159 | 154 | struct iscsi_conn *conn = qedi_conn->cls_conn->dd_data; |
|---|
| 160 | 155 | struct iscsi_session *session = conn->session; |
|---|
| 161 | 156 | struct iscsi_tm_rsp *resp_hdr_ptr; |
|---|
| 162 | | - struct iscsi_cls_session *cls_sess; |
|---|
| 163 | 157 | int rval = 0; |
|---|
| 164 | 158 | |
|---|
| 165 | 159 | set_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags); |
|---|
| 166 | 160 | resp_hdr_ptr = (struct iscsi_tm_rsp *)qedi_cmd->tmf_resp_buf; |
|---|
| 167 | | - cls_sess = iscsi_conn_to_session(qedi_conn->cls_conn); |
|---|
| 168 | 161 | |
|---|
| 169 | | - iscsi_block_session(session->cls_session); |
|---|
| 170 | 162 | rval = qedi_cleanup_all_io(qedi, qedi_conn, qedi_cmd->task, true); |
|---|
| 171 | | - if (rval) { |
|---|
| 172 | | - qedi_clear_task_idx(qedi, qedi_cmd->task_id); |
|---|
| 173 | | - iscsi_unblock_session(session->cls_session); |
|---|
| 163 | + if (rval) |
|---|
| 174 | 164 | goto exit_tmf_resp; |
|---|
| 175 | | - } |
|---|
| 176 | | - |
|---|
| 177 | | - iscsi_unblock_session(session->cls_session); |
|---|
| 178 | | - qedi_clear_task_idx(qedi, qedi_cmd->task_id); |
|---|
| 179 | 165 | |
|---|
| 180 | 166 | spin_lock(&session->back_lock); |
|---|
| 181 | 167 | __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr_ptr, NULL, 0); |
|---|
| .. | .. |
|---|
| 250 | 236 | goto unblock_sess; |
|---|
| 251 | 237 | } |
|---|
| 252 | 238 | |
|---|
| 253 | | - qedi_clear_task_idx(qedi, qedi_cmd->task_id); |
|---|
| 254 | | - |
|---|
| 255 | 239 | __iscsi_complete_pdu(conn, (struct iscsi_hdr *)resp_hdr_ptr, NULL, 0); |
|---|
| 256 | 240 | kfree(resp_hdr_ptr); |
|---|
| 257 | 241 | |
|---|
| .. | .. |
|---|
| 319 | 303 | "Freeing tid=0x%x for cid=0x%x\n", |
|---|
| 320 | 304 | cmd->task_id, qedi_conn->iscsi_conn_id); |
|---|
| 321 | 305 | cmd->state = RESPONSE_RECEIVED; |
|---|
| 322 | | - qedi_clear_task_idx(qedi, cmd->task_id); |
|---|
| 323 | 306 | } |
|---|
| 324 | 307 | |
|---|
| 325 | 308 | static void qedi_get_rq_bdq_buf(struct qedi_ctx *qedi, |
|---|
| .. | .. |
|---|
| 365 | 348 | struct iscsi_cqe_unsolicited *cqe, |
|---|
| 366 | 349 | int count) |
|---|
| 367 | 350 | { |
|---|
| 368 | | - u16 tmp; |
|---|
| 369 | 351 | u16 idx = 0; |
|---|
| 370 | 352 | struct scsi_bd *pbl; |
|---|
| 371 | 353 | |
|---|
| .. | .. |
|---|
| 394 | 376 | qedi->bdq_prod_idx += count; |
|---|
| 395 | 377 | |
|---|
| 396 | 378 | writew(qedi->bdq_prod_idx, qedi->bdq_primary_prod); |
|---|
| 397 | | - tmp = readw(qedi->bdq_primary_prod); |
|---|
| 379 | + readw(qedi->bdq_primary_prod); |
|---|
| 398 | 380 | |
|---|
| 399 | 381 | writew(qedi->bdq_prod_idx, qedi->bdq_secondary_prod); |
|---|
| 400 | | - tmp = readw(qedi->bdq_secondary_prod); |
|---|
| 382 | + readw(qedi->bdq_secondary_prod); |
|---|
| 401 | 383 | } |
|---|
| 402 | 384 | |
|---|
| 403 | 385 | static void qedi_unsol_pdu_adjust_bdq(struct qedi_ctx *qedi, |
|---|
| .. | .. |
|---|
| 474 | 456 | } |
|---|
| 475 | 457 | |
|---|
| 476 | 458 | spin_unlock(&qedi_conn->list_lock); |
|---|
| 477 | | - qedi_clear_task_idx(qedi, cmd->task_id); |
|---|
| 478 | 459 | } |
|---|
| 479 | 460 | |
|---|
| 480 | 461 | done: |
|---|
| .. | .. |
|---|
| 624 | 605 | goto error; |
|---|
| 625 | 606 | } |
|---|
| 626 | 607 | |
|---|
| 627 | | - if (!sc_cmd->request->special) { |
|---|
| 628 | | - QEDI_WARN(&qedi->dbg_ctx, |
|---|
| 629 | | - "request->special is NULL so request not valid, sc_cmd=%p.\n", |
|---|
| 630 | | - sc_cmd); |
|---|
| 631 | | - goto error; |
|---|
| 632 | | - } |
|---|
| 633 | | - |
|---|
| 634 | 608 | if (!sc_cmd->request->q) { |
|---|
| 635 | 609 | QEDI_WARN(&qedi->dbg_ctx, |
|---|
| 636 | 610 | "request->q is NULL so request is not valid, sc_cmd=%p.\n", |
|---|
| .. | .. |
|---|
| 686 | 660 | if (qedi_io_tracing) |
|---|
| 687 | 661 | qedi_trace_io(qedi, task, cmd->task_id, QEDI_IO_TRACE_RSP); |
|---|
| 688 | 662 | |
|---|
| 689 | | - qedi_clear_task_idx(qedi, cmd->task_id); |
|---|
| 690 | 663 | __iscsi_complete_pdu(conn, (struct iscsi_hdr *)hdr, |
|---|
| 691 | 664 | conn->data, datalen); |
|---|
| 692 | 665 | error: |
|---|
| .. | .. |
|---|
| 743 | 716 | cqe->itid, cmd->task_id); |
|---|
| 744 | 717 | |
|---|
| 745 | 718 | cmd->state = RESPONSE_RECEIVED; |
|---|
| 746 | | - qedi_clear_task_idx(qedi, cmd->task_id); |
|---|
| 747 | 719 | |
|---|
| 748 | 720 | spin_lock_bh(&session->back_lock); |
|---|
| 749 | 721 | __iscsi_put_task(task); |
|---|
| .. | .. |
|---|
| 761 | 733 | itt_t protoitt = 0; |
|---|
| 762 | 734 | int found = 0; |
|---|
| 763 | 735 | struct qedi_cmd *qedi_cmd = NULL; |
|---|
| 764 | | - u32 rtid = 0; |
|---|
| 765 | 736 | u32 iscsi_cid; |
|---|
| 766 | 737 | struct qedi_conn *qedi_conn; |
|---|
| 767 | 738 | struct qedi_cmd *dbg_cmd; |
|---|
| .. | .. |
|---|
| 792 | 763 | found = 1; |
|---|
| 793 | 764 | mtask = qedi_cmd->task; |
|---|
| 794 | 765 | tmf_hdr = (struct iscsi_tm *)mtask->hdr; |
|---|
| 795 | | - rtid = work->rtid; |
|---|
| 796 | 766 | |
|---|
| 797 | 767 | list_del_init(&work->list); |
|---|
| 798 | 768 | kfree(work); |
|---|
| .. | .. |
|---|
| 834 | 804 | if (qedi_cmd->state == CLEANUP_WAIT_FAILED) |
|---|
| 835 | 805 | qedi_cmd->state = CLEANUP_RECV; |
|---|
| 836 | 806 | |
|---|
| 837 | | - qedi_clear_task_idx(qedi_conn->qedi, rtid); |
|---|
| 838 | | - |
|---|
| 839 | 807 | spin_lock(&qedi_conn->list_lock); |
|---|
| 840 | 808 | if (likely(dbg_cmd->io_cmd_in_list)) { |
|---|
| 841 | 809 | dbg_cmd->io_cmd_in_list = false; |
|---|
| .. | .. |
|---|
| 869 | 837 | QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_TID, |
|---|
| 870 | 838 | "Freeing tid=0x%x for cid=0x%x\n", |
|---|
| 871 | 839 | cqe->itid, qedi_conn->iscsi_conn_id); |
|---|
| 872 | | - qedi_clear_task_idx(qedi_conn->qedi, cqe->itid); |
|---|
| 873 | 840 | |
|---|
| 874 | 841 | } else { |
|---|
| 875 | 842 | qedi_get_proto_itt(qedi, cqe->itid, &ptmp_itt); |
|---|
| .. | .. |
|---|
| 1003 | 970 | * others they are two different assembly operations. |
|---|
| 1004 | 971 | */ |
|---|
| 1005 | 972 | wmb(); |
|---|
| 1006 | | - mmiowb(); |
|---|
| 1007 | 973 | QEDI_INFO(&qedi_conn->qedi->dbg_ctx, QEDI_LOG_MP_REQ, |
|---|
| 1008 | 974 | "prod_idx=0x%x, fw_prod_idx=0x%x, cid=0x%x\n", |
|---|
| 1009 | 975 | qedi_conn->ep->sq_prod_idx, qedi_conn->ep->fw_sq_prod_idx, |
|---|
| .. | .. |
|---|
| 1281 | 1247 | rval = wait_event_interruptible_timeout(qedi_conn->wait_queue, |
|---|
| 1282 | 1248 | ((qedi_conn->cmd_cleanup_req == |
|---|
| 1283 | 1249 | qedi_conn->cmd_cleanup_cmpl) || |
|---|
| 1284 | | - qedi_conn->ep), |
|---|
| 1250 | + test_bit(QEDI_IN_RECOVERY, |
|---|
| 1251 | + &qedi->flags)), |
|---|
| 1285 | 1252 | 5 * HZ); |
|---|
| 1286 | 1253 | if (rval) { |
|---|
| 1287 | 1254 | QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_SCSI_TM, |
|---|
| .. | .. |
|---|
| 1306 | 1273 | /* Enable IOs for all other sessions except current.*/ |
|---|
| 1307 | 1274 | if (!wait_event_interruptible_timeout(qedi_conn->wait_queue, |
|---|
| 1308 | 1275 | (qedi_conn->cmd_cleanup_req == |
|---|
| 1309 | | - qedi_conn->cmd_cleanup_cmpl), |
|---|
| 1276 | + qedi_conn->cmd_cleanup_cmpl) || |
|---|
| 1277 | + test_bit(QEDI_IN_RECOVERY, |
|---|
| 1278 | + &qedi->flags), |
|---|
| 1310 | 1279 | 5 * HZ)) { |
|---|
| 1311 | 1280 | iscsi_host_for_each_session(qedi->shost, |
|---|
| 1312 | 1281 | qedi_mark_device_available); |
|---|
| .. | .. |
|---|
| 1386 | 1355 | struct qedi_conn *qedi_conn = qedi_cmd->conn; |
|---|
| 1387 | 1356 | struct qedi_ctx *qedi = qedi_conn->qedi; |
|---|
| 1388 | 1357 | struct iscsi_conn *conn = qedi_conn->cls_conn->dd_data; |
|---|
| 1389 | | - struct iscsi_cls_session *cls_sess; |
|---|
| 1390 | 1358 | struct qedi_work_map *list_work = NULL; |
|---|
| 1391 | 1359 | struct iscsi_task *mtask; |
|---|
| 1392 | 1360 | struct qedi_cmd *cmd; |
|---|
| .. | .. |
|---|
| 1397 | 1365 | |
|---|
| 1398 | 1366 | mtask = qedi_cmd->task; |
|---|
| 1399 | 1367 | tmf_hdr = (struct iscsi_tm *)mtask->hdr; |
|---|
| 1400 | | - cls_sess = iscsi_conn_to_session(qedi_conn->cls_conn); |
|---|
| 1401 | 1368 | set_bit(QEDI_CONN_FW_CLEANUP, &qedi_conn->flags); |
|---|
| 1402 | 1369 | |
|---|
| 1403 | 1370 | ctask = iscsi_itt_to_task(conn, tmf_hdr->rtt); |
|---|