devices/rtdmnet.c
author Edouard Tisserant <edouard.tisserant@gmail.com>
Tue, 09 Oct 2018 09:22:53 +0200
branchstable-1.5
changeset 2727 32c9a2dea9ed
parent 2726 ca80d6dac4c8
permissions -rw-r--r--
devices/rtdmnet.c : fixed indentation and error handling.
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     1
/******************************************************************************
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     2
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     3
 *  $Id$
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     4
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     5
 *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     6
 *  Copyright (C) 2014-2018  Edouard Tisserant
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     7
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     8
 *  This file is part of the IgH EtherCAT Master.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     9
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    10
 *  The IgH EtherCAT Master is free software; you can redistribute it and/or
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    11
 *  modify it under the terms of the GNU General Public License version 2, as
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    12
 *  published by the Free Software Foundation.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    13
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    14
 *  The IgH EtherCAT Master is distributed in the hope that it will be useful,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    15
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    16
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    17
 *  Public License for more details.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    18
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    19
 *  You should have received a copy of the GNU General Public License along
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    20
 *  with the IgH EtherCAT Master; if not, write to the Free Software
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    21
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    22
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    23
 *  ---
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    24
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    25
 *  The license mentioned above concerns the source code only. Using the
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    26
 *  EtherCAT technology and brand is only permitted in compliance with the
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    27
 *  industrial property and similar rights of Beckhoff Automation GmbH.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    28
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    29
 *****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    30
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    31
/** \file
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    32
 * EtherCAT generic Xenomai's RTDM RAW Ethernet socket device module.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    33
 * Heavily based on generic.c. Should be merged in a single file with #ifdefs
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    34
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    35
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    36
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    37
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    38
#include <linux/module.h>
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    39
#include <linux/device.h>
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    40
#include <linux/err.h>
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    41
#include <linux/version.h>
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    42
#include <linux/if_arp.h> /* ARPHRD_ETHER */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    43
#include <linux/etherdevice.h>
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    44
#include <rtdm/rtdm.h>
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    45
2717
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
    46
// for rtnetif_carrier_ok and rtpc_dispatch_call
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    47
// This needs -I@XENOMAI_DIR@/kernel/drivers/net/stack/include in Kbuild.in
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    48
#include <rtnet_port.h>
2717
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
    49
#include <rtnet_rtpc.h>
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    50
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    51
#include "../globals.h"
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    52
#include "ecdev.h"
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    53
2711
a5c4ccc02285 Fixed rtdmnet.c PFX and removed useless commented code.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2709
diff changeset
    54
