master/master.c
changeset 646 fbbd4e54e031
parent 643 78929d878b2c
child 647 dc556a8c8fed
equal deleted inserted replaced
645:473ec2246ec1 646:fbbd4e54e031
   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)