master/domain.c
author Knud Baastrup <kba@deif.com>
Tue, 14 Apr 2015 13:12:24 -0400
changeset 2629 a2701af27fde
parent 2627 04c83089bac2
permissions -rwxr-xr-x
Internal SDO requests now synchronized with external requests.
Internal SDO requests are managed by master FSM and can conflict with
external requests managed by slave FSM. The internal SDO requests
includes SDO requests created by an application and external request are
typical created by EtherCAT Tool for SDO upload/download or a directory
fetch initiated with ethercat sdos command. The conflict will cause a
FPWR from an external request to be overwritten by a FPWR from an
internal SDO request (or oppersite) in the same "train" of datagrams.
42
a22a202d0f42 Domains, Warten beim Senden, 10kHz.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     1
/******************************************************************************
a22a202d0f42 Domains, Warten beim Senden, 10kHz.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     2
 *
a22a202d0f42 Domains, Warten beim Senden, 10kHz.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
     3
 *  $Id$
a22a202d0f42 Domains, Warten beim Senden, 10kHz.
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: 195
diff changeset
     6
 *
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 195
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: 195
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: 195
diff changeset
    20
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
b9a6e2c22745 GPLv2 License and enhanced Doxygen output.
Florian Pose <fp@igh-essen.com>
parents: 195
diff changeset
    21
 *
1363
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    22
 *  ---
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
diff changeset
    23
 *
11c0b2caa253 Improved and added license headers.
Florian Pose <fp@igh-essen.com>
parents: 1326
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: 1326
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: 1326
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: 199
diff changeset
    27
 *
42
a22a202d0f42 Domains, Warten beim Senden, 10kHz.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    28
 *****************************************************************************/
a22a202d0f42 Domains, Warten beim Senden, 10kHz.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
    29
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    30
/**
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    31
   \file
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    32
   EtherCAT domain methods.
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
/*****************************************************************************/
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    36
294
feea8d850c65 Applied include patch by M. Schwerin.
Florian Pose <fp@igh-essen.com>
parents: 293
diff changeset
    37
#include <linux/module.h>
feea8d850c65 Applied include patch by M. Schwerin.
Florian Pose <fp@igh-essen.com>
parents: 293
diff changeset
    38
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    39
#include "globals.h"
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
    40
#include "master.h"
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
    41
#include "slave_config.h"
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
    42
54
7506e67dd122 Vereinheitlichte Schnittstellen, Include-Verzeichnis und Module getrennt.
Florian Pose <fp@igh-essen.com>
parents: 52
diff changeset
    43
#include "domain.h"
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    44
#include "datagram_pair.h"
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    45
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    46
/** Extra debug output for redundancy functions.
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    47
 */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    48
#define DEBUG_REDUNDANCY 0
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
    49
2627
04c83089bac2 Defined list_next_entry for older kernels.
Florian Pose <fp@igh-essen.com>
parents: 2614
diff changeset
    50
#ifndef list_next_entry
04c83089bac2 Defined list_next_entry for older kernels.
Florian Pose <fp@igh-essen.com>
parents: 2614
diff changeset
    51
#define list_next_entry(pos, member) \
04c83089bac2 Defined list_next_entry for older kernels.
Florian Pose <fp@igh-essen.com>
parents: 2614
diff changeset
    52
    list_entry((pos)->member.next, typeof(*(pos)), member)
04c83089bac2 Defined list_next_entry for older kernels.
Florian Pose <fp@igh-essen.com>
parents: 2614
diff changeset
    53
#endif
04c83089bac2 Defined list_next_entry for older kernels.
Florian Pose <fp@igh-essen.com>
parents: 2614
diff changeset
    54
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
    55
/*****************************************************************************/
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
    56
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
    57
void ec_domain_clear_data(ec_domain_t *);
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
    58
178
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 166
diff changeset
    59
/*****************************************************************************/
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 166
diff changeset
    60
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
    61
/** Domain constructor.
993
8c32564252fd Removed kobject from domain.
Florian Pose <fp@igh-essen.com>
parents: 985
diff changeset
    62
 */
8c32564252fd Removed kobject from domain.
Florian Pose <fp@igh-essen.com>
parents: 985
diff changeset
    63
void ec_domain_init(
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
    64
        ec_domain_t *domain, /**< EtherCAT domain. */
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
    65
        ec_master_t *master, /**< Parent master. */
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
    66
        unsigned int index /**< Index. */
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
    67
        )
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
    68
{
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    69
    unsigned int dev_idx;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    70
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
    71
    domain->master = master;
178
b84f69db8566 MERGE branches/sysfs -> trunk (whole SysFS implementation)
Florian Pose <fp@igh-essen.com>
parents: 166
diff changeset
    72
    domain->index = index;
985
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
    73
    INIT_LIST_HEAD(&domain->fmmu_configs);
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
    74
    domain->data_size = 0;
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
    75
    domain->data = NULL;
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
    76
    domain->data_origin = EC_ORIG_INTERNAL;
985
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
    77
    domain->logical_base_address = 0x00000000;
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    78
    INIT_LIST_HEAD(&domain->datagram_pairs);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    79
    for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    80
            dev_idx++) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    81
        domain->working_counter[dev_idx] = 0x0000;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    82
    }
985
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
    83
    domain->expected_working_counter = 0x0000;
818
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
    84
    domain->working_counter_changes = 0;
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    85
    domain->redundancy_active = 0;
344
5d8281f1aa2a Replaced longer cycle timestamps with jiffies.
Florian Pose <fp@igh-essen.com>
parents: 343
diff changeset
    86
    domain->notify_jiffies = 0;
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
    87
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
    88
    /* Used by ec_domain_add_fmmu_config */
2611
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
    89
    memset(domain->offset_used, 0, sizeof(domain->offset_used));
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
    90
    domain->sc_in_work = 0;
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
    91
}
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
    92
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
    93
/*****************************************************************************/
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
    94
818
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
    95
/** Domain destructor.
993
8c32564252fd Removed kobject from domain.
Florian Pose <fp@igh-essen.com>
parents: 985
diff changeset
    96
 */
