master/module.c
changeset 378 8fe6cd43787a
parent 377 ecac8252f114
child 381 006d3653701d
equal deleted inserted replaced
377:ecac8252f114 378:8fe6cd43787a
   407 
   407 
   408     EC_INFO("Requesting master %i...\n", master_index);
   408     EC_INFO("Requesting master %i...\n", master_index);
   409 
   409 
   410     if (!(master = ec_find_master(master_index))) goto out_return;
   410     if (!(master = ec_find_master(master_index))) goto out_return;
   411 
   411 
   412     if (master->reserved) {
   412     if (!atomic_dec_and_test(&master->available)) {
       
   413         atomic_inc(&master->available);
   413         EC_ERR("Master %i is already in use!\n", master_index);
   414         EC_ERR("Master %i is already in use!\n", master_index);
   414         goto out_return;
   415         goto out_return;
   415     }
   416     }
   416     master->reserved = 1;
       
   417 
   417 
   418     if (!master->device) {
   418     if (!master->device) {
   419         EC_ERR("Master %i has no assigned device!\n", master_index);
   419         EC_ERR("Master %i has no assigned device!\n", master_index);
   420         goto out_release;
   420         goto out_release;
   421     }
   421     }
   450     ec_master_reset(master);
   450     ec_master_reset(master);
   451     ec_master_idle_start(master);
   451     ec_master_idle_start(master);
   452  out_module_put:
   452  out_module_put:
   453     module_put(master->device->module);
   453     module_put(master->device->module);
   454  out_release:
   454  out_release:
   455     master->reserved = 0;
   455     atomic_inc(&master->available);
   456  out_return:
   456  out_return:
   457     EC_ERR("Failed to request master %i.\n", master_index);
   457     EC_ERR("Failed to request master %i.\n", master_index);
   458     return NULL;
   458     return NULL;
   459 }
   459 }
   460 
   460 
   467 
   467 
   468 void ecrt_release_master(ec_master_t *master /**< EtherCAT master */)
   468 void ecrt_release_master(ec_master_t *master /**< EtherCAT master */)
   469 {
   469 {
   470     EC_INFO("Releasing master %i...\n", master->index);
   470     EC_INFO("Releasing master %i...\n", master->index);
   471 
   471 
   472     if (!master->reserved) {
   472     if (atomic_read(&master->available)) {
   473         EC_ERR("Master %i was never requested!\n", master->index);
   473         EC_ERR("Master %i was never requested!\n", master->index);
   474         return;
   474         return;
   475     }
   475     }
   476 
   476 
   477     ec_master_reset(master);
   477     ec_master_reset(master);
   478     ec_master_idle_start(master);
   478     ec_master_idle_start(master);
   479 
   479 
   480     module_put(master->device->module);
   480     module_put(master->device->module);
   481     master->reserved = 0;
   481     atomic_inc(&master->available);
   482 
   482 
   483     EC_INFO("Successfully released master %i.\n", master->index);
   483     EC_INFO("Successfully released master %i.\n", master->index);
   484     return;
   484     return;
   485 }
   485 }
   486 
   486