1 /*
2  * Copyright (c) 2006, 2007, 2008, 2009, 2010 QLogic Corporation.
3  * All rights reserved.
4  * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved.
5  *
6  * This software is available to you under a choice of one of two
7  * licenses.  You may choose to be licensed under the terms of the GNU
8  * General Public License (GPL) Version 2, available from the file
9  * COPYING in the main directory of this source tree, or the
10  * OpenIB.org BSD license below:
11  *
12  *     Redistribution and use in source and binary forms, with or
13  *     without modification, are permitted provided that the following
14  *     conditions are met:
15  *
16  *      - Redistributions of source code must retain the above
17  *        copyright notice, this list of conditions and the following
18  *        disclaimer.
19  *
20  *      - Redistributions in binary form must reproduce the above
21  *        copyright notice, this list of conditions and the following
22  *        disclaimer in the documentation and/or other materials
23  *        provided with the distribution.
24  *
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32  * SOFTWARE.
33  */
34 
35 #include <rdma/ib_pma.h>
36 
37 #define IB_SMP_UNSUP_VERSION    cpu_to_be16(0x0004)
38 #define IB_SMP_UNSUP_METHOD     cpu_to_be16(0x0008)
39 #define IB_SMP_UNSUP_METH_ATTR  cpu_to_be16(0x000C)
40 #define IB_SMP_INVALID_FIELD    cpu_to_be16(0x001C)
41 
42 struct ib_node_info {
43 	u8 base_version;
44 	u8 class_version;
45 	u8 node_type;
46 	u8 num_ports;
47 	__be64 sys_guid;
48 	__be64 node_guid;
49 	__be64 port_guid;
50 	__be16 partition_cap;
51 	__be16 device_id;
52 	__be32 revision;
53 	u8 local_port_num;
54 	u8 vendor_id[3];
55 } __attribute__ ((packed));
56 
57 struct ib_mad_notice_attr {
58 	u8 generic_type;
59 	u8 prod_type_msb;
60 	__be16 prod_type_lsb;
61 	__be16 trap_num;
62 	__be16 issuer_lid;
63 	__be16 toggle_count;
64 
65 	union {
66 		struct {
67 			u8	details[54];
68 		} raw_data;
69 
70 		struct {
71 			__be16	reserved;
72 			__be16	lid;		/* where violation happened */
73 			u8	port_num;	/* where violation happened */
74 		} __attribute__ ((packed)) ntc_129_131;
75 
76 		struct {
77 			__be16	reserved;
78 			__be16	lid;		/* LID where change occurred */
79 			u8	reserved2;
80 			u8	local_changes;	/* low bit - local changes */
81 			__be32	new_cap_mask;	/* new capability mask */
82 			u8	reserved3;
83 			u8	change_flags;	/* low 3 bits only */
84 		} __attribute__ ((packed)) ntc_144;
85 
86 		struct {
87 			__be16	reserved;
88 			__be16	lid;		/* lid where sys guid changed */
89 			__be16	reserved2;
90 			__be64	new_sys_guid;
91 		} __attribute__ ((packed)) ntc_145;
92 
93 		struct {
94 			__be16	reserved;
95 			__be16	lid;
96 			__be16	dr_slid;
97 			u8	method;
98 			u8	reserved2;
99 			__be16	attr_id;
100 			__be32	attr_mod;
101 			__be64	mkey;
102 			u8	reserved3;
103 			u8	dr_trunc_hop;
104 			u8	dr_rtn_path[30];
105 		} __attribute__ ((packed)) ntc_256;
106 
107 		struct {
108 			__be16		reserved;
109 			__be16		lid1;
110 			__be16		lid2;
111 			__be32		key;
112 			__be32		sl_qp1;	/* SL: high 4 bits */
113 			__be32		qp2;	/* high 8 bits reserved */
114 			union ib_gid	gid1;
115 			union ib_gid	gid2;
116 		} __attribute__ ((packed)) ntc_257_258;
117 
118 	} details;
119 };
120 
121 /*
122  * Generic trap/notice types
123  */
124 #define IB_NOTICE_TYPE_FATAL	0x80
125 #define IB_NOTICE_TYPE_URGENT	0x81
126 #define IB_NOTICE_TYPE_SECURITY	0x82
127 #define IB_NOTICE_TYPE_SM	0x83
128 #define IB_NOTICE_TYPE_INFO	0x84
129 
130 /*
131  * Generic trap/notice producers
132  */
133 #define IB_NOTICE_PROD_CA		cpu_to_be16(1)
134 #define IB_NOTICE_PROD_SWITCH		cpu_to_be16(2)
135 #define IB_NOTICE_PROD_ROUTER		cpu_to_be16(3)
136 #define IB_NOTICE_PROD_CLASS_MGR	cpu_to_be16(4)
137 
138 /*
139  * Generic trap/notice numbers
140  */
141 #define IB_NOTICE_TRAP_LLI_THRESH	cpu_to_be16(129)
142 #define IB_NOTICE_TRAP_EBO_THRESH	cpu_to_be16(130)
143 #define IB_NOTICE_TRAP_FLOW_UPDATE	cpu_to_be16(131)
144 #define IB_NOTICE_TRAP_CAP_MASK_CHG	cpu_to_be16(144)
145 #define IB_NOTICE_TRAP_SYS_GUID_CHG	cpu_to_be16(145)
146 #define IB_NOTICE_TRAP_BAD_MKEY		cpu_to_be16(256)
147 #define IB_NOTICE_TRAP_BAD_PKEY		cpu_to_be16(257)
148 #define IB_NOTICE_TRAP_BAD_QKEY		cpu_to_be16(258)
149 
150 /*
151  * Repress trap/notice flags
152  */
153 #define IB_NOTICE_REPRESS_LLI_THRESH	(1 << 0)
154 #define IB_NOTICE_REPRESS_EBO_THRESH	(1 << 1)
155 #define IB_NOTICE_REPRESS_FLOW_UPDATE	(1 << 2)
156 #define IB_NOTICE_REPRESS_CAP_MASK_CHG	(1 << 3)
157 #define IB_NOTICE_REPRESS_SYS_GUID_CHG	(1 << 4)
158 #define IB_NOTICE_REPRESS_BAD_MKEY	(1 << 5)
159 #define IB_NOTICE_REPRESS_BAD_PKEY	(1 << 6)
160 #define IB_NOTICE_REPRESS_BAD_QKEY	(1 << 7)
161 
162 /*
163  * Generic trap/notice other local changes flags (trap 144).
164  */
165 #define IB_NOTICE_TRAP_LSE_CHG		0x04	/* Link Speed Enable changed */
166 #define IB_NOTICE_TRAP_LWE_CHG		0x02	/* Link Width Enable changed */
167 #define IB_NOTICE_TRAP_NODE_DESC_CHG	0x01
168 
169 /*
170  * Generic trap/notice M_Key volation flags in dr_trunc_hop (trap 256).
171  */
172 #define IB_NOTICE_TRAP_DR_NOTICE	0x80
173 #define IB_NOTICE_TRAP_DR_TRUNC		0x40
174 
175 struct ib_vl_weight_elem {
176 	u8      vl;     /* Only low 4 bits, upper 4 bits reserved */
177 	u8      weight;
178 };
179 
180 #define IB_VLARB_LOWPRI_0_31    1
181 #define IB_VLARB_LOWPRI_32_63   2
182 #define IB_VLARB_HIGHPRI_0_31   3
183 #define IB_VLARB_HIGHPRI_32_63  4
184 
185 #define IB_PMA_PORT_COUNTERS_CONG       cpu_to_be16(0xFF00)
186 
187 struct ib_pma_portcounters_cong {
188 	u8 reserved;
189 	u8 reserved1;
190 	__be16 port_check_rate;
191 	__be16 symbol_error_counter;
192 	u8 link_error_recovery_counter;
193 	u8 link_downed_counter;
194 	__be16 port_rcv_errors;
195 	__be16 port_rcv_remphys_errors;
196 	__be16 port_rcv_switch_relay_errors;
197 	__be16 port_xmit_discards;
198 	u8 port_xmit_constraint_errors;
199 	u8 port_rcv_constraint_errors;
200 	u8 reserved2;
201 	u8 link_overrun_errors; /* LocalLink: 7:4, BufferOverrun: 3:0 */
202 	__be16 reserved3;
203 	__be16 vl15_dropped;
204 	__be64 port_xmit_data;
205 	__be64 port_rcv_data;
206 	__be64 port_xmit_packets;
207 	__be64 port_rcv_packets;
208 	__be64 port_xmit_wait;
209 	__be64 port_adr_events;
210 } __attribute__ ((packed));
211 
212 #define IB_PMA_CONG_HW_CONTROL_TIMER            0x00
213 #define IB_PMA_CONG_HW_CONTROL_SAMPLE           0x01
214 
215 #define QIB_XMIT_RATE_UNSUPPORTED               0x0
216 #define QIB_XMIT_RATE_PICO                      0x7
217 /* number of 4nsec cycles equaling 2secs */
218 #define QIB_CONG_TIMER_PSINTERVAL               0x1DCD64EC
219 
220 #define IB_PMA_SEL_CONG_ALL                     0x01
221 #define IB_PMA_SEL_CONG_PORT_DATA               0x02
222 #define IB_PMA_SEL_CONG_XMIT                    0x04
223 #define IB_PMA_SEL_CONG_ROUTING                 0x08
224 
225 /*
226  * The PortSamplesControl.CounterMasks field is an array of 3 bit fields
227  * which specify the N'th counter's capabilities. See ch. 16.1.3.2.
228  * We support 5 counters which only count the mandatory quantities.
229  */
230 #define COUNTER_MASK(q, n) (q << ((9 - n) * 3))
231 #define COUNTER_MASK0_9 \
232 	cpu_to_be32(COUNTER_MASK(1, 0) | \
233 		    COUNTER_MASK(1, 1) | \
234 		    COUNTER_MASK(1, 2) | \
235 		    COUNTER_MASK(1, 3) | \
236 		    COUNTER_MASK(1, 4))
237