devices/generic.c
author Dominik Staubli <ch1010252@ch10pc423>
Thu, 21 Jan 2010 11:09:31 +0100
changeset 1798 e7733f825982
parent 1607 be4dd9c80f42
child 1612 c6779ebcda88
permissions -rw-r--r--
Domain datagram working counter calculation bugfix: increment expected wc for a given slave & direction just once for each datagram
This bug occurs if you configure more than one SM in the same direction on the same slave
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     5
 *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     6
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     8
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it and/or
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    10
 *  modify it under the terms of the GNU General Public License version 2, as
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    11
 *  published by the Free Software Foundation.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    12
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    13
 *  The IgH EtherCAT Master is distributed in the hope that it will be useful,
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    16
 *  Public License for more details.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    17
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    18
 *  You should have received a copy of the GNU General Public License along
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    19
 *  with the IgH EtherCAT Master; if not, write to the Free Software
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    21
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
 *  ---
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    23
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    24
 *  The license mentioned above concerns the source code only. Using the
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    25
 *  EtherCAT technology and brand is only permitted in compliance with the
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    26
 *  industrial property and similar rights of Beckhoff Automation GmbH.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    27
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 *****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    30
/** \file
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    31
 * EtherCAT generic Ethernet device module.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    32
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    34
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    35
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include <linux/module.h>
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    37
#include <linux/device.h>
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    38
#include <linux/err.h>
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
#include <linux/version.h>
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include <linux/if_arp.h> /* ARPHRD_ETHER */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
#include <linux/etherdevice.h>
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    42
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    43
#include "../globals.h"
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    44
#include "ecdev.h"
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    45
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    46
#define PFX "ec_generic: "
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    47
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
    48
#define ETH_P_ETHERCAT 0x88A4
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
    49
1558
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
    50
#define EC_GEN_RX_BUF_SIZE 1600
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
    51
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    52
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    53
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    54
int __init ec_gen_init_module(void);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    55
void __exit ec_gen_cleanup_module(void);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    56
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    57
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    58
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    59
/** \cond */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    60
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    61
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    62
MODULE_DESCRIPTION("EtherCAT master generic Ethernet device module");
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    63
MODULE_LICENSE("GPL");
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    64
MODULE_VERSION(EC_MASTER_VERSION);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    65
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    66
/** \endcond */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    67
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    68
struct list_head generic_devices;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    69
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    70
typedef struct {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    71
    struct list_head list;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    72
    struct net_device *netdev;
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
    73
	struct net_device *used_netdev;
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
    74
	struct socket *socket;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    75
    ec_device_t *ecdev;
1558
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
    76
    uint8_t *rx_buf;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    77
} ec_gen_device_t;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
    79
typedef struct {
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
    80
    struct list_head list;
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
    81
	struct net_device *netdev;
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
    82
	char name[IFNAMSIZ];
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
    83
    int ifindex;
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
    84
    uint8_t dev_addr[ETH_ALEN];
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
    85
} ec_gen_interface_desc_t;
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
    86
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    87
int ec_gen_device_open(ec_gen_device_t *);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    88
int ec_gen_device_stop(ec_gen_device_t *);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    89
int ec_gen_device_start_xmit(ec_gen_device_t *, struct sk_buff *);
1542
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
    90
