master/module.c
author Florian Pose <fp@igh-essen.com>
Thu, 19 Mar 2009 08:44:48 +0000
changeset 1374 1ca1178a3f93
parent 1363 11c0b2caa253
child 1399 f79d4bb5b23a
permissions -rw-r--r--
Warn if going to SAFEOP without configuration.
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
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
     5
 *  Copyright (C) 2006-2008  Florian Pose, Ingenieurgemeinschaft IgH
197
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
 *
1326
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
     9
 *  The IgH EtherCAT Master is free software; you can redistribute it and/or
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    10
 *  modify it under the terms of the GNU General Public License version 2, as
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    11
 *  published by the Free Software Foundation.
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    12
 *
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    13
 *  The IgH EtherCAT Master is distributed in the hope that it will be useful,
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    16
 *  Public License for more details.
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    17
 *
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    18
 *  You should have received a copy of the GNU General Public License along
ef907b0b5125 merge -c1603 branches/stable-1.4: Changed licence headers to avoid conflicts with the GPL; restricted licence to GPLv2 only.
Florian Pose <fp@igh-essen.com>
parents: 1313
diff changeset
    19
 *  with the IgH EtherCAT Master; if not, write to the Free Software
197
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 196
diff changeset
    20
 *  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
    21
 *
1363
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1337
diff changeset
    22
 *  ---
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1337
diff changeset
    23
 *
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1337
diff changeset
    24
 *  The license mentioned above concerns the source code only. Using the
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1337
diff changeset
    25
 *  EtherCAT technology and brand is only permitted in compliance with the
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1337
diff changeset
    26
 *  industrial property and similar rights of Beckhoff Automation GmbH.
246
0bf7c769de06 Changed license headers and added EtherCAT license notice.
Florian Pose <fp@igh-essen.com>
parents: 201
diff changeset
    27
 *
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
    28
 *****************************************************************************/
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    30
/** \file
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    31
 * 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
    32
 */
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    33
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    34
/*****************************************************************************/
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    35
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    36
#include <linux/module.h>
1014
d39d430cfdc4 Replaced include sysfs->device.
Florian Pose <fp@igh-essen.com>
parents: 1013
diff changeset
    37
#include <linux/device.h>
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
    38
#include <linux/err.h>
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    39
184
2fc86cec12df Macro for SysFS attribute definition
Florian Pose <fp@igh-essen.com>
parents: 178
diff changeset
    40
#include "globals.h"
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    41
#include "master.h"
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    42
#include "device.h"
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    43
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    44
/*****************************************************************************/
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    45
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
    46
#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
    47
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    48
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    49
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    50
int __init ec_init_module(void);
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    51
void __exit ec_cleanup_module(void);
52
c0405659a74a Neues Interface.
Florian Pose <fp@igh-essen.com>
parents: 42
diff changeset
    52
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    53
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
    54
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    55
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    56
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    57
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
    58
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
    59
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    60
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
    61
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
    62
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
    63
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
    64
954
4e7be3b24622 Removed static from device.
Florian Pose <fp@igh-essen.com>
parents: 922
diff changeset
    65
dev_t device_number; /**< Device number for master cdevs. */
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
    66
struct class *class; /**< Device class. */
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
    67
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    68
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
    69
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    70
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
    71
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
    72
