equal
deleted
inserted
replaced
155 |
155 |
156 INIT_LIST_HEAD(&master->eeprom_requests); |
156 INIT_LIST_HEAD(&master->eeprom_requests); |
157 init_MUTEX(&master->eeprom_sem); |
157 init_MUTEX(&master->eeprom_sem); |
158 init_waitqueue_head(&master->eeprom_queue); |
158 init_waitqueue_head(&master->eeprom_queue); |
159 |
159 |
160 master->sdo_request = NULL; |
160 INIT_LIST_HEAD(&master->sdo_requests); |
161 master->sdo_seq_user = 0; |
|
162 master->sdo_seq_master = 0; |
|
163 init_MUTEX(&master->sdo_sem); |
161 init_MUTEX(&master->sdo_sem); |
164 init_timer(&master->sdo_timer); |
162 init_waitqueue_head(&master->sdo_queue); |
165 master->sdo_timer.function = ec_master_check_sdo; |
|
166 master->sdo_timer.data = (unsigned long) master; |
|
167 init_completion(&master->sdo_complete); |
|
168 |
163 |
169 // init devices |
164 // init devices |
170 if (ec_device_init(&master->main_device, master)) |
165 if (ec_device_init(&master->main_device, master)) |
171 goto out_return; |
166 goto out_return; |
172 |
167 |
299 } |
294 } |
300 |
295 |
301 /*****************************************************************************/ |
296 /*****************************************************************************/ |
302 |
297 |
303 /** |
298 /** |
304 Flushes the SDO request queue. |
|
305 */ |
|
306 |
|
307 void ec_master_flush_sdo_requests(ec_master_t *master) |
|
308 { |
|
309 del_timer_sync(&master->sdo_timer); |
|
310 complete(&master->sdo_complete); |
|
311 master->sdo_request = NULL; |
|
312 master->sdo_seq_user = 0; |
|
313 master->sdo_seq_master = 0; |
|
314 } |
|
315 |
|
316 /*****************************************************************************/ |
|
317 |
|
318 /** |
|
319 Internal locking callback. |
299 Internal locking callback. |
320 */ |
300 */ |
321 |
301 |
322 int ec_master_request_cb(void *master /**< callback data */) |
302 int ec_master_request_cb(void *master /**< callback data */) |
323 { |
303 { |
414 { |
394 { |
415 master->mode = EC_MASTER_MODE_ORPHANED; |
395 master->mode = EC_MASTER_MODE_ORPHANED; |
416 |
396 |
417 ec_master_eoe_stop(master); |
397 ec_master_eoe_stop(master); |
418 ec_master_thread_stop(master); |
398 ec_master_thread_stop(master); |
419 ec_master_flush_sdo_requests(master); |
|
420 ec_master_destroy_slaves(master); |
399 ec_master_destroy_slaves(master); |
421 } |
400 } |
422 |
401 |
423 /*****************************************************************************/ |
402 /*****************************************************************************/ |
424 |
403 |
1236 } |
1215 } |
1237 |
1216 |
1238 /*****************************************************************************/ |
1217 /*****************************************************************************/ |
1239 |
1218 |
1240 /** |
1219 /** |
1241 */ |
|
1242 |
|
1243 void ec_master_check_sdo(unsigned long data /**< master pointer */) |
|
1244 { |
|
1245 ec_master_t *master = (ec_master_t *) data; |
|
1246 |
|
1247 if (master->sdo_seq_master != master->sdo_seq_user) { |
|
1248 master->sdo_timer.expires = jiffies + 10; |
|
1249 add_timer(&master->sdo_timer); |
|
1250 return; |
|
1251 } |
|
1252 |
|
1253 // master has processed the request |
|
1254 complete(&master->sdo_complete); |
|
1255 } |
|
1256 |
|
1257 /*****************************************************************************/ |
|
1258 |
|
1259 /** |
|
1260 Measures the time, a frame is on the bus. |
1220 Measures the time, a frame is on the bus. |
1261 \return 0 in case of success, else < 0 |
1221 \return 0 in case of success, else < 0 |
1262 */ |
1222 */ |
1263 |
1223 |
1264 int ec_master_measure_bus_time(ec_master_t *master) |
1224 int ec_master_measure_bus_time(ec_master_t *master) |