.. | .. |
---|
| 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); |
---|