/*****************************************************************************/
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
    73
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    74
/** \cond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    75
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
    76
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
    77
MODULE_DESCRIPTION("EtherCAT master driver module");
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    78
MODULE_LICENSE("GPL");
382
72500991bcc3 Altered master version string.
Florian Pose <fp@igh-essen.com>
parents: 381
diff changeset
    79
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
    80
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    81
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
    82
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
    83
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
    84
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
    85
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    86
/** \endcond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    87
195
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
    88
/*****************************************************************************/
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
    89
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    90
/** Module initialization.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
    91
 *
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
    92
 * 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
    93
 * \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
    94
 */
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    95
int __init ec_init_module(void)
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    96
{
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
    97
    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
    98
382
72500991bcc3 Altered master version string.
Florian Pose <fp@igh-essen.com>
parents: 381
diff changeset
    99
    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
   100
653
33aa0e7e5a68 Fixed missing semaphore initialization.
Florian Pose <fp@igh-essen.com>
parents: 648
diff changeset
   101
    init_MUTEX(&master_sem);
33aa0e7e5a68 Fixed missing semaphore initialization.
Florian Pose <fp@igh-essen.com>
parents: 648
diff changeset
   102
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   103
    if (master_count) {
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   104
        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
   105
            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
   106
            ret = -EBUSY;
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   107
            goto out_return;
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   108
        }
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   109
    }
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   110
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   111
    class = class_create(THIS_MODULE, "EtherCAT");
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   112
    if (IS_ERR(class)) {
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   113
        EC_ERR("Failed to create device class.\n");
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   114
        ret = PTR_ERR(class);
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   115
        goto out_cdev;
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   116
    }
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   117
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   118
    // 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
   119
    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
   120
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   121
    // 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
   122
    for (i = 0; i < master_count; i++) {
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   123
        ret = ec_mac_parse(macs[i][0], main_devices[i], 0);
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   124
        if (ret)
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   125
            goto out_class;
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   126
        
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   127
        if (i < backup_count) {
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   128
            ret = ec_mac_parse(macs[i][1], backup_devices[i], 1);
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   129
            if (ret)
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   130
                goto out_class;
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   131
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   132
    }
1279
6911450535b7 merge -c1522 branches/stable-1.4: Fixed jace in jiffies timeout calculation.
Florian Pose <fp@igh-essen.com>
parents: 1239
diff changeset
   133
6911450535b7 merge -c1522 branches/stable-1.4: Fixed jace in jiffies timeout calculation.
Florian Pose <fp@igh-essen.com>
parents: 1239
diff changeset
   134
    // initialize static master variables
6911450535b7 merge -c1522 branches/stable-1.4: Fixed jace in jiffies timeout calculation.
Florian Pose <fp@igh-essen.com>
parents: 1239
diff changeset
   135
    ec_master_init_static();
639
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
    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
   138
        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
   139
                        GFP_KERNEL))) {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   140
            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
   141
            ret = -ENOMEM;
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   142
            goto out_class;
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   143
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   144
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   145
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   146
    for (i = 0; i < master_count; i++) {
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   147
        ret = ec_master_init(&masters[i], i, macs[i][0], macs[i][1],
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   148
                    device_number, class);
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1312
diff changeset
   149
        if (ret)
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   150
            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
   151
    }
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   152
    
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   153
    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
   154
            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
   155
    return ret;
127
e67c80a76de4 Code aufger?umt und kleines Speicherleck entdeckt.
Florian Pose <fp@igh-essen.com>
parents: 111
diff changeset
   156
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   157
out_free_masters:
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   158
    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
   159
        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
   160
    kfree(masters);
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   161
out_class:
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   162
    class_destroy(class);
922
fede1d8f5b71 Added the new ethercat comman-line tool with lsec functionality.
Florian Pose <fp@igh-essen.com>
parents: 919
diff changeset
   163
out_cdev:
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   164
    if (master_count)
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   165
        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
   166
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
   167
    return ret;
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   168
}
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   169
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
   170
/*****************************************************************************/
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   171
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   172
/** Module cleanup.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   173
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   174
 * Clears all master instances.
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   175
 */
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   176
void __exit ec_cleanup_module(void)
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   177
{
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   178
    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
   179
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   180
    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
   181
        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
   182
    }
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   183
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   184
    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
   185
        kfree(masters);
1012
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   186
    
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   187
    class_destroy(class);
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   188
    
89f87a901ce5 Create device class. Preparation for device numbers in sysfs.
Florian Pose <fp@igh-essen.com>
parents: 1011
diff changeset
   189
    if (master_count)
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   190
        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
   191
    
