1371 ec_master_t *master, /**< EtherCAT master. */ |
1371 ec_master_t *master, /**< EtherCAT master. */ |
1372 unsigned long arg, /**< ioctl() argument. */ |
1372 unsigned long arg, /**< ioctl() argument. */ |
1373 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
1373 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
1374 ) |
1374 ) |
1375 { |
1375 { |
1376 ec_ioctl_request_t data; |
1376 ec_master_t *m; |
1377 int ret = 0; |
1377 int ret = 0; |
1378 |
1378 |
1379 data.handle = ecrt_request_master(master->index); |
1379 m = ecrt_request_master(master->index); |
1380 |
1380 if (IS_ERR(m)) { |
1381 if (IS_ERR(data.handle)) { |
1381 ret = PTR_ERR(m); |
1382 ret = PTR_ERR(data.handle); |
|
1383 } else { |
1382 } else { |
1384 priv->requested = 1; |
1383 priv->requested = 1; |
1385 if (copy_to_user((void __user *) arg, &data, sizeof(data))) |
|
1386 ret = -EFAULT; |
|
1387 } |
1384 } |
1388 |
1385 |
1389 return ret; |
1386 return ret; |
|
1387 } |
|
1388 |
|
1389 /*****************************************************************************/ |
|
1390 |
|
1391 /** Create a domain. |
|
1392 */ |
|
1393 int ec_cdev_ioctl_create_domain( |
|
1394 ec_master_t *master, /**< EtherCAT master. */ |
|
1395 unsigned long arg, /**< ioctl() argument. */ |
|
1396 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
1397 ) |
|
1398 { |
|
1399 ec_domain_t *domain; |
|
1400 |
|
1401 if (unlikely(!priv->requested)) |
|
1402 return -EPERM; |
|
1403 |
|
1404 domain = ecrt_master_create_domain(master); |
|
1405 if (!domain) |
|
1406 return -ENOMEM; |
|
1407 |
|
1408 return domain->index; |
1390 } |
1409 } |
1391 |
1410 |
1392 /****************************************************************************** |
1411 /****************************************************************************** |
1393 * File operations |
1412 * File operations |
1394 *****************************************************************************/ |
1413 *****************************************************************************/ |
1504 return ec_cdev_ioctl_config_sdo(master, arg); |
1523 return ec_cdev_ioctl_config_sdo(master, arg); |
1505 case EC_IOCTL_REQUEST: |
1524 case EC_IOCTL_REQUEST: |
1506 if (!(filp->f_mode & FMODE_WRITE)) |
1525 if (!(filp->f_mode & FMODE_WRITE)) |
1507 return -EPERM; |
1526 return -EPERM; |
1508 return ec_cdev_ioctl_request(master, arg, priv); |
1527 return ec_cdev_ioctl_request(master, arg, priv); |
|
1528 case EC_IOCTL_CREATE_DOMAIN: |
|
1529 if (!(filp->f_mode & FMODE_WRITE)) |
|
1530 return -EPERM; |
|
1531 return ec_cdev_ioctl_create_domain(master, arg, priv); |
1509 default: |
1532 default: |
1510 return -ENOTTY; |
1533 return -ENOTTY; |
1511 } |
1534 } |
1512 } |
1535 } |
1513 |
1536 |