8c32564252fd Removed kobject from domain.
Florian Pose <fp@igh-essen.com>
parents: 985
diff changeset
    97
void ec_domain_clear(ec_domain_t *domain /**< EtherCAT domain */)
8c32564252fd Removed kobject from domain.
Florian Pose <fp@igh-essen.com>
parents: 985
diff changeset
    98
{
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
    99
    ec_datagram_pair_t *datagram_pair, *next_pair;
993
8c32564252fd Removed kobject from domain.
Florian Pose <fp@igh-essen.com>
parents: 985
diff changeset
   100
8c32564252fd Removed kobject from domain.
Florian Pose <fp@igh-essen.com>
parents: 985
diff changeset
   101
    // dequeue and free datagrams
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   102
    list_for_each_entry_safe(datagram_pair, next_pair,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   103
            &domain->datagram_pairs, list) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   104
        ec_datagram_pair_clear(datagram_pair);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   105
        kfree(datagram_pair);
144
fdc24bf62f80 Dynamischer Kommandospeicher, Domain-Kommandos als Liste.
Florian Pose <fp@igh-essen.com>
parents: 138
diff changeset
   106
    }
98
f564d0929292 MERGE branches/async 222:233 -> trunk (Kommando-Warteschlangen).
Florian Pose <fp@igh-essen.com>
parents: 97
diff changeset
   107
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   108
    ec_domain_clear_data(domain);
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   109
}
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   110
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   111
/*****************************************************************************/
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   112
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   113
/** Frees internally allocated memory.
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   114
 */
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   115
void ec_domain_clear_data(
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   116
        ec_domain_t *domain /**< EtherCAT domain. */
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   117
        )
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   118
{
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   119
    if (domain->data_origin == EC_ORIG_INTERNAL && domain->data) {
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   120
        kfree(domain->data);
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   121
    }
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   122
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   123
    domain->data = NULL;
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   124
    domain->data_origin = EC_ORIG_INTERNAL;
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   125
}
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   126
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   127
/*****************************************************************************/
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   128
818
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   129
/** Adds an FMMU configuration to the domain.
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   130
 */
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   131
void ec_domain_add_fmmu_config(
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   132
        ec_domain_t *domain, /**< EtherCAT domain. */
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   133
        ec_fmmu_config_t *fmmu /**< FMMU configuration. */
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   134
        )
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   135
{
2611
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   136
    const ec_slave_config_t *sc;
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   137
    uint32_t logical_domain_offset;
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   138
    unsigned fmmu_data_size;
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   139
818
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   140
    fmmu->domain = domain;
2611
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   141
    sc = fmmu->sc;
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   142
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   143
    fmmu_data_size = ec_pdo_list_total_size(
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   144
        &sc->sync_configs[fmmu->sync_index].pdos);
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   145
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   146
    if (sc->allow_overlapping_pdos && (sc == domain->sc_in_work)) {
2611
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   147
        // If we permit overlapped PDOs, and we already have an allocated FMMU
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   148
        // for this slave, allocate the subsequent FMMU offsets by direction
2611
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   149
        logical_domain_offset = domain->offset_used[fmmu->dir];
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   150
    } else {
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   151
        // otherwise, allocate to the furthest extent of any allocated
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   152
        // FMMU on this domain.
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   153
        logical_domain_offset = max(domain->offset_used[EC_DIR_INPUT],
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   154
            domain->offset_used[EC_DIR_OUTPUT]);
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   155
        // rebase the free offsets to the current position
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   156
        domain->offset_used[EC_DIR_INPUT] = logical_domain_offset;
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   157
        domain->offset_used[EC_DIR_OUTPUT] = logical_domain_offset;
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   158
    }
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   159
    domain->sc_in_work = sc;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   160
2611
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   161
    // consume the offset space for this FMMU's direction
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   162
    domain->offset_used[fmmu->dir] += fmmu_data_size;
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   163
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   164
    ec_fmmu_set_domain_offset_size(fmmu, logical_domain_offset, fmmu_data_size);
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   165
950
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   166
    list_add_tail(&fmmu->list, &domain->fmmu_configs);
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   167
2611
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   168
    // Determine domain size from furthest extent of FMMU data
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   169
    domain->data_size = max(domain->offset_used[EC_DIR_INPUT],
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   170
            domain->offset_used[EC_DIR_OUTPUT]);
912
6630f4dbcfd2 Improved working counter output; fixed problem with slaves that have a single sync manager used for outputs.
Florian Pose <fp@igh-essen.com>
parents: 885
diff changeset
   171
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   172
    EC_MASTER_DBG(domain->master, 1, "Domain %u:"
2611
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   173
            " Added %u bytes at %u.\n",
f09b0623a2c1 overlapping PDO initial working. datagram size is not correct
Dave Page <dave.page@gleeble.com>
parents: 2610
diff changeset
   174
            domain->index, fmmu->data_size, logical_domain_offset);
818
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   175
}
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   176
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   177
/*****************************************************************************/
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   178
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   179
/** Allocates a domain datagram pair and appends it to the list.
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   180
 *
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   181
 * The datagrams' types and expected working counters are determined by the
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   182
 * number of input and output fmmus that share the datagrams.
985
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
   183
 *
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   184
 * \retval  0 Success.
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   185
 * \retval <0 Error code.
635
d304ef4af542 Implemented alternative PDO mapping configuration interface.
Florian Pose <fp@igh-essen.com>
parents: 628
diff changeset
   186
 */
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   187
int ec_domain_add_datagram_pair(
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   188
        ec_domain_t *domain, /**< EtherCAT domain. */
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   189
        uint32_t logical_offset, /**< Logical offset. */
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   190
        size_t data_size, /**< Size of the data. */
817
118dea2fa505 Support for slaves that don't support the LRW datagram type.
Florian Pose <fp@igh-essen.com>
parents: 809
diff changeset
   191
        uint8_t *data, /**< Process data. */
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   192
        const unsigned int used[] /**< Slave config counter for in/out. */
635
d304ef4af542 Implemented alternative PDO mapping configuration interface.
Florian Pose <fp@igh-essen.com>
parents: 628
diff changeset
   193
        )
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   194
{
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   195
    ec_datagram_pair_t *datagram_pair;
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   196
    int ret;
293
14aeb79aa992 Renamed command structure to datagram.
Florian Pose <fp@igh-essen.com>
parents: 275
diff changeset
   197
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   198
    if (!(datagram_pair = kmalloc(sizeof(ec_datagram_pair_t), GFP_KERNEL))) {
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   199
        EC_MASTER_ERR(domain->master,
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   200
                "Failed to allocate domain datagram pair!\n");
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   201
        return -ENOMEM;
144
fdc24bf62f80 Dynamischer Kommandospeicher, Domain-Kommandos als Liste.
Florian Pose <fp@igh-essen.com>
parents: 138
diff changeset
   202
    }
fdc24bf62f80 Dynamischer Kommandospeicher, Domain-Kommandos als Liste.
Florian Pose <fp@igh-essen.com>
parents: 138
diff changeset
   203
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   204
    ret = ec_datagram_pair_init(datagram_pair, domain, logical_offset, data,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   205
            data_size, used);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   206
    if (ret) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   207
        kfree(datagram_pair);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   208
        return ret;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   209
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   210
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   211
    domain->expected_working_counter +=
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   212
        datagram_pair->expected_working_counter;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   213
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   214
    EC_MASTER_DBG(domain->master, 1,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   215
            "Adding datagram pair with expected WC %u.\n",
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   216
            datagram_pair->expected_working_counter);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   217
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   218
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   219
    list_add_tail(&datagram_pair->list, &domain->datagram_pairs);
144
fdc24bf62f80 Dynamischer Kommandospeicher, Domain-Kommandos als Liste.
Florian Pose <fp@igh-essen.com>
parents: 138
diff changeset
   220
    return 0;
fdc24bf62f80 Dynamischer Kommandospeicher, Domain-Kommandos als Liste.
Florian Pose <fp@igh-essen.com>
parents: 138
diff changeset
   221
}
fdc24bf62f80 Dynamischer Kommandospeicher, Domain-Kommandos als Liste.
Florian Pose <fp@igh-essen.com>
parents: 138
diff changeset
   222
