master/cdev.c
changeset 1246 4042bda8c980
parent 1244 0b70040d3daa
child 1247 5f1f1a3e6636
equal deleted inserted replaced
1245:9f52fc9562ae 1246:4042bda8c980
  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