master/cdev.c
changeset 1244 0b70040d3daa
parent 1242 632a6b91f8e4
child 1246 4042bda8c980
equal deleted inserted replaced
1243:13cb18b91627 1244:0b70040d3daa
  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