ipoib.h revision 95ed644fd12f53c6fc778f3f246974e5fe3a9468
1/*
2 * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
3 * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
4 * Copyright (c) 2004 Voltaire, 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 * $Id: ipoib.h 1358 2004-12-17 22:00:11Z roland $
35 */
36
37#ifndef _IPOIB_H
38#define _IPOIB_H
39
40#include <linux/list.h>
41#include <linux/skbuff.h>
42#include <linux/netdevice.h>
43#include <linux/workqueue.h>
44#include <linux/pci.h>
45#include <linux/config.h>
46#include <linux/kref.h>
47#include <linux/if_infiniband.h>
48#include <linux/mutex.h>
49
50#include <net/neighbour.h>
51
52#include <asm/atomic.h>
53
54#include <rdma/ib_verbs.h>
55#include <rdma/ib_pack.h>
56#include <rdma/ib_sa.h>
57
58/* constants */
59
60enum {
61	IPOIB_PACKET_SIZE         = 2048,
62	IPOIB_BUF_SIZE 		  = IPOIB_PACKET_SIZE + IB_GRH_BYTES,
63
64	IPOIB_ENCAP_LEN 	  = 4,
65
66	IPOIB_RX_RING_SIZE 	  = 128,
67	IPOIB_TX_RING_SIZE 	  = 64,
68
69	IPOIB_NUM_WC 		  = 4,
70
71	IPOIB_MAX_PATH_REC_QUEUE  = 3,
72	IPOIB_MAX_MCAST_QUEUE     = 3,
73
74	IPOIB_FLAG_OPER_UP 	  = 0,
75	IPOIB_FLAG_ADMIN_UP 	  = 1,
76	IPOIB_PKEY_ASSIGNED 	  = 2,
77	IPOIB_PKEY_STOP 	  = 3,
78	IPOIB_FLAG_SUBINTERFACE   = 4,
79	IPOIB_MCAST_RUN 	  = 5,
80	IPOIB_STOP_REAPER         = 6,
81
82	IPOIB_MAX_BACKOFF_SECONDS = 16,
83
84	IPOIB_MCAST_FLAG_FOUND 	  = 0,	/* used in set_multicast_list */
85	IPOIB_MCAST_FLAG_SENDONLY = 1,
86	IPOIB_MCAST_FLAG_BUSY 	  = 2,	/* joining or already joined */
87	IPOIB_MCAST_FLAG_ATTACHED = 3,
88};
89
90/* structs */
91
92struct ipoib_header {
93	__be16	proto;
94	u16	reserved;
95};
96
97struct ipoib_pseudoheader {
98	u8  hwaddr[INFINIBAND_ALEN];
99};
100
101struct ipoib_mcast;
102
103struct ipoib_rx_buf {
104	struct sk_buff *skb;
105	dma_addr_t	mapping;
106};
107
108struct ipoib_tx_buf {
109	struct sk_buff *skb;
110	DECLARE_PCI_UNMAP_ADDR(mapping)
111};
112
113/*
114 * Device private locking: tx_lock protects members used in TX fast
115 * path (and we use LLTX so upper layers don't do extra locking).
116 * lock protects everything else.  lock nests inside of tx_lock (ie
117 * tx_lock must be acquired first if needed).
118 */
119struct ipoib_dev_priv {
120	spinlock_t lock;
121
122	struct net_device *dev;
123
124	unsigned long flags;
125
126	struct mutex mcast_mutex;
127	struct mutex vlan_mutex;
128
129	struct rb_root  path_tree;
130	struct list_head path_list;
131
132	struct ipoib_mcast *broadcast;
133	struct list_head multicast_list;
134	struct rb_root multicast_tree;
135
136	struct work_struct pkey_task;
137	struct work_struct mcast_task;
138	struct work_struct flush_task;
139	struct work_struct restart_task;
140	struct work_struct ah_reap_task;
141
142	struct ib_device *ca;
143	u8            	  port;
144	u16           	  pkey;
145	struct ib_pd  	 *pd;
146	struct ib_mr  	 *mr;
147	struct ib_cq  	 *cq;
148	struct ib_qp  	 *qp;
149	u32           	  qkey;
150
151	union ib_gid local_gid;
152	u16          local_lid;
153	u8           local_rate;
154
155	unsigned int admin_mtu;
156	unsigned int mcast_mtu;
157
158	struct ipoib_rx_buf *rx_ring;
159
160	spinlock_t           tx_lock;
161	struct ipoib_tx_buf *tx_ring;
162	unsigned             tx_head;
163	unsigned             tx_tail;
164	struct ib_sge        tx_sge;
165	struct ib_send_wr    tx_wr;
166
167	struct ib_wc ibwc[IPOIB_NUM_WC];
168
169	struct list_head dead_ahs;
170
171	struct ib_event_handler event_handler;
172
173	struct net_device_stats stats;
174
175	struct net_device *parent;
176	struct list_head child_intfs;
177	struct list_head list;
178
179#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
180	struct list_head fs_list;
181	struct dentry *mcg_dentry;
182	struct dentry *path_dentry;
183#endif
184};
185
186struct ipoib_ah {
187	struct net_device *dev;
188	struct ib_ah      *ah;
189	struct list_head   list;
190	struct kref        ref;
191	unsigned           last_send;
192};
193
194struct ipoib_path {
195	struct net_device    *dev;
196	struct ib_sa_path_rec pathrec;
197	struct ipoib_ah      *ah;
198	struct sk_buff_head   queue;
199
200	struct list_head      neigh_list;
201
202	int                   query_id;
203	struct ib_sa_query   *query;
204	struct completion     done;
205
206	struct rb_node        rb_node;
207	struct list_head      list;
208};
209
210struct ipoib_neigh {
211	struct ipoib_ah    *ah;
212	struct sk_buff_head queue;
213
214	struct neighbour   *neighbour;
215
216	struct list_head    list;
217};
218
219static inline struct ipoib_neigh **to_ipoib_neigh(struct neighbour *neigh)
220{
221	return (struct ipoib_neigh **) (neigh->ha + 24 -
222					(offsetof(struct neighbour, ha) & 4));
223}
224
225extern struct workqueue_struct *ipoib_workqueue;
226
227/* functions */
228
229void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
230
231struct ipoib_ah *ipoib_create_ah(struct net_device *dev,
232				 struct ib_pd *pd, struct ib_ah_attr *attr);
233void ipoib_free_ah(struct kref *kref);
234static inline void ipoib_put_ah(struct ipoib_ah *ah)
235{
236	kref_put(&ah->ref, ipoib_free_ah);
237}
238
239int ipoib_open(struct net_device *dev);
240int ipoib_add_pkey_attr(struct net_device *dev);
241
242void ipoib_send(struct net_device *dev, struct sk_buff *skb,
243		struct ipoib_ah *address, u32 qpn);
244void ipoib_reap_ah(void *dev_ptr);
245
246void ipoib_flush_paths(struct net_device *dev);
247struct ipoib_dev_priv *ipoib_intf_alloc(const char *format);
248
249int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port);
250void ipoib_ib_dev_flush(void *dev);
251void ipoib_ib_dev_cleanup(struct net_device *dev);
252
253int ipoib_ib_dev_open(struct net_device *dev);
254int ipoib_ib_dev_up(struct net_device *dev);
255int ipoib_ib_dev_down(struct net_device *dev);
256int ipoib_ib_dev_stop(struct net_device *dev);
257
258int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port);
259void ipoib_dev_cleanup(struct net_device *dev);
260
261void ipoib_mcast_join_task(void *dev_ptr);
262void ipoib_mcast_send(struct net_device *dev, union ib_gid *mgid,
263		      struct sk_buff *skb);
264
265void ipoib_mcast_restart_task(void *dev_ptr);
266int ipoib_mcast_start_thread(struct net_device *dev);
267int ipoib_mcast_stop_thread(struct net_device *dev, int flush);
268
269void ipoib_mcast_dev_down(struct net_device *dev);
270void ipoib_mcast_dev_flush(struct net_device *dev);
271
272#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
273struct ipoib_mcast_iter *ipoib_mcast_iter_init(struct net_device *dev);
274int ipoib_mcast_iter_next(struct ipoib_mcast_iter *iter);
275void ipoib_mcast_iter_read(struct ipoib_mcast_iter *iter,
276				  union ib_gid *gid,
277				  unsigned long *created,
278				  unsigned int *queuelen,
279				  unsigned int *complete,
280				  unsigned int *send_only);
281
282struct ipoib_path_iter *ipoib_path_iter_init(struct net_device *dev);
283int ipoib_path_iter_next(struct ipoib_path_iter *iter);
284void ipoib_path_iter_read(struct ipoib_path_iter *iter,
285			  struct ipoib_path *path);
286#endif
287
288int ipoib_mcast_attach(struct net_device *dev, u16 mlid,
289		       union ib_gid *mgid);
290int ipoib_mcast_detach(struct net_device *dev, u16 mlid,
291		       union ib_gid *mgid);
292
293int ipoib_init_qp(struct net_device *dev);
294int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca);
295void ipoib_transport_dev_cleanup(struct net_device *dev);
296
297void ipoib_event(struct ib_event_handler *handler,
298		 struct ib_event *record);
299
300int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey);
301int ipoib_vlan_delete(struct net_device *pdev, unsigned short pkey);
302
303void ipoib_pkey_poll(void *dev);
304int ipoib_pkey_dev_delay_open(struct net_device *dev);
305
306#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
307void ipoib_create_debug_files(struct net_device *dev);
308void ipoib_delete_debug_files(struct net_device *dev);
309int ipoib_register_debugfs(void);
310void ipoib_unregister_debugfs(void);
311#else
312static inline void ipoib_create_debug_files(struct net_device *dev) { }
313static inline void ipoib_delete_debug_files(struct net_device *dev) { }
314static inline int ipoib_register_debugfs(void) { return 0; }
315static inline void ipoib_unregister_debugfs(void) { }
316#endif
317
318
319#define ipoib_printk(level, priv, format, arg...)	\
320	printk(level "%s: " format, ((struct ipoib_dev_priv *) priv)->dev->name , ## arg)
321#define ipoib_warn(priv, format, arg...)		\
322	ipoib_printk(KERN_WARNING, priv, format , ## arg)
323
324
325#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
326extern int ipoib_debug_level;
327
328#define ipoib_dbg(priv, format, arg...)			\
329	do {					        \
330		if (ipoib_debug_level > 0)			\
331			ipoib_printk(KERN_DEBUG, priv, format , ## arg); \
332	} while (0)
333#define ipoib_dbg_mcast(priv, format, arg...)		\
334	do {					        \
335		if (mcast_debug_level > 0)		\
336			ipoib_printk(KERN_DEBUG, priv, format , ## arg); \
337	} while (0)
338#else /* CONFIG_INFINIBAND_IPOIB_DEBUG */
339#define ipoib_dbg(priv, format, arg...)			\
340	do { (void) (priv); } while (0)
341#define ipoib_dbg_mcast(priv, format, arg...)		\
342	do { (void) (priv); } while (0)
343#endif /* CONFIG_INFINIBAND_IPOIB_DEBUG */
344
345#ifdef CONFIG_INFINIBAND_IPOIB_DEBUG_DATA
346#define ipoib_dbg_data(priv, format, arg...)		\
347	do {					        \
348		if (data_debug_level > 0)		\
349			ipoib_printk(KERN_DEBUG, priv, format , ## arg); \
350	} while (0)
351#else /* CONFIG_INFINIBAND_IPOIB_DEBUG_DATA */
352#define ipoib_dbg_data(priv, format, arg...)		\
353	do { (void) (priv); } while (0)
354#endif /* CONFIG_INFINIBAND_IPOIB_DEBUG_DATA */
355
356
357#define IPOIB_GID_FMT		"%x:%x:%x:%x:%x:%x:%x:%x"
358
359#define IPOIB_GID_ARG(gid)	be16_to_cpup((__be16 *) ((gid).raw +  0)), \
360				be16_to_cpup((__be16 *) ((gid).raw +  2)), \
361				be16_to_cpup((__be16 *) ((gid).raw +  4)), \
362				be16_to_cpup((__be16 *) ((gid).raw +  6)), \
363				be16_to_cpup((__be16 *) ((gid).raw +  8)), \
364				be16_to_cpup((__be16 *) ((gid).raw + 10)), \
365				be16_to_cpup((__be16 *) ((gid).raw + 12)), \
366				be16_to_cpup((__be16 *) ((gid).raw + 14))
367
368#endif /* _IPOIB_H */
369