master/module.c
changeset 191 ca805255a935
parent 184 2fc86cec12df
child 195 674071846ee3
equal deleted inserted replaced
190:4e32bcc6b361 191:ca805255a935
   179 {
   179 {
   180     ec_master_t *master;
   180     ec_master_t *master;
   181 
   181 
   182     if (!net_dev) {
   182     if (!net_dev) {
   183         EC_WARN("Device is NULL!\n");
   183         EC_WARN("Device is NULL!\n");
   184         return NULL;
   184         goto out_return;
   185     }
   185     }
   186 
   186 
   187     if (!(master = ec_find_master(master_index))) return NULL;
   187     if (!(master = ec_find_master(master_index))) return NULL;
   188 
   188 
   189     // critical section start
   189     // critical section start
   190     if (master->device) {
   190     if (master->device) {
   191         EC_ERR("Master %i already has a device!\n", master_index);
   191         EC_ERR("Master %i already has a device!\n", master_index);
   192         return NULL;
   192         // critical section leave
       
   193         goto out_return;
   193     }
   194     }
   194 
   195 
   195     if (!(master->device =
   196     if (!(master->device =
   196           (ec_device_t *) kmalloc(sizeof(ec_device_t), GFP_KERNEL))) {
   197           (ec_device_t *) kmalloc(sizeof(ec_device_t), GFP_KERNEL))) {
   197         EC_ERR("Failed to allocate device!\n");
   198         EC_ERR("Failed to allocate device!\n");
   198         return NULL;
   199         // critical section leave
       
   200         goto out_return;
   199     }
   201     }
   200     // critical section end
   202     // critical section end
   201 
   203 
   202     if (ec_device_init(master->device, master, net_dev, isr, module)) {
   204     if (ec_device_init(master->device, master, net_dev, isr, module)) {
   203         kfree(master->device);
   205         EC_ERR("Failed to init device!\n");
   204         master->device = NULL;
   206         goto out_free;
   205         return NULL;
       
   206     }
   207     }
   207 
   208 
   208     return master->device;
   209     return master->device;
       
   210 
       
   211  out_free:
       
   212     kfree(master->device);
       
   213     master->device = NULL;
       
   214  out_return:
       
   215     return NULL;
   209 }
   216 }
   210 
   217 
   211 /*****************************************************************************/
   218 /*****************************************************************************/
   212 
   219 
   213 /**
   220 /**
   220                       /**< EtherCAT-Geraet */
   227                       /**< EtherCAT-Geraet */
   221                       )
   228                       )
   222 {
   229 {
   223     ec_master_t *master;
   230     ec_master_t *master;
   224 
   231 
   225     if (master_index >= ec_master_count) {
       
   226         EC_WARN("Master %i does not exist!\n", master_index);
       
   227         return;
       
   228     }
       
   229 
       
   230     if (!(master = ec_find_master(master_index))) return;
   232     if (!(master = ec_find_master(master_index))) return;
   231 
   233 
   232     if (!master->device || master->device != device) {
   234     if (!master->device || master->device != device) {
   233         EC_WARN("Unable to unregister device!\n");
   235         EC_WARN("Unable to unregister device!\n");
   234         return;
   236         return;
   237     ec_device_clear(master->device);
   239     ec_device_clear(master->device);
   238     kfree(master->device);
   240     kfree(master->device);
   239     master->device = NULL;
   241     master->device = NULL;
   240 }
   242 }
   241 
   243 
       
   244 /*****************************************************************************/
       
   245 
       
   246 /**
       
   247    Starts the master.
       
   248 */
       
   249 
       
   250 int ecdev_start(unsigned int master_index
       
   251                 /**< Index des EtherCAT-Masters */
       
   252                 )
       
   253 {
       
   254     ec_master_t *master;
       
   255     if (!(master = ec_find_master(master_index))) return -1;
       
   256 
       
   257     if (ec_device_open(master->device)) {
       
   258         EC_ERR("Failed to open device!\n");
       
   259         return -1;
       
   260     }
       
   261 
       
   262     ec_master_freerun_start(master);
       
   263     return 0;
       
   264 }
       
   265 
       
   266 /*****************************************************************************/
       
   267 
       
   268 /**
       
   269    Stops the master.
       
   270 */
       
   271 
       
   272 void ecdev_stop(unsigned int master_index
       
   273                 /**< Index des EtherCAT-Masters */
       
   274                 )
       
   275 {
       
   276     ec_master_t *master;
       
   277     if (!(master = ec_find_master(master_index))) return;
       
   278 
       
   279     ec_master_freerun_stop(master);
       
   280 
       
   281     if (ec_device_close(master->device))
       
   282         EC_WARN("Failed to close device!\n");
       
   283 }
       
   284 
   242 /******************************************************************************
   285 /******************************************************************************
   243  *
   286  *
   244  * Echtzeitschnittstelle
   287  * Echtzeitschnittstelle
   245  *
   288  *
   246  *****************************************************************************/
   289  *****************************************************************************/
   259 {
   302 {
   260     ec_master_t *master;
   303     ec_master_t *master;
   261 
   304 
   262     EC_INFO("Requesting master %i...\n", master_index);
   305     EC_INFO("Requesting master %i...\n", master_index);
   263 
   306 
   264     if (!(master = ec_find_master(master_index))) goto req_return;
   307     if (!(master = ec_find_master(master_index))) goto out_return;
   265 
   308 
   266     // begin critical section
   309     // begin critical section
   267     if (master->reserved) {
   310     if (master->reserved) {
   268         EC_ERR("Master %i is already in use!\n", master_index);
   311         EC_ERR("Master %i is already in use!\n", master_index);
   269         goto req_return;
   312         goto out_return;
   270     }
   313     }
   271     master->reserved = 1;
   314     master->reserved = 1;
   272     // end critical section
   315     // end critical section
   273 
   316 
   274     if (!master->device) {
   317     if (!master->device) {
   275         EC_ERR("Master %i has no assigned device!\n", master_index);
   318         EC_ERR("Master %i has no assigned device!\n", master_index);
   276         goto req_release;
   319         goto out_release;
   277     }
   320     }
   278 
   321 
   279     if (!try_module_get(master->device->module)) {
   322     if (!try_module_get(master->device->module)) {
   280         EC_ERR("Failed to reserve device module!\n");
   323         EC_ERR("Failed to reserve device module!\n");
   281         goto req_release;
   324         goto out_release;
   282     }
   325     }
   283 
   326 
   284     if (ec_device_open(master->device)) {
   327     ec_master_freerun_stop(master);
   285         EC_ERR("Failed to open device!\n");
   328     ec_master_reset(master);
   286         goto req_module_put;
   329     master->mode = EC_MASTER_MODE_RUNNING;
   287     }
       
   288 
   330 
   289     if (!master->device->link_state) EC_WARN("Link is DOWN.\n");
   331     if (!master->device->link_state) EC_WARN("Link is DOWN.\n");
   290 
   332 
   291     if (ec_master_bus_scan(master)) {
   333     if (ec_master_bus_scan(master)) {
   292         EC_ERR("Bus scan failed!\n");
   334         EC_ERR("Bus scan failed!\n");
   293         goto req_close;
   335         goto out_module_put;
   294     }
   336     }
   295 
   337 
   296     EC_INFO("Master %i is ready.\n", master_index);
   338     EC_INFO("Master %i is ready.\n", master_index);
   297     return master;
   339     return master;
   298 
   340 
   299  req_close:
   341  out_module_put:
   300     if (ec_device_close(master->device))
       
   301         EC_WARN("Warning - Failed to close device!\n");
       
   302  req_module_put:
       
   303     module_put(master->device->module);
   342     module_put(master->device->module);
   304     ec_master_reset(master);
   343     ec_master_reset(master);
   305  req_release:
   344  out_release:
   306     master->reserved = 0;
   345     master->reserved = 0;
   307  req_return:
   346  out_return:
   308     EC_ERR("Failed requesting master %i.\n", master_index);
   347     EC_ERR("Failed requesting master %i.\n", master_index);
   309     return NULL;
   348     return NULL;
   310 }
   349 }
   311 
   350 
   312 /*****************************************************************************/
   351 /*****************************************************************************/
   324         return;
   363         return;
   325     }
   364     }
   326 
   365 
   327     ec_master_reset(master);
   366     ec_master_reset(master);
   328 
   367 
   329     if (ec_device_close(master->device))
   368     master->mode = EC_MASTER_MODE_IDLE;
   330         EC_WARN("Warning - Failed to close device!\n");
   369     ec_master_freerun_start(master);
   331 
   370 
   332     module_put(master->device->module);
   371     module_put(master->device->module);
   333     master->reserved = 0;
   372     master->reserved = 0;
   334 
   373 
   335     EC_INFO("Released master %i.\n", master->index);
   374     EC_INFO("Released master %i.\n", master->index);
   387 module_init(ec_init_module);
   426 module_init(ec_init_module);
   388 module_exit(ec_cleanup_module);
   427 module_exit(ec_cleanup_module);
   389 
   428 
   390 EXPORT_SYMBOL(ecdev_register);
   429 EXPORT_SYMBOL(ecdev_register);
   391 EXPORT_SYMBOL(ecdev_unregister);
   430 EXPORT_SYMBOL(ecdev_unregister);
       
   431 EXPORT_SYMBOL(ecdev_start);
       
   432 EXPORT_SYMBOL(ecdev_stop);
   392 EXPORT_SYMBOL(ecrt_request_master);
   433 EXPORT_SYMBOL(ecrt_request_master);
   393 EXPORT_SYMBOL(ecrt_release_master);
   434 EXPORT_SYMBOL(ecrt_release_master);
   394 
   435 
   395 /*****************************************************************************/
   436 /*****************************************************************************/
   396 
   437