1404 domain = ecrt_master_create_domain(master); |
1404 domain = ecrt_master_create_domain(master); |
1405 if (!domain) |
1405 if (!domain) |
1406 return -ENOMEM; |
1406 return -ENOMEM; |
1407 |
1407 |
1408 return domain->index; |
1408 return domain->index; |
|
1409 } |
|
1410 |
|
1411 /*****************************************************************************/ |
|
1412 |
|
1413 /** Create a slave configuration. |
|
1414 */ |
|
1415 int ec_cdev_ioctl_create_slave_config( |
|
1416 ec_master_t *master, /**< EtherCAT master. */ |
|
1417 unsigned long arg, /**< ioctl() argument. */ |
|
1418 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
1419 ) |
|
1420 { |
|
1421 ec_ioctl_config_t data; |
|
1422 ec_slave_config_t *sc, *entry; |
|
1423 |
|
1424 if (unlikely(!priv->requested)) |
|
1425 return -EPERM; |
|
1426 |
|
1427 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
1428 return -EFAULT; |
|
1429 } |
|
1430 |
|
1431 sc = ecrt_master_slave_config(master, data.alias, data.position, |
|
1432 data.vendor_id, data.product_code); |
|
1433 if (!sc) |
|
1434 return -ENODEV; // FIXME |
|
1435 |
|
1436 data.config_index = 0; |
|
1437 |
|
1438 if (down_interruptible(&master->master_sem)) |
|
1439 return -EINTR; |
|
1440 |
|
1441 list_for_each_entry(entry, &master->configs, list) { |
|
1442 if (entry == sc) |
|
1443 break; |
|
1444 data.config_index++; |
|
1445 } |
|
1446 |
|
1447 up(&master->master_sem); |
|
1448 |
|
1449 if (copy_to_user((void __user *) arg, &data, sizeof(data))) |
|
1450 return -EFAULT; |
|
1451 |
|
1452 return 0; |
1409 } |
1453 } |
1410 |
1454 |
1411 /****************************************************************************** |
1455 /****************************************************************************** |
1412 * File operations |
1456 * File operations |
1413 *****************************************************************************/ |
1457 *****************************************************************************/ |
1527 return ec_cdev_ioctl_request(master, arg, priv); |
1571 return ec_cdev_ioctl_request(master, arg, priv); |
1528 case EC_IOCTL_CREATE_DOMAIN: |
1572 case EC_IOCTL_CREATE_DOMAIN: |
1529 if (!(filp->f_mode & FMODE_WRITE)) |
1573 if (!(filp->f_mode & FMODE_WRITE)) |
1530 return -EPERM; |
1574 return -EPERM; |
1531 return ec_cdev_ioctl_create_domain(master, arg, priv); |
1575 return ec_cdev_ioctl_create_domain(master, arg, priv); |
|
1576 case EC_IOCTL_CREATE_SLAVE_CONFIG: |
|
1577 if (!(filp->f_mode & FMODE_WRITE)) |
|
1578 return -EPERM; |
|
1579 return ec_cdev_ioctl_create_slave_config(master, arg, priv); |
1532 default: |
1580 default: |
1533 return -ENOTTY; |
1581 return -ENOTTY; |
1534 } |
1582 } |
1535 } |
1583 } |
1536 |
1584 |