fdc24bf62f80 Dynamischer Kommandospeicher, Domain-Kommandos als Liste.
Florian Pose <fp@igh-essen.com>
parents: 138
diff changeset
   223
/*****************************************************************************/
fdc24bf62f80 Dynamischer Kommandospeicher, Domain-Kommandos als Liste.
Florian Pose <fp@igh-essen.com>
parents: 138
diff changeset
   224
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   225
/** Domain finish helper function.
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   226
 *
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   227
 * Detects, if a slave configuration has already been taken into account for
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   228
 * a datagram's expected working counter calculation.
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   229
 *
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   230
 * Walks through the list of all FMMU configurations for the current datagram
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   231
 * and ends before the current datagram.
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   232
 *
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   233
 * \return Non-zero if slave connfig was already counted.
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   234
 */
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   235
static int shall_count(
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   236
        const ec_fmmu_config_t *cur_fmmu, /**< Current FMMU with direction to
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   237
                                            search for. */
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   238
        const ec_fmmu_config_t *first_fmmu /**< Datagram's first FMMU. */
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   239
        )
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   240
{
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   241
    for (; first_fmmu != cur_fmmu;
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   242
            first_fmmu = list_entry(first_fmmu->list.next,
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   243
                ec_fmmu_config_t, list)) {
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   244
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   245
        if (first_fmmu->sc == cur_fmmu->sc
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   246
                && first_fmmu->dir == cur_fmmu->dir) {
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   247
            return 0; // was already counted
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   248
        }
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   249
    }
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   250
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   251
    return 1;
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   252
}
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   253
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   254
/*****************************************************************************/
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   255
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   256
/** Domain finish helper function.
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   257
 *
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   258
 * Known boundaries for a datagram have been identified. Scans the datagram
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   259
 * FMMU boundaries for WKC counters and then creates the datagram_pair.
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   260
 *
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   261
 * \param domain The parent domain
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   262
 * \param datagram_begin_offset Datagram's logical beginning offset
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   263
 * \param datagram_end_offset Logical end offset (one past last byte)
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   264
 * \param datagram_first_fmmu The begin FMMU in the datagram
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   265
 * \param datagram_end_fmmu The end (one past last) FMMU
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   266
 *
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   267
 * \return Non-zero if error emplacing domain
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   268
 */
2627
04c83089bac2 Defined list_next_entry for older kernels.
Florian Pose <fp@igh-essen.com>
parents: 2614
diff changeset
   269
