equal
deleted
inserted
replaced
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 |