This source file includes following definitions.
- init_etherdev
- eth_mac_addr
- ether_setup
- tr_setup
- ether_config
- register_netdev
- unregister_netdev
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <linux/config.h>
24 #include <linux/kernel.h>
25 #include <linux/sched.h>
26 #include <linux/types.h>
27 #include <linux/fs.h>
28 #include <linux/malloc.h>
29 #include <linux/if_ether.h>
30 #include <linux/if_arp.h>
31 #include <linux/string.h>
32 #include <linux/netdevice.h>
33 #include <linux/etherdevice.h>
34 #include <linux/trdevice.h>
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 #define MAX_ETH_CARDS 16
55 static struct device *ethdev_index[MAX_ETH_CARDS];
56
57
58
59
60
61
62
63
64
65
66
67
68 struct device *
69 init_etherdev(struct device *dev, int sizeof_priv)
70 {
71 int new_device = 0;
72 int i;
73
74
75 if (dev == NULL) {
76 int alloc_size = sizeof(struct device) + sizeof("eth%d ")
77 + sizeof_priv + 3;
78 struct device *cur_dev;
79 char pname[8];
80
81 for (i = 0; i < MAX_ETH_CARDS; ++i)
82 if (ethdev_index[i] == NULL) {
83 sprintf(pname, "eth%d", i);
84 for (cur_dev = dev_base; cur_dev; cur_dev = cur_dev->next)
85 if (strcmp(pname, cur_dev->name) == 0) {
86 dev = cur_dev;
87 dev->init = NULL;
88 sizeof_priv = (sizeof_priv + 3) & ~3;
89 dev->priv = sizeof_priv
90 ? kmalloc(sizeof_priv, GFP_KERNEL)
91 : NULL;
92 if (dev->priv) memset(dev->priv, 0, sizeof_priv);
93 goto found;
94 }
95 }
96
97 alloc_size &= ~3;
98
99 dev = (struct device *)kmalloc(alloc_size, GFP_KERNEL);
100 memset(dev, 0, alloc_size);
101 if (sizeof_priv)
102 dev->priv = (void *) (dev + 1);
103 dev->name = sizeof_priv + (char *)(dev + 1);
104 new_device = 1;
105 }
106
107 found:
108
109 if (dev->name &&
110 ((dev->name[0] == '\0') || (dev->name[0] == ' '))) {
111 for (i = 0; i < MAX_ETH_CARDS; ++i)
112 if (ethdev_index[i] == NULL) {
113 sprintf(dev->name, "eth%d", i);
114 ethdev_index[i] = dev;
115 break;
116 }
117 }
118
119 ether_setup(dev);
120
121 if (new_device) {
122
123 struct device **old_devp = &dev_base;
124 while ((*old_devp)->next)
125 old_devp = & (*old_devp)->next;
126 (*old_devp)->next = dev;
127 dev->next = 0;
128 }
129 return dev;
130 }
131
132
133 static int eth_mac_addr(struct device *dev, void * addr)
134 {
135 struct ifreq * ifr = (struct ifreq *) addr;
136
137 if(dev->start)
138 return -EBUSY;
139 memcpy(dev->dev_addr, ifr->ifr_hwaddr.sa_data,dev->hard_header_len);
140 return 0;
141 }
142
143 void ether_setup(struct device *dev)
144 {
145 int i;
146
147
148 for (i = 0; i < DEV_NUMBUFFS; i++)
149 skb_queue_head_init(&dev->buffs[i]);
150
151
152 if (dev->name && (strncmp(dev->name, "eth", 3) == 0)) {
153 i = simple_strtoul(dev->name + 3, NULL, 0);
154 if (ethdev_index[i] == NULL) {
155 ethdev_index[i] = dev;
156 }
157 else if (dev != ethdev_index[i]) {
158
159 printk("ether_setup: Ouch! Someone else took %s\n",
160 dev->name);
161 }
162 }
163
164 dev->hard_header = eth_header;
165 dev->rebuild_header = eth_rebuild_header;
166 dev->set_mac_address = eth_mac_addr;
167 dev->header_cache = eth_header_cache;
168
169 dev->type = ARPHRD_ETHER;
170 dev->hard_header_len = ETH_HLEN;
171 dev->mtu = 1500;
172 dev->addr_len = ETH_ALEN;
173 for (i = 0; i < ETH_ALEN; i++) {
174 dev->broadcast[i]=0xff;
175 }
176
177
178 dev->flags = IFF_BROADCAST|IFF_MULTICAST;
179 dev->family = AF_INET;
180 dev->pa_addr = 0;
181 dev->pa_brdaddr = 0;
182 dev->pa_mask = 0;
183 dev->pa_alen = 4;
184 }
185
186 #ifdef CONFIG_TR
187
188 void tr_setup(struct device *dev)
189 {
190 int i;
191
192
193 for (i = 0; i < DEV_NUMBUFFS; i++)
194 skb_queue_head_init(&dev->buffs[i]);
195
196 dev->hard_header = tr_header;
197 dev->rebuild_header = tr_rebuild_header;
198
199 dev->type = ARPHRD_IEEE802;
200 dev->hard_header_len = TR_HLEN;
201 dev->mtu = 2000;
202 dev->addr_len = TR_ALEN;
203 for (i = 0; i < TR_ALEN; i++) {
204 dev->broadcast[i]=0xff;
205 }
206
207
208 dev->flags = IFF_BROADCAST;
209 dev->family = AF_INET;
210 dev->pa_addr = 0;
211 dev->pa_brdaddr = 0;
212 dev->pa_mask = 0;
213 dev->pa_alen = 4;
214 }
215
216 #endif
217
218 int ether_config(struct device *dev, struct ifmap *map)
219 {
220 if (map->mem_start != (u_long)(-1))
221 dev->mem_start = map->mem_start;
222 if (map->mem_end != (u_long)(-1))
223 dev->mem_end = map->mem_end;
224 if (map->base_addr != (u_short)(-1))
225 dev->base_addr = map->base_addr;
226 if (map->irq != (u_char)(-1))
227 dev->irq = map->irq;
228 if (map->dma != (u_char)(-1))
229 dev->dma = map->dma;
230 if (map->port != (u_char)(-1))
231 dev->if_port = map->port;
232 return 0;
233 }
234
235 int register_netdev(struct device *dev)
236 {
237 struct device *d = dev_base;
238 unsigned long flags;
239 int i=MAX_ETH_CARDS;
240
241 save_flags(flags);
242 cli();
243
244 if (dev && dev->init) {
245 if (dev->name &&
246 ((dev->name[0] == '\0') || (dev->name[0] == ' '))) {
247 for (i = 0; i < MAX_ETH_CARDS; ++i)
248 if (ethdev_index[i] == NULL) {
249 sprintf(dev->name, "eth%d", i);
250 ethdev_index[i] = dev;
251 break;
252 }
253 }
254
255 if (dev->init(dev) != 0) {
256 if (i < MAX_ETH_CARDS) ethdev_index[i] = NULL;
257 restore_flags(flags);
258 return -EIO;
259 }
260
261
262 if (dev_base) {
263 while (d->next)
264 d = d->next;
265 d->next = dev;
266 }
267 else
268 dev_base = dev;
269 dev->next = NULL;
270 }
271 restore_flags(flags);
272 return 0;
273 }
274
275 void unregister_netdev(struct device *dev)
276 {
277 struct device *d = dev_base;
278 unsigned long flags;
279 int i;
280
281 save_flags(flags);
282 cli();
283
284 if (dev == NULL)
285 {
286 printk("was NULL\n");
287 restore_flags(flags);
288 return;
289 }
290
291 if (dev->start)
292 printk("ERROR '%s' busy and not MOD_IN_USE.\n", dev->name);
293 if (dev_base == dev)
294 dev_base = dev->next;
295 else
296 {
297 while (d && (d->next != dev))
298 d = d->next;
299
300 if (d && (d->next == dev))
301 {
302 d->next = dev->next;
303 }
304 else
305 {
306 printk("unregister_netdev: '%s' not found\n", dev->name);
307 restore_flags(flags);
308 return;
309 }
310 }
311 for (i = 0; i < MAX_ETH_CARDS; ++i)
312 {
313 if (ethdev_index[i] == dev)
314 {
315 ethdev_index[i] = NULL;
316 break;
317 }
318 }
319
320
321
322
323
324
325
326 dev_close(dev);
327
328 restore_flags(flags);
329 }
330
331
332
333
334
335
336
337
338
339
340