master/module.c
changeset 700 a6b61f1a062d
parent 653 33aa0e7e5a68
child 758 8fa6f825eb7d
equal deleted inserted replaced
699:112abd5b04d2 700:a6b61f1a062d
   246     return 1;
   246     return 1;
   247 }
   247 }
   248 
   248 
   249 /*****************************************************************************/
   249 /*****************************************************************************/
   250 
   250 
       
   251 int ec_mac_is_broadcast(const uint8_t *mac)
       
   252 {
       
   253     unsigned int i;
       
   254     
       
   255     for (i = 0; i < ETH_ALEN; i++)
       
   256         if (mac[i] != 0xff)
       
   257             return 0;
       
   258 
       
   259     return 1;
       
   260 }
       
   261 
       
   262 /*****************************************************************************/
       
   263 
   251 static int ec_mac_parse(uint8_t *mac, const char *src, int allow_empty)
   264 static int ec_mac_parse(uint8_t *mac, const char *src, int allow_empty)
   252 {
   265 {
   253     unsigned int i, value;
   266     unsigned int i, value;
   254     const char *orig = src;
   267     const char *orig = src;
   255     char *rem;
   268     char *rem;
   398     char str[20];
   411     char str[20];
   399     unsigned int i;
   412     unsigned int i;
   400 
   413 
   401     for (i = 0; i < master_count; i++) {
   414     for (i = 0; i < master_count; i++) {
   402         master = &masters[i];
   415         master = &masters[i];
   403         if (ec_mac_equal(master->main_mac, net_dev->dev_addr)) {
   416 
   404             ec_mac_print(master->main_mac, str);
   417         down(&master->device_sem);
       
   418         if (master->main_device.dev) { // master already has a device
       
   419             up(&master->device_sem);
       
   420             continue;
       
   421         }
       
   422             
       
   423         if (ec_mac_equal(master->main_mac, net_dev->dev_addr)
       
   424                 || ec_mac_is_broadcast(master->main_mac)) {
       
   425             ec_mac_print(net_dev->dev_addr, str);
   405             EC_INFO("Accepting device %s for master %u.\n",
   426             EC_INFO("Accepting device %s for master %u.\n",
   406                     str, master->index);
   427                     str, master->index);
   407 
   428 
   408             down(&master->device_sem);
       
   409             if (master->main_device.dev) {
       
   410                 EC_ERR("Master %u already has a device attached.\n",
       
   411                         master->index);
       
   412                 up(&master->device_sem);
       
   413                 return -1;
       
   414             }
       
   415             
       
   416             ec_device_attach(&master->main_device, net_dev, poll, module);
   429             ec_device_attach(&master->main_device, net_dev, poll, module);
   417             up(&master->device_sem);
   430             up(&master->device_sem);
   418             
   431             
   419             sprintf(net_dev->name, "ec%u", master->index);
   432             sprintf(net_dev->name, "ec%u", master->index);
   420             *ecdev = &master->main_device; // offer accepted
   433             *ecdev = &master->main_device; // offer accepted
   421             return 0; // no error
   434             return 0; // no error
   422         }
   435         }
   423         else if (master->debug_level) {
   436         else {
   424             ec_mac_print(master->main_mac, str);
   437             up(&master->device_sem);
   425             EC_DBG("Master %u declined device %s.\n", master->index, str);
   438 
       
   439             if (master->debug_level) {
       
   440                 ec_mac_print(net_dev->dev_addr, str);
       
   441                 EC_DBG("Master %u declined device %s.\n", master->index, str);
       
   442             }
   426         }
   443         }
   427     }
   444     }
   428 
   445 
   429     *ecdev = NULL; // offer declined
   446     *ecdev = NULL; // offer declined
   430     return 0; // no error
   447     return 0; // no error
   444 void ecdev_withdraw(ec_device_t *device /**< EtherCAT device */)
   461 void ecdev_withdraw(ec_device_t *device /**< EtherCAT device */)
   445 {
   462 {
   446     ec_master_t *master = device->master;
   463     ec_master_t *master = device->master;
   447     char str[20];
   464     char str[20];
   448 
   465 
   449     ec_mac_print(master->main_mac, str);
   466     ec_mac_print(device->dev->dev_addr, str);
   450     
       
   451     EC_INFO("Master %u releasing main device %s.\n", master->index, str);
   467     EC_INFO("Master %u releasing main device %s.\n", master->index, str);
   452     
   468     
   453     down(&master->device_sem);
   469     down(&master->device_sem);
   454     ec_device_detach(device);
   470     ec_device_detach(device);
   455     up(&master->device_sem);
   471     up(&master->device_sem);