575
9a2121b500b1 Layed out device ID functionality in own files.
Florian Pose <fp@igh-essen.com>
parents: 573
diff changeset
   192
    EC_INFO("Master module cleaned up.\n");
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   193
}
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   194
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   195
/*****************************************************************************
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   196
 * 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
   197
 ****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   198
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   199
/**
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   200
 * \return true, if two MAC addresses are equal.
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   201
 */
840
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   202
int ec_mac_equal(
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   203
        const uint8_t *mac1, /**< First MAC address. */
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   204
        const uint8_t *mac2 /**< Second MAC address. */
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   205
        )
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   206
{
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   207
    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
   208
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   209
    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
   210
        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
   211
            return 0;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   212
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   213
    return 1;
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
                
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   216
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   217
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   218
/** 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
   219
 *
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   220
 * \return number of bytes written.
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   221
 */
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   222
ssize_t ec_mac_print(
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   223
        const uint8_t *mac, /**< MAC address */
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   224
        char *buffer /**< target buffer */
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   225
        )
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   226
{
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   227
    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
   228
    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
   229
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   230
    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
   231
        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
   232
        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
   233
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   234
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   235
    return off;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   236
}
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
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   239
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   240
/**
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   241
 * \return true, if the MAC address is all-zero.
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   242
 */
840
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   243
int ec_mac_is_zero(
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   244
        const uint8_t *mac /**< MAC address. */
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   245
        )
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   246
{
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   247
    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
   248
    
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   249
    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
   250
        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
   251
            return 0;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   252
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   253
    return 1;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   254
}
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   255
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   256
/*****************************************************************************/
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   257
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   258
/**
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   259
 * \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
   260
 */
840
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   261
int ec_mac_is_broadcast(
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   262
        const uint8_t *mac /**< MAC address. */
64beeb6ce8e3 Added documentation.
Florian Pose <fp@igh-essen.com>
parents: 813
diff changeset
   263
        )
700
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   264
{
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   265
    unsigned int i;
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   266
    
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   267
    for (i = 0; i < ETH_ALEN; i++)
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   268
        if (mac[i] != 0xff)
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   269
            return 0;
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   270
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   271
    return 1;
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   272
}
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   273
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   274
/*****************************************************************************/
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   275
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   276
/** 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
   277
 *
758
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   278
 * The MAC address must follow the regexp
8fa6f825eb7d Updated Doxygen documentation.
Florian Pose <fp@igh-essen.com>
parents: 700
diff changeset
   279
 * "([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
   280
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   281
 * \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
   282
 */
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   283
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
   284
{
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   285
    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
   286
    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
   287
    char *rem;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   288
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   289
    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
   290
        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
   291
            return 0;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   292
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   293
        else {
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   294
            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
   295
            return -EINVAL;
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
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   298
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   299
    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
   300
        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
   301
        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
   302
                || value > 0xFF
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   303
                || (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
   304
            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
   305
            return -EINVAL;
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   306
        }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   307
        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
   308
        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
   309
            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
   310
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   311
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   312
    return 0;
178
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 161
diff changeset
   313
}
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 161
diff changeset
   314
196
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   315
/*****************************************************************************/
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   316
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   317
/** 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
   318
 */
196
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   319
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
   320
                   size_t size /**< number of bytes to output */
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
{
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   323
    unsigned int i;
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   324
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   325
    EC_DBG("");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   326
    for (i = 0; i < size; i++) {
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   327
        printk("%02X ", data[i]);
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   328
        if ((i + 1) % 16 == 0) {
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   329
            printk("\n");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   330
            EC_DBG("");
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
    }
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   333
    printk("\n");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   334
}
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   335
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   336
/*****************************************************************************/
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   337
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   338
/** 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
   339
 */
196
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   340
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
   341
                        const uint8_t *d2, /**< second data */
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   342
                        size_t size /** number of bytes to output */
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   343
                        )
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   344
{
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   345
    unsigned int i;
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   346
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   347
    EC_DBG("");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   348
    for (i = 0; i < size; i++) {
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   349
        if (d1[i] == d2[i]) printk(".. ");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   350
        else printk("%02X ", d2[i]);
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   351
        if ((i + 1) % 16 == 0) {
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   352
            printk("\n");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   353
            EC_DBG("");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   354
        }
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   355
    }
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   356
    printk("\n");
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   357
}
f8a1e9f364a3 Introduced version number define.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
   358
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
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   361
/** 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
   362
 */
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   363
size_t ec_state_string(uint8_t states, /**< slave states */
1337
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   364
                       char *buffer, /**< target buffer
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
   365
                                       (min. EC_STATE_STRING_SIZE bytes) */
1337
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   366
                       uint8_t multi /**< Show multi-state mask. */
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   367
                       )
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   368
{
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   369
    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
   370
    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
   371
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   372
    if (!states) {
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   373
        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
   374
        return off;
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   375
    }
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   376
1337
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   377
    if (multi) { // multiple slaves
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   378
        if (states & EC_SLAVE_STATE_INIT) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   379
            off += sprintf(buffer + off, "INIT");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   380
            first = 0;
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   381
        }
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   382
        if (states & EC_SLAVE_STATE_PREOP) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   383
            if (!first) off += sprintf(buffer + off, ", ");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   384
            off += sprintf(buffer + off, "PREOP");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   385
            first = 0;
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   386
        }
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   387
        if (states & EC_SLAVE_STATE_SAFEOP) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   388
            if (!first) off += sprintf(buffer + off, ", ");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   389
            off += sprintf(buffer + off, "SAFEOP");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   390
            first = 0;
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   391
        }
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   392
        if (states & EC_SLAVE_STATE_OP) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   393
            if (!first) off += sprintf(buffer + off, ", ");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   394
            off += sprintf(buffer + off, "OP");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   395
        }
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   396
    } else { // single slave
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   397
        if ((states & EC_SLAVE_STATE_MASK) == EC_SLAVE_STATE_INIT) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   398
            off += sprintf(buffer + off, "INIT");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   399
        } else if ((states & EC_SLAVE_STATE_MASK) == EC_SLAVE_STATE_PREOP) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   400
            off += sprintf(buffer + off, "PREOP");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   401
        } else if ((states & EC_SLAVE_STATE_MASK) == EC_SLAVE_STATE_BOOT) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   402
            off += sprintf(buffer + off, "BOOT");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   403
        } else if ((states & EC_SLAVE_STATE_MASK) == EC_SLAVE_STATE_SAFEOP) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   404
            off += sprintf(buffer + off, "SAFEOP");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   405
        } else if ((states & EC_SLAVE_STATE_MASK) == EC_SLAVE_STATE_OP) {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   406
            off += sprintf(buffer + off, "OP");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   407
        } else {
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   408
            off += sprintf(buffer + off, "(invalid)");
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   409
        }
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   410
        first = 0;
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   411
    }
