xref: /OK3568_Linux_fs/kernel/include/uapi/scsi/scsi_netlink.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  SCSI Transport Netlink Interface
4*4882a593Smuzhiyun  *    Used for the posting of outbound SCSI transport events
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *  Copyright (C) 2006   James Smart, Emulex Corporation
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun #ifndef SCSI_NETLINK_H
9*4882a593Smuzhiyun #define SCSI_NETLINK_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/netlink.h>
12*4882a593Smuzhiyun #include <linux/types.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun  * This file intended to be included by both kernel and user space
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /* Single Netlink Message type to send all SCSI Transport messages */
19*4882a593Smuzhiyun #define SCSI_TRANSPORT_MSG		NLMSG_MIN_TYPE + 1
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun /* SCSI Transport Broadcast Groups */
22*4882a593Smuzhiyun 	/* leaving groups 0 and 1 unassigned */
23*4882a593Smuzhiyun #define SCSI_NL_GRP_FC_EVENTS		(1<<2)		/* Group 2 */
24*4882a593Smuzhiyun #define SCSI_NL_GRP_CNT			3
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /* SCSI_TRANSPORT_MSG event message header */
28*4882a593Smuzhiyun struct scsi_nl_hdr {
29*4882a593Smuzhiyun 	__u8 version;
30*4882a593Smuzhiyun 	__u8 transport;
31*4882a593Smuzhiyun 	__u16 magic;
32*4882a593Smuzhiyun 	__u16 msgtype;
33*4882a593Smuzhiyun 	__u16 msglen;
34*4882a593Smuzhiyun } __attribute__((aligned(sizeof(__u64))));
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* scsi_nl_hdr->version value */
37*4882a593Smuzhiyun #define SCSI_NL_VERSION				1
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /* scsi_nl_hdr->magic value */
40*4882a593Smuzhiyun #define SCSI_NL_MAGIC				0xA1B2
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /* scsi_nl_hdr->transport value */
43*4882a593Smuzhiyun #define SCSI_NL_TRANSPORT			0
44*4882a593Smuzhiyun #define SCSI_NL_TRANSPORT_FC			1
45*4882a593Smuzhiyun #define SCSI_NL_MAX_TRANSPORTS			2
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* Transport-based scsi_nl_hdr->msgtype values are defined in each transport */
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /*
50*4882a593Smuzhiyun  * GENERIC SCSI scsi_nl_hdr->msgtype Values
51*4882a593Smuzhiyun  */
52*4882a593Smuzhiyun 	/* kernel -> user */
53*4882a593Smuzhiyun #define SCSI_NL_SHOST_VENDOR			0x0001
54*4882a593Smuzhiyun 	/* user -> kernel */
55*4882a593Smuzhiyun /* SCSI_NL_SHOST_VENDOR msgtype is kernel->user and user->kernel */
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /*
59*4882a593Smuzhiyun  * Message Structures :
60*4882a593Smuzhiyun  */
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun /* macro to round up message lengths to 8byte boundary */
63*4882a593Smuzhiyun #define SCSI_NL_MSGALIGN(len)		(((len) + 7) & ~7)
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /*
67*4882a593Smuzhiyun  * SCSI HOST Vendor Unique messages :
68*4882a593Smuzhiyun  *   SCSI_NL_SHOST_VENDOR
69*4882a593Smuzhiyun  *
70*4882a593Smuzhiyun  * Note: The Vendor Unique message payload will begin directly after
71*4882a593Smuzhiyun  * 	 this structure, with the length of the payload per vmsg_datalen.
72*4882a593Smuzhiyun  *
73*4882a593Smuzhiyun  * Note: When specifying vendor_id, be sure to read the Vendor Type and ID
74*4882a593Smuzhiyun  *   formatting requirements specified below
75*4882a593Smuzhiyun  */
76*4882a593Smuzhiyun struct scsi_nl_host_vendor_msg {
77*4882a593Smuzhiyun 	struct scsi_nl_hdr snlh;		/* must be 1st element ! */
78*4882a593Smuzhiyun 	__u64 vendor_id;
79*4882a593Smuzhiyun 	__u16 host_no;
80*4882a593Smuzhiyun 	__u16 vmsg_datalen;
81*4882a593Smuzhiyun } __attribute__((aligned(sizeof(__u64))));
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /*
85*4882a593Smuzhiyun  * Vendor ID:
86*4882a593Smuzhiyun  *   If transports post vendor-unique events, they must pass a well-known
87*4882a593Smuzhiyun  *   32-bit vendor identifier. This identifier consists of 8 bits indicating
88*4882a593Smuzhiyun  *   the "type" of identifier contained, and 24 bits of id data.
89*4882a593Smuzhiyun  *
90*4882a593Smuzhiyun  *   Identifiers for each type:
91*4882a593Smuzhiyun  *    PCI :  ID data is the 16 bit PCI Registered Vendor ID
92*4882a593Smuzhiyun  */
93*4882a593Smuzhiyun #define SCSI_NL_VID_TYPE_SHIFT		56
94*4882a593Smuzhiyun #define SCSI_NL_VID_TYPE_MASK		((__u64)0xFF << SCSI_NL_VID_TYPE_SHIFT)
95*4882a593Smuzhiyun #define SCSI_NL_VID_TYPE_PCI		((__u64)0x01 << SCSI_NL_VID_TYPE_SHIFT)
96*4882a593Smuzhiyun #define SCSI_NL_VID_ID_MASK		(~ SCSI_NL_VID_TYPE_MASK)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define INIT_SCSI_NL_HDR(hdr, t, mtype, mlen)			\
100*4882a593Smuzhiyun 	{							\
101*4882a593Smuzhiyun 	(hdr)->version = SCSI_NL_VERSION;			\
102*4882a593Smuzhiyun 	(hdr)->transport = t;					\
103*4882a593Smuzhiyun 	(hdr)->magic = SCSI_NL_MAGIC;				\
104*4882a593Smuzhiyun 	(hdr)->msgtype = mtype;					\
105*4882a593Smuzhiyun 	(hdr)->msglen = mlen;					\
106*4882a593Smuzhiyun 	}
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #endif /* SCSI_NETLINK_H */
109*4882a593Smuzhiyun 
110