diff -r fae3a1759126 -r 63e4bc918640 master/mailbox.c --- a/master/mailbox.c Mon Jan 19 12:36:18 2009 +0000 +++ b/master/mailbox.c Mon Jan 19 14:46:55 2009 +0000 @@ -52,6 +52,7 @@ ) { size_t total_size; + uint16_t mailbox_offset, mailbox_size; if (unlikely(!slave->sii.mailbox_protocols)) { EC_ERR("Slave %u does not support mailbox communication!\n", @@ -60,14 +61,22 @@ } total_size = size + 6; - if (unlikely(total_size > slave->sii.rx_mailbox_size)) { + + if (slave->current_state != EC_SLAVE_STATE_BOOT) { + mailbox_offset = slave->sii.std_rx_mailbox_offset; + mailbox_size = slave->sii.std_rx_mailbox_size; + } else { + mailbox_offset = slave->sii.boot_rx_mailbox_offset; + mailbox_size = slave->sii.boot_rx_mailbox_size; + } + + if (unlikely(total_size > mailbox_size)) { EC_ERR("Data size does not fit in mailbox!\n"); return NULL; } if (ec_datagram_fpwr(datagram, slave->station_address, - slave->sii.rx_mailbox_offset, - slave->sii.rx_mailbox_size)) + mailbox_offset, mailbox_size)) return NULL; EC_WRITE_U16(datagram->data, size); // mailbox service data length @@ -119,9 +128,20 @@ ec_datagram_t *datagram /**< datagram */ ) { + uint16_t mailbox_offset, mailbox_size; + + if (slave->current_state != EC_SLAVE_STATE_BOOT) { + mailbox_offset = slave->sii.std_tx_mailbox_offset; + mailbox_size = slave->sii.std_tx_mailbox_size; + } else { + mailbox_offset = slave->sii.boot_tx_mailbox_offset; + mailbox_size = slave->sii.boot_tx_mailbox_size; + } + if (ec_datagram_fprd(datagram, slave->station_address, - slave->sii.tx_mailbox_offset, - slave->sii.tx_mailbox_size)) return -1; + mailbox_offset, mailbox_size)) + return -1; + return 0; } @@ -157,13 +177,22 @@ ) { size_t data_size; + uint16_t mailbox_offset, mailbox_size; + + if (slave->current_state != EC_SLAVE_STATE_BOOT) { + mailbox_offset = slave->sii.std_tx_mailbox_offset; + mailbox_size = slave->sii.std_tx_mailbox_size; + } else { + mailbox_offset = slave->sii.boot_tx_mailbox_offset; + mailbox_size = slave->sii.boot_tx_mailbox_size; + } data_size = EC_READ_U16(datagram->data); - if (data_size > slave->sii.tx_mailbox_size - 6) { + if (data_size > mailbox_size - 6) { EC_ERR("Corrupt mailbox response received from slave %u!\n", slave->ring_position); - ec_print_data(datagram->data, slave->sii.tx_mailbox_size); + ec_print_data(datagram->data, mailbox_size); return NULL; } @@ -172,15 +201,16 @@ if (*type == 0x00) { const ec_code_msg_t *mbox_msg; - uint16_t code = EC_READ_U16(datagram->data + 8); + uint16_t code = EC_READ_U16(datagram->data + 8); EC_ERR("Mailbox error response received from slave %u - ", - slave->ring_position); - - for (mbox_msg = mbox_error_messages; mbox_msg->code; mbox_msg++) { - if (mbox_msg->code != code) continue; + slave->ring_position); + + for (mbox_msg = mbox_error_messages; mbox_msg->code; mbox_msg++) { + if (mbox_msg->code != code) + continue; printk("Code 0x%04X: \"%s\".\n", - mbox_msg->code, mbox_msg->message); + mbox_msg->code, mbox_msg->message); break; }