162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  SCSI Transport Netlink Interface
462306a36Sopenharmony_ci *    Used for the posting of outbound SCSI transport events
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci *  Copyright (C) 2006   James Smart, Emulex Corporation
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef SCSI_NETLINK_H
962306a36Sopenharmony_ci#define SCSI_NETLINK_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/netlink.h>
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/*
1562306a36Sopenharmony_ci * This file intended to be included by both kernel and user space
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* Single Netlink Message type to send all SCSI Transport messages */
1962306a36Sopenharmony_ci#define SCSI_TRANSPORT_MSG		NLMSG_MIN_TYPE + 1
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/* SCSI Transport Broadcast Groups */
2262306a36Sopenharmony_ci	/* leaving groups 0 and 1 unassigned */
2362306a36Sopenharmony_ci#define SCSI_NL_GRP_FC_EVENTS		(1<<2)		/* Group 2 */
2462306a36Sopenharmony_ci#define SCSI_NL_GRP_CNT			3
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/* SCSI_TRANSPORT_MSG event message header */
2862306a36Sopenharmony_cistruct scsi_nl_hdr {
2962306a36Sopenharmony_ci	__u8 version;
3062306a36Sopenharmony_ci	__u8 transport;
3162306a36Sopenharmony_ci	__u16 magic;
3262306a36Sopenharmony_ci	__u16 msgtype;
3362306a36Sopenharmony_ci	__u16 msglen;
3462306a36Sopenharmony_ci} __attribute__((aligned(sizeof(__u64))));
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* scsi_nl_hdr->version value */
3762306a36Sopenharmony_ci#define SCSI_NL_VERSION				1
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/* scsi_nl_hdr->magic value */
4062306a36Sopenharmony_ci#define SCSI_NL_MAGIC				0xA1B2
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* scsi_nl_hdr->transport value */
4362306a36Sopenharmony_ci#define SCSI_NL_TRANSPORT			0
4462306a36Sopenharmony_ci#define SCSI_NL_TRANSPORT_FC			1
4562306a36Sopenharmony_ci#define SCSI_NL_MAX_TRANSPORTS			2
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/* Transport-based scsi_nl_hdr->msgtype values are defined in each transport */
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/*
5062306a36Sopenharmony_ci * GENERIC SCSI scsi_nl_hdr->msgtype Values
5162306a36Sopenharmony_ci */
5262306a36Sopenharmony_ci	/* kernel -> user */
5362306a36Sopenharmony_ci#define SCSI_NL_SHOST_VENDOR			0x0001
5462306a36Sopenharmony_ci	/* user -> kernel */
5562306a36Sopenharmony_ci/* SCSI_NL_SHOST_VENDOR msgtype is kernel->user and user->kernel */
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/*
5962306a36Sopenharmony_ci * Message Structures :
6062306a36Sopenharmony_ci */
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* macro to round up message lengths to 8byte boundary */
6362306a36Sopenharmony_ci#define SCSI_NL_MSGALIGN(len)		(((len) + 7) & ~7)
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci/*
6762306a36Sopenharmony_ci * SCSI HOST Vendor Unique messages :
6862306a36Sopenharmony_ci *   SCSI_NL_SHOST_VENDOR
6962306a36Sopenharmony_ci *
7062306a36Sopenharmony_ci * Note: The Vendor Unique message payload will begin directly after
7162306a36Sopenharmony_ci * 	 this structure, with the length of the payload per vmsg_datalen.
7262306a36Sopenharmony_ci *
7362306a36Sopenharmony_ci * Note: When specifying vendor_id, be sure to read the Vendor Type and ID
7462306a36Sopenharmony_ci *   formatting requirements specified below
7562306a36Sopenharmony_ci */
7662306a36Sopenharmony_cistruct scsi_nl_host_vendor_msg {
7762306a36Sopenharmony_ci	struct scsi_nl_hdr snlh;		/* must be 1st element ! */
7862306a36Sopenharmony_ci	__u64 vendor_id;
7962306a36Sopenharmony_ci	__u16 host_no;
8062306a36Sopenharmony_ci	__u16 vmsg_datalen;
8162306a36Sopenharmony_ci} __attribute__((aligned(sizeof(__u64))));
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/*
8562306a36Sopenharmony_ci * Vendor ID:
8662306a36Sopenharmony_ci *   If transports post vendor-unique events, they must pass a well-known
8762306a36Sopenharmony_ci *   32-bit vendor identifier. This identifier consists of 8 bits indicating
8862306a36Sopenharmony_ci *   the "type" of identifier contained, and 24 bits of id data.
8962306a36Sopenharmony_ci *
9062306a36Sopenharmony_ci *   Identifiers for each type:
9162306a36Sopenharmony_ci *    PCI :  ID data is the 16 bit PCI Registered Vendor ID
9262306a36Sopenharmony_ci */
9362306a36Sopenharmony_ci#define SCSI_NL_VID_TYPE_SHIFT		56
9462306a36Sopenharmony_ci#define SCSI_NL_VID_TYPE_MASK		((__u64)0xFF << SCSI_NL_VID_TYPE_SHIFT)
9562306a36Sopenharmony_ci#define SCSI_NL_VID_TYPE_PCI		((__u64)0x01 << SCSI_NL_VID_TYPE_SHIFT)
9662306a36Sopenharmony_ci#define SCSI_NL_VID_ID_MASK		(~ SCSI_NL_VID_TYPE_MASK)
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci#define INIT_SCSI_NL_HDR(hdr, t, mtype, mlen)			\
10062306a36Sopenharmony_ci	{							\
10162306a36Sopenharmony_ci	(hdr)->version = SCSI_NL_VERSION;			\
10262306a36Sopenharmony_ci	(hdr)->transport = t;					\
10362306a36Sopenharmony_ci	(hdr)->magic = SCSI_NL_MAGIC;				\
10462306a36Sopenharmony_ci	(hdr)->msgtype = mtype;					\
10562306a36Sopenharmony_ci	(hdr)->msglen = mlen;					\
10662306a36Sopenharmony_ci	}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#endif /* SCSI_NETLINK_H */
10962306a36Sopenharmony_ci
110