83 ec_datagram_t *datagram /**< Datagram object to use. */ |
79 ec_datagram_t *datagram /**< Datagram object to use. */ |
84 ) |
80 ) |
85 { |
81 { |
86 fsm->master = master; |
82 fsm->master = master; |
87 fsm->datagram = datagram; |
83 fsm->datagram = datagram; |
88 fsm->mbox = &master->fsm_mbox; |
84 |
89 fsm->state = ec_fsm_master_state_start; |
85 ec_fsm_master_reset(fsm); |
90 fsm->idle = 0; |
|
91 fsm->link_state = 0; |
|
92 fsm->slaves_responding = 0; |
|
93 fsm->rescan_required = 0; |
|
94 fsm->slave_states = EC_SLAVE_STATE_UNKNOWN; |
|
95 |
86 |
96 // init sub-state-machines |
87 // init sub-state-machines |
97 ec_fsm_coe_init(&fsm->fsm_coe, fsm->mbox); |
88 ec_fsm_coe_init(&fsm->fsm_coe); |
|
89 ec_fsm_soe_init(&fsm->fsm_soe); |
98 ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe); |
90 ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe); |
99 ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); |
91 ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); |
100 ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram, |
92 ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram, |
101 &fsm->fsm_change, &fsm->fsm_coe, &fsm->fsm_pdo); |
93 &fsm->fsm_change, &fsm->fsm_coe, &fsm->fsm_soe, &fsm->fsm_pdo); |
102 ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram, |
94 ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram, |
103 &fsm->fsm_slave_config, &fsm->fsm_pdo); |
95 &fsm->fsm_slave_config, &fsm->fsm_pdo); |
104 ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); |
96 ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); |
105 } |
97 } |
106 |
98 |
112 ec_fsm_master_t *fsm /**< Master state machine. */ |
104 ec_fsm_master_t *fsm /**< Master state machine. */ |
113 ) |
105 ) |
114 { |
106 { |
115 // clear sub-state machines |
107 // clear sub-state machines |
116 ec_fsm_coe_clear(&fsm->fsm_coe); |
108 ec_fsm_coe_clear(&fsm->fsm_coe); |
|
109 ec_fsm_soe_clear(&fsm->fsm_soe); |
117 ec_fsm_pdo_clear(&fsm->fsm_pdo); |
110 ec_fsm_pdo_clear(&fsm->fsm_pdo); |
118 ec_fsm_change_clear(&fsm->fsm_change); |
111 ec_fsm_change_clear(&fsm->fsm_change); |
119 ec_fsm_slave_config_clear(&fsm->fsm_slave_config); |
112 ec_fsm_slave_config_clear(&fsm->fsm_slave_config); |
120 ec_fsm_slave_scan_clear(&fsm->fsm_slave_scan); |
113 ec_fsm_slave_scan_clear(&fsm->fsm_slave_scan); |
121 ec_fsm_sii_clear(&fsm->fsm_sii); |
114 ec_fsm_sii_clear(&fsm->fsm_sii); |
122 } |
115 } |
123 |
116 |
124 /*****************************************************************************/ |
117 /*****************************************************************************/ |
125 |
118 |
|
119 /** Reset state machine. |
|
120 */ |
|
121 void ec_fsm_master_reset( |
|
122 ec_fsm_master_t *fsm /**< Master state machine. */ |
|
123 ) |
|
124 { |
|
125 ec_device_index_t dev_idx; |
|
126 |
|
127 fsm->state = ec_fsm_master_state_start; |
|
128 fsm->idle = 0; |
|
129 fsm->dev_idx = EC_DEVICE_MAIN; |
|
130 |
|
131 for (dev_idx = EC_DEVICE_MAIN; |
|
132 dev_idx < ec_master_num_devices(fsm->master); dev_idx++) { |
|
133 fsm->link_state[dev_idx] = 0; |
|
134 fsm->slaves_responding[dev_idx] = 0; |
|
135 fsm->slave_states[dev_idx] = EC_SLAVE_STATE_UNKNOWN; |
|
136 } |
|
137 |
|
138 fsm->rescan_required = 0; |
|
139 } |
|
140 |
|
141 /*****************************************************************************/ |
|
142 |
126 /** Executes the current state of the state machine. |
143 /** Executes the current state of the state machine. |
127 * |
144 * |
128 * If the state machine's datagram is not sent or received yet, the execution |
145 * If the state machine's datagram is not sent or received yet, the execution |
129 * of the state machine is delayed to the next cycle. |
146 * of the state machine is delayed to the next cycle. |
130 * |
147 * |
178 */ |
196 */ |
179 void ec_fsm_master_state_start( |
197 void ec_fsm_master_state_start( |
180 ec_fsm_master_t *fsm /**< Master state machine. */ |
198 ec_fsm_master_t *fsm /**< Master state machine. */ |
181 ) |
199 ) |
182 { |
200 { |
|
201 ec_master_t *master = fsm->master; |
|
202 |
183 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 |
184 ec_datagram_brd(fsm->datagram, 0x0130, 2); |
242 ec_datagram_brd(fsm->datagram, 0x0130, 2); |
185 ec_datagram_zero(fsm->datagram); |
243 ec_datagram_zero(fsm->datagram); |
|
244 fsm->datagram->device_index = fsm->dev_idx; |
186 fsm->state = ec_fsm_master_state_broadcast; |
245 fsm->state = ec_fsm_master_state_broadcast; |
187 } |
246 } |
188 |
247 |
189 /*****************************************************************************/ |
248 /*****************************************************************************/ |
190 |
249 |
199 ec_datagram_t *datagram = fsm->datagram; |
258 ec_datagram_t *datagram = fsm->datagram; |
200 unsigned int i, size; |
259 unsigned int i, size; |
201 ec_slave_t *slave; |
260 ec_slave_t *slave; |
202 ec_master_t *master = fsm->master; |
261 ec_master_t *master = fsm->master; |
203 |
262 |
204 if (datagram->state == EC_DATAGRAM_TIMED_OUT) |
|
205 return; // always retry |
|
206 |
|
207 // bus topology change? |
263 // bus topology change? |
208 if (datagram->working_counter != fsm->slaves_responding) { |
264 if (datagram->working_counter != fsm->slaves_responding[fsm->dev_idx]) { |
209 fsm->rescan_required = 1; |
265 fsm->rescan_required = 1; |
210 fsm->slaves_responding = datagram->working_counter; |
266 fsm->slaves_responding[fsm->dev_idx] = datagram->working_counter; |
211 EC_MASTER_INFO(master, "%u slave(s) responding.\n", |
267 EC_MASTER_INFO(master, "%u slave(s) responding on %s device.\n", |
212 fsm->slaves_responding); |
268 fsm->slaves_responding[fsm->dev_idx], |
213 } |
269 ec_device_names[fsm->dev_idx != 0]); |
214 |
270 } |
215 if (fsm->link_state && !master->main_device.link_state) { |
271 |
216 // link went down |
272 if (fsm->link_state[fsm->dev_idx] && |
|
273 !master->devices[fsm->dev_idx].link_state) { |
|
274 ec_device_index_t dev_idx; |
|
275 |
217 EC_MASTER_DBG(master, 1, "Master state machine detected " |
276 EC_MASTER_DBG(master, 1, "Master state machine detected " |
218 "link down. Clearing slave list.\n"); |
277 "link down on %s device. Clearing slave list.\n", |
219 |
278 ec_device_names[fsm->dev_idx != 0]); |
|
279 |
|
280 #ifdef EC_EOE |
|
281 ec_master_eoe_stop(master); |
|
282 ec_master_clear_eoe_handlers(master); |
|
283 #endif |
220 ec_master_clear_slaves(master); |
284 ec_master_clear_slaves(master); |
221 fsm->slave_states = 0x00; |
285 |
222 fsm->slaves_responding = 0; /* reset to trigger rescan on next link |
286 for (dev_idx = EC_DEVICE_MAIN; |
223 up. */ |
287 dev_idx < ec_master_num_devices(master); dev_idx++) { |
224 } |
288 fsm->slave_states[dev_idx] = 0x00; |
225 fsm->link_state = master->main_device.link_state; |
289 fsm->slaves_responding[dev_idx] = 0; /* Reset to trigger rescan on |
226 |
290 next link up. */ |
227 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
291 } |
228 ec_fsm_master_restart(fsm); |
292 } |
229 return; |
293 fsm->link_state[fsm->dev_idx] = master->devices[fsm->dev_idx].link_state; |
230 } |
294 |
231 |
295 if (datagram->state == EC_DATAGRAM_RECEIVED && |
232 if (fsm->slaves_responding) { |
296 fsm->slaves_responding[fsm->dev_idx]) { |
233 uint8_t states = EC_READ_U8(datagram->data); |
297 uint8_t states = EC_READ_U8(datagram->data); |
234 if (states != fsm->slave_states) { // slave states changed? |
298 if (states != fsm->slave_states[fsm->dev_idx]) { |
|
299 // slave states changed |
235 char state_str[EC_STATE_STRING_SIZE]; |
300 char state_str[EC_STATE_STRING_SIZE]; |
236 fsm->slave_states = states; |
301 fsm->slave_states[fsm->dev_idx] = states; |
237 ec_state_string(fsm->slave_states, state_str, 1); |
302 ec_state_string(states, state_str, 1); |
238 EC_MASTER_INFO(master, "Slave states: %s.\n", state_str); |
303 EC_MASTER_INFO(master, "Slave states on %s device: %s.\n", |
|
304 ec_device_names[fsm->dev_idx != 0], state_str); |
239 } |
305 } |
240 } else { |
306 } else { |
241 fsm->slave_states = 0x00; |
307 fsm->slave_states[fsm->dev_idx] = 0x00; |
|
308 } |
|
309 |
|
310 fsm->dev_idx++; |
|
311 if (fsm->dev_idx < ec_master_num_devices(master)) { |
|
312 // check number of responding slaves on next device |
|
313 fsm->state = ec_fsm_master_state_start; |
|
314 fsm->state(fsm); // execute immediately |
|
315 return; |
242 } |
316 } |
243 |
317 |
244 if (fsm->rescan_required) { |
318 if (fsm->rescan_required) { |
245 ec_mutex_lock(&master->scan_mutex); |
319 down(&master->scan_sem); |
246 if (!master->allow_scan) { |
320 if (!master->allow_scan) { |
247 ec_mutex_unlock(&master->scan_mutex); |
321 up(&master->scan_sem); |
248 } else { |
322 } else { |
|
323 unsigned int count = 0, next_dev_slave, ring_position; |
|
324 ec_device_index_t dev_idx; |
|
325 |
249 master->scan_busy = 1; |
326 master->scan_busy = 1; |
250 ec_mutex_unlock(&master->scan_mutex); |
327 up(&master->scan_sem); |
251 |
328 |
252 // clear all slaves and scan the bus |
329 // clear all slaves and scan the bus |
253 fsm->rescan_required = 0; |
330 fsm->rescan_required = 0; |
254 fsm->idle = 0; |
331 fsm->idle = 0; |
255 fsm->scan_jiffies = jiffies; |
332 fsm->scan_jiffies = jiffies; |
256 |
333 |
257 #ifdef EC_EOE |
334 #ifdef EC_EOE |
|
335 ec_master_eoe_stop(master); |
258 ec_master_clear_eoe_handlers(master); |
336 ec_master_clear_eoe_handlers(master); |
259 #endif |
337 #endif |
260 ec_master_clear_slaves(master); |
338 ec_master_clear_slaves(master); |
261 |
339 |
262 master->slave_count = fsm->slaves_responding; |
340 for (dev_idx = EC_DEVICE_MAIN; |
263 |
341 dev_idx < ec_master_num_devices(master); dev_idx++) { |
264 if (!master->slave_count) { |
342 count += fsm->slaves_responding[dev_idx]; |
|
343 } |
|
344 |
|
345 if (!count) { |
265 // no slaves present -> finish state machine. |
346 // no slaves present -> finish state machine. |
266 master->scan_busy = 0; |
347 master->scan_busy = 0; |
267 wake_up_interruptible(&master->scan_queue); |
348 wake_up_interruptible(&master->scan_queue); |
268 ec_fsm_master_restart(fsm); |
349 ec_fsm_master_restart(fsm); |
269 return; |
350 return; |
270 } |
351 } |
271 |
352 |
272 size = sizeof(ec_slave_t) * master->slave_count; |
353 size = sizeof(ec_slave_t) * count; |
273 if (!(master->slaves = |
354 if (!(master->slaves = |
274 (ec_slave_t *) kmalloc(size, GFP_KERNEL))) { |
355 (ec_slave_t *) kmalloc(size, GFP_KERNEL))) { |
275 EC_MASTER_ERR(master, "Failed to allocate %u bytes" |
356 EC_MASTER_ERR(master, "Failed to allocate %u bytes" |
276 " of slave memory!\n", size); |
357 " of slave memory!\n", size); |
277 master->slave_count = 0; // TODO avoid retrying scan! |
|
278 master->scan_busy = 0; |
358 master->scan_busy = 0; |
279 wake_up_interruptible(&master->scan_queue); |
359 wake_up_interruptible(&master->scan_queue); |
280 ec_fsm_master_restart(fsm); |
360 ec_fsm_master_restart(fsm); |
281 return; |
361 return; |
282 } |
362 } |
283 |
363 |
284 // init slaves |
364 // init slaves |
285 for (i = 0; i < master->slave_count; i++) { |
365 dev_idx = EC_DEVICE_MAIN; |
|
366 next_dev_slave = fsm->slaves_responding[dev_idx]; |
|
367 ring_position = 0; |
|
368 for (i = 0; i < count; i++, ring_position++) { |
286 slave = master->slaves + i; |
369 slave = master->slaves + i; |
287 ec_slave_init(slave, master, i, i + 1); |
370 while (i >= next_dev_slave) { |
|
371 dev_idx++; |
|
372 next_dev_slave += fsm->slaves_responding[dev_idx]; |
|
373 ring_position = 0; |
|
374 } |
|
375 |
|
376 ec_slave_init(slave, master, dev_idx, ring_position, i + 1); |
288 |
377 |
289 // do not force reconfiguration in operation phase to avoid |
378 // do not force reconfiguration in operation phase to avoid |
290 // unnecesssary process data interruptions |
379 // unnecesssary process data interruptions |
291 if (master->phase != EC_OPERATION) |
380 if (master->phase != EC_OPERATION) { |
292 slave->force_config = 1; |
381 slave->force_config = 1; |
|
382 } |
293 } |
383 } |
294 |
384 master->slave_count = count; |
295 // broadcast clear all station addresses |
385 master->fsm_slave = master->slaves; |
296 ec_datagram_bwr(datagram, 0x0010, 2); |
386 |
297 EC_WRITE_U16(datagram->data, 0x0000); |
387 /* start with first device with slaves responding; at least one |
298 fsm->retries = EC_FSM_RETRIES; |
388 * has responding slaves, otherwise count would be zero. */ |
299 fsm->state = ec_fsm_master_state_clear_addresses; |
389 fsm->dev_idx = EC_DEVICE_MAIN; |
|
390 while (!fsm->slaves_responding[fsm->dev_idx]) { |
|
391 fsm->dev_idx++; |
|
392 } |
|
393 |
|
394 ec_fsm_master_enter_clear_addresses(fsm); |
300 return; |
395 return; |
301 } |
396 } |
302 } |
397 } |
303 |
398 |
304 if (master->slave_count) { |
399 if (master->slave_count) { |
364 return 0; |
460 return 0; |
365 } |
461 } |
366 |
462 |
367 /*****************************************************************************/ |
463 /*****************************************************************************/ |
368 |
464 |
369 /** Check for pending register requests and process one. |
|
370 * |
|
371 * \return non-zero, if a register request is processed. |
|
372 */ |
|
373 int ec_fsm_master_action_process_register( |
|
374 ec_fsm_master_t *fsm /**< Master state machine. */ |
|
375 ) |
|
376 { |
|
377 ec_master_t *master = fsm->master; |
|
378 ec_reg_request_t *request; |
|
379 |
|
380 // search the first request to be processed |
|
381 while (!list_empty(&master->reg_requests)) { |
|
382 |
|
383 // get first request |
|
384 request = list_entry(master->reg_requests.next, |
|
385 ec_reg_request_t, list); |
|
386 list_del_init(&request->list); // dequeue |
|
387 request->state = EC_INT_REQUEST_BUSY; |
|
388 |
|
389 // found pending request; process it! |
|
390 EC_SLAVE_DBG(request->slave, 1, "Processing register request, " |
|
391 "offset 0x%04x, length %zu...\n", |
|
392 request->offset, request->length); |
|
393 |
|
394 if (request->length > fsm->datagram->mem_size) { |
|
395 EC_MASTER_ERR(master, "Request length (%zu) exceeds maximum " |
|
396 "datagram size (%zu)!\n", request->length, |
|
397 fsm->datagram->mem_size); |
|
398 request->state = EC_INT_REQUEST_FAILURE; |
|
399 kref_put(&request->refcount, ec_master_reg_request_release); |
|
400 wake_up(&master->reg_queue); |
|
401 continue; |
|
402 } |
|
403 |
|
404 fsm->reg_request = request; |
|
405 |
|
406 if (request->dir == EC_DIR_INPUT) { |
|
407 ec_datagram_fprd(fsm->datagram, request->slave->station_address, |
|
408 request->offset, request->length); |
|
409 ec_datagram_zero(fsm->datagram); |
|
410 } else { |
|
411 ec_datagram_fpwr(fsm->datagram, request->slave->station_address, |
|
412 request->offset, request->length); |
|
413 memcpy(fsm->datagram->data, request->data, request->length); |
|
414 } |
|
415 fsm->retries = EC_FSM_RETRIES; |
|
416 fsm->state = ec_fsm_master_state_reg_request; |
|
417 return 1; |
|
418 } |
|
419 |
|
420 return 0; |
|
421 } |
|
422 |
|
423 /*****************************************************************************/ |
|
424 |
|
425 /** Check for pending SDO requests and process one. |
465 /** Check for pending SDO requests and process one. |
426 * |
466 * |
427 * \return non-zero, if an SDO request is processed. |
467 * \return non-zero, if an SDO request is processed. |
428 */ |
468 */ |
429 int ec_fsm_master_action_process_sdo( |
469 int ec_fsm_master_action_process_sdo( |
692 ec_fsm_master_action_configure(fsm); |
737 ec_fsm_master_action_configure(fsm); |
693 } |
738 } |
694 |
739 |
695 /*****************************************************************************/ |
740 /*****************************************************************************/ |
696 |
741 |
|
742 /** Start clearing slave addresses. |
|
743 */ |
|
744 void ec_fsm_master_enter_clear_addresses( |
|
745 ec_fsm_master_t *fsm /**< Master state machine. */ |
|
746 ) |
|
747 { |
|
748 // broadcast clear all station addresses |
|
749 ec_datagram_bwr(fsm->datagram, 0x0010, 2); |
|
750 EC_WRITE_U16(fsm->datagram->data, 0x0000); |
|
751 fsm->datagram->device_index = fsm->dev_idx; |
|
752 fsm->retries = EC_FSM_RETRIES; |
|
753 fsm->state = ec_fsm_master_state_clear_addresses; |
|
754 } |
|
755 |
|
756 /*****************************************************************************/ |
|
757 |
697 /** Master state: CLEAR ADDRESSES. |
758 /** Master state: CLEAR ADDRESSES. |
698 */ |
759 */ |
699 void ec_fsm_master_state_clear_addresses( |
760 void ec_fsm_master_state_clear_addresses( |
700 ec_fsm_master_t *fsm /**< Master state machine. */ |
761 ec_fsm_master_t *fsm /**< Master state machine. */ |
701 ) |
762 ) |
702 { |
763 { |
703 ec_master_t *master = fsm->master; |
764 ec_master_t *master = fsm->master; |
704 ec_datagram_t *datagram = fsm->datagram; |
765 ec_datagram_t *datagram = fsm->datagram; |
705 |
766 |
706 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
767 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
707 return; |
768 return; |
|
769 } |
708 |
770 |
709 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
771 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
710 EC_MASTER_ERR(master, "Failed to receive address" |
772 EC_MASTER_ERR(master, "Failed to receive address" |
711 " clearing datagram: "); |
773 " clearing datagram on %s link: ", |
|
774 ec_device_names[fsm->dev_idx != 0]); |
712 ec_datagram_print_state(datagram); |
775 ec_datagram_print_state(datagram); |
713 master->scan_busy = 0; |
776 master->scan_busy = 0; |
714 wake_up_interruptible(&master->scan_queue); |
777 wake_up_interruptible(&master->scan_queue); |
715 ec_fsm_master_restart(fsm); |
778 ec_fsm_master_restart(fsm); |
716 return; |
779 return; |
717 } |
780 } |
718 |
781 |
719 if (datagram->working_counter != master->slave_count) { |
782 if (datagram->working_counter != fsm->slaves_responding[fsm->dev_idx]) { |
720 EC_MASTER_WARN(master, "Failed to clear all station addresses:" |
783 EC_MASTER_WARN(master, "Failed to clear station addresses on %s link:" |
721 " Cleared %u of %u", |
784 " Cleared %u of %u", |
722 datagram->working_counter, master->slave_count); |
785 ec_device_names[fsm->dev_idx != 0], datagram->working_counter, |
|
786 fsm->slaves_responding[fsm->dev_idx]); |
723 } |
787 } |
724 |
788 |
725 EC_MASTER_DBG(master, 1, "Sending broadcast-write" |
789 EC_MASTER_DBG(master, 1, "Sending broadcast-write" |
726 " to measure transmission delays.\n"); |
790 " to measure transmission delays on %s link.\n", |
|
791 ec_device_names[fsm->dev_idx != 0]); |
727 |
792 |
728 ec_datagram_bwr(datagram, 0x0900, 1); |
793 ec_datagram_bwr(datagram, 0x0900, 1); |
729 ec_datagram_zero(datagram); |
794 ec_datagram_zero(datagram); |
|
795 fsm->datagram->device_index = fsm->dev_idx; |
730 fsm->retries = EC_FSM_RETRIES; |
796 fsm->retries = EC_FSM_RETRIES; |
731 fsm->state = ec_fsm_master_state_dc_measure_delays; |
797 fsm->state = ec_fsm_master_state_dc_measure_delays; |
732 } |
798 } |
733 |
799 |
734 /*****************************************************************************/ |
800 /*****************************************************************************/ |
740 ) |
806 ) |
741 { |
807 { |
742 ec_master_t *master = fsm->master; |
808 ec_master_t *master = fsm->master; |
743 ec_datagram_t *datagram = fsm->datagram; |
809 ec_datagram_t *datagram = fsm->datagram; |
744 |
810 |
745 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
811 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) { |
746 return; |
812 return; |
|
813 } |
747 |
814 |
748 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
815 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
749 EC_MASTER_ERR(master, "Failed to receive delay measuring datagram: "); |
816 EC_MASTER_ERR(master, "Failed to receive delay measuring datagram" |
|
817 " on %s link: ", ec_device_names[fsm->dev_idx != 0]); |
750 ec_datagram_print_state(datagram); |
818 ec_datagram_print_state(datagram); |
751 master->scan_busy = 0; |
819 master->scan_busy = 0; |
752 wake_up_interruptible(&master->scan_queue); |
820 wake_up_interruptible(&master->scan_queue); |
753 ec_fsm_master_restart(fsm); |
821 ec_fsm_master_restart(fsm); |
754 return; |
822 return; |
755 } |
823 } |
756 |
824 |
757 EC_MASTER_DBG(master, 1, "%u slaves responded to delay measuring.\n", |
825 EC_MASTER_DBG(master, 1, "%u slaves responded to delay measuring" |
758 datagram->working_counter); |
826 " on %s link.\n", |
|
827 datagram->working_counter, ec_device_names[fsm->dev_idx != 0]); |
|
828 |
|
829 do { |
|
830 fsm->dev_idx++; |
|
831 } while (fsm->dev_idx < ec_master_num_devices(master) && |
|
832 !fsm->slaves_responding[fsm->dev_idx]); |
|
833 if (fsm->dev_idx < ec_master_num_devices(master)) { |
|
834 ec_fsm_master_enter_clear_addresses(fsm); |
|
835 return; |
|
836 } |
759 |
837 |
760 EC_MASTER_INFO(master, "Scanning bus.\n"); |
838 EC_MASTER_INFO(master, "Scanning bus.\n"); |
761 |
839 |
762 // begin scanning of slaves |
840 // begin scanning of slaves |
763 fsm->slave = master->slaves; |
841 fsm->slave = master->slaves; |
|
842 EC_MASTER_DBG(master, 1, "Scanning slave %u on %s link.\n", |
|
843 fsm->slave->ring_position, |
|
844 ec_device_names[fsm->slave->device_index != 0]); |
764 fsm->state = ec_fsm_master_state_scan_slave; |
845 fsm->state = ec_fsm_master_state_scan_slave; |
765 ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave); |
846 ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave); |
766 ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately |
847 ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately |
|
848 fsm->datagram->device_index = fsm->slave->device_index; |
767 } |
849 } |
768 |
850 |
769 /*****************************************************************************/ |
851 /*****************************************************************************/ |
770 |
852 |
771 /** Master state: SCAN SLAVE. |
853 /** Master state: SCAN SLAVE. |
863 void ec_fsm_master_enter_write_system_times( |
957 void ec_fsm_master_enter_write_system_times( |
864 ec_fsm_master_t *fsm /**< Master state machine. */ |
958 ec_fsm_master_t *fsm /**< Master state machine. */ |
865 ) |
959 ) |
866 { |
960 { |
867 ec_master_t *master = fsm->master; |
961 ec_master_t *master = fsm->master; |
868 |
|
869 EC_MASTER_DBG(master, 1, "Writing system time offsets...\n"); |
|
870 |
962 |
871 if (master->has_app_time) { |
963 if (master->has_app_time) { |
872 |
964 |
873 while (fsm->slave < master->slaves + master->slave_count) { |
965 while (fsm->slave < master->slaves + master->slave_count) { |
874 if (!fsm->slave->base_dc_supported |
966 if (!fsm->slave->base_dc_supported |
875 || !fsm->slave->has_dc_system_time) { |
967 || !fsm->slave->has_dc_system_time) { |
876 fsm->slave++; |
968 fsm->slave++; |
877 continue; |
969 continue; |
878 } |
970 } |
879 |
971 |
|
972 EC_SLAVE_DBG(fsm->slave, 1, "Checking system time offset.\n"); |
|
973 |
880 // read DC system time (0x0910, 64 bit) |
974 // read DC system time (0x0910, 64 bit) |
881 // gap (64 bit) |
975 // gap (64 bit) |
882 // and time offset (0x0920, 64 bit) |
976 // and time offset (0x0920, 64 bit) |
883 ec_datagram_fprd(fsm->datagram, fsm->slave->station_address, |
977 ec_datagram_fprd(fsm->datagram, fsm->slave->station_address, |
884 0x0910, 24); |
978 0x0910, 24); |
|
979 fsm->datagram->device_index = fsm->slave->device_index; |
885 fsm->retries = EC_FSM_RETRIES; |
980 fsm->retries = EC_FSM_RETRIES; |
886 fsm->state = ec_fsm_master_state_dc_read_offset; |
981 fsm->state = ec_fsm_master_state_dc_read_offset; |
887 return; |
982 return; |
888 } |
983 } |
889 |
984 |
890 } else { |
985 } else { |
891 if (master->active) { |
986 if (master->active) { |
892 EC_MASTER_ERR(master, "No app_time received up to now," |
987 EC_MASTER_WARN(master, "No app_time received up to now," |
893 " but master already active.\n"); |
988 " but master already active.\n"); |
894 } else { |
989 } else { |
895 EC_MASTER_DBG(master, 1, "No app_time received up to now.\n"); |
990 EC_MASTER_DBG(master, 1, "No app_time received up to now.\n"); |
896 } |
991 } |
897 } |
992 } |
902 } |
997 } |
903 |
998 |
904 /*****************************************************************************/ |
999 /*****************************************************************************/ |
905 |
1000 |
906 /** Configure 32 bit time offset. |
1001 /** Configure 32 bit time offset. |
|
1002 * |
|
1003 * \return New offset. |
907 */ |
1004 */ |
908 u64 ec_fsm_master_dc_offset32( |
1005 u64 ec_fsm_master_dc_offset32( |
909 ec_fsm_master_t *fsm, /**< Master state machine. */ |
1006 ec_fsm_master_t *fsm, /**< Master state machine. */ |
910 u64 system_time, /**< System time register. */ |
1007 u64 system_time, /**< System time register. */ |
911 u64 old_offset, /**< Time offset register. */ |
1008 u64 old_offset, /**< Time offset register. */ |
912 u64 correction /**< Correction. */ |
1009 unsigned long jiffies_since_read /**< Jiffies for correction. */ |
913 ) |
1010 ) |
914 { |
1011 { |
915 ec_slave_t *slave = fsm->slave; |
1012 ec_slave_t *slave = fsm->slave; |
916 u32 correction32, system_time32, old_offset32, new_offset; |
1013 u32 correction, system_time32, old_offset32, new_offset; |
917 s32 time_diff; |
1014 s32 time_diff; |
918 |
1015 |
919 system_time32 = (u32) system_time; |
1016 system_time32 = (u32) system_time; |
920 // correct read system time by elapsed time between read operation |
1017 old_offset32 = (u32) old_offset; |
921 // and app_time set time |
1018 |
922 correction32 = (u32)correction; |
1019 // correct read system time by elapsed time since read operation |
923 system_time32 -= correction32; |
1020 correction = jiffies_since_read * 1000 / HZ * 1000000; |
924 old_offset32 = (u32) old_offset; |
1021 system_time32 += correction; |
925 |
1022 time_diff = (u32) slave->master->app_time - system_time32; |
926 time_diff = (u32) slave->master->app_start_time - system_time32; |
1023 |
927 |
1024 EC_SLAVE_DBG(slave, 1, "DC 32 bit system time offset calculation:" |
928 EC_SLAVE_DBG(slave, 1, "DC system time offset calculation:" |
|
929 " system_time=%u (corrected with %u)," |
1025 " system_time=%u (corrected with %u)," |
930 " app_start_time=%llu, diff=%i\n", |
1026 " app_time=%llu, diff=%i\n", |
931 system_time32, correction32, |
1027 system_time32, correction, |
932 slave->master->app_start_time, time_diff); |
1028 slave->master->app_time, time_diff); |
933 |
1029 |
934 if (EC_ABS(time_diff) > EC_SYSTEM_TIME_TOLERANCE_NS) { |
1030 if (EC_ABS(time_diff) > EC_SYSTEM_TIME_TOLERANCE_NS) { |
935 new_offset = time_diff + old_offset32; |
1031 new_offset = time_diff + old_offset32; |
936 EC_SLAVE_DBG(slave, 1, "Setting time offset to %u (was %u)\n", |
1032 EC_SLAVE_DBG(slave, 1, "Setting time offset to %u (was %u)\n", |
937 new_offset, old_offset32); |
1033 new_offset, old_offset32); |
943 } |
1039 } |
944 |
1040 |
945 /*****************************************************************************/ |
1041 /*****************************************************************************/ |
946 |
1042 |
947 /** Configure 64 bit time offset. |
1043 /** Configure 64 bit time offset. |
|
1044 * |
|
1045 * \return New offset. |
948 */ |
1046 */ |
949 u64 ec_fsm_master_dc_offset64( |
1047 u64 ec_fsm_master_dc_offset64( |
950 ec_fsm_master_t *fsm, /**< Master state machine. */ |
1048 ec_fsm_master_t *fsm, /**< Master state machine. */ |
951 u64 system_time, /**< System time register. */ |
1049 u64 system_time, /**< System time register. */ |
952 u64 old_offset, /**< Time offset register. */ |
1050 u64 old_offset, /**< Time offset register. */ |
953 u64 correction /**< Correction. */ |
1051 unsigned long jiffies_since_read /**< Jiffies for correction. */ |
954 ) |
1052 ) |
955 { |
1053 { |
956 ec_slave_t *slave = fsm->slave; |
1054 ec_slave_t *slave = fsm->slave; |
957 u64 new_offset; |
1055 u64 new_offset, correction; |
958 s64 time_diff; |
1056 s64 time_diff; |
959 |
1057 |
960 // correct read system time by elapsed time between read operation |
1058 // correct read system time by elapsed time since read operation |
961 // and app_time set time |
1059 correction = (u64) (jiffies_since_read * 1000 / HZ) * 1000000; |
962 system_time -= correction; |
1060 system_time += correction; |
963 time_diff = fsm->slave->master->app_start_time - system_time; |
1061 time_diff = fsm->slave->master->app_time - system_time; |
964 |
1062 |
965 EC_SLAVE_DBG(slave, 1, "DC system time offset calculation:" |
1063 EC_SLAVE_DBG(slave, 1, "DC 64 bit system time offset calculation:" |
966 " system_time=%llu (corrected with %llu)," |
1064 " system_time=%llu (corrected with %llu)," |
967 " app_start_time=%llu, diff=%lli\n", |
1065 " app_time=%llu, diff=%lli\n", |
968 system_time, correction, |
1066 system_time, correction, |
969 slave->master->app_start_time, time_diff); |
1067 slave->master->app_time, time_diff); |
970 |
1068 |
971 if (EC_ABS(time_diff) > EC_SYSTEM_TIME_TOLERANCE_NS) { |
1069 if (EC_ABS(time_diff) > EC_SYSTEM_TIME_TOLERANCE_NS) { |
972 new_offset = time_diff + old_offset; |
1070 new_offset = time_diff + old_offset; |
973 EC_SLAVE_DBG(slave, 1, "Setting time offset to %llu (was %llu)\n", |
1071 EC_SLAVE_DBG(slave, 1, "Setting time offset to %llu (was %llu)\n", |
974 new_offset, old_offset); |
1072 new_offset, old_offset); |
1011 return; |
1110 return; |
1012 } |
1111 } |
1013 |
1112 |
1014 system_time = EC_READ_U64(datagram->data); // 0x0910 |
1113 system_time = EC_READ_U64(datagram->data); // 0x0910 |
1015 old_offset = EC_READ_U64(datagram->data + 16); // 0x0920 |
1114 old_offset = EC_READ_U64(datagram->data + 16); // 0x0920 |
1016 /* correct read system time by elapsed time since read operation |
1115 jiffies_since_read = jiffies - datagram->jiffies_sent; |
1017 and the app_time set time */ |
|
1018 #ifdef EC_HAVE_CYCLES |
|
1019 correction = |
|
1020 (datagram->cycles_sent - slave->master->dc_cycles_app_start_time) |
|
1021 * 1000000LL; |
|
1022 do_div(correction, cpu_khz); |
|
1023 #else |
|
1024 correction = |
|
1025 (u64) ((datagram->jiffies_sent-slave->master->dc_jiffies_app_start_time) * 1000 / HZ) |
|
1026 * 1000000; |
|
1027 #endif |
|
1028 |
1116 |
1029 if (slave->base_dc_range == EC_DC_32) { |
1117 if (slave->base_dc_range == EC_DC_32) { |
1030 new_offset = ec_fsm_master_dc_offset32(fsm, |
1118 new_offset = ec_fsm_master_dc_offset32(fsm, |
1031 system_time, old_offset, correction); |
1119 system_time, old_offset, jiffies_since_read); |
1032 } else { |
1120 } else { |
1033 new_offset = ec_fsm_master_dc_offset64(fsm, |
1121 new_offset = ec_fsm_master_dc_offset64(fsm, |
1034 system_time, old_offset, correction); |
1122 system_time, old_offset, jiffies_since_read); |
1035 } |
1123 } |
1036 |
1124 |
1037 // set DC system time offset and transmission delay |
1125 // set DC system time offset and transmission delay |
1038 ec_datagram_fpwr(datagram, slave->station_address, 0x0920, 12); |
1126 ec_datagram_fpwr(datagram, slave->station_address, 0x0920, 12); |
1039 EC_WRITE_U64(datagram->data, new_offset); |
1127 EC_WRITE_U64(datagram->data, new_offset); |
1040 EC_WRITE_U32(datagram->data + 8, slave->transmission_delay); |
1128 EC_WRITE_U32(datagram->data + 8, slave->transmission_delay); |
|
1129 fsm->datagram->device_index = slave->device_index; |
1041 fsm->retries = EC_FSM_RETRIES; |
1130 fsm->retries = EC_FSM_RETRIES; |
1042 fsm->state = ec_fsm_master_state_dc_write_offset; |
1131 fsm->state = ec_fsm_master_state_dc_write_offset; |
1043 } |
1132 } |
1044 |
1133 |
1045 /*****************************************************************************/ |
1134 /*****************************************************************************/ |
1174 ec_fsm_master_t *fsm /**< Master state machine. */ |
1263 ec_fsm_master_t *fsm /**< Master state machine. */ |
1175 ) |
1264 ) |
1176 { |
1265 { |
1177 ec_sdo_request_t *request = fsm->sdo_request; |
1266 ec_sdo_request_t *request = fsm->sdo_request; |
1178 |
1267 |
1179 if (ec_fsm_coe_exec(&fsm->fsm_coe)) return; |
1268 if (!request) { |
|
1269 // configuration was cleared in the meantime |
|
1270 ec_fsm_master_restart(fsm); |
|
1271 return; |
|
1272 } |
|
1273 |
|
1274 if (ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram)) { |
|
1275 return; |
|
1276 } |
1180 |
1277 |
1181 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
1278 if (!ec_fsm_coe_success(&fsm->fsm_coe)) { |
1182 EC_SLAVE_DBG(fsm->slave, 1, |
1279 EC_SLAVE_DBG(fsm->slave, 1, |
1183 "Failed to process internal SDO request.\n"); |
1280 "Failed to process internal SDO request.\n"); |
1184 request->state = EC_INT_REQUEST_FAILURE; |
1281 request->state = EC_INT_REQUEST_FAILURE; |
1185 wake_up(&fsm->slave->sdo_queue); |
1282 wake_up_all(&fsm->master->request_queue); |
1186 ec_fsm_master_restart(fsm); |
1283 ec_fsm_master_restart(fsm); |
1187 return; |
1284 return; |
1188 } |
1285 } |
1189 |
1286 |
1190 // SDO request finished |
1287 // SDO request finished |
1191 request->state = EC_INT_REQUEST_SUCCESS; |
1288 request->state = EC_INT_REQUEST_SUCCESS; |
1192 wake_up(&fsm->slave->sdo_queue); |
1289 wake_up_all(&fsm->master->request_queue); |
1193 |
1290 |
1194 EC_SLAVE_DBG(fsm->slave, 1, "Finished internal SDO request.\n"); |
1291 EC_SLAVE_DBG(fsm->slave, 1, "Finished internal SDO request.\n"); |
1195 |
1292 |
1196 // check for another SDO request |
1293 // check for another SDO request |
1197 if (ec_fsm_master_action_process_sdo(fsm)) |
1294 if (ec_fsm_master_action_process_sdo(fsm)) { |
1198 return; // processing another request |
1295 return; // processing another request |
|
1296 } |
1199 |
1297 |
1200 ec_fsm_master_restart(fsm); |
1298 ec_fsm_master_restart(fsm); |
1201 } |
1299 } |
1202 |
1300 |
1203 /*****************************************************************************/ |
1301 /*****************************************************************************/ |
1204 |
|
1205 /** Master state: REG REQUEST. |
|
1206 */ |
|
1207 void ec_fsm_master_state_reg_request( |
|
1208 ec_fsm_master_t *fsm /**< Master state machine. */ |
|
1209 ) |
|
1210 { |
|
1211 ec_master_t *master = fsm->master; |
|
1212 ec_datagram_t *datagram = fsm->datagram; |
|
1213 ec_reg_request_t *request = fsm->reg_request; |
|
1214 |
|
1215 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
|
1216 EC_MASTER_ERR(master, "Failed to receive register" |
|
1217 " request datagram: "); |
|
1218 ec_datagram_print_state(datagram); |
|
1219 request->state = EC_INT_REQUEST_FAILURE; |
|
1220 kref_put(&request->refcount, ec_master_reg_request_release); |
|
1221 wake_up(&master->reg_queue); |
|
1222 ec_fsm_master_restart(fsm); |
|
1223 return; |
|
1224 } |
|
1225 |
|
1226 if (datagram->working_counter == 1) { |
|
1227 if (request->dir == EC_DIR_INPUT) { // read request |
|
1228 if (request->data) |
|
1229 kfree(request->data); |
|
1230 request->data = kmalloc(request->length, GFP_KERNEL); |
|
1231 if (!request->data) { |
|
1232 EC_MASTER_ERR(master, "Failed to allocate %zu bytes" |
|
1233 " of memory for register data.\n", request->length); |
|
1234 request->state = EC_INT_REQUEST_FAILURE; |
|
1235 kref_put(&request->refcount, ec_master_reg_request_release); |
|
1236 wake_up(&master->reg_queue); |
|
1237 ec_fsm_master_restart(fsm); |
|
1238 return; |
|
1239 } |
|
1240 memcpy(request->data, datagram->data, request->length); |
|
1241 } |
|
1242 |
|
1243 request->state = EC_INT_REQUEST_SUCCESS; |
|
1244 EC_SLAVE_DBG(request->slave, 1, "Register request successful.\n"); |
|
1245 } else { |
|
1246 request->state = EC_INT_REQUEST_FAILURE; |
|
1247 EC_MASTER_ERR(master, "Register request failed.\n"); |
|
1248 } |
|
1249 |
|
1250 kref_put(&request->refcount, ec_master_reg_request_release); |
|
1251 wake_up(&master->reg_queue); |
|
1252 |
|
1253 // check for another register request |
|
1254 if (ec_fsm_master_action_process_register(fsm)) |
|
1255 return; // processing another request |
|
1256 |
|
1257 ec_fsm_master_restart(fsm); |
|
1258 } |
|
1259 |
|
1260 /*****************************************************************************/ |
|
1261 |
|
1262 /** called by kref_put if the SII write request's refcount becomes zero. |
|
1263 * |
|
1264 */ |
|
1265 void ec_master_sii_write_request_release(struct kref *ref) |
|
1266 { |
|
1267 ec_sii_write_request_t *request = container_of(ref, ec_sii_write_request_t, refcount); |
|
1268 if (request->slave) |
|
1269 EC_SLAVE_DBG(request->slave, 1, "Releasing SII write request %p.\n", |
|
1270 request); |
|
1271 kfree(request->words); |
|
1272 kfree(request); |
|
1273 } |
|
1274 |
|
1275 /*****************************************************************************/ |
|
1276 |
|
1277 /** called by kref_put if the reg request's refcount becomes zero. |
|
1278 * |
|
1279 */ |
|
1280 void ec_master_reg_request_release(struct kref *ref) |
|
1281 { |
|
1282 ec_reg_request_t *request = container_of(ref, ec_reg_request_t, refcount); |
|
1283 if (request->slave) |
|
1284 EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n", |
|
1285 request); |
|
1286 if (request->data) |
|
1287 kfree(request->data); |
|
1288 kfree(request); |
|
1289 } |
|
1290 |
|
1291 /*****************************************************************************/ |
|
1292 |
|
1293 /** called by kref_put if the SDO request's refcount becomes zero. |
|
1294 * |
|
1295 */ |
|
1296 void ec_master_sdo_request_release(struct kref *ref) |
|
1297 { |
|
1298 ec_master_sdo_request_t *request = container_of(ref, ec_master_sdo_request_t, refcount); |
|
1299 if (request->slave) |
|
1300 EC_SLAVE_DBG(request->slave, 1, "Releasing SDO request %p.\n", |
|
1301 request); |
|
1302 ec_sdo_request_clear(&request->req); |
|
1303 kfree(request); |
|
1304 } |
|
1305 |
|
1306 /*****************************************************************************/ |
|
1307 |
|
1308 /** called by kref_put if the FoE request's refcount becomes zero. |
|
1309 * |
|
1310 */ |
|
1311 void ec_master_foe_request_release(struct kref *ref) |
|
1312 { |
|
1313 ec_master_foe_request_t *request = container_of(ref, ec_master_foe_request_t, refcount); |
|
1314 if (request->slave) |
|
1315 EC_SLAVE_DBG(request->slave, 1, "Releasing FoE request %p.\n", |
|
1316 request); |
|
1317 ec_foe_request_clear(&request->req); |
|
1318 kfree(request); |
|
1319 } |
|
1320 |
|
1321 /*****************************************************************************/ |
|
1322 |
|
1323 /** called by kref_put if the SoE request's refcount becomes zero. |
|
1324 * |
|
1325 */ |
|
1326 void ec_master_soe_request_release(struct kref *ref) |
|
1327 { |
|
1328 ec_master_soe_request_t *request = container_of(ref, ec_master_soe_request_t, refcount); |
|
1329 if (request->slave) |
|
1330 EC_SLAVE_DBG(request->slave, 1, "Releasing SoE request %p.\n", |
|
1331 request); |
|
1332 ec_soe_request_clear(&request->req); |
|
1333 kfree(request); |
|
1334 } |
|