Xenomai 3.3.2
Loading...
Searching...
No Matches
rtdev.h
1/***
2 *
3 * rtdev.h
4 *
5 * RTnet - real-time networking subsystem
6 * Copyright (C) 1999 Lineo, Inc
7 * 1999, 2002 David A. Schleef <ds@schleef.org>
8 * 2003-2005 Jan Kiszka <jan.kiszka@web.de>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 *
24 */
25
26#ifndef __RTDEV_H_
27#define __RTDEV_H_
28
29#define MAX_RT_DEVICES 8
30
31#ifdef __KERNEL__
32
33#include <asm/atomic.h>
34#include <linux/netdevice.h>
35
36#include <rtskb.h>
37#include <rtnet_internal.h>
38
39#define RTDEV_VERS_2_0 0x0200
40
41#define PRIV_FLAG_UP 0
42#define PRIV_FLAG_ADDING_ROUTE 1
43
44#ifndef NETIF_F_LLTX
45#define NETIF_F_LLTX 4096
46#endif
47
48#define RTDEV_TX_OK 0
49#define RTDEV_TX_BUSY 1
50
51enum rtnet_link_state {
52 __RTNET_LINK_STATE_XOFF = 0,
53 __RTNET_LINK_STATE_START,
54 __RTNET_LINK_STATE_PRESENT,
55 __RTNET_LINK_STATE_NOCARRIER,
56};
57#define RTNET_LINK_STATE_XOFF (1 << __RTNET_LINK_STATE_XOFF)
58#define RTNET_LINK_STATE_START (1 << __RTNET_LINK_STATE_START)
59#define RTNET_LINK_STATE_PRESENT (1 << __RTNET_LINK_STATE_PRESENT)
60#define RTNET_LINK_STATE_NOCARRIER (1 << __RTNET_LINK_STATE_NOCARRIER)
61
62/***
63 * rtnet_device
64 */
65struct rtnet_device {
66 /* Many field are borrowed from struct net_device in
67 * <linux/netdevice.h> - WY
68 */
69 unsigned int vers;
70
71 char name[IFNAMSIZ];
72 struct device *sysbind; /* device bound in sysfs (optional) */
73
74 unsigned long rmem_end; /* shmem "recv" end */
75 unsigned long rmem_start; /* shmem "recv" start */
76 unsigned long mem_end; /* shared mem end */
77 unsigned long mem_start; /* shared mem start */
78 unsigned long base_addr; /* device I/O address */
79 unsigned int irq; /* device IRQ number */
80
81 /*
82 * Some hardware also needs these fields, but they are not
83 * part of the usual set specified in Space.c.
84 */
85 unsigned char if_port; /* Selectable AUI, TP,..*/
86 unsigned char dma; /* DMA channel */
87 __u16 __padding;
88
89 unsigned long link_state;
90 int ifindex;
91 atomic_t refcount;
92
93 struct device *sysdev; /* node in driver model for sysfs */
94 struct module *rt_owner; /* like classic owner, but *
95 * forces correct macro usage */
96
97 unsigned int flags; /* interface flags (a la BSD) */
98 unsigned long priv_flags; /* internal flags */
99 unsigned short type; /* interface hardware type */
100 unsigned short hard_header_len; /* hardware hdr length */
101 unsigned int mtu; /* eth = 1536, tr = 4... */
102 void *priv; /* pointer to private data */
103 netdev_features_t features; /* [RT]NETIF_F_* */
104
105 /* Interface address info. */
106 unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */
107 unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address */
108 unsigned char addr_len; /* hardware address length */
109
110 int promiscuity;
111 int allmulti;
112
113 __u32 local_ip; /* IP address in network order */
114 __u32 broadcast_ip; /* broadcast IP in network order */
115
116 rtdm_event_t *stack_event;
117
118 rtdm_mutex_t xmit_mutex; /* protects xmit routine */
119 rtdm_lock_t rtdev_lock; /* management lock */
120 struct mutex nrt_lock; /* non-real-time locking */
121
122 unsigned int add_rtskbs; /* additionally allocated global rtskbs */
123
124 struct rtskb_pool dev_pool;
125
126 /* RTmac related fields */
127 struct rtmac_disc *mac_disc;
128 struct rtmac_priv *mac_priv;
129 int (*mac_detach)(struct rtnet_device *rtdev);
130
131 /* Device operations */
132 int (*open)(struct rtnet_device *rtdev);
133 int (*stop)(struct rtnet_device *rtdev);
134 int (*hard_header)(struct rtskb *, struct rtnet_device *,
135 unsigned short type, void *daddr, void *saddr,
136 unsigned int len);
137 int (*rebuild_header)(struct rtskb *);
138 int (*hard_start_xmit)(struct rtskb *skb, struct rtnet_device *dev);
139 int (*hw_reset)(struct rtnet_device *rtdev);
140
141 /* Transmission hook, managed by the stack core, RTcap, and RTmac
142 *
143 * If xmit_lock is used, start_xmit points either to rtdev_locked_xmit or
144 * the RTmac discipline handler. If xmit_lock is not required, start_xmit
145 * points to hard_start_xmit or the discipline handler.
146 */
147 int (*start_xmit)(struct rtskb *skb, struct rtnet_device *dev);
148
149 /* MTU hook, managed by the stack core and RTmac */
150 unsigned int (*get_mtu)(struct rtnet_device *rtdev,
151 unsigned int priority);
152
153 int (*do_ioctl)(struct rtnet_device *rtdev, struct ifreq *ifr, int cmd);
154 struct net_device_stats *(*get_stats)(struct rtnet_device *rtdev);
155
156 /* DMA pre-mapping hooks */
157 dma_addr_t (*map_rtskb)(struct rtnet_device *rtdev, struct rtskb *skb);
158 void (*unmap_rtskb)(struct rtnet_device *rtdev, struct rtskb *skb);
159};
160
161struct rtnet_core_cmd;
162
163struct rtdev_event_hook {
164 struct list_head entry;
165 void (*register_device)(struct rtnet_device *rtdev);
166 void (*unregister_device)(struct rtnet_device *rtdev);
167 void (*ifup)(struct rtnet_device *rtdev, struct rtnet_core_cmd *up_cmd);
168 void (*ifdown)(struct rtnet_device *rtdev);
169};
170
171extern struct list_head event_hook_list;
172extern struct mutex rtnet_devices_nrt_lock;
173extern struct rtnet_device *rtnet_devices[];
174
175int __rt_init_etherdev(struct rtnet_device *rtdev, unsigned int dev_pool_size,
176 struct module *module);
177
178#define rt_init_etherdev(__rtdev, __dev_pool_size) \
179 __rt_init_etherdev(__rtdev, __dev_pool_size, THIS_MODULE)
180
181struct rtnet_device *__rt_alloc_etherdev(unsigned sizeof_priv,
182 unsigned dev_pool_size,
183 struct module *module);
184#define rt_alloc_etherdev(priv_size, rx_size) \
185 __rt_alloc_etherdev(priv_size, rx_size, THIS_MODULE)
186
187void rtdev_destroy(struct rtnet_device *rtdev);
188
189void rtdev_free(struct rtnet_device *rtdev);
190
191int rt_register_rtnetdev(struct rtnet_device *rtdev);
192int rt_unregister_rtnetdev(struct rtnet_device *rtdev);
193
194void rtdev_add_event_hook(struct rtdev_event_hook *hook);
195void rtdev_del_event_hook(struct rtdev_event_hook *hook);
196
197void rtdev_alloc_name(struct rtnet_device *rtdev, const char *name_mask);
198
204static inline struct rtnet_device *__rtdev_get_by_index(int ifindex)
205{
206 return rtnet_devices[ifindex - 1];
207}
208
209struct rtnet_device *rtdev_get_by_name(const char *if_name);
210struct rtnet_device *rtdev_get_by_index(int ifindex);
211struct rtnet_device *rtdev_get_by_hwaddr(unsigned short type, char *ha);
212struct rtnet_device *rtdev_get_loopback(void);
213
214int rtdev_reference(struct rtnet_device *rtdev);
215
216static inline void rtdev_dereference(struct rtnet_device *rtdev)
217{
218 smp_mb__before_atomic();
219 if (rtdev->rt_owner && atomic_dec_and_test(&rtdev->refcount))
220 module_put(rtdev->rt_owner);
221}
222
223int rtdev_xmit(struct rtskb *skb);
224
225#if IS_ENABLED(CONFIG_XENO_DRIVERS_NET_ADDON_PROXY)
226int rtdev_xmit_proxy(struct rtskb *skb);
227#endif
228
229unsigned int rt_hard_mtu(struct rtnet_device *rtdev, unsigned int priority);
230
231int rtdev_open(struct rtnet_device *rtdev);
232int rtdev_close(struct rtnet_device *rtdev);
233
234int rtdev_up(struct rtnet_device *rtdev, struct rtnet_core_cmd *cmd);
235int rtdev_down(struct rtnet_device *rtdev);
236
237int rtdev_map_rtskb(struct rtskb *skb);
238void rtdev_unmap_rtskb(struct rtskb *skb);
239
240struct rtskb *rtnetdev_alloc_rtskb(struct rtnet_device *dev, unsigned int size);
241
242#define rtnetdev_priv(dev) ((dev)->priv)
243
244#define rtdev_emerg(__dev, format, args...) \
245 pr_emerg("%s: " format, (__dev)->name, ##args)
246#define rtdev_alert(__dev, format, args...) \
247 pr_alert("%s: " format, (__dev)->name, ##args)
248#define rtdev_crit(__dev, format, args...) \
249 pr_crit("%s: " format, (__dev)->name, ##args)
250#define rtdev_err(__dev, format, args...) \
251 pr_err("%s: " format, (__dev)->name, ##args)
252#define rtdev_warn(__dev, format, args...) \
253 pr_warn("%s: " format, (__dev)->name, ##args)
254#define rtdev_notice(__dev, format, args...) \
255 pr_notice("%s: " format, (__dev)->name, ##args)
256#define rtdev_info(__dev, format, args...) \
257 pr_info("%s: " format, (__dev)->name, ##args)
258#define rtdev_dbg(__dev, format, args...) \
259 pr_debug("%s: " format, (__dev)->name, ##args)
260
261#ifdef VERBOSE_DEBUG
262#define rtdev_vdbg rtdev_dbg
263#else
264#define rtdev_vdbg(__dev, format, args...) \
265 ({ \
266 if (0) \
267 pr_debug("%s: " format, (__dev)->name, ##args); \
268 \
269 0; \
270 })
271#endif
272
273#endif /* __KERNEL__ */
274
275#endif /* __RTDEV_H_ */
pipeline_spinlock_t rtdm_lock_t
Lock variable.
Definition driver.h:552
Copyright © 2011 Gilles Chanteperdrix gilles.chanteperdrix@xenomai.org.
Definition atomic.h:24