Xenomai  3.1-devel
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 
32 #ifdef __KERNEL__
33 
34 #include <asm/atomic.h>
35 #include <linux/netdevice.h>
36 
37 #include <rtskb.h>
38 #include <rtnet_internal.h>
39 
40 #define RTDEV_VERS_2_0 0x0200
41 
42 #define PRIV_FLAG_UP 0
43 #define PRIV_FLAG_ADDING_ROUTE 1
44 
45 #ifndef NETIF_F_LLTX
46 #define NETIF_F_LLTX 4096
47 #endif
48 
49 #define RTDEV_TX_OK 0
50 #define RTDEV_TX_BUSY 1
51 
52 enum rtnet_link_state {
53  __RTNET_LINK_STATE_XOFF = 0,
54  __RTNET_LINK_STATE_START,
55  __RTNET_LINK_STATE_PRESENT,
56  __RTNET_LINK_STATE_NOCARRIER,
57 };
58 #define RTNET_LINK_STATE_XOFF (1 << __RTNET_LINK_STATE_XOFF)
59 #define RTNET_LINK_STATE_START (1 << __RTNET_LINK_STATE_START)
60 #define RTNET_LINK_STATE_PRESENT (1 << __RTNET_LINK_STATE_PRESENT)
61 #define RTNET_LINK_STATE_NOCARRIER (1 << __RTNET_LINK_STATE_NOCARRIER)
62 
63 /***
64  * rtnet_device
65  */
66 struct rtnet_device {
67  /* Many field are borrowed from struct net_device in
68  * <linux/netdevice.h> - WY
69  */
70  unsigned int vers;
71 
72  char name[IFNAMSIZ];
73  struct device *sysbind; /* device bound in sysfs (optional) */
74 
75  unsigned long rmem_end; /* shmem "recv" end */
76  unsigned long rmem_start; /* shmem "recv" start */
77  unsigned long mem_end; /* shared mem end */
78  unsigned long mem_start; /* shared mem start */
79  unsigned long base_addr; /* device I/O address */
80  unsigned int irq; /* device IRQ number */
81 
82  /*
83  * Some hardware also needs these fields, but they are not
84  * part of the usual set specified in Space.c.
85  */
86  unsigned char if_port; /* Selectable AUI, TP,..*/
87  unsigned char dma; /* DMA channel */
88  __u16 __padding;
89 
90  unsigned long link_state;
91  int ifindex;
92  atomic_t refcount;
93 
94  struct device *sysdev; /* node in driver model for sysfs */
95  struct module *rt_owner; /* like classic owner, but *
96  * forces correct macro usage */
97 
98  unsigned int flags; /* interface flags (a la BSD) */
99  unsigned long priv_flags; /* internal flags */
100  unsigned short type; /* interface hardware type */
101  unsigned short hard_header_len; /* hardware hdr length */
102  unsigned int mtu; /* eth = 1536, tr = 4... */
103  void *priv; /* pointer to private data */
104  netdev_features_t features; /* [RT]NETIF_F_* */
105 
106  /* Interface address info. */
107  unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */
108  unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address */
109  unsigned char addr_len; /* hardware address length */
110 
111  int promiscuity;
112  int allmulti;
113 
114  __u32 local_ip; /* IP address in network order */
115  __u32 broadcast_ip; /* broadcast IP in network order */
116 
117  rtdm_event_t *stack_event;
118 
119  rtdm_mutex_t xmit_mutex; /* protects xmit routine */
120  rtdm_lock_t rtdev_lock; /* management lock */
121  struct mutex nrt_lock; /* non-real-time locking */
122 
123  unsigned int add_rtskbs; /* additionally allocated global rtskbs */
124 
125  struct rtskb_pool dev_pool;
126 
127  /* RTmac related fields */
128  struct rtmac_disc *mac_disc;
129  struct rtmac_priv *mac_priv;
130  int (*mac_detach)(struct rtnet_device *rtdev);
131 
132  /* Device operations */
133  int (*open)(struct rtnet_device *rtdev);
134  int (*stop)(struct rtnet_device *rtdev);
135  int (*hard_header)(struct rtskb *, struct rtnet_device *,
136  unsigned short type, void *daddr,
137  void *saddr, unsigned int len);
138  int (*rebuild_header)(struct rtskb *);
139  int (*hard_start_xmit)(struct rtskb *skb,
140  struct rtnet_device *dev);
141  int (*hw_reset)(struct rtnet_device *rtdev);
142 
143  /* Transmission hook, managed by the stack core, RTcap, and RTmac
144  *
145  * If xmit_lock is used, start_xmit points either to rtdev_locked_xmit or
146  * the RTmac discipline handler. If xmit_lock is not required, start_xmit
147  * points to hard_start_xmit or the discipline handler.
148  */
149  int (*start_xmit)(struct rtskb *skb,
150  struct rtnet_device *dev);
151 
152  /* MTU hook, managed by the stack core and RTmac */
153  unsigned int (*get_mtu)(struct rtnet_device *rtdev,
154  unsigned int priority);
155 
156  int (*do_ioctl)(struct rtnet_device *rtdev,
157  struct ifreq *ifr, int cmd);
158  struct net_device_stats *(*get_stats)(struct rtnet_device *rtdev);
159 
160  /* DMA pre-mapping hooks */
161  dma_addr_t (*map_rtskb)(struct rtnet_device *rtdev,
162  struct rtskb *skb);
163  void (*unmap_rtskb)(struct rtnet_device *rtdev,
164  struct rtskb *skb);
165 };
166 
167 struct rtnet_core_cmd;
168 
169 struct rtdev_event_hook {
170  struct list_head entry;
171  void (*register_device)(struct rtnet_device *rtdev);
172  void (*unregister_device)(struct rtnet_device *rtdev);
173  void (*ifup)(struct rtnet_device *rtdev,
174  struct rtnet_core_cmd *up_cmd);
175  void (*ifdown)(struct rtnet_device *rtdev);
176 };
177 
178 extern struct list_head event_hook_list;
179 extern struct mutex rtnet_devices_nrt_lock;
180 extern struct rtnet_device *rtnet_devices[];
181 
182 
183 struct rtnet_device *__rt_alloc_etherdev(unsigned sizeof_priv,
184  unsigned dev_pool_size,
185  struct module *module);
186 #define rt_alloc_etherdev(priv_size, rx_size) \
187  __rt_alloc_etherdev(priv_size, rx_size, THIS_MODULE)
188 
189 void rtdev_free(struct rtnet_device *rtdev);
190 
191 int rt_register_rtnetdev(struct rtnet_device *rtdev);
192 int rt_unregister_rtnetdev(struct rtnet_device *rtdev);
193 
194 void rtdev_add_event_hook(struct rtdev_event_hook *hook);
195 void rtdev_del_event_hook(struct rtdev_event_hook *hook);
196 
197 void rtdev_alloc_name (struct rtnet_device *rtdev, const char *name_mask);
198 
204 static inline struct rtnet_device *__rtdev_get_by_index(int ifindex)
205 {
206  return rtnet_devices[ifindex-1];
207 }
208 
209 struct rtnet_device *rtdev_get_by_name(const char *if_name);
210 struct rtnet_device *rtdev_get_by_index(int ifindex);
211 struct rtnet_device *rtdev_get_by_hwaddr(unsigned short type,char *ha);
212 struct rtnet_device *rtdev_get_loopback(void);
213 
214 int rtdev_reference(struct rtnet_device *rtdev);
215 
216 static 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 
223 int rtdev_xmit(struct rtskb *skb);
224 
225 #if IS_ENABLED(CONFIG_XENO_DRIVERS_NET_ADDON_PROXY)
226 int rtdev_xmit_proxy(struct rtskb *skb);
227 #endif
228 
229 unsigned int rt_hard_mtu(struct rtnet_device *rtdev, unsigned int priority);
230 
231 int rtdev_open(struct rtnet_device *rtdev);
232 int rtdev_close(struct rtnet_device *rtdev);
233 
234 int rtdev_map_rtskb(struct rtskb *skb);
235 void rtdev_unmap_rtskb(struct rtskb *skb);
236 
237 struct rtskb *rtnetdev_alloc_rtskb(struct rtnet_device *dev, unsigned int size);
238 
239 #define rtnetdev_priv(dev) ((dev)->priv)
240 
241 #define rtdev_emerg(__dev, format, args...) \
242  pr_emerg("%s: " format, (__dev)->name, ##args)
243 #define rtdev_alert(__dev, format, args...) \
244  pr_alert("%s: " format, (__dev)->name, ##args)
245 #define rtdev_crit(__dev, format, args...) \
246  pr_crit("%s: " format, (__dev)->name, ##args)
247 #define rtdev_err(__dev, format, args...) \
248  pr_err("%s: " format, (__dev)->name, ##args)
249 #define rtdev_warn(__dev, format, args...) \
250  pr_warn("%s: " format, (__dev)->name, ##args)
251 #define rtdev_notice(__dev, format, args...) \
252  pr_notice("%s: " format, (__dev)->name, ##args)
253 #define rtdev_info(__dev, format, args...) \
254  pr_info("%s: " format, (__dev)->name, ##args)
255 #define rtdev_dbg(__dev, format, args...) \
256  pr_debug("%s: " format, (__dev)->name, ##args)
257 
258 #ifdef VERBOSE_DEBUG
259 #define rtdev_vdbg rtdev_dbg
260 #else
261 #define rtdev_vdbg(__dev, format, args...) \
262 ({ \
263  if (0) \
264  pr_debug("%s: " format, (__dev)->name, ##args); \
265  \
266  0; \
267 })
268 #endif
269 
270 #endif /* __KERNEL__ */
271 
272 #endif /* __RTDEV_H_ */
ipipe_spinlock_t rtdm_lock_t
Lock variable.
Definition: driver.h:551
Copyright © 2011 Gilles Chanteperdrix gilles.chanteperdrix@xenomai.org.
Definition: atomic.h:24