193 data.serial_number = slave->sii.serial_number; |
193 data.serial_number = slave->sii.serial_number; |
194 data.alias = slave->sii.alias; |
194 data.alias = slave->sii.alias; |
195 data.state = slave->current_state; |
195 data.state = slave->current_state; |
196 |
196 |
197 data.sync_count = slave->sii.sync_count; |
197 data.sync_count = slave->sii.sync_count; |
|
198 data.sdo_count = ec_slave_sdo_count(slave); |
198 |
199 |
199 if (slave->sii.name) { |
200 if (slave->sii.name) { |
200 strncpy(data.name, slave->sii.name, |
201 strncpy(data.name, slave->sii.name, |
201 EC_IOCTL_SLAVE_NAME_SIZE); |
202 EC_IOCTL_SLAVE_NAME_SIZE); |
202 data.name[EC_IOCTL_SLAVE_NAME_SIZE - 1] = 0; |
203 data.name[EC_IOCTL_SLAVE_NAME_SIZE - 1] = 0; |
497 |
498 |
498 ec_slave_request_state(slave, data.requested_state); |
499 ec_slave_request_state(slave, data.requested_state); |
499 break; |
500 break; |
500 } |
501 } |
501 |
502 |
|
503 case EC_IOCTL_SDO: |
|
504 { |
|
505 ec_ioctl_sdo_t data; |
|
506 const ec_slave_t *slave; |
|
507 const ec_sdo_t *sdo; |
|
508 |
|
509 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
510 retval = -EFAULT; |
|
511 break; |
|
512 } |
|
513 |
|
514 if (!(slave = ec_master_find_slave( |
|
515 master, 0, data.slave_position))) { |
|
516 EC_ERR("Slave %u does not exist!\n", data.slave_position); |
|
517 retval = -EINVAL; |
|
518 break; |
|
519 } |
|
520 |
|
521 if (!(sdo = ec_slave_get_sdo_by_pos_const( |
|
522 slave, data.sdo_position))) { |
|
523 EC_ERR("Sdo %u does not exist in slave %u!\n", |
|
524 data.sdo_position, data.slave_position); |
|
525 retval = -EINVAL; |
|
526 break; |
|
527 } |
|
528 |
|
529 data.sdo_index = sdo->index; |
|
530 data.max_subindex = sdo->max_subindex; |
|
531 |
|
532 if (sdo->name) { |
|
533 strncpy(data.name, sdo->name, EC_IOCTL_SDO_NAME_SIZE); |
|
534 data.name[EC_IOCTL_SDO_NAME_SIZE - 1] = 0; |
|
535 } else { |
|
536 data.name[0] = 0; |
|
537 } |
|
538 |
|
539 if (copy_to_user((void __user *) arg, &data, sizeof(data))) { |
|
540 retval = -EFAULT; |
|
541 break; |
|
542 } |
|
543 break; |
|
544 } |
|
545 |
|
546 case EC_IOCTL_SDO_ENTRY: |
|
547 { |
|
548 ec_ioctl_sdo_entry_t data; |
|
549 const ec_slave_t *slave; |
|
550 const ec_sdo_t *sdo; |
|
551 const ec_sdo_entry_t *entry; |
|
552 |
|
553 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
554 retval = -EFAULT; |
|
555 break; |
|
556 } |
|
557 |
|
558 if (!(slave = ec_master_find_slave( |
|
559 master, 0, data.slave_position))) { |
|
560 EC_ERR("Slave %u does not exist!\n", data.slave_position); |
|
561 retval = -EINVAL; |
|
562 break; |
|
563 } |
|
564 |
|
565 if (!(sdo = ec_slave_get_sdo_by_pos_const( |
|
566 slave, data.sdo_position))) { |
|
567 EC_ERR("Sdo %u does not exist in slave %u!\n", |
|
568 data.sdo_position, data.slave_position); |
|
569 retval = -EINVAL; |
|
570 break; |
|
571 } |
|
572 |
|
573 if (!(entry = ec_sdo_get_entry_const( |
|
574 sdo, data.sdo_entry_subindex))) { |
|
575 EC_ERR("Sdo entry %u does not exist in Sdo %u " |
|
576 "in slave %u!\n", data.sdo_entry_subindex, |
|
577 data.sdo_position, data.slave_position); |
|
578 retval = -EINVAL; |
|
579 break; |
|
580 } |
|
581 |
|
582 data.data_type = entry->data_type; |
|
583 data.bit_length = entry->bit_length; |
|
584 |
|
585 if (entry->description) { |
|
586 strncpy(data.description, entry->description, |
|
587 EC_IOCTL_SDO_ENTRY_DESCRIPTION_SIZE); |
|
588 data.description[EC_IOCTL_SDO_ENTRY_DESCRIPTION_SIZE - 1] |
|
589 = 0; |
|
590 } else { |
|
591 data.description[0] = 0; |
|
592 } |
|
593 |
|
594 if (copy_to_user((void __user *) arg, &data, sizeof(data))) { |
|
595 retval = -EFAULT; |
|
596 break; |
|
597 } |
|
598 break; |
|
599 } |
|
600 |
502 default: |
601 default: |
503 retval = -ENOIOCTLCMD; |
602 retval = -ENOIOCTLCMD; |
504 } |
603 } |
505 |
604 |
506 return retval; |
605 return retval; |