1337
0253c74d0940 merge -c1619 branches/1.4-foe: Implemented going to bootstrap state BOOT.
Florian Pose <fp@igh-essen.com>
parents: 1332
diff changeset
   412
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
   413
    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
   414
        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
   415
        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
   416
    }
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   417
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 321
diff changeset
   418
    return off;
251
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   419
}
c1d0b63a9302 EoE in Free-Run mode; Finished slave configuration state machine.
Florian Pose <fp@igh-essen.com>
parents: 249
diff changeset
   420
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   421
/******************************************************************************
195
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
   422
 *  Device interface
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   423
 *****************************************************************************/
33
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   424
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   425
/** 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
   426
 *
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   427
 * 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
   428
 * 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
   429
 * kernel IP stack. If the master, accepted the offer, the address of the
1011
a0759d0dded4 Improved ecdev_offer().
Florian Pose <fp@igh-essen.com>
parents: 997
diff changeset
   430
 * newly created EtherCAT device is returned, else \a NULL is returned.
a0759d0dded4 Improved ecdev_offer().
Florian Pose <fp@igh-essen.com>
parents: 997
diff changeset
   431
 *
a0759d0dded4 Improved ecdev_offer().
Florian Pose <fp@igh-essen.com>
parents: 997
diff changeset
   432
 * \return Pointer to device, if accepted, or NULL if declined.
806
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   433
 * \ingroup DeviceInterface
ab8daaabbe48 Renamed master module parameters, re-formatted code documentation.
Florian Pose <fp@igh-essen.com>
parents: 794
diff changeset
   434
 */
