master/cdev.c
changeset 990 4f223f3df05a
parent 989 816663ca9370
child 999 14307580deb6
equal deleted inserted replaced
989:816663ca9370 990:4f223f3df05a
   146         case EC_IOCTL_MASTER:
   146         case EC_IOCTL_MASTER:
   147             {
   147             {
   148                 ec_ioctl_master_t data;
   148                 ec_ioctl_master_t data;
   149 
   149 
   150                 data.slave_count = master->slave_count;
   150                 data.slave_count = master->slave_count;
       
   151                 data.config_count = ec_master_config_count(master);
   151                 data.mode = (uint8_t) master->mode;
   152                 data.mode = (uint8_t) master->mode;
   152                 
   153                 
   153                 memcpy(data.devices[0].address, master->main_mac, ETH_ALEN); 
   154                 memcpy(data.devices[0].address, master->main_mac, ETH_ALEN); 
   154                 data.devices[0].attached = master->main_device.dev ? 1 : 0;
   155                 data.devices[0].attached = master->main_device.dev ? 1 : 0;
   155                 data.devices[0].tx_count = master->main_device.tx_count;
   156                 data.devices[0].tx_count = master->main_device.tx_count;
   208                 data.sdo_count = ec_slave_sdo_count(slave);
   209                 data.sdo_count = ec_slave_sdo_count(slave);
   209                 data.sii_nwords = slave->sii_nwords;
   210                 data.sii_nwords = slave->sii_nwords;
   210 
   211 
   211                 if (slave->sii.name) {
   212                 if (slave->sii.name) {
   212                     strncpy(data.name, slave->sii.name,
   213                     strncpy(data.name, slave->sii.name,
   213                             EC_IOCTL_SLAVE_NAME_SIZE);
   214                             EC_IOCTL_STRING_SIZE);
   214                     data.name[EC_IOCTL_SLAVE_NAME_SIZE - 1] = 0;
   215                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   215                 } else {
   216                 } else {
   216                     data.name[0] = 0;
   217                     data.name[0] = 0;
   217                 }
   218                 }
   218 
   219 
   219                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   220                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   304                 data.dir = pdo->dir;
   305                 data.dir = pdo->dir;
   305                 data.index = pdo->index;
   306                 data.index = pdo->index;
   306                 data.entry_count = ec_pdo_entry_count(pdo);
   307                 data.entry_count = ec_pdo_entry_count(pdo);
   307 
   308 
   308                 if (pdo->name) {
   309                 if (pdo->name) {
   309                     strncpy(data.name, pdo->name, EC_IOCTL_PDO_NAME_SIZE);
   310                     strncpy(data.name, pdo->name, EC_IOCTL_STRING_SIZE);
   310                     data.name[EC_IOCTL_PDO_NAME_SIZE - 1] = 0;
   311                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   311                 } else {
   312                 } else {
   312                     data.name[0] = 0;
   313                     data.name[0] = 0;
   313                 }
   314                 }
   314 
   315 
   315                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   316                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   367 
   368 
   368                 data.index = entry->index;
   369                 data.index = entry->index;
   369                 data.subindex = entry->subindex;
   370                 data.subindex = entry->subindex;
   370                 data.bit_length = entry->bit_length;
   371                 data.bit_length = entry->bit_length;
   371                 if (entry->name) {
   372                 if (entry->name) {
   372                     strncpy(data.name, entry->name,
   373                     strncpy(data.name, entry->name, EC_IOCTL_STRING_SIZE);
   373                             EC_IOCTL_PDO_ENTRY_NAME_SIZE);
   374                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   374                     data.name[EC_IOCTL_PDO_ENTRY_NAME_SIZE - 1] = 0;
       
   375                 } else {
   375                 } else {
   376                     data.name[0] = 0;
   376                     data.name[0] = 0;
   377                 }
   377                 }
   378 
   378 
   379                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   379                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   544 
   544 
   545                 data.sdo_index = sdo->index;
   545                 data.sdo_index = sdo->index;
   546                 data.max_subindex = sdo->max_subindex;
   546                 data.max_subindex = sdo->max_subindex;
   547 
   547 
   548                 if (sdo->name) {
   548                 if (sdo->name) {
   549                     strncpy(data.name, sdo->name, EC_IOCTL_SDO_NAME_SIZE);
   549                     strncpy(data.name, sdo->name, EC_IOCTL_STRING_SIZE);
   550                     data.name[EC_IOCTL_SDO_NAME_SIZE - 1] = 0;
   550                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   551                 } else {
   551                 } else {
   552                     data.name[0] = 0;
   552                     data.name[0] = 0;
   553                 }
   553                 }
   554 
   554 
   555                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   555                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   608                 data.data_type = entry->data_type;
   608                 data.data_type = entry->data_type;
   609                 data.bit_length = entry->bit_length;
   609                 data.bit_length = entry->bit_length;
   610 
   610 
   611                 if (entry->description) {
   611                 if (entry->description) {
   612                     strncpy(data.description, entry->description,
   612                     strncpy(data.description, entry->description,
   613                             EC_IOCTL_SDO_ENTRY_DESCRIPTION_SIZE);
   613                             EC_IOCTL_STRING_SIZE);
   614                     data.description[EC_IOCTL_SDO_ENTRY_DESCRIPTION_SIZE - 1]
   614                     data.description[EC_IOCTL_STRING_SIZE - 1]
   615                         = 0;
   615                         = 0;
   616                 } else {
   616                 } else {
   617                     data.description[0] = 0;
   617                     data.description[0] = 0;
   618                 }
   618                 }
   619 
   619 
   851 
   851 
   852                 kfree(words);
   852                 kfree(words);
   853                 break;
   853                 break;
   854             }
   854             }
   855 
   855 
       
   856         case EC_IOCTL_CONFIG:
       
   857             {
       
   858                 ec_ioctl_config_t data;
       
   859                 const ec_slave_config_t *sc;
       
   860 
       
   861                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
   862                     retval = -EFAULT;
       
   863                     break;
       
   864                 }
       
   865                 
       
   866                 if (!(sc = ec_master_get_config_const(
       
   867                                 master, data.config_index))) {
       
   868                     EC_ERR("Slave config %u does not exist!\n",
       
   869                             data.config_index);
       
   870                     retval = -EINVAL;
       
   871                     break;
       
   872                 }
       
   873 
       
   874                 data.alias = sc->alias;
       
   875                 data.position = sc->position;
       
   876                 data.vendor_id = sc->vendor_id;
       
   877                 data.product_code = sc->product_code;
       
   878                 data.pdo_count[EC_DIR_OUTPUT] =
       
   879                     ec_pdo_list_count(&sc->pdos[EC_DIR_OUTPUT]);
       
   880                 data.pdo_count[EC_DIR_INPUT] =
       
   881                     ec_pdo_list_count(&sc->pdos[EC_DIR_INPUT]);
       
   882                 data.sdo_count = ec_slave_config_sdo_count(sc);
       
   883                 data.attached = sc->slave != NULL;
       
   884 
       
   885                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
       
   886                     retval = -EFAULT;
       
   887                     break;
       
   888                 }
       
   889                 break;
       
   890             }
       
   891 
       
   892         case EC_IOCTL_CONFIG_PDO:
       
   893             {
       
   894                 ec_ioctl_config_pdo_t data;
       
   895                 const ec_slave_config_t *sc;
       
   896                 const ec_pdo_t *pdo;
       
   897 
       
   898                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
   899                     retval = -EFAULT;
       
   900                     break;
       
   901                 }
       
   902                 
       
   903                 if (!(sc = ec_master_get_config_const(
       
   904                                 master, data.config_index))) {
       
   905                     EC_ERR("Slave config %u does not exist!\n",
       
   906                             data.config_index);
       
   907                     retval = -EINVAL;
       
   908                     break;
       
   909                 }
       
   910 
       
   911                 if (data.direction > EC_DIR_INPUT) {
       
   912                     EC_ERR("Invalid direction %u!\n", data.direction);
       
   913                     retval = -EINVAL;
       
   914                     break;
       
   915                 }
       
   916                 
       
   917                 if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
       
   918                                 &sc->pdos[data.direction], data.pdo_pos))) {
       
   919                     EC_ERR("Invalid Pdo position!\n");
       
   920                     retval = -EINVAL;
       
   921                     break;
       
   922                 }
       
   923 
       
   924                 data.index = pdo->index;
       
   925                 data.entry_count = ec_pdo_entry_count(pdo);
       
   926 
       
   927                 if (pdo->name) {
       
   928                     strncpy(data.name, pdo->name, EC_IOCTL_STRING_SIZE);
       
   929                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
       
   930                 } else {
       
   931                     data.name[0] = 0;
       
   932                 }
       
   933 
       
   934                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
       
   935                     retval = -EFAULT;
       
   936                     break;
       
   937                 }
       
   938                 break;
       
   939             }
       
   940 
       
   941         case EC_IOCTL_CONFIG_PDO_ENTRY:
       
   942             {
       
   943                 ec_ioctl_config_pdo_entry_t data;
       
   944                 const ec_slave_config_t *sc;
       
   945                 const ec_pdo_t *pdo;
       
   946                 const ec_pdo_entry_t *entry;
       
   947 
       
   948                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
   949                     retval = -EFAULT;
       
   950                     break;
       
   951                 }
       
   952                 
       
   953                 if (!(sc = ec_master_get_config_const(
       
   954                                 master, data.config_index))) {
       
   955                     EC_ERR("Slave config %u does not exist!\n",
       
   956                             data.config_index);
       
   957                     retval = -EINVAL;
       
   958                     break;
       
   959                 }
       
   960 
       
   961                 if (data.direction > EC_DIR_INPUT) {
       
   962                     EC_ERR("Invalid direction %u!\n", data.direction);
       
   963                     retval = -EINVAL;
       
   964                     break;
       
   965                 }
       
   966                 
       
   967                 if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
       
   968                                 &sc->pdos[data.direction], data.pdo_pos))) {
       
   969                     EC_ERR("Invalid Pdo position!\n");
       
   970                     retval = -EINVAL;
       
   971                     break;
       
   972                 }
       
   973 
       
   974                 if (!(entry = ec_pdo_find_entry_by_pos_const(
       
   975                                 pdo, data.entry_pos))) {
       
   976                     EC_ERR("Entry not found!\n");
       
   977                     retval = -EINVAL;
       
   978                     break;
       
   979                 }
       
   980 
       
   981                 data.index = entry->index;
       
   982                 data.subindex = entry->subindex;
       
   983                 data.bit_length = entry->bit_length;
       
   984                 if (entry->name) {
       
   985                     strncpy(data.name, entry->name, EC_IOCTL_STRING_SIZE);
       
   986                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
       
   987                 } else {
       
   988                     data.name[0] = 0;
       
   989                 }
       
   990 
       
   991                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
       
   992                     retval = -EFAULT;
       
   993                     break;
       
   994                 }
       
   995                 break;
       
   996             }
       
   997 
       
   998         case EC_IOCTL_CONFIG_SDO:
       
   999             {
       
  1000                 ec_ioctl_config_sdo_t data;
       
  1001                 const ec_slave_config_t *sc;
       
  1002                 const ec_sdo_request_t *req;
       
  1003 
       
  1004                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
  1005                     retval = -EFAULT;
       
  1006                     break;
       
  1007                 }
       
  1008                 
       
  1009                 if (!(sc = ec_master_get_config_const(
       
  1010                                 master, data.config_index))) {
       
  1011                     EC_ERR("Slave config %u does not exist!\n",
       
  1012                             data.config_index);
       
  1013                     retval = -EINVAL;
       
  1014                     break;
       
  1015                 }
       
  1016 
       
  1017                 if (!(req = ec_slave_config_get_sdo_by_pos_const(
       
  1018                                 sc, data.sdo_pos))) {
       
  1019                     EC_ERR("Invalid Sdo position!\n");
       
  1020                     retval = -EINVAL;
       
  1021                     break;
       
  1022                 }
       
  1023 
       
  1024                 data.index = req->index;
       
  1025                 data.subindex = req->subindex;
       
  1026                 data.size = req->data_size;
       
  1027                 memcpy(&data.data, req->data, min((u32) data.size, (u32) 4));
       
  1028 
       
  1029                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
       
  1030                     retval = -EFAULT;
       
  1031                     break;
       
  1032                 }
       
  1033                 break;
       
  1034             }
       
  1035 
   856         default:
  1036         default:
   857             retval = -ENOTTY;
  1037             retval = -ENOTTY;
   858     }
  1038     }
   859 
  1039 
   860     return retval;
  1040     return retval;