devices/generic.c
author Patrick Bruenn <p.bruenn@beckhoff.com>
Tue, 12 Apr 2016 11:17:36 +0200
branchstable-1.5
changeset 2654 b3f6b3e5ef29
parent 2631 827abf3c50de
child 2660 161c675135f0
permissions -rw-r--r--
devices/ccat: revert "limit rx processing to one frame per poll"

revert "limit rx processing to one frame per poll", which caused etherlab
frame timeouts in setups with more than one frame per cycle.
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;
1612
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
    73
    struct net_device *used_netdev;
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
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;
1612
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
    81
    struct net_device *netdev;
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
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
2631
827abf3c50de New alloc_netdev() API since kernel 3.17.
Florian Pose <fp@igh-essen.com>
parents: 2170
diff changeset
   152
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
827abf3c50de New alloc_netdev() API since kernel 3.17.
Florian Pose <fp@igh-essen.com>
parents: 2170
diff changeset
   153
    dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null,
827abf3c50de New alloc_netdev() API since kernel 3.17.
Florian Pose <fp@igh-essen.com>
parents: 2170
diff changeset
   154
            NET_NAME_UNKNOWN, ether_setup);
827abf3c50de New alloc_netdev() API since kernel 3.17.
Florian Pose <fp@igh-essen.com>
parents: 2170
diff changeset
   155
#else
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   156
    dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, ether_setup);
2631
827abf3c50de New alloc_netdev() API since kernel 3.17.
Florian Pose <fp@igh-essen.com>
parents: 2170
diff changeset
   157
#endif
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   158
    if (!dev->netdev) {
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   159
        return -ENOMEM;
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   160
    }
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   161
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   162
#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
   163
    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
   164
#else
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   165
    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
   166
    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
   167
    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
   168
