master/cdev.c
changeset 1989 6aa393418fb3
parent 1984 02c8728bf9e4
parent 1922 99905e297f33
child 1995 7d748d9cf9e8
equal deleted inserted replaced
1988:ea38efeeb7b3 1989:6aa393418fb3
   121     cdev->cdev.owner = THIS_MODULE;
   121     cdev->cdev.owner = THIS_MODULE;
   122 
   122 
   123     ret = cdev_add(&cdev->cdev,
   123     ret = cdev_add(&cdev->cdev,
   124             MKDEV(MAJOR(dev_num), master->index), 1);
   124             MKDEV(MAJOR(dev_num), master->index), 1);
   125     if (ret) {
   125     if (ret) {
   126         EC_ERR("Failed to add character device!\n");
   126         EC_MASTER_ERR(master, "Failed to add character device!\n");
   127     }
   127     }
   128 
   128 
   129     return ret;
   129     return ret;
   130 }
   130 }
   131 
   131 
   275         return -EINTR;
   275         return -EINTR;
   276 
   276 
   277     if (!(slave = ec_master_find_slave_const(
   277     if (!(slave = ec_master_find_slave_const(
   278                     master, 0, data.position))) {
   278                     master, 0, data.position))) {
   279         up(&master->master_sem);
   279         up(&master->master_sem);
   280         EC_ERR("Slave %u does not exist!\n", data.position);
   280         EC_MASTER_ERR(master, "Slave %u does not exist!\n", data.position);
   281         return -EINVAL;
   281         return -EINVAL;
   282     }
   282     }
   283 
   283 
   284     data.vendor_id = slave->sii.vendor_id;
   284     data.vendor_id = slave->sii.vendor_id;
   285     data.product_code = slave->sii.product_code;
   285     data.product_code = slave->sii.product_code;
   359         return -EINTR;
   359         return -EINTR;
   360 
   360 
   361     if (!(slave = ec_master_find_slave_const(
   361     if (!(slave = ec_master_find_slave_const(
   362                     master, 0, data.slave_position))) {
   362                     master, 0, data.slave_position))) {
   363         up(&master->master_sem);
   363         up(&master->master_sem);
   364         EC_ERR("Slave %u does not exist!\n", data.slave_position);
   364         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
   365                 data.slave_position);
   365         return -EINVAL;
   366         return -EINVAL;
   366     }
   367     }
   367 
   368 
   368     if (data.sync_index >= slave->sii.sync_count) {
   369     if (data.sync_index >= slave->sii.sync_count) {
   369         up(&master->master_sem);
   370         up(&master->master_sem);
   370         EC_ERR("Sync manager %u does not exist in slave %u!\n",
   371         EC_SLAVE_ERR(slave, "Sync manager %u does not exist!\n",
   371                 data.sync_index, data.slave_position);
   372                 data.sync_index);
   372         return -EINVAL;
   373         return -EINVAL;
   373     }
   374     }
   374 
   375 
   375     sync = &slave->sii.syncs[data.sync_index];
   376     sync = &slave->sii.syncs[data.sync_index];
   376 
   377 
   410         return -EINTR;
   411         return -EINTR;
   411 
   412 
   412     if (!(slave = ec_master_find_slave_const(
   413     if (!(slave = ec_master_find_slave_const(
   413                     master, 0, data.slave_position))) {
   414                     master, 0, data.slave_position))) {
   414         up(&master->master_sem);
   415         up(&master->master_sem);
   415         EC_ERR("Slave %u does not exist!\n", data.slave_position);
   416         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
   417                 data.slave_position);
   416         return -EINVAL;
   418         return -EINVAL;
   417     }
   419     }
   418 
   420 
   419     if (data.sync_index >= slave->sii.sync_count) {
   421     if (data.sync_index >= slave->sii.sync_count) {
   420         up(&master->master_sem);
   422         up(&master->master_sem);
   421         EC_ERR("Sync manager %u does not exist in slave %u!\n",
   423         EC_SLAVE_ERR(slave, "Sync manager %u does not exist!\n",
   422                 data.sync_index, data.slave_position);
   424                 data.sync_index);
   423         return -EINVAL;
   425         return -EINVAL;
   424     }
   426     }
   425 
   427 
   426     sync = &slave->sii.syncs[data.sync_index];
   428     sync = &slave->sii.syncs[data.sync_index];
   427     if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
   429     if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
   428                     &sync->pdos, data.pdo_pos))) {
   430                     &sync->pdos, data.pdo_pos))) {
   429         up(&master->master_sem);
   431         up(&master->master_sem);
   430         EC_ERR("Sync manager %u does not contain a PDO with "
   432         EC_SLAVE_ERR(slave, "Sync manager %u does not contain a PDO with "
   431                 "position %u in slave %u!\n", data.sync_index,
   433                 "position %u!\n", data.sync_index, data.pdo_pos);
   432                 data.pdo_pos, data.slave_position);
       
   433         return -EINVAL;
   434         return -EINVAL;
   434     }
   435     }
   435 
   436 
   436     data.index = pdo->index;
   437     data.index = pdo->index;
   437     data.entry_count = ec_pdo_entry_count(pdo);
   438     data.entry_count = ec_pdo_entry_count(pdo);
   468         return -EINTR;
   469         return -EINTR;
   469 
   470 
   470     if (!(slave = ec_master_find_slave_const(
   471     if (!(slave = ec_master_find_slave_const(
   471                     master, 0, data.slave_position))) {
   472                     master, 0, data.slave_position))) {
   472         up(&master->master_sem);
   473         up(&master->master_sem);
   473         EC_ERR("Slave %u does not exist!\n", data.slave_position);
   474         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
   475                 data.slave_position);
   474         return -EINVAL;
   476         return -EINVAL;
   475     }
   477     }
   476 
   478 
   477     if (data.sync_index >= slave->sii.sync_count) {
   479     if (data.sync_index >= slave->sii.sync_count) {
   478         up(&master->master_sem);
   480         up(&master->master_sem);
   479         EC_ERR("Sync manager %u does not exist in slave %u!\n",
   481         EC_SLAVE_ERR(slave, "Sync manager %u does not exist!\n",
   480                 data.sync_index, data.slave_position);
   482                 data.sync_index);
   481         return -EINVAL;
   483         return -EINVAL;
   482     }
   484     }
   483 
   485 
   484     sync = &slave->sii.syncs[data.sync_index];
   486     sync = &slave->sii.syncs[data.sync_index];
   485     if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
   487     if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
   486                     &sync->pdos, data.pdo_pos))) {
   488                     &sync->pdos, data.pdo_pos))) {
   487         up(&master->master_sem);
   489         up(&master->master_sem);
   488         EC_ERR("Sync manager %u does not contain a PDO with "
   490         EC_SLAVE_ERR(slave, "Sync manager %u does not contain a PDO with "
   489                 "position %u in slave %u!\n", data.sync_index,
   491                 "position %u!\n", data.sync_index, data.pdo_pos);
   490                 data.pdo_pos, data.slave_position);
       
   491         return -EINVAL;
   492         return -EINVAL;
   492     }
   493     }
   493 
   494 
   494     if (!(entry = ec_pdo_find_entry_by_pos_const(
   495     if (!(entry = ec_pdo_find_entry_by_pos_const(
   495                     pdo, data.entry_pos))) {
   496                     pdo, data.entry_pos))) {
   496         up(&master->master_sem);
   497         up(&master->master_sem);
   497         EC_ERR("PDO 0x%04X does not contain an entry with "
   498         EC_SLAVE_ERR(slave, "PDO 0x%04X does not contain an entry with "
   498                 "position %u in slave %u!\n", data.pdo_pos,
   499                 "position %u!\n", data.pdo_pos, data.entry_pos);
   499                 data.entry_pos, data.slave_position);
       
   500         return -EINVAL;
   500         return -EINVAL;
   501     }
   501     }
   502 
   502 
   503     data.index = entry->index;
   503     data.index = entry->index;
   504     data.subindex = entry->subindex;
   504     data.subindex = entry->subindex;
   532     if (down_interruptible(&master->master_sem))
   532     if (down_interruptible(&master->master_sem))
   533         return -EINTR;
   533         return -EINTR;
   534 
   534 
   535     if (!(domain = ec_master_find_domain_const(master, data.index))) {
   535     if (!(domain = ec_master_find_domain_const(master, data.index))) {
   536         up(&master->master_sem);
   536         up(&master->master_sem);
   537         EC_ERR("Domain %u does not exist!\n", data.index);
   537         EC_MASTER_ERR(master, "Domain %u does not exist!\n", data.index);
   538         return -EINVAL;
   538         return -EINVAL;
   539     }
   539     }
   540 
   540 
   541     data.data_size = domain->data_size;
   541     data.data_size = domain->data_size;
   542     data.tx_size = domain->tx_size;
   542     data.tx_size = domain->tx_size;
   573     if (down_interruptible(&master->master_sem))
   573     if (down_interruptible(&master->master_sem))
   574         return -EINTR;
   574         return -EINTR;
   575 
   575 
   576     if (!(domain = ec_master_find_domain_const(master, data.domain_index))) {
   576     if (!(domain = ec_master_find_domain_const(master, data.domain_index))) {
   577         up(&master->master_sem);
   577         up(&master->master_sem);
   578         EC_ERR("Domain %u does not exist!\n", data.domain_index);
   578         EC_MASTER_ERR(master, "Domain %u does not exist!\n",
       
   579                 data.domain_index);
   579         return -EINVAL;
   580         return -EINVAL;
   580     }
   581     }
   581 
   582 
   582     if (!(fmmu = ec_domain_find_fmmu(domain, data.fmmu_index))) {
   583     if (!(fmmu = ec_domain_find_fmmu(domain, data.fmmu_index))) {
   583         up(&master->master_sem);
   584         up(&master->master_sem);
   584         EC_ERR("Domain %u has less than %u fmmu configurations.\n",
   585         EC_MASTER_ERR(master, "Domain %u has less than %u"
       
   586                 " fmmu configurations.\n",
   585                 data.domain_index, data.fmmu_index + 1);
   587                 data.domain_index, data.fmmu_index + 1);
   586         return -EINVAL;
   588         return -EINVAL;
   587     }
   589     }
   588 
   590 
   589     data.slave_config_alias = fmmu->sc->alias;
   591     data.slave_config_alias = fmmu->sc->alias;
   621     if (down_interruptible(&master->master_sem))
   623     if (down_interruptible(&master->master_sem))
   622         return -EINTR;
   624         return -EINTR;
   623 
   625 
   624     if (!(domain = ec_master_find_domain_const(master, data.domain_index))) {
   626     if (!(domain = ec_master_find_domain_const(master, data.domain_index))) {
   625         up(&master->master_sem);
   627         up(&master->master_sem);
   626         EC_ERR("Domain %u does not exist!\n", data.domain_index);
   628         EC_MASTER_ERR(master, "Domain %u does not exist!\n",
       
   629                 data.domain_index);
   627         return -EINVAL;
   630         return -EINVAL;
   628     }
   631     }
   629 
   632 
   630     if (domain->data_size != data.data_size) {
   633     if (domain->data_size != data.data_size) {
   631         up(&master->master_sem);
   634         up(&master->master_sem);
   632         EC_ERR("Data size mismatch %u/%zu!\n",
   635         EC_MASTER_ERR(master, "Data size mismatch %u/%zu!\n",
   633                 data.data_size, domain->data_size);
   636                 data.data_size, domain->data_size);
   634         return -EFAULT;
   637         return -EFAULT;
   635     }
   638     }
   636 
   639 
   637     if (copy_to_user((void __user *) data.target, domain->data,
   640     if (copy_to_user((void __user *) data.target, domain->data,
   676         return -EINTR;
   679         return -EINTR;
   677 
   680 
   678     if (!(slave = ec_master_find_slave(
   681     if (!(slave = ec_master_find_slave(
   679                     master, 0, data.slave_position))) {
   682                     master, 0, data.slave_position))) {
   680         up(&master->master_sem);
   683         up(&master->master_sem);
   681         EC_ERR("Slave %u does not exist!\n", data.slave_position);
   684         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
   685                 data.slave_position);
   682         return -EINVAL;
   686         return -EINVAL;
   683     }
   687     }
   684 
   688 
   685     ec_slave_request_state(slave, data.al_state);
   689     ec_slave_request_state(slave, data.al_state);
   686 
   690 
   709         return -EINTR;
   713         return -EINTR;
   710 
   714 
   711     if (!(slave = ec_master_find_slave_const(
   715     if (!(slave = ec_master_find_slave_const(
   712                     master, 0, data.slave_position))) {
   716                     master, 0, data.slave_position))) {
   713         up(&master->master_sem);
   717         up(&master->master_sem);
   714         EC_ERR("Slave %u does not exist!\n", data.slave_position);
   718         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
   719                 data.slave_position);
   715         return -EINVAL;
   720         return -EINVAL;
   716     }
   721     }
   717 
   722 
   718     if (!(sdo = ec_slave_get_sdo_by_pos_const(
   723     if (!(sdo = ec_slave_get_sdo_by_pos_const(
   719                     slave, data.sdo_position))) {
   724                     slave, data.sdo_position))) {
   720         up(&master->master_sem);
   725         up(&master->master_sem);
   721         EC_ERR("SDO %u does not exist in slave %u!\n",
   726         EC_SLAVE_ERR(slave, "SDO %u does not exist!\n", data.sdo_position);
   722                 data.sdo_position, data.slave_position);
       
   723         return -EINVAL;
   727         return -EINVAL;
   724     }
   728     }
   725 
   729 
   726     data.sdo_index = sdo->index;
   730     data.sdo_index = sdo->index;
   727     data.max_subindex = sdo->max_subindex;
   731     data.max_subindex = sdo->max_subindex;
   757         return -EINTR;
   761         return -EINTR;
   758 
   762 
   759     if (!(slave = ec_master_find_slave_const(
   763     if (!(slave = ec_master_find_slave_const(
   760                     master, 0, data.slave_position))) {
   764                     master, 0, data.slave_position))) {
   761         up(&master->master_sem);
   765         up(&master->master_sem);
   762         EC_ERR("Slave %u does not exist!\n", data.slave_position);
   766         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
   767                 data.slave_position);
   763         return -EINVAL;
   768         return -EINVAL;
   764     }
   769     }
   765 
   770 
   766     if (data.sdo_spec <= 0) {
   771     if (data.sdo_spec <= 0) {
   767         if (!(sdo = ec_slave_get_sdo_by_pos_const(
   772         if (!(sdo = ec_slave_get_sdo_by_pos_const(
   768                         slave, -data.sdo_spec))) {
   773                         slave, -data.sdo_spec))) {
   769             up(&master->master_sem);
   774             up(&master->master_sem);
   770             EC_ERR("SDO %u does not exist in slave %u!\n",
   775             EC_SLAVE_ERR(slave, "SDO %u does not exist!\n", -data.sdo_spec);
   771                     -data.sdo_spec, data.slave_position);
       
   772             return -EINVAL;
   776             return -EINVAL;
   773         }
   777         }
   774     } else {
   778     } else {
   775         if (!(sdo = ec_slave_get_sdo_const(
   779         if (!(sdo = ec_slave_get_sdo_const(
   776                         slave, data.sdo_spec))) {
   780                         slave, data.sdo_spec))) {
   777             up(&master->master_sem);
   781             up(&master->master_sem);
   778             EC_ERR("SDO 0x%04X does not exist in slave %u!\n",
   782             EC_SLAVE_ERR(slave, "SDO 0x%04X does not exist!\n",
   779                     data.sdo_spec, data.slave_position);
   783                     data.sdo_spec);
   780             return -EINVAL;
   784             return -EINVAL;
   781         }
   785         }
   782     }
   786     }
   783 
   787 
   784     if (!(entry = ec_sdo_get_entry_const(
   788     if (!(entry = ec_sdo_get_entry_const(
   785                     sdo, data.sdo_entry_subindex))) {
   789                     sdo, data.sdo_entry_subindex))) {
   786         up(&master->master_sem);
   790         up(&master->master_sem);
   787         EC_ERR("SDO entry 0x%04X:%02X does not exist "
   791         EC_SLAVE_ERR(slave, "SDO entry 0x%04X:%02X does not exist!\n",
   788                 "in slave %u!\n", sdo->index,
   792                 sdo->index, data.sdo_entry_subindex);
   789                 data.sdo_entry_subindex, data.slave_position);
       
   790         return -EINVAL;
   793         return -EINVAL;
   791     }
   794     }
   792 
   795 
   793     data.data_type = entry->data_type;
   796     data.data_type = entry->data_type;
   794     data.bit_length = entry->bit_length;
   797     data.bit_length = entry->bit_length;
   841 
   844 
   842     if (!(request.slave = ec_master_find_slave(
   845     if (!(request.slave = ec_master_find_slave(
   843                     master, 0, data.slave_position))) {
   846                     master, 0, data.slave_position))) {
   844         up(&master->master_sem);
   847         up(&master->master_sem);
   845         ec_sdo_request_clear(&request.req);
   848         ec_sdo_request_clear(&request.req);
   846         EC_ERR("Slave %u does not exist!\n", data.slave_position);
   849         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
   847         return -EINVAL;
   850                 data.slave_position);
   848     }
   851         return -EINVAL;
   849 
   852     }
   850     if (master->debug_level)
   853 
   851         EC_DBG("Schedule SDO upload request for slave %u\n",
   854     EC_SLAVE_DBG(request.slave, 1, "Schedule SDO upload request.\n");
   852                 request.slave->ring_position);
   855 
   853     // schedule request.
   856     // schedule request.
   854     list_add_tail(&request.list, &request.slave->slave_sdo_requests);
   857     list_add_tail(&request.list, &request.slave->slave_sdo_requests);
   855 
   858 
   856     up(&master->master_sem);
   859     up(&master->master_sem);
   857 
   860 
   872 
   875 
   873     // wait until master FSM has finished processing
   876     // wait until master FSM has finished processing
   874     wait_event(request.slave->sdo_queue,
   877     wait_event(request.slave->sdo_queue,
   875             request.req.state != EC_INT_REQUEST_BUSY);
   878             request.req.state != EC_INT_REQUEST_BUSY);
   876 
   879 
   877     if (master->debug_level)
   880     EC_SLAVE_DBG(request.slave, 1, "Finished SDO upload request.\n");
   878         EC_DBG("Scheduled SDO upload request for slave %u done\n",
       
   879                 request.slave->ring_position);
       
   880 
   881 
   881     data.abort_code = request.req.abort_code;
   882     data.abort_code = request.req.abort_code;
   882 
   883 
   883     if (request.req.state != EC_INT_REQUEST_SUCCESS) {
   884     if (request.req.state != EC_INT_REQUEST_SUCCESS) {
   884         data.data_size = 0;
   885         data.data_size = 0;
   885         retval = -EIO;
   886         retval = -EIO;
   886     } else {
   887     } else {
   887         if (request.req.data_size > data.target_size) {
   888         if (request.req.data_size > data.target_size) {
   888             EC_ERR("Buffer too small.\n");
   889             EC_MASTER_ERR(master, "Buffer too small.\n");
   889             ec_sdo_request_clear(&request.req);
   890             ec_sdo_request_clear(&request.req);
   890             return -EOVERFLOW;
   891             return -EOVERFLOW;
   891         }
   892         }
   892         data.data_size = request.req.data_size;
   893         data.data_size = request.req.data_size;
   893 
   894 
   924         return -EFAULT;
   925         return -EFAULT;
   925     }
   926     }
   926 
   927 
   927     // copy data to download
   928     // copy data to download
   928     if (!data.data_size) {
   929     if (!data.data_size) {
   929         EC_ERR("Zero data size!\n");
   930         EC_MASTER_ERR(master, "Zero data size!\n");
   930         return -EINVAL;
   931         return -EINVAL;
   931     }
   932     }
   932 
   933 
   933     ec_sdo_request_init(&request.req);
   934     ec_sdo_request_init(&request.req);
   934     ec_sdo_request_address(&request.req,
   935     ec_sdo_request_address(&request.req,
   949         return -EINTR;
   950         return -EINTR;
   950 
   951 
   951     if (!(request.slave = ec_master_find_slave(
   952     if (!(request.slave = ec_master_find_slave(
   952                     master, 0, data.slave_position))) {
   953                     master, 0, data.slave_position))) {
   953         up(&master->master_sem);
   954         up(&master->master_sem);
   954         EC_ERR("Slave %u does not exist!\n", data.slave_position);
   955         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
   956                 data.slave_position);
   955         ec_sdo_request_clear(&request.req);
   957         ec_sdo_request_clear(&request.req);
   956         return -EINVAL;
   958         return -EINVAL;
   957     }
   959     }
   958     
   960     
   959     if (master->debug_level)
   961     EC_SLAVE_DBG(request.slave, 1, "Schedule SDO download request.\n");
   960         EC_DBG("Schedule SDO download request for slave %u\n",
   962 
   961                 request.slave->ring_position);
       
   962     // schedule request.
   963     // schedule request.
   963     list_add_tail(&request.list, &request.slave->slave_sdo_requests);
   964     list_add_tail(&request.list, &request.slave->slave_sdo_requests);
   964 
   965 
   965     up(&master->master_sem);
   966     up(&master->master_sem);
   966 
   967 
   981 
   982 
   982     // wait until master FSM has finished processing
   983     // wait until master FSM has finished processing
   983     wait_event(request.slave->sdo_queue,
   984     wait_event(request.slave->sdo_queue,
   984             request.req.state != EC_INT_REQUEST_BUSY);
   985             request.req.state != EC_INT_REQUEST_BUSY);
   985 
   986 
   986     if (master->debug_level)
   987     EC_SLAVE_DBG(request.slave, 1, "Finished SDO download request.\n");
   987         EC_DBG("Scheduled SDO download request for slave %u done\n",
       
   988                 request.slave->ring_position);
       
   989 
   988 
   990     data.abort_code = request.req.abort_code;
   989     data.abort_code = request.req.abort_code;
   991 
   990 
   992     retval = request.req.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
   991     retval = request.req.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
   993 
   992 
  1020         return -EINTR;
  1019         return -EINTR;
  1021 
  1020 
  1022     if (!(slave = ec_master_find_slave_const(
  1021     if (!(slave = ec_master_find_slave_const(
  1023                     master, 0, data.slave_position))) {
  1022                     master, 0, data.slave_position))) {
  1024         up(&master->master_sem);
  1023         up(&master->master_sem);
  1025         EC_ERR("Slave %u does not exist!\n", data.slave_position);
  1024         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  1025                 data.slave_position);
  1026         return -EINVAL;
  1026         return -EINVAL;
  1027     }
  1027     }
  1028 
  1028 
  1029     if (!data.nwords
  1029     if (!data.nwords
  1030             || data.offset + data.nwords > slave->sii_nwords) {
  1030             || data.offset + data.nwords > slave->sii_nwords) {
  1031         up(&master->master_sem);
  1031         up(&master->master_sem);
  1032         EC_ERR("Invalid SII read offset/size %u/%u for slave "
  1032         EC_SLAVE_ERR(slave, "Invalid SII read offset/size %u/%u for slave SII"
  1033                 "SII size %zu!\n", data.offset,
  1033                 " size %zu!\n", data.offset, data.nwords, slave->sii_nwords);
  1034                 data.nwords, slave->sii_nwords);
       
  1035         return -EINVAL;
  1034         return -EINVAL;
  1036     }
  1035     }
  1037 
  1036 
  1038     if (copy_to_user((void __user *) data.words,
  1037     if (copy_to_user((void __user *) data.words,
  1039                 slave->sii_words + data.offset, data.nwords * 2))
  1038                 slave->sii_words + data.offset, data.nwords * 2))
  1067     if (!data.nwords)
  1066     if (!data.nwords)
  1068         return 0;
  1067         return 0;
  1069 
  1068 
  1070     byte_size = sizeof(uint16_t) * data.nwords;
  1069     byte_size = sizeof(uint16_t) * data.nwords;
  1071     if (!(words = kmalloc(byte_size, GFP_KERNEL))) {
  1070     if (!(words = kmalloc(byte_size, GFP_KERNEL))) {
  1072         EC_ERR("Failed to allocate %u bytes for SII contents.\n",
  1071         EC_MASTER_ERR(master, "Failed to allocate %u bytes"
  1073                 byte_size);
  1072                 " for SII contents.\n", byte_size);
  1074         return -ENOMEM;
  1073         return -ENOMEM;
  1075     }
  1074     }
  1076 
  1075 
  1077     if (copy_from_user(words,
  1076     if (copy_from_user(words,
  1078                 (void __user *) data.words, byte_size)) {
  1077                 (void __user *) data.words, byte_size)) {
  1084         return -EINTR;
  1083         return -EINTR;
  1085 
  1084 
  1086     if (!(slave = ec_master_find_slave(
  1085     if (!(slave = ec_master_find_slave(
  1087                     master, 0, data.slave_position))) {
  1086                     master, 0, data.slave_position))) {
  1088         up(&master->master_sem);
  1087         up(&master->master_sem);
  1089         EC_ERR("Slave %u does not exist!\n", data.slave_position);
  1088         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  1089                 data.slave_position);
  1090         kfree(words);
  1090         kfree(words);
  1091         return -EINVAL;
  1091         return -EINVAL;
  1092     }
  1092     }
  1093 
  1093 
  1094     // init SII write request
  1094     // init SII write request
  1147 
  1147 
  1148     if (!data.length)
  1148     if (!data.length)
  1149         return 0;
  1149         return 0;
  1150 
  1150 
  1151     if (!(contents = kmalloc(data.length, GFP_KERNEL))) {
  1151     if (!(contents = kmalloc(data.length, GFP_KERNEL))) {
  1152         EC_ERR("Failed to allocate %u bytes for register data.\n",
  1152         EC_MASTER_ERR(master, "Failed to allocate %u bytes"
  1153                 data.length);
  1153                 " for register data.\n", data.length);
  1154         return -ENOMEM;
  1154         return -ENOMEM;
  1155     }
  1155     }
  1156 
  1156 
  1157     if (down_interruptible(&master->master_sem))
  1157     if (down_interruptible(&master->master_sem))
  1158         return -EINTR;
  1158         return -EINTR;
  1159 
  1159 
  1160     if (!(slave = ec_master_find_slave(
  1160     if (!(slave = ec_master_find_slave(
  1161                     master, 0, data.slave_position))) {
  1161                     master, 0, data.slave_position))) {
  1162         up(&master->master_sem);
  1162         up(&master->master_sem);
  1163         EC_ERR("Slave %u does not exist!\n", data.slave_position);
  1163         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  1164                 data.slave_position);
  1164         return -EINVAL;
  1165         return -EINVAL;
  1165     }
  1166     }
  1166 
  1167 
  1167     // init register request
  1168     // init register request
  1168     INIT_LIST_HEAD(&request.list);
  1169     INIT_LIST_HEAD(&request.list);
  1225 
  1226 
  1226     if (!data.length)
  1227     if (!data.length)
  1227         return 0;
  1228         return 0;
  1228 
  1229 
  1229     if (!(contents = kmalloc(data.length, GFP_KERNEL))) {
  1230     if (!(contents = kmalloc(data.length, GFP_KERNEL))) {
  1230         EC_ERR("Failed to allocate %u bytes for register data.\n",
  1231         EC_MASTER_ERR(master, "Failed to allocate %u bytes"
  1231                 data.length);
  1232                 " for register data.\n", data.length);
  1232         return -ENOMEM;
  1233         return -ENOMEM;
  1233     }
  1234     }
  1234 
  1235 
  1235     if (copy_from_user(contents, (void __user *) data.data, data.length)) {
  1236     if (copy_from_user(contents, (void __user *) data.data, data.length)) {
  1236         kfree(contents);
  1237         kfree(contents);
  1241         return -EINTR;
  1242         return -EINTR;
  1242 
  1243 
  1243     if (!(slave = ec_master_find_slave(
  1244     if (!(slave = ec_master_find_slave(
  1244                     master, 0, data.slave_position))) {
  1245                     master, 0, data.slave_position))) {
  1245         up(&master->master_sem);
  1246         up(&master->master_sem);
  1246         EC_ERR("Slave %u does not exist!\n", data.slave_position);
  1247         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  1248                 data.slave_position);
  1247         kfree(contents);
  1249         kfree(contents);
  1248         return -EINVAL;
  1250         return -EINVAL;
  1249     }
  1251     }
  1250 
  1252 
  1251     // init register request
  1253     // init register request
  1306         return -EINTR;
  1308         return -EINTR;
  1307 
  1309 
  1308     if (!(sc = ec_master_get_config_const(
  1310     if (!(sc = ec_master_get_config_const(
  1309                     master, data.config_index))) {
  1311                     master, data.config_index))) {
  1310         up(&master->master_sem);
  1312         up(&master->master_sem);
  1311         EC_ERR("Slave config %u does not exist!\n",
  1313         EC_MASTER_ERR(master, "Slave config %u does not exist!\n",
  1312                 data.config_index);
  1314                 data.config_index);
  1313         return -EINVAL;
  1315         return -EINVAL;
  1314     }
  1316     }
  1315 
  1317 
  1316     data.alias = sc->alias;
  1318     data.alias = sc->alias;
  1356     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1358     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1357         return -EFAULT;
  1359         return -EFAULT;
  1358     }
  1360     }
  1359 
  1361 
  1360     if (data.sync_index >= EC_MAX_SYNC_MANAGERS) {
  1362     if (data.sync_index >= EC_MAX_SYNC_MANAGERS) {
  1361         EC_ERR("Invalid sync manager index %u!\n",
  1363         EC_MASTER_ERR(master, "Invalid sync manager index %u!\n",
  1362                 data.sync_index);
  1364                 data.sync_index);
  1363         return -EINVAL;
  1365         return -EINVAL;
  1364     }
  1366     }
  1365 
  1367 
  1366     if (down_interruptible(&master->master_sem))
  1368     if (down_interruptible(&master->master_sem))
  1367         return -EINTR;
  1369         return -EINTR;
  1368 
  1370 
  1369     if (!(sc = ec_master_get_config_const(
  1371     if (!(sc = ec_master_get_config_const(
  1370                     master, data.config_index))) {
  1372                     master, data.config_index))) {
  1371         up(&master->master_sem);
  1373         up(&master->master_sem);
  1372         EC_ERR("Slave config %u does not exist!\n",
  1374         EC_MASTER_ERR(master, "Slave config %u does not exist!\n",
  1373                 data.config_index);
  1375                 data.config_index);
  1374         return -EINVAL;
  1376         return -EINVAL;
  1375     }
  1377     }
  1376 
  1378 
  1377     if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
  1379     if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
  1378                     &sc->sync_configs[data.sync_index].pdos,
  1380                     &sc->sync_configs[data.sync_index].pdos,
  1379                     data.pdo_pos))) {
  1381                     data.pdo_pos))) {
  1380         up(&master->master_sem);
  1382         up(&master->master_sem);
  1381         EC_ERR("Invalid PDO position!\n");
  1383         EC_MASTER_ERR(master, "Invalid PDO position!\n");
  1382         return -EINVAL;
  1384         return -EINVAL;
  1383     }
  1385     }
  1384 
  1386 
  1385     data.index = pdo->index;
  1387     data.index = pdo->index;
  1386     data.entry_count = ec_pdo_entry_count(pdo);
  1388     data.entry_count = ec_pdo_entry_count(pdo);
  1411     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1413     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1412         return -EFAULT;
  1414         return -EFAULT;
  1413     }
  1415     }
  1414 
  1416 
  1415     if (data.sync_index >= EC_MAX_SYNC_MANAGERS) {
  1417     if (data.sync_index >= EC_MAX_SYNC_MANAGERS) {
  1416         EC_ERR("Invalid sync manager index %u!\n",
  1418         EC_MASTER_ERR(master, "Invalid sync manager index %u!\n",
  1417                 data.sync_index);
  1419                 data.sync_index);
  1418         return -EINVAL;
  1420         return -EINVAL;
  1419     }
  1421     }
  1420 
  1422 
  1421     if (down_interruptible(&master->master_sem))
  1423     if (down_interruptible(&master->master_sem))
  1422         return -EINTR;
  1424         return -EINTR;
  1423 
  1425 
  1424     if (!(sc = ec_master_get_config_const(
  1426     if (!(sc = ec_master_get_config_const(
  1425                     master, data.config_index))) {
  1427                     master, data.config_index))) {
  1426         up(&master->master_sem);
  1428         up(&master->master_sem);
  1427         EC_ERR("Slave config %u does not exist!\n",
  1429         EC_MASTER_ERR(master, "Slave config %u does not exist!\n",
  1428                 data.config_index);
  1430                 data.config_index);
  1429         return -EINVAL;
  1431         return -EINVAL;
  1430     }
  1432     }
  1431 
  1433 
  1432     if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
  1434     if (!(pdo = ec_pdo_list_find_pdo_by_pos_const(
  1433                     &sc->sync_configs[data.sync_index].pdos,
  1435                     &sc->sync_configs[data.sync_index].pdos,
  1434                     data.pdo_pos))) {
  1436                     data.pdo_pos))) {
  1435         up(&master->master_sem);
  1437         up(&master->master_sem);
  1436         EC_ERR("Invalid PDO position!\n");
  1438         EC_MASTER_ERR(master, "Invalid PDO position!\n");
  1437         return -EINVAL;
  1439         return -EINVAL;
  1438     }
  1440     }
  1439 
  1441 
  1440     if (!(entry = ec_pdo_find_entry_by_pos_const(
  1442     if (!(entry = ec_pdo_find_entry_by_pos_const(
  1441                     pdo, data.entry_pos))) {
  1443                     pdo, data.entry_pos))) {
  1442         up(&master->master_sem);
  1444         up(&master->master_sem);
  1443         EC_ERR("Entry not found!\n");
  1445         EC_MASTER_ERR(master, "Entry not found!\n");
  1444         return -EINVAL;
  1446         return -EINVAL;
  1445     }
  1447     }
  1446 
  1448 
  1447     data.index = entry->index;
  1449     data.index = entry->index;
  1448     data.subindex = entry->subindex;
  1450     data.subindex = entry->subindex;
  1478         return -EINTR;
  1480         return -EINTR;
  1479 
  1481 
  1480     if (!(sc = ec_master_get_config_const(
  1482     if (!(sc = ec_master_get_config_const(
  1481                     master, data.config_index))) {
  1483                     master, data.config_index))) {
  1482         up(&master->master_sem);
  1484         up(&master->master_sem);
  1483         EC_ERR("Slave config %u does not exist!\n",
  1485         EC_MASTER_ERR(master, "Slave config %u does not exist!\n",
  1484                 data.config_index);
  1486                 data.config_index);
  1485         return -EINVAL;
  1487         return -EINVAL;
  1486     }
  1488     }
  1487 
  1489 
  1488     if (!(req = ec_slave_config_get_sdo_by_pos_const(
  1490     if (!(req = ec_slave_config_get_sdo_by_pos_const(
  1489                     sc, data.sdo_pos))) {
  1491                     sc, data.sdo_pos))) {
  1490         up(&master->master_sem);
  1492         up(&master->master_sem);
  1491         EC_ERR("Invalid SDO position!\n");
  1493         EC_MASTER_ERR(master, "Invalid SDO position!\n");
  1492         return -EINVAL;
  1494         return -EINVAL;
  1493     }
  1495     }
  1494 
  1496 
  1495     data.index = req->index;
  1497     data.index = req->index;
  1496     data.subindex = req->subindex;
  1498     data.subindex = req->subindex;
  1527     if (down_interruptible(&master->master_sem))
  1529     if (down_interruptible(&master->master_sem))
  1528         return -EINTR;
  1530         return -EINTR;
  1529 
  1531 
  1530     if (!(eoe = ec_master_get_eoe_handler_const(master, data.eoe_index))) {
  1532     if (!(eoe = ec_master_get_eoe_handler_const(master, data.eoe_index))) {
  1531         up(&master->master_sem);
  1533         up(&master->master_sem);
  1532         EC_ERR("EoE handler %u does not exist!\n", data.eoe_index);
  1534         EC_MASTER_ERR(master, "EoE handler %u does not exist!\n",
       
  1535                 data.eoe_index);
  1533         return -EINVAL;
  1536         return -EINVAL;
  1534     }
  1537     }
  1535 
  1538 
  1536     if (eoe->slave) {
  1539     if (eoe->slave) {
  1537         data.slave_position = eoe->slave->ring_position;
  1540         data.slave_position = eoe->slave->ring_position;
  2807 
  2810 
  2808     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2811     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2809         return -EFAULT;
  2812         return -EFAULT;
  2810 
  2813 
  2811     if (!data.size) {
  2814     if (!data.size) {
  2812         EC_ERR("Sdo download: Data size may not be zero!\n");
  2815         EC_MASTER_ERR(master, "SDO download: Data size may not be zero!\n");
  2813         return -EINVAL;
  2816         return -EINVAL;
  2814     }
  2817     }
  2815 
  2818 
  2816     if (down_interruptible(&master->master_sem))
  2819     if (down_interruptible(&master->master_sem))
  2817         return -EINTR;
  2820         return -EINTR;
  3220 
  3223 
  3221     if (!(request.slave = ec_master_find_slave(
  3224     if (!(request.slave = ec_master_find_slave(
  3222                     master, 0, data.slave_position))) {
  3225                     master, 0, data.slave_position))) {
  3223         up(&master->master_sem);
  3226         up(&master->master_sem);
  3224         ec_foe_request_clear(&request.req);
  3227         ec_foe_request_clear(&request.req);
  3225         EC_ERR("Slave %u does not exist!\n", data.slave_position);
  3228         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  3229                 data.slave_position);
  3226         return -EINVAL;
  3230         return -EINVAL;
  3227     }
  3231     }
  3228 
  3232 
  3229     // schedule request.
  3233     // schedule request.
  3230     list_add_tail(&request.list, &request.slave->foe_requests);
  3234     list_add_tail(&request.list, &request.slave->foe_requests);
  3231 
  3235 
  3232     up(&master->master_sem);
  3236     up(&master->master_sem);
  3233 
  3237 
  3234     if (master->debug_level) {
  3238     EC_SLAVE_DBG(request.slave, 1, "Scheduled FoE read request.\n");
  3235         EC_DBG("Scheduled FoE read request on slave %u.\n",
       
  3236                 request.slave->ring_position);
       
  3237     }
       
  3238 
  3239 
  3239     // wait for processing through FSM
  3240     // wait for processing through FSM
  3240     if (wait_event_interruptible(request.slave->foe_queue,
  3241     if (wait_event_interruptible(request.slave->foe_queue,
  3241                 request.req.state != EC_INT_REQUEST_QUEUED)) {
  3242                 request.req.state != EC_INT_REQUEST_QUEUED)) {
  3242         // interrupted by signal
  3243         // interrupted by signal
  3256             request.req.state != EC_INT_REQUEST_BUSY);
  3257             request.req.state != EC_INT_REQUEST_BUSY);
  3257 
  3258 
  3258     data.result = request.req.result;
  3259     data.result = request.req.result;
  3259     data.error_code = request.req.error_code;
  3260     data.error_code = request.req.error_code;
  3260 
  3261 
  3261     if (master->debug_level) {
  3262     EC_SLAVE_DBG(request.slave, 1, "Read %zd bytes via FoE"
  3262         EC_DBG("Read %zd bytes via FoE (result = 0x%x).\n",
  3263             " (result = 0x%x).\n", request.req.data_size, request.req.result);
  3263                 request.req.data_size, request.req.result);
       
  3264     }
       
  3265 
  3264 
  3266     if (request.req.state != EC_INT_REQUEST_SUCCESS) {
  3265     if (request.req.state != EC_INT_REQUEST_SUCCESS) {
  3267         data.data_size = 0;
  3266         data.data_size = 0;
  3268         retval = -EIO;
  3267         retval = -EIO;
  3269     } else {
  3268     } else {
  3270         if (request.req.data_size > data.buffer_size) {
  3269         if (request.req.data_size > data.buffer_size) {
  3271             EC_ERR("Buffer too small.\n");
  3270             EC_MASTER_ERR(master, "Buffer too small.\n");
  3272             ec_foe_request_clear(&request.req);
  3271             ec_foe_request_clear(&request.req);
  3273             return -EOVERFLOW;
  3272             return -EOVERFLOW;
  3274         }
  3273         }
  3275         data.data_size = request.req.data_size;
  3274         data.data_size = request.req.data_size;
  3276         if (copy_to_user((void __user *) data.buffer,
  3275         if (copy_to_user((void __user *) data.buffer,
  3283 
  3282 
  3284     if (__copy_to_user((void __user *) arg, &data, sizeof(data))) {
  3283     if (__copy_to_user((void __user *) arg, &data, sizeof(data))) {
  3285         retval = -EFAULT;
  3284         retval = -EFAULT;
  3286     }
  3285     }
  3287 
  3286 
  3288     if (master->debug_level)
  3287     EC_SLAVE_DBG(request.slave, 1, "Finished FoE read request.\n");
  3289         EC_DBG("FoE read request finished on slave %u.\n",
       
  3290                 request.slave->ring_position);
       
  3291 
  3288 
  3292     ec_foe_request_clear(&request.req);
  3289     ec_foe_request_clear(&request.req);
  3293 
  3290 
  3294     return retval;
  3291     return retval;
  3295 }
  3292 }
  3331         return -EINTR;
  3328         return -EINTR;
  3332 
  3329 
  3333     if (!(request.slave = ec_master_find_slave(
  3330     if (!(request.slave = ec_master_find_slave(
  3334                     master, 0, data.slave_position))) {
  3331                     master, 0, data.slave_position))) {
  3335         up(&master->master_sem);
  3332         up(&master->master_sem);
  3336         EC_ERR("Slave %u does not exist!\n", data.slave_position);
  3333         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  3334                 data.slave_position);
  3337         ec_foe_request_clear(&request.req);
  3335         ec_foe_request_clear(&request.req);
  3338         return -EINVAL;
  3336         return -EINVAL;
  3339     }
  3337     }
  3340 
  3338 
  3341     if (master->debug_level) {
  3339     EC_SLAVE_DBG(request.slave, 1, "Scheduling FoE write request.\n");
  3342         EC_DBG("Scheduling FoE write request.\n");
       
  3343     }
       
  3344 
  3340 
  3345     // schedule FoE write request.
  3341     // schedule FoE write request.
  3346     list_add_tail(&request.list, &request.slave->foe_requests);
  3342     list_add_tail(&request.list, &request.slave->foe_requests);
  3347 
  3343 
  3348     up(&master->master_sem);
  3344     up(&master->master_sem);
  3375         retval = -EFAULT;
  3371         retval = -EFAULT;
  3376     }
  3372     }
  3377 
  3373 
  3378     ec_foe_request_clear(&request.req);
  3374     ec_foe_request_clear(&request.req);
  3379 
  3375 
  3380     if (master->debug_level) {
  3376     EC_SLAVE_DBG(request.slave, 1, "Finished FoE write request.\n");
  3381         EC_DBG("Finished FoE writing.\n");
       
  3382     }
       
  3383 
  3377 
  3384     return retval;
  3378     return retval;
  3385 }
  3379 }
  3386 
  3380 
  3387 /*****************************************************************************/
  3381 /*****************************************************************************/
  3410 
  3404 
  3411     if (!(request.slave = ec_master_find_slave(
  3405     if (!(request.slave = ec_master_find_slave(
  3412                     master, 0, ioctl.slave_position))) {
  3406                     master, 0, ioctl.slave_position))) {
  3413         up(&master->master_sem);
  3407         up(&master->master_sem);
  3414         ec_soe_request_clear(&request.req);
  3408         ec_soe_request_clear(&request.req);
  3415         EC_ERR("Slave %u does not exist!\n", ioctl.slave_position);
  3409         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  3410                 ioctl.slave_position);
  3416         return -EINVAL;
  3411         return -EINVAL;
  3417     }
  3412     }
  3418 
  3413 
  3419     // schedule request.
  3414     // schedule request.
  3420     list_add_tail(&request.list, &request.slave->soe_requests);
  3415     list_add_tail(&request.list, &request.slave->soe_requests);
  3421 
  3416 
  3422     up(&master->master_sem);
  3417     up(&master->master_sem);
  3423 
  3418 
  3424     if (master->debug_level) {
  3419     EC_SLAVE_DBG(request.slave, 1, "Scheduled SoE read request.\n");
  3425         EC_DBG("Scheduled SoE read request on slave %u.\n",
       
  3426                 request.slave->ring_position);
       
  3427     }
       
  3428 
  3420 
  3429     // wait for processing through FSM
  3421     // wait for processing through FSM
  3430     if (wait_event_interruptible(request.slave->soe_queue,
  3422     if (wait_event_interruptible(request.slave->soe_queue,
  3431                 request.req.state != EC_INT_REQUEST_QUEUED)) {
  3423                 request.req.state != EC_INT_REQUEST_QUEUED)) {
  3432         // interrupted by signal
  3424         // interrupted by signal
  3445     wait_event(request.slave->soe_queue,
  3437     wait_event(request.slave->soe_queue,
  3446             request.req.state != EC_INT_REQUEST_BUSY);
  3438             request.req.state != EC_INT_REQUEST_BUSY);
  3447 
  3439 
  3448     ioctl.error_code = request.req.error_code;
  3440     ioctl.error_code = request.req.error_code;
  3449 
  3441 
  3450     if (master->debug_level) {
  3442     EC_SLAVE_DBG(request.slave, 1, "Read %zd bytes via SoE.\n",
  3451         EC_DBG("Read %zd bytes via SoE.\n", request.req.data_size);
  3443             request.req.data_size);
  3452     }
       
  3453 
  3444 
  3454     if (request.req.state != EC_INT_REQUEST_SUCCESS) {
  3445     if (request.req.state != EC_INT_REQUEST_SUCCESS) {
  3455         ioctl.data_size = 0;
  3446         ioctl.data_size = 0;
  3456         retval = -EIO;
  3447         retval = -EIO;
  3457     } else {
  3448     } else {
  3458         if (request.req.data_size > ioctl.mem_size) {
  3449         if (request.req.data_size > ioctl.mem_size) {
  3459             EC_ERR("Buffer too small.\n");
  3450             EC_MASTER_ERR(master, "Buffer too small.\n");
  3460             ec_soe_request_clear(&request.req);
  3451             ec_soe_request_clear(&request.req);
  3461             return -EOVERFLOW;
  3452             return -EOVERFLOW;
  3462         }
  3453         }
  3463         ioctl.data_size = request.req.data_size;
  3454         ioctl.data_size = request.req.data_size;
  3464         if (copy_to_user((void __user *) ioctl.data,
  3455         if (copy_to_user((void __user *) ioctl.data,
  3471 
  3462 
  3472     if (__copy_to_user((void __user *) arg, &ioctl, sizeof(ioctl))) {
  3463     if (__copy_to_user((void __user *) arg, &ioctl, sizeof(ioctl))) {
  3473         retval = -EFAULT;
  3464         retval = -EFAULT;
  3474     }
  3465     }
  3475 
  3466 
  3476     if (master->debug_level)
  3467     EC_SLAVE_DBG(request.slave, 1, "Finished SoE read request.\n");
  3477         EC_DBG("SoE read request finished on slave %u.\n",
       
  3478                 request.slave->ring_position);
       
  3479 
  3468 
  3480     ec_soe_request_clear(&request.req);
  3469     ec_soe_request_clear(&request.req);
  3481 
  3470 
  3482     return retval;
  3471     return retval;
  3483 }
  3472 }
  3520         return -EINTR;
  3509         return -EINTR;
  3521 
  3510 
  3522     if (!(request.slave = ec_master_find_slave(
  3511     if (!(request.slave = ec_master_find_slave(
  3523                     master, 0, ioctl.slave_position))) {
  3512                     master, 0, ioctl.slave_position))) {
  3524         up(&master->master_sem);
  3513         up(&master->master_sem);
  3525         EC_ERR("Slave %u does not exist!\n", ioctl.slave_position);
  3514         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
       
  3515                 ioctl.slave_position);
  3526         ec_soe_request_clear(&request.req);
  3516         ec_soe_request_clear(&request.req);
  3527         return -EINVAL;
  3517         return -EINVAL;
  3528     }
  3518     }
  3529 
  3519 
  3530     if (master->debug_level) {
  3520     EC_SLAVE_DBG(request.slave, 1, "Scheduling SoE write request.\n");
  3531         EC_DBG("Scheduling SoE write request.\n");
       
  3532     }
       
  3533 
  3521 
  3534     // schedule SoE write request.
  3522     // schedule SoE write request.
  3535     list_add_tail(&request.list, &request.slave->soe_requests);
  3523     list_add_tail(&request.list, &request.slave->soe_requests);
  3536 
  3524 
  3537     up(&master->master_sem);
  3525     up(&master->master_sem);
  3562         retval = -EFAULT;
  3550         retval = -EFAULT;
  3563     }
  3551     }
  3564 
  3552 
  3565     ec_soe_request_clear(&request.req);
  3553     ec_soe_request_clear(&request.req);
  3566 
  3554 
  3567     if (master->debug_level) {
  3555     EC_SLAVE_DBG(request.slave, 1, "Finished SoE write request.\n");
  3568         EC_DBG("Finished SoE writing.\n");
       
  3569     }
       
  3570 
  3556 
  3571     return retval;
  3557     return retval;
  3572 }
  3558 }
  3573 
  3559 
  3574 /******************************************************************************
  3560 /******************************************************************************
  3582     ec_cdev_t *cdev = container_of(inode->i_cdev, ec_cdev_t, cdev);
  3568     ec_cdev_t *cdev = container_of(inode->i_cdev, ec_cdev_t, cdev);
  3583     ec_cdev_priv_t *priv;
  3569     ec_cdev_priv_t *priv;
  3584 
  3570 
  3585     priv = kmalloc(sizeof(ec_cdev_priv_t), GFP_KERNEL);
  3571     priv = kmalloc(sizeof(ec_cdev_priv_t), GFP_KERNEL);
  3586     if (!priv) {
  3572     if (!priv) {
  3587         EC_ERR("Failed to allocate memory for private data structure.\n");
  3573         EC_MASTER_ERR(cdev->master,
       
  3574                 "Failed to allocate memory for private data structure.\n");
  3588         return -ENOMEM;
  3575         return -ENOMEM;
  3589     }
  3576     }
  3590 
  3577 
  3591     priv->cdev = cdev;
  3578     priv->cdev = cdev;
  3592     priv->requested = 0;
  3579     priv->requested = 0;
  3594     priv->process_data_size = 0;
  3581     priv->process_data_size = 0;
  3595 
  3582 
  3596     filp->private_data = priv;
  3583     filp->private_data = priv;
  3597 
  3584 
  3598 #if DEBUG_IOCTL
  3585 #if DEBUG_IOCTL
  3599     EC_DBG("File opened.\n");
  3586     EC_MASTER_DBG(cdev->master, "File opened.\n");
  3600 #endif
  3587 #endif
  3601     return 0;
  3588     return 0;
  3602 }
  3589 }
  3603 
  3590 
  3604 /*****************************************************************************/
  3591 /*****************************************************************************/
  3615 
  3602 
  3616     if (priv->process_data)
  3603     if (priv->process_data)
  3617         vfree(priv->process_data);
  3604         vfree(priv->process_data);
  3618 
  3605 
  3619 #if DEBUG_IOCTL
  3606 #if DEBUG_IOCTL
  3620     EC_DBG("File closed.\n");
  3607     EC_MASTER_DBG(master, "File closed.\n");
  3621 #endif
  3608 #endif
  3622 
  3609 
  3623     kfree(priv);
  3610     kfree(priv);
  3624     return 0;
  3611     return 0;
  3625 }
  3612 }
  3632 {
  3619 {
  3633     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data;
  3620     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data;
  3634     ec_master_t *master = priv->cdev->master;
  3621     ec_master_t *master = priv->cdev->master;
  3635 
  3622 
  3636 #if DEBUG_IOCTL
  3623 #if DEBUG_IOCTL
  3637     EC_DBG("ioctl(filp = 0x%x, cmd = 0x%08x (0x%02x), arg = 0x%x)\n",
  3624     EC_MASTER_DBG(master, "ioctl(filp = 0x%x, cmd = 0x%08x (0x%02x),"
  3638             (u32) filp, (u32) cmd, (u32) _IOC_NR(cmd), (u32) arg);
  3625             " arg = 0x%x)\n", (u32) filp, (u32) cmd, (u32) _IOC_NR(cmd),
       
  3626             (u32) arg);
  3639 #endif
  3627 #endif
  3640 
  3628 
  3641     switch (cmd) {
  3629     switch (cmd) {
  3642         case EC_IOCTL_MODULE:
  3630         case EC_IOCTL_MODULE:
  3643             return ec_cdev_ioctl_module(arg);
  3631             return ec_cdev_ioctl_module(arg);
  3870         case EC_IOCTL_VOE_DATA:
  3858         case EC_IOCTL_VOE_DATA:
  3871             return ec_cdev_ioctl_voe_data(master, arg, priv);
  3859             return ec_cdev_ioctl_voe_data(master, arg, priv);
  3872         case EC_IOCTL_SET_SEND_INTERVAL:
  3860         case EC_IOCTL_SET_SEND_INTERVAL:
  3873             if (!(filp->f_mode & FMODE_WRITE))
  3861             if (!(filp->f_mode & FMODE_WRITE))
  3874                 return -EPERM;
  3862                 return -EPERM;
  3875             return ec_cdev_ioctl_set_send_interval(master,arg,priv);
  3863             return ec_cdev_ioctl_set_send_interval(master, arg, priv);
  3876         default:
  3864         default:
  3877             return -ENOTTY;
  3865             return -ENOTTY;
  3878     }
  3866     }
  3879 }
  3867 }
  3880 
  3868 
  3890         struct vm_area_struct *vma
  3878         struct vm_area_struct *vma
  3891         )
  3879         )
  3892 {
  3880 {
  3893     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data;
  3881     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data;
  3894 
  3882 
  3895     if (priv->cdev->master->debug_level)
  3883     EC_MASTER_DBG(priv->cdev->master, 1, "mmap()\n");
  3896         EC_DBG("mmap()\n");
       
  3897 
  3884 
  3898     vma->vm_ops = &eccdev_vm_ops;
  3885     vma->vm_ops = &eccdev_vm_ops;
  3899     vma->vm_flags |= VM_RESERVED; /* Pages will not be swapped out */
  3886     vma->vm_flags |= VM_RESERVED; /* Pages will not be swapped out */
  3900     vma->vm_private_data = priv;
  3887     vma->vm_private_data = priv;
  3901 
  3888 
  3928         return VM_FAULT_SIGBUS;
  3915         return VM_FAULT_SIGBUS;
  3929 
  3916 
  3930     get_page(page);
  3917     get_page(page);
  3931     vmf->page = page;
  3918     vmf->page = page;
  3932 
  3919 
  3933     if (priv->cdev->master->debug_level)
  3920     EC_MASTER_DBG(priv->cdev->master, 1, "Vma fault, virtual_address = %p,"
  3934         EC_DBG("Vma fault, virtual_address = %p, offset = %lu, page = %p\n",
  3921             " offset = %lu, page = %p\n", vmf->virtual_address, offset, page);
  3935                 vmf->virtual_address, offset, page);
       
  3936 
  3922 
  3937     return 0;
  3923     return 0;
  3938 }
  3924 }
  3939 
  3925 
  3940 #else
  3926 #else
  3960     if (offset >= priv->process_data_size)
  3946     if (offset >= priv->process_data_size)
  3961         return NOPAGE_SIGBUS;
  3947         return NOPAGE_SIGBUS;
  3962 
  3948 
  3963     page = vmalloc_to_page(priv->process_data + offset);
  3949     page = vmalloc_to_page(priv->process_data + offset);
  3964 
  3950 
  3965     if (priv->cdev->master->debug_level)
  3951     EC_MASTER_DBG(master, "Nopage fault vma, address = %#lx,"
  3966         EC_DBG("Nopage fault vma, address = %#lx, offset = %#lx, page = %p\n",
  3952             " offset = %#lx, page = %p\n", address, offset, page);
  3967                 address, offset, page);
       
  3968 
  3953 
  3969     get_page(page);
  3954     get_page(page);
  3970     if (type)
  3955     if (type)
  3971         *type = VM_FAULT_MINOR;
  3956         *type = VM_FAULT_MINOR;
  3972 
  3957