static int emplace_datagram(ec_domain_t *domain,
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   270
        uint32_t datagram_begin_offset,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   271
        uint32_t datagram_end_offset,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   272
        const ec_fmmu_config_t *datagram_first_fmmu,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   273
        const ec_fmmu_config_t *datagram_end_fmmu
2627
04c83089bac2 Defined list_next_entry for older kernels.
Florian Pose <fp@igh-essen.com>
parents: 2614
diff changeset
   274
        )
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   275
{
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   276
    unsigned int datagram_used[EC_DIR_COUNT];
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   277
    const ec_fmmu_config_t *curr_fmmu;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   278
    size_t data_size;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   279
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   280
    data_size = datagram_end_offset - datagram_begin_offset;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   281
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   282
    memset(datagram_used, 0, sizeof(datagram_used));
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   283
    for (curr_fmmu = datagram_first_fmmu;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   284
            &curr_fmmu->list != &datagram_end_fmmu->list;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   285
            curr_fmmu = list_next_entry(curr_fmmu, list)) {
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   286
        if (shall_count(curr_fmmu, datagram_first_fmmu)) {
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   287
            datagram_used[curr_fmmu->dir]++;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   288
        }
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   289
    }
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   290
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   291
    return ec_domain_add_datagram_pair(domain,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   292
            domain->logical_base_address + datagram_begin_offset,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   293
            data_size,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   294
            domain->data + datagram_begin_offset,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   295
            datagram_used);
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   296
}
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   297
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   298
/*****************************************************************************/
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   299
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   300
/** Finishes a domain.
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   301
 *
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   302
 * This allocates the necessary datagrams and writes the correct logical
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   303
 * addresses to every configured FMMU.
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   304
 *
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   305
 * \retval  0 Success
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   306
 * \retval <0 Error code.
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   307
 */
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   308
int ec_domain_finish(
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   309
        ec_domain_t *domain, /**< EtherCAT domain. */
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   310
        uint32_t base_address /**< Logical base address. */
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   311
        )
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   312
{
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   313
    uint32_t datagram_offset = 0;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   314
    unsigned int datagram_count = 0;
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   315
    ec_fmmu_config_t *fmmu;
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   316
    const ec_fmmu_config_t *datagram_first_fmmu = NULL;
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   317
    const ec_fmmu_config_t *valid_fmmu = NULL;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   318
    unsigned candidate_start = 0;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   319
    unsigned valid_start = 0;
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   320
    const ec_datagram_pair_t *datagram_pair;
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   321
    int ret;
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   322
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   323
    domain->logical_base_address = base_address;
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   324
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   325
    if (domain->data_size && domain->data_origin == EC_ORIG_INTERNAL) {
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   326
        if (!(domain->data =
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   327
                    (uint8_t *) kmalloc(domain->data_size, GFP_KERNEL))) {
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   328
            EC_MASTER_ERR(domain->master, "Failed to allocate %zu bytes"
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   329
                    " internal memory for domain %u!\n",
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   330
                    domain->data_size, domain->index);
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   331
            return -ENOMEM;
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   332
        }
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   333
    }
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   334
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   335
    // Cycle through all domain FMMUs and
985
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
   336
    // - correct the logical base addresses
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
   337
    // - set up the datagrams to carry the process data
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   338
    // - calculate the datagrams' expected working counters
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   339
    if (!list_empty(&domain->fmmu_configs)) {
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   340
        datagram_first_fmmu =
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   341
            list_entry(domain->fmmu_configs.next, ec_fmmu_config_t, list);
1907
dd276ae226b4 Added missing code documentation.
Florian Pose <fp@igh-essen.com>
parents: 1798
diff changeset
   342
    }
dd276ae226b4 Added missing code documentation.
Florian Pose <fp@igh-essen.com>
parents: 1798
diff changeset
   343
985
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
   344
    list_for_each_entry(fmmu, &domain->fmmu_configs, list) {
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   345
        if (fmmu->data_size > EC_MAX_DATA_SIZE) {
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   346
            EC_MASTER_ERR(domain->master,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   347
                "FMMU size %u bytes exceeds maximum data size %u",
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   348
                fmmu->data_size, EC_MAX_DATA_SIZE);
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   349
            return -EINVAL;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   350
        }
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   351
        if (fmmu->logical_domain_offset >= candidate_start) {
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   352
            // As FMMU offsets increase monotonically, and candidate start
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   353
            // offset has never been contradicted, it can now never be
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   354
            // contradicted, as no future FMMU can cross it.
2614
9b29d7bfa230 Fix datagram overflow layout issue
Dave Page <dave.page@gleeble.com>
parents: 2612
diff changeset
   355
            // All FMMUs prior to this point approved for next datagram
9b29d7bfa230 Fix datagram overflow layout issue
Dave Page <dave.page@gleeble.com>
parents: 2612
diff changeset
   356
            valid_fmmu = fmmu;
9b29d7bfa230 Fix datagram overflow layout issue
Dave Page <dave.page@gleeble.com>
parents: 2612
diff changeset
   357
            valid_start = candidate_start;
9b29d7bfa230 Fix datagram overflow layout issue
Dave Page <dave.page@gleeble.com>
parents: 2612
diff changeset
   358
            if (fmmu->logical_domain_offset + fmmu->data_size - datagram_offset
9b29d7bfa230 Fix datagram overflow layout issue
Dave Page <dave.page@gleeble.com>
parents: 2612
diff changeset
   359
                    > EC_MAX_DATA_SIZE) {
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   360
                // yet the new candidate exceeds the datagram size, so we
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   361
                // use the last known valid candidate to create the datagram
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   362
                ret = emplace_datagram(domain, datagram_offset, valid_start,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   363
                    datagram_first_fmmu, valid_fmmu);
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   364
                if (ret < 0)
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   365
                    return ret;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   366
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   367
                datagram_offset = valid_start;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   368
                datagram_count++;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   369
                datagram_first_fmmu = fmmu;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   370
            }
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   371
        }
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   372
        if (fmmu->logical_domain_offset + fmmu->data_size > candidate_start) {
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   373
            candidate_start = fmmu->logical_domain_offset + fmmu->data_size;
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   374
        }
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   375
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   376
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   377
    /* Allocate last datagram pair, if data are left (this is also the case if
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   378
     * the process data fit into a single datagram) */
2612
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   379
    if (domain->data_size > datagram_offset) {
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   380
        ret = emplace_datagram(domain, datagram_offset, domain->data_size,
668aa5e31137 overlapping PDO split datagram support
Dave Page <dave.page@gleeble.com>
parents: 2611
diff changeset
   381
            datagram_first_fmmu, fmmu);
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   382
        if (ret < 0)
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   383
            return ret;
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   384
        datagram_count++;
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   385
    }
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   386
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   387
    EC_MASTER_INFO(domain->master, "Domain%u: Logical address 0x%08x,"
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   388
            " %zu byte, expected working counter %u.\n", domain->index,
985
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
   389
            domain->logical_base_address, domain->data_size,
90bcaf9ce3d5 Fixed calculation of expected working counter.
Florian Pose <fp@igh-essen.com>
parents: 950
diff changeset
   390
            domain->expected_working_counter);
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   391
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   392
    list_for_each_entry(datagram_pair, &domain->datagram_pairs, list) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   393
        const ec_datagram_t *datagram =
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   394
            &datagram_pair->datagrams[EC_DEVICE_MAIN];
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   395
        EC_MASTER_INFO(domain->master, "  Datagram %s: Logical offset 0x%08x,"
2614
9b29d7bfa230 Fix datagram overflow layout issue
Dave Page <dave.page@gleeble.com>
parents: 2612
diff changeset
   396
                " %zu byte, type %s at %p.\n", datagram->name,
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   397
                EC_READ_U32(datagram->address), datagram->data_size,
2614
9b29d7bfa230 Fix datagram overflow layout issue
Dave Page <dave.page@gleeble.com>
parents: 2612
diff changeset
   398
                ec_datagram_type_string(datagram), datagram);
817
118dea2fa505 Support for slaves that don't support the LRW datagram type.
Florian Pose <fp@igh-essen.com>
parents: 809
diff changeset
   399
    }
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   400
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   401
    return 0;
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   402
}
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   403
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   404
/*****************************************************************************/
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   405
1092
69393cf60399 Improved source code doc.
Florian Pose <fp@igh-essen.com>
parents: 1075
diff changeset
   406
