162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  iSCSI Transport BSG Interface
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2009   James Smart, Emulex Corporation
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef SCSI_BSG_ISCSI_H
962306a36Sopenharmony_ci#define SCSI_BSG_ISCSI_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/*
1262306a36Sopenharmony_ci * This file intended to be included by both kernel and user space
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <scsi/scsi.h>
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/*
1862306a36Sopenharmony_ci * iSCSI Transport SGIO v4 BSG Message Support
1962306a36Sopenharmony_ci */
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* Default BSG request timeout (in seconds) */
2262306a36Sopenharmony_ci#define ISCSI_DEFAULT_BSG_TIMEOUT      (10 * HZ)
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/*
2662306a36Sopenharmony_ci * Request Message Codes supported by the iSCSI Transport
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* define the class masks for the message codes */
3062306a36Sopenharmony_ci#define ISCSI_BSG_CLS_MASK     0xF0000000      /* find object class */
3162306a36Sopenharmony_ci#define ISCSI_BSG_HST_MASK     0x80000000      /* iscsi host class */
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/* iscsi host Message Codes */
3462306a36Sopenharmony_ci#define ISCSI_BSG_HST_VENDOR           (ISCSI_BSG_HST_MASK | 0x000000FF)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/*
3862306a36Sopenharmony_ci * iSCSI Host Messages
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/* ISCSI_BSG_HST_VENDOR : */
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/* Request:
4462306a36Sopenharmony_ci * Note: When specifying vendor_id, be sure to read the Vendor Type and ID
4562306a36Sopenharmony_ci *   formatting requirements specified in scsi_netlink.h
4662306a36Sopenharmony_ci */
4762306a36Sopenharmony_cistruct iscsi_bsg_host_vendor {
4862306a36Sopenharmony_ci	/*
4962306a36Sopenharmony_ci	 * Identifies the vendor that the message is formatted for. This
5062306a36Sopenharmony_ci	 * should be the recipient of the message.
5162306a36Sopenharmony_ci	 */
5262306a36Sopenharmony_ci	uint64_t vendor_id;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	/* start of vendor command area */
5562306a36Sopenharmony_ci	uint32_t vendor_cmd[];
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/* Response:
5962306a36Sopenharmony_ci */
6062306a36Sopenharmony_cistruct iscsi_bsg_host_vendor_reply {
6162306a36Sopenharmony_ci	/* start of vendor response area */
6262306a36Sopenharmony_ci	uint32_t vendor_rsp[0];
6362306a36Sopenharmony_ci};
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/* request (CDB) structure of the sg_io_v4 */
6762306a36Sopenharmony_cistruct iscsi_bsg_request {
6862306a36Sopenharmony_ci	uint32_t msgcode;
6962306a36Sopenharmony_ci	union {
7062306a36Sopenharmony_ci		struct iscsi_bsg_host_vendor    h_vendor;
7162306a36Sopenharmony_ci	} rqst_data;
7262306a36Sopenharmony_ci} __attribute__((packed));
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci/* response (request sense data) structure of the sg_io_v4 */
7662306a36Sopenharmony_cistruct iscsi_bsg_reply {
7762306a36Sopenharmony_ci	/*
7862306a36Sopenharmony_ci	 * The completion result. Result exists in two forms:
7962306a36Sopenharmony_ci	 * if negative, it is an -Exxx system errno value. There will
8062306a36Sopenharmony_ci	 * be no further reply information supplied.
8162306a36Sopenharmony_ci	 * else, it's the 4-byte scsi error result, with driver, host,
8262306a36Sopenharmony_ci	 * msg and status fields. The per-msgcode reply structure
8362306a36Sopenharmony_ci	 * will contain valid data.
8462306a36Sopenharmony_ci	 */
8562306a36Sopenharmony_ci	uint32_t result;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	/* If there was reply_payload, how much was received ? */
8862306a36Sopenharmony_ci	uint32_t reply_payload_rcv_len;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	union {
9162306a36Sopenharmony_ci		struct iscsi_bsg_host_vendor_reply      vendor_reply;
9262306a36Sopenharmony_ci	} reply_data;
9362306a36Sopenharmony_ci};
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci#endif /* SCSI_BSG_ISCSI_H */
97