#endif
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   169
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   170
    priv = netdev_priv(dev->netdev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
    *priv = dev;
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
    return 0;
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
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   176
/*****************************************************************************/
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
/** Clear generic device.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   180
void ec_gen_device_clear(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   181
        ec_gen_device_t *dev
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   182
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   183
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   184
    if (dev->ecdev) {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   185
        ecdev_close(dev->ecdev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   186
        ecdev_withdraw(dev->ecdev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   187
    }
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   188
    if (dev->socket) {
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   189
        sock_release(dev->socket);
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   190
    }
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   191
    free_netdev(dev->netdev);
1558
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   192
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   193
    if (dev->rx_buf) {
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   194
        kfree(dev->rx_buf);
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   195
    }
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   196
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   197
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   198
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   199
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   200
/** Creates a network socket.
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 ec_gen_device_create_socket(
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   203
        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
   204
        ec_gen_interface_desc_t *desc
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   205
        )
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   206
{
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   207
    int ret;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   208
    struct sockaddr_ll sa;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   209
1612
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   210
    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
   211
    if (!dev->rx_buf) {
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   212
        return -ENOMEM;
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   213
    }
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   214
2170
e69a5010914f Improved generic driver error messages.
Florian Pose <fp@igh-essen.com>
parents: 1833
diff changeset
   215
    ret = sock_create_kern(PF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT),
e69a5010914f Improved generic driver error messages.
Florian Pose <fp@igh-essen.com>
parents: 1833
diff changeset
   216
            &dev->socket);
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   217
    if (ret) {
2170
e69a5010914f Improved generic driver error messages.
Florian Pose <fp@igh-essen.com>
parents: 1833
diff changeset
   218
        printk(KERN_ERR PFX "Failed to create socket (ret = %i).\n", ret);
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   219
        return ret;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   220
    }
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   221
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   222
    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
   223
            desc->ifindex, desc->name);
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   224
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   225
    memset(&sa, 0x00, sizeof(sa));
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   226
    sa.sll_family = AF_PACKET;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   227
    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
   228
    sa.sll_ifindex = desc->ifindex;
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   229
    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
   230
    if (ret) {
2170
e69a5010914f Improved generic driver error messages.
Florian Pose <fp@igh-essen.com>
parents: 1833
diff changeset
   231
        printk(KERN_ERR PFX "Failed to bind() socket to interface"
e69a5010914f Improved generic driver error messages.
Florian Pose <fp@igh-essen.com>
parents: 1833
diff changeset
   232
                " (ret = %i).\n", ret);
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   233
        sock_release(dev->socket);
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   234
        dev->socket = NULL;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   235
        return ret;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   236
    }
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   237
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   238
    return 0;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   239
}
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   240
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   241
/*****************************************************************************/
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   242
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   243
/** Offer generic device to master.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   244
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   245
int ec_gen_device_offer(
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   246
        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
   247
        ec_gen_interface_desc_t *desc
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   248
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   249
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   250
    int ret = 0;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   251
1612
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   252
    dev->used_netdev = desc->netdev;
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   253
    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
   254
1555
7679e98b0bb1 Generic driver net_device_ops for kernels < 2.6.29.
Florian Pose <fp@igh-essen.com>
parents: 1542
diff changeset
   255
    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
   256
    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
   257
        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
   258
            ecdev_withdraw(dev->ecdev);
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   259
            dev->ecdev = NULL;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   260
        } else if (ecdev_open(dev->ecdev)) {
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   261
            ecdev_withdraw(dev->ecdev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   262
            dev->ecdev = NULL;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   263
        } else {
1612
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   264
            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
   265
            ret = 1;
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
    }
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
    return ret;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   270
}
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
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   273
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   274
/** Open the device.
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
int ec_gen_device_open(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   277
        ec_gen_device_t *dev
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   278
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   279
{
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   280
    return 0;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   281
}
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
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   284
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   285
/** Stop the device.
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
int ec_gen_device_stop(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   288
        ec_gen_device_t *dev
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   289
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   290
{
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   291
    return 0;
1540
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
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   294
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   295
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   296
int ec_gen_device_start_xmit(
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   297
        ec_gen_device_t *dev,
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   298
        struct sk_buff *skb
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   299
        )
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   300
{
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   301
    struct msghdr msg;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   302
    struct kvec iov;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   303
    size_t len = skb->len;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   304
    int ret;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   305
1612
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   306
    ecdev_set_link(dev->ecdev, netif_carrier_ok(dev->used_netdev));
1607
be4dd9c80f42 generic device driver checks link up/down
Martin Troxler <martin.troxler@komaxgroup.com>
parents: 1559
diff changeset
   307
1541
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   308
    iov.iov_base = skb->data;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   309
    iov.iov_len = len;
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   310
    memset(&msg, 0, sizeof(msg));
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   311
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   312
    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
   313
26ac1c611100 Sending via generic device works.
Florian Pose <fp@igh-essen.com>
parents: 1540
diff changeset
   314
    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
   315
}
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   316
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   317
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   318
1542
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   319
/** Polls the device.
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   320
 */
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   321
void ec_gen_device_poll(
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   322
        ec_gen_device_t *dev
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   323
        )
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   324
{
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   325
    struct msghdr msg;
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   326
    struct kvec iov;
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   327
    int ret, budget = 10; // FIXME
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   328
1612
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   329
    ecdev_set_link(dev->ecdev, netif_carrier_ok(dev->used_netdev));
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   330
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   331
    do {
1559
1b3a89f6dc29 Fixed receiving multiple frames in generic device.
Florian Pose <fp@igh-essen.com>
parents: 1558
diff changeset
   332
        iov.iov_base = dev->rx_buf;
1b3a89f6dc29 Fixed receiving multiple frames in generic device.
Florian Pose <fp@igh-essen.com>
parents: 1558
diff changeset
   333
        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
   334
        memset(&msg, 0, sizeof(msg));
1b3a89f6dc29 Fixed receiving multiple frames in generic device.
Florian Pose <fp@igh-essen.com>
parents: 1558
diff changeset
   335
1542
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   336
        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
   337
                MSG_DONTWAIT);
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   338
        if (ret > 0) {
1558
55213fcc93a6 generic device receive buffer in heap.
Florian Pose <fp@igh-essen.com>
parents: 1557
diff changeset
   339
            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
   340
        } else if (ret < 0) {
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   341
            break;
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   342
        }
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   343
        budget--;
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   344
    } while (budget);
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   345
}
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   346
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   347
/*****************************************************************************/
91ae9c95dd2e Implemented poll(); receiving on generic device also works.
Florian Pose <fp@igh-essen.com>
parents: 1541
diff changeset
   348
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   349
/** Offer device.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   350
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   351
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
   352
        ec_gen_interface_desc_t *desc
1540
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
{
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   355
    ec_gen_device_t *gendev;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   356
    int ret = 0;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   357
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   358
    gendev = kmalloc(sizeof(ec_gen_device_t), GFP_KERNEL);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   359
    if (!gendev) {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   360
        return -ENOMEM;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   361
    }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   362
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   363
    ret = ec_gen_device_init(gendev);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   364
    if (ret) {
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
        return ret;
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
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   369
    if (ec_gen_device_offer(gendev, desc)) {
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   370
        list_add_tail(&gendev->list, &generic_devices);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   371
    } else {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   372
        ec_gen_device_clear(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   373
        kfree(gendev);
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
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   376
    return ret;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   377
}
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
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   380
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   381
/** Clear devices.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   382
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   383
void clear_devices(void)
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
    ec_gen_device_t *gendev, *next;
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
    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
   388
        list_del(&gendev->list);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   389
        ec_gen_device_clear(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   390
        kfree(gendev);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   391
    }
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
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
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   396
/** Module initialization.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   397
 *
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   398
 * Initializes \a master_count masters.
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   399
 * \return 0 on success, else < 0
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   400
 */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   401