/** Get the number of FMMU configurations of the domain.
69393cf60399 Improved source code doc.
Florian Pose <fp@igh-essen.com>
parents: 1075
diff changeset
   407
 */
950
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   408
unsigned int ec_domain_fmmu_count(const ec_domain_t *domain)
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   409
{
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   410
    const ec_fmmu_config_t *fmmu;
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   411
    unsigned int num = 0;
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   412
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   413
    list_for_each_entry(fmmu, &domain->fmmu_configs, list) {
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   414
        num++;
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   415
    }
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   416
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   417
    return num;
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   418
}
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   419
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   420
/*****************************************************************************/
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   421
1092
69393cf60399 Improved source code doc.
Florian Pose <fp@igh-essen.com>
parents: 1075
diff changeset
   422
/** Get a certain FMMU configuration via its position in the list.
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   423
 *
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   424
 * \return FMMU at position \a pos, or NULL.
1092
69393cf60399 Improved source code doc.
Florian Pose <fp@igh-essen.com>
parents: 1075
diff changeset
   425
 */
950
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   426
const ec_fmmu_config_t *ec_domain_find_fmmu(
1092
69393cf60399 Improved source code doc.
Florian Pose <fp@igh-essen.com>
parents: 1075
diff changeset
   427
        const ec_domain_t *domain, /**< EtherCAT domain. */
69393cf60399 Improved source code doc.
Florian Pose <fp@igh-essen.com>
parents: 1075
diff changeset
   428
        unsigned int pos /**< List position. */
950
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   429
        )
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   430
{
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   431
    const ec_fmmu_config_t *fmmu;
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   432
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   433
    list_for_each_entry(fmmu, &domain->fmmu_configs, list) {
1092
69393cf60399 Improved source code doc.
Florian Pose <fp@igh-essen.com>
parents: 1075
diff changeset
   434
        if (pos--)
950
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   435
            continue;
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   436
        return fmmu;
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   437
    }
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   438
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   439
    return NULL;
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   440
}
8b00e63fff90 'ethercat domain' shows domain contents and process data.
Florian Pose <fp@igh-essen.com>
parents: 944
diff changeset
   441
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   442
/*****************************************************************************/
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   443
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   444
#if EC_MAX_NUM_DEVICES > 1
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   445
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   446
/** Process received data.
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   447
 */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   448
int data_changed(
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   449
        uint8_t *send_buffer,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   450
        const ec_datagram_t *datagram,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   451
        size_t offset,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   452
        size_t size
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   453
        )
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   454
{
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   455
    uint8_t *sent = send_buffer + offset;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   456
    uint8_t *recv = datagram->data + offset;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   457
    size_t i;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   458
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   459
    for (i = 0; i < size; i++) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   460
        if (recv[i] != sent[i]) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   461
            return 1;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   462
        }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   463
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   464
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   465
    return 0;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   466
}
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   467
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   468
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   469
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   470
/******************************************************************************
2101
01b30593e942 Avoided casting-away constness in expected working counter calculation.
Florian Pose <fp@igh-essen.com>
parents: 2028
diff changeset
   471
 *  Application interface
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   472
 *****************************************************************************/
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   473
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   474
int ecrt_domain_reg_pdo_entry_list(ec_domain_t *domain,
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   475
        const ec_pdo_entry_reg_t *regs)
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   476
{
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   477
    const ec_pdo_entry_reg_t *reg;
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   478
    ec_slave_config_t *sc;
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   479
    int ret;
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   480
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   481
    EC_MASTER_DBG(domain->master, 1, "ecrt_domain_reg_pdo_entry_list("
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   482
            "domain = 0x%p, regs = 0x%p)\n", domain, regs);
1181
9e5954a2a46e Added debugging for configuration function of the application interface.
Florian Pose <fp@igh-essen.com>
parents: 1116
diff changeset
   483
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   484
    for (reg = regs; reg->index; reg++) {
1313
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   485
        sc = ecrt_master_slave_config_err(domain->master, reg->alias,
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   486
                reg->position, reg->vendor_id, reg->product_code);
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   487
        if (IS_ERR(sc))
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   488
            return PTR_ERR(sc);
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   489
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   490
        ret = ecrt_slave_config_reg_pdo_entry(sc, reg->index,
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   491
                        reg->subindex, domain, reg->bit_position);
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   492
        if (ret < 0)
ed15eef57d5c Improved error case return codes of many functions.
Florian Pose <fp@igh-essen.com>
parents: 1304
diff changeset
   493
            return ret;
916
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   494
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   495
        *reg->offset = ret;
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   496
    }
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   497
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   498
    return 0;
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   499
}
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   500
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   501
/*****************************************************************************/
db73994fbdac Added bitwise Pdo registration.
Florian Pose <fp@igh-essen.com>
parents: 912
diff changeset
   502
1257
9844ac126275 Made ecrt_domain_size() const.
Florian Pose <fp@igh-essen.com>
parents: 1225
diff changeset
   503