1011
a0759d0dded4 Improved ecdev_offer().
Florian Pose <fp@igh-essen.com>
parents: 997
diff changeset
   435
ec_device_t *ecdev_offer(
a0759d0dded4 Improved ecdev_offer().
Florian Pose <fp@igh-essen.com>
parents: 997
diff changeset
   436
        struct net_device *net_dev, /**< net_device to offer */
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   437
        ec_pollfunc_t poll, /**< device poll function */
1011
a0759d0dded4 Improved ecdev_offer().
Florian Pose <fp@igh-essen.com>
parents: 997
diff changeset
   438
        struct module *module /**< pointer to the module */
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   439
        )
91
0120d6214948 Code-Dokumentation angepasst.
Florian Pose <fp@igh-essen.com>
parents: 88
diff changeset
   440
{
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   441
    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
   442
    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
   443
    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
   444
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   445
    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
   446
        master = &masters[i];
700
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   447
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   448
        down(&master->device_sem);
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   449
        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
   450
            up(&master->device_sem);
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   451
            continue;
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   452
        }
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   453
            
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   454
        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
   455
                || ec_mac_is_broadcast(master->main_mac)) {
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   456
            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
   457
            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
   458
                    str, master->index);
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   459
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   460
            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
   461
            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
   462
            
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   463
            sprintf(net_dev->name, "ec%u", master->index);
1011
a0759d0dded4 Improved ecdev_offer().
Florian Pose <fp@igh-essen.com>
parents: 997
diff changeset
   464
            return &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
   465
        }
700
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   466
        else {
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   467
            up(&master->device_sem);
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   468
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   469
            if (master->debug_level) {
a6b61f1a062d Broadcast MAC address accepts first device.
Florian Pose <fp@igh-essen.com>
parents: 653
diff changeset
   470
                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
   471
                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
   472
            }
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   473
        }
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   474
    }
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   475
1011
a0759d0dded4 Improved ecdev_offer().
Florian Pose <fp@igh-essen.com>
parents: 997
diff changeset
   476
    return NULL; // offer declined
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
   477
}
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
   478
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   479
/******************************************************************************
195
674071846ee3 Translated all comments and documentation to english language.
Florian Pose <fp@igh-essen.com>
parents: 191
diff changeset
   480
 *  Realtime interface
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   481
 *****************************************************************************/
33
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   482
1312
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   483
/** Request a master.
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   484
 *
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   485
 * Same as ecrt_request_master(), but with ERR_PTR() return value.
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   486
 */
1332
d62633fea8ed merge -c1610 branches/stable-1.4: Added missing doxygen docs.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   487
ec_master_t *ecrt_request_master_err(
d62633fea8ed merge -c1610 branches/stable-1.4: Added missing doxygen docs.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   488
        unsigned int master_index /**< Master index. */
d62633fea8ed merge -c1610 branches/stable-1.4: Added missing doxygen docs.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
   489
        )
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   490
{
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   491
    ec_master_t *master, *errptr = NULL;
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   492
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   493
    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
   494
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   495
    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
   496
        EC_ERR("Invalid master index %u.\n", master_index);
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   497
        errptr = ERR_PTR(-EINVAL);
639
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   498
        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
   499
    }
aa23c48dca2d Allow only MAC addresses as device identifiers; replaced master list by
Florian Pose <fp@igh-essen.com>
parents: 579
diff changeset
   500
    master = &masters[master_index];
178
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 161
diff changeset
   501
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   502
    if (down_interruptible(&master_sem)) {
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   503
        errptr = ERR_PTR(-EINTR);
1189
acc6430bfb32 Use down_interruptible() wherever possible.
Florian Pose <fp@igh-essen.com>
parents: 1029
diff changeset
   504
        goto out_return;
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   505
    }
