# HG changeset patch # User Florian Pose # Date 1213017856 0 # Node ID 167ae3e76cc7e192193935fdbd5193380206cf3d # Parent 677e63a8ed6ecc3360392dbc7403a1503f3a9c94 Moved sii to words. diff -r 677e63a8ed6e -r 167ae3e76cc7 master/fsm_slave_scan.c --- a/master/fsm_slave_scan.c Mon Jun 09 12:51:54 2008 +0000 +++ b/master/fsm_slave_scan.c Mon Jun 09 13:24:16 2008 +0000 @@ -384,7 +384,7 @@ " %u words (0xffff limiter missing?).\n", slave->ring_position, EC_MAX_SII_SIZE); // cut off category data... - slave->sii_size = EC_FIRST_SII_CATEGORY_OFFSET * 2; + slave->sii_nwords = EC_FIRST_SII_CATEGORY_OFFSET; goto alloc_sii; } fsm->sii_offset = next_offset; @@ -394,20 +394,20 @@ return; } - slave->sii_size = (fsm->sii_offset + 1) * 2; + slave->sii_nwords = fsm->sii_offset + 1; alloc_sii: - if (slave->sii_data) { + if (slave->sii_words) { EC_WARN("Freeing old SII data on slave %i...\n", slave->ring_position); - kfree(slave->sii_data); - } - - if (!(slave->sii_data = - (uint8_t *) kmalloc(slave->sii_size, GFP_ATOMIC))) { - EC_ERR("Failed to allocate %u bytes of SII data for slave %u.\n", - slave->sii_size, slave->ring_position); - slave->sii_size = 0; + kfree(slave->sii_words); + } + + if (!(slave->sii_words = + (uint16_t *) kmalloc(slave->sii_nwords * 2, GFP_ATOMIC))) { + EC_ERR("Failed to allocate %u words of SII data for slave %u.\n", + slave->sii_nwords, slave->ring_position); + slave->sii_nwords = 0; slave->error_flag = 1; fsm->state = ec_fsm_slave_scan_state_error; return; @@ -431,7 +431,7 @@ void ec_fsm_slave_scan_state_sii_data(ec_fsm_slave_scan_t *fsm /**< slave state machine */) { ec_slave_t *slave = fsm->slave; - uint16_t *cat_word, cat_type, cat_size, sii_word_size = slave->sii_size / 2; + uint16_t *cat_word, cat_type, cat_size; if (ec_fsm_sii_exec(&fsm->fsm_sii)) return; @@ -445,16 +445,13 @@ // 2 words fetched - if (fsm->sii_offset + 2 <= sii_word_size) { // 2 words fit - memcpy(slave->sii_data + fsm->sii_offset * 2, - fsm->fsm_sii.value, 4); - } - else { // copy the last word - memcpy(slave->sii_data + fsm->sii_offset * 2, - fsm->fsm_sii.value, 2); - } - - if (fsm->sii_offset + 2 < sii_word_size) { + if (fsm->sii_offset + 2 <= slave->sii_nwords) { // 2 words fit + memcpy(slave->sii_words + fsm->sii_offset, fsm->fsm_sii.value, 4); + } else { // copy the last word + memcpy(slave->sii_words + fsm->sii_offset, fsm->fsm_sii.value, 2); + } + + if (fsm->sii_offset + 2 < slave->sii_nwords) { // fetch the next 2 words fsm->sii_offset += 2; ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, @@ -468,33 +465,33 @@ ec_slave_clear_sync_managers(slave); slave->sii.alias = - EC_READ_U16(slave->sii_data + 2 * 0x0004); + EC_READ_U16(slave->sii_words + 0x0004); slave->sii.vendor_id = - EC_READ_U32(slave->sii_data + 2 * 0x0008); + EC_READ_U32(slave->sii_words + 0x0008); slave->sii.product_code = - EC_READ_U32(slave->sii_data + 2 * 0x000A); + EC_READ_U32(slave->sii_words + 0x000A); slave->sii.revision_number = - EC_READ_U32(slave->sii_data + 2 * 0x000C); + EC_READ_U32(slave->sii_words + 0x000C); slave->sii.serial_number = - EC_READ_U32(slave->sii_data + 2 * 0x000E); + EC_READ_U32(slave->sii_words + 0x000E); slave->sii.rx_mailbox_offset = - EC_READ_U16(slave->sii_data + 2 * 0x0018); + EC_READ_U16(slave->sii_words + 0x0018); slave->sii.rx_mailbox_size = - EC_READ_U16(slave->sii_data + 2 * 0x0019); + EC_READ_U16(slave->sii_words + 0x0019); slave->sii.tx_mailbox_offset = - EC_READ_U16(slave->sii_data + 2 * 0x001A); + EC_READ_U16(slave->sii_words + 0x001A); slave->sii.tx_mailbox_size = - EC_READ_U16(slave->sii_data + 2 * 0x001B); + EC_READ_U16(slave->sii_words + 0x001B); slave->sii.mailbox_protocols = - EC_READ_U16(slave->sii_data + 2 * 0x001C); - - if (sii_word_size == EC_FIRST_SII_CATEGORY_OFFSET) { + EC_READ_U16(slave->sii_words + 0x001C); + + if (slave->sii_nwords == EC_FIRST_SII_CATEGORY_OFFSET) { // sii does not contain category data fsm->state = ec_fsm_slave_scan_state_end; return; } - if (sii_word_size < EC_FIRST_SII_CATEGORY_OFFSET + 1) { + if (slave->sii_nwords < EC_FIRST_SII_CATEGORY_OFFSET + 1) { EC_ERR("Unexpected end of SII data in slave %u:" " First category header missing.\n", slave->ring_position); @@ -502,13 +499,11 @@ } // evaluate category data - cat_word = - (uint16_t *) slave->sii_data + EC_FIRST_SII_CATEGORY_OFFSET; + cat_word = slave->sii_words + EC_FIRST_SII_CATEGORY_OFFSET; while (EC_READ_U16(cat_word) != 0xFFFF) { // type and size words must fit - if (cat_word + 2 - (uint16_t *) slave->sii_data - > sii_word_size) { + if (cat_word + 2 - slave->sii_words > slave->sii_nwords) { EC_ERR("Unexpected end of SII data in slave %u:" " Category header incomplete.\n", slave->ring_position); @@ -519,8 +514,7 @@ cat_size = EC_READ_U16(cat_word + 1); cat_word += 2; - if (cat_word + cat_size - (uint16_t *) slave->sii_data - > sii_word_size) { + if (cat_word + cat_size - slave->sii_words > slave->sii_nwords) { EC_WARN("Unexpected end of SII data in slave %u:" " Category data incomplete.\n", slave->ring_position); @@ -562,7 +556,7 @@ } cat_word += cat_size; - if (cat_word - (uint16_t *) slave->sii_data >= sii_word_size) { + if (cat_word - slave->sii_words >= slave->sii_nwords) { EC_WARN("Unexpected end of SII data in slave %u:" " Next category header missing.\n", slave->ring_position); diff -r 677e63a8ed6e -r 167ae3e76cc7 master/slave.c --- a/master/slave.c Mon Jun 09 12:51:54 2008 +0000 +++ b/master/slave.c Mon Jun 09 13:24:16 2008 +0000 @@ -124,8 +124,8 @@ slave->base_build = 0; slave->base_fmmu_count = 0; - slave->sii_data = NULL; - slave->sii_size = 0; + slave->sii_words = NULL; + slave->sii_nwords = 0; slave->sii.alias = 0; slave->sii.vendor_id = 0; @@ -267,8 +267,8 @@ kfree(pdo); } - if (slave->sii_data) - kfree(slave->sii_data); + if (slave->sii_words) + kfree(slave->sii_words); kfree(slave); } @@ -1033,14 +1033,14 @@ return -EINVAL; } - if (!slave->sii_data || slave->sii_size < 16) { + if (!slave->sii_words || slave->sii_nwords < 8) { EC_ERR("Failed to read SII contents from slave %u.\n", slave->ring_position); return -EINVAL; } // copy first 7 words of recent SII contents - memcpy(sii_data, slave->sii_data, 14); + memcpy(sii_data, (uint8_t *) slave->sii_words, 14); // write new alias address in word 4 EC_WRITE_U16(sii_data + 8, alias); @@ -1077,19 +1077,21 @@ ) { ec_slave_t *slave = container_of(kobj, ec_slave_t, kobj); + unsigned int sii_size; if (attr == &attr_info) { return ec_slave_info(slave, buffer); } else if (attr == &attr_sii) { - if (slave->sii_data) { - if (slave->sii_size > PAGE_SIZE) { + if (slave->sii_words) { + sii_size = slave->sii_nwords * 2; + if (sii_size > PAGE_SIZE) { EC_ERR("SII contents of slave %u exceed 1 page (%u/%u).\n", - slave->ring_position, slave->sii_size, + slave->ring_position, sii_size, (int) PAGE_SIZE); } else { - memcpy(buffer, slave->sii_data, slave->sii_size); - return slave->sii_size; + memcpy(buffer, (uint8_t *) slave->sii_words, sii_size); + return sii_size; } } } else if (attr == &attr_alias) { diff -r 677e63a8ed6e -r 167ae3e76cc7 master/slave.h --- a/master/slave.h Mon Jun 09 12:51:54 2008 +0000 +++ b/master/slave.h Mon Jun 09 13:24:16 2008 +0000 @@ -188,8 +188,8 @@ uint8_t dl_signal[4]; /**< detected signal on RX port */ // SII - uint8_t *sii_data; /**< Complete SII image */ - size_t sii_size; /**< size of the SII contents in bytes */ + uint16_t *sii_words; /**< Complete SII image. */ + size_t sii_nwords; /**< Size of the SII contents in words. */ // slave information interface ec_sii_t sii; /**< SII data. */