size_t ecrt_domain_size(const ec_domain_t *domain)
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   504
{
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   505
    return domain->data_size;
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   506
}
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   507
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   508
/*****************************************************************************/
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   509
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   510
void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *mem)
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   511
{
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   512
    EC_MASTER_DBG(domain->master, 1, "ecrt_domain_external_memory("
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   513
            "domain = 0x%p, mem = 0x%p)\n", domain, mem);
1181
9e5954a2a46e Added debugging for configuration function of the application interface.
Florian Pose <fp@igh-essen.com>
parents: 1116
diff changeset
   514
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   515
    down(&domain->master->master_sem);
1075
94c6e36e0f8d Implemented master semaphore to secure concurrent access from ioctls, state machine and realtime interface.
Florian Pose <fp@igh-essen.com>
parents: 1055
diff changeset
   516
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   517
    ec_domain_clear_data(domain);
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   518
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   519
    domain->data = mem;
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   520
    domain->data_origin = EC_ORIG_EXTERNAL;
1075
94c6e36e0f8d Implemented master semaphore to secure concurrent access from ioctls, state machine and realtime interface.
Florian Pose <fp@igh-essen.com>
parents: 1055
diff changeset
   521
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   522
    up(&domain->master->master_sem);
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   523
}
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   524
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   525
/*****************************************************************************/
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   526
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   527
uint8_t *ecrt_domain_data(ec_domain_t *domain)
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   528
{
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   529
    return domain->data;
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   530
}
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   531
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   532
/*****************************************************************************/
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   533
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   534
void ecrt_domain_process(ec_domain_t *domain)
98
f564d0929292 MERGE branches/async 222:233 -> trunk (Kommando-Warteschlangen).
Florian Pose <fp@igh-essen.com>
parents: 97
diff changeset
   535
{
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   536
    uint16_t wc_sum[EC_MAX_NUM_DEVICES] = {}, wc_total;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   537
    ec_datagram_pair_t *pair;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   538
#if EC_MAX_NUM_DEVICES > 1
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   539
    uint16_t datagram_pair_wc, redundant_wc;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   540
    unsigned int datagram_offset;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   541
    ec_fmmu_config_t *fmmu = list_first_entry(&domain->fmmu_configs,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   542
            ec_fmmu_config_t, list);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   543
    unsigned int redundancy;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   544
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   545
    unsigned int dev_idx;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   546
#ifdef EC_RT_SYSLOG
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   547
    unsigned int wc_change;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   548
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   549
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   550
#if DEBUG_REDUNDANCY
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   551
    EC_MASTER_DBG(domain->master, 1, "domain %u process\n", domain->index);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   552
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   553
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   554
    list_for_each_entry(pair, &domain->datagram_pairs, list) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   555
#if EC_MAX_NUM_DEVICES > 1
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   556
        datagram_pair_wc = ec_datagram_pair_process(pair, wc_sum);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   557
#else
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   558
        ec_datagram_pair_process(pair, wc_sum);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   559
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   560
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   561
#if EC_MAX_NUM_DEVICES > 1
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   562
        if (ec_master_num_devices(domain->master) > 1) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   563
            ec_datagram_t *main_datagram = &pair->datagrams[EC_DEVICE_MAIN];
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   564
            uint32_t logical_datagram_address =
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   565
                EC_READ_U32(main_datagram->address);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   566
            size_t datagram_size = main_datagram->data_size;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   567
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   568
#if DEBUG_REDUNDANCY
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   569
            EC_MASTER_DBG(domain->master, 1, "dgram %s log=%u\n",
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   570
                    main_datagram->name, logical_datagram_address);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   571
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   572
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   573
            /* Redundancy: Go through FMMU configs to detect data changes. */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   574
            list_for_each_entry_from(fmmu, &domain->fmmu_configs, list) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   575
                ec_datagram_t *backup_datagram =
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   576
                    &pair->datagrams[EC_DEVICE_BACKUP];
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   577
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   578
                if (fmmu->dir != EC_DIR_INPUT) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   579
                    continue;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   580
                }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   581
2610
f0fdcce9874b Refactor fmmu->logical_start_address to fmmu->logical_domain_offset
Dave Page <dave.page@gleeble.com>
parents: 2589
diff changeset
   582
                if (fmmu->logical_domain_offset >= datagram_size) {
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   583
                    // fmmu data contained in next datagram pair
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   584
                    break;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   585
                }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   586
2610
f0fdcce9874b Refactor fmmu->logical_start_address to fmmu->logical_domain_offset
Dave Page <dave.page@gleeble.com>
parents: 2589
diff changeset
   587
                datagram_offset = fmmu->logical_domain_offset;
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   588
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   589
#if DEBUG_REDUNDANCY
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   590
                EC_MASTER_DBG(domain->master, 1,
2610
f0fdcce9874b Refactor fmmu->logical_start_address to fmmu->logical_domain_offset
Dave Page <dave.page@gleeble.com>
parents: 2589
diff changeset
   591
                        "input fmmu log_off=%u size=%u offset=%u\n",
f0fdcce9874b Refactor fmmu->logical_start_address to fmmu->logical_domain_offset
Dave Page <dave.page@gleeble.com>
parents: 2589
diff changeset
   592
                        fmmu->logical_domain_offset, fmmu->data_size,
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   593
                        datagram_offset);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   594
                if (domain->master->debug_level > 0) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   595
                    ec_print_data(pair->send_buffer + datagram_offset,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   596
                            fmmu->data_size);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   597
                    ec_print_data(main_datagram->data + datagram_offset,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   598
                            fmmu->data_size);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   599
                    ec_print_data(backup_datagram->data + datagram_offset,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   600
                            fmmu->data_size);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   601
                }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   602
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   603
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   604
                if (data_changed(pair->send_buffer, main_datagram,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   605
                            datagram_offset, fmmu->data_size)) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   606
                    /* data changed on main link: no copying necessary. */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   607
#if DEBUG_REDUNDANCY
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   608
                    EC_MASTER_DBG(domain->master, 1, "main changed\n");
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   609
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   610
                } else if (data_changed(pair->send_buffer, backup_datagram,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   611
                            datagram_offset, fmmu->data_size)) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   612
                    /* data changed on backup link: copy to main memory. */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   613
