]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/infiniband/hw/ipath/ips_common.h
1f83af958e2fe97634fce6c633e3ebb6ebef473a
[linux-2.6-omap-h63xx.git] / drivers / infiniband / hw / ipath / ips_common.h
1 #ifndef IPS_COMMON_H
2 #define IPS_COMMON_H
3 /*
4  * Copyright (c) 2006 QLogic, Inc. All rights reserved.
5  * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved.
6  *
7  * This software is available to you under a choice of one of two
8  * licenses.  You may choose to be licensed under the terms of the GNU
9  * General Public License (GPL) Version 2, available from the file
10  * COPYING in the main directory of this source tree, or the
11  * OpenIB.org BSD license below:
12  *
13  *     Redistribution and use in source and binary forms, with or
14  *     without modification, are permitted provided that the following
15  *     conditions are met:
16  *
17  *      - Redistributions of source code must retain the above
18  *        copyright notice, this list of conditions and the following
19  *        disclaimer.
20  *
21  *      - Redistributions in binary form must reproduce the above
22  *        copyright notice, this list of conditions and the following
23  *        disclaimer in the documentation and/or other materials
24  *        provided with the distribution.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
30  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
31  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
32  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
33  * SOFTWARE.
34  */
35
36 #include "ipath_common.h"
37
38 struct ipath_header {
39         /*
40          * Version - 4 bits, Port - 4 bits, TID - 10 bits and Offset -
41          * 14 bits before ECO change ~28 Dec 03.  After that, Vers 4,
42          * Port 3, TID 11, offset 14.
43          */
44         __le32 ver_port_tid_offset;
45         __le16 chksum;
46         __le16 pkt_flags;
47 };
48
49 struct ips_message_header {
50         __be16 lrh[4];
51         __be32 bth[3];
52         /* fields below this point are in host byte order */
53         struct ipath_header iph;
54         __u8 sub_opcode;
55         __u8 flags;
56         __u16 src_rank;
57         /* 24 bits. The upper 8 bit is available for other use */
58         union {
59                 struct {
60                         unsigned ack_seq_num:24;
61                         unsigned port:4;
62                         unsigned unused:4;
63                 };
64                 __u32 ack_seq_num_org;
65         };
66         __u8 expected_tid_session_id;
67         __u8 tinylen;           /* to aid MPI */
68         union {
69             __u16 tag;          /* to aid MPI */
70             __u16 mqhdr;        /* for PSM MQ */
71         };
72         union {
73                 __u32 mpi[4];   /* to aid MPI */
74                 __u32 data[4];
75                 __u64 mq[2];    /* for PSM MQ */
76                 struct {
77                         __u16 mtu;
78                         __u8 major_ver;
79                         __u8 minor_ver;
80                         __u32 not_used; //free
81                         __u32 run_id;
82                         __u32 client_ver;
83                 };
84         };
85 };
86
87 struct ether_header {
88         __be16 lrh[4];
89         __be32 bth[3];
90         struct ipath_header iph;
91         __u8 sub_opcode;
92         __u8 cmd;
93         __be16 lid;
94         __u16 mac[3];
95         __u8 frag_num;
96         __u8 seq_num;
97         __le32 len;
98         /* MUST be of word size due to PIO write requirements */
99         __le32 csum;
100         __le16 csum_offset;
101         __le16 flags;
102         __u16 first_2_bytes;
103         __u8 unused[2];         /* currently unused */
104 };
105
106 /*
107  * The PIO buffer used for sending infinipath messages must only be written
108  * in 32-bit words, all the data must be written, and no writes can occur
109  * after the last word is written (which transfers "ownership" of the buffer
110  * to the chip and triggers the message to be sent).
111  * Since the Linux sk_buff structure can be recursive, non-aligned, and
112  * any number of bytes in each segment, we use the following structure
113  * to keep information about the overall state of the copy operation.
114  * This is used to save the information needed to store the checksum
115  * in the right place before sending the last word to the hardware and
116  * to buffer the last 0-3 bytes of non-word sized segments.
117  */
118 struct copy_data_s {
119         struct ether_header *hdr;
120         /* addr of PIO buf to write csum to */
121         __u32 __iomem *csum_pio;
122         __u32 __iomem *to;      /* addr of PIO buf to write data to */
123         __u32 device;           /* which device to allocate PIO bufs from */
124         __s32 error;            /* set if there is an error. */
125         __s32 extra;            /* amount of data saved in u.buf below */
126         __u32 len;              /* total length to send in bytes */
127         __u32 flen;             /* frament length in words */
128         __u32 csum;             /* partial IP checksum */
129         __u32 pos;              /* position for partial checksum */
130         __u32 offset;           /* offset to where data currently starts */
131         __s32 checksum_calc;    /* set to 1 when csum has been calculated */
132         struct sk_buff *skb;
133         union {
134                 __u32 w;
135                 __u8 buf[4];
136         } u;
137 };
138
139 /* IB - LRH header consts */
140 #define IPS_LRH_GRH 0x0003      /* 1. word of IB LRH - next header: GRH */
141 #define IPS_LRH_BTH 0x0002      /* 1. word of IB LRH - next header: BTH */
142
143 #define IPS_OFFSET  0
144
145 /*
146  * defines the cut-off point between the header queue and eager/expected
147  * TID queue
148  */
149 #define NUM_OF_EXTRA_WORDS_IN_HEADER_QUEUE \
150         ((sizeof(struct ips_message_header) - \
151           offsetof(struct ips_message_header, iph)) >> 2)
152
153 /* OpCodes  */
154 #define OPCODE_IPS 0xC0
155 #define OPCODE_ITH4X 0xC1
156
157 /* OpCode 30 is use by stand-alone test programs  */
158 #define OPCODE_RAW_DATA 0xDE
159 /* last OpCode (31) is reserved for test  */
160 #define OPCODE_TEST 0xDF
161
162 /* sub OpCodes - ips  */
163 #define OPCODE_SEQ_DATA 0x01
164 #define OPCODE_SEQ_CTRL 0x02
165
166 #define OPCODE_SEQ_MQ_DATA 0x03
167 #define OPCODE_SEQ_MQ_CTRL 0x04
168
169 #define OPCODE_ACK 0x10
170 #define OPCODE_NAK 0x11
171
172 #define OPCODE_ERR_CHK 0x20
173 #define OPCODE_ERR_CHK_PLS 0x21
174
175 #define OPCODE_STARTUP 0x30
176 #define OPCODE_STARTUP_ACK 0x31
177 #define OPCODE_STARTUP_NAK 0x32
178
179 #define OPCODE_STARTUP_EXT 0x34
180 #define OPCODE_STARTUP_ACK_EXT 0x35
181 #define OPCODE_STARTUP_NAK_EXT 0x36
182
183 #define OPCODE_TIDS_RELEASE 0x40
184 #define OPCODE_TIDS_RELEASE_CONFIRM 0x41
185
186 #define OPCODE_CLOSE 0x50
187 #define OPCODE_CLOSE_ACK 0x51
188 /*
189  * like OPCODE_CLOSE, but no complaint if other side has already closed.
190  * Used when doing abort(), MPI_Abort(), etc.
191  */
192 #define OPCODE_ABORT 0x52
193
194 /* sub OpCodes - ith4x  */
195 #define OPCODE_ENCAP 0x81
196 #define OPCODE_LID_ARP 0x82
197
198 /* Receive Header Queue: receive type (from infinipath) */
199 #define RCVHQ_RCV_TYPE_EXPECTED  0
200 #define RCVHQ_RCV_TYPE_EAGER     1
201 #define RCVHQ_RCV_TYPE_NON_KD    2
202 #define RCVHQ_RCV_TYPE_ERROR     3
203
204 /* misc. */
205 #define SIZE_OF_CRC 1
206
207 #define EAGER_TID_ID INFINIPATH_I_TID_MASK
208
209 #define IPS_DEFAULT_P_KEY 0xFFFF
210
211 #define IPS_PERMISSIVE_LID 0xFFFF
212 #define IPS_MULTICAST_LID_BASE 0xC000
213
214 #define IPS_AETH_CREDIT_SHIFT 24
215 #define IPS_AETH_CREDIT_MASK 0x1F
216 #define IPS_AETH_CREDIT_INVAL 0x1F
217
218 #define IPS_PSN_MASK 0xFFFFFF
219 #define IPS_MSN_MASK 0xFFFFFF
220 #define IPS_QPN_MASK 0xFFFFFF
221 #define IPS_MULTICAST_QPN 0xFFFFFF
222
223 /* functions for extracting fields from rcvhdrq entries */
224 static inline __u32 ips_get_hdr_err_flags(const __le32 * rbuf)
225 {
226         return __le32_to_cpu(rbuf[1]);
227 }
228
229 static inline __u32 ips_get_index(const __le32 * rbuf)
230 {
231         return (__le32_to_cpu(rbuf[0]) >> INFINIPATH_RHF_EGRINDEX_SHIFT)
232             & INFINIPATH_RHF_EGRINDEX_MASK;
233 }
234
235 static inline __u32 ips_get_rcv_type(const __le32 * rbuf)
236 {
237         return (__le32_to_cpu(rbuf[0]) >> INFINIPATH_RHF_RCVTYPE_SHIFT)
238             & INFINIPATH_RHF_RCVTYPE_MASK;
239 }
240
241 static inline __u32 ips_get_length_in_bytes(const __le32 * rbuf)
242 {
243         return ((__le32_to_cpu(rbuf[0]) >> INFINIPATH_RHF_LENGTH_SHIFT)
244                 & INFINIPATH_RHF_LENGTH_MASK) << 2;
245 }
246
247 static inline void *ips_get_first_protocol_header(const __u32 * rbuf)
248 {
249         return (void *)&rbuf[2];
250 }
251
252 static inline struct ips_message_header *ips_get_ips_header(const __u32 *
253                                                             rbuf)
254 {
255         return (struct ips_message_header *)&rbuf[2];
256 }
257
258 static inline __u32 ips_get_ipath_ver(__le32 hdrword)
259 {
260         return (__le32_to_cpu(hdrword) >> INFINIPATH_I_VERS_SHIFT)
261             & INFINIPATH_I_VERS_MASK;
262 }
263
264 #endif                          /* IPS_COMMON_H */