1189
acc6430bfb32 Use down_interruptible() wherever possible.
Florian Pose <fp@igh-essen.com>
parents: 1029
diff changeset
   506
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   507
    if (master->reserved) {
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   508
        up(&master_sem);
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   509
        EC_ERR("Master %u is already in use!\n", master_index);
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   510
        errptr = ERR_PTR(-EBUSY);
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   511
        goto out_return;
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   512
    }
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   513
    master->reserved = 1;
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   514
    up(&master_sem);
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   515
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   516
    if (down_interruptible(&master->device_sem)) {
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   517
        errptr = ERR_PTR(-EINTR);
1189
acc6430bfb32 Use down_interruptible() wherever possible.
Florian Pose <fp@igh-essen.com>
parents: 1029
diff changeset
   518
        goto out_release;
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   519
    }
648
0a6d38ec463f Made waiting for device semaphore uninterruptible.
Florian Pose <fp@igh-essen.com>
parents: 647
diff changeset
   520
    
1029
61ffe5f22306 Renamed master 'mode' to 'phase'.
Florian Pose <fp@igh-essen.com>
parents: 1014
diff changeset
   521
    if (master->phase != EC_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
   522
        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
   523
        EC_ERR("Master %u still waiting for devices!\n", master_index);
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   524
        errptr = ERR_PTR(-ENODEV);
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   525
        goto out_release;
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   526
    }
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 64
diff changeset
   527
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   528
    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
   529
        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
   530
        EC_ERR("Device module is unloading!\n");
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   531
        errptr = ERR_PTR(-ENODEV);
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   532
        goto out_release;
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   533
    }
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   534
381
006d3653701d Fixed race on duplicate device registering or device unregistering while requesting master.
Florian Pose <fp@igh-essen.com>
parents: 378
diff changeset
   535
    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
   536
1029
61ffe5f22306 Renamed master 'mode' to 'phase'.
Florian Pose <fp@igh-essen.com>
parents: 1014
diff changeset
   537
    if (ec_master_enter_operation_phase(master)) {
61ffe5f22306 Renamed master 'mode' to 'phase'.
Florian Pose <fp@igh-essen.com>
parents: 1014
diff changeset
   538
        EC_ERR("Failed to enter OPERATION phase!\n");
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   539
        errptr = ERR_PTR(-EIO);
446
8fede404c01f Persistent slave lists.
Florian Pose <fp@igh-essen.com>
parents: 444
diff changeset
   540
        goto out_module_put;
377
ecac8252f114 Changes in ecrt_request_master(); minor output changes.
Florian Pose <fp@igh-essen.com>
parents: 361
diff changeset
   541
    }
ecac8252f114 Changes in ecrt_request_master(); minor output changes.
Florian Pose <fp@igh-essen.com>
parents: 361
diff changeset
   542
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   543
    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
   544
    return master;
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   545
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   546
 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
   547
    module_put(master->main_device.module);
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   548
 out_release:
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   549
    master->reserved = 0;
191
ca805255a935 Prepared Free-Run mode
Florian Pose <fp@igh-essen.com>
parents: 184
diff changeset
   550
 out_return:
1239
b50b93faaf3e Used ERR_PTR() macro for return value of ecrt_request_master().
Florian Pose <fp@igh-essen.com>
parents: 1209
diff changeset
   551
    return errptr;
27
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   552
}
d75ef6b46e33 EtherCAT-Master in eigenes Modul ausgelagert.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   553
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
   554
/*****************************************************************************/
33
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   555
1312
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   556
ec_master_t *ecrt_request_master(unsigned int master_index)
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   557
{
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   558
    ec_master_t *master = ecrt_request_master_err(master_index);
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   559
    return IS_ERR(master) ? NULL : master;
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   560
}
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   561
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   562
/*****************************************************************************/
74853e018898 Created backend versions of all API functions returing a pointer; using
Florian Pose <fp@igh-essen.com>
parents: 1279
diff changeset
   563
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   564
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
   565
{
647
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   566
    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
   567
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   568
    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
   569
        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
   570
        return;
8d9339e7453f Warn on duplicate master releasing.
Florian Pose <fp@igh-essen.com>
parents: 525
diff changeset
   571
    }
