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

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [iseries_veth.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/* File veth.c created by Kyle A. Lucke on Mon Aug  7 2000. */
2
/*
3
 * IBM eServer iSeries Virtual Ethernet Device Driver
4
 * Copyright (C) 2001 Kyle A. Lucke (klucke@us.ibm.com), IBM Corp.
5
 * Substantially cleaned up by:
6
 * Copyright (C) 2003 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
7
 * Copyright (C) 2004-2005 Michael Ellerman, IBM Corporation.
8
 *
9
 * This program is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU General Public License as
11
 * published by the Free Software Foundation; either version 2 of the
12
 * License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful, but
15
 * WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17
 * General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
22
 * USA
23
 *
24
 *
25
 * This module implements the virtual ethernet device for iSeries LPAR
26
 * Linux.  It uses hypervisor message passing to implement an
27
 * ethernet-like network device communicating between partitions on
28
 * the iSeries.
29
 *
30
 * The iSeries LPAR hypervisor currently allows for up to 16 different
31
 * virtual ethernets.  These are all dynamically configurable on
32
 * OS/400 partitions, but dynamic configuration is not supported under
33
 * Linux yet.  An ethXX network device will be created for each
34
 * virtual ethernet this partition is connected to.
35
 *
36
 * - This driver is responsible for routing packets to and from other
37
 *   partitions.  The MAC addresses used by the virtual ethernets
38
 *   contains meaning and must not be modified.
39
 *
40
 * - Having 2 virtual ethernets to the same remote partition DOES NOT
41
 *   double the available bandwidth.  The 2 devices will share the
42
 *   available hypervisor bandwidth.
43
 *
44
 * - If you send a packet to your own mac address, it will just be
45
 *   dropped, you won't get it on the receive side.
46
 *
47
 * - Multicast is implemented by sending the frame frame to every
48
 *   other partition.  It is the responsibility of the receiving
49
 *   partition to filter the addresses desired.
50
 *
51
 * Tunable parameters:
52
 *
53
 * VETH_NUMBUFFERS: This compile time option defaults to 120.  It
54
 * controls how much memory Linux will allocate per remote partition
55
 * it is communicating with.  It can be thought of as the maximum
56
 * number of packets outstanding to a remote partition at a time.
57
 */
58
 
59
#include <linux/module.h>
60
#include <linux/types.h>
61
#include <linux/errno.h>
62
#include <linux/ioport.h>
63
#include <linux/kernel.h>
64
#include <linux/netdevice.h>
65
#include <linux/etherdevice.h>
66
#include <linux/skbuff.h>
67
#include <linux/init.h>
68
#include <linux/delay.h>
69
#include <linux/mm.h>
70
#include <linux/ethtool.h>
71
#include <linux/if_ether.h>
72
 
73
#include <asm/abs_addr.h>
74
#include <asm/iseries/mf.h>
75
#include <asm/uaccess.h>
76
#include <asm/firmware.h>
77
#include <asm/iseries/hv_lp_config.h>
78
#include <asm/iseries/hv_types.h>
79
#include <asm/iseries/hv_lp_event.h>
80
#include <asm/iommu.h>
81
#include <asm/vio.h>
82
 
83
#undef DEBUG
84
 
85
MODULE_AUTHOR("Kyle Lucke <klucke@us.ibm.com>");
86
MODULE_DESCRIPTION("iSeries Virtual ethernet driver");
87
MODULE_LICENSE("GPL");
88
 
89
#define VETH_EVENT_CAP  (0)
90
#define VETH_EVENT_FRAMES       (1)
91
#define VETH_EVENT_MONITOR      (2)
92
#define VETH_EVENT_FRAMES_ACK   (3)
93
 
94
#define VETH_MAX_ACKS_PER_MSG   (20)
95
#define VETH_MAX_FRAMES_PER_MSG (6)
96
 
97
struct veth_frames_data {
98
        u32 addr[VETH_MAX_FRAMES_PER_MSG];
99
        u16 len[VETH_MAX_FRAMES_PER_MSG];
100
        u32 eofmask;
101
};
102
#define VETH_EOF_SHIFT          (32-VETH_MAX_FRAMES_PER_MSG)
103
 
104
struct veth_frames_ack_data {
105
        u16 token[VETH_MAX_ACKS_PER_MSG];
106
};
107
 
108
struct veth_cap_data {
109
        u8 caps_version;
110
        u8 rsvd1;
111
        u16 num_buffers;
112
        u16 ack_threshold;
113
        u16 rsvd2;
114
        u32 ack_timeout;
115
        u32 rsvd3;
116
        u64 rsvd4[3];
117
};
118
 
119
struct veth_lpevent {
120
        struct HvLpEvent base_event;
121
        union {
122
                struct veth_cap_data caps_data;
123
                struct veth_frames_data frames_data;
124
                struct veth_frames_ack_data frames_ack_data;
125
        } u;
126
 
127
};
128
 
129
#define DRV_NAME        "iseries_veth"
130
#define DRV_VERSION     "2.0"
131
 
132
#define VETH_NUMBUFFERS         (120)
133
#define VETH_ACKTIMEOUT         (1000000) /* microseconds */
134
#define VETH_MAX_MCAST          (12)
135
 
136
#define VETH_MAX_MTU            (9000)
137
 
138
#if VETH_NUMBUFFERS < 10
139
#define ACK_THRESHOLD           (1)
140
#elif VETH_NUMBUFFERS < 20
141
#define ACK_THRESHOLD           (4)
142
#elif VETH_NUMBUFFERS < 40
143
#define ACK_THRESHOLD           (10)
144
#else
145
#define ACK_THRESHOLD           (20)
146
#endif
147
 
148
#define VETH_STATE_SHUTDOWN     (0x0001)
149
#define VETH_STATE_OPEN         (0x0002)
150
#define VETH_STATE_RESET        (0x0004)
151
#define VETH_STATE_SENTMON      (0x0008)
152
#define VETH_STATE_SENTCAPS     (0x0010)
153
#define VETH_STATE_GOTCAPACK    (0x0020)
154
#define VETH_STATE_GOTCAPS      (0x0040)
155
#define VETH_STATE_SENTCAPACK   (0x0080)
156
#define VETH_STATE_READY        (0x0100)
157
 
158
struct veth_msg {
159
        struct veth_msg *next;
160
        struct veth_frames_data data;
161
        int token;
162
        int in_use;
163
        struct sk_buff *skb;
164
        struct device *dev;
165
};
166
 
167
struct veth_lpar_connection {
168
        HvLpIndex remote_lp;
169
        struct delayed_work statemachine_wq;
170
        struct veth_msg *msgs;
171
        int num_events;
172
        struct veth_cap_data local_caps;
173
 
174
        struct kobject kobject;
175
        struct timer_list ack_timer;
176
 
177
        struct timer_list reset_timer;
178
        unsigned int reset_timeout;
179
        unsigned long last_contact;
180
        int outstanding_tx;
181
 
182
        spinlock_t lock;
183
        unsigned long state;
184
        HvLpInstanceId src_inst;
185
        HvLpInstanceId dst_inst;
186
        struct veth_lpevent cap_event, cap_ack_event;
187
        u16 pending_acks[VETH_MAX_ACKS_PER_MSG];
188
        u32 num_pending_acks;
189
 
190
        int num_ack_events;
191
        struct veth_cap_data remote_caps;
192
        u32 ack_timeout;
193
 
194
        struct veth_msg *msg_stack_head;
195
};
196
 
197
struct veth_port {
198
        struct device *dev;
199
        u64 mac_addr;
200
        HvLpIndexMap lpar_map;
201
 
202
        /* queue_lock protects the stopped_map and dev's queue. */
203
        spinlock_t queue_lock;
204
        HvLpIndexMap stopped_map;
205
 
206
        /* mcast_gate protects promiscuous, num_mcast & mcast_addr. */
207
        rwlock_t mcast_gate;
208
        int promiscuous;
209
        int num_mcast;
210
        u64 mcast_addr[VETH_MAX_MCAST];
211
 
212
        struct kobject kobject;
213
};
214
 
215
static HvLpIndex this_lp;
216
static struct veth_lpar_connection *veth_cnx[HVMAXARCHITECTEDLPS]; /* = 0 */
217
static struct net_device *veth_dev[HVMAXARCHITECTEDVIRTUALLANS]; /* = 0 */
218
 
219
static int veth_start_xmit(struct sk_buff *skb, struct net_device *dev);
220
static void veth_recycle_msg(struct veth_lpar_connection *, struct veth_msg *);
221
static void veth_wake_queues(struct veth_lpar_connection *cnx);
222
static void veth_stop_queues(struct veth_lpar_connection *cnx);
223
static void veth_receive(struct veth_lpar_connection *, struct veth_lpevent *);
224
static void veth_release_connection(struct kobject *kobject);
225
static void veth_timed_ack(unsigned long ptr);
226
static void veth_timed_reset(unsigned long ptr);
227
 
228
/*
229
 * Utility functions
230
 */
231
 
232
#define veth_info(fmt, args...) \
233
        printk(KERN_INFO DRV_NAME ": " fmt, ## args)
234
 
235
#define veth_error(fmt, args...) \
236
        printk(KERN_ERR DRV_NAME ": Error: " fmt, ## args)
237
 
238
#ifdef DEBUG
239
#define veth_debug(fmt, args...) \
240
        printk(KERN_DEBUG DRV_NAME ": " fmt, ## args)
241
#else
242
#define veth_debug(fmt, args...) do {} while (0)
243
#endif
244
 
245
/* You must hold the connection's lock when you call this function. */
246
static inline void veth_stack_push(struct veth_lpar_connection *cnx,
247
                                   struct veth_msg *msg)
248
{
249
        msg->next = cnx->msg_stack_head;
250
        cnx->msg_stack_head = msg;
251
}
252
 
253
/* You must hold the connection's lock when you call this function. */
254
static inline struct veth_msg *veth_stack_pop(struct veth_lpar_connection *cnx)
255
{
256
        struct veth_msg *msg;
257
 
258
        msg = cnx->msg_stack_head;
259
        if (msg)
260
                cnx->msg_stack_head = cnx->msg_stack_head->next;
261
 
262
        return msg;
263
}
264
 
265
/* You must hold the connection's lock when you call this function. */
266
static inline int veth_stack_is_empty(struct veth_lpar_connection *cnx)
267
{
268
        return cnx->msg_stack_head == NULL;
269
}
270
 
271
static inline HvLpEvent_Rc
272
veth_signalevent(struct veth_lpar_connection *cnx, u16 subtype,
273
                 HvLpEvent_AckInd ackind, HvLpEvent_AckType acktype,
274
                 u64 token,
275
                 u64 data1, u64 data2, u64 data3, u64 data4, u64 data5)
276
{
277
        return HvCallEvent_signalLpEventFast(cnx->remote_lp,
278
                                             HvLpEvent_Type_VirtualLan,
279
                                             subtype, ackind, acktype,
280
                                             cnx->src_inst,
281
                                             cnx->dst_inst,
282
                                             token, data1, data2, data3,
283
                                             data4, data5);
284
}
285
 
286
static inline HvLpEvent_Rc veth_signaldata(struct veth_lpar_connection *cnx,
287
                                           u16 subtype, u64 token, void *data)
288
{
289
        u64 *p = (u64 *) data;
290
 
291
        return veth_signalevent(cnx, subtype, HvLpEvent_AckInd_NoAck,
292
                                HvLpEvent_AckType_ImmediateAck,
293
                                token, p[0], p[1], p[2], p[3], p[4]);
294
}
295
 
296
struct veth_allocation {
297
        struct completion c;
298
        int num;
299
};
300
 
301
static void veth_complete_allocation(void *parm, int number)
302
{
303
        struct veth_allocation *vc = (struct veth_allocation *)parm;
304
 
305
        vc->num = number;
306
        complete(&vc->c);
307
}
308
 
309
static int veth_allocate_events(HvLpIndex rlp, int number)
310
{
311
        struct veth_allocation vc = { COMPLETION_INITIALIZER(vc.c), 0 };
312
 
313
        mf_allocate_lp_events(rlp, HvLpEvent_Type_VirtualLan,
314
                            sizeof(struct veth_lpevent), number,
315
                            &veth_complete_allocation, &vc);
316
        wait_for_completion(&vc.c);
317
 
318
        return vc.num;
319
}
320
 
321
/*
322
 * sysfs support
323
 */
324
 
325
struct veth_cnx_attribute {
326
        struct attribute attr;
327
        ssize_t (*show)(struct veth_lpar_connection *, char *buf);
328
        ssize_t (*store)(struct veth_lpar_connection *, const char *buf);
329
};
330
 
331
static ssize_t veth_cnx_attribute_show(struct kobject *kobj,
332
                struct attribute *attr, char *buf)
333
{
334
        struct veth_cnx_attribute *cnx_attr;
335
        struct veth_lpar_connection *cnx;
336
 
337
        cnx_attr = container_of(attr, struct veth_cnx_attribute, attr);
338
        cnx = container_of(kobj, struct veth_lpar_connection, kobject);
339
 
340
        if (!cnx_attr->show)
341
                return -EIO;
342
 
343
        return cnx_attr->show(cnx, buf);
344
}
345
 
346
#define CUSTOM_CNX_ATTR(_name, _format, _expression)                    \
347
static ssize_t _name##_show(struct veth_lpar_connection *cnx, char *buf)\
348
{                                                                       \
349
        return sprintf(buf, _format, _expression);                      \
350
}                                                                       \
351
struct veth_cnx_attribute veth_cnx_attr_##_name = __ATTR_RO(_name)
352
 
353
#define SIMPLE_CNX_ATTR(_name)  \
354
        CUSTOM_CNX_ATTR(_name, "%lu\n", (unsigned long)cnx->_name)
355
 
356
SIMPLE_CNX_ATTR(outstanding_tx);
357
SIMPLE_CNX_ATTR(remote_lp);
358
SIMPLE_CNX_ATTR(num_events);
359
SIMPLE_CNX_ATTR(src_inst);
360
SIMPLE_CNX_ATTR(dst_inst);
361
SIMPLE_CNX_ATTR(num_pending_acks);
362
SIMPLE_CNX_ATTR(num_ack_events);
363
CUSTOM_CNX_ATTR(ack_timeout, "%d\n", jiffies_to_msecs(cnx->ack_timeout));
364
CUSTOM_CNX_ATTR(reset_timeout, "%d\n", jiffies_to_msecs(cnx->reset_timeout));
365
CUSTOM_CNX_ATTR(state, "0x%.4lX\n", cnx->state);
366
CUSTOM_CNX_ATTR(last_contact, "%d\n", cnx->last_contact ?
367
                jiffies_to_msecs(jiffies - cnx->last_contact) : 0);
368
 
369
#define GET_CNX_ATTR(_name)     (&veth_cnx_attr_##_name.attr)
370
 
371
static struct attribute *veth_cnx_default_attrs[] = {
372
        GET_CNX_ATTR(outstanding_tx),
373
        GET_CNX_ATTR(remote_lp),
374
        GET_CNX_ATTR(num_events),
375
        GET_CNX_ATTR(reset_timeout),
376
        GET_CNX_ATTR(last_contact),
377
        GET_CNX_ATTR(state),
378
        GET_CNX_ATTR(src_inst),
379
        GET_CNX_ATTR(dst_inst),
380
        GET_CNX_ATTR(num_pending_acks),
381
        GET_CNX_ATTR(num_ack_events),
382
        GET_CNX_ATTR(ack_timeout),
383
        NULL
384
};
385
 
386
static struct sysfs_ops veth_cnx_sysfs_ops = {
387
                .show = veth_cnx_attribute_show
388
};
389
 
390
static struct kobj_type veth_lpar_connection_ktype = {
391
        .release        = veth_release_connection,
392
        .sysfs_ops      = &veth_cnx_sysfs_ops,
393
        .default_attrs  = veth_cnx_default_attrs
394
};
395
 
396
struct veth_port_attribute {
397
        struct attribute attr;
398
        ssize_t (*show)(struct veth_port *, char *buf);
399
        ssize_t (*store)(struct veth_port *, const char *buf);
400
};
401
 
402
static ssize_t veth_port_attribute_show(struct kobject *kobj,
403
                struct attribute *attr, char *buf)
404
{
405
        struct veth_port_attribute *port_attr;
406
        struct veth_port *port;
407
 
408
        port_attr = container_of(attr, struct veth_port_attribute, attr);
409
        port = container_of(kobj, struct veth_port, kobject);
410
 
411
        if (!port_attr->show)
412
                return -EIO;
413
 
414
        return port_attr->show(port, buf);
415
}
416
 
417
#define CUSTOM_PORT_ATTR(_name, _format, _expression)                   \
418
static ssize_t _name##_show(struct veth_port *port, char *buf)          \
419
{                                                                       \
420
        return sprintf(buf, _format, _expression);                      \
421
}                                                                       \
422
struct veth_port_attribute veth_port_attr_##_name = __ATTR_RO(_name)
423
 
424
#define SIMPLE_PORT_ATTR(_name) \
425
        CUSTOM_PORT_ATTR(_name, "%lu\n", (unsigned long)port->_name)
426
 
427
SIMPLE_PORT_ATTR(promiscuous);
428
SIMPLE_PORT_ATTR(num_mcast);
429
CUSTOM_PORT_ATTR(lpar_map, "0x%X\n", port->lpar_map);
430
CUSTOM_PORT_ATTR(stopped_map, "0x%X\n", port->stopped_map);
431
CUSTOM_PORT_ATTR(mac_addr, "0x%lX\n", port->mac_addr);
432
 
433
#define GET_PORT_ATTR(_name)    (&veth_port_attr_##_name.attr)
434
static struct attribute *veth_port_default_attrs[] = {
435
        GET_PORT_ATTR(mac_addr),
436
        GET_PORT_ATTR(lpar_map),
437
        GET_PORT_ATTR(stopped_map),
438
        GET_PORT_ATTR(promiscuous),
439
        GET_PORT_ATTR(num_mcast),
440
        NULL
441
};
442
 
443
static struct sysfs_ops veth_port_sysfs_ops = {
444
        .show = veth_port_attribute_show
445
};
446
 
447
static struct kobj_type veth_port_ktype = {
448
        .sysfs_ops      = &veth_port_sysfs_ops,
449
        .default_attrs  = veth_port_default_attrs
450
};
451
 
452
/*
453
 * LPAR connection code
454
 */
455
 
456
static inline void veth_kick_statemachine(struct veth_lpar_connection *cnx)
457
{
458
        schedule_delayed_work(&cnx->statemachine_wq, 0);
459
}
460
 
461
static void veth_take_cap(struct veth_lpar_connection *cnx,
462
                          struct veth_lpevent *event)
463
{
464
        unsigned long flags;
465
 
466
        spin_lock_irqsave(&cnx->lock, flags);
467
        /* Receiving caps may mean the other end has just come up, so
468
         * we need to reload the instance ID of the far end */
469
        cnx->dst_inst =
470
                HvCallEvent_getTargetLpInstanceId(cnx->remote_lp,
471
                                                  HvLpEvent_Type_VirtualLan);
472
 
473
        if (cnx->state & VETH_STATE_GOTCAPS) {
474
                veth_error("Received a second capabilities from LPAR %d.\n",
475
                           cnx->remote_lp);
476
                event->base_event.xRc = HvLpEvent_Rc_BufferNotAvailable;
477
                HvCallEvent_ackLpEvent((struct HvLpEvent *) event);
478
        } else {
479
                memcpy(&cnx->cap_event, event, sizeof(cnx->cap_event));
480
                cnx->state |= VETH_STATE_GOTCAPS;
481
                veth_kick_statemachine(cnx);
482
        }
483
        spin_unlock_irqrestore(&cnx->lock, flags);
484
}
485
 
486
static void veth_take_cap_ack(struct veth_lpar_connection *cnx,
487
                              struct veth_lpevent *event)
488
{
489
        unsigned long flags;
490
 
491
        spin_lock_irqsave(&cnx->lock, flags);
492
        if (cnx->state & VETH_STATE_GOTCAPACK) {
493
                veth_error("Received a second capabilities ack from LPAR %d.\n",
494
                           cnx->remote_lp);
495
        } else {
496
                memcpy(&cnx->cap_ack_event, event,
497
                       sizeof(&cnx->cap_ack_event));
498
                cnx->state |= VETH_STATE_GOTCAPACK;
499
                veth_kick_statemachine(cnx);
500
        }
501
        spin_unlock_irqrestore(&cnx->lock, flags);
502
}
503
 
504
static void veth_take_monitor_ack(struct veth_lpar_connection *cnx,
505
                                  struct veth_lpevent *event)
506
{
507
        unsigned long flags;
508
 
509
        spin_lock_irqsave(&cnx->lock, flags);
510
        veth_debug("cnx %d: lost connection.\n", cnx->remote_lp);
511
 
512
        /* Avoid kicking the statemachine once we're shutdown.
513
         * It's unnecessary and it could break veth_stop_connection(). */
514
 
515
        if (! (cnx->state & VETH_STATE_SHUTDOWN)) {
516
                cnx->state |= VETH_STATE_RESET;
517
                veth_kick_statemachine(cnx);
518
        }
519
        spin_unlock_irqrestore(&cnx->lock, flags);
520
}
521
 
522
static void veth_handle_ack(struct veth_lpevent *event)
523
{
524
        HvLpIndex rlp = event->base_event.xTargetLp;
525
        struct veth_lpar_connection *cnx = veth_cnx[rlp];
526
 
527
        BUG_ON(! cnx);
528
 
529
        switch (event->base_event.xSubtype) {
530
        case VETH_EVENT_CAP:
531
                veth_take_cap_ack(cnx, event);
532
                break;
533
        case VETH_EVENT_MONITOR:
534
                veth_take_monitor_ack(cnx, event);
535
                break;
536
        default:
537
                veth_error("Unknown ack type %d from LPAR %d.\n",
538
                                event->base_event.xSubtype, rlp);
539
        };
540
}
541
 
542
static void veth_handle_int(struct veth_lpevent *event)
543
{
544
        HvLpIndex rlp = event->base_event.xSourceLp;
545
        struct veth_lpar_connection *cnx = veth_cnx[rlp];
546
        unsigned long flags;
547
        int i, acked = 0;
548
 
549
        BUG_ON(! cnx);
550
 
551
        switch (event->base_event.xSubtype) {
552
        case VETH_EVENT_CAP:
553
                veth_take_cap(cnx, event);
554
                break;
555
        case VETH_EVENT_MONITOR:
556
                /* do nothing... this'll hang out here til we're dead,
557
                 * and the hypervisor will return it for us. */
558
                break;
559
        case VETH_EVENT_FRAMES_ACK:
560
                spin_lock_irqsave(&cnx->lock, flags);
561
 
562
                for (i = 0; i < VETH_MAX_ACKS_PER_MSG; ++i) {
563
                        u16 msgnum = event->u.frames_ack_data.token[i];
564
 
565
                        if (msgnum < VETH_NUMBUFFERS) {
566
                                veth_recycle_msg(cnx, cnx->msgs + msgnum);
567
                                cnx->outstanding_tx--;
568
                                acked++;
569
                        }
570
                }
571
 
572
                if (acked > 0) {
573
                        cnx->last_contact = jiffies;
574
                        veth_wake_queues(cnx);
575
                }
576
 
577
                spin_unlock_irqrestore(&cnx->lock, flags);
578
                break;
579
        case VETH_EVENT_FRAMES:
580
                veth_receive(cnx, event);
581
                break;
582
        default:
583
                veth_error("Unknown interrupt type %d from LPAR %d.\n",
584
                                event->base_event.xSubtype, rlp);
585
        };
586
}
587
 
588
static void veth_handle_event(struct HvLpEvent *event)
589
{
590
        struct veth_lpevent *veth_event = (struct veth_lpevent *)event;
591
 
592
        if (hvlpevent_is_ack(event))
593
                veth_handle_ack(veth_event);
594
        else
595
                veth_handle_int(veth_event);
596
}
597
 
598
static int veth_process_caps(struct veth_lpar_connection *cnx)
599
{
600
        struct veth_cap_data *remote_caps = &cnx->remote_caps;
601
        int num_acks_needed;
602
 
603
        /* Convert timer to jiffies */
604
        cnx->ack_timeout = remote_caps->ack_timeout * HZ / 1000000;
605
 
606
        if ( (remote_caps->num_buffers == 0)
607
             || (remote_caps->ack_threshold > VETH_MAX_ACKS_PER_MSG)
608
             || (remote_caps->ack_threshold == 0)
609
             || (cnx->ack_timeout == 0) ) {
610
                veth_error("Received incompatible capabilities from LPAR %d.\n",
611
                                cnx->remote_lp);
612
                return HvLpEvent_Rc_InvalidSubtypeData;
613
        }
614
 
615
        num_acks_needed = (remote_caps->num_buffers
616
                           / remote_caps->ack_threshold) + 1;
617
 
618
        /* FIXME: locking on num_ack_events? */
619
        if (cnx->num_ack_events < num_acks_needed) {
620
                int num;
621
 
622
                num = veth_allocate_events(cnx->remote_lp,
623
                                           num_acks_needed-cnx->num_ack_events);
624
                if (num > 0)
625
                        cnx->num_ack_events += num;
626
 
627
                if (cnx->num_ack_events < num_acks_needed) {
628
                        veth_error("Couldn't allocate enough ack events "
629
                                        "for LPAR %d.\n", cnx->remote_lp);
630
 
631
                        return HvLpEvent_Rc_BufferNotAvailable;
632
                }
633
        }
634
 
635
 
636
        return HvLpEvent_Rc_Good;
637
}
638
 
639
/* FIXME: The gotos here are a bit dubious */
640
static void veth_statemachine(struct work_struct *work)
641
{
642
        struct veth_lpar_connection *cnx =
643
                container_of(work, struct veth_lpar_connection,
644
                             statemachine_wq.work);
645
        int rlp = cnx->remote_lp;
646
        int rc;
647
 
648
        spin_lock_irq(&cnx->lock);
649
 
650
 restart:
651
        if (cnx->state & VETH_STATE_RESET) {
652
                if (cnx->state & VETH_STATE_OPEN)
653
                        HvCallEvent_closeLpEventPath(cnx->remote_lp,
654
                                                     HvLpEvent_Type_VirtualLan);
655
 
656
                /*
657
                 * Reset ack data. This prevents the ack_timer actually
658
                 * doing anything, even if it runs one more time when
659
                 * we drop the lock below.
660
                 */
661
                memset(&cnx->pending_acks, 0xff, sizeof (cnx->pending_acks));
662
                cnx->num_pending_acks = 0;
663
 
664
                cnx->state &= ~(VETH_STATE_RESET | VETH_STATE_SENTMON
665
                                | VETH_STATE_OPEN | VETH_STATE_SENTCAPS
666
                                | VETH_STATE_GOTCAPACK | VETH_STATE_GOTCAPS
667
                                | VETH_STATE_SENTCAPACK | VETH_STATE_READY);
668
 
669
                /* Clean up any leftover messages */
670
                if (cnx->msgs) {
671
                        int i;
672
                        for (i = 0; i < VETH_NUMBUFFERS; ++i)
673
                                veth_recycle_msg(cnx, cnx->msgs + i);
674
                }
675
 
676
                cnx->outstanding_tx = 0;
677
                veth_wake_queues(cnx);
678
 
679
                /* Drop the lock so we can do stuff that might sleep or
680
                 * take other locks. */
681
                spin_unlock_irq(&cnx->lock);
682
 
683
                del_timer_sync(&cnx->ack_timer);
684
                del_timer_sync(&cnx->reset_timer);
685
 
686
                spin_lock_irq(&cnx->lock);
687
 
688
                if (cnx->state & VETH_STATE_RESET)
689
                        goto restart;
690
 
691
                /* Hack, wait for the other end to reset itself. */
692
                if (! (cnx->state & VETH_STATE_SHUTDOWN)) {
693
                        schedule_delayed_work(&cnx->statemachine_wq, 5 * HZ);
694
                        goto out;
695
                }
696
        }
697
 
698
        if (cnx->state & VETH_STATE_SHUTDOWN)
699
                /* It's all over, do nothing */
700
                goto out;
701
 
702
        if ( !(cnx->state & VETH_STATE_OPEN) ) {
703
                if (! cnx->msgs || (cnx->num_events < (2 + VETH_NUMBUFFERS)) )
704
                        goto cant_cope;
705
 
706
                HvCallEvent_openLpEventPath(rlp, HvLpEvent_Type_VirtualLan);
707
                cnx->src_inst =
708
                        HvCallEvent_getSourceLpInstanceId(rlp,
709
                                                          HvLpEvent_Type_VirtualLan);
710
                cnx->dst_inst =
711
                        HvCallEvent_getTargetLpInstanceId(rlp,
712
                                                          HvLpEvent_Type_VirtualLan);
713
                cnx->state |= VETH_STATE_OPEN;
714
        }
715
 
716
        if ( (cnx->state & VETH_STATE_OPEN)
717
             && !(cnx->state & VETH_STATE_SENTMON) ) {
718
                rc = veth_signalevent(cnx, VETH_EVENT_MONITOR,
719
                                      HvLpEvent_AckInd_DoAck,
720
                                      HvLpEvent_AckType_DeferredAck,
721
                                      0, 0, 0, 0, 0, 0);
722
 
723
                if (rc == HvLpEvent_Rc_Good) {
724
                        cnx->state |= VETH_STATE_SENTMON;
725
                } else {
726
                        if ( (rc != HvLpEvent_Rc_PartitionDead)
727
                             && (rc != HvLpEvent_Rc_PathClosed) )
728
                                veth_error("Error sending monitor to LPAR %d, "
729
                                                "rc = %d\n", rlp, rc);
730
 
731
                        /* Oh well, hope we get a cap from the other
732
                         * end and do better when that kicks us */
733
                        goto out;
734
                }
735
        }
736
 
737
        if ( (cnx->state & VETH_STATE_OPEN)
738
             && !(cnx->state & VETH_STATE_SENTCAPS)) {
739
                u64 *rawcap = (u64 *)&cnx->local_caps;
740
 
741
                rc = veth_signalevent(cnx, VETH_EVENT_CAP,
742
                                      HvLpEvent_AckInd_DoAck,
743
                                      HvLpEvent_AckType_ImmediateAck,
744
                                      0, rawcap[0], rawcap[1], rawcap[2],
745
                                      rawcap[3], rawcap[4]);
746
 
747
                if (rc == HvLpEvent_Rc_Good) {
748
                        cnx->state |= VETH_STATE_SENTCAPS;
749
                } else {
750
                        if ( (rc != HvLpEvent_Rc_PartitionDead)
751
                             && (rc != HvLpEvent_Rc_PathClosed) )
752
                                veth_error("Error sending caps to LPAR %d, "
753
                                                "rc = %d\n", rlp, rc);
754
 
755
                        /* Oh well, hope we get a cap from the other
756
                         * end and do better when that kicks us */
757
                        goto out;
758
                }
759
        }
760
 
761
        if ((cnx->state & VETH_STATE_GOTCAPS)
762
            && !(cnx->state & VETH_STATE_SENTCAPACK)) {
763
                struct veth_cap_data *remote_caps = &cnx->remote_caps;
764
 
765
                memcpy(remote_caps, &cnx->cap_event.u.caps_data,
766
                       sizeof(*remote_caps));
767
 
768
                spin_unlock_irq(&cnx->lock);
769
                rc = veth_process_caps(cnx);
770
                spin_lock_irq(&cnx->lock);
771
 
772
                /* We dropped the lock, so recheck for anything which
773
                 * might mess us up */
774
                if (cnx->state & (VETH_STATE_RESET|VETH_STATE_SHUTDOWN))
775
                        goto restart;
776
 
777
                cnx->cap_event.base_event.xRc = rc;
778
                HvCallEvent_ackLpEvent((struct HvLpEvent *)&cnx->cap_event);
779
                if (rc == HvLpEvent_Rc_Good)
780
                        cnx->state |= VETH_STATE_SENTCAPACK;
781
                else
782
                        goto cant_cope;
783
        }
784
 
785
        if ((cnx->state & VETH_STATE_GOTCAPACK)
786
            && (cnx->state & VETH_STATE_GOTCAPS)
787
            && !(cnx->state & VETH_STATE_READY)) {
788
                if (cnx->cap_ack_event.base_event.xRc == HvLpEvent_Rc_Good) {
789
                        /* Start the ACK timer */
790
                        cnx->ack_timer.expires = jiffies + cnx->ack_timeout;
791
                        add_timer(&cnx->ack_timer);
792
                        cnx->state |= VETH_STATE_READY;
793
                } else {
794
                        veth_error("Caps rejected by LPAR %d, rc = %d\n",
795
                                        rlp, cnx->cap_ack_event.base_event.xRc);
796
                        goto cant_cope;
797
                }
798
        }
799
 
800
 out:
801
        spin_unlock_irq(&cnx->lock);
802
        return;
803
 
804
 cant_cope:
805
        /* FIXME: we get here if something happens we really can't
806
         * cope with.  The link will never work once we get here, and
807
         * all we can do is not lock the rest of the system up */
808
        veth_error("Unrecoverable error on connection to LPAR %d, shutting down"
809
                        " (state = 0x%04lx)\n", rlp, cnx->state);
810
        cnx->state |= VETH_STATE_SHUTDOWN;
811
        spin_unlock_irq(&cnx->lock);
812
}
813
 
814
static int veth_init_connection(u8 rlp)
815
{
816
        struct veth_lpar_connection *cnx;
817
        struct veth_msg *msgs;
818
        int i, rc;
819
 
820
        if ( (rlp == this_lp)
821
             || ! HvLpConfig_doLpsCommunicateOnVirtualLan(this_lp, rlp) )
822
                return 0;
823
 
824
        cnx = kzalloc(sizeof(*cnx), GFP_KERNEL);
825
        if (! cnx)
826
                return -ENOMEM;
827
 
828
        cnx->remote_lp = rlp;
829
        spin_lock_init(&cnx->lock);
830
        INIT_DELAYED_WORK(&cnx->statemachine_wq, veth_statemachine);
831
 
832
        init_timer(&cnx->ack_timer);
833
        cnx->ack_timer.function = veth_timed_ack;
834
        cnx->ack_timer.data = (unsigned long) cnx;
835
 
836
        init_timer(&cnx->reset_timer);
837
        cnx->reset_timer.function = veth_timed_reset;
838
        cnx->reset_timer.data = (unsigned long) cnx;
839
        cnx->reset_timeout = 5 * HZ * (VETH_ACKTIMEOUT / 1000000);
840
 
841
        memset(&cnx->pending_acks, 0xff, sizeof (cnx->pending_acks));
842
 
843
        veth_cnx[rlp] = cnx;
844
 
845
        /* This gets us 1 reference, which is held on behalf of the driver
846
         * infrastructure. It's released at module unload. */
847
        kobject_init(&cnx->kobject);
848
        cnx->kobject.ktype = &veth_lpar_connection_ktype;
849
        rc = kobject_set_name(&cnx->kobject, "cnx%.2d", rlp);
850
        if (rc != 0)
851
                return rc;
852
 
853
        msgs = kcalloc(VETH_NUMBUFFERS, sizeof(struct veth_msg), GFP_KERNEL);
854
        if (! msgs) {
855
                veth_error("Can't allocate buffers for LPAR %d.\n", rlp);
856
                return -ENOMEM;
857
        }
858
 
859
        cnx->msgs = msgs;
860
 
861
        for (i = 0; i < VETH_NUMBUFFERS; i++) {
862
                msgs[i].token = i;
863
                veth_stack_push(cnx, msgs + i);
864
        }
865
 
866
        cnx->num_events = veth_allocate_events(rlp, 2 + VETH_NUMBUFFERS);
867
 
868
        if (cnx->num_events < (2 + VETH_NUMBUFFERS)) {
869
                veth_error("Can't allocate enough events for LPAR %d.\n", rlp);
870
                return -ENOMEM;
871
        }
872
 
873
        cnx->local_caps.num_buffers = VETH_NUMBUFFERS;
874
        cnx->local_caps.ack_threshold = ACK_THRESHOLD;
875
        cnx->local_caps.ack_timeout = VETH_ACKTIMEOUT;
876
 
877
        return 0;
878
}
879
 
880
static void veth_stop_connection(struct veth_lpar_connection *cnx)
881
{
882
        if (!cnx)
883
                return;
884
 
885
        spin_lock_irq(&cnx->lock);
886
        cnx->state |= VETH_STATE_RESET | VETH_STATE_SHUTDOWN;
887
        veth_kick_statemachine(cnx);
888
        spin_unlock_irq(&cnx->lock);
889
 
890
        /* There's a slim chance the reset code has just queued the
891
         * statemachine to run in five seconds. If so we need to cancel
892
         * that and requeue the work to run now. */
893
        if (cancel_delayed_work(&cnx->statemachine_wq)) {
894
                spin_lock_irq(&cnx->lock);
895
                veth_kick_statemachine(cnx);
896
                spin_unlock_irq(&cnx->lock);
897
        }
898
 
899
        /* Wait for the state machine to run. */
900
        flush_scheduled_work();
901
}
902
 
903
static void veth_destroy_connection(struct veth_lpar_connection *cnx)
904
{
905
        if (!cnx)
906
                return;
907
 
908
        if (cnx->num_events > 0)
909
                mf_deallocate_lp_events(cnx->remote_lp,
910
                                      HvLpEvent_Type_VirtualLan,
911
                                      cnx->num_events,
912
                                      NULL, NULL);
913
        if (cnx->num_ack_events > 0)
914
                mf_deallocate_lp_events(cnx->remote_lp,
915
                                      HvLpEvent_Type_VirtualLan,
916
                                      cnx->num_ack_events,
917
                                      NULL, NULL);
918
 
919
        kfree(cnx->msgs);
920
        veth_cnx[cnx->remote_lp] = NULL;
921
        kfree(cnx);
922
}
923
 
924
static void veth_release_connection(struct kobject *kobj)
925
{
926
        struct veth_lpar_connection *cnx;
927
        cnx = container_of(kobj, struct veth_lpar_connection, kobject);
928
        veth_stop_connection(cnx);
929
        veth_destroy_connection(cnx);
930
}
931
 
932
/*
933
 * net_device code
934
 */
935
 
936
static int veth_open(struct net_device *dev)
937
{
938
        netif_start_queue(dev);
939
        return 0;
940
}
941
 
942
static int veth_close(struct net_device *dev)
943
{
944
        netif_stop_queue(dev);
945
        return 0;
946
}
947
 
948
static int veth_change_mtu(struct net_device *dev, int new_mtu)
949
{
950
        if ((new_mtu < 68) || (new_mtu > VETH_MAX_MTU))
951
                return -EINVAL;
952
        dev->mtu = new_mtu;
953
        return 0;
954
}
955
 
956
static void veth_set_multicast_list(struct net_device *dev)
957
{
958
        struct veth_port *port = (struct veth_port *) dev->priv;
959
        unsigned long flags;
960
 
961
        write_lock_irqsave(&port->mcast_gate, flags);
962
 
963
        if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI) ||
964
                        (dev->mc_count > VETH_MAX_MCAST)) {
965
                port->promiscuous = 1;
966
        } else {
967
                struct dev_mc_list *dmi = dev->mc_list;
968
                int i;
969
 
970
                port->promiscuous = 0;
971
 
972
                /* Update table */
973
                port->num_mcast = 0;
974
 
975
                for (i = 0; i < dev->mc_count; i++) {
976
                        u8 *addr = dmi->dmi_addr;
977
                        u64 xaddr = 0;
978
 
979
                        if (addr[0] & 0x01) {/* multicast address? */
980
                                memcpy(&xaddr, addr, ETH_ALEN);
981
                                port->mcast_addr[port->num_mcast] = xaddr;
982
                                port->num_mcast++;
983
                        }
984
                        dmi = dmi->next;
985
                }
986
        }
987
 
988
        write_unlock_irqrestore(&port->mcast_gate, flags);
989
}
990
 
991
static void veth_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
992
{
993
        strncpy(info->driver, DRV_NAME, sizeof(info->driver) - 1);
994
        info->driver[sizeof(info->driver) - 1] = '\0';
995
        strncpy(info->version, DRV_VERSION, sizeof(info->version) - 1);
996
        info->version[sizeof(info->version) - 1] = '\0';
997
}
998
 
999
static int veth_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
1000
{
1001
        ecmd->supported = (SUPPORTED_1000baseT_Full
1002
                          | SUPPORTED_Autoneg | SUPPORTED_FIBRE);
1003
        ecmd->advertising = (SUPPORTED_1000baseT_Full
1004
                            | SUPPORTED_Autoneg | SUPPORTED_FIBRE);
1005
        ecmd->port = PORT_FIBRE;
1006
        ecmd->transceiver = XCVR_INTERNAL;
1007
        ecmd->phy_address = 0;
1008
        ecmd->speed = SPEED_1000;
1009
        ecmd->duplex = DUPLEX_FULL;
1010
        ecmd->autoneg = AUTONEG_ENABLE;
1011
        ecmd->maxtxpkt = 120;
1012
        ecmd->maxrxpkt = 120;
1013
        return 0;
1014
}
1015
 
1016
static u32 veth_get_link(struct net_device *dev)
1017
{
1018
        return 1;
1019
}
1020
 
1021
static const struct ethtool_ops ops = {
1022
        .get_drvinfo = veth_get_drvinfo,
1023
        .get_settings = veth_get_settings,
1024
        .get_link = veth_get_link,
1025
};
1026
 
1027
static struct net_device * __init veth_probe_one(int vlan,
1028
                struct vio_dev *vio_dev)
1029
{
1030
        struct net_device *dev;
1031
        struct veth_port *port;
1032
        struct device *vdev = &vio_dev->dev;
1033
        int i, rc;
1034
        const unsigned char *mac_addr;
1035
 
1036
        mac_addr = vio_get_attribute(vio_dev, "local-mac-address", NULL);
1037
        if (mac_addr == NULL)
1038
                mac_addr = vio_get_attribute(vio_dev, "mac-address", NULL);
1039
        if (mac_addr == NULL) {
1040
                veth_error("Unable to fetch MAC address from device tree.\n");
1041
                return NULL;
1042
        }
1043
 
1044
        dev = alloc_etherdev(sizeof (struct veth_port));
1045
        if (! dev) {
1046
                veth_error("Unable to allocate net_device structure!\n");
1047
                return NULL;
1048
        }
1049
 
1050
        port = (struct veth_port *) dev->priv;
1051
 
1052
        spin_lock_init(&port->queue_lock);
1053
        rwlock_init(&port->mcast_gate);
1054
        port->stopped_map = 0;
1055
 
1056
        for (i = 0; i < HVMAXARCHITECTEDLPS; i++) {
1057
                HvLpVirtualLanIndexMap map;
1058
 
1059
                if (i == this_lp)
1060
                        continue;
1061
                map = HvLpConfig_getVirtualLanIndexMapForLp(i);
1062
                if (map & (0x8000 >> vlan))
1063
                        port->lpar_map |= (1 << i);
1064
        }
1065
        port->dev = vdev;
1066
 
1067
        memcpy(dev->dev_addr, mac_addr, ETH_ALEN);
1068
 
1069
        dev->mtu = VETH_MAX_MTU;
1070
 
1071
        memcpy(&port->mac_addr, mac_addr, ETH_ALEN);
1072
 
1073
        dev->open = veth_open;
1074
        dev->hard_start_xmit = veth_start_xmit;
1075
        dev->stop = veth_close;
1076
        dev->change_mtu = veth_change_mtu;
1077
        dev->set_mac_address = NULL;
1078
        dev->set_multicast_list = veth_set_multicast_list;
1079
        SET_ETHTOOL_OPS(dev, &ops);
1080
 
1081
        SET_NETDEV_DEV(dev, vdev);
1082
 
1083
        rc = register_netdev(dev);
1084
        if (rc != 0) {
1085
                veth_error("Failed registering net device for vlan%d.\n", vlan);
1086
                free_netdev(dev);
1087
                return NULL;
1088
        }
1089
 
1090
        kobject_init(&port->kobject);
1091
        port->kobject.parent = &dev->dev.kobj;
1092
        port->kobject.ktype  = &veth_port_ktype;
1093
        kobject_set_name(&port->kobject, "veth_port");
1094
        if (0 != kobject_add(&port->kobject))
1095
                veth_error("Failed adding port for %s to sysfs.\n", dev->name);
1096
 
1097
        veth_info("%s attached to iSeries vlan %d (LPAR map = 0x%.4X)\n",
1098
                        dev->name, vlan, port->lpar_map);
1099
 
1100
        return dev;
1101
}
1102
 
1103
/*
1104
 * Tx path
1105
 */
1106
 
1107
static int veth_transmit_to_one(struct sk_buff *skb, HvLpIndex rlp,
1108
                                struct net_device *dev)
1109
{
1110
        struct veth_lpar_connection *cnx = veth_cnx[rlp];
1111
        struct veth_port *port = (struct veth_port *) dev->priv;
1112
        HvLpEvent_Rc rc;
1113
        struct veth_msg *msg = NULL;
1114
        unsigned long flags;
1115
 
1116
        if (! cnx)
1117
                return 0;
1118
 
1119
        spin_lock_irqsave(&cnx->lock, flags);
1120
 
1121
        if (! (cnx->state & VETH_STATE_READY))
1122
                goto no_error;
1123
 
1124
        if ((skb->len - ETH_HLEN) > VETH_MAX_MTU)
1125
                goto drop;
1126
 
1127
        msg = veth_stack_pop(cnx);
1128
        if (! msg)
1129
                goto drop;
1130
 
1131
        msg->in_use = 1;
1132
        msg->skb = skb_get(skb);
1133
 
1134
        msg->data.addr[0] = dma_map_single(port->dev, skb->data,
1135
                                skb->len, DMA_TO_DEVICE);
1136
 
1137
        if (dma_mapping_error(msg->data.addr[0]))
1138
                goto recycle_and_drop;
1139
 
1140
        msg->dev = port->dev;
1141
        msg->data.len[0] = skb->len;
1142
        msg->data.eofmask = 1 << VETH_EOF_SHIFT;
1143
 
1144
        rc = veth_signaldata(cnx, VETH_EVENT_FRAMES, msg->token, &msg->data);
1145
 
1146
        if (rc != HvLpEvent_Rc_Good)
1147
                goto recycle_and_drop;
1148
 
1149
        /* If the timer's not already running, start it now. */
1150
        if (0 == cnx->outstanding_tx)
1151
                mod_timer(&cnx->reset_timer, jiffies + cnx->reset_timeout);
1152
 
1153
        cnx->last_contact = jiffies;
1154
        cnx->outstanding_tx++;
1155
 
1156
        if (veth_stack_is_empty(cnx))
1157
                veth_stop_queues(cnx);
1158
 
1159
 no_error:
1160
        spin_unlock_irqrestore(&cnx->lock, flags);
1161
        return 0;
1162
 
1163
 recycle_and_drop:
1164
        veth_recycle_msg(cnx, msg);
1165
 drop:
1166
        spin_unlock_irqrestore(&cnx->lock, flags);
1167
        return 1;
1168
}
1169
 
1170
static void veth_transmit_to_many(struct sk_buff *skb,
1171
                                          HvLpIndexMap lpmask,
1172
                                          struct net_device *dev)
1173
{
1174
        int i, success, error;
1175
 
1176
        success = error = 0;
1177
 
1178
        for (i = 0; i < HVMAXARCHITECTEDLPS; i++) {
1179
                if ((lpmask & (1 << i)) == 0)
1180
                        continue;
1181
 
1182
                if (veth_transmit_to_one(skb, i, dev))
1183
                        error = 1;
1184
                else
1185
                        success = 1;
1186
        }
1187
 
1188
        if (error)
1189
                dev->stats.tx_errors++;
1190
 
1191
        if (success) {
1192
                dev->stats.tx_packets++;
1193
                dev->stats.tx_bytes += skb->len;
1194
        }
1195
}
1196
 
1197
static int veth_start_xmit(struct sk_buff *skb, struct net_device *dev)
1198
{
1199
        unsigned char *frame = skb->data;
1200
        struct veth_port *port = (struct veth_port *) dev->priv;
1201
        HvLpIndexMap lpmask;
1202
 
1203
        if (! (frame[0] & 0x01)) {
1204
                /* unicast packet */
1205
                HvLpIndex rlp = frame[5];
1206
 
1207
                if ( ! ((1 << rlp) & port->lpar_map) ) {
1208
                        dev_kfree_skb(skb);
1209
                        return 0;
1210
                }
1211
 
1212
                lpmask = 1 << rlp;
1213
        } else {
1214
                lpmask = port->lpar_map;
1215
        }
1216
 
1217
        veth_transmit_to_many(skb, lpmask, dev);
1218
 
1219
        dev_kfree_skb(skb);
1220
 
1221
        return 0;
1222
}
1223
 
1224
/* You must hold the connection's lock when you call this function. */
1225
static void veth_recycle_msg(struct veth_lpar_connection *cnx,
1226
                             struct veth_msg *msg)
1227
{
1228
        u32 dma_address, dma_length;
1229
 
1230
        if (msg->in_use) {
1231
                msg->in_use = 0;
1232
                dma_address = msg->data.addr[0];
1233
                dma_length = msg->data.len[0];
1234
 
1235
                if (!dma_mapping_error(dma_address))
1236
                        dma_unmap_single(msg->dev, dma_address, dma_length,
1237
                                        DMA_TO_DEVICE);
1238
 
1239
                if (msg->skb) {
1240
                        dev_kfree_skb_any(msg->skb);
1241
                        msg->skb = NULL;
1242
                }
1243
 
1244
                memset(&msg->data, 0, sizeof(msg->data));
1245
                veth_stack_push(cnx, msg);
1246
        } else if (cnx->state & VETH_STATE_OPEN) {
1247
                veth_error("Non-pending frame (# %d) acked by LPAR %d.\n",
1248
                                cnx->remote_lp, msg->token);
1249
        }
1250
}
1251
 
1252
static void veth_wake_queues(struct veth_lpar_connection *cnx)
1253
{
1254
        int i;
1255
 
1256
        for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; i++) {
1257
                struct net_device *dev = veth_dev[i];
1258
                struct veth_port *port;
1259
                unsigned long flags;
1260
 
1261
                if (! dev)
1262
                        continue;
1263
 
1264
                port = (struct veth_port *)dev->priv;
1265
 
1266
                if (! (port->lpar_map & (1<<cnx->remote_lp)))
1267
                        continue;
1268
 
1269
                spin_lock_irqsave(&port->queue_lock, flags);
1270
 
1271
                port->stopped_map &= ~(1 << cnx->remote_lp);
1272
 
1273
                if (0 == port->stopped_map && netif_queue_stopped(dev)) {
1274
                        veth_debug("cnx %d: woke queue for %s.\n",
1275
                                        cnx->remote_lp, dev->name);
1276
                        netif_wake_queue(dev);
1277
                }
1278
                spin_unlock_irqrestore(&port->queue_lock, flags);
1279
        }
1280
}
1281
 
1282
static void veth_stop_queues(struct veth_lpar_connection *cnx)
1283
{
1284
        int i;
1285
 
1286
        for (i = 0; i < HVMAXARCHITECTEDVIRTUALLANS; i++) {
1287
                struct net_device *dev = veth_dev[i];
1288
                struct veth_port *port;
1289
 
1290
                if (! dev)
1291
                        continue;
1292
 
1293
                port = (struct veth_port *)dev->priv;
1294
 
1295
                /* If this cnx is not on the vlan for this port, continue */
1296
                if (! (port->lpar_map & (1 << cnx->remote_lp)))
1297
                        continue;
1298
 
1299
                spin_lock(&port->queue_lock);
1300
 
1301
                netif_stop_queue(dev);
1302
                port->stopped_map |= (1 << cnx->remote_lp);
1303
 
1304
                veth_debug("cnx %d: stopped queue for %s, map = 0x%x.\n",
1305
                                cnx->remote_lp, dev->name, port->stopped_map);
1306
 
1307
                spin_unlock(&port->queue_lock);
1308
        }
1309
}
1310
 
1311
static void veth_timed_reset(unsigned long ptr)
1312
{
1313
        struct veth_lpar_connection *cnx = (struct veth_lpar_connection *)ptr;
1314
        unsigned long trigger_time, flags;
1315
 
1316
        /* FIXME is it possible this fires after veth_stop_connection()?
1317
         * That would reschedule the statemachine for 5 seconds and probably
1318
         * execute it after the module's been unloaded. Hmm. */
1319
 
1320
        spin_lock_irqsave(&cnx->lock, flags);
1321
 
1322
        if (cnx->outstanding_tx > 0) {
1323
                trigger_time = cnx->last_contact + cnx->reset_timeout;
1324
 
1325
                if (trigger_time < jiffies) {
1326
                        cnx->state |= VETH_STATE_RESET;
1327
                        veth_kick_statemachine(cnx);
1328
                        veth_error("%d packets not acked by LPAR %d within %d "
1329
                                        "seconds, resetting.\n",
1330
                                        cnx->outstanding_tx, cnx->remote_lp,
1331
                                        cnx->reset_timeout / HZ);
1332
                } else {
1333
                        /* Reschedule the timer */
1334
                        trigger_time = jiffies + cnx->reset_timeout;
1335
                        mod_timer(&cnx->reset_timer, trigger_time);
1336
                }
1337
        }
1338
 
1339
        spin_unlock_irqrestore(&cnx->lock, flags);
1340
}
1341
 
1342
/*
1343
 * Rx path
1344
 */
1345
 
1346
static inline int veth_frame_wanted(struct veth_port *port, u64 mac_addr)
1347
{
1348
        int wanted = 0;
1349
        int i;
1350
        unsigned long flags;
1351
 
1352
        if ( (mac_addr == port->mac_addr) || (mac_addr == 0xffffffffffff0000) )
1353
                return 1;
1354
 
1355
        read_lock_irqsave(&port->mcast_gate, flags);
1356
 
1357
        if (port->promiscuous) {
1358
                wanted = 1;
1359
                goto out;
1360
        }
1361
 
1362
        for (i = 0; i < port->num_mcast; ++i) {
1363
                if (port->mcast_addr[i] == mac_addr) {
1364
                        wanted = 1;
1365
                        break;
1366
                }
1367
        }
1368
 
1369
 out:
1370
        read_unlock_irqrestore(&port->mcast_gate, flags);
1371
 
1372
        return wanted;
1373
}
1374
 
1375
struct dma_chunk {
1376
        u64 addr;
1377
        u64 size;
1378
};
1379
 
1380
#define VETH_MAX_PAGES_PER_FRAME ( (VETH_MAX_MTU+PAGE_SIZE-2)/PAGE_SIZE + 1 )
1381
 
1382
static inline void veth_build_dma_list(struct dma_chunk *list,
1383
                                       unsigned char *p, unsigned long length)
1384
{
1385
        unsigned long done;
1386
        int i = 1;
1387
 
1388
        /* FIXME: skbs are continguous in real addresses.  Do we
1389
         * really need to break it into PAGE_SIZE chunks, or can we do
1390
         * it just at the granularity of iSeries real->absolute
1391
         * mapping?  Indeed, given the way the allocator works, can we
1392
         * count on them being absolutely contiguous? */
1393
        list[0].addr = iseries_hv_addr(p);
1394
        list[0].size = min(length,
1395
                           PAGE_SIZE - ((unsigned long)p & ~PAGE_MASK));
1396
 
1397
        done = list[0].size;
1398
        while (done < length) {
1399
                list[i].addr = iseries_hv_addr(p + done);
1400
                list[i].size = min(length-done, PAGE_SIZE);
1401
                done += list[i].size;
1402
                i++;
1403
        }
1404
}
1405
 
1406
static void veth_flush_acks(struct veth_lpar_connection *cnx)
1407
{
1408
        HvLpEvent_Rc rc;
1409
 
1410
        rc = veth_signaldata(cnx, VETH_EVENT_FRAMES_ACK,
1411
                             0, &cnx->pending_acks);
1412
 
1413
        if (rc != HvLpEvent_Rc_Good)
1414
                veth_error("Failed acking frames from LPAR %d, rc = %d\n",
1415
                                cnx->remote_lp, (int)rc);
1416
 
1417
        cnx->num_pending_acks = 0;
1418
        memset(&cnx->pending_acks, 0xff, sizeof(cnx->pending_acks));
1419
}
1420
 
1421
static void veth_receive(struct veth_lpar_connection *cnx,
1422
                         struct veth_lpevent *event)
1423
{
1424
        struct veth_frames_data *senddata = &event->u.frames_data;
1425
        int startchunk = 0;
1426
        int nchunks;
1427
        unsigned long flags;
1428
        HvLpDma_Rc rc;
1429
 
1430
        do {
1431
                u16 length = 0;
1432
                struct sk_buff *skb;
1433
                struct dma_chunk local_list[VETH_MAX_PAGES_PER_FRAME];
1434
                struct dma_chunk remote_list[VETH_MAX_FRAMES_PER_MSG];
1435
                u64 dest;
1436
                HvLpVirtualLanIndex vlan;
1437
                struct net_device *dev;
1438
                struct veth_port *port;
1439
 
1440
                /* FIXME: do we need this? */
1441
                memset(local_list, 0, sizeof(local_list));
1442
                memset(remote_list, 0, sizeof(VETH_MAX_FRAMES_PER_MSG));
1443
 
1444
                /* a 0 address marks the end of the valid entries */
1445
                if (senddata->addr[startchunk] == 0)
1446
                        break;
1447
 
1448
                /* make sure that we have at least 1 EOF entry in the
1449
                 * remaining entries */
1450
                if (! (senddata->eofmask >> (startchunk + VETH_EOF_SHIFT))) {
1451
                        veth_error("Missing EOF fragment in event "
1452
                                        "eofmask = 0x%x startchunk = %d\n",
1453
                                        (unsigned)senddata->eofmask,
1454
                                        startchunk);
1455
                        break;
1456
                }
1457
 
1458
                /* build list of chunks in this frame */
1459
                nchunks = 0;
1460
                do {
1461
                        remote_list[nchunks].addr =
1462
                                (u64) senddata->addr[startchunk+nchunks] << 32;
1463
                        remote_list[nchunks].size =
1464
                                senddata->len[startchunk+nchunks];
1465
                        length += remote_list[nchunks].size;
1466
                } while (! (senddata->eofmask &
1467
                            (1 << (VETH_EOF_SHIFT + startchunk + nchunks++))));
1468
 
1469
                /* length == total length of all chunks */
1470
                /* nchunks == # of chunks in this frame */
1471
 
1472
                if ((length - ETH_HLEN) > VETH_MAX_MTU) {
1473
                        veth_error("Received oversize frame from LPAR %d "
1474
                                        "(length = %d)\n",
1475
                                        cnx->remote_lp, length);
1476
                        continue;
1477
                }
1478
 
1479
                skb = alloc_skb(length, GFP_ATOMIC);
1480
                if (!skb)
1481
                        continue;
1482
 
1483
                veth_build_dma_list(local_list, skb->data, length);
1484
 
1485
                rc = HvCallEvent_dmaBufList(HvLpEvent_Type_VirtualLan,
1486
                                            event->base_event.xSourceLp,
1487
                                            HvLpDma_Direction_RemoteToLocal,
1488
                                            cnx->src_inst,
1489
                                            cnx->dst_inst,
1490
                                            HvLpDma_AddressType_RealAddress,
1491
                                            HvLpDma_AddressType_TceIndex,
1492
                                            iseries_hv_addr(&local_list),
1493
                                            iseries_hv_addr(&remote_list),
1494
                                            length);
1495
                if (rc != HvLpDma_Rc_Good) {
1496
                        dev_kfree_skb_irq(skb);
1497
                        continue;
1498
                }
1499
 
1500
                vlan = skb->data[9];
1501
                dev = veth_dev[vlan];
1502
                if (! dev) {
1503
                        /*
1504
                         * Some earlier versions of the driver sent
1505
                         * broadcasts down all connections, even to lpars
1506
                         * that weren't on the relevant vlan. So ignore
1507
                         * packets belonging to a vlan we're not on.
1508
                         * We can also be here if we receive packets while
1509
                         * the driver is going down, because then dev is NULL.
1510
                         */
1511
                        dev_kfree_skb_irq(skb);
1512
                        continue;
1513
                }
1514
 
1515
                port = (struct veth_port *)dev->priv;
1516
                dest = *((u64 *) skb->data) & 0xFFFFFFFFFFFF0000;
1517
 
1518
                if ((vlan > HVMAXARCHITECTEDVIRTUALLANS) || !port) {
1519
                        dev_kfree_skb_irq(skb);
1520
                        continue;
1521
                }
1522
                if (! veth_frame_wanted(port, dest)) {
1523
                        dev_kfree_skb_irq(skb);
1524
                        continue;
1525
                }
1526
 
1527
                skb_put(skb, length);
1528
                skb->protocol = eth_type_trans(skb, dev);
1529
                skb->ip_summed = CHECKSUM_NONE;
1530
                netif_rx(skb);  /* send it up */
1531
                dev->stats.rx_packets++;
1532
                dev->stats.rx_bytes += length;
1533
        } while (startchunk += nchunks, startchunk < VETH_MAX_FRAMES_PER_MSG);
1534
 
1535
        /* Ack it */
1536
        spin_lock_irqsave(&cnx->lock, flags);
1537
        BUG_ON(cnx->num_pending_acks > VETH_MAX_ACKS_PER_MSG);
1538
 
1539
        cnx->pending_acks[cnx->num_pending_acks++] =
1540
                event->base_event.xCorrelationToken;
1541
 
1542
        if ( (cnx->num_pending_acks >= cnx->remote_caps.ack_threshold)
1543
             || (cnx->num_pending_acks >= VETH_MAX_ACKS_PER_MSG) )
1544
                veth_flush_acks(cnx);
1545
 
1546
        spin_unlock_irqrestore(&cnx->lock, flags);
1547
}
1548
 
1549
static void veth_timed_ack(unsigned long ptr)
1550
{
1551
        struct veth_lpar_connection *cnx = (struct veth_lpar_connection *) ptr;
1552
        unsigned long flags;
1553
 
1554
        /* Ack all the events */
1555
        spin_lock_irqsave(&cnx->lock, flags);
1556
        if (cnx->num_pending_acks > 0)
1557
                veth_flush_acks(cnx);
1558
 
1559
        /* Reschedule the timer */
1560
        cnx->ack_timer.expires = jiffies + cnx->ack_timeout;
1561
        add_timer(&cnx->ack_timer);
1562
        spin_unlock_irqrestore(&cnx->lock, flags);
1563
}
1564
 
1565
static int veth_remove(struct vio_dev *vdev)
1566
{
1567
        struct veth_lpar_connection *cnx;
1568
        struct net_device *dev;
1569
        struct veth_port *port;
1570
        int i;
1571
 
1572
        dev = veth_dev[vdev->unit_address];
1573
 
1574
        if (! dev)
1575
                return 0;
1576
 
1577
        port = netdev_priv(dev);
1578
 
1579
        for (i = 0; i < HVMAXARCHITECTEDLPS; i++) {
1580
                cnx = veth_cnx[i];
1581
 
1582
                if (cnx && (port->lpar_map & (1 << i))) {
1583
                        /* Drop our reference to connections on our VLAN */
1584
                        kobject_put(&cnx->kobject);
1585
                }
1586
        }
1587
 
1588
        veth_dev[vdev->unit_address] = NULL;
1589
        kobject_del(&port->kobject);
1590
        kobject_put(&port->kobject);
1591
        unregister_netdev(dev);
1592
        free_netdev(dev);
1593
 
1594
        return 0;
1595
}
1596
 
1597
static int veth_probe(struct vio_dev *vdev, const struct vio_device_id *id)
1598
{
1599
        int i = vdev->unit_address;
1600
        struct net_device *dev;
1601
        struct veth_port *port;
1602
 
1603
        dev = veth_probe_one(i, vdev);
1604
        if (dev == NULL) {
1605
                veth_remove(vdev);
1606
                return 1;
1607
        }
1608
        veth_dev[i] = dev;
1609
 
1610
        port = (struct veth_port*)netdev_priv(dev);
1611
 
1612
        /* Start the state machine on each connection on this vlan. If we're
1613
         * the first dev to do so this will commence link negotiation */
1614
        for (i = 0; i < HVMAXARCHITECTEDLPS; i++) {
1615
                struct veth_lpar_connection *cnx;
1616
 
1617
                if (! (port->lpar_map & (1 << i)))
1618
                        continue;
1619
 
1620
                cnx = veth_cnx[i];
1621
                if (!cnx)
1622
                        continue;
1623
 
1624
                kobject_get(&cnx->kobject);
1625
                veth_kick_statemachine(cnx);
1626
        }
1627
 
1628
        return 0;
1629
}
1630
 
1631
/**
1632
 * veth_device_table: Used by vio.c to match devices that we
1633
 * support.
1634
 */
1635
static struct vio_device_id veth_device_table[] __devinitdata = {
1636
        { "network", "IBM,iSeries-l-lan" },
1637
        { "", "" }
1638
};
1639
MODULE_DEVICE_TABLE(vio, veth_device_table);
1640
 
1641
static struct vio_driver veth_driver = {
1642
        .id_table = veth_device_table,
1643
        .probe = veth_probe,
1644
        .remove = veth_remove,
1645
        .driver = {
1646
                .name = DRV_NAME,
1647
                .owner = THIS_MODULE,
1648
        }
1649
};
1650
 
1651
/*
1652
 * Module initialization/cleanup
1653
 */
1654
 
1655
static void __exit veth_module_cleanup(void)
1656
{
1657
        int i;
1658
        struct veth_lpar_connection *cnx;
1659
 
1660
        /* Disconnect our "irq" to stop events coming from the Hypervisor. */
1661
        HvLpEvent_unregisterHandler(HvLpEvent_Type_VirtualLan);
1662
 
1663
        /* Make sure any work queued from Hypervisor callbacks is finished. */
1664
        flush_scheduled_work();
1665
 
1666
        for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) {
1667
                cnx = veth_cnx[i];
1668
 
1669
                if (!cnx)
1670
                        continue;
1671
 
1672
                /* Remove the connection from sysfs */
1673
                kobject_del(&cnx->kobject);
1674
                /* Drop the driver's reference to the connection */
1675
                kobject_put(&cnx->kobject);
1676
        }
1677
 
1678
        /* Unregister the driver, which will close all the netdevs and stop
1679
         * the connections when they're no longer referenced. */
1680
        vio_unregister_driver(&veth_driver);
1681
}
1682
module_exit(veth_module_cleanup);
1683
 
