196 */ |
196 */ |
197 void ec_fsm_master_state_start( |
197 void ec_fsm_master_state_start( |
198 ec_fsm_master_t *fsm /**< Master state machine. */ |
198 ec_fsm_master_t *fsm /**< Master state machine. */ |
199 ) |
199 ) |
200 { |
200 { |
|
201 ec_master_t *master = fsm->master; |
|
202 |
201 fsm->idle = 1; |
203 fsm->idle = 1; |
|
204 |
|
205 // check for emergency requests |
|
206 if (!list_empty(&master->emerg_reg_requests)) { |
|
207 ec_reg_request_t *request; |
|
208 |
|
209 // get first request |
|
210 request = list_entry(master->emerg_reg_requests.next, |
|
211 ec_reg_request_t, list); |
|
212 list_del_init(&request->list); // dequeue |
|
213 request->state = EC_INT_REQUEST_BUSY; |
|
214 |
|
215 if (request->transfer_size > fsm->datagram->mem_size) { |
|
216 EC_MASTER_ERR(master, "Emergency request data too large!\n"); |
|
217 request->state = EC_INT_REQUEST_FAILURE; |
|
218 wake_up_all(&master->request_queue); |
|
219 fsm->state(fsm); // continue |
|
220 return; |
|
221 } |
|
222 |
|
223 if (request->dir != EC_DIR_OUTPUT) { |
|
224 EC_MASTER_ERR(master, "Emergency requests must be" |
|
225 " write requests!\n"); |
|
226 request->state = EC_INT_REQUEST_FAILURE; |
|
227 wake_up_all(&master->request_queue); |
|
228 fsm->state(fsm); // continue |
|
229 return; |
|
230 } |
|
231 |
|
232 EC_MASTER_DBG(master, 1, "Writing emergency register request...\n"); |
|
233 ec_datagram_apwr(fsm->datagram, request->ring_position, |
|
234 request->address, request->transfer_size); |
|
235 memcpy(fsm->datagram->data, request->data, request->transfer_size); |
|
236 fsm->datagram->device_index = EC_DEVICE_MAIN; |
|
237 request->state = EC_INT_REQUEST_SUCCESS; |
|
238 wake_up_all(&master->request_queue); |
|
239 return; |
|
240 } |
|
241 |
202 ec_datagram_brd(fsm->datagram, 0x0130, 2); |
242 ec_datagram_brd(fsm->datagram, 0x0130, 2); |
203 ec_datagram_zero(fsm->datagram); |
243 ec_datagram_zero(fsm->datagram); |
204 fsm->datagram->device_index = fsm->dev_idx; |
244 fsm->datagram->device_index = fsm->dev_idx; |
205 fsm->state = ec_fsm_master_state_broadcast; |
245 fsm->state = ec_fsm_master_state_broadcast; |
206 } |
246 } |