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