1352 return -EFAULT; |
1361 return -EFAULT; |
1353 |
1362 |
1354 return 0; |
1363 return 0; |
1355 } |
1364 } |
1356 |
1365 |
|
1366 /*****************************************************************************/ |
|
1367 |
|
1368 /** Request the master from userspace. |
|
1369 */ |
|
1370 int ec_cdev_ioctl_request( |
|
1371 ec_master_t *master, /**< EtherCAT master. */ |
|
1372 unsigned long arg, /**< ioctl() argument. */ |
|
1373 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
1374 ) |
|
1375 { |
|
1376 ec_ioctl_request_t data; |
|
1377 int ret = 0; |
|
1378 |
|
1379 data.handle = ecrt_request_master(master->index); |
|
1380 |
|
1381 if (IS_ERR(data.handle)) { |
|
1382 ret = PTR_ERR(data.handle); |
|
1383 } else { |
|
1384 priv->requested = 1; |
|
1385 if (copy_to_user((void __user *) arg, &data, sizeof(data))) |
|
1386 ret = -EFAULT; |
|
1387 } |
|
1388 |
|
1389 return ret; |
|
1390 } |
|
1391 |
1357 /****************************************************************************** |
1392 /****************************************************************************** |
1358 * File operations |
1393 * File operations |
1359 *****************************************************************************/ |
1394 *****************************************************************************/ |
1360 |
1395 |
1361 /** Called when the cdev is opened. |
1396 /** Called when the cdev is opened. |
1362 */ |
1397 */ |
1363 int eccdev_open(struct inode *inode, struct file *filp) |
1398 int eccdev_open(struct inode *inode, struct file *filp) |
1364 { |
1399 { |
1365 ec_cdev_t *cdev = container_of(inode->i_cdev, ec_cdev_t, cdev); |
1400 ec_cdev_t *cdev = container_of(inode->i_cdev, ec_cdev_t, cdev); |
1366 ec_master_t *master = cdev->master; |
1401 ec_master_t *master = cdev->master; |
1367 |
1402 ec_cdev_priv_t *priv; |
1368 filp->private_data = cdev; |
1403 |
|
1404 priv = kmalloc(sizeof(ec_cdev_priv_t), GFP_KERNEL); |
|
1405 if (!priv) { |
|
1406 EC_ERR("Failed to allocate memory for private data structure.\n"); |
|
1407 return -ENOMEM; |
|
1408 } |
|
1409 |
|
1410 priv->cdev = cdev; |
|
1411 priv->requested = 0; |
|
1412 |
|
1413 filp->private_data = priv; |
1369 if (master->debug_level) |
1414 if (master->debug_level) |
1370 EC_DBG("File opened.\n"); |
1415 EC_DBG("File opened.\n"); |
1371 return 0; |
1416 return 0; |
1372 } |
1417 } |
1373 |
1418 |
1375 |
1420 |
1376 /** Called when the cdev is closed. |
1421 /** Called when the cdev is closed. |
1377 */ |
1422 */ |
1378 int eccdev_release(struct inode *inode, struct file *filp) |
1423 int eccdev_release(struct inode *inode, struct file *filp) |
1379 { |
1424 { |
1380 ec_cdev_t *cdev = (ec_cdev_t *) filp->private_data; |
1425 ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data; |
1381 ec_master_t *master = cdev->master; |
1426 ec_master_t *master = priv->cdev->master; |
|
1427 |
|
1428 if (priv->requested) |
|
1429 ecrt_release_master(master); |
1382 |
1430 |
1383 if (master->debug_level) |
1431 if (master->debug_level) |
1384 EC_DBG("File closed.\n"); |
1432 EC_DBG("File closed.\n"); |
|
1433 kfree(priv); |
1385 return 0; |
1434 return 0; |
1386 } |
1435 } |
1387 |
1436 |
1388 /*****************************************************************************/ |
1437 /*****************************************************************************/ |
1389 |
1438 |
1390 /** Called when an ioctl() command is issued. |
1439 /** Called when an ioctl() command is issued. |
1391 */ |
1440 */ |
1392 long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
1441 long eccdev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) |
1393 { |
1442 { |
1394 ec_cdev_t *cdev = (ec_cdev_t *) filp->private_data; |
1443 ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data; |
1395 ec_master_t *master = cdev->master; |
1444 ec_master_t *master = priv->cdev->master; |
1396 |
1445 |
1397 if (master->debug_level) |
1446 if (master->debug_level) |
1398 EC_DBG("ioctl(filp = %x, cmd = %u (%u), arg = %x)\n", |
1447 EC_DBG("ioctl(filp = %x, cmd = %u (%u), arg = %x)\n", |
1399 (u32) filp, (u32) cmd, (u32) _IOC_NR(cmd), (u32) arg); |
1448 (u32) filp, (u32) cmd, (u32) _IOC_NR(cmd), (u32) arg); |
1400 |
1449 |
1451 return ec_cdev_ioctl_config_pdo(master, arg); |
1500 return ec_cdev_ioctl_config_pdo(master, arg); |
1452 case EC_IOCTL_CONFIG_PDO_ENTRY: |
1501 case EC_IOCTL_CONFIG_PDO_ENTRY: |
1453 return ec_cdev_ioctl_config_pdo_entry(master, arg); |
1502 return ec_cdev_ioctl_config_pdo_entry(master, arg); |
1454 case EC_IOCTL_CONFIG_SDO: |
1503 case EC_IOCTL_CONFIG_SDO: |
1455 return ec_cdev_ioctl_config_sdo(master, arg); |
1504 return ec_cdev_ioctl_config_sdo(master, arg); |
|
1505 case EC_IOCTL_REQUEST: |
|
1506 if (!(filp->f_mode & FMODE_WRITE)) |
|
1507 return -EPERM; |
|
1508 return ec_cdev_ioctl_request(master, arg, priv); |
1456 default: |
1509 default: |
1457 return -ENOTTY; |
1510 return -ENOTTY; |
1458 } |
1511 } |
1459 } |
1512 } |
1460 |
1513 |