OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [before_ORP/] [uclinux/] [uClinux-2.0.x/] [drivers/] [net/] [eql.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 199 simons
/*
2
 * Equalizer Load-balancer for serial network interfaces.
3
 *
4
 * (c) Copyright 1995 Simon "Guru Aleph-Null" Janes
5
 * NCM: Network and Communications Management, Inc.
6
 *
7
 *
8
 *      This software may be used and distributed according to the terms
9
 *      of the GNU Public License, incorporated herein by reference.
10
 *
11
 * The author may be reached as simon@ncm.com, or C/O
12
 *    NCM
13
 *    Attn: Simon Janes
14
 *    6803 Whittier Ave
15
 *    McLean VA 22101
16
 *    Phone: 1-703-847-0040 ext 103
17
 */
18
 
19
static const char *version =
20
        "Equalizer1996: $Revision: 1.1.1.1 $ $Date: 2001-09-10 07:44:23 $ Simon Janes (simon@ncm.com)\n";
21
 
22
/*
23
 * Sources:
24
 *   skeleton.c by Donald Becker.
25
 * Inspirations:
26
 *   The Harried and Overworked Alan Cox
27
 * Conspiracies:
28
 *   The Alan Cox and Mike McLagan plot to get someone else to do the code,
29
 *   which turned out to be me.
30
 */
31
 
32
/*
33
 * $Log: not supported by cvs2svn $
34
 * Revision 1.1.1.1  2001/07/02 17:58:23  simons
35
 * Initial revision
36
 *
37
 * Revision 1.9  1996/10/12 11:14:37  davem
38
 * Quick merge to 2.0.20
39
 *
40
 * Revision 1.2  1996/04/11 17:51:52  guru
41
 * Added one-line eql_remove_slave patch.
42
 *
43
 * Revision 1.1  1996/04/11 17:44:17  guru
44
 * Initial revision
45
 *
46
 * Revision 3.13  1996/01/21  15:17:18  alan
47
 * tx_queue_len changes.
48
 * reformatted.
49
 *
50
 * Revision 3.12  1995/03/22  21:07:51  anarchy
51
 * Added suser() checks on configuration.
52
 * Moved header file.
53
 *
54
 * Revision 3.11  1995/01/19  23:14:31  guru
55
 *                    slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
56
 *                      (priority_Bps) + bytes_queued * 8;
57
 *
58
 * Revision 3.10  1995/01/19  23:07:53  guru
59
 * back to
60
 *                    slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
61
 *                      (priority_Bps) + bytes_queued;
62
 *
63
 * Revision 3.9  1995/01/19  22:38:20  guru
64
 *                    slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
65
 *                      (priority_Bps) + bytes_queued * 4;
66
 *
67
 * Revision 3.8  1995/01/19  22:30:55  guru
68
 *       slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
69
 *                      (priority_Bps) + bytes_queued * 2;
70
 *
71
 * Revision 3.7  1995/01/19  21:52:35  guru
72
 * printk's trimmed out.
73
 *
74
 * Revision 3.6  1995/01/19  21:49:56  guru
75
 * This is working pretty well. I gained 1 K/s in speed.. now it's just
76
 * robustness and printk's to be diked out.
77
 *
78
 * Revision 3.5  1995/01/18  22:29:59  guru
79
 * still crashes the kernel when the lock_wait thing is woken up.
80
 *
81
 * Revision 3.4  1995/01/18  21:59:47  guru
82
 * Broken set-bit locking snapshot
83
 *
84
 * Revision 3.3  1995/01/17  22:09:18  guru
85
 * infinite sleep in a lock somewhere..
86
 *
87
 * Revision 3.2  1995/01/15  16:46:06  guru
88
 * Log trimmed of non-pertinent 1.x branch messages
89
 *
90
 * Revision 3.1  1995/01/15  14:41:45  guru
91
 * New Scheduler and timer stuff...
92
 *
93
 * Revision 1.15  1995/01/15  14:29:02  guru
94
 * Will make 1.14 (now 1.15) the 3.0 branch, and the 1.12 the 2.0 branch, the one
95
 * with the dumber scheduler
96
 *
97
 * Revision 1.14  1995/01/15  02:37:08  guru
98
 * shock.. the kept-new-versions could have zonked working
99
 * stuff.. shudder
100
 *
101
 * Revision 1.13  1995/01/15  02:36:31  guru
102
 * big changes
103
 *
104
 *      scheduler was torn out and replaced with something smarter
105
 *
106
 *      global names not prefixed with eql_ were renamed to protect
107
 *      against namespace collisions
108
 *
109
 *      a few more abstract interfaces were added to facilitate any
110
 *      potential change of datastructure.  the driver is still using
111
 *      a linked list of slaves.  going to a heap would be a bit of
112
 *      an overkill.
113
 *
114
 *      this compiles fine with no warnings.
115
 *
116
 *      the locking mechanism and timer stuff must be written however,
117
 *      this version will not work otherwise
118
 *
119
 */
120
 
121
#include <linux/module.h>
122
 
123
#include <linux/kernel.h>
124
#include <linux/sched.h>
125
#include <linux/types.h>
126
#include <linux/fcntl.h>
127
#include <linux/interrupt.h>
128
#include <linux/ptrace.h>
129
#include <linux/ioport.h>
130
#include <linux/in.h>
131
#include <linux/malloc.h>
132
#include <linux/string.h>
133
#include <asm/system.h>
134
#include <asm/bitops.h>
135
#include <asm/io.h>
136
#include <asm/dma.h>
137
#include <linux/errno.h>              
138
 
139
#include <linux/netdevice.h>
140
#include <linux/if.h>
141
#include <linux/if_arp.h>
142
#include <linux/timer.h>
143
 
144
#include <linux/if_eql.h>
145
 
146
#ifndef EQL_DEBUG
147
/* #undef EQL_DEBUG      -* print nothing at all, not even a boot-banner */
148
/* #define EQL_DEBUG 1   -* print only the boot-banner */
149
/* #define EQL_DEBUG 5   -* print major function entries */
150
/* #define EQL_DEBUG 20  -* print subfunction entries */
151
/* #define EQL_DEBUG 50  -* print utility entries */
152
/* #define EQL_DEBUG 100 -* print voluminous function entries */
153
#define EQL_DEBUG 1
154
#endif
155
static unsigned int eql_debug = EQL_DEBUG;
156
 
157
int        eql_init(struct device *dev); /*  */
158
static int eql_open(struct device *dev); /*  */
159
static int eql_close(struct device *dev); /*  */
160
static int eql_ioctl(struct device *dev, struct ifreq *ifr, int cmd); /*  */
161
static int eql_slave_xmit(struct sk_buff *skb, struct device *dev); /*  */
162
 
163
static struct enet_statistics *eql_get_stats(struct device *dev); /*  */
164
static int eql_header(struct sk_buff *skb, struct device *dev,
165
                      unsigned short type, void *daddr, void *saddr,
166
                      unsigned len); /*  */
167
static int eql_rebuild_header(void *buff, struct device *dev,
168
                              unsigned long raddr, struct sk_buff *skb); /*  */
169
 
170
/* ioctl() handlers
171
   ---------------- */
172
static int eql_enslave(struct device *dev,  slaving_request_t *srq); /*  */
173
static int eql_emancipate(struct device *dev, slaving_request_t *srq); /*  */
174
 
175
static int eql_g_slave_cfg(struct device *dev, slave_config_t *sc); /*  */
176
static int eql_s_slave_cfg(struct device *dev, slave_config_t *sc); /*  */
177
 
178
static int eql_g_master_cfg(struct device *dev, master_config_t *mc); /*  */
179
static int eql_s_master_cfg(struct device *dev, master_config_t *mc); /*  */
180
 
181
static inline int eql_is_slave(struct device *dev); /*  */
182
static inline int eql_is_master(struct device *dev); /*  */
183
 
184
static slave_t *eql_new_slave(void); /*  */
185
static void eql_delete_slave(slave_t *slave); /*  */
186
 
187
/* static long eql_slave_priority(slave_t *slave); -*  */
188
static inline int eql_number_slaves(slave_queue_t *queue); /*  */
189
 
190
static inline int eql_is_empty(slave_queue_t *queue); /*  */
191
static inline int eql_is_full(slave_queue_t *queue); /*  */
192
 
193
static slave_queue_t *eql_new_slave_queue(struct device *dev); /*  */
194
static void eql_delete_slave_queue(slave_queue_t *queue); /*  */
195
 
196
static int eql_insert_slave(slave_queue_t *queue, slave_t *slave); /*  */
197
static slave_t *eql_remove_slave(slave_queue_t *queue, slave_t *slave); /*  */
198
 
199
/* static int eql_insert_slave_dev(slave_queue_t *queue, struct device *dev); -*  */
200
static int eql_remove_slave_dev(slave_queue_t *queue, struct device *dev); /*  */
201
 
202
static inline struct device *eql_best_slave_dev(slave_queue_t *queue); /*  */
203
static inline slave_t *eql_best_slave(slave_queue_t *queue); /*  */
204
static inline slave_t *eql_first_slave(slave_queue_t *queue); /*  */
205
static inline slave_t *eql_next_slave(slave_queue_t *queue, slave_t *slave); /*  */
206
 
207
static inline void eql_set_best_slave(slave_queue_t *queue, slave_t *slave); /*  */
208
static inline void eql_schedule_slaves(slave_queue_t *queue); /*  */
209
 
210
static slave_t *eql_find_slave_dev(slave_queue_t *queue, struct device *dev); /*  */
211
 
212
/* static inline eql_lock_slave_queue(slave_queue_t *queue); -*  */
213
/* static inline eql_unlock_slave_queue(slave_queue_t *queue); -*  */
214
 
215
static void eql_timer(unsigned long param);     /*  */
216
 
217
/* struct device * interface functions
218
   ---------------------------------------------------------
219
   */
220
 
221
int eql_init(struct device *dev)
222
{
223
        static unsigned version_printed = 0;
224
        /* static unsigned num_masters     = 0; */
225
        equalizer_t *eql = 0;
226
        int i;
227
 
228
        if ( version_printed++ == 0 && eql_debug > 0)
229
                printk(version);
230
        /*
231
         *      Initialize the device structure.
232
         */
233
        dev->priv = kmalloc (sizeof (equalizer_t), GFP_KERNEL);
234
        if (dev->priv == NULL)
235
                return -ENOMEM;
236
        memset (dev->priv, 0, sizeof (equalizer_t));
237
        eql = (equalizer_t *) dev->priv;
238
 
239
        eql->stats = kmalloc (sizeof (struct enet_statistics), GFP_KERNEL);
240
        if (eql->stats == NULL)
241
        {
242
                kfree(dev->priv);
243
                dev->priv = NULL;
244
                return -ENOMEM;
245
        }
246
        memset (eql->stats, 0, sizeof (struct enet_statistics));
247
 
248
        init_timer (&eql->timer);
249
        eql->timer.data         = (unsigned long) dev->priv;
250
        eql->timer.expires      = jiffies+EQL_DEFAULT_RESCHED_IVAL;
251
        eql->timer.function     = &eql_timer;
252
        eql->timer_on           = 0;
253
 
254
        dev->open               = eql_open;
255
        dev->stop               = eql_close;
256
        dev->do_ioctl           = eql_ioctl;
257
        dev->hard_start_xmit    = eql_slave_xmit;
258
        dev->get_stats          = eql_get_stats;
259
 
260
        /*
261
         *      Fill in the fields of the device structure with
262
         *      eql-generic values. This should be in a common
263
         *      file instead of per-driver.
264
         */
265
 
266
        for (i = 0; i < DEV_NUMBUFFS; i++)
267
                skb_queue_head_init(&dev->buffs[i]);
268
 
269
        dev->hard_header        = eql_header;
270
        dev->rebuild_header     = eql_rebuild_header;
271
        dev->hard_header_len    = MAX_HEADER; /* enough space for any slave */
272
 
273
        /*
274
         *      Now we undo some of the things that eth_setup does
275
         *      that we don't like
276
         */
277
 
278
        dev->mtu                = EQL_DEFAULT_MTU;      /* set to 576 in eql.h */
279
        dev->flags              = IFF_MASTER;
280
 
281
        dev->family             = AF_INET;
282
        dev->pa_addr            = 0;
283
        dev->pa_brdaddr         = 0;
284
        dev->pa_mask            = 0;
285
        dev->pa_alen            = 4;
286
 
287
        dev->type               = ARPHRD_SLIP;
288
        dev->tx_queue_len       = 5;            /* Hands them off fast */
289
 
290
        return 0;
291
}
292
 
293
static int eql_open(struct device *dev)
294
{
295
        equalizer_t *eql = (equalizer_t *) dev->priv;
296
        slave_queue_t *new_queue;
297
 
298
#ifdef EQL_DEBUG
299
        if (eql_debug >= 5)
300
                printk ("%s: open\n", dev->name);
301
#endif
302
 
303
        printk ("%s: remember to turn off Van-Jacobson compression on your slave devices.\n", dev->name);
304
 
305
        new_queue = eql_new_slave_queue (dev);
306
 
307
        if (new_queue != 0)
308
        {
309
                new_queue->master_dev = dev;
310
                eql->queue = new_queue;
311
                eql->queue->lock = 0;
312
                eql->min_slaves = 1;
313
                eql->max_slaves = EQL_DEFAULT_MAX_SLAVES; /* 4 usually... */
314
 
315
                printk ("%s: adding timer\n", dev->name);
316
                eql->timer_on = 1;
317
                add_timer (&eql->timer);
318
 
319
                MOD_INC_USE_COUNT;
320
                return 0;
321
        }
322
        return 1;
323
}
324
 
325
 
326
static int eql_close(struct device *dev)
327
{
328
        equalizer_t *eql = (equalizer_t *) dev->priv;
329
 
330
#ifdef EQL_DEBUG
331
        if ( eql_debug >= 5)
332
                printk ("%s: close\n", dev->name);
333
#endif
334
        /*
335
         *      The timer has to be stopped first before we start hacking away
336
         *      at the data structure it scans every so often...
337
         */
338
 
339
#ifdef EQL_DEBUG
340
        printk ("%s: stopping timer\n", dev->name);
341
#endif  
342
        eql->timer_on = 0;
343
        del_timer (&eql->timer);
344
 
345
        eql_delete_slave_queue (eql->queue);
346
 
347
        MOD_DEC_USE_COUNT;
348
        return 0;
349
}
350
 
351
 
352
static int eql_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
353
{
354
        if(!suser() && cmd!=EQL_GETMASTRCFG && cmd!=EQL_GETSLAVECFG)
355
                return -EPERM;
356
        switch (cmd)
357
        {
358
                case EQL_ENSLAVE:
359
                        return eql_enslave (dev, (slaving_request_t *) ifr->ifr_data);
360
                case EQL_EMANCIPATE:
361
                        return eql_emancipate (dev, (slaving_request_t *) ifr->ifr_data);
362
                case EQL_GETSLAVECFG:
363
                        return eql_g_slave_cfg (dev, (slave_config_t *) ifr->ifr_data);
364
                case EQL_SETSLAVECFG:
365
                        return eql_s_slave_cfg (dev, (slave_config_t *) ifr->ifr_data);
366
                case EQL_GETMASTRCFG:
367
                        return eql_g_master_cfg (dev, (master_config_t *) ifr->ifr_data);
368
                case EQL_SETMASTRCFG:
369
                        return eql_s_master_cfg (dev, (master_config_t *) ifr->ifr_data);
370
                default:
371
                        return -EOPNOTSUPP;
372
        }
373
}
374
 
375
 
376
static int eql_slave_xmit(struct sk_buff *skb, struct device *dev)
377
{
378
        equalizer_t *eql = (equalizer_t *) dev->priv;
379
        struct device *slave_dev = 0;
380
        slave_t *slave;
381
 
382
        if (skb == NULL)
383
                return 0;
384
 
385
#if 0
386
        /* Make a copy we can free so we don't mess up the skb->dev pointer */
387
        skb2 = skb_clone(skb, GFP_ATOMIC);
388
 
389
        if (skb2 == NULL)
390
                return 1;
391
#endif
392
 
393
        eql_schedule_slaves (eql->queue);
394
 
395
        slave = eql_best_slave (eql->queue);
396
        slave_dev = slave ? slave->dev : 0;
397
 
398
        if ( slave_dev != 0 )
399
        {
400
#ifdef EQL_DEBUG
401
                if (eql_debug >= 100)
402
                        printk ("%s: %d slaves xmitng %ld B %s\n",
403
                                dev->name, eql_number_slaves (eql->queue), skb->len,
404
                                slave_dev->name);
405
#endif
406
 
407
                /* Rip off the fake header */
408
                skb_pull(skb,MAX_HEADER);
409
 
410
                /* The original code had no hard header constructed.
411
                 * If a frame is fragmented on EQL and then passed to PPP,
412
                 * or ISDN, the result will be a panic.
413
                 * The solution is to call the hard_header constructor
414
                 * for the device we point to just before we send the packet.
415
                 * If this fails we drop the packet.
416
                 * We don't know any special parameters for the hard_header
417
                 * constructor at this point, so we pass in made up values
418
                 * that will cause the constructor to fail on every device
419
                 * except those that we are allowed to use EQL on:
420
                 * PPP, SLIP and ISDN (in some cases!).
421
                 * The worst thing that happens is if some fool
422
                 * configures EQL to enslave something that needs
423
                 * these parameters it throws out packets.
424
                 * This is not an issue for the things EQL is intended for
425
                 * anyway, and probably would have crashed the kernel
426
                 * or sent garbage down the wire previously.
427
                 */
428
 
429
                if (slave_dev->hard_header == NULL
430
                || slave_dev->hard_header(skb,slave_dev,
431
                        ETH_P_IP,NULL,NULL,skb->len) >= 0) {
432
                        slave->bytes_queued += skb->len;
433
                        dev_queue_xmit (skb, slave_dev, 1);
434
                        eql->stats->tx_packets++;
435
                        /* dev_kfree_skb(skb, FREE_WRITE); */
436
                        return 0;
437
                }
438
        }
439
 
440
        /*
441
         *      The alternative for this is the return 1 and have
442
         *      dev_queue_xmit just queue it up on the eql's queue.
443
         */
444
 
445
        eql->stats->tx_dropped++;
446
        /* dev_kfree_skb(skb2, FREE_WRITE); */
447
        dev_kfree_skb(skb, FREE_WRITE);
448
        return 0;
449
}
450
 
451
 
452
static struct enet_statistics * eql_get_stats(struct device *dev)
453
{
454
        equalizer_t *eql = (equalizer_t *) dev->priv;
455
        return eql->stats;
456
}
457
 
458
 
459
static int  eql_header(struct sk_buff *skb, struct device *dev,
460
           unsigned short type, void *daddr, void *saddr,
461
           unsigned len)
462
{
463
        /* Fake header to keep space during buggy IP fragmentation.  */
464
        skb_push(skb,MAX_HEADER);
465
        return MAX_HEADER;
466
}
467
 
468
 
469
static int eql_rebuild_header(void *buff, struct device *dev,
470
                   unsigned long raddr, struct sk_buff *skb)
471
{
472
        return 0;
473
}
474
 
475
/*
476
 *      Private ioctl functions
477
 */
478
 
479
static int eql_enslave(struct device *dev, slaving_request_t *srqp)
480
{
481
        struct device *master_dev;
482
        struct device *slave_dev;
483
        slaving_request_t srq;
484
        int err;
485
 
486
        err = verify_area(VERIFY_READ, (void *)srqp, sizeof (slaving_request_t));
487
        if (err)
488
          {
489
#ifdef EQL_DEBUG
490
        if (eql_debug >= 20)
491
                printk ("EQL enslave: error detected by verify_area\n");
492
#endif  
493
                return err;
494
          }
495
        memcpy_fromfs (&srq, srqp, sizeof (slaving_request_t));
496
 
497
#ifdef EQL_DEBUG
498
        if (eql_debug >= 20)
499
                printk ("%s: enslave '%s' %ld bps\n", dev->name,
500
                        srq.slave_name, srq.priority);
501
#endif  
502
        master_dev = dev;               /* for "clarity" */
503
        slave_dev  = dev_get (srq.slave_name);
504
 
505
        if (master_dev != 0 && slave_dev != 0)
506
        {
507
                if ((master_dev->flags & IFF_UP) == IFF_UP)
508
                {
509
                        /*slave is not a master & not already a slave:*/
510
                        if (! eql_is_master (slave_dev)  &&
511
                            ! eql_is_slave (slave_dev) )
512
                        {
513
                                slave_t *s = eql_new_slave ();
514
                                equalizer_t *eql =
515
                                        (equalizer_t *) master_dev->priv;
516
                                s->dev = slave_dev;
517
                                s->priority = srq.priority;
518
                                s->priority_bps = srq.priority;
519
                                s->priority_Bps = srq.priority / 8;
520
                                slave_dev->flags |= IFF_SLAVE;
521
                                eql_insert_slave (eql->queue, s);
522
                                return 0;
523
                        }
524
#ifdef EQL_DEBUG
525
                        else if (eql_debug >= 20)
526
                                printk ("EQL enslave: slave is master or slave is already slave\n");
527
#endif  
528
                }
529
#ifdef EQL_DEBUG
530
                else if (eql_debug >= 20)
531
                        printk ("EQL enslave: master device not up!\n");
532
#endif  
533
        }
534
#ifdef EQL_DEBUG
535
        else if (eql_debug >= 20)
536
                printk ("EQL enslave: master or slave are NULL");
537
#endif  
538
        return -EINVAL;
539
}
540
 
541
static int eql_emancipate(struct device *dev, slaving_request_t *srqp)
542
{
543
        struct device *master_dev;
544
        struct device *slave_dev;
545
        slaving_request_t srq;
546
        int err;
547
 
548
        err = verify_area(VERIFY_READ, (void *)srqp, sizeof (slaving_request_t));
549
        if (err)
550
                return err;
551
 
552
        memcpy_fromfs (&srq, srqp, sizeof (slaving_request_t));
553
#ifdef EQL_DEBUG
554
        if (eql_debug >= 20)
555
                printk ("%s: emancipate `%s`\n", dev->name, srq.slave_name);
556
#endif
557
        master_dev = dev;               /* for "clarity" */
558
        slave_dev  = dev_get (srq.slave_name);
559
 
560
        if ( eql_is_slave (slave_dev) ) /* really is a slave */
561
        {
562
                equalizer_t *eql = (equalizer_t *) master_dev->priv;
563
                slave_dev->flags = slave_dev->flags & ~IFF_SLAVE;
564
                eql_remove_slave_dev (eql->queue, slave_dev);
565
                return 0;
566
        }
567
        return -EINVAL;
568
}
569
 
570
 
571
static int eql_g_slave_cfg(struct device *dev, slave_config_t *scp)
572
{
573
        slave_t *slave;
574
        equalizer_t *eql;
575
        struct device *slave_dev;
576
        slave_config_t sc;
577
        int err;
578
 
579
        err = verify_area(VERIFY_READ, (void *)scp, sizeof (slave_config_t));
580
        if (err)
581
                return err;
582
 
583
        memcpy_fromfs (&sc, scp, sizeof (slave_config_t));
584
#ifdef EQL_DEBUG
585
        if (eql_debug >= 20)
586
                printk ("%s: get config for slave `%s'\n", dev->name, sc.slave_name);
587
#endif
588
        eql = (equalizer_t *) dev->priv;
589
        slave_dev = dev_get (sc.slave_name);
590
 
591
        if ( eql_is_slave (slave_dev) )
592
        {
593
                slave = eql_find_slave_dev (eql->queue,  slave_dev);
594
                if (slave != 0)
595
                {
596
                        sc.priority = slave->priority;
597
                        err = verify_area(VERIFY_WRITE, (void *)scp, sizeof (slave_config_t));
598
                        if (err)
599
                                return err;
600
                        memcpy_tofs (scp, &sc, sizeof (slave_config_t));
601
                        return 0;
602
                }
603
        }
604
        return -EINVAL;
605
}
606
 
607
 
608
static int eql_s_slave_cfg(struct device *dev, slave_config_t *scp)
609
{
610
        slave_t *slave;
611
        equalizer_t *eql;
612
        struct device *slave_dev;
613
        slave_config_t sc;
614
        int err;
615
 
616
        err = verify_area(VERIFY_READ, (void *)scp, sizeof (slave_config_t));
617
        if (err)
618
                return err;
619
 
620
#ifdef EQL_DEBUG
621
        if (eql_debug >= 20)
622
                printk ("%s: set config for slave `%s'\n", dev->name, sc.slave_name);
623
#endif
624
 
625
        memcpy_fromfs (&sc, scp, sizeof (slave_config_t));
626
 
627
        eql = (equalizer_t *) dev->priv;
628
        slave_dev = dev_get (sc.slave_name);
629
 
630
        if ( eql_is_slave (slave_dev) )
631
        {
632
                slave = eql_find_slave_dev (eql->queue, slave_dev);
633
                if (slave != 0)
634
                {
635
                        slave->priority = sc.priority;
636
                        slave->priority_bps = sc.priority;
637
                        slave->priority_Bps = sc.priority / 8;
638
                        return 0;
639
                }
640
        }
641
        return -EINVAL;
642
}
643
 
644
 
645
static int eql_g_master_cfg(struct device *dev, master_config_t *mcp)
646
{
647
        equalizer_t *eql;
648
        master_config_t mc;
649
 
650
#if EQL_DEBUG
651
        if (eql_debug >= 20)
652
                printk ("%s: get master config\n", dev->name);
653
#endif
654
 
655
        if ( eql_is_master (dev) )
656
        {
657
                int err;
658
                err = verify_area(VERIFY_WRITE, (void *)mcp, sizeof (master_config_t));
659
                if (err)
660
                        return err;
661
                eql = (equalizer_t *) dev->priv;
662
                mc.max_slaves = eql->max_slaves;
663
                mc.min_slaves = eql->min_slaves;
664
                memcpy_tofs (mcp, &mc, sizeof (master_config_t));
665
                return 0;
666
        }
667
        return -EINVAL;
668
}
669
 
670
 
671
static int eql_s_master_cfg(struct device *dev, master_config_t *mcp)
672
{
673
        equalizer_t *eql;
674
        master_config_t mc;
675
        int err;
676
 
677
        err = verify_area(VERIFY_READ, (void *)mcp, sizeof (master_config_t));
678
        if (err)
679
                return err;
680
#if EQL_DEBUG
681
        if (eql_debug >= 20)
682
                printk ("%s: set master config\n", dev->name);
683
#endif
684
        memcpy_fromfs (&mc, mcp, sizeof (master_config_t));
685
        if ( eql_is_master (dev) )
686
        {
687
                eql = (equalizer_t *) dev->priv;
688
                eql->max_slaves = mc.max_slaves;
689
                eql->min_slaves = mc.min_slaves;
690
                return 0;
691
        }
692
        return -EINVAL;
693
}
694
 
695
/*
696
 *      Private device support functions
697
 */
698
 
699
static inline int eql_is_slave(struct device *dev)
700
{
701
        if (dev)
702
        {
703
                if ((dev->flags & IFF_SLAVE) == IFF_SLAVE)
704
                        return 1;
705
        }
706
        return 0;
707
}
708
 
709
 
710
static inline int eql_is_master(struct device *dev)
711
{
712
        if (dev)
713
        {
714
                if ((dev->flags & IFF_MASTER) == IFF_MASTER)
715
                return 1;
716
        }
717
        return 0;
718
}
719
 
720
 
721
static slave_t *eql_new_slave(void)
722
{
723
        slave_t *slave;
724
 
725
        slave = (slave_t *) kmalloc (sizeof (slave_t), GFP_KERNEL);
726
        if (slave)
727
        {
728
                memset(slave, 0, sizeof (slave_t));
729
                return slave;
730
        }
731
        return 0;
732
}
733
 
734
 
735
static void eql_delete_slave(slave_t *slave)
736
{
737
        kfree (slave);
738
}
739
 
740
 
741
#if 0                           /* not currently used, will be used
742
                                   when we really use a priority queue */
743
static long slave_Bps(slave_t *slave)
744
{
745
        return (slave->priority_Bps);
746
}
747
 
748
static long slave_bps(slave_t *slave)
749
{
750
        return (slave->priority_bps);
751
}
752
 
753
#endif
754
 
755
static inline int eql_number_slaves(slave_queue_t *queue)
756
{
757
        return queue->num_slaves;
758
}
759
 
760
static inline int eql_is_empty(slave_queue_t *queue)
761
{
762
        if (eql_number_slaves (queue) == 0)
763
                return 1;
764
        return 0;
765
}
766
 
767
static inline int eql_is_full(slave_queue_t *queue)
768
{
769
        equalizer_t *eql = (equalizer_t *) queue->master_dev->priv;
770
 
771
        if (eql_number_slaves (queue) == eql->max_slaves)
772
                return 1;
773
        return 0;
774
}
775
 
776
static slave_queue_t *eql_new_slave_queue(struct device *dev)
777
{
778
        slave_queue_t *queue;
779
        slave_t *head_slave;
780
        slave_t *tail_slave;
781
 
782
        queue = (slave_queue_t *) kmalloc (sizeof (slave_queue_t), GFP_KERNEL);
783
        if (queue == NULL)
784
                return 0;
785
        memset (queue, 0, sizeof (slave_queue_t));
786
        head_slave = eql_new_slave ();
787
        tail_slave = eql_new_slave ();
788
 
789
        if ( head_slave != 0 &&
790
                tail_slave != 0 )
791
        {
792
                head_slave->next = tail_slave;
793
                tail_slave->next = 0;
794
                queue->head = head_slave;
795
                queue->num_slaves = 0;
796
                queue->master_dev = dev;
797
        }
798
        else
799
        {
800
                if (head_slave)
801
                        kfree(head_slave);
802
                if (tail_slave)
803
                        kfree(tail_slave);
804
                kfree (queue);
805
                return 0;
806
        }
807
        return queue;
808
}
809
 
810
 
811
static void eql_delete_slave_queue(slave_queue_t *queue)
812
{
813
        slave_t *zapped;
814
        /*
815
         *      This should only be called when there isn't a
816
         *      timer running that scans the data periodically..
817
         *      dev_close stops the timer...
818
         */
819
 
820
        while ( ! eql_is_empty (queue) )
821
        {
822
                zapped = eql_remove_slave (queue, queue->head->next);
823
                eql_delete_slave (zapped);
824
        }
825
        kfree (queue->head->next);
826
        kfree (queue->head);
827
        kfree (queue);
828
}
829
 
830
static int eql_insert_slave(slave_queue_t *queue, slave_t *slave)
831
{
832
        cli ();
833
 
834
        if ( ! eql_is_full (queue) )
835
        {
836
                slave_t *duplicate_slave = 0;
837
                duplicate_slave = eql_find_slave_dev (queue, slave->dev);
838
                if (duplicate_slave != 0)
839
                {
840
/*                        printk ("%s: found a duplicate, killing it and replacing\n",
841
                                  queue->master_dev->name); */
842
                        eql_delete_slave (eql_remove_slave (queue, duplicate_slave));
843
                }
844
                slave->next = queue->head->next;
845
                queue->head->next = slave;
846
                queue->num_slaves++;
847
                sti ();
848
                return 0;
849
        }
850
        sti ();
851
        return 1;
852
}
853
 
854
 
855
static slave_t *eql_remove_slave(slave_queue_t *queue, slave_t *slave)
856
{
857
        slave_t *prev;
858
        slave_t *curr;
859
 
860
        cli ();
861
 
862
        prev = queue->head;
863
        curr = queue->head->next;
864
        while (curr != slave &&
865
                curr->dev != 0 )
866
        {
867
/*              printk ("%s: remove_slave; searching...\n", queue->master_dev->name); */
868
                prev = curr;
869
                curr = curr->next;
870
        }
871
 
872
        if (curr == slave)
873
        {
874
                prev->next = curr->next;
875
                queue->num_slaves--;
876
                curr->dev->flags = curr->dev->flags & ~IFF_SLAVE;
877
                sti();
878
                return curr;
879
        }
880
        sti ();
881
        return 0;                        /* not found */
882
}
883
 
884
 
885
static int eql_remove_slave_dev(slave_queue_t *queue, struct device *dev)
886
{
887
        slave_t *prev;
888
        slave_t *curr;
889
        slave_t *target;
890
 
891
        target = eql_find_slave_dev (queue, dev);
892
 
893
        if (target != 0)
894
        {
895
                cli ();
896
                prev = queue->head;
897
                curr = prev->next;
898
                while (curr != target)
899
                {
900
                        prev = curr;
901
                        curr = curr->next;
902
                }
903
                prev->next = curr->next;
904
                queue->num_slaves--;
905
                sti ();
906
                eql_delete_slave (curr);
907
                return 0;
908
        }
909
        return 1;
910
}
911
 
912
 
913
static inline struct device *eql_best_slave_dev(slave_queue_t *queue)
914
{
915
        if (queue->best_slave != 0)
916
        {
917
                if (queue->best_slave->dev != 0)
918
                        return queue->best_slave->dev;
919
                else
920
                        return 0;
921
        }
922
        else
923
                return 0;
924
}
925
 
926
 
927
static inline slave_t *eql_best_slave(slave_queue_t *queue)
928
{
929
        return queue->best_slave;
930
}
931
 
932
static inline void eql_schedule_slaves(slave_queue_t *queue)
933
{
934
        struct device *master_dev = queue->master_dev;
935
        slave_t *best_slave = 0;
936
        slave_t *slave_corpse = 0;
937
 
938
#ifdef EQL_DEBUG
939
        if (eql_debug >= 100)
940
                printk ("%s: schedule %d slaves\n",
941
                        master_dev->name, eql_number_slaves (queue));
942
#endif
943
        if ( eql_is_empty (queue) )
944
        {
945
                /*
946
                 *      No slaves to play with
947
                 */
948
                eql_set_best_slave (queue, (slave_t *) 0);
949
                return;
950
        }
951
        else
952
        {
953
                /*
954
                 *      Make a pass to set the best slave
955
                 */
956
                unsigned long best_load = (unsigned long) ULONG_MAX;
957
                slave_t *slave = 0;
958
                int i;
959
 
960
                cli ();
961
                for (i = 1, slave = eql_first_slave (queue);
962
                        i <= eql_number_slaves (queue);
963
                        i++, slave = eql_next_slave (queue, slave))
964
                {
965
                        /*
966
                         *      Go through the slave list once, updating best_slave
967
                         *      whenever a new best_load is found, whenever a dead
968
                         *      slave is found, it is marked to be pulled out of the
969
                         *      queue
970
                         */
971
 
972
                        unsigned long slave_load;
973
                        unsigned long bytes_queued;
974
                        unsigned long priority_Bps;
975
 
976
                        if (slave != 0)
977
                        {
978
                                bytes_queued = slave->bytes_queued;
979
                                priority_Bps = slave->priority_Bps;
980
                                if ( slave->dev != 0)
981
                                {
982
                                        if ((slave->dev->flags & IFF_UP) == IFF_UP )
983
                                        {
984
                                                slave_load = (ULONG_MAX - (ULONG_MAX / 2)) -
985
                                                        (priority_Bps) + bytes_queued * 8;
986
 
987
                                                if (slave_load < best_load)
988
                                                {
989
                                                        best_load = slave_load;
990
                                                        best_slave = slave;
991
                                                }
992
                                        }
993
                                        else            /* we found a dead slave */
994
                                        {
995
                                                /*
996
                                                 *      We only bury one slave at a time, if more than
997
                                                 *      one slave dies, we will bury him on the next
998
                                                 *      reschedule. slaves don't die all at once that
999
                                                 *      much anyway
1000
                                                 */
1001
                                                slave_corpse = slave;
1002
                                        }
1003
                                }
1004
                        }
1005
                } /* for */
1006
                sti ();
1007
                eql_set_best_slave (queue, best_slave);
1008
        } /* else */
1009
        if (slave_corpse != 0)
1010
        {
1011
                printk ("eql: scheduler found dead slave, burying...\n");
1012
                eql_delete_slave (eql_remove_slave (queue, slave_corpse));
1013
        }
1014
        return;
1015
}
1016
 
1017
 
1018
static slave_t * eql_find_slave_dev(slave_queue_t *queue, struct device *dev)
1019
{
1020
        slave_t *slave = 0;
1021
        slave = eql_first_slave(queue);
1022
 
1023
        while (slave != 0 && slave->dev != dev && slave != 0)
1024
        {
1025
#if 0
1026
                if (slave->dev != 0)
1027
                        printk ("eql: find_slave_dev; looked at '%s'...\n", slave->dev->name);
1028
                else
1029
                        printk ("eql: find_slave_dev; looked at nothing...\n");
1030
#endif
1031
                slave = slave->next;
1032
        }
1033
        return slave;
1034
}
1035
 
1036
 
1037
static inline slave_t *eql_first_slave(slave_queue_t *queue)
1038
{
1039
        return queue->head->next;
1040
}
1041
 
1042
 
1043
static inline slave_t *eql_next_slave(slave_queue_t *queue, slave_t *slave)
1044
{
1045
        return slave->next;
1046
}
1047
 
1048
static inline void eql_set_best_slave(slave_queue_t *queue, slave_t *slave)
1049
{
1050
        queue->best_slave = slave;
1051
}
1052
 
1053
static void eql_timer(unsigned long param)
1054
{
1055
        equalizer_t *eql = (equalizer_t *) param;
1056
        slave_t *slave;
1057
        slave_t *slave_corpse = 0;
1058
        int i;
1059
 
1060
        if ( ! eql_is_empty (eql->queue) )
1061
        {
1062
                cli ();
1063
                for (i = 1, slave = eql_first_slave (eql->queue);
1064
                        i <= eql_number_slaves (eql->queue);
1065
                        i++, slave = eql_next_slave (eql->queue, slave))
1066
                {
1067
                        if (slave != 0)
1068
                        {
1069
                                if ((slave->dev->flags & IFF_UP) == IFF_UP )
1070
                                {
1071
                                        slave->bytes_queued -= slave->priority_Bps;
1072
                                        if (slave->bytes_queued < 0)
1073
                                                slave->bytes_queued = 0;
1074
                                }
1075
                                else
1076
                                        slave_corpse = slave;
1077
                        }
1078
                }
1079
                sti ();
1080
                if (slave_corpse != 0)
1081
                {
1082
                        printk ("eql: timer found dead slave, burying...\n");
1083
                        eql_delete_slave (eql_remove_slave (eql->queue, slave_corpse));
1084
                }
1085
        }
1086
 
1087
        if (eql->timer_on != 0)
1088
        {
1089
                eql->timer.expires = jiffies+EQL_DEFAULT_RESCHED_IVAL;
1090
                add_timer (&eql->timer);
1091
        }
1092
}
1093
 
1094
#ifdef MODULE
1095
static struct device dev_eql =
1096
{
1097
        "eql", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, eql_init
1098
};
1099
 
1100
int init_module(void)
1101
{
1102
        if (register_netdev(&dev_eql) != 0) {
1103
                printk("eql: register_netdev() returned non-zero.\n");
1104
                return -EIO;
1105
        }
1106
        return 0;
1107
}
1108
 
1109
void cleanup_module(void)
1110
{
1111
        unregister_netdev(&dev_eql);
1112
}
1113
#endif /* MODULE */
1114
 
1115
/*
1116
 * Local Variables:
1117
 * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c eql.c"
1118
 * version-control: t
1119
 * kept-new-versions: 20
1120
 * End:
1121
 */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.