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) {