#define PFX "ec_rtdmnet: "
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    55
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    56
#define ETH_P_ETHERCAT 0x88A4
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    57
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    58
#define EC_GEN_RX_BUF_SIZE 1600
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    59
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    60
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    61
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    62
int __init ec_gen_init_module(void);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    63
void __exit ec_gen_cleanup_module(void);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    64
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    65
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    66
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    67
/** \cond */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    68
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    69
MODULE_AUTHOR("Edouard Tisserant <edouard.tisserant@gmail.com>");
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    70
MODULE_DESCRIPTION("EtherCAT generic Xenomai's RTDM RAW Ethernet socket device module.");
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    71
MODULE_LICENSE("GPL");
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    72
MODULE_VERSION(EC_MASTER_VERSION);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    73
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    74
/** \endcond */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    75
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    76
struct list_head generic_devices;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    77
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    78
typedef struct {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    79
    struct list_head list;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    80
    struct net_device *netdev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    81
    struct rtnet_device *used_netdev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    82
    int socket;
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
    83
    struct rtdm_fd *rtdm_fd;
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    84
    ec_device_t *ecdev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    85
    uint8_t *rx_buf;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    86
    // struct sockaddr_ll dest_addr;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    87
} ec_gen_device_t;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    88
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    89
typedef struct {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    90
    struct list_head list;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    91
    struct rtnet_device *netdev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    92
    char name[IFNAMSIZ];
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    93
    int ifindex;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    94
    uint8_t dev_addr[ETH_ALEN];
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    95
} ec_gen_interface_desc_t;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    96
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    97
int ec_gen_device_open(ec_gen_device_t *);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    98
int ec_gen_device_stop(ec_gen_device_t *);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    99
int ec_gen_device_start_xmit(ec_gen_device_t *, struct sk_buff *);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   100
void ec_gen_device_poll(ec_gen_device_t *);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   101
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   102
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   103
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   104
static int ec_gen_netdev_open(struct net_device *dev)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   105
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   106
    ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   107
    return ec_gen_device_open(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   108
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   109
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   110
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   111
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   112
static int ec_gen_netdev_stop(struct net_device *dev)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   113
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   114
    ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   115
    return ec_gen_device_stop(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   116
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   117
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   118
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   119
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   120
static int ec_gen_netdev_start_xmit(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   121
        struct sk_buff *skb,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   122
        struct net_device *dev
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   123
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   124
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   125
    ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   126
    return ec_gen_device_start_xmit(gendev, skb);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   127
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   128
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   129
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   130
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   131
void ec_gen_poll(struct net_device *dev)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   132
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   133
    ec_gen_device_t *gendev = *((ec_gen_device_t **) netdev_priv(dev));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   134
    ec_gen_device_poll(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   135
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   136
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   137
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   138
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   139
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   140
static const struct net_device_ops ec_gen_netdev_ops = {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   141
    .ndo_open       = ec_gen_netdev_open,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   142
    .ndo_stop       = ec_gen_netdev_stop,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   143
    .ndo_start_xmit = ec_gen_netdev_start_xmit,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   144
};
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   145
#endif
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   146
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   147
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   148
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   149
/** Init generic device.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   150
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   151
int ec_gen_device_init(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   152
        ec_gen_device_t *dev
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   153
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   154
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   155
    ec_gen_device_t **priv;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   156
    char null = 0x00;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   157
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   158
    dev->ecdev = NULL;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   159
    dev->socket = -1;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   160
    dev->rx_buf = NULL;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   161
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   162
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   163
    dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   164
            NET_NAME_UNKNOWN, ether_setup);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   165
#else
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   166
    dev->netdev = alloc_netdev(sizeof(ec_gen_device_t *), &null, ether_setup);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   167
#endif
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   168
    if (!dev->netdev) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   169
        return -ENOMEM;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   170
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   171
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   172
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   173
    dev->netdev->netdev_ops = &ec_gen_netdev_ops;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   174
#else
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   175
    dev->netdev->open = ec_gen_netdev_open;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   176
    dev->netdev->stop = ec_gen_netdev_stop;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   177
    dev->netdev->hard_start_xmit = ec_gen_netdev_start_xmit;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   178
#endif
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   179
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   180
    priv = netdev_priv(dev->netdev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   181
    *priv = dev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   182
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   183
    return 0;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   184
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   185
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   186
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   187
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   188
/** Clear generic device.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   189
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   190
void ec_gen_device_clear(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   191
        ec_gen_device_t *dev
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   192
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   193
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   194
    if (dev->ecdev) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   195
        ecdev_close(dev->ecdev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   196
        ecdev_withdraw(dev->ecdev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   197
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   198
    if (!(dev->socket < 0)) {
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   199
        rtdm_fd_put(dev->rtdm_fd);
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   200
        rtdm_close(dev->socket);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   201
        dev->socket = -1;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   202
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   203
    free_netdev(dev->netdev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   204
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   205
    if (dev->rx_buf) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   206
        kfree(dev->rx_buf);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   207
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   208
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   209
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   210
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   211
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   212
/** Creates a network socket.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   213
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   214
int ec_gen_device_create_socket(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   215
        ec_gen_device_t *dev,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   216
        ec_gen_interface_desc_t *desc
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   217
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   218
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   219
    int ret;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   220
    struct sockaddr_ll sa;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   221
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   222
    dev->rx_buf = kmalloc(EC_GEN_RX_BUF_SIZE, GFP_KERNEL);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   223
    if (!dev->rx_buf) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   224
        return -ENOMEM;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   225
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   226
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   227
    /* create rt-socket */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   228
    dev->socket = rtdm_socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ETHERCAT));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   229
    if (dev->socket < 0) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   230
        printk(" rtdm_socket() = %d!\n", dev->socket);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   231
        return dev->socket;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   232
    }
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   233
    
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   234
    /* HACK :
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   235
       When this is called, process is 'kernel', i.e. 
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   236
         cobalt_ppd_get(0) == &cobalt_kernel_ppd
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   237
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   238
       This makes a problem later when recvmsg or sendmsg is indirectly called
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   239
       from application's cobalt thread through RTDM IOCTL. From such thread, 
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   240
       RTDM can't resolv socket's 'ufd' that rtdm_socket just returned.
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   241
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   242
       To keep a usable file descriptor for that socket, even when calling 
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   243
       from cobalt thread (i.e. if (cobalt_ppd_get(0) != &cobalt_kernel_ppd))
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   244
       we resolve it here in advance */
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   245
    dev->rtdm_fd = rtdm_fd_get(dev->socket,0);
2727
32c9a2dea9ed devices/rtdmnet.c : fixed indentation and error handling.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2726
diff changeset
   246
    if (IS_ERR(dev->rtdm_fd)){
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   247
        printk(" rtdm_fd_get() = %d!\n", ret);
2727
32c9a2dea9ed devices/rtdmnet.c : fixed indentation and error handling.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2726
diff changeset
   248
        ret = PTR_ERR(dev->rtdm_fd);
32c9a2dea9ed devices/rtdmnet.c : fixed indentation and error handling.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2726
diff changeset
   249
        goto out_err_rtdm_fd;
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   250
    }
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   251
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   252
    printk(KERN_ERR PFX "Binding socket to interface %i (%s).\n",
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   253
            desc->ifindex, desc->name);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   254
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   255
    memset(&sa, 0x00, sizeof(sa));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   256
    sa.sll_family = AF_PACKET;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   257
    sa.sll_protocol = htons(ETH_P_ETHERCAT);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   258
    sa.sll_ifindex = desc->ifindex;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   259
    ret = rtdm_bind(dev->socket, (struct sockaddr *)&sa,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   260
                      sizeof(struct sockaddr_ll));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   261
    if (ret < 0) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   262
        printk(" rtdm_bind() = %d!\n", ret);
2727
32c9a2dea9ed devices/rtdmnet.c : fixed indentation and error handling.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2726
diff changeset
   263
        goto out_err_bind;
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   264
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   265
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   266
    return 0;
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   267
2727
32c9a2dea9ed devices/rtdmnet.c : fixed indentation and error handling.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2726
diff changeset
   268
out_err_bind:
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   269
    rtdm_fd_put(dev->rtdm_fd);
2727
32c9a2dea9ed devices/rtdmnet.c : fixed indentation and error handling.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2726
diff changeset
   270
out_err_rtdm_fd:
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   271
    rtdm_close(dev->socket);
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   272
    dev->socket = -1;
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   273
    return ret;
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   274
    
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   275
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   276
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   277
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   278
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   279
/** Offer generic device to master.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   280
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   281
int ec_gen_device_offer(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   282
        ec_gen_device_t *dev,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   283
        ec_gen_interface_desc_t *desc
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   284
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   285
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   286
    int ret = 0;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   287
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   288
    dev->used_netdev = desc->netdev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   289
    memcpy(dev->netdev->dev_addr, desc->dev_addr, ETH_ALEN);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   290
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   291
    dev->ecdev = ecdev_offer(dev->netdev, ec_gen_poll, THIS_MODULE);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   292
    if (dev->ecdev) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   293
        if (ec_gen_device_create_socket(dev, desc)) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   294
            ecdev_withdraw(dev->ecdev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   295
            dev->ecdev = NULL;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   296
        } else if (ecdev_open(dev->ecdev)) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   297
            ecdev_withdraw(dev->ecdev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   298
            dev->ecdev = NULL;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   299
        } else {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   300
            ecdev_set_link(dev->ecdev, rtnetif_carrier_ok(dev->used_netdev)); // FIXME
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   301
            ret = 1;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   302
        }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   303
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   304
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   305
    return ret;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   306
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   307
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   308
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   309
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   310
/** Open the device.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   311
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   312
int ec_gen_device_open(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   313
        ec_gen_device_t *dev
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   314
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   315
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   316
    return 0;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   317
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   318
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   319
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   320
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   321
/** Stop the device.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   322
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   323
int ec_gen_device_stop(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   324
        ec_gen_device_t *dev
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   325
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   326
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   327
    return 0;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   328
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   329
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   330
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   331
2717
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   332
// delegate to some rtdm thread when called from nrt context
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   333
struct sendmsg_params {
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   334
    int socket;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   335
    struct user_msghdr *msg;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   336
};
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   337
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   338
static int sendmsg_handler(struct rt_proc_call *call)
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   339
{
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   340
    struct sendmsg_params *params;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   341
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   342
    params = rtpc_get_priv(call, struct sendmsg_params);
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   343
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   344
    return rtdm_sendmsg(params->socket, params->msg, 0);
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   345
}
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   346
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   347
static ssize_t
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   348
nrt_rtdm_sendmsg(int socket, struct user_msghdr *msg)
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   349
{
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   350
    int ret;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   351
    struct sendmsg_params params = {socket, msg};
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   352
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   353
    ret = rtpc_dispatch_call(sendmsg_handler, 0, &params,
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   354
                             sizeof(params), NULL, NULL);
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   355
    return ret;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   356
}
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   357
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   358
int ec_gen_device_start_xmit(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   359
        ec_gen_device_t *dev,
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   360
        struct sk_buff *skb
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   361
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   362
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   363
    struct user_msghdr msg;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   364
    struct iovec iov;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   365
    size_t len = skb->len;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   366
    int ret;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   367
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   368
    ecdev_set_link(dev->ecdev, rtnetif_carrier_ok(dev->used_netdev));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   369
    //ecdev_set_link(dev->ecdev, 1); // FIXME
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   370
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   371
    iov.iov_base = skb->data;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   372
    iov.iov_len = len;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   373
    memset(&msg, 0, sizeof(msg));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   374
    // msg.msg_name    = &dev->dest_addr;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   375
    // msg.msg_namelen = sizeof(dev->dest_addr);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   376
    msg.msg_iov     = &iov;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   377
    msg.msg_iovlen  = 1;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   378
2727
32c9a2dea9ed devices/rtdmnet.c : fixed indentation and error handling.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2726
diff changeset
   379
    if (rtdm_in_rt_context())
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   380
        /* HACK : call fd ops directly as in rtdm's fd.c */
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   381
        ret = dev->rtdm_fd->ops->sendmsg_rt(dev->rtdm_fd, &msg, 0);
2727
32c9a2dea9ed devices/rtdmnet.c : fixed indentation and error handling.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2726
diff changeset
   382
    else
2717
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   383
        ret = nrt_rtdm_sendmsg(dev->socket, &msg);
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   384
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   385
    return ret == len ? NETDEV_TX_OK : NETDEV_TX_BUSY;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   386
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   387
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   388
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   389
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   390
/** Polls the device.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   391
 */
2717
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   392
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   393
// delegate to some rtdm thread when called from nrt context
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   394
struct recvmsg_params {
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   395
    int socket;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   396
    struct user_msghdr *msg;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   397
};
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   398
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   399
static int recvmsg_handler(struct rt_proc_call *call)
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   400
{
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   401
    struct recvmsg_params *params;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   402
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   403
    params = rtpc_get_priv(call, struct recvmsg_params);
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   404
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   405
    return  rtdm_recvmsg(params->socket, params->msg, MSG_DONTWAIT);
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   406
}
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   407
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   408
static ssize_t
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   409
nrt_rtdm_recvmsg(int socket, struct user_msghdr *msg)
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   410
{
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   411
    int ret;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   412
    struct recvmsg_params params = {socket,msg};
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   413
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   414
    ret = rtpc_dispatch_call(recvmsg_handler, 0, &params,
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   415
                             sizeof(params), NULL, NULL);
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   416
    return ret;
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   417
}
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   418
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   419
void ec_gen_device_poll(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   420
        ec_gen_device_t *dev
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   421
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   422
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   423
    struct user_msghdr msg;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   424
    struct iovec iov;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   425
    int ret, budget = 128; // FIXME
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   426
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   427
    ecdev_set_link(dev->ecdev, rtnetif_carrier_ok(dev->used_netdev));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   428
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   429
    do {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   430
        iov.iov_base = dev->rx_buf;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   431
        iov.iov_len = EC_GEN_RX_BUF_SIZE;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   432
        memset(&msg, 0, sizeof(msg));
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   433
        msg.msg_iov     = &iov;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   434
        msg.msg_iovlen  = 1;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   435
2726
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   436
        if (rtdm_in_rt_context()){
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   437
            /* HACK : call fd ops directly as in rtdm's fd.c */
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   438
            ret = dev->rtdm_fd->ops->recvmsg_rt(dev->rtdm_fd, &msg, MSG_DONTWAIT);
ca80d6dac4c8 devices/rtdmnet.c : abuse RTDM api to allow sendmsg and recvmsg to be called indirectly from userland cobalt process ioctl, while rtdm_socket is created from a kernel thread.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2722
diff changeset
   439
        }else
2717
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   440
            ret = nrt_rtdm_recvmsg(dev->socket, &msg);
b5e3de0467a5 Xenomai won't merge .nrt ops delegation to rtdm task through rtpc. Moved it to rtdmnet.c.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2711
diff changeset
   441
2709
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   442
        if (ret > 0) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   443
            ecdev_receive(dev->ecdev, dev->rx_buf, ret);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   444
        } else if (ret < 0) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   445
            break;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   446
        }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   447
        budget--;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   448
    } while (budget);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   449
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   450
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   451
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   452
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   453
/** Offer device.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   454
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   455
int offer_device(
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   456
        ec_gen_interface_desc_t *desc
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   457
        )
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   458
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   459
    ec_gen_device_t *gendev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   460
    int ret = 0;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   461
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   462
    gendev = kmalloc(sizeof(ec_gen_device_t), GFP_KERNEL);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   463
    if (!gendev) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   464
        return -ENOMEM;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   465
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   466
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   467
    ret = ec_gen_device_init(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   468
    if (ret) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   469
        kfree(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   470
        return ret;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   471
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   472
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   473
    if (ec_gen_device_offer(gendev, desc)) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   474
        list_add_tail(&gendev->list, &generic_devices);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   475
    } else {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   476
        ec_gen_device_clear(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   477
        kfree(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   478
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   479
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   480
    return ret;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   481
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   482
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   483
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   484
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   485
/** Clear devices.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   486
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   487
void clear_devices(void)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   488
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   489
    ec_gen_device_t *gendev, *next;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   490
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   491
    list_for_each_entry_safe(gendev, next, &generic_devices, list) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   492
        list_del(&gendev->list);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   493
        ec_gen_device_clear(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   494
        kfree(gendev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   495
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   496
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   497
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   498
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   499
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   500
/** Module initialization.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   501
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   502
 * Initializes \a master_count masters.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   503
 * \return 0 on success, else < 0
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   504
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   505
int __init ec_gen_init_module(void)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   506
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   507
    int ret = 0;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   508
    int devices = 0;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   509
    int i;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   510
    struct list_head descs;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   511
    struct rtnet_device *rtdev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   512
    ec_gen_interface_desc_t *desc, *next;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   513
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   514
    printk(KERN_INFO PFX "EtherCAT master RTnet Ethernet device module %s\n",
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   515
            EC_MASTER_VERSION);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   516
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   517
    INIT_LIST_HEAD(&generic_devices);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   518
    INIT_LIST_HEAD(&descs);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   519
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   520
    for (i = 0; i < MAX_RT_DEVICES; i++) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   521
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   522
        rtdev = rtdev_get_by_index(i);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   523
        if (rtdev != NULL) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   524
            mutex_lock(&rtdev->nrt_lock);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   525
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   526
            //if (test_bit(PRIV_FLAG_UP, &rtdev->priv_flags)) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   527
            //    mutex_unlock(&rtdev->nrt_lock);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   528
            //    printk(KERN_ERR PFX "%s busy, skipping device!\n", rtdev->name);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   529
            //    rtdev_dereference(rtdev);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   530
            //    continue;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   531
            //}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   532
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   533
            desc = kmalloc(sizeof(ec_gen_interface_desc_t), GFP_ATOMIC);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   534
            if (!desc) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   535
                ret = -ENOMEM;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   536
                goto out_err;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   537
            }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   538
            strncpy(desc->name, rtdev->name, IFNAMSIZ);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   539
            desc->netdev = rtdev;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   540
            desc->ifindex = rtdev->ifindex;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   541
            memcpy(desc->dev_addr, rtdev->dev_addr, ETH_ALEN);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   542
            list_add_tail(&desc->list, &descs);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   543
              mutex_unlock(&rtdev->nrt_lock);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   544
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   545
            devices++;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   546
        }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   547
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   548
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   549
    if (devices == 0) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   550
        printk(KERN_ERR PFX "no real-time devices found!\n");
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   551
        ret = -ENODEV;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   552
        goto out_err;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   553
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   554
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   555
    list_for_each_entry_safe(desc, next, &descs, list) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   556
        ret = offer_device(desc);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   557
        if (ret) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   558
            goto out_err;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   559
        }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   560
        kfree(desc);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   561
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   562
    return ret;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   563
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   564
out_err:
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   565
    list_for_each_entry_safe(desc, next, &descs, list) {
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   566
        list_del(&desc->list);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   567
        kfree(desc);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   568
    }
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   569
    clear_devices();
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   570
    return ret;
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   571
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   572
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   573
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   574
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   575
/** Module cleanup.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   576
 *
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   577
 * Clears all master instances.
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   578
 */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   579
void __exit ec_gen_cleanup_module(void)
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   580
{
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   581
    clear_devices();
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   582
    printk(KERN_INFO PFX "Unloading.\n");
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   583
}
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   584
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   585
/*****************************************************************************/
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   586
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   587
/** \cond */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   588
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   589
module_init(ec_gen_init_module);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   590
module_exit(ec_gen_cleanup_module);
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   591
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   592
/** \endcond */
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   593
e0c2f17ebed1 Added devices/rtdmnet.c, heavily based on devices/generic.c, and with similar purpose. It uses Xenomai's RTNet/RTDM socket instead of Linux socket.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
   594
/*****************************************************************************/