102 void ec_fsm_foe_write_start(ec_fsm_foe_t *); |
102 void ec_fsm_foe_write_start(ec_fsm_foe_t *); |
103 void ec_fsm_foe_read_start(ec_fsm_foe_t *); |
103 void ec_fsm_foe_read_start(ec_fsm_foe_t *); |
104 |
104 |
105 /*****************************************************************************/ |
105 /*****************************************************************************/ |
106 |
106 |
107 /** |
107 /** Constructor. |
108 Constructor. |
108 */ |
109 */ |
|
110 |
|
111 void ec_fsm_foe_init(ec_fsm_foe_t *fsm, /**< finite state machine */ |
109 void ec_fsm_foe_init(ec_fsm_foe_t *fsm, /**< finite state machine */ |
112 ec_datagram_t *datagram /**< datagram */ |
110 ec_datagram_t *datagram /**< datagram */ |
113 ) |
111 ) |
114 { |
112 { |
115 fsm->state = NULL; |
113 fsm->state = NULL; |
116 fsm->datagram = datagram; |
114 fsm->datagram = datagram; |
117 fsm->rx_errors = 0; |
115 } |
118 fsm->tx_errors = 0; |
116 |
119 } |
117 /*****************************************************************************/ |
120 |
118 |
121 /*****************************************************************************/ |
119 /** Destructor. |
122 |
120 */ |
123 /** |
|
124 Destructor. |
|
125 */ |
|
126 |
|
127 void ec_fsm_foe_clear(ec_fsm_foe_t *fsm /**< finite state machine */) |
121 void ec_fsm_foe_clear(ec_fsm_foe_t *fsm /**< finite state machine */) |
128 { |
122 { |
129 } |
123 } |
130 |
124 |
131 /*****************************************************************************/ |
125 /*****************************************************************************/ |
132 |
126 |
133 /** |
127 /** Executes the current state of the state machine. |
134 Executes the current state of the state machine. |
128 * \return false, if state machine has terminated |
135 \return false, if state machine has terminated |
129 */ |
136 */ |
|
137 |
|
138 int ec_fsm_foe_exec(ec_fsm_foe_t *fsm /**< finite state machine */) |
130 int ec_fsm_foe_exec(ec_fsm_foe_t *fsm /**< finite state machine */) |
139 { |
131 { |
140 fsm->state(fsm); |
132 fsm->state(fsm); |
141 |
133 |
142 return fsm->state != ec_fsm_foe_end && fsm->state != ec_fsm_foe_error; |
134 return fsm->state != ec_fsm_foe_end && fsm->state != ec_fsm_foe_error; |
143 } |
135 } |
144 |
136 |
145 /*****************************************************************************/ |
137 /*****************************************************************************/ |
146 |
138 |
147 /** |
139 /** Returns, if the state machine terminated with success. |
148 Returns, if the state machine terminated with success. |
140 * \return non-zero if successful. |
149 \return non-zero if successful. |
141 */ |
150 */ |
|
151 |
|
152 int ec_fsm_foe_success(ec_fsm_foe_t *fsm /**< Finite state machine */) |
142 int ec_fsm_foe_success(ec_fsm_foe_t *fsm /**< Finite state machine */) |
153 { |
143 { |
154 return fsm->state == ec_fsm_foe_end; |
144 return fsm->state == ec_fsm_foe_end; |
155 } |
145 } |
156 |
146 |
174 } |
164 } |
175 } |
165 } |
176 |
166 |
177 /*****************************************************************************/ |
167 /*****************************************************************************/ |
178 |
168 |
179 /** |
169 /** State: ERROR. |
180 State: ERROR. |
170 */ |
181 */ |
|
182 |
|
183 void ec_fsm_foe_error(ec_fsm_foe_t *fsm /**< finite state machine */) |
171 void ec_fsm_foe_error(ec_fsm_foe_t *fsm /**< finite state machine */) |
184 { |
172 { |
185 #ifdef DEBUG_FOE |
173 #ifdef DEBUG_FOE |
186 printk("ec_fsm_foe_error()\n"); |
174 printk("ec_fsm_foe_error()\n"); |
187 #endif |
175 #endif |
188 } |
176 } |
189 |
177 |
190 /*****************************************************************************/ |
178 /*****************************************************************************/ |
191 |
179 |
192 /** |
180 /** State: END. |
193 State: END. |
181 */ |
194 */ |
|
195 |
|
196 void ec_fsm_foe_end(ec_fsm_foe_t *fsm /**< finite state machine */) |
182 void ec_fsm_foe_end(ec_fsm_foe_t *fsm /**< finite state machine */) |
197 { |
183 { |
198 #ifdef DEBUG_FOE |
184 #ifdef DEBUG_FOE |
199 printk("ec_fsm_foe_end\n"); |
185 printk("ec_fsm_foe_end\n"); |
200 #endif |
186 #endif |
201 } |
187 } |
202 |
188 |
203 /*****************************************************************************/ |
189 /*****************************************************************************/ |
204 /** |
190 |
205 Sends a file or the next fragment. |
191 /** Sends a file or the next fragment. |
206 */ |
192 */ |
207 |
|
208 int ec_foe_prepare_data_send(ec_fsm_foe_t *fsm) |
193 int ec_foe_prepare_data_send(ec_fsm_foe_t *fsm) |
209 { |
194 { |
210 size_t remaining_size, current_size; |
195 size_t remaining_size, current_size; |
211 uint8_t *data; |
196 uint8_t *data; |
212 |
197 |
530 fsm->retries = EC_FSM_RETRIES; |
514 fsm->retries = EC_FSM_RETRIES; |
531 fsm->state = ec_fsm_foe_state_ack_check; |
515 fsm->state = ec_fsm_foe_state_ack_check; |
532 } |
516 } |
533 |
517 |
534 /*****************************************************************************/ |
518 /*****************************************************************************/ |
535 /** |
519 |
536 Prepare a read request (RRQ) with filename |
520 /** Prepare a read request (RRQ) with filename |
537 */ |
521 */ |
538 |
|
539 int ec_foe_prepare_rrq_send(ec_fsm_foe_t *fsm) |
522 int ec_foe_prepare_rrq_send(ec_fsm_foe_t *fsm) |
540 { |
523 { |
541 size_t current_size; |
524 size_t current_size; |
542 uint8_t *data; |
525 uint8_t *data; |
543 |
526 |
651 { |
633 { |
652 size_t current_size; |
634 size_t current_size; |
653 ec_slave_t *slave = fsm->slave; |
635 ec_slave_t *slave = fsm->slave; |
654 |
636 |
655 fsm->rx_buffer_offset = 0; |
637 fsm->rx_buffer_offset = 0; |
656 fsm->rx_current_size = 0; |
|
657 fsm->rx_packet_no = 0; |
|
658 fsm->rx_expected_packet_no = 1; |
638 fsm->rx_expected_packet_no = 1; |
659 fsm->rx_last_packet = 0; |
639 fsm->rx_last_packet = 0; |
660 |
640 |
661 current_size = fsm->rx_filename_len; |
641 current_size = fsm->rx_filename_len; |
662 |
642 |
912 void ec_foe_set_tx_error( |
892 void ec_foe_set_tx_error( |
913 ec_fsm_foe_t *fsm, /**< FoE statemachine. */ |
893 ec_fsm_foe_t *fsm, /**< FoE statemachine. */ |
914 uint32_t errorcode /**< FoE error code. */ |
894 uint32_t errorcode /**< FoE error code. */ |
915 ) |
895 ) |
916 { |
896 { |
917 fsm->tx_errors++; |
|
918 fsm->request->result = errorcode; |
897 fsm->request->result = errorcode; |
919 fsm->state = ec_fsm_foe_error; |
898 fsm->state = ec_fsm_foe_error; |
920 } |
899 } |
921 |
900 |
922 /*****************************************************************************/ |
901 /*****************************************************************************/ |
926 void ec_foe_set_rx_error( |
905 void ec_foe_set_rx_error( |
927 ec_fsm_foe_t *fsm, /**< FoE statemachine. */ |
906 ec_fsm_foe_t *fsm, /**< FoE statemachine. */ |
928 uint32_t errorcode /**< FoE error code. */ |
907 uint32_t errorcode /**< FoE error code. */ |
929 ) |
908 ) |
930 { |
909 { |
931 fsm->rx_errors++; |
|
932 fsm->request->result = errorcode; |
910 fsm->request->result = errorcode; |
933 fsm->state = ec_fsm_foe_error; |
911 fsm->state = ec_fsm_foe_error; |
934 } |
912 } |
935 |
913 |
936 /*****************************************************************************/ |
914 /*****************************************************************************/ |