#if DEBUG_REDUNDANCY
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   614
                    EC_MASTER_DBG(domain->master, 1, "backup changed\n");
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   615
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   616
                    memcpy(main_datagram->data + datagram_offset,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   617
                            backup_datagram->data + datagram_offset,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   618
                            fmmu->data_size);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   619
                } else if (datagram_pair_wc ==
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   620
                        pair->expected_working_counter) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   621
                    /* no change, but WC complete: use main data. */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   622
#if DEBUG_REDUNDANCY
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   623
                    EC_MASTER_DBG(domain->master, 1,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   624
                            "no change but complete\n");
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   625
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   626
                } else {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   627
                    /* no change and WC incomplete: mark WC as zero to avoid
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   628
                     * data.dependent WC flickering. */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   629
                    datagram_pair_wc = 0;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   630
#if DEBUG_REDUNDANCY
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   631
                    EC_MASTER_DBG(domain->master, 1,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   632
                            "no change and incomplete\n");
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   633
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   634
                }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   635
            }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   636
        }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   637
#endif // EC_MAX_NUM_DEVICES > 1
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   638
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   639
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   640
#if EC_MAX_NUM_DEVICES > 1
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   641
    redundant_wc = 0;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   642
    for (dev_idx = EC_DEVICE_BACKUP;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   643
            dev_idx < ec_master_num_devices(domain->master); dev_idx++) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   644
        redundant_wc += wc_sum[dev_idx];
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   645
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   646
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   647
    redundancy = redundant_wc > 0;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   648
    if (redundancy != domain->redundancy_active) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   649
#ifdef EC_RT_SYSLOG
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   650
        if (redundancy) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   651
            EC_MASTER_WARN(domain->master,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   652
                    "Domain %u: Redundant link in use!\n",
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   653
                    domain->index);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   654
        } else {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   655
            EC_MASTER_INFO(domain->master,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   656
                    "Domain %u: Redundant link unused again.\n",
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   657
                    domain->index);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   658
        }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   659
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   660
        domain->redundancy_active = redundancy;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   661
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   662
#else
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   663
    domain->redundancy_active = 0;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   664
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   665
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   666
#ifdef EC_RT_SYSLOG
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   667
    wc_change = 0;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   668
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   669
    wc_total = 0;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   670
    for (dev_idx = EC_DEVICE_MAIN;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   671
            dev_idx < ec_master_num_devices(domain->master); dev_idx++) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   672
        if (wc_sum[dev_idx] != domain->working_counter[dev_idx]) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   673
#ifdef EC_RT_SYSLOG
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   674
            wc_change = 1;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   675
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   676
            domain->working_counter[dev_idx] = wc_sum[dev_idx];
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   677
        }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   678
        wc_total += wc_sum[dev_idx];
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   679
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   680
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   681
#ifdef EC_RT_SYSLOG
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   682
    if (wc_change) {
332
e16093374dfd New statistic outputs to avoid blasting the logs.
Florian Pose <fp@igh-essen.com>
parents: 325
diff changeset
   683
        domain->working_counter_changes++;
e16093374dfd New statistic outputs to avoid blasting the logs.
Florian Pose <fp@igh-essen.com>
parents: 325
diff changeset
   684
    }
e16093374dfd New statistic outputs to avoid blasting the logs.
Florian Pose <fp@igh-essen.com>
parents: 325
diff changeset
   685
e16093374dfd New statistic outputs to avoid blasting the logs.
Florian Pose <fp@igh-essen.com>
parents: 325
diff changeset
   686
    if (domain->working_counter_changes &&
344
5d8281f1aa2a Replaced longer cycle timestamps with jiffies.
Florian Pose <fp@igh-essen.com>
parents: 343
diff changeset
   687
        jiffies - domain->notify_jiffies > HZ) {
5d8281f1aa2a Replaced longer cycle timestamps with jiffies.
Florian Pose <fp@igh-essen.com>
parents: 343
diff changeset
   688
        domain->notify_jiffies = jiffies;
332
e16093374dfd New statistic outputs to avoid blasting the logs.
Florian Pose <fp@igh-essen.com>
parents: 325
diff changeset
   689
        if (domain->working_counter_changes == 1) {
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   690
            EC_MASTER_INFO(domain->master, "Domain %u: Working counter"
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   691
                    " changed to %u/%u", domain->index,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   692
                    wc_total, domain->expected_working_counter);
1921
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   693
        } else {
d9cf40facbc4 Improved syslog macros.
Florian Pose <fp@igh-essen.com>
parents: 1907
diff changeset
   694
            EC_MASTER_INFO(domain->master, "Domain %u: %u working counter"
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   695
                    " changes - now %u/%u", domain->index,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   696
                    domain->working_counter_changes,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   697
                    wc_total, domain->expected_working_counter);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   698
        }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   699
#if EC_MAX_NUM_DEVICES > 1
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   700
        if (ec_master_num_devices(domain->master) > 1) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   701
            printk(" (");
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   702
            for (dev_idx = EC_DEVICE_MAIN;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   703
                    dev_idx < ec_master_num_devices(domain->master);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   704
                    dev_idx++) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   705
                printk("%u", domain->working_counter[dev_idx]);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   706
                if (dev_idx + 1 < ec_master_num_devices(domain->master)) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   707
                    printk("+");
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   708
                }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   709
            }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   710
            printk(")");
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   711
        }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   712
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   713
        printk(".\n");
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   714
332
e16093374dfd New statistic outputs to avoid blasting the logs.
Florian Pose <fp@igh-essen.com>
parents: 325
diff changeset
   715
        domain->working_counter_changes = 0;
325
7833cf70c4f2 VERSION 1.1: New realtime interface, only state machines.
Florian Pose <fp@igh-essen.com>
parents: 315
diff changeset
   716
    }
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   717
#endif
494
178b1b43a88c Version 1.2.0-rc1, re-introduced ecrt_domain_queue().
Florian Pose <fp@igh-essen.com>
parents: 484
diff changeset
   718
}
178b1b43a88c Version 1.2.0-rc1, re-introduced ecrt_domain_queue().
Florian Pose <fp@igh-essen.com>
parents: 484
diff changeset
   719
