master/module.c
author Florian Pose <fp@igh-essen.com>
Thu, 12 Jun 2008 13:30:20 +0000
changeset 1007 b6c3527697c3
parent 997 652180478e95
child 1011 a0759d0dded4
permissions -rw-r--r--
Minor change.
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     4
 *
197
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
     5
 *  Copyright (C) 2006  Florian Pose, Ingenieurgemeinschaft IgH
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
     6
 *
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
     7
 *  This file is part of the IgH EtherCAT Master.
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
     8
 *
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    10
 *  and/or modify it under the terms of the GNU General Public License
246
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    11
 *  as published by the Free Software Foundation; either version 2 of the
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    12
 *  License, or (at your option) any later version.
197
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    13
 *
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    14
 *  The IgH EtherCAT Master is distributed in the hope that it will be
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    15
 *  useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    16
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    17
 *  GNU General Public License for more details.
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    18
 *
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    19
 *  You should have received a copy of the GNU General Public License
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    20
 *  along with the IgH EtherCAT Master; if not, write to the Free Software
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    21
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    22
 *
246
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    23
 *  The right to use EtherCAT Technology is granted and comes free of
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    24
 *  charge under condition of compatibility of product made by
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    25
 *  Licensee. People intending to distribute/sell products based on the
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    26
 *  code, have to sign an agreement to guarantee that products using
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    27
 *  software based on IgH EtherCAT master stay compatible with the actual
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    28
 *  EtherCAT specification (which are released themselves as an open
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    29
 *  standard) as the (only) precondition to have the right to use EtherCAT
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    30
 *  Technology, IP and trade marks.
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    31
 *
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
    32
 *****************************************************************************/
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    33
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    34
/** \file
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    35
 * EtherCAT master driver module.
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    36
 */
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    37
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    38
/*****************************************************************************/
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    39
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    40
#include <linux/module.h>
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    41
184
2fc86cec12df Macro for SysFS attribute definition
Florian Pose <fp@igh-essen.com>
parents: 178
diff changeset
    42
#include "globals.h"
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    43
#include "master.h"
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    44
#include "device.h"
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    45
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    46
/*****************************************************************************/
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    47
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    48
#define MAX_MASTERS 5 /**< Maximum number of masters. */
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    49
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    50
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    51
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    52
int __init ec_init_module(void);
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    53
void __exit ec_cleanup_module(void);
52
c0405659a74a Neues Interface.
Florian Pose <fp@igh-essen.com>
parents: 42
diff changeset
    54
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    55
static int ec_mac_parse(uint8_t *, const char *, int);
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    56
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    57
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    58
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    59
static char *main_devices[MAX_MASTERS]; /**< Main devices parameter. */
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    60
static char *backup_devices[MAX_MASTERS]; /**< Backup devices parameter. */
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    61
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    62
static ec_master_t *masters; /**< Array of masters. */
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    63
static struct semaphore master_sem; /**< Master semaphore. */
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    64
static unsigned int master_count; /**< Number of masters. */
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    65
static unsigned int backup_count; /**< Number of backup devices. */
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    66
954
4e7be3b24622 Removed static from device.
Florian Pose <fp@igh-essen.com>
parents: 922
diff changeset
    67
dev_t device_number; /**< Device number for master cdevs. */
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
    68
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    69
static uint8_t macs[MAX_MASTERS][2][ETH_ALEN]; /**< MAC addresses. */
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    70
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    71
char *ec_master_version_str = EC_MASTER_VERSION; /**< Version string. */
444
31223539fc00 Compiler flag -DSVNREV only for module.c to avoid unnecessary recompiling.
Florian Pose <fp@igh-essen.com>
parents: 430
diff changeset
    72
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
    73
