162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*******************************************************************************
362306a36Sopenharmony_ci * This file contains the iSCSI Virtual Device and Disk Transport
462306a36Sopenharmony_ci * agnostic related functions.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * (c) Copyright 2007-2013 Datera, Inc.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci ******************************************************************************/
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <target/target_core_base.h>
1362306a36Sopenharmony_ci#include <target/target_core_fabric.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <target/iscsi/iscsi_target_core.h>
1662306a36Sopenharmony_ci#include "iscsi_target_device.h"
1762306a36Sopenharmony_ci#include "iscsi_target_tpg.h"
1862306a36Sopenharmony_ci#include "iscsi_target_util.h"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_civoid iscsit_determine_maxcmdsn(struct iscsit_session *sess)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	struct se_node_acl *se_nacl;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	/*
2562306a36Sopenharmony_ci	 * This is a discovery session, the single queue slot was already
2662306a36Sopenharmony_ci	 * assigned in iscsi_login_zero_tsih().  Since only Logout and
2762306a36Sopenharmony_ci	 * Text Opcodes are allowed during discovery we do not have to worry
2862306a36Sopenharmony_ci	 * about the HBA's queue depth here.
2962306a36Sopenharmony_ci	 */
3062306a36Sopenharmony_ci	if (sess->sess_ops->SessionType)
3162306a36Sopenharmony_ci		return;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	se_nacl = sess->se_sess->se_node_acl;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	/*
3662306a36Sopenharmony_ci	 * This is a normal session, set the Session's CmdSN window to the
3762306a36Sopenharmony_ci	 * struct se_node_acl->queue_depth.  The value in struct se_node_acl->queue_depth
3862306a36Sopenharmony_ci	 * has already been validated as a legal value in
3962306a36Sopenharmony_ci	 * core_set_queue_depth_for_node().
4062306a36Sopenharmony_ci	 */
4162306a36Sopenharmony_ci	sess->cmdsn_window = se_nacl->queue_depth;
4262306a36Sopenharmony_ci	atomic_add(se_nacl->queue_depth - 1, &sess->max_cmd_sn);
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_civoid iscsit_increment_maxcmdsn(struct iscsit_cmd *cmd, struct iscsit_session *sess)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	u32 max_cmd_sn;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	if (cmd->immediate_cmd || cmd->maxcmdsn_inc)
5062306a36Sopenharmony_ci		return;
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	cmd->maxcmdsn_inc = 1;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	max_cmd_sn = atomic_inc_return(&sess->max_cmd_sn);
5562306a36Sopenharmony_ci	pr_debug("Updated MaxCmdSN to 0x%08x\n", max_cmd_sn);
5662306a36Sopenharmony_ci}
5762306a36Sopenharmony_ciEXPORT_SYMBOL(iscsit_increment_maxcmdsn);
58