178b1b43a88c Version 1.2.0-rc1, re-introduced ecrt_domain_queue().
Florian Pose <fp@igh-essen.com>
parents: 484
diff changeset
   720
/*****************************************************************************/
178b1b43a88c Version 1.2.0-rc1, re-introduced ecrt_domain_queue().
Florian Pose <fp@igh-essen.com>
parents: 484
diff changeset
   721
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   722
void ecrt_domain_queue(ec_domain_t *domain)
494
178b1b43a88c Version 1.2.0-rc1, re-introduced ecrt_domain_queue().
Florian Pose <fp@igh-essen.com>
parents: 484
diff changeset
   723
{
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   724
    ec_datagram_pair_t *datagram_pair;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   725
    ec_device_index_t dev_idx;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   726
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   727
    list_for_each_entry(datagram_pair, &domain->datagram_pairs, list) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   728
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   729
#if EC_MAX_NUM_DEVICES > 1
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   730
        /* copy main data to send buffer */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   731
        memcpy(datagram_pair->send_buffer,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   732
                datagram_pair->datagrams[EC_DEVICE_MAIN].data,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   733
                datagram_pair->datagrams[EC_DEVICE_MAIN].data_size);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   734
#endif
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   735
        ec_master_queue_datagram(domain->master,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   736
                &datagram_pair->datagrams[EC_DEVICE_MAIN]);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   737
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   738
        /* copy main data to backup datagram */
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   739
        for (dev_idx = EC_DEVICE_BACKUP;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   740
                dev_idx < ec_master_num_devices(domain->master); dev_idx++) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   741
            memcpy(datagram_pair->datagrams[dev_idx].data,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   742
                    datagram_pair->datagrams[EC_DEVICE_MAIN].data,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   743
                    datagram_pair->datagrams[EC_DEVICE_MAIN].data_size);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   744
            ec_master_queue_datagram(domain->master,
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   745
                    &datagram_pair->datagrams[dev_idx]);
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   746
        }
494
178b1b43a88c Version 1.2.0-rc1, re-introduced ecrt_domain_queue().
Florian Pose <fp@igh-essen.com>
parents: 484
diff changeset
   747
    }
73
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   748
}
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   749
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   750
/*****************************************************************************/
9f4ea66d89a3 Dynamische FMMU-Konfiguration, zwei Kopieroperationen eingespart, Einr?ckungen angepasst.
Florian Pose <fp@igh-essen.com>
parents: 58
diff changeset
   751
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   752
void ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state)
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   753
{
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   754
    unsigned int dev_idx;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   755
    uint16_t wc = 0;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   756
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   757
    for (dev_idx = EC_DEVICE_MAIN;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   758
            dev_idx < ec_master_num_devices(domain->master); dev_idx++) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   759
        wc += domain->working_counter[dev_idx];
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   760
    }
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   761
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   762
    state->working_counter = wc;
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   763
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   764
    if (wc) {
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   765
        if (wc == domain->expected_working_counter) {
818
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   766
            state->wc_state = EC_WC_COMPLETE;
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   767
        } else {
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   768
            state->wc_state = EC_WC_INCOMPLETE;
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   769
        }
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   770
    } else {
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   771
        state->wc_state = EC_WC_ZERO;
b6c87ae254c9 Calculate expected working counter for domains.
Florian Pose <fp@igh-essen.com>
parents: 817
diff changeset
   772
    }
2589
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   773
2b9c78543663 Reverted default branch to stable-1.5.
Florian Pose <fp@igh-essen.com>
parents: 2101
diff changeset
   774
    state->redundancy_active = domain->redundancy_active;
105
fad6709a526f Dom?nen-Status (ecrt_domain_state) hinzugef?gt.
Florian Pose <fp@igh-essen.com>
parents: 104
diff changeset
   775
}
fad6709a526f Dom?nen-Status (ecrt_domain_state) hinzugef?gt.
Florian Pose <fp@igh-essen.com>
parents: 104
diff changeset
   776
fad6709a526f Dom?nen-Status (ecrt_domain_state) hinzugef?gt.
Florian Pose <fp@igh-essen.com>
parents: 104
diff changeset
   777
/*****************************************************************************/
fad6709a526f Dom?nen-Status (ecrt_domain_state) hinzugef?gt.
Florian Pose <fp@igh-essen.com>
parents: 104
diff changeset
   778
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   779
/** \cond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   780
792
3778920f61e4 Implemented most realtime interface changes for version 1.4, improved
Florian Pose <fp@igh-essen.com>
parents: 783
diff changeset
   781
EXPORT_SYMBOL(ecrt_domain_reg_pdo_entry_list);
809
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   782
EXPORT_SYMBOL(ecrt_domain_size);
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   783
EXPORT_SYMBOL(ecrt_domain_external_memory);
ec4ef8911824 External domain memory.
Florian Pose <fp@igh-essen.com>
parents: 807
diff changeset
   784
EXPORT_SYMBOL(ecrt_domain_data);
104
052bc82d5442 MERGE branches/async -> trunk (alle Unterschiede ?bernommen)
Florian Pose <fp@igh-essen.com>
parents: 101
diff changeset
   785
EXPORT_SYMBOL(ecrt_domain_process);
494
178b1b43a88c Version 1.2.0-rc1, re-introduced ecrt_domain_queue().
Florian Pose <fp@igh-essen.com>
parents: 484
diff changeset
   786
EXPORT_SYMBOL(ecrt_domain_queue);
105
fad6709a526f Dom?nen-Status (ecrt_domain_state) hinzugef?gt.
Florian Pose <fp@igh-essen.com>
parents: 104
diff changeset
   787
EXPORT_SYMBOL(ecrt_domain_state);
42
a22a202d0f42 Domains, Warten beim Senden, 10kHz.
Florian Pose <fp@igh-essen.com>
parents:
diff changeset
   788
199
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   789
/** \endcond */
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   790
04ecf40fc2e9 Doxygen added interface modules and file documentation.
Florian Pose <fp@igh-essen.com>
parents: 197
diff changeset
   791
/*****************************************************************************/