master/cdev.c
changeset 999 14307580deb6
parent 990 4f223f3df05a
child 1001 a8eab75aa8e3
equal deleted inserted replaced
998:05a24788f3b2 999:14307580deb6
   158                 memcpy(data.devices[1].address, master->backup_mac, ETH_ALEN); 
   158                 memcpy(data.devices[1].address, master->backup_mac, ETH_ALEN); 
   159                 data.devices[1].attached = master->backup_device.dev ? 1 : 0;
   159                 data.devices[1].attached = master->backup_device.dev ? 1 : 0;
   160                 data.devices[1].tx_count = master->backup_device.tx_count;
   160                 data.devices[1].tx_count = master->backup_device.tx_count;
   161                 data.devices[1].rx_count = master->backup_device.rx_count;
   161                 data.devices[1].rx_count = master->backup_device.rx_count;
   162 
   162 
   163                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   163                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   164                     retval = -EFAULT;
   164                     retval = -EFAULT;
   165                     break;
   165                 break;
   166                 }
   166             }
   167 
       
   168                 break;
       
   169             }
       
   170 
       
   171             retval = master->slave_count;
       
   172             break;
       
   173 
   167 
   174         case EC_IOCTL_SLAVE:
   168         case EC_IOCTL_SLAVE:
   175             {
   169             {
   176                 ec_ioctl_slave_t data;
   170                 ec_ioctl_slave_t data;
   177                 const ec_slave_t *slave;
   171                 const ec_slave_t *slave;
   215                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   209                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   216                 } else {
   210                 } else {
   217                     data.name[0] = 0;
   211                     data.name[0] = 0;
   218                 }
   212                 }
   219 
   213 
   220                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   214                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   221                     retval = -EFAULT;
   215                     retval = -EFAULT;
   222                     break;
       
   223                 }
       
   224 
       
   225                 break;
   216                 break;
   226             }
   217             }
   227 
   218 
   228         case EC_IOCTL_SYNC:
   219         case EC_IOCTL_SYNC:
   229             {
   220             {
   257                 data.control_register = sync->control_register;
   248                 data.control_register = sync->control_register;
   258                 data.enable = sync->enable;
   249                 data.enable = sync->enable;
   259                 data.assign_source = sync->assign_source;
   250                 data.assign_source = sync->assign_source;
   260                 data.pdo_count = ec_pdo_list_count(&sync->pdos);
   251                 data.pdo_count = ec_pdo_list_count(&sync->pdos);
   261 
   252 
   262                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   253                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   263                     retval = -EFAULT;
   254                     retval = -EFAULT;
   264                     break;
       
   265                 }
       
   266                 break;
   255                 break;
   267             }
   256             }
   268 
   257 
   269         case EC_IOCTL_PDO:
   258         case EC_IOCTL_PDO:
   270             {
   259             {
   311                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   300                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   312                 } else {
   301                 } else {
   313                     data.name[0] = 0;
   302                     data.name[0] = 0;
   314                 }
   303                 }
   315 
   304 
   316                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   305                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   317                     retval = -EFAULT;
   306                     retval = -EFAULT;
   318                     break;
       
   319                 }
       
   320                 break;
   307                 break;
   321             }
   308             }
   322 
   309 
   323         case EC_IOCTL_PDO_ENTRY:
   310         case EC_IOCTL_PDO_ENTRY:
   324             {
   311             {
   374                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   361                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   375                 } else {
   362                 } else {
   376                     data.name[0] = 0;
   363                     data.name[0] = 0;
   377                 }
   364                 }
   378 
   365 
   379                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   366                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   380                     retval = -EFAULT;
   367                     retval = -EFAULT;
   381                     break;
       
   382                 }
       
   383                 break;
   368                 break;
   384             }
   369             }
   385 
   370 
   386         case EC_IOCTL_DOMAIN_COUNT:
   371         case EC_IOCTL_DOMAIN_COUNT:
   387             retval = ec_master_domain_count(master);
   372             retval = ec_master_domain_count(master);
   407                 data.logical_base_address = domain->logical_base_address;
   392                 data.logical_base_address = domain->logical_base_address;
   408                 data.working_counter = domain->working_counter;
   393                 data.working_counter = domain->working_counter;
   409                 data.expected_working_counter = domain->expected_working_counter;
   394                 data.expected_working_counter = domain->expected_working_counter;
   410                 data.fmmu_count = ec_domain_fmmu_count(domain);
   395                 data.fmmu_count = ec_domain_fmmu_count(domain);
   411 
   396 
   412                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   397                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   413                     retval = -EFAULT;
   398                     retval = -EFAULT;
   414                     break;
       
   415                 }
       
   416                 break;
   399                 break;
   417             }
   400             }
   418 
   401 
   419         case EC_IOCTL_DOMAIN_FMMU:
   402         case EC_IOCTL_DOMAIN_FMMU:
   420             {
   403             {
   444                 data.slave_config_position = fmmu->sc->position;
   427                 data.slave_config_position = fmmu->sc->position;
   445                 data.fmmu_dir = fmmu->dir;
   428                 data.fmmu_dir = fmmu->dir;
   446                 data.logical_address = fmmu->logical_start_address;
   429                 data.logical_address = fmmu->logical_start_address;
   447                 data.data_size = fmmu->data_size;
   430                 data.data_size = fmmu->data_size;
   448 
   431 
   449                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   432                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   450                     retval = -EFAULT;
   433                     retval = -EFAULT;
   451                     break;
       
   452                 }
       
   453                 break;
   434                 break;
   454             }
   435             }
   455 
   436 
   456         case EC_IOCTL_DATA:
   437         case EC_IOCTL_DATA:
   457             {
   438             {
   475                     retval = -EFAULT;
   456                     retval = -EFAULT;
   476                     break;
   457                     break;
   477                 }
   458                 }
   478 
   459 
   479                 if (copy_to_user((void __user *) data.target, domain->data,
   460                 if (copy_to_user((void __user *) data.target, domain->data,
   480                             domain->data_size)) {
   461                             domain->data_size))
   481                     retval = -EFAULT;
   462                     retval = -EFAULT;
   482                     break;
       
   483                 }
       
   484                 break;
   463                 break;
   485             }
   464             }
   486 
   465 
   487         case EC_IOCTL_SET_DEBUG:
   466         case EC_IOCTL_SET_DEBUG:
   488             if (!(filp->f_mode & FMODE_WRITE))
   467             if (!(filp->f_mode & FMODE_WRITE))
   489                 return -EPERM;
   468                 return -EPERM;
   490             if (ec_master_debug_level(master, (unsigned int) arg)) {
   469             if (ec_master_debug_level(master, (unsigned int) arg))
   491                 retval = -EINVAL;
   470                 retval = -EINVAL;
   492             }
       
   493             break;
   471             break;
   494 
   472 
   495         case EC_IOCTL_SLAVE_STATE:
   473         case EC_IOCTL_SLAVE_STATE:
   496             {
   474             {
   497                 ec_ioctl_slave_state_t data;
   475                 ec_ioctl_slave_state_t data;
   550                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   528                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   551                 } else {
   529                 } else {
   552                     data.name[0] = 0;
   530                     data.name[0] = 0;
   553                 }
   531                 }
   554 
   532 
   555                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   533                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   556                     retval = -EFAULT;
   534                     retval = -EFAULT;
   557                     break;
       
   558                 }
       
   559                 break;
   535                 break;
   560             }
   536             }
   561 
   537 
   562         case EC_IOCTL_SDO_ENTRY:
   538         case EC_IOCTL_SDO_ENTRY:
   563             {
   539             {
   615                         = 0;
   591                         = 0;
   616                 } else {
   592                 } else {
   617                     data.description[0] = 0;
   593                     data.description[0] = 0;
   618                 }
   594                 }
   619 
   595 
   620                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   596                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   621                     retval = -EFAULT;
   597                     retval = -EFAULT;
   622                     break;
       
   623                 }
       
   624                 break;
   598                 break;
   625             }
   599             }
   626 
   600 
   627         case EC_IOCTL_SDO_UPLOAD:
   601         case EC_IOCTL_SDO_UPLOAD:
   628             {
   602             {
   796                     retval = -EINVAL;
   770                     retval = -EINVAL;
   797                     break;
   771                     break;
   798                 }
   772                 }
   799 
   773 
   800                 if (copy_to_user((void __user *) data.words,
   774                 if (copy_to_user((void __user *) data.words,
   801                             slave->sii_words + data.offset, data.nwords * 2)) {
   775                             slave->sii_words + data.offset, data.nwords * 2))
   802                     retval = -EFAULT;
   776                     retval = -EFAULT;
   803                     break;
       
   804                 }
       
   805                 break;
   777                 break;
   806             }
   778             }
   807 
   779 
   808         case EC_IOCTL_SII_WRITE:
   780         case EC_IOCTL_SII_WRITE:
   809             {
   781             {
   841                     kfree(words);
   813                     kfree(words);
   842                     break;
   814                     break;
   843                 }
   815                 }
   844 
   816 
   845                 if (ec_slave_write_sii(slave,
   817                 if (ec_slave_write_sii(slave,
   846                             data.offset, data.nwords, words)) {
   818                             data.offset, data.nwords, words))
   847                     retval = -EIO;
   819                     retval = -EIO;
   848                     kfree(words);
       
   849                     break;
       
   850                 }
       
   851 
   820 
   852                 kfree(words);
   821                 kfree(words);
   853                 break;
   822                 break;
   854             }
   823             }
   855 
   824 
   880                 data.pdo_count[EC_DIR_INPUT] =
   849                 data.pdo_count[EC_DIR_INPUT] =
   881                     ec_pdo_list_count(&sc->pdos[EC_DIR_INPUT]);
   850                     ec_pdo_list_count(&sc->pdos[EC_DIR_INPUT]);
   882                 data.sdo_count = ec_slave_config_sdo_count(sc);
   851                 data.sdo_count = ec_slave_config_sdo_count(sc);
   883                 data.attached = sc->slave != NULL;
   852                 data.attached = sc->slave != NULL;
   884 
   853 
   885                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   854                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   886                     retval = -EFAULT;
   855                     retval = -EFAULT;
   887                     break;
       
   888                 }
       
   889                 break;
   856                 break;
   890             }
   857             }
   891 
   858 
   892         case EC_IOCTL_CONFIG_PDO:
   859         case EC_IOCTL_CONFIG_PDO:
   893             {
   860             {
   929                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   896                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   930                 } else {
   897                 } else {
   931                     data.name[0] = 0;
   898                     data.name[0] = 0;
   932                 }
   899                 }
   933 
   900 
   934                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   901                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   935                     retval = -EFAULT;
   902                     retval = -EFAULT;
   936                     break;
       
   937                 }
       
   938                 break;
   903                 break;
   939             }
   904             }
   940 
   905 
   941         case EC_IOCTL_CONFIG_PDO_ENTRY:
   906         case EC_IOCTL_CONFIG_PDO_ENTRY:
   942             {
   907             {
   986                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   951                     data.name[EC_IOCTL_STRING_SIZE - 1] = 0;
   987                 } else {
   952                 } else {
   988                     data.name[0] = 0;
   953                     data.name[0] = 0;
   989                 }
   954                 }
   990 
   955 
   991                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   956                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
   992                     retval = -EFAULT;
   957                     retval = -EFAULT;
   993                     break;
       
   994                 }
       
   995                 break;
   958                 break;
   996             }
   959             }
   997 
   960 
   998         case EC_IOCTL_CONFIG_SDO:
   961         case EC_IOCTL_CONFIG_SDO:
   999             {
   962             {
  1024                 data.index = req->index;
   987                 data.index = req->index;
  1025                 data.subindex = req->subindex;
   988                 data.subindex = req->subindex;
  1026                 data.size = req->data_size;
   989                 data.size = req->data_size;
  1027                 memcpy(&data.data, req->data, min((u32) data.size, (u32) 4));
   990                 memcpy(&data.data, req->data, min((u32) data.size, (u32) 4));
  1028 
   991 
  1029                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
   992                 if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1030                     retval = -EFAULT;
   993                     retval = -EFAULT;
  1031                     break;
       
  1032                 }
       
  1033                 break;
   994                 break;
  1034             }
   995             }
  1035 
   996 
  1036         default:
   997         default:
  1037             retval = -ENOTTY;
   998             retval = -ENOTTY;