8d9339e7453f Warn on duplicate master releasing.
Florian Pose <fp@igh-essen.com>
parents: 525
diff changeset
   572
1029
61ffe5f22306 Renamed master 'mode' to 'phase'.
Florian Pose <fp@igh-essen.com>
parents: 1014
diff changeset
   573
    ec_master_leave_operation_phase(master);
151
1961b674466c Plugfest: master_open()/close() ausgelagert.
Florian Pose <fp@igh-essen.com>
parents: 127
diff changeset
   574
579
17c6fd3b076e Made master devices persistent; added ec_device_attach() and ec_device_detach().
Florian Pose <fp@igh-essen.com>
parents: 578
diff changeset
   575
    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
   576
    master->reserved = 0;
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   577
dc556a8c8fed Replaced master variable 'atomic_t available' by integer and used
Florian Pose <fp@igh-essen.com>
parents: 639
diff changeset
   578
    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
   579
}
f4171b8aadf8 Master-Reservierung und Use-Count f?r NIC-Treiber.
Florian Pose <fp@igh-essen.com>
parents: 27
diff changeset
   580
39
6965c23a6826 likely/unlikely, Fehlermeldungen in zyklischem Code begrenzt und Kommentare ge??ndert.
Florian Pose <fp@igh-essen.com>
parents: 34
diff changeset
   581
/*****************************************************************************/
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   582
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   583
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
   584
{
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   585
    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
   586
}
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   587
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   588
/*****************************************************************************/
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 758
diff changeset
   589
1209
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   590
/** Global request state type translation table.
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   591
 *
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   592
 * Translates an internal request state to an external one.
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   593
 */
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   594
const ec_request_state_t ec_request_state_translation_table[] = {
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   595
    EC_REQUEST_UNUSED,  // EC_INT_REQUEST_INIT,
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   596
    EC_REQUEST_BUSY,    // EC_INT_REQUEST_QUEUED,
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   597
    EC_REQUEST_BUSY,    // EC_INT_REQUEST_BUSY,
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   598
    EC_REQUEST_SUCCESS, // EC_INT_REQUEST_SUCCESS,
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   599
    EC_REQUEST_ERROR    // EC_INT_REQUEST_FAILURE
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   600
};
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   601
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   602
/*****************************************************************************/
8be462afb7f4 Added VoE handler.
Florian Pose <fp@igh-essen.com>
parents: 1189
diff changeset
   603
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   604
/** \cond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   605
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   606
module_init(ec_init_module);
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   607
module_exit(ec_cleanup_module);
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   608
573
cdee4ea90ce9 Introduced device IDs; removed comment lines from 8139too; removed
Florian Pose <fp@igh-essen.com>
parents: 572
diff changeset
   609
EXPORT_SYMBOL(ecdev_offer);
997
652180478e95 Removed kobject from master and module. Sysfs is gone!
Florian Pose <fp@igh-essen.com>
parents: 954
diff changeset
   610
104
052bc82d5442 MERGE branches/async -> trunk (alle Unterschiede ?bernommen)
Florian Pose <fp@igh-essen.com>
parents: 101
diff changeset
   611
EXPORT_SYMBOL(ecrt_request_master);
052bc82d5442 MERGE branches/async -> trunk (alle Unterschiede ?bernommen)
Florian Pose <fp@igh-essen.com>
parents: 101
diff changeset
   612
EXPORT_SYMBOL(ecrt_release_master);
545
6c4322e118d6 Added EXPORT macro for ecrt_version_magic().
Florian Pose <fp@igh-essen.com>
parents: 541
diff changeset
   613
EXPORT_SYMBOL(ecrt_version_magic);
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
   614
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   615
/** \endcond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   616
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   617
/*****************************************************************************/