1684
static int __init veth_module_init(void)
1685
{
1686
        int i;
1687
        int rc;
1688
 
1689
        if (!firmware_has_feature(FW_FEATURE_ISERIES))
1690
                return -ENODEV;
1691
 
1692
        this_lp = HvLpConfig_getLpIndex_outline();
1693
 
1694
        for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) {
1695
                rc = veth_init_connection(i);
1696
                if (rc != 0)
1697
                        goto error;
1698
        }
1699
 
1700
        HvLpEvent_registerHandler(HvLpEvent_Type_VirtualLan,
1701
                                  &veth_handle_event);
1702
 
1703
        rc = vio_register_driver(&veth_driver);
1704
        if (rc != 0)
1705
                goto error;
1706
 
1707
        for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) {
1708
                struct kobject *kobj;
1709
 
1710
                if (!veth_cnx[i])
1711
                        continue;
1712
 
1713
                kobj = &veth_cnx[i]->kobject;
1714
                kobj->parent = &veth_driver.driver.kobj;
1715
                /* If the add failes, complain but otherwise continue */
1716
                if (0 != kobject_add(kobj))
1717
                        veth_error("cnx %d: Failed adding to sysfs.\n", i);
1718
        }
1719
 
1720
        return 0;
1721
 
1722
error:
1723
        for (i = 0; i < HVMAXARCHITECTEDLPS; ++i) {
1724
                veth_destroy_connection(veth_cnx[i]);
1725
        }
1726
 
1727
        return rc;
1728
}
1729
module_init(veth_module_init);

powered by: WebSVN 2.1.0

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