18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*******************************************************************************
38c2ecf20Sopenharmony_ci * This file contains the iSCSI Virtual Device and Disk Transport
48c2ecf20Sopenharmony_ci * agnostic related functions.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * (c) Copyright 2007-2013 Datera, Inc.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci ******************************************************************************/
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <target/target_core_base.h>
138c2ecf20Sopenharmony_ci#include <target/target_core_fabric.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <target/iscsi/iscsi_target_core.h>
168c2ecf20Sopenharmony_ci#include "iscsi_target_device.h"
178c2ecf20Sopenharmony_ci#include "iscsi_target_tpg.h"
188c2ecf20Sopenharmony_ci#include "iscsi_target_util.h"
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_civoid iscsit_determine_maxcmdsn(struct iscsi_session *sess)
218c2ecf20Sopenharmony_ci{
228c2ecf20Sopenharmony_ci	struct se_node_acl *se_nacl;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	/*
258c2ecf20Sopenharmony_ci	 * This is a discovery session, the single queue slot was already
268c2ecf20Sopenharmony_ci	 * assigned in iscsi_login_zero_tsih().  Since only Logout and
278c2ecf20Sopenharmony_ci	 * Text Opcodes are allowed during discovery we do not have to worry
288c2ecf20Sopenharmony_ci	 * about the HBA's queue depth here.
298c2ecf20Sopenharmony_ci	 */
308c2ecf20Sopenharmony_ci	if (sess->sess_ops->SessionType)
318c2ecf20Sopenharmony_ci		return;
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	se_nacl = sess->se_sess->se_node_acl;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	/*
368c2ecf20Sopenharmony_ci	 * This is a normal session, set the Session's CmdSN window to the
378c2ecf20Sopenharmony_ci	 * struct se_node_acl->queue_depth.  The value in struct se_node_acl->queue_depth
388c2ecf20Sopenharmony_ci	 * has already been validated as a legal value in
398c2ecf20Sopenharmony_ci	 * core_set_queue_depth_for_node().
408c2ecf20Sopenharmony_ci	 */
418c2ecf20Sopenharmony_ci	sess->cmdsn_window = se_nacl->queue_depth;
428c2ecf20Sopenharmony_ci	atomic_add(se_nacl->queue_depth - 1, &sess->max_cmd_sn);
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_civoid iscsit_increment_maxcmdsn(struct iscsi_cmd *cmd, struct iscsi_session *sess)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	u32 max_cmd_sn;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	if (cmd->immediate_cmd || cmd->maxcmdsn_inc)
508c2ecf20Sopenharmony_ci		return;
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	cmd->maxcmdsn_inc = 1;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	max_cmd_sn = atomic_inc_return(&sess->max_cmd_sn);
558c2ecf20Sopenharmony_ci	pr_debug("Updated MaxCmdSN to 0x%08x\n", max_cmd_sn);
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ciEXPORT_SYMBOL(iscsit_increment_maxcmdsn);
58