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 |
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); |
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; |
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, |
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); |
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, |
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); |
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; |
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 |