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); |