ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / drivers / s390 / net / qeth_mpc.h
1 /*
2  * linux/drivers/s390/net/qeth_mpc.h
3  *
4  * Linux on zSeries OSA Express and HiperSockets support
5  *
6  * Copyright 2000,2003 IBM Corporation
7  * Author(s): Utz Bacher <utz.bacher@de.ibm.com>
8  *            Thomas Spatzier <tspat@de.ibm.com>
9  *            Frank Pavlic <pavlic@de.ibm.com>
10  *
11  */
12 #ifndef __QETH_MPC_H__
13 #define __QETH_MPC_H__
14
15 #include <asm/qeth.h>
16
17 #define VERSION_QETH_MPC_H "$Revision: 1.27 $"
18
19 #define IPA_PDU_HEADER_SIZE     0x40
20 #define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e)
21 #define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26)
22 #define QETH_IPA_PDU_LEN_PDU2(buffer) (buffer+0x2a)
23 #define QETH_IPA_PDU_LEN_PDU3(buffer) (buffer+0x3a)
24
25 extern unsigned char IPA_PDU_HEADER[];
26 #define QETH_IPA_CMD_DEST_ADDR(buffer) (buffer+0x2c)
27
28 #define IPA_CMD_LENGTH  (IPA_PDU_HEADER_SIZE + sizeof(struct qeth_ipa_cmd))
29
30 #define QETH_SEQ_NO_LENGTH      4
31 #define QETH_MPC_TOKEN_LENGTH   4
32 #define QETH_MCL_LENGTH         4
33 #define OSA_ADDR_LEN            6
34
35 #define QETH_TIMEOUT            (10 * HZ)
36 #define QETH_IDX_COMMAND_SEQNO  -1
37 #define SR_INFO_LEN             16
38
39 #define QETH_CLEAR_CHANNEL_PARM -10
40 #define QETH_HALT_CHANNEL_PARM  -11
41
42 /*****************************************************************************/
43 /* IP Assist related definitions                                             */
44 /*****************************************************************************/
45 #define IPA_CMD_INITIATOR_HOST  0x00
46 #define IPA_CMD_INITIATOR_HYDRA 0x01
47 #define IPA_CMD_PRIM_VERSION_NO 0x01
48
49 enum qeth_card_types {
50         QETH_CARD_TYPE_UNKNOWN = 0,
51         QETH_CARD_TYPE_OSAE    = 10,
52         QETH_CARD_TYPE_IQD     = 1234,
53 };
54
55 #define QETH_MPC_DIFINFO_LEN_INDICATES_LINK_TYPE 0x18
56 /* only the first two bytes are looked at in qeth_get_cardname_short */
57 enum qeth_link_types {
58         QETH_LINK_TYPE_FAST_ETH     = 0x01,
59         QETH_LINK_TYPE_HSTR         = 0x02,
60         QETH_LINK_TYPE_GBIT_ETH     = 0x03,
61         QETH_LINK_TYPE_10GBIT_ETH   = 0x10,
62         QETH_LINK_TYPE_LANE_ETH100  = 0x81,
63         QETH_LINK_TYPE_LANE_TR      = 0x82,
64         QETH_LINK_TYPE_LANE_ETH1000 = 0x83,
65         QETH_LINK_TYPE_LANE         = 0x88,
66         QETH_LINK_TYPE_ATM_NATIVE   = 0x90,
67 };
68
69 enum qeth_tr_macaddr_modes {
70         QETH_TR_MACADDR_NONCANONICAL = 0,
71         QETH_TR_MACADDR_CANONICAL    = 1,
72 };
73
74 enum qeth_tr_broadcast_modes {
75         QETH_TR_BROADCAST_ALLRINGS = 0,
76         QETH_TR_BROADCAST_LOCAL    = 1,
77 };
78
79 /* these values match CHECKSUM_* in include/linux/skbuff.h */
80 enum qeth_checksum_types {
81         SW_CHECKSUMMING = 0, /* TODO: set to bit flag used in IPA Command */
82         HW_CHECKSUMMING = 1,
83         NO_CHECKSUMMING = 2,
84 };
85 #define QETH_CHECKSUM_DEFAULT SW_CHECKSUMMING
86
87 /*
88  * Routing stuff
89  */
90 #define RESET_ROUTING_FLAG 0x10 /* indicate that routing type shall be set */
91 enum qeth_routing_types {
92         NO_ROUTER           = 0, /* TODO: set to bit flag used in IPA Command */
93         PRIMARY_ROUTER      = 1,
94         SECONDARY_ROUTER    = 2,
95         MULTICAST_ROUTER    = 3,
96         PRIMARY_CONNECTOR   = 4,
97         SECONDARY_CONNECTOR = 5,
98 };
99
100
101 /* IPA Commands */
102 enum qeth_ipa_cmds {
103         IPA_CMD_STARTLAN              = 0x01,
104         IPA_CMD_STOPLAN               = 0x02,
105         IPA_CMD_SETIP                 = 0xb1,
106         IPA_CMD_DELIP                 = 0xb7,
107         IPA_CMD_QIPASSIST             = 0xb2,
108         IPA_CMD_SETASSPARMS           = 0xb3,
109         IPA_CMD_SETIPM                = 0xb4,
110         IPA_CMD_DELIPM                = 0xb5,
111         IPA_CMD_SETRTG                = 0xb6,
112         IPA_CMD_SETADAPTERPARMS       = 0xb8,
113         IPA_CMD_IPFRAME               = 0xb9,
114         IPA_CMD_ADD_ADDR_ENTRY        = 0xc1,
115         IPA_CMD_DELETE_ADDR_ENTRY     = 0xc2,
116         IPA_CMD_CREATE_ADDR           = 0xc3,
117         IPA_CMD_DESTROY_ADDR          = 0xc4,
118         IPA_CMD_REGISTER_LOCAL_ADDR   = 0xd1,
119         IPA_CMD_UNREGISTER_LOCAL_ADDR = 0xd2,
120 };
121
122 enum qeth_ip_ass_cmds {
123         IPA_CMD_ASS_START       = 0x0001,
124         IPA_CMD_ASS_STOP        = 0x0002,
125         IPA_CMD_ASS_CONFIGURE   = 0x0003,
126         IPA_CMD_ASS_ENABLE      = 0x0004,
127 };
128
129 enum qeth_arp_process_subcmds {
130         IPA_CMD_ASS_ARP_SET_NO_ENTRIES  = 0x0003,
131         IPA_CMD_ASS_ARP_QUERY_CACHE     = 0x0004,
132         IPA_CMD_ASS_ARP_ADD_ENTRY       = 0x0005,
133         IPA_CMD_ASS_ARP_REMOVE_ENTRY    = 0x0006,
134         IPA_CMD_ASS_ARP_FLUSH_CACHE     = 0x0007,
135         IPA_CMD_ASS_ARP_QUERY_INFO      = 0x0104,
136         IPA_CMD_ASS_ARP_QUERY_STATS     = 0x0204,
137 };
138
139 /* Return Codes for IPA Commands */
140 enum qeth_ipa_return_codes {
141         IPA_RC_SUCCESS             = 0x0000,
142         IPA_RC_NOTSUPP             = 0x0001,
143         IPA_RC_NO_ACCESS           = 0x0002,
144         IPA_RC_FAILED              = 0x0003,
145         IPA_RC_DATA_MISMATCH       = 0xe001,
146         IPA_RC_INVALID_LAN_TYPE    = 0xe003,
147         IPA_RC_INVALID_LAN_NO      = 0xe004,
148         IPA_RC_IPADDR_ALREADY_REG  = 0xe005,
149         IPA_RC_IPADDR_TABLE_FULL   = 0xe006,
150         IPA_RC_IPADDR_ALREADY_USED = 0xe00a,
151         IPA_RC_ASSNO_NOT_SUPP      = 0xe00d,
152         IPA_RC_ASSCMD_START_FAILED = 0xe00e,
153         IPA_RC_ASSCMD_PART_SUCCESS = 0xe00f,
154         IPA_RC_IPADDR_NOT_DEFINED  = 0xe010,
155         IPA_RC_LAN_OFFLINE         = 0xe080,
156 };
157
158 /* IPA function flags; each flag marks availability of respective function */
159 enum qeth_ipa_funcs {
160         IPA_ARP_PROCESSING      = 0x00000001L,
161         IPA_INBOUND_CHECKSUM    = 0x00000002L,
162         IPA_OUTBOUND_CHECKSUM   = 0x00000004L,
163         IPA_IP_FRAGMENTATION    = 0x00000008L,
164         IPA_FILTERING           = 0x00000010L,
165         IPA_IPV6                = 0x00000020L,
166         IPA_MULTICASTING        = 0x00000040L,
167         IPA_IP_REASSEMBLY       = 0x00000080L,
168         IPA_QUERY_ARP_COUNTERS  = 0x00000100L,
169         IPA_QUERY_ARP_ADDR_INFO = 0x00000200L,
170         IPA_SETADAPTERPARMS     = 0x00000400L,
171         IPA_VLAN_PRIO           = 0x00000800L,
172         IPA_PASSTHRU            = 0x00001000L,
173         IPA_FULL_VLAN           = 0x00004000L,
174         IPA_SOURCE_MAC          = 0x00010000L,
175         IPA_OSA_MC_ROUTER       = 0x00020000L,
176 };
177
178 /* SETIP/DELIP IPA Command: ***************************************************/
179 enum qeth_ipa_setdelip_flags {
180         QETH_IPA_SETDELIP_DEFAULT          = 0x00L, /* default */
181         QETH_IPA_SETIP_VIPA_FLAG           = 0x01L, /* no grat. ARP */
182         QETH_IPA_SETIP_TAKEOVER_FLAG       = 0x02L, /* nofail on grat. ARP */
183         QETH_IPA_DELIP_ADDR_2_B_TAKEN_OVER = 0x20L,
184         QETH_IPA_DELIP_VIPA_FLAG           = 0x40L,
185         QETH_IPA_DELIP_ADDR_NEEDS_SETIP    = 0x80L,
186 };
187
188 /* SETADAPTER IPA Command: ****************************************************/
189 enum qeth_ipa_setadp_cmd {
190         IPA_SETADP_QUERY_COMMANDS_SUPPORTED     = 0x01,
191         IPA_SETADP_ALTER_MAC_ADDRESS            = 0x02,
192         IPA_SETADP_ADD_DELETE_GROUP_ADDRESS     = 0x04,
193         IPA_SETADP_ADD_DELETE_FUNCTIONAL_ADDR   = 0x08,
194         IPA_SETADP_SET_ADDRESSING_MODE          = 0x10,
195         IPA_SETADP_SET_CONFIG_PARMS             = 0x20,
196         IPA_SETADP_SET_CONFIG_PARMS_EXTENDED    = 0x40,
197         IPA_SETADP_SET_BROADCAST_MODE           = 0x80,
198         IPA_SETADP_SEND_OSA_MESSAGE             = 0x0100,
199         IPA_SETADP_SET_SNMP_CONTROL             = 0x0200,
200         IPA_SETADP_READ_SNMP_PARMS              = 0x0400,
201         IPA_SETADP_WRITE_SNMP_PARMS             = 0x0800,
202         IPA_SETADP_QUERY_CARD_INFO              = 0x1000,
203 };
204 enum qeth_ipa_mac_ops {
205         CHANGE_ADDR_READ_MAC            = 0,
206         CHANGE_ADDR_REPLACE_MAC         = 1,
207         CHANGE_ADDR_ADD_MAC             = 2,
208         CHANGE_ADDR_DEL_MAC             = 4,
209         CHANGE_ADDR_RESET_MAC           = 8,
210 };
211 enum qeth_ipa_addr_ops {
212         CHANGE_ADDR_READ_ADDR           = 0,
213         CHANGE_ADDR_ADD_ADDR            = 1,
214         CHANGE_ADDR_DEL_ADDR            = 2,
215         CHANGE_ADDR_FLUSH_ADDR_TABLE    = 4,
216
217
218 };
219 /* (SET)DELIP(M) IPA stuff ***************************************************/
220 struct qeth_ipacmd_setdelip4 {
221         __u8   ip_addr[4];
222         __u8   mask[4];
223         __u32  flags;
224 } __attribute__ ((packed));
225
226 struct qeth_ipacmd_setdelip6 {
227         __u8   ip_addr[16];
228         __u8   mask[16];
229         __u32  flags;
230 } __attribute__ ((packed));
231
232 struct qeth_ipacmd_setdelipm {
233         __u8 mac[6];
234         __u8 padding[2];
235         __u8 ip6[12];
236         __u8 ip4[4];
237 } __attribute__ ((packed));
238
239 struct qeth_ipacmd_setassparms_hdr {
240         __u32 assist_no;
241         __u16 length;
242         __u16 command_code;
243         __u16 return_code;
244         __u8 number_of_replies;
245         __u8 seq_no;
246 } __attribute__((packed));
247
248 /* SETASSPARMS IPA Command: */
249 struct qeth_ipacmd_setassparms {
250         struct qeth_ipacmd_setassparms_hdr hdr;
251         union {
252                 __u32 flags_32bit;
253                 struct qeth_arp_cache_entry add_arp_entry;
254                 __u8 ip[16];
255         } data;
256 } __attribute__ ((packed));
257
258
259 /* SETRTG IPA Command:    ****************************************************/
260 struct qeth_set_routing {
261         __u8 type;
262 };
263
264 /* SETADAPTERPARMS IPA Command:    *******************************************/
265 struct qeth_query_cmds_supp {
266         __u32 no_lantypes_supp;
267         __u8 lan_type;
268         __u8 reserved1[3];
269         __u32 supported_cmds;
270         __u8 reserved2[8];
271 } __attribute__ ((packed));
272
273 struct qeth_change_addr {
274         __u32 cmd;
275         __u32 addr_size;
276         __u32 no_macs;
277         __u8 addr[OSA_ADDR_LEN];
278 } __attribute__ ((packed));
279
280 struct qeth_ipacmd_setadpparms {
281         __u32 supp_hw_cmds;
282         __u32 reserved1;
283         __u16 cmdlength;
284         __u16 reserved2;
285         __u32 command_code;
286         __u16 return_code;
287         __u8 frames_used_total;
288         __u8 frame_seq_no;
289         __u32 reserved3;
290         union {
291                 struct qeth_query_cmds_supp query_cmds_supp;
292                 struct qeth_change_addr change_addr;
293                 __u32 mode;
294         } data;
295 } __attribute__ ((packed));
296
297 /* IPFRAME IPA Command:    ***************************************************/
298 /* TODO: define in analogy to commands define above */
299
300 /* ADD_ADDR_ENTRY IPA Command:    ********************************************/
301 /* TODO: define in analogy to commands define above */
302
303 /* DELETE_ADDR_ENTRY IPA Command:    *****************************************/
304 /* TODO: define in analogy to commands define above */
305
306 /* CREATE_ADDR IPA Command:    ***********************************************/
307 struct qeth_create_destroy_address {
308         __u8 unique_id[8];
309 } __attribute__ ((packed));
310
311 /* REGISTER_LOCAL_ADDR IPA Command:    ***************************************/
312 /* TODO: define in analogy to commands define above */
313
314 /* UNREGISTER_LOCAL_ADDR IPA Command:    *************************************/
315 /* TODO: define in analogy to commands define above */
316
317 /* Header for each IPA command */
318 struct qeth_ipacmd_hdr {
319         __u8   command;
320         __u8   initiator;
321         __u16  seqno;
322         __u16  return_code;
323         __u8   adapter_type;
324         __u8   rel_adapter_no;
325         __u8   prim_version_no;
326         __u8   param_count;
327         __u16  prot_version;
328         __u32  ipa_supported;
329         __u32  ipa_enabled;
330 } __attribute__ ((packed));
331
332 /* The IPA command itself */
333 struct qeth_ipa_cmd {
334         struct qeth_ipacmd_hdr hdr;
335         union {
336                 struct qeth_ipacmd_setdelip4    setdelip4;
337                 struct qeth_ipacmd_setdelip6    setdelip6;
338                 struct qeth_ipacmd_setdelipm    setdelipm;
339                 struct qeth_ipacmd_setassparms  setassparms;
340                 struct qeth_create_destroy_address create_destroy_addr;
341                 struct qeth_ipacmd_setadpparms  setadapterparms;
342                 struct qeth_set_routing setrtg;
343         } data;
344 } __attribute__ ((packed));
345
346 /*
347  * special command for ARP processing.
348  * this is not included in setassparms command before, because we get
349  * problem with the size of struct qeth_ipacmd_setassparms otherwise
350  */
351 enum qeth_ipa_arp_return_codes {
352         QETH_IPA_ARP_RC_SUCCESS      = 0x0000,
353         QETH_IPA_ARP_RC_FAILED       = 0x0001,
354         QETH_IPA_ARP_RC_NOTSUPP      = 0x0002,
355         QETH_IPA_ARP_RC_OUT_OF_RANGE = 0x0003,
356         QETH_IPA_ARP_RC_Q_NOTSUPP    = 0x0004,
357         QETH_IPA_ARP_RC_Q_NO_DATA    = 0x0008,
358 };
359
360 #define QETH_QARP_DATA_SIZE 3968
361 struct qeth_arp_query_data {
362         __u16 request_bits;
363         __u16 reply_bits;
364         __u32 no_entries;
365         char data[QETH_QARP_DATA_SIZE];
366 } __attribute__((packed));
367
368 /* used as parameter for arp_query reply */
369 struct qeth_arp_query_info {
370         __u32 udata_len;
371         __u32 udata_offset;
372         __u32 no_entries;
373         char *udata;
374 };
375
376 #define IPA_ARP_CMD_LEN (IPA_PDU_HEADER_SIZE+sizeof(struct qeth_ipa_arp_cmd))
377 #define QETH_ARP_CMD_BASE_LEN (sizeof(struct qeth_ipacmd_hdr) + \
378                                sizeof(struct qeth_ipacmd_setassparms_hdr))
379 #define QETH_IPA_ARP_DATA_POS(buffer) (buffer + IPA_PDU_HEADER_SIZE + \
380                                        QETH_ARP_CMD_BASE_LEN)
381 struct qeth_ipa_arp_cmd {
382         struct qeth_ipacmd_hdr ihdr;
383         struct qeth_ipacmd_setassparms_hdr shdr;
384         union {
385                 struct qeth_arp_query_data query_arp;
386         } data;
387 } __attribute__((packed));
388
389
390 /* Helper functions */
391 #define IS_IPA_REPLY(cmd) (cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST)
392
393 /*****************************************************************************/
394 /* END OF   IP Assist related definitions                                    */
395 /*****************************************************************************/
396
397
398 extern unsigned char WRITE_CCW[];
399 extern unsigned char READ_CCW[];
400
401 extern unsigned char CM_ENABLE[];
402 #define CM_ENABLE_SIZE 0x63
403 #define QETH_CM_ENABLE_ISSUER_RM_TOKEN(buffer) (buffer+0x2c)
404 #define QETH_CM_ENABLE_FILTER_TOKEN(buffer) (buffer+0x53)
405 #define QETH_CM_ENABLE_USER_DATA(buffer) (buffer+0x5b)
406
407 #define QETH_CM_ENABLE_RESP_FILTER_TOKEN(buffer) \
408                 (PDU_ENCAPSULATION(buffer)+ 0x13)
409
410
411 extern unsigned char CM_SETUP[];
412 #define CM_SETUP_SIZE 0x64
413 #define QETH_CM_SETUP_DEST_ADDR(buffer) (buffer+0x2c)
414 #define QETH_CM_SETUP_CONNECTION_TOKEN(buffer) (buffer+0x51)
415 #define QETH_CM_SETUP_FILTER_TOKEN(buffer) (buffer+0x5a)
416
417 #define QETH_CM_SETUP_RESP_DEST_ADDR(buffer) \
418                 (PDU_ENCAPSULATION(buffer) + 0x1a)
419
420 extern unsigned char ULP_ENABLE[];
421 #define ULP_ENABLE_SIZE 0x6b
422 #define QETH_ULP_ENABLE_LINKNUM(buffer) (buffer+0x61)
423 #define QETH_ULP_ENABLE_DEST_ADDR(buffer) (buffer+0x2c)
424 #define QETH_ULP_ENABLE_FILTER_TOKEN(buffer) (buffer+0x53)
425 #define QETH_ULP_ENABLE_PORTNAME_AND_LL(buffer) (buffer+0x62)
426 #define QETH_ULP_ENABLE_RESP_FILTER_TOKEN(buffer) \
427                 (PDU_ENCAPSULATION(buffer) + 0x13)
428 #define QETH_ULP_ENABLE_RESP_MAX_MTU(buffer) \
429                 (PDU_ENCAPSULATION(buffer)+ 0x1f)
430 #define QETH_ULP_ENABLE_RESP_DIFINFO_LEN(buffer) \
431                 (PDU_ENCAPSULATION(buffer) + 0x17)
432 #define QETH_ULP_ENABLE_RESP_LINK_TYPE(buffer) \
433                 (PDU_ENCAPSULATION(buffer)+ 0x2b)
434
435 extern unsigned char ULP_SETUP[];
436 #define ULP_SETUP_SIZE 0x6c
437 #define QETH_ULP_SETUP_DEST_ADDR(buffer) (buffer+0x2c)
438 #define QETH_ULP_SETUP_CONNECTION_TOKEN(buffer) (buffer+0x51)
439 #define QETH_ULP_SETUP_FILTER_TOKEN(buffer) (buffer+0x5a)
440 #define QETH_ULP_SETUP_CUA(buffer) (buffer+0x68)
441 #define QETH_ULP_SETUP_REAL_DEVADDR(buffer) (buffer+0x6a)
442
443 #define QETH_ULP_SETUP_RESP_CONNECTION_TOKEN(buffer) \
444                 (PDU_ENCAPSULATION(buffer)+0x1a)
445
446
447 extern unsigned char DM_ACT[];
448 #define DM_ACT_SIZE 0x55
449 #define QETH_DM_ACT_DEST_ADDR(buffer) (buffer+0x2c)
450 #define QETH_DM_ACT_CONNECTION_TOKEN(buffer) (buffer+0x51)
451
452
453
454 #define QETH_TRANSPORT_HEADER_SEQ_NO(buffer) (buffer+4)
455 #define QETH_PDU_HEADER_SEQ_NO(buffer) (buffer+0x1c)
456 #define QETH_PDU_HEADER_ACK_SEQ_NO(buffer) (buffer+0x20)
457
458 extern unsigned char IDX_ACTIVATE_READ[];
459 extern unsigned char IDX_ACTIVATE_WRITE[];
460
461 #define IDX_ACTIVATE_SIZE       0x22
462 #define QETH_IDX_ACT_ISSUER_RM_TOKEN(buffer) (buffer+0x0c)
463 #define QETH_IDX_NO_PORTNAME_REQUIRED(buffer) ((buffer)[0x0b]&0x80)
464 #define QETH_IDX_ACT_FUNC_LEVEL(buffer) (buffer+0x10)
465 #define QETH_IDX_ACT_DATASET_NAME(buffer) (buffer+0x16)
466 #define QETH_IDX_ACT_QDIO_DEV_CUA(buffer) (buffer+0x1e)
467 #define QETH_IDX_ACT_QDIO_DEV_REALADDR(buffer) (buffer+0x20)
468 #define QETH_IS_IDX_ACT_POS_REPLY(buffer) (((buffer)[0x08]&3)==2)
469 #define QETH_IDX_REPLY_LEVEL(buffer) (buffer+0x12)
470
471 #define PDU_ENCAPSULATION(buffer) \
472         (buffer + *(buffer + (*(buffer+0x0b)) + \
473          *(buffer + *(buffer+0x0b)+0x11) +0x07))
474
475 #define IS_IPA(buffer) \
476         ((buffer) && \
477          ( *(buffer + ((*(buffer+0x0b))+4) )==0xc1) )
478
479 #define ADDR_FRAME_TYPE_DIX 1
480 #define ADDR_FRAME_TYPE_802_3 2
481 #define ADDR_FRAME_TYPE_TR_WITHOUT_SR 0x10
482 #define ADDR_FRAME_TYPE_TR_WITH_SR 0x20
483
484 #endif