--- a/master/fsm_foe.c Thu Jan 10 12:34:58 2013 +0100
+++ b/master/fsm_foe.c Thu Jan 10 17:36:41 2013 +0100
@@ -74,44 +74,42 @@
/*****************************************************************************/
-int ec_foe_prepare_data_send(ec_fsm_foe_t *);
-int ec_foe_prepare_wrq_send(ec_fsm_foe_t *);
-int ec_foe_prepare_rrq_send(ec_fsm_foe_t *);
-int ec_foe_prepare_send_ack(ec_fsm_foe_t *);
+int ec_foe_prepare_data_send(ec_fsm_foe_t *, ec_datagram_t *);
+int ec_foe_prepare_wrq_send(ec_fsm_foe_t *, ec_datagram_t *);
+int ec_foe_prepare_rrq_send(ec_fsm_foe_t *, ec_datagram_t *);
+int ec_foe_prepare_send_ack(ec_fsm_foe_t *, ec_datagram_t *);
void ec_foe_set_tx_error(ec_fsm_foe_t *, uint32_t);
void ec_foe_set_rx_error(ec_fsm_foe_t *, uint32_t);
-void ec_fsm_foe_write(ec_fsm_foe_t *);
-void ec_fsm_foe_read(ec_fsm_foe_t *);
-void ec_fsm_foe_end(ec_fsm_foe_t *);
-void ec_fsm_foe_error(ec_fsm_foe_t *);
-
-void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *);
-void ec_fsm_foe_state_rrq_sent(ec_fsm_foe_t *);
-
-void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *);
-void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *);
-
-void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *);
-
-void ec_fsm_foe_state_data_check(ec_fsm_foe_t *);
-void ec_fsm_foe_state_data_read(ec_fsm_foe_t *);
-void ec_fsm_foe_state_sent_ack(ec_fsm_foe_t *);
-
-void ec_fsm_foe_write_start(ec_fsm_foe_t *);
-void ec_fsm_foe_read_start(ec_fsm_foe_t *);
+void ec_fsm_foe_end(ec_fsm_foe_t *, ec_datagram_t *);
+void ec_fsm_foe_error(ec_fsm_foe_t *, ec_datagram_t *);
+
+void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *, ec_datagram_t *);
+void ec_fsm_foe_state_rrq_sent(ec_fsm_foe_t *, ec_datagram_t *);
+
+void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *, ec_datagram_t *);
+void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *, ec_datagram_t *);
+
+void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *, ec_datagram_t *);
+
+void ec_fsm_foe_state_data_check(ec_fsm_foe_t *, ec_datagram_t *);
+void ec_fsm_foe_state_data_read(ec_fsm_foe_t *, ec_datagram_t *);
+void ec_fsm_foe_state_sent_ack(ec_fsm_foe_t *, ec_datagram_t *);
+
+void ec_fsm_foe_write_start(ec_fsm_foe_t *, ec_datagram_t *);
+void ec_fsm_foe_read_start(ec_fsm_foe_t *, ec_datagram_t *);
/*****************************************************************************/
/** Constructor.
*/
-void ec_fsm_foe_init(ec_fsm_foe_t *fsm, /**< finite state machine */
- ec_datagram_t *datagram /**< datagram */
- )
-{
- fsm->state = NULL;
- fsm->datagram = datagram;
+void ec_fsm_foe_init(
+ ec_fsm_foe_t *fsm /**< finite state machine */
+ )
+{
+ fsm->state = NULL;
+ fsm->datagram = NULL;
}
/*****************************************************************************/
@@ -125,13 +123,36 @@
/*****************************************************************************/
/** Executes the current state of the state machine.
- * \return false, if state machine has terminated
- */
-int ec_fsm_foe_exec(ec_fsm_foe_t *fsm /**< finite state machine */)
-{
- fsm->state(fsm);
-
- return fsm->state != ec_fsm_foe_end && fsm->state != ec_fsm_foe_error;
+ *
+ * \return 1, if the datagram was used, else 0.
+ */
+int ec_fsm_foe_exec(
+ ec_fsm_foe_t *fsm, /**< finite state machine */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
+{
+ int datagram_used = 0;
+
+ if (fsm->datagram &&
+ (fsm->datagram->state == EC_DATAGRAM_INIT ||
+ fsm->datagram->state == EC_DATAGRAM_QUEUED ||
+ fsm->datagram->state == EC_DATAGRAM_SENT)) {
+ // datagram not received yet
+ return datagram_used;
+ }
+
+ fsm->state(fsm, datagram);
+
+ datagram_used =
+ fsm->state != ec_fsm_foe_end && fsm->state != ec_fsm_foe_error;
+
+ if (datagram_used) {
+ fsm->datagram = datagram;
+ } else {
+ fsm->datagram = NULL;
+ }
+
+ return datagram_used;
}
/*****************************************************************************/
@@ -139,7 +160,7 @@
/** Returns, if the state machine terminated with success.
* \return non-zero if successful.
*/
-int ec_fsm_foe_success(ec_fsm_foe_t *fsm /**< Finite state machine */)
+int ec_fsm_foe_success(const ec_fsm_foe_t *fsm /**< Finite state machine */)
{
return fsm->state == ec_fsm_foe_end;
}
@@ -156,11 +177,25 @@
{
fsm->slave = slave;
fsm->request = request;
+
if (request->dir == EC_DIR_OUTPUT) {
- fsm->state = ec_fsm_foe_write;
+ fsm->tx_buffer = fsm->request->buffer;
+ fsm->tx_buffer_size = fsm->request->data_size;
+ fsm->tx_buffer_offset = 0;
+
+ fsm->tx_filename = fsm->request->file_name;
+ fsm->tx_filename_len = strlen(fsm->tx_filename);
+
+ fsm->state = ec_fsm_foe_write_start;
}
else {
- fsm->state = ec_fsm_foe_read;
+ fsm->rx_buffer = fsm->request->buffer;
+ fsm->rx_buffer_size = fsm->request->buffer_size;
+
+ fsm->rx_filename = fsm->request->file_name;
+ fsm->rx_filename_len = strlen(fsm->rx_filename);
+
+ fsm->state = ec_fsm_foe_read_start;
}
}
@@ -168,7 +203,10 @@
/** State: ERROR.
*/
-void ec_fsm_foe_error(ec_fsm_foe_t *fsm /**< finite state machine */)
+void ec_fsm_foe_error(
+ ec_fsm_foe_t *fsm, /**< finite state machine */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
{
#ifdef DEBUG_FOE
printk("ec_fsm_foe_error()\n");
@@ -179,7 +217,10 @@
/** State: END.
*/
-void ec_fsm_foe_end(ec_fsm_foe_t *fsm /**< finite state machine */)
+void ec_fsm_foe_end(
+ ec_fsm_foe_t *fsm, /**< finite state machine */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
{
#ifdef DEBUG_FOE
printk("ec_fsm_foe_end\n");
@@ -190,7 +231,10 @@
/** Sends a file or the next fragment.
*/
-int ec_foe_prepare_data_send(ec_fsm_foe_t *fsm)
+int ec_foe_prepare_data_send(
+ ec_fsm_foe_t *fsm,
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
{
size_t remaining_size, current_size;
uint8_t *data;
@@ -207,13 +251,14 @@
}
data = ec_slave_mbox_prepare_send(fsm->slave,
- fsm->datagram, EC_MBOX_TYPE_FILEACCESS,
+ datagram, EC_MBOX_TYPE_FILEACCESS,
current_size + EC_FOE_HEADER_SIZE);
- if (IS_ERR(data))
+ if (IS_ERR(data)) {
return -1;
-
- EC_WRITE_U8 ( data, EC_FOE_OPCODE_DATA ); // OpCode = DataBlock req.
- EC_WRITE_U32( data + 2, fsm->tx_packet_no ); // PacketNo, Password
+ }
+
+ EC_WRITE_U8 (data, EC_FOE_OPCODE_DATA); // OpCode = DataBlock req.
+ EC_WRITE_U32(data + 2, fsm->tx_packet_no); // PacketNo, Password
memcpy(data + EC_FOE_HEADER_SIZE,
fsm->tx_buffer + fsm->tx_buffer_offset, current_size);
@@ -226,7 +271,10 @@
/** Prepare a write request (WRQ) with filename
*/
-int ec_foe_prepare_wrq_send(ec_fsm_foe_t *fsm)
+int ec_foe_prepare_wrq_send(
+ ec_fsm_foe_t *fsm, /**< Finite state machine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
{
size_t current_size;
uint8_t *data;
@@ -238,10 +286,11 @@
current_size = fsm->tx_filename_len;
- data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram,
+ data = ec_slave_mbox_prepare_send(fsm->slave, datagram,
EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE);
- if (IS_ERR(data))
+ if (IS_ERR(data)) {
return -1;
+ }
EC_WRITE_U16( data, EC_FOE_OPCODE_WRQ); // fsm write request
EC_WRITE_U32( data + 2, fsm->tx_packet_no );
@@ -253,27 +302,12 @@
/*****************************************************************************/
-/** Start a write operation.
- */
-void ec_fsm_foe_write(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
- )
-{
- fsm->tx_buffer = fsm->request->buffer;
- fsm->tx_buffer_size = fsm->request->data_size;
- fsm->tx_buffer_offset = 0;
-
- fsm->tx_filename = fsm->request->file_name;
- fsm->tx_filename_len = strlen(fsm->tx_filename);
-
- fsm->state = ec_fsm_foe_write_start;
-}
-
-/*****************************************************************************/
-
/** Initializes the FoE write state machine.
*/
-void ec_fsm_foe_write_start(ec_fsm_foe_t *fsm /**< finite state machine */)
+void ec_fsm_foe_write_start(
+ ec_fsm_foe_t *fsm, /**< finite state machine */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
{
ec_slave_t *slave = fsm->slave;
@@ -292,7 +326,7 @@
return;
}
- if (ec_foe_prepare_wrq_send(fsm)) {
+ if (ec_foe_prepare_wrq_send(fsm, datagram)) {
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
return;
}
@@ -305,33 +339,33 @@
/** Check for acknowledge.
*/
void ec_fsm_foe_state_ack_check(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
- )
-{
- ec_datagram_t *datagram = fsm->datagram;
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
+{
ec_slave_t *slave = fsm->slave;
#ifdef DEBUG_FOE
printk("ec_fsm_foe_ack_check()\n");
#endif
- if (datagram->state != EC_DATAGRAM_RECEIVED) {
+ if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
EC_SLAVE_ERR(slave, "Failed to receive FoE mailbox check datagram: ");
- ec_datagram_print_state(datagram);
- return;
- }
-
- if (datagram->working_counter != 1) {
- // slave did not put anything in the mailbox yet
+ ec_datagram_print_state(fsm->datagram);
+ return;
+ }
+
+ if (fsm->datagram->working_counter != 1) {
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
EC_SLAVE_ERR(slave, "Reception of FoE mailbox check datagram"
" failed: ");
- ec_datagram_print_wc_error(datagram);
- return;
- }
-
- if (!ec_slave_mbox_check(datagram)) {
+ ec_datagram_print_wc_error(fsm->datagram);
+ return;
+ }
+
+ if (!ec_slave_mbox_check(fsm->datagram)) {
+ // slave did not put anything in the mailbox yet
unsigned long diff_ms =
(datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ;
if (diff_ms >= EC_FSM_FOE_TIMEOUT) {
@@ -357,10 +391,10 @@
/** Acknowledge a read operation.
*/
void ec_fsm_foe_state_ack_read(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
- )
-{
- ec_datagram_t *datagram = fsm->datagram;
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
+{
ec_slave_t *slave = fsm->slave;
uint8_t *data, mbox_prot;
uint8_t opCode;
@@ -370,22 +404,22 @@
printk("ec_fsm_foe_ack_read()\n");
#endif
- if (datagram->state != EC_DATAGRAM_RECEIVED) {
+ if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
EC_SLAVE_ERR(slave, "Failed to receive FoE ack response datagram: ");
- ec_datagram_print_state(datagram);
- return;
- }
-
- if (datagram->working_counter != 1) {
+ ec_datagram_print_state(fsm->datagram);
+ return;
+ }
+
+ if (fsm->datagram->working_counter != 1) {
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
EC_SLAVE_ERR(slave, "Reception of FoE ack response failed: ");
- ec_datagram_print_wc_error(datagram);
- return;
- }
-
- if (!(data = ec_slave_mbox_fetch(fsm->slave, datagram,
- &mbox_prot, &rec_size))) {
+ ec_datagram_print_wc_error(fsm->datagram);
+ return;
+ }
+
+ data = ec_slave_mbox_fetch(fsm->slave, datagram, &mbox_prot, &rec_size);
+ if (IS_ERR(data)) {
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
return;
}
@@ -401,7 +435,7 @@
if (opCode == EC_FOE_OPCODE_BUSY) {
// slave not ready
- if (ec_foe_prepare_data_send(fsm)) {
+ if (ec_foe_prepare_data_send(fsm, datagram)) {
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
EC_SLAVE_ERR(slave, "Slave is busy.\n");
return;
@@ -419,7 +453,7 @@
return;
}
- if (ec_foe_prepare_data_send(fsm)) {
+ if (ec_foe_prepare_data_send(fsm, datagram)) {
ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
return;
}
@@ -437,32 +471,32 @@
* fragment, if necessary.
*/
void ec_fsm_foe_state_wrq_sent(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
- )
-{
- ec_datagram_t *datagram = fsm->datagram;
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
+{
ec_slave_t *slave = fsm->slave;
#ifdef DEBUG_FOE
printk("ec_foe_state_sent_wrq()\n");
#endif
- if (datagram->state != EC_DATAGRAM_RECEIVED) {
+ if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
EC_SLAVE_ERR(slave, "Failed to send FoE WRQ: ");
- ec_datagram_print_state(datagram);
- return;
- }
-
- if (datagram->working_counter != 1) {
+ ec_datagram_print_state(fsm->datagram);
+ return;
+ }
+
+ if (fsm->datagram->working_counter != 1) {
// slave did not put anything in the mailbox yet
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
EC_SLAVE_ERR(slave, "Reception of FoE WRQ failed: ");
- ec_datagram_print_wc_error(datagram);
- return;
- }
-
- fsm->jiffies_start = datagram->jiffies_sent;
+ ec_datagram_print_wc_error(fsm->datagram);
+ return;
+ }
+
+ fsm->jiffies_start = fsm->datagram->jiffies_sent;
ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail.
@@ -478,10 +512,10 @@
* fragment, if necessary.
*/
void ec_fsm_foe_state_data_sent(
- ec_fsm_foe_t *fsm /**< Foe statemachine. */
- )
-{
- ec_datagram_t *datagram = fsm->datagram;
+ ec_fsm_foe_t *fsm, /**< Foe statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
+{
ec_slave_t *slave = fsm->slave;
#ifdef DEBUG_FOE
@@ -491,18 +525,18 @@
if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
ec_foe_set_tx_error(fsm, FOE_RECEIVE_ERROR);
EC_SLAVE_ERR(slave, "Failed to receive FoE ack response datagram: ");
- ec_datagram_print_state(datagram);
+ ec_datagram_print_state(fsm->datagram);
return;
}
if (fsm->datagram->working_counter != 1) {
ec_foe_set_tx_error(fsm, FOE_WC_ERROR);
EC_SLAVE_ERR(slave, "Reception of FoE data send failed: ");
- ec_datagram_print_wc_error(datagram);
- return;
- }
-
- ec_slave_mbox_prepare_check(fsm->slave, fsm->datagram);
+ ec_datagram_print_wc_error(fsm->datagram);
+ return;
+ }
+
+ ec_slave_mbox_prepare_check(fsm->slave, datagram);
fsm->jiffies_start = jiffies;
fsm->retries = EC_FSM_RETRIES;
fsm->state = ec_fsm_foe_state_ack_check;
@@ -512,17 +546,21 @@
/** Prepare a read request (RRQ) with filename
*/
-int ec_foe_prepare_rrq_send(ec_fsm_foe_t *fsm)
+int ec_foe_prepare_rrq_send(
+ ec_fsm_foe_t *fsm, /**< Finite state machine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
{
size_t current_size;
uint8_t *data;
current_size = fsm->rx_filename_len;
- data = ec_slave_mbox_prepare_send(fsm->slave, fsm->datagram,
+ data = ec_slave_mbox_prepare_send(fsm->slave, datagram,
EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE);
- if (IS_ERR(data))
+ if (IS_ERR(data)) {
return -1;
+ }
EC_WRITE_U16(data, EC_FOE_OPCODE_RRQ); // fsm read request
EC_WRITE_U32(data + 2, 0x00000000); // no passwd
@@ -541,18 +579,20 @@
/** Prepare to send an acknowledge.
*/
int ec_foe_prepare_send_ack(
- ec_fsm_foe_t *foe /**< FoE statemachine. */
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
)
{
uint8_t *data;
- data = ec_slave_mbox_prepare_send(foe->slave, foe->datagram,
+ data = ec_slave_mbox_prepare_send(fsm->slave, datagram,
EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE);
- if (IS_ERR(data))
+ if (IS_ERR(data)) {
return -1;
+ }
EC_WRITE_U16(data, EC_FOE_OPCODE_ACK);
- EC_WRITE_U32(data + 2, foe->rx_expected_packet_no);
+ EC_WRITE_U32(data + 2, fsm->rx_expected_packet_no);
return 0;
}
@@ -561,36 +601,36 @@
/** State: RRQ SENT.
*
- * Checks is the previous transmit datagram succeded and sends the next
+ * Checks is the previous transmit datagram succeeded and sends the next
* fragment, if necessary.
*/
void ec_fsm_foe_state_rrq_sent(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
- )
-{
- ec_datagram_t *datagram = fsm->datagram;
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
+{
ec_slave_t *slave = fsm->slave;
#ifdef DEBUG_FOE
printk("ec_foe_state_rrq_sent()\n");
#endif
- if (datagram->state != EC_DATAGRAM_RECEIVED) {
+ if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
EC_SLAVE_ERR(slave, "Failed to send FoE RRQ: ");
- ec_datagram_print_state(datagram);
- return;
- }
-
- if (datagram->working_counter != 1) {
+ ec_datagram_print_state(fsm->datagram);
+ return;
+ }
+
+ if (fsm->datagram->working_counter != 1) {
// slave did not put anything in the mailbox yet
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
EC_SLAVE_ERR(slave, "Reception of FoE RRQ failed: ");
- ec_datagram_print_wc_error(datagram);
- return;
- }
-
- fsm->jiffies_start = datagram->jiffies_sent;
+ ec_datagram_print_wc_error(fsm->datagram);
+ return;
+ }
+
+ fsm->jiffies_start = fsm->datagram->jiffies_sent;
ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail.
@@ -600,26 +640,11 @@
/*****************************************************************************/
-/** Start a read operation.
- */
-void ec_fsm_foe_read(
- ec_fsm_foe_t *fsm /**< FoE state machine. */
- )
-{
- fsm->state = ec_fsm_foe_read_start;
- fsm->rx_filename = fsm->request->file_name;
- fsm->rx_filename_len = strlen(fsm->rx_filename);
-
- fsm->rx_buffer = fsm->request->buffer;
- fsm->rx_buffer_size = fsm->request->buffer_size;
-}
-
-/*****************************************************************************/
-
/** Starting state for read operations.
*/
void ec_fsm_foe_read_start(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
)
{
ec_slave_t *slave = fsm->slave;
@@ -638,7 +663,7 @@
return;
}
- if (ec_foe_prepare_rrq_send(fsm)) {
+ if (ec_foe_prepare_rrq_send(fsm, datagram)) {
ec_foe_set_rx_error(fsm, FOE_PROT_ERROR);
return;
}
@@ -651,33 +676,34 @@
/** Check for data.
*/
void ec_fsm_foe_state_data_check(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
- )
-{
- ec_datagram_t *datagram = fsm->datagram;
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
+{
ec_slave_t *slave = fsm->slave;
#ifdef DEBUG_FOE
printk("ec_fsm_foe_state_data_check()\n");
#endif
- if (datagram->state != EC_DATAGRAM_RECEIVED) {
+ if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
EC_SLAVE_ERR(slave, "Failed to send FoE DATA READ: ");
- ec_datagram_print_state(datagram);
- return;
- }
-
- if (datagram->working_counter != 1) {
+ ec_datagram_print_state(fsm->datagram);
+ return;
+ }
+
+ if (fsm->datagram->working_counter != 1) {
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
EC_SLAVE_ERR(slave, "Reception of FoE DATA READ: ");
- ec_datagram_print_wc_error(datagram);
- return;
- }
-
- if (!ec_slave_mbox_check(datagram)) {
+ ec_datagram_print_wc_error(fsm->datagram);
+ return;
+ }
+
+ if (!ec_slave_mbox_check(fsm->datagram)) {
unsigned long diff_ms =
- (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ;
+ (fsm->datagram->jiffies_received - fsm->jiffies_start) *
+ 1000 / HZ;
if (diff_ms >= EC_FSM_FOE_TIMEOUT) {
ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR);
EC_SLAVE_ERR(slave, "Timeout while waiting for ack response.\n");
@@ -702,35 +728,35 @@
/** Start reading data.
*/
void ec_fsm_foe_state_data_read(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
)
{
size_t rec_size;
uint8_t *data, opCode, packet_no, mbox_prot;
- ec_datagram_t *datagram = fsm->datagram;
ec_slave_t *slave = fsm->slave;
#ifdef DEBUG_FOE
printk("ec_fsm_foe_state_data_read()\n");
#endif
- if (datagram->state != EC_DATAGRAM_RECEIVED) {
+ if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
EC_SLAVE_ERR(slave, "Failed to receive FoE DATA READ datagram: ");
- ec_datagram_print_state(datagram);
- return;
- }
-
- if (datagram->working_counter != 1) {
+ ec_datagram_print_state(fsm->datagram);
+ return;
+ }
+
+ if (fsm->datagram->working_counter != 1) {
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
EC_SLAVE_ERR(slave, "Reception of FoE DATA READ failed: ");
- ec_datagram_print_wc_error(datagram);
- return;
- }
-
- if (!(data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot,
- &rec_size))) {
+ ec_datagram_print_wc_error(fsm->datagram);
+ return;
+ }
+
+ data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size);
+ if (IS_ERR(data)) {
ec_foe_set_rx_error(fsm, FOE_MBOX_FETCH_ERROR);
return;
}
@@ -745,7 +771,7 @@
opCode = EC_READ_U8(data);
if (opCode == EC_FOE_OPCODE_BUSY) {
- if (ec_foe_prepare_send_ack(fsm)) {
+ if (ec_foe_prepare_send_ack(fsm, datagram)) {
ec_foe_set_rx_error(fsm, FOE_PROT_ERROR);
}
return;
@@ -800,7 +826,7 @@
#ifdef DEBUG_FOE
printk ("last_packet=true\n");
#endif
- if (ec_foe_prepare_send_ack(fsm)) {
+ if (ec_foe_prepare_send_ack(fsm, datagram)) {
ec_foe_set_rx_error(fsm, FOE_RX_DATA_ACK_ERROR);
return;
}
@@ -826,32 +852,32 @@
/** Sent an acknowledge.
*/
void ec_fsm_foe_state_sent_ack(
- ec_fsm_foe_t *fsm /**< FoE statemachine. */
- )
-{
- ec_datagram_t *datagram = fsm->datagram;
+ ec_fsm_foe_t *fsm, /**< FoE statemachine. */
+ ec_datagram_t *datagram /**< Datagram to use. */
+ )
+{
ec_slave_t *slave = fsm->slave;
#ifdef DEBUG_FOE
printk("ec_foe_state_sent_ack()\n");
#endif
- if (datagram->state != EC_DATAGRAM_RECEIVED) {
+ if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
EC_SLAVE_ERR(slave, "Failed to send FoE ACK: ");
- ec_datagram_print_state(datagram);
- return;
- }
-
- if (datagram->working_counter != 1) {
+ ec_datagram_print_state(fsm->datagram);
+ return;
+ }
+
+ if (fsm->datagram->working_counter != 1) {
// slave did not put anything into the mailbox yet
ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
EC_SLAVE_ERR(slave, "Reception of FoE ACK failed: ");
- ec_datagram_print_wc_error(datagram);
- return;
- }
-
- fsm->jiffies_start = datagram->jiffies_sent;
+ ec_datagram_print_wc_error(fsm->datagram);
+ return;
+ }
+
+ fsm->jiffies_start = fsm->datagram->jiffies_sent;
ec_slave_mbox_prepare_check(fsm->slave, datagram); // can not fail.