[VNIC] Initial checkin of VNIC code. Not yet fully functional.
[mirror/winof/.git] / ulp / inic / kernel / vnic_config.h
1 #ifndef _VNIC_CONFIG_H_\r
2 #define _VNIC_CONFIG_H_\r
3 \r
4 #include "vnic_util.h"\r
5 /* These are hard, compile time limits.\r
6  * Lower runtime overrides may be in effect\r
7  */\r
8 #define INIC_CLASS_SUBCLASS 0x2000066A\r
9 #define INIC_PROTOCOL       0\r
10 #define INIC_PROT_VERSION   1\r
11 \r
12 #define INIC_MAJORVERSION 1\r
13 #define INIC_MINORVERSION 1\r
14 \r
15 #define MAX_ADDRESS_ENTRIES             64   /* max entries to negotiate with remote */\r
16 #define MIN_ADDRESS_ENTRIES             16   /* min entries remote can return to us that we agree with */\r
17 #define MAX_ADDR_ARRAY                  32   /* address array we can handle. for now */\r
18 #define MIN_MTU                         1500 /* Minimum Negotiated payload size */\r
19 #define MAX_MTU                         9500 /*  max Jumbo frame payload size */\r
20 #define ETH_VLAN_HLEN                   18   /* ethernet header with VLAN tag */\r
21 \r
22 #define HOST_RECV_POOL_ENTRIES          512  /* TBD: Abritrary */\r
23 #define MIN_HOST_POOL_SZ                64   /* TBD: Abritrary */\r
24 #define MIN_EIOC_POOL_SZ                64   /* TBD: Abritrary */\r
25 #define MAX_EIOC_POOL_SZ                256  /* TBD: Abritrary */\r
26 \r
27 #define MIN_HOST_KICK_TIMEOUT           10   /* TBD: Arbitrary */\r
28 #define MAX_HOST_KICK_TIMEOUT           100  /* In uSec */\r
29 \r
30 #define MIN_HOST_KICK_ENTRIES           1    /* TBD: Arbitrary */\r
31 #define MAX_HOST_KICK_ENTRIES           128  /* TBD: Arbitrary */\r
32 \r
33 #define MIN_HOST_KICK_BYTES             0\r
34 #define MAX_HOST_KICK_BYTES             5000\r
35 \r
36 #define MIN_HOST_UPDATE_SZ              8    /* TBD: Arbitrary */\r
37 #define MAX_HOST_UPDATE_SZ              32   /* TBD: Arbitrary */\r
38 #define MIN_EIOC_UPDATE_SZ              8    /* TBD: Arbitrary */\r
39 #define MAX_EIOC_UPDATE_SZ              32   /* TBD: Arbitrary */\r
40 \r
41 #define NOTIFY_BUNDLE_SZ                32\r
42 \r
43 #define MAX_PARAM_VALUE                 0x40000000\r
44 \r
45 #define DEFAULT_VIPORTS_PER_NETPATH     1\r
46 #define MAX_VIPORTS_PER_NETPATH         1\r
47 \r
48 #define INIC_USE_RX_CSUM                TRUE\r
49 #define INIC_USE_TX_CSUM                TRUE\r
50 #define DEFAULT_NO_PATH_TIMEOUT         10000 /* TBD: Arbitrary */\r
51 #define DEFAULT_PRI_CON_TIMEOUT         10000 /* TBD: Arbitrary */\r
52 #define DEFAULT_PRI_RECON_TIMEOUT       10000 /* TBD: Arbitrary */\r
53 #define DEFAULT_PRI_SWITCH_TIMEOUT      10000 /* TBD: Arbitrary */\r
54 #define DEFAULT_PREFER_PRIMARY          TRUE\r
55 \r
56 /* timeouts: !! all data defined in milliseconds,\r
57    some later will be converted to microseconds */\r
58 #define VIPORT_STATS_INTERVAL           5000   /* 5 sec */\r
59 #define VIPORT_HEARTBEAT_INTERVAL       2000 /* 2 seconds */\r
60 #define VIPORT_HEARTBEAT_TIMEOUT        64000 /* 64 sec  */\r
61 #define CONTROL_RSP_TIMEOUT             2000  /* 2 sec */\r
62 \r
63 #define _100NS_IN_1MS                                   (10000)\r
64 inline uint64_t\r
65 get_time_stamp_ms( void )\r
66 {\r
67         return( (KeQueryInterruptTime() / _100NS_IN_1MS ) );\r
68 }\r
69 \r
70 /* InfiniBand Connection Parameters */\r
71 #define CONTROL_REQ_RETRY_COUNT         4\r
72 #define RETRY_COUNT                     3\r
73 #define MIN_RNR_TIMER                   22       /* 20 ms */\r
74 #define DEFAULT_PKEY                    0    /* Pkey table index */\r
75 \r
76 /* phys memory size to register with HCA*/\r
77 #define MEM_REG_SIZE    0xFFFFFFFFFFFFFFFF\r
78 \r
79 /* link speed in 100 bits/sec units */\r
80 #define LINK_SPEED_1GBIT_x100BPS        10000000\r
81 #define LINK_SPEED_10GBIT_x100BPS       100000000\r
82     /* VEx does not report it's link speed, so set it 1Gb/s so far */\r
83 #define DEFAULT_LINK_SPEED_x100BPS      LINK_SPEED_1GBIT_x100BPS\r
84 \r
85 #define DEFAULT_PARAM(x,y)      if(x == MAXU32) { \\r
86                                                                 x = y; }\r
87 #define POWER_OF_2(x) if (!IsPowerOf2(x)) { \\r
88                 VNIC_TRACE( VNIC_DBG_WARN, (" %s (%d) must be a power of 2\n",#x,x) ); \\r
89                 x = SetMinPowerOf2(x); \\r
90         }\r
91 #define LESS_THAN(lo, hi) if (lo >= hi) { \\r
92                 VNIC_TRACE( VNIC_DBG_ERROR, (" %s (%d) must be less than %s (%d)\n",#lo,lo,#hi,hi) ); \\r
93                 lo = hi >> 1; \\r
94         }\r
95 #define LESS_THAN_OR_EQUAL(lo, hi) if (lo > hi) { \\r
96                 VNIC_TRACE( VNIC_DBG_WARN, (" %s (%d) cannot be greater than %s (%d)\n",#lo,lo,#hi,hi) ); \\r
97                 lo = hi; \\r
98         }\r
99 #define RANGE_CHECK(x, min, max) if ((x < min) || (x > max)) { \\r
100                 VNIC_TRACE( VNIC_DBG_WARN, (" %s (%d) must be between %d and %d\n",#x,x,min,max) ); \\r
101                 if (x < min)  \\r
102                                         x = min;  \\r
103                                 else          \\r
104                                         x = max;  \\r
105         }\r
106 #define ZERO_RANGE_CHECK(x, min, max) if (x > max) { \\r
107                 VNIC_TRACE( VNIC_DBG_WARN, (" %s (%d) must be between %d and %d\n",#x,x,min,max) ); \\r
108                 x = max; \\r
109         }\r
110 \r
111 #define BOOLEAN_RANGE(x)  ZERO_RANGE_CHECK(x, 0, 1)\r
112 #define U32_ZERO_RANGE(x) ZERO_RANGE_CHECK(x, 0, 0x7FFFFFFF)\r
113 #define U32_RANGE(x)      RANGE_CHECK(x, 1, 0x7FFFFFFF)\r
114 #define U16_ZERO_RANGE(x) ZERO_RANGE_CHECK(x, 0, 0xFFFF)\r
115 #define U16_RANGE(x)      RANGE_CHECK(x, 1, 0xFFFF)\r
116 #define U8_ZERO_RANGE(x)  ZERO_RANGE_CHECK(x, 0, 0xFF)\r
117 #define U8_RANGE(x)       RANGE_CHECK(x, 1, 0xFF)\r
118 \r
119 \r
120 typedef struct {\r
121         uint64_t ioc_guid;\r
122         uint64_t portGuid;\r
123         uint64_t port;\r
124         uint64_t hca;\r
125         uint64_t instance;\r
126         char  ioc_string[65];\r
127         char  ioc_guid_set;\r
128         char  ioc_string_set;\r
129 } PathParam_t;\r
130 \r
131 typedef struct _vnic_globals {\r
132         NDIS_HANDLE             ndis_handle; // ndis wrapper handle\r
133         volatile LONG   dev_reg;     // dev register counter\r
134         volatile LONG   adapters;    // created adapters counter\r
135         KSPIN_LOCK              lock;\r
136         LIST_ENTRY              adapter_list;\r
137         uint8_t                 host_name[IB_NODE_DESCRIPTION_SIZE + 1];\r
138 } vnic_globals_t;\r
139 /*\r
140 struct members:\r
141         lock:\r
142                 take this lock before access to adapter_list\r
143         adapter_list:\r
144                  head of list of virtual adapters initialized by driver\r
145 */\r
146 \r
147 typedef struct IbConfig {\r
148         ib_path_rec_t       pathInfo;\r
149         uint64_t                 sid;\r
150         Inic_ConnectionData_t connData;\r
151         uint32_t                 retryCount;\r
152         uint32_t                 rnrRetryCount;\r
153         uint8_t                  minRnrTimer;\r
154         uint32_t                 numSends;\r
155         uint32_t                 numRecvs;\r
156         uint32_t                 recvScatter; /* 1 */\r
157         uint32_t                 sendGather;  /* 1 or 2 */\r
158         uint32_t                 overrides;\r
159 } IbConfig_t;\r
160 \r
161 typedef struct ControlConfig {\r
162         IbConfig_t ibConfig;\r
163         uint32_t      numRecvs;\r
164         uint8_t       inicInstance;\r
165         uint16_t      maxAddressEntries;\r
166         uint16_t      minAddressEntries;\r
167         uint32_t      rspTimeout;\r
168         uint8_t       reqRetryCount;\r
169         uint32_t      overrides;\r
170 } ControlConfig_t;\r
171 \r
172 typedef struct DataConfig {\r
173         IbConfig_t            ibConfig;\r
174         uint64_t                 pathId;\r
175         uint32_t                 numRecvs;\r
176         uint32_t                 hostRecvPoolEntries;\r
177         Inic_RecvPoolConfig_t hostMin;\r
178         Inic_RecvPoolConfig_t hostMax;\r
179         Inic_RecvPoolConfig_t eiocMin;\r
180         Inic_RecvPoolConfig_t eiocMax;\r
181         uint32_t                 notifyBundle;\r
182         uint32_t                 overrides;\r
183 } DataConfig_t;\r
184 \r
185 typedef struct ViportConfig {\r
186         struct _viport  *pViport;\r
187         ControlConfig_t controlConfig;\r
188         DataConfig_t    dataConfig;\r
189         uint32_t           hca;\r
190         uint32_t           port;\r
191         uint32_t           statsInterval;\r
192         uint32_t           hbInterval; /* heartbeat interval */\r
193         uint32_t           hbTimeout;  /* heartbeat timeout */\r
194         uint64_t           portGuid;\r
195         uint64_t           guid;\r
196         size_t          pathIdx;\r
197         char            ioc_string[65];\r
198 \r
199 #define HB_INTERVAL_OVERRIDE 0x1\r
200 #define GUID_OVERRIDE        0x2\r
201 #define STRING_OVERRIDE      0x4\r
202 #define HCA_OVERRIDE         0x8\r
203 #define PORT_OVERRIDE        0x10\r
204 #define PORTGUID_OVERRIDE    0x20\r
205         uint32_t           overrides;\r
206 } ViportConfig_t;\r
207 \r
208 /*\r
209  * primaryConnectTimeout   - If the secondary connects first, how long do we\r
210  *                         give the primary?\r
211  * primaryReconnectTimeout - Same as above, but used when recovering when\r
212  *                         both paths fail\r
213  * primaryReconnectTimeout - How long do we wait before switching to the\r
214  *                         primary when it comes back?\r
215  */\r
216 #define IFNAMSIZ 65\r
217 typedef struct InicConfig {\r
218         //struct Inic *pInic;\r
219         char        name[IFNAMSIZ];\r
220         uint32_t       noPathTimeout;\r
221         uint32_t       primaryConnectTimeout;\r
222         uint32_t       primaryReconnectTimeout;\r
223         uint32_t       primarySwitchTimeout;\r
224         int         preferPrimary;\r
225         BOOLEAN     useRxCsum;\r
226         BOOLEAN     useTxCsum;\r
227 #define USE_RX_CSUM_OVERRIDE 0x1\r
228 #define USE_TX_CSUM_OVERRIDE 0x2\r
229         uint32_t       overrides;\r
230 } InicConfig_t;\r
231 \r
232 typedef enum {\r
233         INIC_UNINITIALIZED,\r
234         INIC_REGISTERED,\r
235 } InicState_t;\r
236 \r
237 #endif /* _VNIC_CONFIG_H_ */\r
238 \r