/*****************************************************************************/
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
    74
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    75
/** \cond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    76
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
    77
MODULE_AUTHOR("Florian Pose <fp@igh-essen.com>");
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
    78
MODULE_DESCRIPTION("EtherCAT master driver module");
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    79
MODULE_LICENSE("GPL");
382
72500991bcc3 Altered master version string.
Florian Pose <fp@igh-essen.com>
parents: 381
diff changeset
    80
MODULE_VERSION(EC_MASTER_VERSION);
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
    81
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    82
module_param_array(main_devices, charp, &master_count, S_IRUGO);
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    83
MODULE_PARM_DESC(main_devices, "MAC addresses of main devices");
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    84
module_param_array(backup_devices, charp, &backup_count, S_IRUGO);
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    85
MODULE_PARM_DESC(backup_devices, "MAC addresses of backup devices");
195
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
    86
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    87
/** \endcond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    88
195
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
    89
/*****************************************************************************/
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
    90
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    91
/** Module initialization.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    92
 *
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
    93
 * Initializes \a master_count masters.
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    94
 * \return 0 on success, else < 0
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    95
 */
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    96
int __init ec_init_module(void)
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    97
{
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    98
    int i, ret = 0;
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
    99
382
72500991bcc3 Altered master version string.
Florian Pose <fp@igh-essen.com>
parents: 381
diff changeset
   100
    EC_INFO("Master driver %s\n", EC_MASTER_VERSION);
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   101
653
33aa0e7e5a68 Fixed missing semaphore initialization.
Florian Pose <fp@igh-essen.com>
parents: 648
diff changeset
   102
    init_MUTEX(&master_sem);
33aa0e7e5a68 Fixed missing semaphore initialization.
Florian Pose <fp@igh-essen.com>
parents: 648
diff changeset
   103
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   104
    if (master_count) {
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   105
        if (alloc_chrdev_region(&device_number, 0, master_count, "EtherCAT")) {
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   106
            EC_ERR("Failed to obtain device number(s)!\n");
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   107
            ret = -EBUSY;
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   108
            goto out_return;
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   109
        }
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   110
    }
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   111
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   112
    // zero MAC addresses
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   113
    memset(macs, 0x00, sizeof(uint8_t) * MAX_MASTERS * 2 * ETH_ALEN);
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   114
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   115
    // process MAC parameters
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   116
    for (i = 0; i < master_count; i++) {
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   117
        if (ec_mac_parse(macs[i][0], main_devices[i], 0)) {
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   118
            ret = -EINVAL;
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   119
            goto out_cdev;
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   120
        }
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   121
        
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   122
        if (i < backup_count && ec_mac_parse(macs[i][1], backup_devices[i], 1)) {
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   123
            ret = -EINVAL;
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   124
            goto out_cdev;
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   125
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   126
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   127
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   128
    if (master_count) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   129
        if (!(masters = kmalloc(sizeof(ec_master_t) * master_count,
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   130
                        GFP_KERNEL))) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   131
            EC_ERR("Failed to allocate memory for EtherCAT masters.\n");
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   132
            ret = -ENOMEM;
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   133
            goto out_cdev;
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   134
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   135
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   136
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   137
    for (i = 0; i < master_count; i++) {
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   138
        if (ec_master_init(&masters[i], i, macs[i][0], macs[i][1],
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   139
                    device_number)) {
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   140
            ret = -ENOMEM;
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   141
            goto out_free_masters;
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   142
        }
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   143
    }
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   144
    
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   145
    EC_INFO("%u master%s waiting for devices.\n",
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   146
            master_count, (master_count == 1 ? "" : "s"));
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   147
    return ret;
127
e67c80a76de4 Code aufger?umt und kleines Speicherleck entdeckt.
Florian Pose <fp@igh-essen.com>
parents: 111
diff changeset
   148
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   149
out_free_masters:
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   150
    for (i--; i >= 0; i--)
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   151
        ec_master_clear(&masters[i]);
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   152
    kfree(masters);
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   153
out_cdev:
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   154
    unregister_chrdev_region(device_number, master_count);
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   155
out_return:
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   156
    return ret;
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   157
}
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   158
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
   159
/*****************************************************************************/
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   160
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   161
/** Module cleanup.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   162
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   163
 * Clears all master instances.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   164
 */
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   165
void __exit ec_cleanup_module(void)
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   166
{
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   167
    unsigned int i;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   168
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   169
    for (i = 0; i < master_count; i++) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   170
        ec_master_clear(&masters[i]);
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   171
    }
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   172
    if (master_count) {
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   173
        kfree(masters);
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   174
        unregister_chrdev_region(device_number, master_count);
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   175
    }
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   176
    
575
9a2121b500b1 Layed out device ID functionality in own files.
Florian Pose <fp@igh-essen.com>
parents: 573
diff changeset
   177
    EC_INFO("Master module cleaned up.\n");
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   178
}
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   179
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   180
/*****************************************************************************
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   181
 * MAC address functions
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   182
 ****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   183
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   184
/**
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   185
 * \return true, if two MAC addresses are equal.
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   186
 */
840
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   187
int ec_mac_equal(
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   188
        const uint8_t *mac1, /**< First MAC address. */
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   189
        const uint8_t *mac2 /**< Second MAC address. */
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   190
        )
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   191
{
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   192
    unsigned int i;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   193
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   194
    for (i = 0; i < ETH_ALEN; i++)
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   195
        if (mac1[i] != mac2[i])
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   196
            return 0;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   197
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   198
    return 1;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   199
}
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   200
                
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   201
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   202
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   203
/** Print a MAC address to a buffer.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   204
 *
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   205
 * \return number of bytes written.
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   206
 */
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   207
ssize_t ec_mac_print(
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   208
        const uint8_t *mac, /**< MAC address */
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   209
        char *buffer /**< target buffer */
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   210
        )
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   211
{
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   212
    off_t off = 0;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   213
    unsigned int i;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   214
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   215
    for (i = 0; i < ETH_ALEN; i++) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   216
        off += sprintf(buffer + off, "%02X", mac[i]);
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   217
        if (i < ETH_ALEN - 1) off += sprintf(buffer + off, ":");
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   218
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   219
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   220
    return off;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   221
}
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   222
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   223
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   224
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   225
/**
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   226
 * \return true, if the MAC address is all-zero.
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   227
 */
840
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   228
int ec_mac_is_zero(
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   229
        const uint8_t *mac /**< MAC address. */
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   230
        )
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   231
{
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   232
    unsigned int i;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   233
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   234
    for (i = 0; i < ETH_ALEN; i++)
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   235
        if (mac[i])
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   236
            return 0;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   237
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   238
    return 1;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   239
}
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   240
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   241
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   242
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   243
/**
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   244
 * \return true, if the given MAC address is the broadcast address.
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   245
 */
840
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   246
int ec_mac_is_broadcast(
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   247
        const uint8_t *mac /**< MAC address. */
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   248
        )
700
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   249
{
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   250
    unsigned int i;
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   251
    
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   252
    for (i = 0; i < ETH_ALEN; i++)
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   253
        if (mac[i] != 0xff)
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   254
            return 0;
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   255
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   256
    return 1;
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   257
}
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   258
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   259
/*****************************************************************************/
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   260
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   261
/** Parse a MAC address from a string.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   262
 *
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   263
 * The MAC address must follow the regexp
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   264
 * "([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}".
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   265
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   266
 * \return 0 on success, else < 0
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   267
 */
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   268
static int ec_mac_parse(uint8_t *mac, const char *src, int allow_empty)
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   269
{
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   270
    unsigned int i, value;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   271
    const char *orig = src;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   272
    char *rem;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   273
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   274
    if (!strlen(src)) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   275
        if (allow_empty){
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   276
            return 0;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   277
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   278
        else {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   279
            EC_ERR("MAC address may not be empty.\n");
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   280
            return -EINVAL;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   281
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   282
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   283
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   284
    for (i = 0; i < ETH_ALEN; i++) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   285
        value = simple_strtoul(src, &rem, 16);
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   286
        if (rem != src + 2
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   287
                || value > 0xFF
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   288
                || (i < ETH_ALEN - 1 && *rem != ':')) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   289
            EC_ERR("Invalid MAC address \"%s\".\n", orig);
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   290
            return -EINVAL;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   291
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   292
        mac[i] = value;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   293
        if (i < ETH_ALEN - 1)
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   294
            src = rem + 1; // skip colon
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   295
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   296
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   297
    return 0;
178
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 161
diff changeset
   298
}
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 161
diff changeset
   299
196
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   300
/*****************************************************************************/
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   301
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   302
/** Outputs frame contents for debugging purposes.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   303
 */
196
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   304
void ec_print_data(const uint8_t *data, /**< pointer to data */
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   305
                   size_t size /**< number of bytes to output */
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   306
                   )
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   307
{
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   308
    unsigned int i;
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   309
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   310
    EC_DBG("");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   311
    for (i = 0; i < size; i++) {
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   312
        printk("%02X ", data[i]);
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   313
        if ((i + 1) % 16 == 0) {
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   314
            printk("\n");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   315
            EC_DBG("");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   316
        }
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   317
    }
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   318
    printk("\n");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   319
}
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   320
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   321
/*****************************************************************************/
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   322
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   323
/** Outputs frame contents and differences for debugging purposes.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   324
 */
196
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   325
void ec_print_data_diff(const uint8_t *d1, /**< first data */
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   326
                        const uint8_t *d2, /**< second data */
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   327
                        size_t size /** number of bytes to output */
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   328
                        )
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   329
{
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   330
    unsigned int i;
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   331
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   332
    EC_DBG("");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   333
    for (i = 0; i < size; i++) {
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   334
        if (d1[i] == d2[i]) printk(".. ");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   335
        else printk("%02X ", d2[i]);
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   336
        if ((i + 1) % 16 == 0) {
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   337
            printk("\n");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   338
            EC_DBG("");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   339
        }
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   340
    }
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   341
    printk("\n");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   342
}
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   343
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   344
/*****************************************************************************/
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   345
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   346
/** Prints slave states in clear text.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   347
 */
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   348
size_t ec_state_string(uint8_t states, /**< slave states */
403
7bb931deccd9 Added EC_SLAVE_STATE_ACK_ERR to ec_state_string(); added EC_STATE_STRING_SIZE
Florian Pose <fp@igh-essen.com>
parents: 383
diff changeset
   349
                       char *buffer /**< target buffer
7bb931deccd9 Added EC_SLAVE_STATE_ACK_ERR to ec_state_string(); added EC_STATE_STRING_SIZE
Florian Pose <fp@igh-essen.com>
parents: 383
diff changeset
   350
                                       (min. EC_STATE_STRING_SIZE bytes) */
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   351
                       )
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   352
{
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   353
    off_t off = 0;
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   354
    unsigned int first = 1;
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   355
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   356
    if (!states) {
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   357
        off += sprintf(buffer + off, "(unknown)");
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   358
        return off;
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   359
    }
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   360
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   361
    if (states & EC_SLAVE_STATE_INIT) {
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   362
        off += sprintf(buffer + off, "INIT");
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   363
        first = 0;
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   364
    }
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   365
    if (states & EC_SLAVE_STATE_PREOP) {
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   366
        if (!first) off += sprintf(buffer + off, ", ");
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   367
        off += sprintf(buffer + off, "PREOP");
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   368
        first = 0;
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   369
    }
813
bfc3f1ab52de Fixed typo SAVEOP -> SAFEOP.
Florian Pose <fp@igh-essen.com>
parents: 806
diff changeset
   370
    if (states & EC_SLAVE_STATE_SAFEOP) {
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   371
        if (!first) off += sprintf(buffer + off, ", ");
813
bfc3f1ab52de Fixed typo SAVEOP -> SAFEOP.
Florian Pose <fp@igh-essen.com>
parents: 806
diff changeset
   372
        off += sprintf(buffer + off, "SAFEOP");
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   373
        first = 0;
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   374
    }
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   375
    if (states & EC_SLAVE_STATE_OP) {
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   376
        if (!first) off += sprintf(buffer + off, ", ");
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   377
        off += sprintf(buffer + off, "OP");
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   378
    }
403
7bb931deccd9 Added EC_SLAVE_STATE_ACK_ERR to ec_state_string(); added EC_STATE_STRING_SIZE
Florian Pose <fp@igh-essen.com>
parents: 383
diff changeset
   379
    if (states & EC_SLAVE_STATE_ACK_ERR) {
453
2ecaa53c6291 Changed output of ec_state_string() for error flag to "+ ERROR".
Florian Pose <fp@igh-essen.com>
parents: 448
diff changeset
   380
        if (!first) off += sprintf(buffer + off, " + ");
2ecaa53c6291 Changed output of ec_state_string() for error flag to "+ ERROR".
Florian Pose <fp@igh-essen.com>
parents: 448
diff changeset
   381
        off += sprintf(buffer + off, "ERROR");
403
7bb931deccd9 Added EC_SLAVE_STATE_ACK_ERR to ec_state_string(); added EC_STATE_STRING_SIZE
Florian Pose <fp@igh-essen.com>
parents: 383
diff changeset
   382
    }
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   383
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   384
    return off;
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   385
}
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   386
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   387
/******************************************************************************
195
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
   388
 *  Device interface
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   389
 *****************************************************************************/
33
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   390
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   391
/** Offers an EtherCAT device to a certain master.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   392
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   393
 * The master decides, if it wants to use the device for EtherCAT operation,
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   394
 * or not. It is important, that the offered net_device is not used by the
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   395
 * kernel IP stack. If the master, accepted the offer, the address of the
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   396
 * newly created EtherCAT device is written to the ecdev pointer, else the
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   397
 * pointer is written to zero.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   398
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   399
 * \return 0 on success, else < 0
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   400
 * \ingroup DeviceInterface
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   401
 */
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   402
int ecdev_offer(struct net_device *net_dev, /**< net_device to offer */
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   403
        ec_pollfunc_t poll, /**< device poll function */
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   404
        struct module *module, /**< pointer to the module */
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   405
        ec_device_t **ecdev /**< pointer to store a device on success */
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   406
        )
91
0120d6214948 Code-Dokumentation angepasst.
Florian Pose <fp@igh-essen.com>
parents: 88
diff changeset
   407
{
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   408
    ec_master_t *master;
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   409
    char str[20];
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   410
    unsigned int i;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   411
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   412
    for (i = 0; i < master_count; i++) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   413
        master = &masters[i];
700
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   414
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   415
        down(&master->device_sem);
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   416
        if (master->main_device.dev) { // master already has a device
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   417
            up(&master->device_sem);
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   418
            continue;
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   419
        }
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   420
            
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   421
        if (ec_mac_equal(master->main_mac, net_dev->dev_addr)
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   422
                || ec_mac_is_broadcast(master->main_mac)) {
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   423
            ec_mac_print(net_dev->dev_addr, str);
578
f402b4bd2f4d Removed ktype for module kobject; added backup device for master; device
Florian Pose <fp@igh-essen.com>
parents: 576
diff changeset
   424
            EC_INFO("Accepting device %s for master %u.\n",
f402b4bd2f4d Removed ktype for module kobject; added backup device for master; device
Florian Pose <fp@igh-essen.com>
parents: 576
diff changeset
   425
                    str, master->index);
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   426
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   427
            ec_device_attach(&master->main_device, net_dev, poll, module);
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   428
            up(&master->device_sem);
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   429
            
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   430
            sprintf(net_dev->name, "ec%u", master->index);
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   431
            *ecdev = &master->main_device; // offer accepted
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   432
            return 0; // no error
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   433
        }
700
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   434
        else {
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   435
            up(&master->device_sem);
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   436
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   437
            if (master->debug_level) {
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   438
                ec_mac_print(net_dev->dev_addr, str);
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   439
                EC_DBG("Master %u declined device %s.\n", master->index, str);
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   440
            }
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   441
        }
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   442
    }
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   443
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   444
    *ecdev = NULL; // offer declined
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   445
    return 0; // no error
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   446
}
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   447
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   448
/*****************************************************************************/
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   449
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   450
/** Withdraws an EtherCAT device from the master.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   451
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   452
 * The device is disconnected from the master and all device ressources
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   453
 * are freed.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   454
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   455
 * \attention Before calling this function, the ecdev_stop() function has
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   456
 *            to be called, to be sure that the master does not use the device
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   457
 *            any more.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   458
 * \ingroup DeviceInterface
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   459
 */
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   460
void ecdev_withdraw(ec_device_t *device /**< EtherCAT device */)
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   461
{
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   462
    ec_master_t *master = device->master;
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   463
    char str[20];
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   464
700
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   465
    ec_mac_print(device->dev->dev_addr, str);
578
f402b4bd2f4d Removed ktype for module kobject; added backup device for master; device
Florian Pose <fp@igh-essen.com>
parents: 576
diff changeset
   466
    EC_INFO("Master %u releasing main device %s.\n", master->index, str);
f402b4bd2f4d Removed ktype for module kobject; added backup device for master; device
Florian Pose <fp@igh-essen.com>
parents: 576
diff changeset
   467
    
381
006d3653701d Fixed race on duplicate device registering or device unregistering while requesting master.
Florian Pose <fp@igh-essen.com>
parents: 378
diff changeset
   468
    down(&master->device_sem);
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   469
    ec_device_detach(device);
381
006d3653701d Fixed race on duplicate device registering or device unregistering while requesting master.
Florian Pose <fp@igh-essen.com>
parents: 378
diff changeset
   470
    up(&master->device_sem);
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   471
}
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   472
497
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   473
/*****************************************************************************/
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   474
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   475
/** Opens the network device and makes the master enter IDLE mode.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   476
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   477
 * \return 0 on success, else < 0
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   478
 * \ingroup DeviceInterface
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   479
 */
497
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   480
int ecdev_open(ec_device_t *device /**< EtherCAT device */)
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   481
{
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   482
    if (ec_device_open(device)) {
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   483
        EC_ERR("Failed to open device!\n");
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   484
        return -1;
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   485
    }
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   486
525
8b20781bd1e0 Master workqueue replaced with kernel thread.
Florian Pose <fp@igh-essen.com>
parents: 497
diff changeset
   487
    if (ec_master_enter_idle_mode(device->master)) {
8b20781bd1e0 Master workqueue replaced with kernel thread.
Florian Pose <fp@igh-essen.com>
parents: 497
diff changeset
   488
        EC_ERR("Failed to enter idle mode!\n");
8b20781bd1e0 Master workqueue replaced with kernel thread.
Florian Pose <fp@igh-essen.com>
parents: 497
diff changeset
   489
        return -1;
8b20781bd1e0 Master workqueue replaced with kernel thread.
Florian Pose <fp@igh-essen.com>
parents: 497
diff changeset
   490
    }
8b20781bd1e0 Master workqueue replaced with kernel thread.
Florian Pose <fp@igh-essen.com>
parents: 497
diff changeset
   491
497
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   492
    return 0;
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   493
}
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   494
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   495
/*****************************************************************************/
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   496
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   497
/** Makes the master leave IDLE mode and closes the network device.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   498
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   499
 * \return 0 on success, else < 0
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   500
 * \ingroup DeviceInterface
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   501
 */
497
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   502
void ecdev_close(ec_device_t *device /**< EtherCAT device */)
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   503
{
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   504
    ec_master_leave_idle_mode(device->master);
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   505
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   506
    if (ec_device_close(device))
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   507
        EC_WARN("Failed to close device!\n");
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   508
}
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   509
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   510
/******************************************************************************
195
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
   511
 *  Realtime interface
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   512
 *****************************************************************************/
33
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   513
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   514
ec_master_t *ecrt_request_master(unsigned int master_index)
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   515
{
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   516
    ec_master_t *master;
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   517
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   518
    EC_INFO("Requesting master %u...\n", master_index);
178
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 161
diff changeset
   519
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   520
    if (master_index >= master_count) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   521
        EC_ERR("Invalid master index %u.\n", master_index);
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   522
        goto out_return;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   523
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   524
    master = &masters[master_index];
178
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 161
diff changeset
   525
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   526
    down(&master_sem);
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   527
    if (master->reserved) {
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   528
        up(&master_sem);
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   529
        EC_ERR("Master %u is already in use!\n", master_index);
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   530
        goto out_return;
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   531
    }
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   532
    master->reserved = 1;
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   533
    up(&master_sem);
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   534
648
0a6d38ec463f Made waiting for device semaphore uninterruptible.
Florian Pose <fp@igh-essen.com>
parents: 647
diff changeset
   535
    down(&master->device_sem);
0a6d38ec463f Made waiting for device semaphore uninterruptible.
Florian Pose <fp@igh-essen.com>
parents: 647
diff changeset
   536
    
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   537
    if (master->mode != EC_MASTER_MODE_IDLE) {
381
006d3653701d Fixed race on duplicate device registering or device unregistering while requesting master.
Florian Pose <fp@igh-essen.com>
parents: 378
diff changeset
   538
        up(&master->device_sem);
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   539
        EC_ERR("Master %u still waiting for devices!\n", master_index);
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   540
        goto out_release;
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   541
    }
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   542
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   543
    if (!try_module_get(master->main_device.module)) {
381
006d3653701d Fixed race on duplicate device registering or device unregistering while requesting master.
Florian Pose <fp@igh-essen.com>
parents: 378
diff changeset
   544
        up(&master->device_sem);
006d3653701d Fixed race on duplicate device registering or device unregistering while requesting master.
Florian Pose <fp@igh-essen.com>
parents: 378
diff changeset
   545
        EC_ERR("Device module is unloading!\n");
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   546
        goto out_release;
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   547
    }
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   548
381
006d3653701d Fixed race on duplicate device registering or device unregistering while requesting master.
Florian Pose <fp@igh-essen.com>
parents: 378
diff changeset
   549
    up(&master->device_sem);
006d3653701d Fixed race on duplicate device registering or device unregistering while requesting master.
Florian Pose <fp@igh-essen.com>
parents: 378
diff changeset
   550
446
8fede404c01f Persistent slave lists.
Florian Pose <fp@igh-essen.com>
parents: 444
diff changeset
   551
    if (ec_master_enter_operation_mode(master)) {
8fede404c01f Persistent slave lists.
Florian Pose <fp@igh-essen.com>
parents: 444
diff changeset
   552
        EC_ERR("Failed to enter OPERATION mode!\n");
8fede404c01f Persistent slave lists.
Florian Pose <fp@igh-essen.com>
parents: 444
diff changeset
   553
        goto out_module_put;
377
ecac8252f114 Changes in ecrt_request_master(); minor output changes.
Florian Pose <fp@igh-essen.com>
parents: 361
diff changeset
   554
    }
ecac8252f114 Changes in ecrt_request_master(); minor output changes.
Florian Pose <fp@igh-essen.com>
parents: 361
diff changeset
   555
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   556
    EC_INFO("Successfully requested master %u.\n", master_index);
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   557
    return master;
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   558
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   559
 out_module_put:
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   560
    module_put(master->main_device.module);
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   561
 out_release:
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   562
    master->reserved = 0;
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   563
 out_return:
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   564
    return NULL;
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   565
}
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   566
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
   567
/*****************************************************************************/
33
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   568
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   569
void ecrt_release_master(ec_master_t *master)
33
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   570
{
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   571
    EC_INFO("Releasing master %u...\n", master->index);
531
8d9339e7453f Warn on duplicate master releasing.
Florian Pose <fp@igh-essen.com>
parents: 525
diff changeset
   572
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   573
    if (!master->reserved) {
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   574
        EC_WARN("Master %u was was not requested!\n", master->index);
531
8d9339e7453f Warn on duplicate master releasing.
Florian Pose <fp@igh-essen.com>
parents: 525
diff changeset
   575
        return;
8d9339e7453f Warn on duplicate master releasing.
Florian Pose <fp@igh-essen.com>
parents: 525
diff changeset
   576
    }
8d9339e7453f Warn on duplicate master releasing.
Florian Pose <fp@igh-essen.com>
parents: 525
diff changeset
   577
446
8fede404c01f Persistent slave lists.
Florian Pose <fp@igh-essen.com>
parents: 444
diff changeset
   578
    ec_master_leave_operation_mode(master);
151
1961b674466c Plugfest: master_open()/close() ausgelagert.
Florian Pose <fp@igh-essen.com>
parents: 127
diff changeset
   579
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   580
    module_put(master->main_device.module);
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   581
    master->reserved = 0;
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   582
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   583
    EC_INFO("Released master %u.\n", master->index);
33
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   584
}
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   585
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
   586
/*****************************************************************************/
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   587
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   588
unsigned int ecrt_version_magic(void)
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   589
{
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   590
    return ECRT_VERSION_MAGIC;
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   591
}
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   592
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   593
/*****************************************************************************/
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   594
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   595
/** \cond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   596
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   597
module_init(ec_init_module);
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   598
module_exit(ec_cleanup_module);
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   599
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   600
EXPORT_SYMBOL(ecdev_offer);
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   601
EXPORT_SYMBOL(ecdev_withdraw);
497
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   602
EXPORT_SYMBOL(ecdev_open);
04552130dd54 Re-introduced ecdev_open() and ecdev_close(), to avoid a race condition regarding the link state.
Florian Pose <fp@igh-essen.com>
parents: 495
diff changeset
   603
EXPORT_SYMBOL(ecdev_close);
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   604
104
052bc82d5442 MERGE branches/async -> trunk (alle Unterschiede ?bernommen)
Florian Pose <fp@igh-essen.com>
parents: 101
diff changeset
   605
EXPORT_SYMBOL(ecrt_request_master);
052bc82d5442 MERGE branches/async -> trunk (alle Unterschiede ?bernommen)
Florian Pose <fp@igh-essen.com>
parents: 101
diff changeset
   606
EXPORT_SYMBOL(ecrt_release_master);
545
6c4322e118d6 Added EXPORT macro for ecrt_version_magic().
Florian Pose <fp@igh-essen.com>
parents: 541
diff changeset
   607
EXPORT_SYMBOL(ecrt_version_magic);
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   608
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   609
/** \endcond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   610
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   611
/*****************************************************************************/