mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-09-22 10:03:51 +08:00
More general approach: Check for maximum datagram size in pre-alloc.
This commit is contained in:
+10
-2
@@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
* Copyright (C) 2006-2026 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
*
|
||||
* This file is part of the IgH EtherCAT Master.
|
||||
*
|
||||
@@ -145,8 +145,16 @@ int ec_datagram_prealloc(
|
||||
)
|
||||
{
|
||||
if (datagram->data_origin == EC_ORIG_EXTERNAL
|
||||
|| size <= datagram->mem_size)
|
||||
|| size <= datagram->mem_size) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (size > EC_MAX_DATA_SIZE) {
|
||||
EC_ERR("%s(datagram = %p, size = %zu): Exceeding the"
|
||||
" maximum datagram size of %u bytes.\n",
|
||||
__func__, datagram, size, EC_MAX_DATA_SIZE);
|
||||
return -EOVERFLOW;
|
||||
}
|
||||
|
||||
if (datagram->data) {
|
||||
kfree(datagram->data);
|
||||
|
||||
+2
-10
@@ -1,6 +1,6 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
* Copyright (C) 2006-2026 Florian Pose, Ingenieurgemeinschaft IgH
|
||||
*
|
||||
* This file is part of the IgH EtherCAT Master.
|
||||
*
|
||||
@@ -39,7 +39,7 @@
|
||||
* process data size for the mapped PDOs of the given direction to the domain
|
||||
* data size.
|
||||
*/
|
||||
int ec_fmmu_config_init(
|
||||
void ec_fmmu_config_init(
|
||||
ec_fmmu_config_t *fmmu, /**< EtherCAT FMMU configuration. */
|
||||
ec_slave_config_t *sc, /**< EtherCAT slave configuration. */
|
||||
ec_domain_t *domain, /**< EtherCAT domain. */
|
||||
@@ -56,15 +56,7 @@ int ec_fmmu_config_init(
|
||||
fmmu->data_size = ec_pdo_list_total_size(
|
||||
&sc->sync_configs[sync_index].pdos);
|
||||
|
||||
if (fmmu->data_size > EC_MAX_DATA_SIZE) {
|
||||
EC_CONFIG_ERR(fmmu->sc, "FMMU with data size %3u bytes would exceed"
|
||||
" maximum datagram size (%u bytes).\n",
|
||||
fmmu->data_size, EC_MAX_DATA_SIZE);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ec_domain_add_fmmu_config(domain, fmmu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
@@ -47,7 +47,7 @@ typedef struct {
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
int ec_fmmu_config_init(ec_fmmu_config_t *, ec_slave_config_t *,
|
||||
void ec_fmmu_config_init(ec_fmmu_config_t *, ec_slave_config_t *,
|
||||
ec_domain_t *, uint8_t, ec_direction_t);
|
||||
|
||||
void ec_fmmu_config_page(const ec_fmmu_config_t *, const ec_sync_t *,
|
||||
|
||||
@@ -222,7 +222,6 @@ int ec_slave_config_prepare_fmmu(
|
||||
{
|
||||
unsigned int i;
|
||||
ec_fmmu_config_t *fmmu;
|
||||
int ret = 0;
|
||||
|
||||
// FMMU configuration already prepared?
|
||||
for (i = 0; i < sc->used_fmmus; i++) {
|
||||
@@ -239,13 +238,9 @@ int ec_slave_config_prepare_fmmu(
|
||||
fmmu = &sc->fmmu_configs[sc->used_fmmus++];
|
||||
|
||||
down(&sc->master->master_sem);
|
||||
ret = ec_fmmu_config_init(fmmu, sc, domain, sync_index, dir);
|
||||
ec_fmmu_config_init(fmmu, sc, domain, sync_index, dir);
|
||||
up(&sc->master->master_sem);
|
||||
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return fmmu->logical_start_address;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user