int __init ec_gen_init_module(void)
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
    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
   404
    struct list_head descs;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   405
    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
   406
    ec_gen_interface_desc_t *desc, *next;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   407
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   408
    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
   409
            EC_MASTER_VERSION);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   410
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   411
    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
   412
    INIT_LIST_HEAD(&descs);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   413
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   414
    read_lock(&dev_base_lock);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   415
    for_each_netdev(&init_net, netdev) {
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   416
        if (netdev->type != ARPHRD_ETHER)
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   417
            continue;
1833
5adbf2bc48d9 Fixed memory allocation while lock is held. Thanks to Esben Haabendal.
Florian Pose <fp@igh-essen.com>
parents: 1612
diff changeset
   418
        desc = kmalloc(sizeof(ec_gen_interface_desc_t), GFP_ATOMIC);
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   419
        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
   420
            ret = -ENOMEM;
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   421
            read_unlock(&dev_base_lock);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   422
            goto out_err;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   423
        }
1557
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   424
        strncpy(desc->name, netdev->name, IFNAMSIZ);
1612
c6779ebcda88 Removed tabulators.
Florian Pose <fp@igh-essen.com>
parents: 1607
diff changeset
   425
        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
   426
        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
   427
        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
   428
        list_add_tail(&desc->list, &descs);
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   429
    }
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   430
    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
   431
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   432
    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
   433
        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
   434
        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
   435
            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
   436
        }
daf92232d9c5 Fixed bug in generic driver failing to create debug interfaces, because the
Florian Pose <fp@igh-essen.com>
parents: 1555
diff changeset
   437
        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
   438
    }
1540
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
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
   442
    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
   443
        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
   444
        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
   445
    }
1540
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   446
    clear_devices();
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   447
    return ret;
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   448
}
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
/*****************************************************************************/
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   451
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   452
/** Module cleanup.
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
 * Clears all master instances.
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
void __exit ec_gen_cleanup_module(void)
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
    clear_devices();
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   459
    printk(KERN_INFO PFX "Unloading.\n");
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
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
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   464
/** \cond */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   465
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   466
module_init(ec_gen_init_module);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   467
module_exit(ec_gen_cleanup_module);
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   468
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   469
/** \endcond */
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   470
49430a3fe73d Basic generic Ethernet device module.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   471
/*****************************************************************************/