Xenomai  3.1
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 
51 enum 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  */
65 struct 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 
161 struct rtnet_core_cmd;
162 
163 struct 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 
171 extern struct list_head event_hook_list;
172 extern struct mutex rtnet_devices_nrt_lock;
173 extern struct rtnet_device *rtnet_devices[];
174 
175 int __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 
181 struct 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 
187 void rtdev_destroy(struct rtnet_device *rtdev);
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_up(struct rtnet_device *rtdev, struct rtnet_core_cmd *cmd);
235 int rtdev_down(struct rtnet_device *rtdev);
236 
237 int rtdev_map_rtskb(struct rtskb *skb);
238 void rtdev_unmap_rtskb(struct rtskb *skb);
239 
240 struct 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_ */
ipipe_spinlock_t rtdm_lock_t
Lock variable.
Definition: driver.h:551
Copyright © 2011 Gilles Chanteperdrix gilles.chanteperdrix@xenomai.org.
Definition: atomic.h:24