void ec_gen_device_poll(ec_gen_device_t *);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    91
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    92
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    93
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    94
static int ec_gen_netdev_open(struct net_device *dev)
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    95
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
    ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev));
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
    return ec_gen_device_open(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    98
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    99
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   100
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   101
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   102
static int ec_gen_netdev_stop(struct net_device *dev)
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   103
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   104
    ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev));
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   105
    return ec_gen_device_stop(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   106
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   107
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   108
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   109
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   110
static int ec_gen_netdev_start_xmit(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   111
        struct sk_buff *skb,
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   112
        struct net_device *dev
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   113
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   114
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   115
    ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev));
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   116
    return ec_gen_device_start_xmit(gendev, skb);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   117
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   118
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   119
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   120
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   121
void ec_gen_poll(struct net_device *dev)
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   122
{
1542
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   123
    ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev));
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   124
    ec_gen_device_poll(gendev);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   125
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   126
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   127
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   128
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   129
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   130
static const struct net_device_ops ec_gen_netdev_ops = {
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   131
    .ndo_open       = ec_gen_netdev_open,
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   132
    .ndo_stop       = ec_gen_netdev_stop,
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   133
    .ndo_start_xmit = ec_gen_netdev_start_xmit,
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   134
};
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   135
#endif
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   136
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   137
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   138
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   139
/** Init generic device.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   140
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   141
int ec_gen_device_init(
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   142
        ec_gen_device_t *dev
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   143
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   144
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   145
    ec_gen_device_t **priv;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   146
    char null = 0x00;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   147
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   148
    dev->ecdev = NULL;
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   149
    dev->socket = NULL;
1558
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   150
    dev->rx_buf = NULL;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   151
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   152
    dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, ether_setup);
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   153
    if (!dev->netdev) {
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   154
        return -ENOMEM;
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   155
    }
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   156
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   157
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
    dev->netdev->netdev_ops = &ec_gen_netdev_ops;
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   159
#else
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   160
    dev->netdev->open = ec_gen_netdev_open;
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   161
    dev->netdev->stop = ec_gen_netdev_stop;
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   162
    dev->netdev->hard_start_xmit = ec_gen_netdev_start_xmit;
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   163
#endif
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   164
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   165
    priv = netdev_priv(dev->netdev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
    *priv = dev;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   167
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
    return 0;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   172
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   173
/** Clear generic device.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   174
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   175
void ec_gen_device_clear(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
        ec_gen_device_t *dev
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
    if (dev->ecdev) {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
        ecdev_close(dev->ecdev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
        ecdev_withdraw(dev->ecdev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
    }
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   183
    if (dev->socket) {
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   184
        sock_release(dev->socket);
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   185
    }
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
    free_netdev(dev->netdev);
1558
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   187
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   188
    if (dev->rx_buf) {
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   189
        kfree(dev->rx_buf);
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   190
    }
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   192
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   195
/** Creates a network socket.
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   196
 */
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   197
int ec_gen_device_create_socket(
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   198
        ec_gen_device_t *dev,
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   199
        ec_gen_interface_desc_t *desc
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   200
        )
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   201
{
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   202
    int ret;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   203
    struct sockaddr_ll sa;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   204
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   205
	dev->rx_buf = kmalloc(EC_GEN_RX_BUF_SIZE, GFP_KERNEL);
1558
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   206
    if (!dev->rx_buf) {
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   207
        return -ENOMEM;
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   208
    }
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   209
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   210
    ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT), &dev->socket);
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   211
    if (ret) {
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   212
        printk(KERN_ERR PFX "Failed to create socket.\n");
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   213
        return ret;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   214
    }
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   215
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   216
    printk(KERN_ERR PFX "Binding socket to interface %i (%s).\n",
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   217
            desc->ifindex, desc->name);
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   218
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   219
    memset(&sa, 0x00, sizeof(sa));
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   220
    sa.sll_family = AF_PACKET;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   221
    sa.sll_protocol = htons(ETH_P_ETHERCAT);
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   222
    sa.sll_ifindex = desc->ifindex;
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   223
    ret = kernel_bind(dev->socket, (struct sockaddr *) &sa, sizeof(sa));
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   224
    if (ret) {
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   225
        printk(KERN_ERR PFX "Failed to bind() socket to interface.\n");
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   226
        sock_release(dev->socket);
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   227
        dev->socket = NULL;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   228
        return ret;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   229
    }
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   230
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   231
    return 0;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   232
}
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   233
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   234
/*****************************************************************************/
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   235
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   236
/** Offer generic device to master.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   237
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   238
int ec_gen_device_offer(
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   239
        ec_gen_device_t *dev,
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   240
        ec_gen_interface_desc_t *desc
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   241
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   242
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
    int ret = 0;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   245
	dev->used_netdev = desc->netdev;
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   246
	memcpy(dev->netdev->dev_addr, desc->dev_addr, ETH_ALEN);
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   247
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   248
    dev->ecdev = ecdev_offer(dev->netdev, ec_gen_poll, THIS_MODULE);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
    if (dev->ecdev) {
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   250
        if (ec_gen_device_create_socket(dev, desc)) {
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   251
            ecdev_withdraw(dev->ecdev);
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   252
            dev->ecdev = NULL;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   253
        } else if (ecdev_open(dev->ecdev)) {
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   254
            ecdev_withdraw(dev->ecdev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   255
            dev->ecdev = NULL;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   256
        } else {
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   257
			ecdev_set_link(dev->ecdev, netif_carrier_ok(dev->used_netdev)); // FIXME
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   258
            ret = 1;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   259
        }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   260
    }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
    return ret;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   264
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   265
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   266
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   267
/** Open the device.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   268
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   269
int ec_gen_device_open(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
        ec_gen_device_t *dev
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   271
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   272
{
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   273
    return 0;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   275
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   276
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
/** Stop the device.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   280
int ec_gen_device_stop(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
        ec_gen_device_t *dev
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   282
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   283
{
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   284
    return 0;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   286
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   287
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
int ec_gen_device_start_xmit(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
        ec_gen_device_t *dev,
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   291
        struct sk_buff *skb
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   292
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   293
{
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   294
    struct msghdr msg;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   295
    struct kvec iov;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   296
    size_t len = skb->len;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   297
    int ret;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   298
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   299
	ecdev_set_link(dev->ecdev,netif_carrier_ok(dev->used_netdev));
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   300
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   301
    iov.iov_base = skb->data;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   302
    iov.iov_len = len;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   303
    memset(&msg, 0, sizeof(msg));
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   304
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   305
    ret = kernel_sendmsg(dev->socket, &msg, &iov, 1, len);
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   306
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   307
    return ret == len ? NETDEV_TX_OK : NETDEV_TX_BUSY;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   308
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   309
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   310
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   311
1542
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   312
/** Polls the device.
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   313
 */
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   314
void ec_gen_device_poll(
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   315
        ec_gen_device_t *dev
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   316
        )
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   317
{
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   318
    struct msghdr msg;
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   319
    struct kvec iov;
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   320
    int ret, budget = 10; // FIXME
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   321
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   322
	ecdev_set_link(dev->ecdev,netif_carrier_ok(dev->used_netdev));
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   323
	do {
1559
1b3a89f6dc29 Fixed receiving multiple frames in generic device.
Florian Pose <fp@igh-essen.com>
parents: 1558
diff changeset
   324
        iov.iov_base = dev->rx_buf;
1b3a89f6dc29 Fixed receiving multiple frames in generic device.
Florian Pose <fp@igh-essen.com>
parents: 1558
diff changeset
   325
        iov.iov_len = EC_GEN_RX_BUF_SIZE;
1b3a89f6dc29 Fixed receiving multiple frames in generic device.
Florian Pose <fp@igh-essen.com>
parents: 1558
diff changeset
   326
        memset(&msg, 0, sizeof(msg));
1b3a89f6dc29 Fixed receiving multiple frames in generic device.
Florian Pose <fp@igh-essen.com>
parents: 1558
diff changeset
   327
1542
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   328
        ret = kernel_recvmsg(dev->socket, &msg, &iov, 1, iov.iov_len,
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   329
                MSG_DONTWAIT);
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   330
        if (ret > 0) {
1558
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   331
            ecdev_receive(dev->ecdev, dev->rx_buf, ret);
1542
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   332
        } else if (ret < 0) {
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   333
            break;
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   334
        }
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   335
        budget--;
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   336
    } while (budget);
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   337
}
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   338
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   339
/*****************************************************************************/
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   340
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   341
/** Offer device.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   342
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   343
int offer_device(
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   344
        ec_gen_interface_desc_t *desc
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   345
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   346
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   347
    ec_gen_device_t *gendev;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   348
    int ret = 0;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
    gendev = kmalloc(sizeof(ec_gen_device_t), GFP_KERNEL);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
    if (!gendev) {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   352
        return -ENOMEM;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   353
    }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   354
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   355
    ret = ec_gen_device_init(gendev);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
    if (ret) {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
        kfree(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
        return ret;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
    }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   361
    if (ec_gen_device_offer(gendev, desc)) {
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
        list_add_tail(&gendev->list, &generic_devices);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   363
    } else {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
        ec_gen_device_clear(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   365
        kfree(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   366
    }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   367
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   368
    return ret;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   369
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
/** Clear devices.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   374
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   375
void clear_devices(void)
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
    ec_gen_device_t *gendev, *next;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   378
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   379
    list_for_each_entry_safe(gendev, next, &generic_devices, list) {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
        list_del(&gendev->list);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
        ec_gen_device_clear(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
        kfree(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
    }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   384
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   385
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   386
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   387
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   388
/** Module initialization.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
 * Initializes \a master_count masters.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
 * \return 0 on success, else < 0
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   392
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   393
int __init ec_gen_init_module(void)
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   394
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   395
    int ret = 0;
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   396
    struct list_head descs;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
    struct net_device *netdev;
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   398
    ec_gen_interface_desc_t *desc, *next;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
    printk(KERN_INFO PFX "EtherCAT master generic Ethernet device module %s\n",
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
            EC_MASTER_VERSION);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   402
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   403
    INIT_LIST_HEAD(&generic_devices);
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   404
    INIT_LIST_HEAD(&descs);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   406
    read_lock(&dev_base_lock);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
    for_each_netdev(&init_net, netdev) {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
        if (netdev->type != ARPHRD_ETHER)
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   409
            continue;
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   410
        desc = kmalloc(sizeof(ec_gen_interface_desc_t), GFP_KERNEL);
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   411
        if (!desc) {
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   412
            ret = -ENOMEM;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
            read_unlock(&dev_base_lock);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
            goto out_err;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
        }
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   416
        strncpy(desc->name, netdev->name, IFNAMSIZ);
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   417
		desc->netdev = netdev;
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   418
        desc->ifindex = netdev->ifindex;
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   419
        memcpy(desc->dev_addr, netdev->dev_addr, ETH_ALEN);
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   420
        list_add_tail(&desc->list, &descs);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
    }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
    read_unlock(&dev_base_lock);
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   423
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   424
    list_for_each_entry_safe(desc, next, &descs, list) {
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   425
        ret = offer_device(desc);
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   426
        if (ret) {
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   427
            goto out_err;
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   428
        }
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   429
        kfree(desc);
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   430
    }
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   431
    return ret;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   432
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   433
out_err:
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   434
    list_for_each_entry_safe(desc, next, &descs, list) {
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   435
        list_del(&desc->list);
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   436
        kfree(desc);
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   437
    }
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   438
    clear_devices();
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   439
    return ret;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   440
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   441
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   442
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   443
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   444
/** Module cleanup.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   445
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
 * Clears all master instances.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
void __exit ec_gen_cleanup_module(void)
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   449
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   450
    clear_devices();
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
    printk(KERN_INFO PFX "Unloading.\n");
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   453
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   454
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   455
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   456
/** \cond */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   457
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   458
module_init(ec_gen_init_module);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
module_exit(ec_gen_cleanup_module);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   460
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   461
/** \endcond */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   462
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   463
/*****************************************************************************/