168 if (down_interruptible(&master->master_sem)) |
169 if (down_interruptible(&master->master_sem)) |
169 return -EINTR; |
170 return -EINTR; |
170 data.slave_count = master->slave_count; |
171 data.slave_count = master->slave_count; |
171 data.config_count = ec_master_config_count(master); |
172 data.config_count = ec_master_config_count(master); |
172 data.domain_count = ec_master_domain_count(master); |
173 data.domain_count = ec_master_domain_count(master); |
|
174 data.eoe_handler_count = ec_master_eoe_handler_count(master); |
173 data.phase = (uint8_t) master->phase; |
175 data.phase = (uint8_t) master->phase; |
174 data.scan_busy = master->scan_busy; |
176 data.scan_busy = master->scan_busy; |
175 up(&master->master_sem); |
177 up(&master->master_sem); |
176 |
178 |
177 if (down_interruptible(&master->device_sem)) |
179 if (down_interruptible(&master->device_sem)) |
1426 |
1428 |
1427 data.index = req->index; |
1429 data.index = req->index; |
1428 data.subindex = req->subindex; |
1430 data.subindex = req->subindex; |
1429 data.size = req->data_size; |
1431 data.size = req->data_size; |
1430 memcpy(&data.data, req->data, min((u32) data.size, (u32) 4)); |
1432 memcpy(&data.data, req->data, min((u32) data.size, (u32) 4)); |
|
1433 |
|
1434 up(&master->master_sem); |
|
1435 |
|
1436 if (copy_to_user((void __user *) arg, &data, sizeof(data))) |
|
1437 return -EFAULT; |
|
1438 |
|
1439 return 0; |
|
1440 } |
|
1441 |
|
1442 /*****************************************************************************/ |
|
1443 |
|
1444 /** Get EoE handler information. |
|
1445 */ |
|
1446 int ec_cdev_ioctl_eoe_handler( |
|
1447 ec_master_t *master, /**< EtherCAT master. */ |
|
1448 unsigned long arg /**< ioctl() argument. */ |
|
1449 ) |
|
1450 { |
|
1451 ec_ioctl_eoe_handler_t data; |
|
1452 const ec_eoe_t *eoe; |
|
1453 |
|
1454 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
1455 return -EFAULT; |
|
1456 } |
|
1457 |
|
1458 if (down_interruptible(&master->master_sem)) |
|
1459 return -EINTR; |
|
1460 |
|
1461 if (!(eoe = ec_master_get_eoe_handler_const(master, data.eoe_index))) { |
|
1462 up(&master->master_sem); |
|
1463 EC_ERR("EoE handler %u does not exist!\n", data.eoe_index); |
|
1464 return -EINVAL; |
|
1465 } |
|
1466 |
|
1467 if (eoe->slave) { |
|
1468 data.slave_position = eoe->slave->ring_position; |
|
1469 } else { |
|
1470 data.slave_position = 0xffff; |
|
1471 } |
|
1472 snprintf(data.name, EC_DATAGRAM_NAME_SIZE, eoe->dev->name); |
|
1473 data.open = eoe->opened; |
|
1474 data.rx_bytes = eoe->stats.tx_bytes; |
|
1475 data.rx_rate = eoe->tx_rate; |
|
1476 data.tx_bytes = eoe->stats.rx_bytes; |
|
1477 data.tx_rate = eoe->tx_rate; |
|
1478 data.tx_queued_frames = eoe->tx_queued_frames; |
|
1479 data.tx_queue_size = eoe->tx_queue_size; |
1431 |
1480 |
1432 up(&master->master_sem); |
1481 up(&master->master_sem); |
1433 |
1482 |
1434 if (copy_to_user((void __user *) arg, &data, sizeof(data))) |
1483 if (copy_to_user((void __user *) arg, &data, sizeof(data))) |
1435 return -EFAULT; |
1484 return -EFAULT; |
3131 return ec_cdev_ioctl_config_pdo(master, arg); |
3180 return ec_cdev_ioctl_config_pdo(master, arg); |
3132 case EC_IOCTL_CONFIG_PDO_ENTRY: |
3181 case EC_IOCTL_CONFIG_PDO_ENTRY: |
3133 return ec_cdev_ioctl_config_pdo_entry(master, arg); |
3182 return ec_cdev_ioctl_config_pdo_entry(master, arg); |
3134 case EC_IOCTL_CONFIG_SDO: |
3183 case EC_IOCTL_CONFIG_SDO: |
3135 return ec_cdev_ioctl_config_sdo(master, arg); |
3184 return ec_cdev_ioctl_config_sdo(master, arg); |
|
3185 case EC_IOCTL_EOE_HANDLER: |
|
3186 return ec_cdev_ioctl_eoe_handler(master, arg); |
3136 case EC_IOCTL_REQUEST: |
3187 case EC_IOCTL_REQUEST: |
3137 if (!(filp->f_mode & FMODE_WRITE)) |
3188 if (!(filp->f_mode & FMODE_WRITE)) |
3138 return -EPERM; |
3189 return -EPERM; |
3139 return ec_cdev_ioctl_request(master, arg, priv); |
3190 return ec_cdev_ioctl_request(master, arg, priv); |
3140 case EC_IOCTL_CREATE_DOMAIN: |
3191 case EC_IOCTL_CREATE_DOMAIN: |