blob: 8d3a738db658ee93aeadb3022f4ebe06f6692b8d [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*****************************************************************************
37 *
38 * Filename:
39 * ---------
40 * nvram_io.c
41 *
42 * Project:
43 * --------
44 * MAUI
45 *
46 * Description:
47 * ------------
48 * This is main() function of NVRAM module.
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *============================================================================
55 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58 * removed!
59 *
60 * removed!
61 * removed!
62 * removed!
63 *
64 * removed!
65 * removed!
66 * removed!
67 ×
68 * removed!
69 * removed!
70 * removed!
71 * removed!
72 *
73 * removed!
74 * removed!
75 * removed!
76 * removed!
77 *
78 * removed!
79 * removed!
80 * removed!
81 * removed!
82 *
83 * removed!
84 * removed!
85 * removed!
86 * removed!
87 *
88 * removed!
89 * removed!
90 * removed!
91 * removed!
92 *
93 * removed!
94 * removed!
95 * removed!
96 * removed!
97 *
98 * removed!
99 * removed!
100 * removed!
101 * removed!
102 *
103 * removed!
104 * removed!
105 * removed!
106 *
107 * removed!
108 * removed!
109 * removed!
110 * removed!
111 * removed!
112 * removed!
113 * removed!
114 * removed!
115 * removed!
116 * removed!
117 * removed!
118 *
119 * removed!
120 * removed!
121 * removed!
122 * removed!
123 * removed!
124 * removed!
125 * removed!
126 * removed!
127 * removed!
128 * removed!
129 *
130 * removed!
131 * removed!
132 * removed!
133 * removed!
134 *
135 * removed!
136 * removed!
137 * removed!
138 * removed!
139 *
140 * removed!
141 * removed!
142 * removed!
143 * removed!
144 *
145 * removed!
146 * removed!
147 * removed!
148 * removed!
149 * removed!
150 *
151 * removed!
152 * removed!
153 * removed!
154 * removed!
155 * removed!
156 * removed!
157 * removed!
158 * removed!
159 *
160 * removed!
161 * removed!
162 *
163 * removed!
164 * removed!
165 * removed!
166 *
167 * removed!
168 * removed!
169 * removed!
170 * removed!
171 *
172 * removed!
173 * removed!
174 * removed!
175 *
176 * removed!
177 * removed!
178 *
179 * removed!
180 * removed!
181 * removed!
182 * removed!
183 *
184 * removed!
185 * removed!
186 *
187 * removed!
188 * removed!
189 * removed!
190 *
191 * removed!
192 * removed!
193 * removed!
194 * removed!
195 * removed!
196 *
197 * removed!
198 * removed!
199 * removed!
200 * removed!
201 *
202 * removed!
203 * removed!
204 * removed!
205 *
206 * removed!
207 * removed!
208 * removed!
209 * removed!
210 *
211 * removed!
212 * removed!
213 * removed!
214 *
215 * removed!
216 * removed!
217 * removed!
218 *
219 * removed!
220 * removed!
221 * removed!
222 * removed!
223 *
224 * removed!
225 * removed!
226 * removed!
227 *
228 * removed!
229 * removed!
230 * removed!
231 *
232 * removed!
233 * removed!
234 * removed!
235 *
236 * removed!
237 * removed!
238 * removed!
239 * removed!
240 *
241 * removed!
242 * removed!
243 *
244 * removed!
245 * removed!
246 *
247 * removed!
248 * removed!
249 * removed!
250 *
251 * removed!
252 * removed!
253 *
254 * removed!
255 * removed!
256 * removed!
257 *
258 * removed!
259 * removed!
260 * removed!
261 *
262 * removed!
263 * removed!
264 *
265 * removed!
266 * removed!
267 * removed!
268 *
269 * removed!
270 * removed!
271 *
272 * removed!
273 * removed!
274 *
275 * removed!
276 * removed!
277 * removed!
278 *
279 * removed!
280 * removed!
281 *
282 * removed!
283 * removed!
284 * removed!
285 *
286 * removed!
287 * removed!
288 * removed!
289 *
290 * removed!
291 * removed!
292 * removed!
293 *
294 * removed!
295 * removed!
296 * removed!
297 *
298 * removed!
299 * removed!
300 * removed!
301 *
302 * removed!
303 * removed!
304 * removed!
305 *
306 * removed!
307 * removed!
308 * removed!
309 *
310 * removed!
311 * removed!
312 *
313 * removed!
314 * removed!
315 * removed!
316 *
317 * removed!
318 * removed!
319 * removed!
320 *
321 * removed!
322 * removed!
323 *
324 * removed!
325 * removed!
326 * removed!
327 *
328 * removed!
329 * removed!
330 * removed!
331 *
332 * removed!
333 * removed!
334 * removed!
335 *
336 * removed!
337 * removed!
338 * removed!
339 *
340 * removed!
341 * removed!
342 * removed!
343 *
344 * removed!
345 * removed!
346 * removed!
347 *
348 * removed!
349 * removed!
350 * removed!
351 *
352 * removed!
353 * removed!
354 * removed!
355 *
356 * removed!
357 * removed!
358 * removed!
359 *
360 * removed!
361 * removed!
362 * removed!
363 *
364 * removed!
365 * removed!
366 * removed!
367 * removed!
368 * removed!
369 * removed!
370 * removed!
371 * removed!
372 * removed!
373 * removed!
374 * removed!
375 * removed!
376 * removed!
377 * removed!
378 * removed!
379 * removed!
380 * removed!
381 * removed!
382 * removed!
383 *
384 * removed!
385 * removed!
386 * removed!
387 *
388 * removed!
389 * removed!
390 * removed!
391 *
392 * removed!
393 * removed!
394 * removed!
395 *
396 * removed!
397 * removed!
398 * removed!
399 *
400 * removed!
401 * removed!
402 * removed!
403 *
404 * removed!
405 * removed!
406 * removed!
407 *
408 * removed!
409 * removed!
410 * removed!
411 *
412 * removed!
413 * removed!
414 * removed!
415 *
416 * removed!
417 * removed!
418 * removed!
419 *
420 * removed!
421 * removed!
422 * removed!
423 *
424 * removed!
425 * removed!
426 * removed!
427 *
428 * removed!
429 * removed!
430 * removed!
431 *
432 * removed!
433 * removed!
434 * removed!
435 *
436 * removed!
437 * removed!
438 * removed!
439 *
440 * removed!
441 * removed!
442 * removed!
443 *
444 * removed!
445 * removed!
446 * removed!
447 *
448 * removed!
449 * removed!
450 * removed!
451 *
452 * removed!
453 * removed!
454 * removed!
455 *
456 * removed!
457 * removed!
458 * removed!
459 *
460 * removed!
461 * removed!
462 * removed!
463 *
464 * removed!
465 * removed!
466 * removed!
467 *
468 * removed!
469 * removed!
470 * removed!
471 *
472 * removed!
473 * removed!
474 * removed!
475 *
476 * removed!
477 * removed!
478 * removed!
479 *
480 * removed!
481 * removed!
482 * removed!
483 *
484 * removed!
485 * removed!
486 * removed!
487 *
488 * removed!
489 * removed!
490 * removed!
491 *
492 * removed!
493 * removed!
494 * removed!
495 *
496 * removed!
497 * removed!
498 * removed!
499 *
500 * removed!
501 * removed!
502 * removed!
503 *
504 * removed!
505 * removed!
506 * removed!
507 *
508 * removed!
509 * removed!
510 * removed!
511 *
512 * removed!
513 * removed!
514 * removed!
515 *
516 * removed!
517 * removed!
518 * removed!
519 *
520 * removed!
521 * removed!
522 * removed!
523 *
524 * removed!
525 * removed!
526 * removed!
527 *
528 * removed!
529 * removed!
530 * removed!
531 *
532 * removed!
533 * removed!
534 * removed!
535 *
536 * removed!
537 * removed!
538 * removed!
539 *
540 * removed!
541 * removed!
542 * removed!
543 *
544 * removed!
545 * removed!
546 * removed!
547 *
548 * removed!
549 * removed!
550 * removed!
551 *
552 * removed!
553 * removed!
554 * removed!
555 *
556 * removed!
557 * removed!
558 * removed!
559 *
560 * removed!
561 * removed!
562 * removed!
563 *
564 * removed!
565 * removed!
566 * removed!
567 *
568 * removed!
569 * removed!
570 * removed!
571 *
572 * removed!
573 * removed!
574 * removed!
575 *
576 * removed!
577 * removed!
578 * removed!
579 *
580 * removed!
581 * removed!
582 * removed!
583 *
584 * removed!
585 * removed!
586 * removed!
587 *
588 * removed!
589 * removed!
590 * removed!
591 *
592 * removed!
593 * removed!
594 * removed!
595 *
596 * removed!
597 * removed!
598 * removed!
599 *
600 * removed!
601 * removed!
602 * removed!
603 *
604 * removed!
605 * removed!
606 * removed!
607 *
608 * removed!
609 * removed!
610 * removed!
611 *
612 * removed!
613 * removed!
614 * removed!
615 *
616 * removed!
617 * removed!
618 * removed!
619 *
620 * removed!
621 * removed!
622 * removed!
623 *
624 * removed!
625 * removed!
626 * removed!
627 *
628 * removed!
629 * removed!
630 * removed!
631 *
632 * removed!
633 * removed!
634 * removed!
635 *
636 * removed!
637 * removed!
638 * removed!
639 *
640 * removed!
641 * removed!
642 * removed!
643 *
644 * removed!
645 * removed!
646 * removed!
647 *
648 * removed!
649 * removed!
650 * removed!
651 *
652 * removed!
653 * removed!
654 * removed!
655 *
656 * removed!
657 * removed!
658 * removed!
659 *
660 * removed!
661 * removed!
662 * removed!
663 *
664 * removed!
665 * removed!
666 *
667 *
668 * removed!
669 * removed!
670 *
671 *
672 * removed!
673 * removed!
674 *
675 *
676 * removed!
677 * removed!
678 *
679 *
680 * removed!
681 * removed!
682 *
683 *
684 * removed!
685 * removed!
686 *
687 *
688 * removed!
689 * removed!
690 *
691 *
692 * removed!
693 * removed!
694 *
695 *
696 * removed!
697 * removed!
698 *
699 *
700 * removed!
701 * removed!
702 *
703 *
704 * removed!
705 * removed!
706 * removed!
707 *
708 * removed!
709 * removed!
710 *
711 *
712 * removed!
713 * removed!
714 *
715 *
716 * removed!
717 * removed!
718 *
719 *
720 * removed!
721 * removed!
722 *
723 *
724 * removed!
725 * removed!
726 *
727 *
728 * removed!
729 * removed!
730 *
731 *
732 * removed!
733 * removed!
734 *
735 *
736 * removed!
737 * removed!
738 *
739 *
740 * removed!
741 * removed!
742 *
743 *
744 * removed!
745 * removed!
746 *
747 *
748 * removed!
749 * removed!
750 *
751 *
752 * removed!
753 * removed!
754 *
755 *
756 * removed!
757 * removed!
758 *
759 *
760 * removed!
761 * removed!
762 *
763 *
764 * removed!
765 * removed!
766 *
767 *
768 * removed!
769 * removed!
770 *
771 *
772 * removed!
773 * removed!
774 *
775 *
776 * removed!
777 * removed!
778 *
779 *
780 * removed!
781 * removed!
782 *
783 *
784 * removed!
785 * removed!
786 *
787 *
788 * removed!
789 * removed!
790 *
791 *
792 * removed!
793 * removed!
794 *
795 *
796 * removed!
797 * removed!
798 *
799 *
800 * removed!
801 * removed!
802 *
803 *
804 * removed!
805 * removed!
806 *
807 *
808 * removed!
809 * removed!
810 *
811 *
812 * removed!
813 * removed!
814 *
815 *
816 * removed!
817 * removed!
818 *
819 *
820 * removed!
821 * removed!
822 *
823 *
824 * removed!
825 * removed!
826 *
827 *
828 * removed!
829 * removed!
830 *
831 *
832 * removed!
833 * removed!
834 *
835 *
836 * removed!
837 * removed!
838 *
839 *
840 * removed!
841 * removed!
842 *
843 *
844 * removed!
845 * removed!
846 *
847 *
848 * removed!
849 * removed!
850 *
851 *
852 * removed!
853 * removed!
854 *
855 *
856 * removed!
857 * removed!
858 *
859 *
860 * removed!
861 * removed!
862 *
863 *
864 * removed!
865 * removed!
866 *
867 *
868 * removed!
869 * removed!
870 *
871 *
872 * removed!
873 * removed!
874 *
875 *
876 * removed!
877 * removed!
878 *
879 *
880 * removed!
881 * removed!
882 *
883 *
884 * removed!
885 * removed!
886 *
887 *
888 * removed!
889 * removed!
890 *
891 *
892 * removed!
893 * removed!
894 *
895 *
896 * removed!
897 * removed!
898 *
899 *
900 * removed!
901 * removed!
902 *
903 *
904 * removed!
905 * removed!
906 *
907 *
908 * removed!
909 * removed!
910 *
911 *
912 * removed!
913 * removed!
914 *
915 *
916 * removed!
917 * removed!
918 *
919 *
920 * removed!
921 * removed!
922 *
923 *
924 * removed!
925 * removed!
926 *
927 *
928 * removed!
929 * removed!
930 *
931 *
932 * removed!
933 * removed!
934 *
935 *
936 * removed!
937 * removed!
938 *
939 *
940 * removed!
941 * removed!
942 *
943 *
944 * removed!
945 * removed!
946 * removed!
947 *
948 * removed!
949 * removed!
950 * removed!
951 *
952 * removed!
953 * removed!
954 *
955 *
956 * removed!
957 * removed!
958 *
959 *
960 * removed!
961 * removed!
962 *
963 *
964 * removed!
965 * removed!
966 *
967 *
968 * removed!
969 * removed!
970 *
971 *
972 * removed!
973 * removed!
974 *
975 *
976 * removed!
977 * removed!
978 *
979 *
980 * removed!
981 * removed!
982 *
983 *
984 * removed!
985 * removed!
986 *
987 *
988 * removed!
989 * removed!
990 *
991 *
992 * removed!
993 * removed!
994 *
995 *
996 * removed!
997 * removed!
998 *
999 *
1000 * removed!
1001 * removed!
1002 *
1003 *
1004 * removed!
1005 * removed!
1006 * removed!
1007 *
1008 * removed!
1009 * removed!
1010 *
1011 *
1012 * removed!
1013 * removed!
1014 *
1015 *
1016 * removed!
1017 * removed!
1018 *
1019 *
1020 * removed!
1021 * removed!
1022 *
1023 *
1024 * removed!
1025 * removed!
1026 *
1027 *
1028 * removed!
1029 * removed!
1030 *
1031 *
1032 * removed!
1033 * removed!
1034 *
1035 *
1036 * removed!
1037 * removed!
1038 *
1039 *
1040 * removed!
1041 * removed!
1042 *
1043 *
1044 * removed!
1045 * removed!
1046 *
1047 *
1048 * removed!
1049 * removed!
1050 * removed!
1051 *
1052 * removed!
1053 * removed!
1054 *
1055 *
1056 * removed!
1057 * removed!
1058 *
1059 *
1060 * removed!
1061 * removed!
1062 * removed!
1063 *
1064 * removed!
1065 * removed!
1066 *
1067 *
1068 * removed!
1069 * removed!
1070 * removed!
1071 *
1072 * removed!
1073 * removed!
1074 * removed!
1075 *
1076 * removed!
1077 * removed!
1078 * removed!
1079 *
1080 * removed!
1081 * removed!
1082 * removed!
1083 *
1084 * removed!
1085 * removed!
1086 * removed!
1087 *
1088 * removed!
1089 * removed!
1090 * removed!
1091 *
1092 * removed!
1093 * removed!
1094 * removed!
1095 *
1096 * removed!
1097 * removed!
1098 *
1099 *
1100 * removed!
1101 * removed!
1102 *
1103 *
1104 * removed!
1105 * removed!
1106 *
1107 *
1108 * removed!
1109 * removed!
1110 *
1111 *
1112 * removed!
1113 * removed!
1114 *
1115 *
1116 * removed!
1117 * removed!
1118 *
1119 *
1120 * removed!
1121 * removed!
1122 *
1123 *
1124 * removed!
1125 * removed!
1126 *
1127 *
1128 *------------------------------------------------------------------------------
1129 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
1130 *============================================================================
1131 ****************************************************************************/
1132
1133/*****************************************************************************
1134* Include
1135*****************************************************************************/
1136#include "string.h"
1137#include "kal_general_types.h"
1138#include "kal_public_api.h"
1139#include "kal_trace.h"
1140
1141
1142/* For FAT */
1143#include "fs_type.h"
1144#include "fs_gprot.h"
1145#include "fs_iprot.h"
1146
1147#include "nvram_data_items.h"
1148#include "nvram_group_def.h" //add for break group files from header file
1149#include "nvram_main.h"
1150#include "custom_nvram_restore.h"
1151#include "custom_nvram_sec.h"
1152
1153#if defined(__MMI_FMI__)
1154#include "nvram_common_defs.h"
1155
1156#endif
1157#include "mcf_enum.h"
1158#include "mcf_if.h"
1159
1160#ifdef __NVRAM_LID_CACHE__
1161#include "nvram_cache_interface.h"
1162#endif
1163#include "us_timer.h"
1164#include "ex_public.h"
1165#if defined(__HIF_CCCI_SUPPORT__)
1166#include "ccci_if.h"
1167#endif
1168
1169/*
1170 * External Function
1171 */
1172extern void WDT_Restart2(void);
1173extern void MMICheckDiskDisplay(void);
1174extern void DRV_ABN_RESET(void);
1175extern kal_bool nvram_set_restore_factory_flag(nvram_restore_flag_enum restore_flag);
1176
1177extern const nvram_clean_folder_entry nvram_clean_folder_list[];
1178
1179extern nvram_ee_info_type* nvram_ee_info;
1180extern kal_char nvram_trace_dump_temp_buffer[];
1181extern kal_char nvram_trace_dump_buffer[];
1182extern kal_mutexid g_nvram_dump_trace_mutex;
1183extern kal_wchar nvram_trace_filename[];
1184extern FS_HANDLE nvram_trace_file_hdl;
1185extern kal_uint32 nvram_trace_dump_buffer_offset;
1186extern module_type stack_get_active_module_id( void );
1187
1188#if defined(__MTK_TARGET__) && defined(__NVRAM_WRITE_WITH_FILE_SIZE__) && !defined(__NVRAM_WRITE_PROTECT_ENABLE__)
1189extern kal_bool bResetNvramData;
1190#endif
1191
1192#ifdef __NVRAM_WRITE_PROTECT_ENABLE__
1193extern kal_bool isneedwriteprotect2;
1194#endif
1195
1196#if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
1197extern kal_taskid pre_write_check_mutex_owner;
1198#endif
1199/*
1200 * Local Function
1201 */
1202static nvram_errno_enum nvram_read_data_item_multiple(
1203 nvram_ltable_entry_struct *ldi,
1204 kal_uint32 rec_index,
1205 kal_uint16 rec_amount,
1206 kal_uint8 *buffer,
1207 kal_uint32 buffer_size);
1208static nvram_errno_enum nvram_write_fs_data_item(
1209 nvram_ltable_entry_struct *ldi,
1210 kal_uint32 index,
1211 kal_uint8 *buffer,
1212 kal_uint32 buffer_size,
1213 kal_bool is_init);
1214
1215static nvram_errno_enum nvram_reset_one_data_item(nvram_ltable_entry_struct *ldi,
1216 kal_uint16 rec_index,
1217 kal_uint16 rec_amount);
1218static kal_bool nvram_factory_restore_sys_cache(
1219 nvram_reset_category_enum category,
1220 nvram_app_id_enum app_id);
1221
1222static kal_bool nvram_factory_rmdir_user(nvram_reset_category_enum category);
1223
1224kal_int32 nvram_recover_data_item(nvram_ltable_entry_struct *ldi);
1225
1226#if defined(__NVRAM_DEBUG_READ_DUMP__) || defined(__NVRAM_DEBUG_WRITE_DUMP__)
1227kal_char str_buffer[1024];
1228kal_uint32 dump_offset = 0;
1229void nvram_debug_rw_dump(nvram_ltable_entry_struct *ldi, kal_uint16 idx, kal_uint32 rec_index, kal_uint16 rec_amount, kal_uint8 *buffer, kal_uint32 buffer_size, nvram_errno_enum status)
1230{
1231 kal_uint16 size, rec_size;
1232 kal_uint32 rec,i,j;
1233 kal_uint8 *ptr;
1234 kal_wchar filename[NVRAM_MAX_PATH_LEN];
1235 FS_HANDLE hFile = 0;
1236 kal_uint32 len = 0;
1237 extern kal_mutexid g_nvram_fs_mutex;
1238 kal_int32 result = FS_NO_ERROR;
1239 nvram_util_take_mutex(g_nvram_fs_mutex);
1240 kal_wsprintf(filename, "%s\\%s", NVRAM_FS_ROOT_PATH, "RW_LOG");
1241 NVRAM_FS_START_EX(FS_OP_OPEN,filename);
1242 hFile = FS_Open((const kal_wchar*)filename, FS_CREATE | FS_READ_WRITE | FS_OPEN_NO_DIR);
1243 NVRAM_FS_END(FS_OP_OPEN,hFile);
1244
1245 if(idx & 0x8000) { //write
1246 sprintf(str_buffer, "W_LID:%s, rec_index:%d, rec_amount:%d, idx:0x%02X, status:0x%X\n", ldi->fileprefix, rec_index, rec_amount, idx, status);
1247 }
1248 else {
1249 sprintf(str_buffer, "R_LID:%s, rec_index:%d, rec_amount:%d, idx:0x%02X, status:0x%X\n", ldi->fileprefix, rec_index, rec_amount, idx, status);
1250 }
1251 size = strlen(str_buffer);
1252 NVRAM_FS_START(FS_OP_SEEK);
1253 result = FS_Seek(hFile, dump_offset, FS_FILE_BEGIN);
1254 NVRAM_FS_END(FS_OP_SEEK,result);
1255 NVRAM_FS_START(FS_OP_WRITE);
1256 result = FS_Write(hFile, str_buffer, size, &len);
1257 NVRAM_FS_END(FS_OP_WRITE,result);
1258 dump_offset += size;
1259 rec_size = (idx & 0x80)?sizeof(kal_uint16):ldi->size;
1260
1261 if((status == NVRAM_ERRNO_SUCCESS) && buffer && buffer_size) {
1262 for(rec = 0; rec < rec_amount; rec++) {
1263 size = 0;
1264 ptr = &buffer[rec * rec_size];
1265 j = (rec_size > 0x100)?0x100:rec_size;
1266 for(i = 0; i < j; i++) {
1267 sprintf((char*)&str_buffer[size], "%02X ", *ptr);
1268 ptr++;
1269 size += 3;
1270 if((i & 0xF) == 0xF) {
1271 str_buffer[size++] = '\n';
1272 }
1273 }
1274 str_buffer[size++] = '\n';
1275 str_buffer[size++] = '\n';
1276 NVRAM_FS_START(FS_OP_WRITE);
1277 result = FS_Write(hFile, str_buffer, size, &len);
1278 NVRAM_FS_END(FS_OP_WRITE,result);
1279 dump_offset += size;
1280 }
1281 }
1282 NVRAM_FS_START(FS_OP_CLOSE);
1283 result = FS_Close(hFile);
1284 NVRAM_FS_END(FS_OP_CLOSE,result);
1285 nvram_util_give_mutex(g_nvram_fs_mutex);
1286
1287}
1288
1289void nvram_debug_log_dump(kal_bool valid, kal_char *log_str, kal_uint32 p1, kal_uint32 p2, kal_uint32 p3, kal_uint8 *buffer, kal_uint32 buffer_size)
1290{
1291 kal_uint16 size;
1292 kal_uint32 i,j;
1293 kal_wchar filename[NVRAM_MAX_PATH_LEN];
1294 FS_HANDLE hFile = 0;
1295 kal_uint32 len = 0;
1296 extern kal_mutexid g_nvram_fs_mutex;
1297 kal_int32 result = FS_NO_ERROR;
1298 if(!valid) return;
1299 nvram_util_take_mutex(g_nvram_fs_mutex);
1300 kal_wsprintf(filename, "%s\\%s", NVRAM_FS_ROOT_PATH, "READ_LOG");
1301 NVRAM_FS_START_EX(FS_OP_OPEN,filename);
1302 hFile = FS_Open((const kal_wchar*)filename, FS_CREATE | FS_READ_WRITE | FS_OPEN_NO_DIR);
1303 NVRAM_FS_END(FS_OP_OPEN,hFile);
1304
1305 sprintf(str_buffer, "%s (0x%08X, 0x%08X, 0x%08X)\n", log_str, p1, p2, p3);
1306 size = strlen(str_buffer);
1307 NVRAM_FS_START(FS_OP_SEEK);
1308 result = FS_Seek(hFile, dump_offset, FS_FILE_BEGIN);
1309 NVRAM_FS_END(FS_OP_SEEK,result);
1310 NVRAM_FS_START(FS_OP_WRITE);
1311 result = FS_Write(hFile, str_buffer, size, &len);
1312 NVRAM_FS_END(FS_OP_WRITE,result);
1313 dump_offset += size;
1314
1315 if(buffer && buffer_size) {
1316 size = 0;
1317 j = (buffer_size > 0x100)?0x100:buffer_size;
1318 for(i = 0; i < j; i++) {
1319 sprintf((char*)&str_buffer[size], "%02X ", *buffer);
1320 buffer++;
1321 size += 3;
1322 if((i & 0xF) == 0xF) {
1323 str_buffer[size++] = '\n';
1324 }
1325 }
1326 str_buffer[size++] = '\n';
1327 str_buffer[size++] = '\n';
1328 NVRAM_FS_START(FS_OP_WRITE);
1329 result = FS_Write(hFile, str_buffer, size, &len);
1330 NVRAM_FS_END(FS_OP_WRITE,result);
1331 dump_offset += size;
1332 }
1333 NVRAM_FS_START(FS_OP_CLOSE);
1334 result = FS_Close(hFile);
1335 NVRAM_FS_END(FS_OP_CLOSE,result);
1336 nvram_util_give_mutex(g_nvram_fs_mutex);
1337
1338}
1339#else
1340#define nvram_debug_log_dump(...)
1341#endif
1342
1343#ifdef __NVRAM_DEBUG_READ_DUMP__
1344#define nvram_debug_read_dump(ldi, idx, rec_index, rec_amount, buffer, buffer_size, status) \
1345 nvram_debug_rw_dump(ldi, ((idx) & 0x7FFF), rec_index, rec_amount, buffer, buffer_size, status)
1346#else
1347#define nvram_debug_read_dump(...)
1348#endif /* __NVRAM_DEBUG_READ_DUMP__ */
1349
1350#ifdef __NVRAM_DEBUG_WRITE_DUMP__
1351#define nvram_debug_write_dump(ldi, idx, rec_index, rec_amount, buffer, buffer_size, status) \
1352 nvram_debug_rw_dump(ldi, ((idx) | 0x8000), rec_index, rec_amount, buffer, buffer_size, status)
1353#else
1354#define nvram_debug_write_dump(...)
1355#endif /* __NVRAM_DEBUG_WRITE_DUMP__ */
1356
1357/*****************************************************************************
1358 * FUNCTION
1359 * nvram_read_data_item_chk
1360 * DESCRIPTION
1361 * This is nvram_read_data_item() function of NVRAM module.
1362 * PARAMETERS
1363 * ldi [IN] MUST be 1 ~ (total_LID - 1)
1364 * rec_index [IN]
1365 * rec_amount [IN]
1366 * buffer [IN] MUST be even-bytes aligned.
1367 * rec_size [IN] MUST be even-bytes aligned: ie, ((ldi->size + 1) / 2) * 2
1368 * index(?) [IN] MUST be 1 ~ total_records
1369 * RETURNS
1370 * NVRAM_IO_ERRNO_OK if read successfully.
1371 * NVRAM_IO_ERRNO_CHK if checksum error, and cannot be reset to default value.
1372 * NVRAM_IO_ERRNO_INIT if checksum error, but successfully reset to default value.
1373 *****************************************************************************/
1374nvram_errno_enum nvram_read_data_item_chksum
1375 (nvram_ltable_entry_struct *ldi, kal_uint16 rec_index, kal_uint16 rec_amount, kal_uint8 *chksum, kal_uint32 chksum_size, nvram_drv_read_type_enum read_type)
1376{
1377 /*----------------------------------------------------------------*/
1378 /* Local Variables */
1379 /*----------------------------------------------------------------*/
1380 kal_int32 status;
1381 kal_uint8 *default_value = NULL, *default_value_buffer = NULL;
1382 NVRAM_FILE_NAME nvramname;
1383 kal_uint8 *checksum_buf = NULL;
1384 kal_uint16 *temp_chksum = (kal_uint16 *)chksum;
1385 kal_uint32 nvram_chksum_size = 0;
1386 nvram_lid_chksum_info lid_chksum_info = {0};
1387 #ifdef __NV_CHKSUM_ENHANCE__
1388 kal_uint32 chksum_algo_type = NVRAM_MD5;
1389 #endif
1390
1391 kal_uint32 file_offset = 0;
1392 nvram_folder_enum folder_index;
1393
1394 /*----------------------------------------------------------------*/
1395 /* Code Body */
1396 /*----------------------------------------------------------------*/
1397 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s-> LID 0x%04X rec_index=%d,\r\n",__FUNCTION__,ldi->LID,rec_index);
1398 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"rec_amount=%d,read_type=%d \r\n",rec_amount, read_type);
1399
1400 nvram_get_lid_chksum_algo_info(ldi, &lid_chksum_info, KAL_FALSE, KAL_FALSE);
1401 nvram_chksum_size = lid_chksum_info.algo_info.chksum_algo_length;
1402 #ifdef __NV_CHKSUM_ENHANCE__
1403 chksum_algo_type = lid_chksum_info.algo_info.chksum_algo_type;
1404 #endif
1405
1406 checksum_buf = (kal_uint8*) get_ctrl_buffer(nvram_chksum_size);
1407
1408/******************************************************
1409 * Device Broken
1410 ******************************************************/
1411
1412 /* Read Default Value */
1413 if (nvram_ptr->dev_broken)
1414 {
1415 kal_uint32 i;
1416
1417 default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
1418
1419 for (i = 0; i < rec_amount; i++)
1420 {
1421 /* when ldi size too big, we cannot operator it on buffer,
1422 use original default value pointer directly */
1423
1424 default_value = (kal_uint8*) nvram_get_default_value_to_write(ldi, (kal_uint16)(i + 1), NULL, 0);
1425
1426 /* the default_value is not assigned in table , ex: L1 LID */
1427 if (default_value == NULL)
1428 {
1429 nvram_get_default_value_to_write(ldi, (kal_uint16)(i + 1), default_value_buffer, MAX_NVRAM_RECORD_SIZE);
1430 default_value = default_value_buffer;
1431 }
1432 #ifdef __NV_CHKSUM_ENHANCE__
1433 if((chksum_algo_type == NVRAM_MD5) && ((read_type == NVRAM_DRV_READ_TYPE_CHKSUM_ONLY_2B )|| (read_type == NVRAM_DRV_READ_TYPE_CHKSUM_2B)))
1434 {
1435 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1436 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1437 }
1438 else
1439 {
1440 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1441 nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1442 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1443 }
1444 #else
1445 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1446 #endif
1447
1448 }
1449
1450
1451 free_ctrl_buffer(default_value_buffer);
1452 if (checksum_buf)
1453 {
1454 free_ctrl_buffer(checksum_buf);
1455 checksum_buf = NULL;
1456 }
1457
1458 status = NVRAM_IO_ERRNO_OK;
1459 return (nvram_errno_enum)status;
1460 }
1461
1462/******************************************************
1463 * OTP
1464 ******************************************************/
1465#ifdef __NVRAM_OTP__
1466 /* Handle request to OTP */
1467 if (NVRAM_IS_CATEGORY_OTP(ldi->category))
1468 {
1469 if (nvram_ptr->state != NVRAM_STATE_READY)
1470 {
1471 status = NVRAM_IO_ERRNO_ACCESS_DENIED;
1472 }
1473 else
1474 {
1475 kal_uint32 i;
1476
1477 default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
1478
1479 status = nvram_read_otp_data_item(ldi, rec_index, rec_amount, default_value_buffer, MAX_NVRAM_RECORD_SIZE);
1480
1481 for (i = 0; i < rec_amount; i++)
1482 {
1483 #ifdef __NV_CHKSUM_ENHANCE__
1484 if((chksum_algo_type == NVRAM_MD5) && ((read_type == NVRAM_DRV_READ_TYPE_CHKSUM_ONLY_2B )|| (read_type == NVRAM_DRV_READ_TYPE_CHKSUM_2B)))
1485 {
1486 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1487 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1488 }
1489 else
1490 {
1491 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1492 nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1493 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1494 }
1495 #else
1496 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1497 #endif
1498 }
1499 free_ctrl_buffer(default_value_buffer);
1500 }
1501 if (checksum_buf)
1502 {
1503 free_ctrl_buffer(checksum_buf);
1504 checksum_buf = NULL;
1505 }
1506 return (nvram_errno_enum)status;
1507 }
1508#endif
1509
1510/******************************************************
1511 * Custom Disk
1512 ******************************************************/
1513
1514#ifdef __NVRAM_CUSTOM_DISK__
1515 if (NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category))
1516 {
1517 kal_uint32 i;
1518 default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
1519
1520 status = nvram_read_custom_disk(ldi, rec_index, rec_amount, default_value_buffer, MAX_NVRAM_RECORD_SIZE);
1521
1522 for (i = 0; i < rec_amount; i++)
1523 {
1524 #ifdef __NV_CHKSUM_ENHANCE__
1525 if((chksum_algo_type == NVRAM_MD5) && ((read_type == NVRAM_DRV_READ_TYPE_CHKSUM_ONLY_2B )|| (read_type == NVRAM_DRV_READ_TYPE_CHKSUM_2B)))
1526 {
1527 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1528 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1529 }
1530 else
1531 {
1532 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1533 nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1534 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1535 }
1536 #else
1537 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1538 #endif
1539 }
1540
1541 free_ctrl_buffer(default_value_buffer);
1542 if (checksum_buf)
1543 {
1544 free_ctrl_buffer(checksum_buf);
1545 checksum_buf = NULL;
1546 }
1547 return (nvram_errno_enum)status;
1548 }
1549#endif
1550
1551/******************************************************
1552 * FAT
1553 ******************************************************/
1554#if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
1555 if (!nvram_util_has_file_created( ldi)) {
1556 kal_uint32 i;
1557
1558 default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
1559
1560 for (i = 0; i < rec_amount; i++)
1561 {
1562 /* when ldi size too big, we cannot operator it on buffer,
1563 use original default value pointer directly */
1564 default_value = (kal_uint8*) nvram_get_default_value_to_write(ldi, (kal_uint16)(i + rec_index), NULL, 0);
1565
1566 /* the default_value is not assigned in table , ex: L1 LID */
1567 if (default_value == NULL)
1568 {
1569 nvram_get_default_value_to_write(ldi, (kal_uint16)(i + rec_index), default_value_buffer, MAX_NVRAM_RECORD_SIZE);
1570 default_value = default_value_buffer;
1571 }
1572
1573 #ifdef __NV_CHKSUM_ENHANCE__
1574 if((chksum_algo_type == NVRAM_MD5) && ((read_type == NVRAM_DRV_READ_TYPE_CHKSUM_ONLY_2B )|| (read_type == NVRAM_DRV_READ_TYPE_CHKSUM_2B)))
1575 {
1576 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1577 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1578 }
1579 else
1580 {
1581 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1582 nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1583 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1584 }
1585 #else
1586 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1587 #endif
1588 }
1589
1590
1591 free_ctrl_buffer(default_value_buffer);
1592 if (checksum_buf)
1593 {
1594 free_ctrl_buffer(checksum_buf);
1595 checksum_buf = NULL;
1596 }
1597 return NVRAM_IO_ERRNO_OK;
1598 }
1599 #endif
1600
1601 folder_index = nvram_query_folder_index(ldi->category);
1602
1603#ifdef __NVRAM_PSEUDO_MERGE__
1604 if (NVRAM_IS_ATTR_PACKAGE(ldi->attr))
1605 {
1606 file_offset = (kal_uint32) (ldi->description);
1607 }
1608 else
1609#endif
1610 {
1611 file_offset = NVRAM_LDI_HEADER_SIZE;
1612 }
1613
1614 nvram_util_make_lid_filename(ldi, nvramname, KAL_TRUE);
1615#ifdef __NVRAM_READ_RESERVED_FILE__
1616 if(ldi->LID == NVRAM_EF_READ_RESERVED_LID) {
1617 sprintf((nvramname + NVRAM_FILE_LEN), "_%04X%04X", ldi->total_records, ldi->size);
1618 }
1619#endif
1620
1621 status = nvram_drv_fat_read(nvramname, folder_index, file_offset, rec_index, rec_amount, ldi->size, (kal_uint8*) chksum, read_type, ldi);
1622
1623 if (status != NVRAM_DRV_OK && (ldi->attr & NVRAM_ATTR_MULTIPLE)
1624#ifdef __NVRAM_READ_RESERVED_FILE__
1625 && (ldi->LID != NVRAM_EF_READ_RESERVED_LID)
1626#endif
1627 )
1628 {
1629 nvram_util_make_lid_filename(ldi, nvramname, KAL_FALSE);
1630
1631 status = nvram_drv_fat_read(nvramname, folder_index, file_offset, rec_index, rec_amount, ldi->size, (kal_uint8*) chksum, read_type, ldi);
1632
1633 if (status == NVRAM_DRV_OK)
1634 {
1635 nvram_drv_fat_backup(ldi, KAL_FALSE);
1636 }
1637 }
1638
1639 free_ctrl_buffer(checksum_buf);
1640
1641 return (nvram_errno_enum)status;
1642} /* end of nvram_read_data_item */
1643
1644
1645/*****************************************************************************
1646 * FUNCTION
1647 * nvram_read_data_item_chksum_8b
1648 * DESCRIPTION
1649 * This is nvram_read_data_item() function of NVRAM module.
1650 * PARAMETERS
1651 * ldi [IN] MUST be 1 ~ (total_LID - 1)
1652 * rec_index [IN]
1653 * rec_amount [IN]
1654 * buffer [IN] MUST be even-bytes aligned.
1655 * rec_size [IN] MUST be even-bytes aligned: ie, ((ldi->size + 1) / 2) * 2
1656 * index(?) [IN] MUST be 1 ~ total_records
1657 * RETURNS
1658 * NVRAM_IO_ERRNO_OK if read successfully.
1659 * NVRAM_IO_ERRNO_CHK if checksum error, and cannot be reset to default value.
1660 * NVRAM_IO_ERRNO_INIT if checksum error, but successfully reset to default value.
1661 *****************************************************************************/
1662nvram_errno_enum nvram_read_data_item_chksum_8b
1663 (nvram_ltable_entry_struct *ldi, kal_uint16 rec_index, kal_uint16 rec_amount, kal_uint8 *chksum, kal_uint32 chksum_size, nvram_drv_read_type_enum read_type)
1664{
1665 /*----------------------------------------------------------------*/
1666 /* Local Variables */
1667 /*----------------------------------------------------------------*/
1668 kal_int32 status;
1669 kal_uint8 *default_value = NULL, *default_value_buffer = NULL;
1670 NVRAM_FILE_NAME nvramname;
1671 kal_uint8* checksum_buf = NULL;
1672 kal_uint32 nvram_chksum_size = 0;
1673 nvram_lid_chksum_info lid_chksum_info = {0};
1674 #ifdef __NV_CHKSUM_ENHANCE__
1675 kal_uint16 *temp_chksum = (kal_uint16 *)chksum;
1676 kal_uint32 chksum_algo_type = NVRAM_MD5;
1677 #endif
1678 kal_uint32 file_offset = 0;
1679 nvram_folder_enum folder_index;
1680
1681 /*----------------------------------------------------------------*/
1682 /* Code Body */
1683 /*----------------------------------------------------------------*/
1684 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s -> LID 0x%04X rec_index=%d\r\n",__FUNCTION__,ldi->LID,rec_index);
1685 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"rec_amount=%d,read_type=%d \r\n",rec_amount, read_type);
1686
1687 nvram_get_lid_chksum_algo_info(ldi, &lid_chksum_info, KAL_FALSE, KAL_FALSE);
1688 nvram_chksum_size = lid_chksum_info.algo_info.chksum_algo_length;
1689 #ifdef __NV_CHKSUM_ENHANCE__
1690 chksum_algo_type = lid_chksum_info.algo_info.chksum_algo_type;
1691 #endif
1692
1693 checksum_buf = (kal_uint8*) get_ctrl_buffer(nvram_chksum_size);
1694
1695 /******************************************************
1696 * Device Broken
1697 ******************************************************/
1698
1699 /* Read Default Value */
1700 if (nvram_ptr->dev_broken)
1701 {
1702 kal_uint32 i;
1703
1704 default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
1705
1706 for (i = 0; i < rec_amount; i++)
1707 {
1708 /* when ldi size too big, we cannot operator it on buffer,
1709 use original default value pointer directly */
1710
1711 default_value = (kal_uint8*) nvram_get_default_value_to_write(ldi, (kal_uint16)(i + 1), NULL, 0);
1712
1713 /* the default_value is not assigned in table , ex: L1 LID */
1714 if (default_value == NULL)
1715 {
1716 nvram_get_default_value_to_write(ldi, (kal_uint16)(i + 1), default_value_buffer, MAX_NVRAM_RECORD_SIZE);
1717 default_value = default_value_buffer;
1718 }
1719
1720 #ifdef __NV_CHKSUM_ENHANCE__
1721 if((chksum_algo_type == NVRAM_MD5) && ((read_type == NVRAM_DRV_READ_TYPE_CHKSUM_ONLY_2B )|| (read_type == NVRAM_DRV_READ_TYPE_CHKSUM_2B)))
1722 {
1723 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1724 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1725 }
1726 else
1727 {
1728 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1729 nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1730 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1731 }
1732 #else
1733 nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1734 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1735 #endif
1736 }
1737
1738
1739 free_ctrl_buffer(default_value_buffer);
1740 if (checksum_buf)
1741 {
1742 free_ctrl_buffer(checksum_buf);
1743 checksum_buf = NULL;
1744 }
1745 status = NVRAM_IO_ERRNO_OK;
1746
1747 return (nvram_errno_enum)status;
1748 }
1749
1750/******************************************************
1751 * OTP
1752 ******************************************************/
1753#ifdef __NVRAM_OTP__
1754 /* Handle request to OTP */
1755 if (NVRAM_IS_CATEGORY_OTP(ldi->category))
1756 {
1757 if (nvram_ptr->state != NVRAM_STATE_READY)
1758 {
1759 status = NVRAM_IO_ERRNO_ACCESS_DENIED;
1760 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"[Error] OTP LID:0x%04X NVRAM_ERRNO_NOT_READY\r\n",ldi->LID);
1761 }
1762 else
1763 {
1764 kal_uint32 i;
1765
1766 default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
1767
1768 status = nvram_read_otp_data_item(ldi, rec_index, rec_amount, default_value_buffer, MAX_NVRAM_RECORD_SIZE);
1769
1770 for (i = 0; i < rec_amount; i++)
1771 {
1772 #ifdef __NV_CHKSUM_ENHANCE__
1773 if((chksum_algo_type == NVRAM_MD5) && ((read_type == NVRAM_DRV_READ_TYPE_CHKSUM_ONLY_2B )|| (read_type == NVRAM_DRV_READ_TYPE_CHKSUM_2B)))
1774 {
1775 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1776 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1777 }
1778 else
1779 {
1780 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1781 nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1782 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1783 }
1784 #else
1785 nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1786 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1787 #endif
1788 }
1789 free_ctrl_buffer(default_value_buffer);
1790 }
1791
1792 if (checksum_buf)
1793 {
1794 free_ctrl_buffer(checksum_buf);
1795 checksum_buf = NULL;
1796 }
1797
1798 return (nvram_errno_enum)status;
1799 }
1800#endif
1801
1802/******************************************************
1803 * Custom Disk
1804 ******************************************************/
1805
1806#ifdef __NVRAM_CUSTOM_DISK__
1807 if (NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category))
1808 {
1809 kal_uint32 i;
1810 default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
1811
1812 status = nvram_read_custom_disk(ldi, rec_index, rec_amount, default_value_buffer, MAX_NVRAM_RECORD_SIZE);
1813
1814 for (i = 0; i < rec_amount; i++)
1815 {
1816 #ifdef __NV_CHKSUM_ENHANCE__
1817 if((chksum_algo_type == NVRAM_MD5) && ((read_type == NVRAM_DRV_READ_TYPE_CHKSUM_ONLY_2B )|| (read_type == NVRAM_DRV_READ_TYPE_CHKSUM_2B)))
1818 {
1819 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1820 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1821 }
1822 else
1823 {
1824 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1825 nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1826 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1827 }
1828 #else
1829 nvram_util_caculate_checksum(ldi, default_value_buffer + i * ldi->size, ldi->size, checksum_buf);
1830 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1831 #endif
1832 }
1833
1834 free_ctrl_buffer(default_value_buffer);
1835 if (checksum_buf)
1836 {
1837 free_ctrl_buffer(checksum_buf);
1838 checksum_buf = NULL;
1839 }
1840 nvram_debug_read_dump(ldi, 0x80, rec_index, rec_amount, chksum, chksum_size, NVRAM_IO_ERRNO_OK);
1841 return (nvram_errno_enum)status;
1842 }
1843#endif
1844
1845/******************************************************
1846 * FAT
1847 ******************************************************/
1848#if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
1849 if (!nvram_util_has_file_created( ldi)) {
1850 kal_uint32 i;
1851
1852 default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
1853
1854 for (i = 0; i < rec_amount; i++)
1855 {
1856 /* when ldi size too big, we cannot operator it on buffer,
1857 use original default value pointer directly */
1858 default_value = (kal_uint8*) nvram_get_default_value_to_write(ldi, (kal_uint16)(i + rec_index), NULL, 0);
1859
1860 /* the default_value is not assigned in table , ex: L1 LID */
1861 if (default_value == NULL)
1862 {
1863 nvram_get_default_value_to_write(ldi, (kal_uint16)(i + rec_index), default_value_buffer, MAX_NVRAM_RECORD_SIZE);
1864 default_value = default_value_buffer;
1865 }
1866
1867 #ifdef __NV_CHKSUM_ENHANCE__
1868 if((chksum_algo_type == NVRAM_MD5) && ((read_type == NVRAM_DRV_READ_TYPE_CHKSUM_ONLY_2B )|| (read_type == NVRAM_DRV_READ_TYPE_CHKSUM_2B)))
1869 {
1870 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1871 temp_chksum[i] = nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1872 }
1873 else
1874 {
1875 kal_mem_set(checksum_buf, 0, nvram_chksum_size);
1876 nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1877 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1878 }
1879 #else
1880 nvram_util_caculate_checksum(ldi, default_value, ldi->size, checksum_buf);
1881 kal_mem_cpy((chksum+ (i * nvram_chksum_size)), checksum_buf, nvram_chksum_size);
1882 #endif
1883 }
1884
1885
1886 free_ctrl_buffer(default_value_buffer);
1887 if (checksum_buf)
1888 {
1889 free_ctrl_buffer(checksum_buf);
1890 checksum_buf = NULL;
1891 }
1892 return NVRAM_IO_ERRNO_OK;
1893 }
1894 #endif
1895
1896 folder_index = nvram_query_folder_index(ldi->category);
1897
1898#ifdef __NVRAM_PSEUDO_MERGE__
1899 if (NVRAM_IS_ATTR_PACKAGE(ldi->attr))
1900 {
1901 file_offset = (kal_uint32) (ldi->description);
1902 }
1903 else
1904#endif
1905 {
1906 file_offset = NVRAM_LDI_HEADER_SIZE;
1907 }
1908
1909 nvram_util_make_lid_filename(ldi, nvramname, KAL_TRUE);
1910
1911 status = nvram_drv_fat_read(nvramname, folder_index, file_offset, rec_index, rec_amount, ldi->size, (kal_uint8*) chksum, read_type, ldi);
1912 nvram_debug_read_dump(ldi, 0x82, rec_index, rec_amount, chksum, chksum_size, status);
1913
1914 if (status != NVRAM_DRV_OK && (ldi->attr & NVRAM_ATTR_MULTIPLE))
1915 {
1916 nvram_util_make_lid_filename(ldi, nvramname, KAL_FALSE);
1917
1918 status = nvram_drv_fat_read(nvramname, folder_index, file_offset, rec_index, rec_amount, ldi->size, (kal_uint8*) chksum, read_type, ldi);
1919
1920 if (status == NVRAM_DRV_OK)
1921 {
1922 nvram_drv_fat_backup(ldi, KAL_FALSE);
1923 }
1924 }
1925
1926 free_ctrl_buffer(checksum_buf);
1927
1928 return (nvram_errno_enum)status;
1929} /* end of nvram_read_data_item */
1930
1931
1932
1933/*****************************************************************************
1934 * FUNCTION
1935 * nvram_read_data_item
1936 * DESCRIPTION
1937 * This is nvram_read_data_item() function of NVRAM module.
1938 * PARAMETERS
1939 * ldi [IN] MUST be 1 ~ (total_LID - 1)
1940 * rec_index [IN]
1941 * rec_amount [IN]
1942 * buffer [IN] MUST be even-bytes aligned.
1943 * rec_size [IN] MUST be even-bytes aligned: ie, ((ldi->size + 1) / 2) * 2
1944 * index(?) [IN] MUST be 1 ~ total_records
1945 * RETURNS
1946 * NVRAM_IO_ERRNO_OK if read successfully.
1947 * NVRAM_IO_ERRNO_CHK if checksum error, and cannot be reset to default value.
1948 * NVRAM_IO_ERRNO_INIT if checksum error, but successfully reset to default value.
1949 *****************************************************************************/
1950nvram_errno_enum nvram_read_data_item
1951 (nvram_ltable_entry_struct *ldi, kal_uint32 rec_index, kal_uint16 rec_amount, kal_uint8 *buffer, kal_uint32 buffer_size)
1952{
1953 /*----------------------------------------------------------------*/
1954 /* Local Variables */
1955 /*----------------------------------------------------------------*/
1956 nvram_errno_enum status = NVRAM_IO_ERRNO_OK;
1957 kal_uint8 *filename;
1958 FS_HANDLE hFile;
1959 nvram_ltable_entry_struct tmp_ldi ={0};
1960 mcf_ota_result_e mcf_ota_ret = MCF_OTA_R_SUCCESS;
1961 #if (defined(__CCCIFS_SUPPORT__) && defined(__MTK_TARGET__)) || defined(__NVRAM_BIN_REGION_SIMULATION__)
1962 kal_int32 ret;
1963 #endif
1964
1965 /*----------------------------------------------------------------*/
1966 /* Code Body */
1967 /*----------------------------------------------------------------*/
1968
1969 MD_TRC_IO_READ_DATA_ITEM_START(ldi->LID, rec_index, rec_amount, buffer_size);
1970 MD_TRC_INFO_NVRAM_DATA_ITEM(ldi->LID, ldi->size);
1971 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[collection]%s->LID 0x%04X,rec_index:%d,\r\n",__FUNCTION__,ldi->LID, rec_index);
1972 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[collection]rec_amount:%d,rec_size:%d \r\n",rec_amount,ldi->size);
1973 if (!NVRAM_IS_ATTR_RAW_DATA(ldi->attr) &&
1974 (buffer_size < ldi->size * rec_amount))
1975 {
1976 MD_TRC_IO_READ_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_INVALID_SIZE, __LINE__);
1977 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID 0x%04X NVRAM_IO_ERRNO_INVALID_SIZE\r\n",__FUNCTION__,ldi->LID);
1978 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]buffer_size(%d) < total_size(%d)\r\n",buffer_size,ldi->size * rec_amount);
1979 return NVRAM_IO_ERRNO_INVALID_SIZE;
1980 }
1981
1982/******************************************************
1983 * Device Broken
1984 ******************************************************/
1985 if (nvram_ptr->dev_broken)
1986 {
1987 kal_uint32 i;
1988
1989 MD_TRC_IO_READ_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_DRV_BROKEN, __LINE__);
1990
1991 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr)) {
1992 nvram_get_default_value_to_write(ldi, rec_index, buffer, buffer_size);
1993 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"return RAW LID 0x%04X default value as NVRAM_IO_ERRNO_DRV_BROKEN\r\n",ldi->LID);
1994 return NVRAM_IO_ERRNO_OK;
1995 }
1996
1997 for (i = 0; i < rec_amount; i++)
1998 {
1999 nvram_get_default_value_to_write(ldi, (i + 1), buffer + (i * ldi->size), ldi->size);
2000 }
2001 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"return LID 0x%04X default value as NVRAM_IO_ERRNO_DRV_BROKEN\r\n",ldi->LID);
2002 return NVRAM_IO_ERRNO_OK;
2003 }
2004
2005/******************************************************
2006 * OTP
2007 ******************************************************/
2008#ifdef __NVRAM_OTP__
2009 /* Handle request to OTP */
2010 if ((nvram_ptr->state != NVRAM_STATE_READY) && NVRAM_IS_CATEGORY_OTP(ldi->category))
2011 {
2012 MD_TRC_IO_READ_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_OK, __LINE__);
2013 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"[Error] OTP LID 0x%04X NVRAM_ERRNO_NOT_READY\r\n",ldi->LID);
2014 return NVRAM_IO_ERRNO_OK;
2015 }
2016 else if ((nvram_ptr->state == NVRAM_STATE_READY) && NVRAM_IS_CATEGORY_OTP(ldi->category))
2017 {
2018 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr)) {
2019 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]OTP Don't support Raw LID 0x%04X \r\n",ldi->LID);
2020 return NVRAM_IO_ERRNO_ACCESS_DENIED;
2021 }
2022 status = nvram_read_otp_data_item(ldi, rec_index, rec_amount, buffer, buffer_size);
2023 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID 0x%04X read OTP data result=%d\r\n",ldi->LID,status);
2024 }
2025 else
2026#endif
2027
2028
2029/******************************************************
2030 * Custom Disk
2031 ******************************************************/
2032#ifdef __NVRAM_CUSTOM_DISK__
2033 if (NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category))
2034 {
2035 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr)) {
2036 return NVRAM_IO_ERRNO_ACCESS_DENIED;
2037 }
2038 status = nvram_read_custom_disk(ldi, rec_index, rec_amount, buffer, buffer_size);
2039 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s LID 0x%04X read Custom Disk data result=%d\r\n",__FUNCTION__,ldi->LID,status);
2040 }
2041 else
2042#endif
2043
2044/******************************************************
2045 * FAT
2046 ******************************************************/
2047 { //be care about this "{}" it is use for "else" code of different store device
2048 #ifdef __NVRAM_CRYPT_TEST__
2049 if (ldi->LID == NVRAM_EF_NVRAM_MSP_TEST_LID)
2050 {
2051 extern kal_uint32 bReadMsp;
2052 bReadMsp = 1;
2053 }
2054 #endif
2055
2056 #if defined(__NVRAM_INIT_LID_BUFFER__)
2057 if(nvram_init_lid_buffer_read(ldi->LID, rec_index, rec_amount, buffer, buffer_size) == NVRAM_ERRNO_SUCCESS) {
2058 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID 0x%04X read from buffer\r\n",ldi->LID);
2059 return NVRAM_IO_ERRNO_OK;
2060 }
2061 #endif
2062 if(ldi->attr & NVRAM_ATTR_GEN_DEFAULT)
2063 {
2064 status = nvram_read_data_item_multiple(ldi, rec_index, rec_amount, buffer, buffer_size);
2065 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID 0x%04X with GEN_DEFAULT read result=%d\r\n",ldi->LID,status);
2066
2067 }
2068 #if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
2069 else if (!nvram_util_has_file_created(ldi)) {
2070 kal_uint32 i;
2071
2072 MD_TRC_IO_READ_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_INIT, __LINE__);
2073 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"LID 0x%04X file uncreated\r\n",ldi->LID);
2074 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr)) {
2075 nvram_get_default_value_to_write(ldi, rec_index, buffer, buffer_size);
2076 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"Raw Data LID 0x%04X read default value\r\n",ldi->LID);
2077 return NVRAM_IO_ERRNO_OK;
2078 }
2079
2080 for (i = 0; i < rec_amount; i++)
2081 {
2082 nvram_get_default_value_to_write(ldi, (kal_uint16)(i + rec_index), buffer + (i * ldi->size), ldi->size);
2083 }
2084 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID 0x%04X read return default value\r\n",ldi->LID);
2085 return NVRAM_IO_ERRNO_OK;
2086 }
2087 #endif
2088 else
2089 {
2090 status = nvram_read_data_item_multiple(ldi, rec_index, rec_amount, buffer, buffer_size);
2091 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID 0x%04X read file result=%d\r\n",ldi->LID,status);
2092 }
2093 }
2094 /*
2095 If read fail and the LID is located in NVRAM folder's subfolder,
2096 first check the root folder is OK or not.
2097 */
2098 if(status != NVRAM_IO_ERRNO_OK)
2099 {
2100 if(NVRAM_IS_CATEGORY_INTERNAL(ldi->category) || NVRAM_IS_CATEGORY_CALIBRAT(ldi->category) ||
2101 NVRAM_IS_CATEGORY_IMPORTANT(ldi->category) || (NVRAM_NVD_DATA == nvram_query_folder_index(ldi->category)))
2102 {
2103 filename = (kal_uint8 *) get_ctrl_buffer(NVRAM_MAX_PATH_LEN * sizeof(kal_wchar));
2104 #ifdef __NVRAM_LID_CACHE__
2105 nvram_util_take_mutex(g_nvram_fs_mutex);
2106 #endif
2107 NVRAM_FS_MAKE_ROOT_PATH((kal_wchar*)filename);
2108 NVRAM_FS_START_EX(FS_OP_OPEN,filename);
2109 hFile = FS_Open((const kal_wchar*)filename, FS_READ_ONLY | FS_OPEN_DIR);
2110 NVRAM_FS_END(FS_OP_OPEN,hFile);
2111 free_ctrl_buffer(filename);
2112 if(hFile >= FS_NO_ERROR) /* Open NVRAM root folder Success */
2113 {
2114 NVRAM_FS_START(FS_OP_CLOSE);
2115 kal_int32 fs_result = FS_Close(hFile);
2116 NVRAM_FS_END(FS_OP_CLOSE,fs_result);
2117 }
2118 else if (hFile == FS_FILE_NOT_FOUND || hFile == FS_PATH_NOT_FOUND)
2119 {
2120 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s NVRAM main folder lost,result:%d\r\n",__FUNCTION__,(kal_uint32)hFile);
2121 NVRAM_EXT_ASSERT(KAL_FALSE, (kal_uint32)hFile, NVRAM_LOC_OPEN_NV_FOLDER_FAIL_1, 0);
2122 }
2123 else
2124 {
2125 kal_prompt_trace(MOD_NVRAM, "Open NVRAM root folder result:%d\n\r", (kal_uint32)hFile);
2126 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s Open NVRAM root folder result:%d \r\n",__FUNCTION__,(kal_uint32)hFile);
2127 }
2128 #ifdef __NVRAM_LID_CACHE__
2129 nvram_util_give_mutex(g_nvram_fs_mutex);
2130 #endif
2131 }
2132 }
2133
2134
2135 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr) && (status == NVRAM_IO_ERRNO_ACCESS_DENIED)) {
2136 kal_prompt_trace(MOD_NVRAM, "NVRAM READ RAW DATA OUT OF BOUNDARY:%d\n\r", DISPLAY_ERROR(status));
2137 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
2138 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
2139 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
2140
2141 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"NVRAM READ RAW DATA OUT OF BOUNDARY:%d\r\n",DISPLAY_ERROR(status));
2142 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"LID:0x%04X, total_records:%d, record_size:%d\r\n",ldi->LID, ldi->total_records, ldi->size);
2143 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"category:0x%08X, attr:0x%08X\r\n",ldi->category, ldi->attr);
2144 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"fileprefix:%s, fileverno:%s\r\n",ldi->fileprefix, ldi->fileverno);
2145 return status;
2146 }
2147 memcpy((void *)(&tmp_ldi),ldi,sizeof(nvram_ltable_entry_struct));
2148#if (defined(__CCCIFS_SUPPORT__) && defined(__MTK_TARGET__)) || defined(__NVRAM_BIN_REGION_SIMULATION__)
2149 if ((status != NVRAM_IO_ERRNO_OK) && NVRAM_IS_CATEGORY_IN_BIN_REGION(ldi->category))
2150 {
2151 MD_TRC_IO_READ_DATA_ITEM_MULTIPLE(ldi->LID, status, status,nvram_drv_fat_get_last_err(), __LINE__);
2152
2153 //if AP restore fail, nvram_recover_data_item() will assert
2154 ret = nvram_recover_data_item(ldi);
2155 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s LID 0x%04X recover result:%d\r\n",__FUNCTION__,ldi->LID,ret);
2156
2157 if((nvram_ptr->state == NVRAM_STATE_READY) && (ret == NVRAM_IO_ERRNO_OK))
2158 {
2159 mcf_ota_ret = mcf_do_ota_by_lid(ldi->LID,1,ldi->total_records,&tmp_ldi);
2160 kal_prompt_trace(MOD_NVRAM, "%s @%d mcf_ota_ret=%d\n\r",__FUNCTION__,__LINE__ , mcf_ota_ret);
2161 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP," %s mcf_do_ota_by_lid return %d\r\n",__FUNCTION__,mcf_ota_ret);
2162 }
2163 status = nvram_read_data_item_multiple(ldi, rec_index, rec_amount, buffer, buffer_size);
2164
2165 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s read data after recover result:%d\r\n",__FUNCTION__,status);
2166 if(status != NVRAM_IO_ERRNO_OK)
2167 {
2168 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_RESTORE_SUCCESS_READ_FAIL:%d\n\r", DISPLAY_ERROR(status));
2169 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
2170 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
2171 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
2172
2173 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_RESTORE_SUCCESS_READ_FAIL:%d\r\n", DISPLAY_ERROR(status));
2174 if(NVRAM_IS_ATTR_FAULT_ASSERT(ldi->attr)) {
2175 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
2176 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
2177 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
2178 NVRAM_EXT_ASSERT(KAL_FALSE, DISPLAY_ERROR(status), NVRAM_LOC_RESTORE_SUCCESS_READ_FAIL, ldi->LID);
2179 }
2180 }
2181 }
2182#endif
2183
2184
2185#ifdef __NVRAM_UNIT_TEST__
2186 status = nvram_unit_test_get_io_status(status);
2187#endif
2188
2189 /*
2190 * Error Handling
2191 * 1. try to restore data from backup partition
2192 * 2. reset data if data is not in important category
2193 *
2194 */
2195
2196#ifdef __NVRAM_BACKUP_DISK_RAW__
2197 if (status != NVRAM_IO_ERRNO_OK && NVRAM_IS_ATTR_BACKUP_RAW(ldi->attr))
2198 {
2199 MD_TRC_IO_READ_DATA_ITEM_RESULT(ldi->LID, status, __LINE__);
2200 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s LID 0x%04X read for backup disk raw result:%d\r\n",__FUNCTION__,ldi->LID,status);
2201 if (nvram_recover_image_by_lid(ldi) == NVRAM_ERRNO_SUCCESS)
2202 {
2203 #ifdef __NVRAM_LID_CACHE__
2204 if((!(NVRAM_IS_ATTR_RAW_DATA(ldi->attr))) && NVRAM_RD_WITH_CACHE(ldi->LID))
2205 {
2206 unmask_valid_bit_by_ltable_entry(ldi, 0, (ldi->total_records + 1));
2207 }
2208 #endif
2209 status = nvram_read_data_item_multiple(ldi, rec_index, rec_amount, buffer, buffer_size, KAL_FALSE);
2210 }
2211 }
2212#endif
2213
2214 /* it is impossible to read data from sds fail
2215 if it fails, we have no error handling here , so assert */
2216
2217
2218 /* If we read internal item fail, we do not reset it , just return fail
2219 We will reset it after error handling */
2220
2221 //internal data locates in the SDS also, need to consider this
2222 if (status != NVRAM_IO_ERRNO_OK && !NVRAM_IS_CATEGORY_INTERNAL(ldi->category)
2223 #if defined (__NVRAM_UT_TEST__)
2224 && (ldi->LID != NVRAM_EF_SYS_LID)
2225 #endif
2226 )
2227 {
2228
2229 MD_TRC_IO_READ_DATA_ITEM_RESULT(ldi->LID, status, __LINE__);
2230 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM ASSERT ERROR After Recover:%d\r\n", DISPLAY_ERROR(status));
2231 if(NVRAM_IS_ATTR_FAULT_ASSERT(ldi->attr))
2232 {
2233 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_READ_IMPORTANT_DATA_FAIL:%d\r\n", DISPLAY_ERROR(status));
2234 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
2235 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
2236 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
2237 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_READ_IMPORTANT_DATA_FAIL:%d\n\r", DISPLAY_ERROR(status));
2238 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
2239 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
2240 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
2241 NVRAM_EXT_ASSERT(KAL_FALSE, DISPLAY_ERROR(status), NVRAM_LOC_READ_IMPORTANT_DATA_FAIL, ldi->LID);
2242 }
2243
2244 if((status = nvram_reset_one_data_item(ldi, 1, ldi->total_records)) == NVRAM_IO_ERRNO_OK)
2245 {
2246 kal_uint32 i;
2247
2248 MD_TRC_IO_READ_DATA_ITEM_RESULT(ldi->LID, status, __LINE__);
2249 if(nvram_ptr->state == NVRAM_STATE_READY)
2250 {
2251 mcf_ota_ret = mcf_do_ota_by_lid(ldi->LID,1,ldi->total_records,&tmp_ldi);
2252 kal_prompt_trace(MOD_NVRAM, "%s @%d mcf_ota_ret=%d\n\r",__FUNCTION__,__LINE__ , mcf_ota_ret);
2253 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s mcf_do_ota_by_lid return %d\r\n",__FUNCTION__,mcf_ota_ret);
2254 if(nvram_util_has_file_created(ldi))
2255 {
2256 status = nvram_read_data_item_multiple(ldi, rec_index, rec_amount, buffer, buffer_size);
2257 }
2258 else
2259 {
2260 for (i = 0; i < rec_amount; i++)
2261 {
2262 nvram_get_default_value_to_write(ldi, (kal_uint16)(rec_index + i), buffer + (i * ldi->size), ldi->size);
2263 }
2264 }
2265 }
2266 else
2267 {
2268 for (i = 0; i < rec_amount; i++)
2269 {
2270 nvram_get_default_value_to_write(ldi, (kal_uint16)(rec_index + i), buffer + (i * ldi->size), ldi->size);
2271 }
2272 }
2273
2274 }
2275 else
2276 {
2277 MD_TRC_IO_READ_DATA_ITEM_RESULT(ldi->LID, status, __LINE__);
2278 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_READ_AND_RESET_FAIL:%d\n\r", DISPLAY_ERROR(status));
2279 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
2280 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
2281 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
2282
2283 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_READ_AND_RESET_FAIL:%d\r\n", DISPLAY_ERROR(status));
2284 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
2285 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
2286 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
2287 NVRAM_EXT_ASSERT(KAL_FALSE, DISPLAY_ERROR(status), NVRAM_LOC_READ_AND_RESET_FAIL, ldi->LID);
2288 }
2289 }
2290 return status;
2291} /* end of nvram_read_data_item */
2292
2293
2294/*****************************************************************************
2295 * FUNCTION
2296 * nvram_read_data_item_multiple
2297 * DESCRIPTION
2298 * This is nvram_read_data_item_multiple() function of NVRAM module.
2299 * Note that multiple copied attribute DOES NOT support for
2300 * linear fixed logical data items.
2301 * PARAMETERS
2302 * ldi [IN]
2303 * rec_index [IN]
2304 * rec_amount [IN]
2305 * buffer [IN/OUT]
2306 * rec_size [IN]
2307 * RETURNS
2308 * NVRAM_IO_ERRNO_INIT if all copies are corrupted and any of them is reset successfully.
2309 * NVRAM_IO_ERRNO_CHK if all copies are corrupted and reset failed.
2310 * NVRAM_IO_ERRNO_OK at least one valid copy is read.
2311 *****************************************************************************/
2312static nvram_errno_enum nvram_read_data_item_multiple
2313 (nvram_ltable_entry_struct *ldi, kal_uint32 rec_index, kal_uint16 rec_amount, kal_uint8 *buffer, kal_uint32 buffer_size)
2314{
2315 /*----------------------------------------------------------------*/
2316 /* Local Variables */
2317 /*----------------------------------------------------------------*/
2318 nvram_drv_status_enum drv_status[2] = {NVRAM_DRV_OK, NVRAM_DRV_OK};
2319
2320 NVRAM_FILE_NAME nvramname;
2321 kal_uint32 file_offset = 0;
2322 nvram_folder_enum folder_index;
2323 kal_bool multiple = KAL_FALSE;
2324 kal_uint32 nvram_chksum_size = 0;
2325 nvram_drv_read_type_enum read_chksum_type = NVRAM_DRV_READ_TYPE_CHKSUM;
2326 nvram_lid_chksum_info lid_chksum_info = {0};
2327
2328 /*----------------------------------------------------------------*/
2329 /* Code Body */
2330 /*----------------------------------------------------------------*/
2331 if (NVRAM_IS_ATTR_MULTIPLE(ldi->attr) || NVRAM_IS_ATTR_BACKUP_FAT(ldi->attr) || NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category))
2332 {
2333 multiple = KAL_TRUE;
2334 }
2335 folder_index = nvram_query_folder_index(ldi->category);
2336
2337 file_offset = NVRAM_LDI_HEADER_SIZE;
2338 nvram_util_make_lid_filename(ldi, nvramname, KAL_TRUE);
2339
2340#ifdef __NVRAM_PSEUDO_MERGE__
2341 if (NVRAM_IS_ATTR_PACKAGE(ldi->attr))
2342 {
2343 file_offset = (kal_uint32) (ldi->description);
2344 if (!multiple)
2345 {
2346 nvram_make_package_filename(nvramname, 'A');
2347 }
2348 }
2349#endif
2350#ifdef __NVRAM_READ_RESERVED_FILE__
2351 if(ldi->LID == NVRAM_EF_READ_RESERVED_LID) {
2352 sprintf((nvramname + NVRAM_FILE_LEN), "_%04X%04X", ldi->total_records, ldi->size);
2353 }
2354#endif
2355 /*************************************************************************
2356 * Step 1: try to find one valid copy
2357 * Step 2: If found, try to recover another one if need
2358 * Step 3: If not found or recover fail, reset the data
2359 *
2360 * If fail in step 2 and step 3, return error
2361 ***************************************************************************/
2362
2363 /* First, try to find one valid / healthy copy */
2364
2365 do
2366 {
2367 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr))
2368 drv_status[0] = nvram_drv_fat_read(
2369 nvramname,
2370 folder_index,
2371 (file_offset + rec_index),
2372 1,
2373 1,
2374 buffer_size,
2375 buffer,
2376 NVRAM_DRV_READ_TYPE_DATA,
2377 ldi);
2378 else
2379 drv_status[0] = nvram_drv_fat_read(
2380 nvramname,
2381 folder_index,
2382 file_offset,
2383 rec_index,
2384 rec_amount,
2385 ldi->size,
2386 buffer,
2387 NVRAM_DRV_READ_TYPE_DATA,
2388 ldi);
2389
2390 #ifdef __NVRAM_UNIT_TEST__
2391 drv_status[0] = nvram_unit_test_get_drv_status(drv_status[0]);
2392 #endif
2393
2394 #ifdef __NVRAM_READ_RESERVED_FILE__
2395 if (ldi->LID == NVRAM_EF_READ_RESERVED_LID) break;
2396 #endif
2397 if (!multiple) break;
2398
2399 //Read 2nd copy
2400 #ifdef __NVRAM_BACKUP_DISK_FAT__
2401 if (NVRAM_IS_ATTR_BACKUP_FAT(ldi->attr))
2402 {
2403 folder_index = NVRAM_NVD_BAK;
2404 }
2405 #endif
2406
2407
2408 #if defined(__MTK_TARGET__) && defined(__NVRAM_IMPORTANT_PARTITIONS__) && defined(__CCCIFS_SUPPORT__)
2409 {
2410 folder_index = nvram_query_folder_index_ex(ldi->category, KAL_FALSE);
2411 }
2412 #endif
2413
2414 nvram_util_make_lid_filename(ldi, nvramname, KAL_FALSE);
2415
2416 if (drv_status[0] == NVRAM_DRV_OK)
2417 {
2418 #if defined(__NVRAM_WRITE_PROTECT_ENABLE__) && defined(__NVRAM_IMPORTANT_PARTITIONS__) && defined(__CCCIFS_SUPPORT__)
2419 if (NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category))
2420 {
2421 //read NVRAM_NVD_IMPNT success, return directly
2422 drv_status[1] = NVRAM_DRV_OK;
2423 }
2424 else
2425 #endif
2426 {
2427 //Read checksum only
2428 kal_uint8* extra_buffer;
2429
2430 #if defined(__MTK_TARGET__) && defined(__NVRAM_IMPORTANT_PARTITIONS__) && defined(__CCCIFS_SUPPORT__)
2431 folder_index = nvram_query_folder_index_ex(ldi->category, KAL_FALSE);
2432 #endif
2433
2434 nvram_get_lid_chksum_algo_info(ldi, &lid_chksum_info, KAL_FALSE, KAL_FALSE);
2435 nvram_chksum_size = lid_chksum_info.algo_info.chksum_algo_length;
2436 read_chksum_type = lid_chksum_info.read_chksum_type;
2437
2438 extra_buffer = (kal_uint8*) get_ctrl_buffer(nvram_chksum_size * rec_amount);
2439
2440 drv_status[1] = nvram_drv_fat_read(
2441 nvramname,
2442 folder_index,
2443 file_offset,
2444 rec_index,
2445 rec_amount,
2446 ldi->size,
2447 extra_buffer,
2448 read_chksum_type,
2449 ldi);
2450 free_ctrl_buffer(extra_buffer);
2451 }
2452 }
2453 else
2454 {
2455 //read data
2456 drv_status[1] = nvram_drv_fat_read(
2457 nvramname,
2458 folder_index,
2459 file_offset,
2460 rec_index,
2461 rec_amount,
2462 ldi->size,
2463 buffer,
2464 NVRAM_DRV_READ_TYPE_DATA,
2465 ldi);
2466 }
2467
2468 MD_TRC_IO_READ_DATA_ITEM_MULTIPLE(ldi->LID, drv_status[0], drv_status[1], nvram_drv_fat_get_last_err(), __LINE__);
2469 if ((drv_status[0] == NVRAM_DRV_OK) && (drv_status[1] == NVRAM_DRV_OK))
2470 {
2471 //Need to check if checksum[0] != checksum[1] in the future
2472 return NVRAM_IO_ERRNO_OK;
2473 }
2474 else if ((drv_status[0] != NVRAM_DRV_OK) && (drv_status[1] != NVRAM_DRV_OK))
2475 {
2476 //if SDS, backup from SDS
2477 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]return NVRAM_IO_ERRNO_CHK,drv_status[0]=%d drv_status[1]=%d\r\n",drv_status[0],drv_status[1]);
2478 return NVRAM_IO_ERRNO_CHK;
2479 }
2480 else if ((drv_status[0] != NVRAM_DRV_OK))
2481 {
2482 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s try to backup,drv_status[0]=%d,last_err(%d)\r\n",__FUNCTION__,drv_status[0], nvram_drv_fat_get_last_err());
2483 drv_status[0] = nvram_drv_fat_backup(ldi, KAL_FALSE);
2484 }
2485 else
2486 {
2487 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"%s try to backup,drv_status[1]=%d, last_err(%d)\r\n",__FUNCTION__,drv_status[1], nvram_drv_fat_get_last_err());
2488 drv_status[1] = nvram_drv_fat_backup(ldi, KAL_TRUE);
2489 }
2490
2491 }while(0);
2492
2493
2494 /* read two copy fail or recover fail */
2495 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr) && ((drv_status[0] == FS_INVALID_FILE_POS) || (drv_status[1] == FS_INVALID_FILE_POS))) {
2496 MD_TRC_IO_READ_DATA_ITEM_MULTIPLE(ldi->LID, drv_status[0], drv_status[1], nvram_drv_fat_get_last_err(), __LINE__);
2497 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s fail after restore raw file\r\n",__FUNCTION__);
2498 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]return NVRAM_IO_ERRNO_ACCESS_DENIED drv_status[0]=%d drv_status[1]=%d\r\n",drv_status[0],drv_status[1]);
2499 return NVRAM_IO_ERRNO_ACCESS_DENIED;
2500 }
2501 if ((drv_status[0] != NVRAM_DRV_OK) || (drv_status[1] != NVRAM_DRV_OK))
2502 {
2503 MD_TRC_IO_READ_DATA_ITEM_MULTIPLE(ldi->LID, drv_status[0], drv_status[1], nvram_drv_fat_get_last_err(), __LINE__);
2504 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s fail after restore\r\n",__FUNCTION__);
2505 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]return NVRAM_IO_ERRNO_CHK, drv_status[0]=%d drv_status[1]=%d\r\n",drv_status[0],drv_status[1]);
2506 return NVRAM_IO_ERRNO_CHK;
2507 }
2508 return NVRAM_IO_ERRNO_OK;
2509} /* end of nvram_read_data_item_multiple */
2510
2511/*****************************************************************************
2512 * FUNCTION
2513 * nvram_read_data_item
2514 * DESCRIPTION
2515 * This is nvram_read_exception_data_item() function of NVRAM module.
2516 * PARAMETERS
2517 * ldi [IN] MUST be 1 ~ (total_LID - 1)
2518 * index [IN] MUST be 1 ~ total_records
2519 * data [?]
2520 * is_init [IN]
2521 * buffer_size(?) [IN] MUST be even-bytes aligned: ie, ((ldi->size + 1) / 2) * 2 Note that content of `data' could be changed due to encyrption!!
2522 * buffer(?) [IN] MUST be even-bytes aligned.
2523 * RETURNS
2524 * NVRAM_IO_ERRNO_INVALID_LID
2525 * NVRAM_IO_ERRNO_INVALID_RECORD
2526 * NVRAM_IO_ERRNO_INVALID_SIZE
2527 * NVRAM_IO_ERRNO_CHK if all copies are failed to read
2528 * NVRAM_IO_ERRNO_OK at least one valid copy is written.
2529 *****************************************************************************/
2530nvram_errno_enum nvram_read_exception_data_item(nvram_ltable_entry_struct *ldi, kal_uint16 rec_index, kal_uint8 *buffer, kal_uint32 buffer_size)
2531
2532{
2533 /*----------------------------------------------------------------*/
2534 /* Local Variables */
2535 /*----------------------------------------------------------------*/
2536 nvram_errno_enum status;
2537 NVRAM_FILE_NAME nvramname;
2538
2539 /*----------------------------------------------------------------*/
2540 /* Code Body */
2541 /*----------------------------------------------------------------*/
2542
2543 MD_TRC_IO_WRITE_DATA_ITEM_START(ldi->LID, rec_index, 0);
2544 MD_TRC_INFO_NVRAM_DATA_ITEM(ldi->LID, ldi->size);
2545 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s ====>\r\n",__FUNCTION__);
2546 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID:0x%04X rec_index=%d,rec_size=%d\r\n",ldi->LID, rec_index, ldi->size);
2547 /* Construct a even bytes aligned buffer, and assign it to returned data pointer */
2548 if (buffer == NULL)
2549 {
2550 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_INVALID_SIZE, __LINE__, 0);
2551 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID 0x%04X buffer is NULL\r\n",__FUNCTION__,ldi->LID);
2552 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
2553 return NVRAM_IO_ERRNO_INVALID_SIZE;
2554 }
2555
2556 /* Do not allow normal access use exception API */
2557 if(ldi->LID != NVRAM_EF_SYS_EXCEPTION_LID_DUMMY &&
2558 ldi->LID != NVRAM_EF_SYS_STATISTICS_LID)
2559 {
2560 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_ACCESS_DENIED, __LINE__, 0);
2561 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s Not Exception LID 0x%04X Access Denied \r\n",__FUNCTION__,ldi->LID);
2562 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
2563 return NVRAM_IO_ERRNO_ACCESS_DENIED;
2564 }
2565
2566/******************************************************
2567 * Device Broken
2568 ******************************************************/
2569 if (nvram_ptr->dev_broken)
2570 {
2571 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_DRV_BROKEN, __LINE__, 0);
2572 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X NVRAM_IO_ERRNO_DRV_BROKEN\r\n",__FUNCTION__,ldi->LID);
2573 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
2574 return NVRAM_IO_ERRNO_OK;
2575 }
2576
2577/******************************************************
2578 * OTP
2579 ******************************************************/
2580#ifdef __NVRAM_OTP__
2581 //block OTP request
2582 if (ldi->category & NVRAM_CATEGORY_OTP)
2583 {
2584 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_ACCESS_DENIED, __LINE__, 0);
2585 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s OTP LID 0x%04X Access Denied \r\n",__FUNCTION__,ldi->LID);
2586 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
2587 return NVRAM_IO_ERRNO_ACCESS_DENIED;
2588 }
2589 else
2590#endif
2591
2592/******************************************************
2593 * Custom Disk
2594 ******************************************************/
2595#ifdef __NVRAM_CUSTOM_DISK__
2596 //block CUSTOM_DISK request
2597 if (NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category))
2598 {
2599 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_ACCESS_DENIED, __LINE__, 0);
2600 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s Custom Disk LID 0x%04X Access Denied \r\n",__FUNCTION__,ldi->LID);
2601 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
2602 return NVRAM_IO_ERRNO_ACCESS_DENIED;
2603 }
2604 else
2605#endif
2606
2607
2608/******************************************************
2609 * FAT
2610 ******************************************************/
2611 { //be care about this "{}" it is use for "else" code of different store device
2612 if(buffer_size > ldi->size)
2613 {
2614 buffer_size = ldi->size;
2615 }
2616
2617 //Read exception file directly
2618 nvram_util_make_lid_filename(ldi, nvramname, KAL_TRUE);
2619
2620 status = nvram_drv_fat_read_exception_item(
2621 buffer,
2622 nvramname,
2623 rec_index, // record id
2624 ldi->size, // record size
2625 buffer_size); // buffer size
2626 }
2627
2628 if((status != NVRAM_DRV_OK) && (status != NVRAM_DRV_EMPTY_RECORD))
2629 {
2630 status = NVRAM_IO_ERRNO_CHK;
2631 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, status, __LINE__, 0);
2632 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID 0x%04X failed,status=%d\r\n",__FUNCTION__,ldi->LID,status);
2633 }
2634 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
2635 return status;
2636}
2637
2638#ifdef __NVRAM_WRITE_WITH_FILE_SIZE__
2639/*****************************************************************************
2640 * FUNCTION
2641 * nvram_get_lid_default_value_to_write
2642 * DESCRIPTION
2643 * This is nvram_get_default_value_to_write() function of NVRAM module.
2644 * Get default value of certain logical data item.
2645 * The default value is copied into buffer.
2646 * The returned content of buffer may be encrypted if needed.
2647 * PARAMETERS
2648 * ldi [?]
2649 * rec_index [IN]
2650 * buffer [?]
2651 * buffer_size [IN]
2652 * RETURNS
2653 * KAL_FALSE if no default value defined, KAL_TRUE otherwise.(?)
2654 *****************************************************************************/
2655kal_uint8 const * nvram_get_lid_default_value_to_write(
2656 nvram_ltable_entry_struct *ldi,
2657 kal_uint16 rec_index,
2658 kal_uint8 *buffer,
2659 kal_uint32 buffer_size)
2660{
2661 /*----------------------------------------------------------------*/
2662 /* Local Variables */
2663 /*----------------------------------------------------------------*/
2664 kal_uint8 const *default_value = ldi->default_value;
2665
2666 /*----------------------------------------------------------------*/
2667 /* Code Body */
2668 /*----------------------------------------------------------------*/
2669 if (ldi->category & NVRAM_CATEGORY_FUNC_DEFAULT)
2670 {
2671 if (buffer && ldi->default_value)
2672 {
2673 nvram_query_deault_func query_func = (nvram_query_deault_func)ldi->default_value;
2674 nvram_memset(buffer, (kal_uint8) NVRAM_EF_ZERO_DEFAULT_VALUE, buffer_size);
2675 if(ldi->LID != NVRAM_EF_SYS_LID)
2676 {
2677 query_func(ldi->LID, buffer, buffer_size);
2678 }
2679 }
2680 return NULL;
2681 }
2682 else
2683 {
2684 rec_index++;
2685 /* Multi default value */
2686 if (ldi->attr & NVRAM_ATTR_MULTI_DEFAULT)
2687 {
2688 rec_index--;
2689 }
2690 else
2691 {
2692 rec_index = 0;
2693 }
2694
2695 if (buffer)
2696 {
2697 if(buffer_size < ldi->size)
2698 {
2699 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_GET_DEFAULT_WITH_WRONG_PARAM:%d\n\r", NVRAM_INTERNAL_ERR(ldi->LID));
2700 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
2701 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
2702 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
2703
2704 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_GET_DEFAULT_WITH_WRONG_PARAM:%d\r\n", NVRAM_INTERNAL_ERR(ldi->LID));
2705 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
2706 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
2707 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
2708 NVRAM_EXT_ASSERT(KAL_FALSE, NVRAM_INTERNAL_ERR(ldi->LID), NVRAM_LOC_GET_DEFAULT_WITH_WRONG_PARAM, buffer_size);
2709 }
2710 nvram_memset(buffer, (kal_uint8) NVRAM_EF_ZERO_DEFAULT_VALUE, buffer_size);
2711 kal_mem_cpy(buffer, (void*)(default_value + (ldi->size * rec_index)), ldi->size);
2712 }
2713 return default_value + (ldi->size * rec_index);
2714 }
2715}
2716#endif
2717
2718/*****************************************************************************
2719 * FUNCTION
2720 * nvram_get_default_value_to_write
2721 * DESCRIPTION
2722 * This is nvram_get_default_value_to_write() function of NVRAM module.
2723 * Get default value of certain logical data item.
2724 * The default value is copied into buffer.
2725 * The returned content of buffer may be encrypted if needed.
2726 * PARAMETERS
2727 * ldi [?]
2728 * rec_index [IN]
2729 * buffer [?]
2730 * buffer_size [IN]
2731 * RETURNS
2732 * KAL_FALSE if no default value defined, KAL_TRUE otherwise.(?)
2733 *****************************************************************************/
2734kal_uint8 const * nvram_get_default_value_to_write
2735 (nvram_ltable_entry_struct *ldi, kal_uint32 rec_index, kal_uint8 *buffer, kal_uint32 buffer_size)
2736{
2737 /*----------------------------------------------------------------*/
2738 /* Local Variables */
2739 /*----------------------------------------------------------------*/
2740 kal_uint8 const *default_value = ldi->default_value;
2741 kal_uint32 default_value_buffer_size = 0;
2742 kal_uint8 *default_value_buffer;
2743 /*----------------------------------------------------------------*/
2744 /* Code Body */
2745 /*----------------------------------------------------------------*/
2746 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr)) {
2747 nvram_memset(buffer, (kal_uint8) NVRAM_EF_ZERO_DEFAULT_VALUE, buffer_size);
2748 return NVRAM_EF_ZERO_DEFAULT;
2749 }
2750#ifdef __NVRAM_SECURE_DATA_STORAGE__
2751 if (NVRAM_IS_CATEGORY_BACKUP_SDS(ldi->category) && !(nvram_ptr->sw_status & NVRAM_SW_EMPTY_SDS))
2752 {
2753 if (buffer)
2754 {
2755 kal_uint32 status;
2756 kal_uint32 rec_amount = buffer_size / ldi->size;
2757 if ((status = nvram_sds_read_data_item(ldi, rec_index, rec_amount, buffer, buffer_size)) == NVRAM_ERRNO_SUCCESS)
2758 {
2759 //use the default value from the sds
2760 if ((ldi->total_records > 1) && !(ldi->attr & NVRAM_ATTR_MULTI_DEFAULT))
2761 {
2762 ldi->attr |= NVRAM_ATTR_MULTI_DEFAULT;
2763 }
2764 return NULL;
2765 }
2766 else
2767 {
2768 //error handle for the important data
2769 if (NVRAM_IS_CATEGORY_IMPORTANT(ldi->category))
2770 {
2771 extern void nvram_sds_throw_exception(kal_int32 err, kal_uint32 line);
2772 nvram_sds_throw_exception(status, __LINE__);
2773 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_GET_DEFAULT_FROM_SDS_FAIL:%d\n\r", DISPLAY_ERROR(status));
2774 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
2775 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
2776 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
2777
2778 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_GET_DEFAULT_FROM_SDS_FAIL:%d\r\n", DISPLAY_ERROR(status));
2779 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
2780 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
2781 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
2782 NVRAM_EXT_ASSERT(KAL_FALSE, DISPLAY_ERROR(status), NVRAM_LOC_GET_DEFAULT_FROM_SDS_FAIL ,ldi->LID);
2783 }
2784 //read sds fail, goto original flow
2785 goto GET_DEFAULT_VALUE;
2786 }
2787 }
2788 return NULL;
2789 }
2790GET_DEFAULT_VALUE:
2791#endif
2792
2793 if (ldi->category & NVRAM_CATEGORY_FUNC_DEFAULT)
2794 {
2795 if (buffer && ldi->default_value)
2796 {
2797 nvram_query_deault_func query_func = (nvram_query_deault_func)ldi->default_value;
2798
2799 if(ldi->LID == NVRAM_EF_SYS_LID)
2800 {
2801 nvram_memset(buffer, (kal_uint8) NVRAM_EF_ZERO_DEFAULT_VALUE, buffer_size);
2802 if(rec_index == 2)
2803 query_func(NVRAM_EF_BRANCH_VERNO_LID, buffer, ldi->size);
2804 else if(rec_index == 3)
2805 query_func(NVRAM_EF_FLAVOR_VERNO_LID, buffer, ldi->size);
2806 else if(rec_index == 4)
2807 query_func(NVRAM_EF_BUILD_TIME_LID, buffer, ldi->size);
2808 else
2809 query_func(NVRAM_EF_SYS_LID, buffer, ldi->size);
2810
2811 }else
2812 {
2813 default_value_buffer_size = ldi->size * ldi->total_records;
2814 if (default_value_buffer_size > MAX_NVRAM_RECORD_SIZE)
2815 {
2816 default_value_buffer_size = MAX_NVRAM_RECORD_SIZE;
2817 }
2818 default_value_buffer = (kal_uint8 *)get_ctrl_buffer(default_value_buffer_size);
2819 nvram_memset(default_value_buffer, (kal_uint8) NVRAM_EF_ZERO_DEFAULT_VALUE, default_value_buffer_size);
2820 query_func(ldi->LID, default_value_buffer, default_value_buffer_size);
2821 if ((ldi->attr & NVRAM_ATTR_MULTI_DEFAULT))
2822 {
2823 kal_mem_cpy(buffer, (void*)(default_value_buffer + (ldi->size * (rec_index -1))), buffer_size);
2824 }
2825 else
2826 {
2827 kal_uint32 i,record_num;
2828 record_num = buffer_size / (ldi->size);
2829 for (i = 0; i < record_num; i++)
2830 {
2831 kal_mem_cpy(buffer+(i*ldi->size), (void*)(default_value_buffer), ldi->size);
2832 }
2833 }
2834 free_ctrl_buffer(default_value_buffer);
2835 }
2836 return buffer;
2837 }
2838 }
2839 else
2840 {
2841 if (default_value == NULL || default_value == NVRAM_EF_FF_DEFAULT)
2842 /* No default value supplied. Fill the buffer with 0xFF. */
2843 {
2844 if (buffer)
2845 {
2846 kal_mem_set(buffer, (kal_uint8) NVRAM_INVALID_VALUE, buffer_size);
2847 }
2848 return NVRAM_EF_FF_DEFAULT;
2849 }
2850 else if (default_value == NVRAM_EF_ZERO_DEFAULT)
2851 /* Default value is all the same value (0x00) Fill it as well. */
2852 {
2853 if (buffer)
2854 {
2855 kal_mem_set(buffer, (kal_uint8) NVRAM_EF_ZERO_DEFAULT_VALUE, buffer_size);
2856 }
2857 return NVRAM_EF_ZERO_DEFAULT;
2858 }
2859 else
2860 {
2861 /* Multi default value */
2862 if ((ldi->attr & NVRAM_ATTR_MULTI_DEFAULT))
2863 {
2864 rec_index--;
2865 }
2866 else
2867 {
2868 rec_index = 0;
2869 }
2870
2871
2872 if (buffer)
2873 {
2874 if(buffer_size < ldi->size)
2875 {
2876 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_GET_DEFAULT_WITH_WRONG_PARAM:%d\n\r", NVRAM_INTERNAL_ERR(ldi->LID));
2877 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
2878 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
2879 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
2880
2881 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_GET_DEFAULT_WITH_WRONG_PARAM:%d\r\n", NVRAM_INTERNAL_ERR(ldi->LID));
2882 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
2883 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
2884 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
2885 NVRAM_EXT_ASSERT(KAL_FALSE, NVRAM_INTERNAL_ERR(ldi->LID), NVRAM_LOC_GET_DEFAULT_WITH_WRONG_PARAM_1, buffer_size);
2886 }
2887 nvram_memset(buffer, (kal_uint8) NVRAM_EF_ZERO_DEFAULT_VALUE, buffer_size);
2888 kal_mem_cpy(buffer, (void*)(default_value + (ldi->size * rec_index)), ldi->size);
2889 }
2890 return default_value + (ldi->size * rec_index);
2891 }
2892 }
2893 return NULL;
2894}
2895
2896
2897/*****************************************************************************
2898 * FUNCTION
2899 * nvram_write_data_item
2900 * DESCRIPTION
2901 * This is nvram_write_data_item() function of NVRAM module.
2902 * PARAMETERS
2903 * ldi [IN] MUST be 1 ~ (total_LID - 1)
2904 * index [IN] MUST be 1 ~ total_records
2905 * data [?]
2906 * is_init [IN]
2907 * buffer_size(?) [IN] MUST be even-bytes aligned: ie, ((ldi->size + 1) / 2) * 2 Note that content of `data' could be changed due to encyrption!!
2908 * buffer(?) [IN] MUST be even-bytes aligned.
2909 * RETURNS
2910 * NVRAM_IO_ERRNO_INVALID_LID
2911 * NVRAM_IO_ERRNO_INVALID_RECORD
2912 * NVRAM_IO_ERRNO_INVALID_SIZE
2913 * NVRAM_IO_ERRNO_CHK if all copies are failed to write
2914 * NVRAM_IO_ERRNO_OK at least one valid copy is written.
2915 *****************************************************************************/
2916nvram_errno_enum nvram_write_data_item(nvram_ltable_entry_struct *ldi, kal_uint32 index, kal_uint8 *data, kal_bool is_init)
2917{
2918 /*----------------------------------------------------------------*/
2919 /* Local Variables */
2920 /*----------------------------------------------------------------*/
2921 nvram_errno_enum status;
2922 kal_uint8 *filename;
2923 FS_HANDLE hFile;
2924 kal_bool lid_is_gen_default = KAL_FALSE;
2925 nvram_ltable_entry_struct tmp_ldi = {0};
2926 mcf_ota_result_e mcf_ota_ret = MCF_OTA_R_SUCCESS;
2927 kal_int32 result = FS_NO_ERROR;
2928 /*----------------------------------------------------------------*/
2929 /* Code Body */
2930 /*----------------------------------------------------------------*/
2931
2932
2933 MD_TRC_IO_WRITE_DATA_ITEM_START(ldi->LID, index, is_init);
2934 MD_TRC_INFO_NVRAM_DATA_ITEM(ldi->LID, ldi->size);
2935 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[collection]%s -> LID:0x%04X index=%d\r\n",__FUNCTION__,ldi->LID, index);
2936 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[collection]is_init=%d,rec_size=%d\r\n",is_init,ldi->size);
2937 /* Construct a even bytes aligned buffer, and assign it to returned data pointer */
2938 if (data == NULL)
2939 {
2940 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_INVALID_SIZE, __LINE__, is_init);
2941 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X data pointer is NULL is_init=%d\r\n",__FUNCTION__,ldi->LID,is_init);
2942 return NVRAM_IO_ERRNO_INVALID_SIZE;
2943 }
2944
2945 /* Global software lock status is locked and this logical data item's attribute is write-protected. */
2946 if ((nvram_ptr->lock == KAL_TRUE) && NVRAM_IS_ATTR_WRITEPROTECT(ldi->attr))
2947 {
2948 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_LOCKED, __LINE__, is_init);
2949 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X Fail as NVRAM_IO_ERRNO_LOCKED,is_init=%d\r\n",__FUNCTION__,ldi->LID,is_init);
2950 return NVRAM_IO_ERRNO_LOCKED;
2951 }
2952#ifdef __NVRAM_READ_RESERVED_FILE__
2953 if(ldi->LID == NVRAM_EF_READ_RESERVED_LID) {
2954 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_INVALID_LID, __LINE__, is_init);
2955 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X NVRAM_IO_ERRNO_INVALID_LID,is_init=%d\r\n",__FUNCTION__,ldi->LID,is_init);
2956 return NVRAM_IO_ERRNO_INVALID_LID;
2957 }
2958#endif
2959
2960/******************************************************
2961 * Device Broken
2962 ******************************************************/
2963 if (nvram_ptr->dev_broken)
2964 {
2965 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_DRV_BROKEN, __LINE__, is_init);
2966 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X NVRAM_IO_ERRNO_DRV_BROKEN,is_init=%d\r\n",__FUNCTION__,ldi->LID,is_init);
2967 return NVRAM_IO_ERRNO_OK;
2968 }
2969
2970#if defined(__NVRAM_CRITICAL_DATA_SIGN_SUPPORT__)
2971 if (is_init == KAL_FALSE && ldi->LID == custom_nvram_get_signed_critical_data_lid()) {
2972 kal_bool chk_ret = custom_nvram_check_signed_critical_data_before_write(data, ldi->size);
2973 if (chk_ret != KAL_TRUE) {
2974 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X NVRAM_ERRNO_SIG_CHK_FAIL\r\n",__FUNCTION__,ldi->LID);
2975 return NVRAM_ERRNO_SIG_CHK_FAIL;
2976 }
2977 }
2978#endif
2979
2980
2981/******************************************************
2982 * OTP
2983 ******************************************************/
2984
2985#ifdef __NVRAM_OTP__
2986 /* Handle request to OTP */
2987 if(ldi->category & NVRAM_CATEGORY_OTP)
2988 {
2989 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr))
2990 {
2991 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s Raw LID:0x%04X,NVRAM_IO_ERRNO_ACCESS_DENIED,is_init=%d\r\n",__FUNCTION__,ldi->LID,is_init);
2992 return NVRAM_IO_ERRNO_ACCESS_DENIED;
2993 }
2994 else if (nvram_ptr->state == NVRAM_STATE_READY)
2995 {
2996 status = nvram_write_otp_data_item(ldi, index, data, ldi->size);
2997 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s OTP LID:0x%04X,status=%d,is_init=%d\r\n",__FUNCTION__,ldi->LID,status,is_init);
2998 return status;
2999 }
3000 else if (nvram_ptr->state != NVRAM_STATE_READY)
3001 {
3002 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_OK, __LINE__, is_init);
3003 status = nvram_write_fs_data_item(ldi, index, data, ldi->size, is_init);
3004 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s OTP LID:0x%04X NVRAM_ERRNO_NOT_READY,is_init=%d\r\n",__FUNCTION__,ldi->LID,is_init);
3005 }
3006 }
3007 else
3008#endif
3009
3010/******************************************************
3011 * Custom Disk
3012 ******************************************************/
3013#ifdef __NVRAM_CUSTOM_DISK__
3014 if (NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category))
3015 {
3016 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr))
3017 {
3018 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP," %s LID:0x%04X,NVRAM_IO_ERRNO_ACCESS_DENIED,is_init=%d\r\n",__FUNCTION__,ldi->LID,is_init);
3019 return NVRAM_IO_ERRNO_ACCESS_DENIED;
3020 }
3021 status = nvram_write_custom_disk(ldi, index, data, ldi->size, is_init);
3022 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID:0x%04X,custom disk access status=%d,is_init=%d\r\n",ldi->LID,status,is_init);
3023 }
3024 else
3025#endif
3026
3027/******************************************************
3028 * FAT
3029 ******************************************************/
3030 { //be care about this "{}" it is use for "else" code of different store device
3031 #ifdef __NVRAM_CRYPT_TEST__
3032 if (ldi->LID == NVRAM_EF_NVRAM_MSP_TEST_LID)
3033 {
3034 extern kal_uint32 bWriteMsp;
3035 bWriteMsp = 1;
3036 }
3037 #endif
3038
3039 #if defined(__NVRAM_INIT_LID_BUFFER__)
3040 if(nvram_init_lid_buffer_write(ldi->LID, index, 1, data, ldi->size) == NVRAM_ERRNO_SUCCESS) {
3041 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID:0x%04X write data to buffer,return\r\n",ldi->LID);
3042 return NVRAM_IO_ERRNO_OK;
3043 }
3044 #endif
3045 #if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
3046 if(pre_write_check_mutex_owner != kal_get_current_task()) {
3047 if (nvram_util_has_file_created(ldi)) {
3048 if(!is_init) {
3049 nvram_write_data_header(ldi, LDI_HEADER_DBG_SECTION);
3050 }
3051 }
3052 else {
3053 nvram_write_data_header(ldi, LDI_HEADER_ALL_SECTION);
3054 }
3055 }
3056 nvram_util_pre_write_lid(ldi);
3057 #endif
3058
3059 status = nvram_write_fs_data_item(ldi, index, data, ldi->size, is_init);
3060 }
3061 /*
3062 If write fail and the LID is located in NVRAM folder's subfolder,
3063 first check the root folder is OK or not.
3064 */
3065 if(status != NVRAM_IO_ERRNO_OK)
3066 {
3067 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"nvram_write_fs_data_item status = %d\r\n",status);
3068 if(NVRAM_IS_CATEGORY_INTERNAL(ldi->category) || NVRAM_IS_CATEGORY_CALIBRAT(ldi->category) ||
3069 NVRAM_IS_CATEGORY_IMPORTANT(ldi->category) || (NVRAM_NVD_DATA == nvram_query_folder_index(ldi->category)))
3070 {
3071 filename = (kal_uint8 *) get_ctrl_buffer(NVRAM_MAX_PATH_LEN * sizeof(kal_wchar));
3072 NVRAM_FS_MAKE_ROOT_PATH((kal_wchar*)filename);
3073 #ifdef __NVRAM_LID_CACHE__
3074 nvram_util_take_mutex(g_nvram_fs_mutex);
3075 #endif
3076 NVRAM_FS_START_EX(FS_OP_OPEN,filename);
3077 hFile = FS_Open((const kal_wchar*)filename, FS_READ_ONLY | FS_OPEN_DIR);
3078 NVRAM_FS_END(FS_OP_OPEN,hFile);
3079 free_ctrl_buffer(filename);
3080 if(hFile >= FS_NO_ERROR) /* Open NVRAM root folder Success */
3081 {
3082 NVRAM_FS_START(FS_OP_CLOSE);
3083 result = FS_Close(hFile);
3084 NVRAM_FS_END(FS_OP_CLOSE,result);
3085 }
3086 else if (hFile == FS_FILE_NOT_FOUND || hFile == FS_PATH_NOT_FOUND)
3087 {
3088 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s NVRAM main folder lost\r\n",__FUNCTION__);
3089 NVRAM_EXT_ASSERT(KAL_FALSE, (kal_uint32)hFile, NVRAM_LOC_OPEN_NV_FOLDER_FAIL_2, 0);
3090 }
3091 else
3092 {
3093 kal_prompt_trace(MOD_NVRAM, "Open NVRAM root folder result:%d\n\r", (kal_uint32)hFile);
3094 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"Open NVRAM root folder result:%d\r\n",(kal_uint32)hFile);
3095 }
3096 #ifdef __NVRAM_LID_CACHE__
3097 nvram_util_give_mutex(g_nvram_fs_mutex);
3098 #endif
3099 }
3100 }
3101
3102
3103#ifdef __NVRAM_UNIT_TEST__
3104 if (!is_init)
3105 {
3106 status = nvram_unit_test_get_io_status(status);
3107 }
3108#endif
3109 memcpy((void *)(&tmp_ldi),ldi,sizeof(nvram_ltable_entry_struct));
3110 if (status != NVRAM_IO_ERRNO_OK)
3111 {
3112#if (defined(__CCCIFS_SUPPORT__) && defined(__MTK_TARGET__)) || defined(__NVRAM_BIN_REGION_SIMULATION__)
3113 if (NVRAM_IS_CATEGORY_IN_BIN_REGION(ldi->category))
3114 {
3115 // try restore from bin region
3116 if (nvram_recover_data_item(ldi) == NVRAM_IO_ERRNO_OK)
3117 {
3118 if(nvram_ptr->state == NVRAM_STATE_READY)
3119 {
3120 mcf_ota_ret = mcf_do_ota_by_lid(ldi->LID,1, ldi->total_records,&tmp_ldi);
3121 kal_prompt_trace(MOD_NVRAM, "%s @%d mcf_ota_ret=%d\n\r",__FUNCTION__,__LINE__ , mcf_ota_ret);
3122 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"mcf_do_ota_by_lid return %d\r\n",mcf_ota_ret);
3123 }
3124 status = nvram_write_fs_data_item(ldi, index, data, ldi->size, is_init);
3125 if (status == NVRAM_IO_ERRNO_OK)
3126 {
3127 goto end;
3128 }
3129 }
3130 else
3131 {
3132 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s->nvram_recover_data_item fail\r\n",__FUNCTION__);
3133 }
3134 }
3135#endif
3136
3137 /* IMEI and SML */
3138 if (NVRAM_IS_ATTR_FAULT_ASSERT(ldi->attr))
3139 {
3140 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_WRITE_IMPORTANT_DATA_FAIL:%d\n\r", DISPLAY_ERROR(status));
3141 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
3142 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%08X\n\r", ldi->category, ldi->attr);
3143 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
3144
3145
3146 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_WRITE_IMPORTANT_DATA_FAIL:%d\r\n", DISPLAY_ERROR(status));
3147 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
3148 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
3149 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
3150 NVRAM_EXT_ASSERT (KAL_FALSE, DISPLAY_ERROR(status),NVRAM_LOC_WRITE_IMPORTANT_DATA_FAIL , ldi->LID);
3151 return status;
3152 }
3153
3154
3155 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, status, __LINE__, is_init);
3156 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"write after recover status:%d\r\n",status);
3157 if (is_init == KAL_FALSE
3158 #ifdef __NVRAM_CUSTOM_DISK__
3159 && !NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category)
3160 #endif
3161 #ifdef __NVRAM_OTP__
3162 && !NVRAM_IS_CATEGORY_OTP(ldi->category)
3163 #endif
3164 )
3165 {
3166 if (!nvram_util_always_gen_default(ldi))
3167 {
3168 ldi->attr |= NVRAM_ATTR_GEN_DEFAULT;
3169 lid_is_gen_default = KAL_TRUE;
3170 }
3171 /* Try to reset data if it is not a initial case */
3172 if ((status = nvram_reset_one_data_item(ldi, 1, ldi->total_records)) == NVRAM_IO_ERRNO_OK)
3173 {
3174 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, status, __LINE__, is_init);
3175 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s->nvram_reset_one_data_item successfully is_init=%d\r\n",__FUNCTION__,is_init);
3176 if(nvram_ptr->state == NVRAM_STATE_READY)
3177 {
3178 mcf_ota_ret = mcf_do_ota_by_lid(ldi->LID,1, ldi->total_records,&tmp_ldi);
3179 kal_prompt_trace(MOD_NVRAM, "%s @%d mcf_ota_ret=%d\n\r",__FUNCTION__,__LINE__ , mcf_ota_ret);
3180 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s->mcf_do_ota_by_lid return %d\r\n",__FUNCTION__,mcf_ota_ret);
3181 }
3182 status = nvram_write_fs_data_item(ldi, index, data, ldi->size, is_init);
3183 }
3184 if(lid_is_gen_default)
3185 {
3186 ldi->attr &= ~NVRAM_ATTR_GEN_DEFAULT;
3187 lid_is_gen_default = KAL_FALSE;
3188 }
3189 }
3190 }
3191
3192 if (status != NVRAM_IO_ERRNO_OK)
3193 {
3194 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, status, __LINE__, is_init);
3195 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_WRITE_AND_RESET_FAIL:%d\n\r", DISPLAY_ERROR(status));
3196 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
3197 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
3198 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
3199
3200 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_WRITE_AND_RESET_FAIL:%d\r\n", DISPLAY_ERROR(status));
3201 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
3202 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
3203 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
3204 NVRAM_EXT_ASSERT(KAL_FALSE, DISPLAY_ERROR(status), NVRAM_LOC_WRITE_AND_RESET_FAIL, ldi->LID);
3205 }
3206#if (defined(__CCCIFS_SUPPORT__) && defined(__MTK_TARGET__)) || defined(__NVRAM_BIN_REGION_SIMULATION__)
3207end:
3208#endif
3209#if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
3210 if (status == NVRAM_IO_ERRNO_OK)
3211 {
3212 nvram_util_post_write_lid(ldi);
3213 }
3214#endif
3215 return status;
3216}
3217
3218/*****************************************************************************
3219 * FUNCTION
3220 * nvram_write_data_item
3221 * DESCRIPTION
3222 * This is nvram_write_exception_data_item() function of NVRAM module.
3223 * PARAMETERS
3224 * ldi [IN] MUST be 1 ~ (total_LID - 1)
3225 * index [IN] MUST be 1 ~ total_records
3226 * data [?]
3227 * is_init [IN]
3228 * buffer_size(?) [IN] MUST be even-bytes aligned: ie, ((ldi->size + 1) / 2) * 2 Note that content of `data' could be changed due to encyrption!!
3229 * buffer(?) [IN] MUST be even-bytes aligned.
3230 * RETURNS
3231 * NVRAM_IO_ERRNO_INVALID_LID
3232 * NVRAM_IO_ERRNO_INVALID_RECORD
3233 * NVRAM_IO_ERRNO_INVALID_SIZE
3234 * NVRAM_IO_ERRNO_CHK if all copies are failed to write
3235 * NVRAM_IO_ERRNO_OK at least one valid copy is written.
3236 *****************************************************************************/
3237nvram_errno_enum nvram_write_exception_data_item(nvram_ltable_entry_struct *ldi, kal_uint16 index, kal_uint8 *data)
3238{
3239 /*----------------------------------------------------------------*/
3240 /* Local Variables */
3241 /*----------------------------------------------------------------*/
3242 nvram_errno_enum status;
3243 NVRAM_FILE_NAME nvramname;
3244
3245 /*----------------------------------------------------------------*/
3246 /* Code Body */
3247 /*----------------------------------------------------------------*/
3248
3249 MD_TRC_IO_WRITE_DATA_ITEM_START(ldi->LID, index, 0);
3250 MD_TRC_INFO_NVRAM_DATA_ITEM(ldi->LID, ldi->size);
3251 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s ====>\r\n",__FUNCTION__);
3252 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID:0x%04X index=%d,rec_size=%d\r\n",ldi->LID, index, ldi->size);
3253 /* Construct a even bytes aligned buffer, and assign it to returned data pointer */
3254 if (data == NULL)
3255 {
3256 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_INVALID_SIZE, __LINE__, 0);
3257 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X data pointer is NULL\r\n",__FUNCTION__,ldi->LID);
3258 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
3259 return NVRAM_IO_ERRNO_INVALID_SIZE;
3260 }
3261
3262 /* Do not allow normal access use exception API */
3263 if(ldi->LID != NVRAM_EF_SYS_EXCEPTION_LID_DUMMY &&
3264 ldi->LID != NVRAM_EF_SYS_STATISTICS_LID)
3265 {
3266 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_ACCESS_DENIED, __LINE__, 0);
3267 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s Not Exception LID 0x%04X Access Denied \r\n",__FUNCTION__,ldi->LID);
3268 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
3269 return NVRAM_IO_ERRNO_ACCESS_DENIED;
3270 }
3271
3272 /* Global software lock status is locked and this logical data item's attribute is write-protected. */
3273 // Skip lock check
3274
3275/******************************************************
3276 * Device Broken
3277 ******************************************************/
3278 if (nvram_ptr->dev_broken)
3279 {
3280 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_DRV_BROKEN, __LINE__, 0);
3281 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X NVRAM_IO_ERRNO_DRV_BROKEN\r\n",__FUNCTION__,ldi->LID);
3282 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
3283 return NVRAM_IO_ERRNO_OK;
3284 }
3285
3286/******************************************************
3287 * OTP
3288 ******************************************************/
3289#ifdef __NVRAM_OTP__
3290 //block OTP request
3291 if (ldi->category & NVRAM_CATEGORY_OTP)
3292 {
3293 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_ACCESS_DENIED, __LINE__, 0);
3294 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s OTP LID 0x%04X Access Denied \r\n",__FUNCTION__,ldi->LID);
3295 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
3296 return NVRAM_IO_ERRNO_ACCESS_DENIED;
3297 }
3298 else
3299#endif
3300
3301/******************************************************
3302 * Custom Disk
3303 ******************************************************/
3304#ifdef __NVRAM_CUSTOM_DISK__
3305 //block CUSTOM_DISK request
3306 if (NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category))
3307 {
3308 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_ACCESS_DENIED, __LINE__, 0);
3309 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s Custom Disk LID 0x%04X Access Denied \r\n",__FUNCTION__,ldi->LID);
3310 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
3311 return NVRAM_IO_ERRNO_ACCESS_DENIED;
3312 }
3313 else
3314#endif
3315
3316/******************************************************
3317 * FAT
3318 ******************************************************/
3319 { //be care about this "{}" it is use for "else" code of different store device
3320 //status = nvram_write_fs_data_item(ldi, index, data, ldi->size, 0);
3321 //Read exception file directly
3322 nvram_util_make_lid_filename(ldi, nvramname, KAL_TRUE);
3323
3324 status = nvram_drv_fat_write_exception_item(
3325 data,
3326 nvramname,
3327 index, // record id
3328 ldi->size, // record size
3329 ldi->size); // buffer size
3330 }
3331
3332 if(status != NVRAM_DRV_OK)
3333 {
3334 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s LID:0x%04X,nvram_drv_fat_write_exception_item return %d\r\n",__FUNCTION__,ldi->LID,status);
3335 status = NVRAM_IO_ERRNO_CHK;
3336 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, status, __LINE__, 0);
3337 }
3338 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
3339 return status;
3340}
3341
3342#if defined(__MTK_TARGET__) && defined(__NVRAM_WRITE_WITH_FILE_SIZE__) && !defined(__NVRAM_WRITE_PROTECT_ENABLE__)
3343/*****************************************************************************
3344 * FUNCTION
3345 * nvram_write_fs_data_item_multiple
3346 * DESCRIPTION
3347 * This is nvram_write_data_item_multiple() function of NVRAM module.
3348 * PARAMETERS
3349 * ldi [?]
3350 * index [IN]
3351 * buffer [?]
3352 * buffer_size [IN]
3353 * is_init [IN]
3354 * RETURNS
3355 * NVRAM_IO_ERRNO_CHK if all copies are failed to write
3356 * NVRAM_IO_ERRNO_OK at least one valid copy is written.
3357 *****************************************************************************/
3358static nvram_errno_enum nvram_write_fs_data_item_multiple
3359 (nvram_ltable_entry_struct *ldi,
3360 kal_uint16 index,
3361 kal_uint16 rec_mount,
3362 const kal_uint8 *buffer,
3363 kal_bool is_init)
3364{
3365 /*----------------------------------------------------------------*/
3366 /* Local Variables */
3367 /*----------------------------------------------------------------*/
3368 nvram_errno_enum status = NVRAM_IO_ERRNO_OK;
3369 nvram_drv_status_enum drv_status[2] = {NVRAM_DRV_OK, NVRAM_DRV_OK};
3370 kal_uint32 record_ID;
3371 NVRAM_FILE_NAME nvramname;
3372 kal_uint32 file_offset;
3373 nvram_folder_enum folder_index;
3374 kal_bool multiple = KAL_FALSE;
3375
3376 /*----------------------------------------------------------------*/
3377 /* Code Body */
3378 /*----------------------------------------------------------------*/
3379 if (NVRAM_IS_ATTR_MULTIPLE(ldi->attr) || NVRAM_IS_ATTR_BACKUP_FAT(ldi->attr) || NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category))
3380 {
3381 multiple = KAL_TRUE;
3382 }
3383
3384 folder_index = nvram_query_folder_index(ldi->category);
3385
3386 file_offset = NVRAM_LDI_HEADER_SIZE;
3387 nvram_util_make_lid_filename(ldi, nvramname, KAL_TRUE);
3388
3389 for (record_ID = 0; record_ID < 2; record_ID++)
3390 {
3391
3392 #ifdef __NVRAM_BACKUP_DISK_FAT__
3393 if (record_ID == 1 && NVRAM_IS_ATTR_BACKUP_FAT(ldi->attr))
3394 {
3395 folder_index = NVRAM_NVD_BAK;
3396 }
3397 #endif
3398
3399 #if defined(__MTK_TARGET__) && defined(__NVRAM_IMPORTANT_PARTITIONS__) && (defined(__SMART_PHONE_MODEM__) || defined(__CCCIFS_SUPPORT__))
3400 if (record_ID == 1)
3401 {
3402 #ifdef __NVRAM_WRITE_PROTECT_ENABLE__
3403 extern kal_bool smu_is_write_protect2(nvram_lid_enum file_idx);
3404 if (NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category))
3405 {
3406 // Aussme protect2 is always locked, acctually it only unlocked at first boot in factory
3407 if (drv_status[0] == NVRAM_DRV_OK)
3408 {
3409 if (smu_is_write_protect2(ldi->LID)) {
3410 // only trigger backup for specific LIDs when they are written legally (shoudn't be frequently)
3411 if (is_init == KAL_FALSE) {
3412 // trigger backup, this will write sync pattern in AP side
3413 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, 0xFFFF, 0x0001,__LINE__);
3414 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP," LID 0x%04X write sync pattern \r\n",ldi->LID);
3415 ccci_send_message(CCMSG_ID_SYSMSGSVC_MD_UNPROTECT_PART_REQ, 0xABC);
3416 } else {
3417 // trigger backup after init stage
3418 isneedwriteprotect2 = KAL_TRUE;
3419 }
3420 } else {
3421 // Don't trigger backup.
3422 // think about this scenario:
3423 // some LID will update at known time (every md bootup time)
3424 // this will leave sync pattern in AP if we trigger backup,
3425 // then hacker can deleted all files on protect1 before reboot the phone
3426 // the SML data on protect2 will lost after phone reboot ...
3427 }
3428 return NVRAM_IO_ERRNO_OK;
3429 }
3430 else
3431 {
3432 // don't trigger backup due to protect1 write failed
3433 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]LID 0x%04X nvram_drv_fat_write_multRec fail,result=%d\r\n",ldi->LID,drv_status[0]);
3434 return NVRAM_IO_ERRNO_CHK;
3435 }
3436 }
3437 #endif
3438 folder_index = nvram_query_folder_index_ex(ldi->category, KAL_FALSE);
3439 }
3440 #endif
3441
3442 drv_status[record_ID] = nvram_drv_fat_write_multRec(
3443 ldi,
3444 nvramname,
3445 folder_index,
3446 file_offset,
3447 index,
3448 rec_mount,
3449 ldi->size,
3450 buffer,
3451 is_init);
3452 nvram_debug_write_dump(ldi, 0x800, index, rec_mount, buffer, ldi->size, drv_status[record_ID]);
3453
3454 /* Try to reset data if it is not a initial case */
3455 if (drv_status[record_ID] != NVRAM_DRV_OK)
3456 {
3457 MD_TRC_IO_WRITE_DATA_ITEM_MULTIPLE(ldi->LID, drv_status, nvram_drv_fat_get_last_err(), __LINE__);
3458 status = NVRAM_IO_ERRNO_CHK;
3459 }
3460
3461 if (!multiple)
3462 {
3463 break;
3464 }
3465
3466 nvram_util_make_lid_filename(ldi, nvramname, KAL_FALSE);
3467
3468 }
3469
3470 if (status != NVRAM_IO_ERRNO_OK && multiple == KAL_TRUE)
3471 {
3472 kal_int32 recovery_status;
3473 if (drv_status[0] != NVRAM_DRV_OK && drv_status[1] == NVRAM_DRV_OK)
3474 {
3475 recovery_status = nvram_drv_fat_backup(ldi, KAL_FALSE); /* A <-- B */
3476 }
3477 else if (drv_status[0] == NVRAM_DRV_OK && drv_status[1] != NVRAM_DRV_OK)
3478 {
3479 recovery_status = nvram_drv_fat_backup(ldi, KAL_TRUE); /* A --> B */
3480 }
3481 else
3482 {
3483 // Both A&B write fail
3484 recovery_status = drv_status[0];
3485 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"recover status:%d\r\n",recovery_status);
3486 }
3487 if (recovery_status == NVRAM_DRV_OK)
3488 {
3489 return NVRAM_IO_ERRNO_OK;
3490 }
3491 }
3492 return status;
3493}
3494#endif
3495
3496/*****************************************************************************
3497 * FUNCTION
3498 * nvram_write_fs_data_item
3499 * DESCRIPTION
3500 * This is nvram_write_data_item_multiple() function of NVRAM module.
3501 * PARAMETERS
3502 * ldi [?]
3503 * index [IN]
3504 * buffer [?]
3505 * buffer_size [IN]
3506 * is_init [IN]
3507 * RETURNS
3508 * NVRAM_IO_ERRNO_CHK if all copies are failed to write
3509 * NVRAM_IO_ERRNO_OK at least one valid copy is written.
3510 *****************************************************************************/
3511static nvram_errno_enum nvram_write_fs_data_item
3512 (nvram_ltable_entry_struct *ldi, kal_uint32 index, kal_uint8 *buffer, kal_uint32 buffer_size, kal_bool is_init)
3513{
3514 /*----------------------------------------------------------------*/
3515 /* Local Variables */
3516 /*----------------------------------------------------------------*/
3517 nvram_errno_enum status = NVRAM_IO_ERRNO_OK;
3518 nvram_drv_status_enum drv_status[2] = {NVRAM_DRV_OK, NVRAM_DRV_OK};
3519
3520 kal_uint32 record_ID;
3521 NVRAM_FILE_NAME nvramname;
3522
3523 kal_uint32 file_offset;
3524 nvram_folder_enum folder_index;
3525 kal_bool multiple = KAL_FALSE;
3526
3527 /*----------------------------------------------------------------*/
3528 /* Code Body */
3529 /*----------------------------------------------------------------*/
3530 if (NVRAM_IS_ATTR_MULTIPLE(ldi->attr) || NVRAM_IS_ATTR_BACKUP_FAT(ldi->attr) || NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category))
3531 {
3532 multiple = KAL_TRUE;
3533 }
3534 folder_index = nvram_query_folder_index(ldi->category);
3535
3536 file_offset = NVRAM_LDI_HEADER_SIZE;
3537 if(NVRAM_IS_ATTR_RAW_DATA(ldi->attr)) {
3538 file_offset += index;
3539 index = 1;
3540 }
3541 nvram_util_make_lid_filename(ldi, nvramname, KAL_TRUE);
3542
3543#ifdef __NVRAM_PSEUDO_MERGE__
3544 if (NVRAM_IS_ATTR_PACKAGE(ldi->attr))
3545 {
3546 file_offset = (kal_uint32) (ldi->description);
3547 if (!multiple)
3548 {
3549 nvram_make_package_filename(nvramname, 'A');
3550 }
3551 }
3552#endif
3553
3554 for (record_ID = 0; record_ID < 2; record_ID++)
3555 {
3556
3557 #ifdef __NVRAM_BACKUP_DISK_FAT__
3558 if (record_ID == 1 && NVRAM_IS_ATTR_BACKUP_FAT(ldi->attr))
3559 {
3560 folder_index = NVRAM_NVD_BAK;
3561 }
3562 #endif
3563
3564 #if defined(__MTK_TARGET__) && defined(__NVRAM_IMPORTANT_PARTITIONS__) && defined(__CCCIFS_SUPPORT__)
3565 if (record_ID == 1)
3566 {
3567 #ifdef __NVRAM_WRITE_PROTECT_ENABLE__
3568 extern kal_bool smu_is_write_protect2(nvram_lid_enum file_idx);
3569 if (NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category))
3570 {
3571 // Aussme protect2 is always locked, acctually it only unlocked at first boot in factory
3572 if (drv_status[0] == NVRAM_DRV_OK)
3573 {
3574 if (smu_is_write_protect2(ldi->LID)) {
3575 // only trigger backup for specific LIDs when they are written legally (shoudn't be frequently)
3576 if (is_init == KAL_FALSE) {
3577 // trigger backup, this will write sync pattern in AP side
3578 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, 0xFFFF, 0x0001,__LINE__);
3579 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"LID:0x%04X write sync pattern to AP\r\n",ldi->LID);
3580 ccci_send_message(CCMSG_ID_SYSMSGSVC_MD_UNPROTECT_PART_REQ, 0xABC);
3581 } else {
3582 // trigger backup after init stage
3583 isneedwriteprotect2 = KAL_TRUE;
3584 }
3585 } else {
3586 // Don't trigger backup.
3587 // think about this scenario:
3588 // some LID will update at known time (every md bootup time)
3589 // this will leave sync pattern in AP if we trigger backup,
3590 // then hacker can deleted all files on protect1 before reboot the phone
3591 // the SML data on protect2 will lost after phone reboot ...
3592 }
3593 return NVRAM_IO_ERRNO_OK;
3594 }
3595 else
3596 {
3597 // don't trigger backup due to protect1 write failed
3598 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s return NVRAM_IO_ERRNO_CHK,drv_status[0]=%d \r\n",__FUNCTION__,drv_status[0]);
3599 return NVRAM_IO_ERRNO_CHK;
3600 }
3601 }
3602 #endif
3603 folder_index = nvram_query_folder_index_ex(ldi->category, KAL_FALSE);
3604 }
3605 #endif
3606
3607 // if LID == SYS_LID, file can be empty & index is the index of record needs to write (amount is 1)
3608 // if is_init == TRUE, file can be empty & index is the # of record needs to write (index always 1)
3609 // if is_init == FALSE, file should not be empty & index is the index of record needs to write (amount always 1)
3610
3611 if(is_init && NVRAM_EF_SYS_LID != ldi->LID)
3612 {
3613
3614 drv_status[record_ID] = nvram_drv_fat_write(
3615 nvramname,
3616 folder_index,
3617 file_offset,
3618 1,
3619 index,
3620 buffer_size,
3621 buffer,
3622 ldi,
3623 is_init);
3624
3625 }
3626 else
3627 {
3628 drv_status[record_ID] = nvram_drv_fat_write(
3629 nvramname,
3630 folder_index,
3631 file_offset,
3632 index,
3633 1,
3634 buffer_size,
3635 buffer,
3636 ldi,
3637 is_init);
3638 }
3639
3640
3641 /* Try to reset data if it is not a initial case */
3642 if (drv_status[record_ID] != NVRAM_DRV_OK)
3643 {
3644 MD_TRC_IO_WRITE_DATA_ITEM_MULTIPLE(ldi->LID, drv_status, nvram_drv_fat_get_last_err(), __LINE__);
3645 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s return NVRAM_IO_ERRNO_CHK,drv_status[%d]!=%d \r\n",__FUNCTION__,record_ID,drv_status[record_ID]);
3646 status = NVRAM_IO_ERRNO_CHK;
3647 }
3648
3649 if (!multiple)
3650 {
3651 break;
3652 }
3653
3654 #ifdef __NVRAM_LID_CACHE__
3655 if(NVRAM_WR_WITH_CACHE(ldi->LID) && (!(NVRAM_IS_ATTR_RAW_DATA(ldi->attr))) && ((drv_status[0] == NVRAM_DRV_OK) || (drv_status[1] == NVRAM_DRV_OK)))
3656 {
3657 status = NVRAM_IO_ERRNO_OK;
3658 break;
3659 }
3660 #endif
3661
3662 nvram_util_make_lid_filename(ldi, nvramname, KAL_FALSE);
3663
3664 }
3665
3666 if (status != NVRAM_IO_ERRNO_OK && multiple == KAL_TRUE)
3667 {
3668 kal_int32 recovery_status = NVRAM_DRV_OK;
3669 if (drv_status[0] != NVRAM_DRV_OK && drv_status[1] == NVRAM_DRV_OK)
3670 {
3671 recovery_status = nvram_drv_fat_backup(ldi, KAL_FALSE); /* A <-- B */
3672 }
3673 else if (drv_status[0] == NVRAM_DRV_OK && drv_status[1] != NVRAM_DRV_OK)
3674 {
3675 recovery_status = nvram_drv_fat_backup(ldi, KAL_TRUE); /* A --> B */
3676 }
3677 else
3678 {
3679 // Both A&B write fail
3680 recovery_status = drv_status[0];
3681 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s recovery_status = %d\r\n",__FUNCTION__,recovery_status);
3682 }
3683
3684 if (recovery_status == NVRAM_DRV_OK)
3685 {
3686 return NVRAM_IO_ERRNO_OK;
3687 }
3688 }
3689 return status;
3690}
3691
3692#if defined(__MTK_TARGET__) && defined(__NVRAM_WRITE_WITH_FILE_SIZE__) && !defined(__NVRAM_WRITE_PROTECT_ENABLE__)
3693/*****************************************************************************
3694 * FUNCTION
3695 * nvram_write_mutilpe_data_item
3696 * DESCRIPTION
3697 * write data with lid size but not a record.Support write 1..amount records
3698 * one time if (lid->size+checksum) * amount < MAX_NVRAM_RECORD_SIZE
3699 * PARAMETERS
3700 * ldi [IN] the data item to be write
3701 * rec_idnex [IN] the start record index will be write
3702 * rec_amount [IN] the amount of the records will be write
3703 * RETURNS
3704 * void
3705 *****************************************************************************/
3706static nvram_errno_enum nvram_write_default_data_item_mutilpe(nvram_ltable_entry_struct *ldi,
3707 kal_uint16 rec_index,
3708 kal_uint16 rec_amount)
3709{
3710
3711 /*----------------------------------------------------------------*/
3712 /* Local Variables */
3713 /*----------------------------------------------------------------*/
3714 nvram_errno_enum status = NVRAM_IO_ERRNO_OK;
3715
3716 /*----------------------------------------------------------------*/
3717 /* Code Body */
3718 /*----------------------------------------------------------------*/
3719
3720 MD_TRC_IO_WRITE_DATA_ITEM_START(ldi->LID, rec_index, rec_amount);
3721 MD_TRC_INFO_NVRAM_DATA_ITEM(ldi->LID, ldi->size);
3722 /******************************************************
3723 * Device Broken
3724 ******************************************************/
3725 if (nvram_ptr->dev_broken)
3726 {
3727 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, NVRAM_IO_ERRNO_DRV_BROKEN, __LINE__, ldi->LID);
3728 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s NVRAM_IO_ERRNO_DRV_BROKEN\r\n",__FUNCTION__);
3729 return status;
3730 }
3731
3732//#if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
3733#if 0
3734/* under construction !*/
3735/* under construction !*/
3736/* under construction !*/
3737#endif
3738
3739 /* prepare data */
3740 if( ldi->default_value == NVRAM_EF_FF_DEFAULT ||
3741 ldi->default_value == NVRAM_EF_ZERO_DEFAULT)
3742 {
3743 kal_uint8 const *default_value = ldi->default_value;
3744 status = nvram_write_fs_data_item_multiple(ldi,rec_index,rec_amount,default_value,KAL_TRUE);
3745 }
3746 else if(ldi->default_value == NULL)
3747 {
3748 kal_uint8 const *default_value = NVRAM_EF_FF_DEFAULT;
3749 status = nvram_write_fs_data_item_multiple(ldi,rec_index,rec_amount,default_value,KAL_TRUE);
3750 }
3751 else
3752 {
3753 kal_uint8 *default_value_buffer;
3754 kal_uint32 i;
3755 kal_uint8 *default_value_p;
3756 kal_uint8 *def_buff;
3757
3758 default_value_buffer = (kal_uint8*) get_ctrl_buffer(ldi->size * rec_amount + NVRAM_BUFFER_TAIL_SIZE);
3759 kal_mem_cpy((default_value_buffer + (ldi->size * rec_amount)), NVRAM_BUFFER_TAIL_MARK, NVRAM_BUFFER_TAIL_SIZE);
3760
3761 if((ldi->category & NVRAM_CATEGORY_FUNC_DEFAULT) && (ldi->attr & NVRAM_ATTR_MULTI_DEFAULT))
3762 {
3763 nvram_get_lid_default_value_to_write(ldi, 0, default_value_buffer, (ldi->size * rec_amount));
3764 }
3765 else
3766 {
3767 def_buff = (kal_uint8*) get_ctrl_buffer(ldi->size + NVRAM_BUFFER_TAIL_SIZE);
3768 kal_mem_cpy((def_buff + ldi->size), NVRAM_BUFFER_TAIL_MARK, NVRAM_BUFFER_TAIL_SIZE);
3769 for (i = 0; i < rec_amount; i++)
3770 {
3771 default_value_p = (kal_uint8*) nvram_get_lid_default_value_to_write(ldi, i, NULL, 0);
3772 if (default_value_p == NULL)
3773 {
3774 nvram_get_lid_default_value_to_write(ldi, i, def_buff, ldi->size);
3775 default_value_p = def_buff;
3776 }
3777 kal_mem_cpy(default_value_buffer + i*(ldi->size), default_value_p, ldi->size);
3778 default_value_p = NULL;
3779 }
3780
3781 if(kal_mem_cmp((def_buff + ldi->size), NVRAM_BUFFER_TAIL_MARK, NVRAM_BUFFER_TAIL_SIZE) != 0)
3782 {
3783 // Return default value is out of buffer.
3784 MD_TRC_FUNC_NVRAM_RESET_DATA_ITEMS(ldi->LID, (ldi->size * rec_amount), __LINE__, 0,0);
3785 free_ctrl_buffer(def_buff);
3786 free_ctrl_buffer(default_value_buffer);
3787 NVRAM_EXT_ASSERT(KAL_FALSE, (ldi->size * ldi->total_records), NVRAM_LOC_SPACE_NOT_ENOUGH, ldi->LID, free_ctrl_buffer(def_buff);free_ctrl_buffer(default_value_buffer));
3788 }
3789 free_ctrl_buffer(def_buff);
3790 }
3791
3792 if(kal_mem_cmp((default_value_buffer + (ldi->size * rec_amount)), NVRAM_BUFFER_TAIL_MARK, NVRAM_BUFFER_TAIL_SIZE) != 0)
3793 {
3794 // Return default value is out of buffer.
3795 MD_TRC_FUNC_NVRAM_RESET_DATA_ITEMS(ldi->LID, (ldi->size * rec_amount), __LINE__, 0,0);
3796 free_ctrl_buffer(default_value_buffer);
3797 NVRAM_EXT_ASSERT(KAL_FALSE, (ldi->size * ldi->total_records), NVRAM_LOC_SPACE_NOT_ENOUGH_1, ldi->LID, free_ctrl_buffer(default_value_buffer));
3798 }
3799
3800 status = nvram_write_fs_data_item_multiple(ldi,rec_index,rec_amount,default_value_buffer,KAL_TRUE);
3801 free_ctrl_buffer(default_value_buffer);
3802 }
3803
3804 if (status != NVRAM_IO_ERRNO_OK)
3805 {
3806 /* IMEI and SML */
3807 if ((NVRAM_IS_CATEGORY_IMPORTANT(ldi->category)
3808 #if (defined(__SMART_PHONE_MODEM__) || defined(__CCCIFS_SUPPORT__))
3809 #if defined(__MTK_TARGET__) && defined(__NVRAM_IMPORTANT_PARTITIONS__)
3810 || NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category))
3811 #else
3812 )
3813 #endif
3814 #else
3815 )
3816 #endif
3817 )
3818 {
3819 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_WRITE_IMPORTANT_DATA_FAIL_1:%d\n\r", DISPLAY_ERROR(status));
3820 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
3821 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
3822 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
3823
3824 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_WRITE_IMPORTANT_DATA_FAIL_1:%d\r\n", DISPLAY_ERROR(status));
3825 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
3826 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
3827 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
3828 NVRAM_EXT_ASSERT (KAL_FALSE, DISPLAY_ERROR(status),NVRAM_LOC_WRITE_IMPORTANT_DATA_FAIL_1 , ldi->LID);
3829 return status;
3830 }
3831
3832 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, status, __LINE__, KAL_TRUE);
3833 }
3834
3835 if (status != NVRAM_IO_ERRNO_OK)
3836 {
3837 MD_TRC_IO_WRITE_DATA_ITEM_RESULT(ldi->LID, status, __LINE__, KAL_TRUE);
3838 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_WRITE_AND_RESET_FAIL_1:%d\n\r", DISPLAY_ERROR(status));
3839 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
3840 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
3841 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
3842
3843 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "[Error]NVRAM_LOC_WRITE_AND_RESET_FAIL_1:%d\r\n", DISPLAY_ERROR(status));
3844 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "LID:0x%04X, total_records:%d, record_size:%d\r\n", ldi->LID, ldi->total_records, ldi->size);
3845 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
3846 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP, "fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
3847 NVRAM_EXT_ASSERT(KAL_FALSE, DISPLAY_ERROR(status), NVRAM_LOC_WRITE_AND_RESET_FAIL_1, ldi->LID);
3848 }
3849 return status;
3850}
3851#endif
3852
3853/*****************************************************************************
3854 * FUNCTION
3855 * nvram_reset_one_data_item
3856 * DESCRIPTION
3857 * Reset only one data item
3858 * PARAMETERS
3859 * ldi [IN] the data item to reset
3860 * buffer [IN] buffer which has enough space
3861 * buffer_size [IN] the max buffer size
3862 * RETURNS
3863 * void
3864 *****************************************************************************/
3865static nvram_errno_enum nvram_reset_one_data_item(nvram_ltable_entry_struct *ldi,
3866 kal_uint16 rec_index,
3867 kal_uint16 rec_amount)
3868{
3869 /*----------------------------------------------------------------*/
3870 /* Local Variables */
3871 /*----------------------------------------------------------------*/
3872 kal_uint8 *default_value;
3873 kal_uint32 i , start, end;
3874 kal_uint8 *default_value_buffer;
3875 kal_uint32 working_buffer_size = 0;
3876 nvram_errno_enum result = NVRAM_IO_ERRNO_OK;
3877 kal_uint32 nvram_chksum_size = 0;
3878 nvram_lid_chksum_info lid_chksum_info = {0};
3879
3880 /*----------------------------------------------------------------*/
3881 /* Code Body */
3882 /*----------------------------------------------------------------*/
3883 if (rec_index < 1 ||
3884 rec_index > ldi->total_records ||
3885 rec_amount < 1 ||
3886 rec_amount > ldi->total_records - rec_index + 1)
3887 {
3888 /* arguments invalid */
3889 start = 1;
3890 end = ldi->total_records;
3891 }
3892 else
3893 {
3894 start = rec_index,
3895 end = rec_index + rec_amount - 1;
3896 }
3897
3898#if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
3899 if (start == 1 && end == ldi->total_records)
3900 {
3901 #ifdef __NVRAM_LID_CACHE__
3902 nvram_util_take_mutex(g_nvram_fs_mutex);
3903 #endif
3904 nvram_util_mark_file_uncreated(ldi);
3905 #ifdef __NVRAM_LID_CACHE__
3906 nvram_util_give_mutex(g_nvram_fs_mutex);
3907 #endif
3908 }
3909 if (!nvram_util_always_gen_default(ldi))
3910 {
3911 if (start == 1 && end == ldi->total_records)
3912 {
3913 nvram_debug_write_dump(ldi, 0x700, rec_index, rec_amount, NULL, ldi->size, NVRAM_IO_ERRNO_CHK);
3914 return NVRAM_IO_ERRNO_OK;
3915 }
3916 }
3917 else
3918 {
3919 /* reset always gen default LID for the first time */
3920 nvram_util_pre_reset_gen_default_lid(ldi);
3921 }
3922
3923#endif
3924
3925 // LID total size can not over MAX_NVRAM_RECORD_SIZE
3926 if((ldi->default_value != NVRAM_EF_ZERO_DEFAULT) &&
3927 ((ldi->size * ldi->total_records + NVRAM_BUFFER_TAIL_SIZE) > MAX_NVRAM_RECORD_SIZE) )
3928 {
3929 MD_TRC_FUNC_NVRAM_RESET_DATA_ITEMS(ldi->LID, (ldi->size * ldi->total_records), __LINE__, 0,0);
3930 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]%s -> LID 0x%04X\r\n",__FUNCTION__,ldi->LID);
3931 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]total size(%d) over %d\r\n",(ldi->size * ldi->total_records + NVRAM_BUFFER_TAIL_SIZE),MAX_NVRAM_RECORD_SIZE);
3932 NVRAM_EXT_ASSERT(KAL_FALSE, (ldi->size * ldi->total_records), NVRAM_LOC_GET_DEFAULT_WITH_WRONG_PARAM_2, ldi->LID);
3933 }
3934
3935 nvram_get_lid_chksum_algo_info(ldi, &lid_chksum_info, KAL_FALSE, KAL_FALSE);
3936 nvram_chksum_size = lid_chksum_info.algo_info.chksum_algo_length;
3937
3938#if defined(__MTK_TARGET__) && defined(__NVRAM_WRITE_WITH_FILE_SIZE__) && !defined(__NVRAM_WRITE_PROTECT_ENABLE__)
3939 do
3940 {
3941 if (KAL_FALSE == bResetNvramData
3942 || KAL_FALSE == kal_query_systemInit() //initiation
3943 || (ldi->size + nvram_chksum_size) > MAX_NVRAM_RECORD_SIZE //large record
3944 || ldi->LID == NVRAM_EF_SYS_LID
3945 #ifdef __NVRAM_OTP__
3946 || NVRAM_IS_CATEGORY_OTP(ldi->category)
3947 #endif
3948 #ifdef __NVRAM_CUSTOM_DISK__
3949 || NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category)
3950 #endif
3951 #ifdef __NVRAM_PSEUDO_MERGE__
3952 || NVRAM_IS_ATTR_PACKAGE(ldi->attr)
3953 #endif
3954 #ifdef __NVRAM_CRYPT_TEST__
3955 || ldi->LID == NVRAM_EF_NVRAM_MSP_TEST_LID
3956 #endif
3957 )
3958 {
3959 break;
3960 }
3961
3962 // only support reset 1..total_records
3963 if (start == 1 && end == ldi->total_records)
3964 {
3965 kal_uint32 remainLen = 0;
3966 default_value = NULL;
3967 default_value_buffer = NULL;
3968
3969 #ifdef __NVRAM_BIND_TO_CHIP_CIPHER__
3970 if (ldi->attr & NVRAM_ATTR_MSP)
3971 {
3972 /* 4 byte alignment */
3973 remainLen = NVRAM_MSP_ALIGNMENT_REMAINDER(ldi->size + nvram_chksum_size);
3974 }
3975 #endif
3976
3977 working_buffer_size = (ldi->size + nvram_chksum_size + remainLen) * ldi->total_records;
3978
3979 if (working_buffer_size <= MAX_NVRAM_RECORD_SIZE)
3980 {
3981 result = nvram_write_default_data_item_mutilpe(ldi,1,ldi->total_records);
3982 #if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
3983 if (nvram_util_always_gen_default(ldi)) {
3984 nvram_util_post_reset_gen_default_lid(ldi);
3985 }
3986 #endif
3987 return result;
3988 }
3989 }
3990 break;
3991
3992 }while(0);
3993#endif
3994
3995 //default_value_buffer = (kal_uint8*) get_ctrl_buffer(MAX_NVRAM_RECORD_SIZE);
3996 working_buffer_size = ldi->size * rec_amount;
3997 if ((start == 1) && (end == ldi->total_records))
3998 {
3999 working_buffer_size = ldi->size * ldi->total_records;
4000 }
4001
4002 if (working_buffer_size > MAX_NVRAM_RECORD_SIZE)
4003 {
4004 working_buffer_size = MAX_NVRAM_RECORD_SIZE;
4005 }
4006
4007 default_value_buffer = (kal_uint8*) get_ctrl_buffer(working_buffer_size);
4008 nvram_debug_write_dump(ldi, 0x701, rec_index, rec_amount, NULL, ldi->size, NVRAM_IO_ERRNO_CHK);
4009
4010 for (i = start; i <= end; i++)
4011 {
4012 /* when ldi size too big, we cannot operator it on buffer,
4013 use original default value pointer directly */
4014
4015 default_value = (kal_uint8*) nvram_get_default_value_to_write(ldi, i, NULL, 0);
4016
4017 /* the default_value is not assigned in table , ex: L1 LID */
4018 if (default_value == NULL)
4019 {
4020 if((i == 1 && end == ldi->total_records) && (NVRAM_EF_SYS_LID != ldi->LID))
4021 {
4022 nvram_get_default_value_to_write(ldi, i, default_value_buffer, working_buffer_size);
4023 }
4024 else
4025 {
4026 nvram_memset(default_value_buffer, (kal_uint8) NVRAM_EF_ZERO_DEFAULT_VALUE, working_buffer_size);
4027 nvram_get_default_value_to_write(ldi, i, default_value_buffer, ldi->size);
4028 }
4029
4030 default_value = default_value_buffer;
4031 }
4032
4033 /* initial case, we reset it directly to enhance performance*/
4034 if (start == 1 && end == ldi->total_records)
4035 {
4036 if(NVRAM_EF_SYS_LID == ldi->LID)
4037 {
4038 result = nvram_write_data_item(ldi, i, default_value, KAL_TRUE);
4039 if (result != NVRAM_IO_ERRNO_OK)
4040 {
4041 break;
4042 }
4043 }
4044 else
4045 {
4046 result = nvram_write_data_item(ldi, ldi->total_records, default_value, KAL_TRUE);
4047 break;
4048 }
4049 }
4050 else
4051 {
4052 result = nvram_write_data_item(ldi, i, default_value, KAL_FALSE);
4053
4054 if (result != NVRAM_IO_ERRNO_OK)
4055 {
4056 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"nvram_write_data_item return %d\r\n",result);
4057 break;
4058 }
4059 }
4060 }
4061
4062 free_ctrl_buffer(default_value_buffer);
4063#if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
4064 if (nvram_util_always_gen_default(ldi)) {
4065 nvram_util_post_reset_gen_default_lid(ldi);
4066 }
4067#endif
4068 return result;
4069}
4070
4071
4072/*****************************************************************************
4073 * FUNCTION
4074 * nvram_reset_one_data_item
4075 * DESCRIPTION
4076 * Reset only one data item
4077 * PARAMETERS
4078 * ldi [IN] the data item to reset
4079 * buffer [IN] buffer which has enough space
4080 * buffer_size [IN] the max buffer size
4081 * RETURNS
4082 * void
4083 *****************************************************************************/
4084static nvram_errno_enum nvram_reset_category(nvram_category_enum included, nvram_category_enum excluded)
4085{
4086 /*----------------------------------------------------------------*/
4087 /* Local Variables */
4088 /*----------------------------------------------------------------*/
4089 nvram_ltable_entry_struct *ldi = &logical_data_item_table[0];
4090 nvram_errno_enum result = NVRAM_IO_ERRNO_OK;
4091
4092 /*----------------------------------------------------------------*/
4093 /* Code Body */
4094 /*----------------------------------------------------------------*/
4095 do
4096 {
4097 if (ldi->category & excluded)
4098 {
4099 continue;
4100 }
4101
4102 /*
4103 * special handle for reset all
4104 */
4105 if (included == NVRAM_CATEGORY_ALL)
4106 {
4107 #ifdef __NVRAM_BACKUP_DISK__
4108 /* recover the data from backup partition */
4109 if (NVRAM_IS_ATTR_BACKUP_FAT(ldi->attr) || NVRAM_IS_ATTR_BACKUP_RAW(ldi->attr))
4110 {
4111 if (nvram_recover_image_by_lid(ldi) == NVRAM_ERRNO_SUCCESS)
4112 {
4113 continue;
4114 }
4115 }
4116 #endif
4117 #ifdef __NVRAM_CUSTOM_DISK__
4118 if (NVRAM_IS_CATEGORY_CUSTOM_DISK(ldi->category))
4119 {
4120 if (nvram_read_custom_disk(ldi, 1, ldi->total_records, NULL, 0) == NVRAM_IO_ERRNO_OK)
4121 {
4122 /* do not reset the data in custom disk */
4123 continue;
4124 }
4125 }
4126 #endif
4127 }
4128
4129 #if defined(__NVRAM_WRITE_PROTECT_ENABLE__) && defined(__NVRAM_IMPORTANT_PARTITIONS__) && defined(__CCCIFS_SUPPORT__)
4130 if (NVRAM_IS_CATEGORY_IMPORTANT_L4(ldi->category))
4131 {
4132 if (nvram_drv_fat_backup(ldi, KAL_FALSE) == NVRAM_ERRNO_SUCCESS)
4133 {
4134 /* unconditionally restore from protect_s to protect_f if file exist */
4135 #if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
4136 nvram_util_post_reset_gen_default_lid(ldi);
4137 #endif
4138 continue;
4139 }
4140 }
4141 #endif
4142
4143 if (included == NVRAM_CATEGORY_ALL || ldi->category & included)
4144 {
4145 result = nvram_reset_one_data_item(ldi, 1, ldi->total_records);
4146 }
4147 if (result != NVRAM_IO_ERRNO_OK)
4148 {
4149 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s LID 0x%04X result=%d \r\n",__FUNCTION__,ldi->LID,result);
4150 break;
4151 }
4152 }while(nvram_util_next_data_item(&ldi));
4153
4154 return result;
4155
4156}
4157
4158/*****************************************************************************
4159 * FUNCTION
4160 * nvram_reset_one_data_item
4161 * DESCRIPTION
4162 * Reset only one data item
4163 * PARAMETERS
4164 * ldi [IN] the data item to reset
4165 * buffer [IN] buffer which has enough space
4166 * buffer_size [IN] the max buffer size
4167 * RETURNS
4168 * void
4169 *****************************************************************************/
4170#ifdef __NVRAM_PSEUDO_MERGE__
4171static nvram_errno_enum nvram_reset_attr(nvram_attr_enum included, nvram_attr_enum excluded)
4172{
4173 /*----------------------------------------------------------------*/
4174 /* Local Variables */
4175 /*----------------------------------------------------------------*/
4176 nvram_ltable_entry_struct *ldi = &logical_data_item_table[0];
4177 nvram_errno_enum result = NVRAM_IO_ERRNO_OK;
4178
4179 /*----------------------------------------------------------------*/
4180 /* Code Body */
4181 /*----------------------------------------------------------------*/
4182 do
4183 {
4184
4185 if (ldi->attr & excluded)
4186 {
4187 continue;
4188 }
4189
4190 if (included == NVRAM_ATTR_ALL || ldi->attr & included)
4191 {
4192 result = nvram_reset_one_data_item(ldi, 1, ldi->total_records);
4193 }
4194
4195 if (result != NVRAM_IO_ERRNO_OK)
4196 {
4197 break;
4198 }
4199 }while(nvram_util_next_data_item(&ldi));
4200 return result;
4201}
4202#endif
4203
4204/*****************************************************************************
4205 * FUNCTION
4206 * nvram_reset_data_items
4207 * DESCRIPTION
4208 * This is nvram_reset_data_item() function of NVRAM module.
4209 *
4210 * When invoking nvram_write_data_item(), `is_init' flag is ALWAYS TRUE;
4211 * such that for each data item to be written:
4212 *
4213 * 1. Driver Layer could delete records of the data item, if it
4214 * already exists.
4215 * (In current flash driver, namely fd, this function is fd_rcd_delete())
4216 *
4217 * 2. Then Driver Layer write default value to each record of the data item.
4218 * (In current flash driver, namely fd, this function is fd_rcd_initialize())
4219 *
4220 * This function may be invoked due to incompatible version.
4221 * For data items located in the `reset_category',
4222 * they may be (1) newly added, (2)newly removed, or (3)just default value modified.
4223 * Consider invoking nvram_write_data_item() with `is_init' flag set to true for
4224 * each case:
4225 * (1) Newly added:
4226 * Invoke fd_rcd_delete() to delete records of the data item is no effect.
4227 * fd_rcd_initialize() will allocate spaces for that data item.
4228 *
4229 * (2) Newly deleted:
4230 * This results in a effect of "shift" due to some data item LID's are deleted.
4231 * It should be ok since fd_rcd_delete()/fd_rcd_initialize() will be called
4232 * for each valid LID. Of course, some out-of-dated LID's are possibly
4233 * left and occupies FLASH space.
4234 *
4235 * (3) Default value modified:
4236 * This is ok.
4237 * PARAMETERS
4238 * reset_category [IN] Coubld be NVRAM_RESET_ALL NVRAM_RESET_SYSTEM NVRAM_RESET_USER
4239 * ldi [?]
4240 * RETURNS
4241 *
4242 *****************************************************************************/
4243kal_bool nvram_reset_data_items(
4244 nvram_reset_category_enum reset_category,
4245 nvram_app_id_enum app_id,
4246 nvram_ltable_entry_struct *ldi,
4247 kal_uint16 rec_index,
4248 kal_uint16 rec_amount)
4249{
4250 /*----------------------------------------------------------------*/
4251 /* Local Variables */
4252 /*----------------------------------------------------------------*/
4253 kal_bool status = KAL_TRUE;
4254
4255 /*----------------------------------------------------------------*/
4256 /* Code Body */
4257 /*----------------------------------------------------------------*/
4258 if (ldi)
4259 {
4260 MD_TRC_FUNC_NVRAM_RESET_DATA_ITEMS(reset_category, nvram_ptr->state, app_id, ldi->LID, rec_index);
4261 kal_prompt_trace(MOD_NVRAM,"reset_category=%d,LID 0x%x, ldi->attr 0x%x.\r\n",reset_category,ldi->LID, ldi->attr);
4262 kal_prompt_trace(MOD_NVRAM,"rec_index=%d,rec_amount=%d\r\n",rec_index,rec_amount);
4263
4264 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"reset_category=%d,LID 0x%04X, ldi->attr 0x%x.\r\n",reset_category,ldi->LID, ldi->attr);
4265 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"rec_index=%d,rec_amount=%d\r\n",rec_index,rec_amount);
4266 }
4267 else
4268 {
4269 MD_TRC_FUNC_NVRAM_RESET_DATA_ITEMS(reset_category, nvram_ptr->state, app_id, 0, rec_index);
4270 }
4271
4272 /* Since reset is highest priority, the software lock must be unlocked temporarily. */
4273 nvram_ptr->lock = KAL_FALSE;
4274 if(nvram_ee_info != NULL){
4275 nvram_ee_info->nvram_init_context.lock = nvram_ptr->lock;
4276 }
4277 /* Since entire logical data item is to be reset, nvram_write_data_item() is invoked. */
4278 switch (reset_category)
4279 {
4280 case NVRAM_RESET_CERTAIN:
4281 {
4282 #ifdef __NVRAM_OTP__
4283 if(ldi && (ldi->category & NVRAM_CATEGORY_OTP))
4284 {
4285 /*
4286 * if from nvram init, return true.
4287 */
4288 if (nvram_ptr->state != NVRAM_STATE_READY)
4289 {
4290 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s NVRAM_ERRNO_NOT_READY \r\n",__FUNCTION__);
4291 return KAL_TRUE;
4292 }
4293 else
4294 {
4295 return KAL_FALSE;
4296 }
4297 }
4298 #endif /* __NVRAM_OTP__ */
4299
4300 nvram_reset_one_data_item(ldi, rec_index, rec_amount);
4301 break;
4302 }
4303
4304 case NVRAM_RESET_ALL:
4305 {
4306 {
4307
4308 #ifdef __NVRAM_PSEUDO_MERGE__
4309 nvram_calculate_write_data_offset(NULL, KAL_TRUE);
4310 #endif
4311
4312 if (nvram_ptr->sw_status & NVRAM_SW_EMPTY_FAT)
4313 {
4314 nvram_reset_category(NVRAM_CATEGORY_ALL, 0);
4315 if(nvram_ee_info != NULL){
4316 nvram_ee_info->nvram_init_step = NVRAM_CORE_INIT_FIRST_BOOT_RESET_ALL_FILE_DONE;
4317 nvram_ee_info->nvram_init_time[3] = kal_get_systicks();
4318 }
4319 }
4320 else
4321 {
4322 #if defined(__CCCIFS_SUPPORT__)
4323 nvram_reset_category(NVRAM_CATEGORY_ALL, NVRAM_CATEGORY_IMPORTANT | NVRAM_CATEGORY_CALIBRAT
4324 | NVRAM_CATEGORY_IMPORTANT_L4 | NVRAM_CATEGORY_IMPORTANT_L1);
4325 #else
4326 nvram_reset_category(NVRAM_CATEGORY_ALL, NVRAM_CATEGORY_IMPORTANT);
4327 #endif
4328 if(nvram_ee_info != NULL){
4329 nvram_ee_info->nvram_init_step = NVRAM_CORE_INIT_FACTOR_BOOT_RESET_NON_CRITICAL_FILE_DONE;
4330 nvram_ee_info->nvram_init_time[6] = kal_get_systicks();
4331 }
4332 }
4333 }
4334
4335 nvram_factory_rmdir_user(NVRAM_RESET_ALL);
4336
4337 break;
4338 }
4339 #ifdef __NVRAM_PSEUDO_MERGE__
4340 case NVRAM_RESET_PACKAGE:
4341 {
4342 /* write information of package LID into info_file */
4343 nvram_calculate_write_data_offset(NULL, KAL_TRUE);
4344 nvram_reset_attr(NVRAM_ATTR_PACKAGE, 0);
4345 break;
4346 }
4347 #endif /* __NVRAM_PSEUDO_MERGE__ */
4348 case NVRAM_RESET_FACTORY:
4349 {
4350 if (nvram_ptr->state != NVRAM_STATE_READY)/* init stage */
4351 {
4352 //nvram_reset_attr(NVRAM_ATTR_FACTORY_RESET, 0);
4353 nvram_reset_category(NVRAM_CATEGORY_ALL, NVRAM_CATEGORY_IMPORTANT_L4 | NVRAM_CATEGORY_IMPORTANT_L1);
4354
4355 //nvram_factory_restore_mmi_cache(NVRAM_RESET_FACTORY, app_id);
4356 nvram_factory_restore_sys_cache(NVRAM_RESET_FACTORY, app_id);
4357 nvram_factory_rmdir_user(NVRAM_RESET_FACTORY);
4358 nvram_set_restore_factory_flag(NVRAM_RESTORE_FALSE);
4359 }
4360 else
4361 {
4362 nvram_set_restore_factory_flag(NVRAM_RESTORE_TRUE);
4363 }
4364 break;
4365 }
4366 case NVRAM_RESET_BRANCH:
4367 {
4368 nvram_reset_category(NVRAM_CATEGORY_ALL, NVRAM_CATEGORY_IMPORTANT | NVRAM_CATEGORY_CALIBRAT
4369 | NVRAM_CATEGORY_IMPORTANT_L4 | NVRAM_CATEGORY_IMPORTANT_L1);
4370 nvram_factory_rmdir_user(NVRAM_RESET_BRANCH);
4371 break;
4372 }
4373 #ifdef __NVRAM_SUPPORT_CUSTPACK__
4374 case NVRAM_RESET_CUSTPACK:
4375 {
4376 nvram_reset_category(NVRAM_CATEGORY_CUSTPACK, 0);
4377
4378 nvram_util_get_data_item(&ldi, NVRAM_EF_CUSTPACK_VERNO_LID);
4379 nvram_reset_one_data_item(ldi, 1, ldi->total_records);
4380
4381 break;
4382 }
4383 #endif
4384
4385 default:
4386 {
4387 status = KAL_FALSE;
4388 break;
4389 }
4390 }
4391
4392 /* Restore lock state */
4393 nvram_ptr->lock = nvram_ptr->saved_lock;
4394 return status;
4395} /* end of nvram_reset_data_item */
4396
4397
4398/*****************************************************************************
4399 * FUNCTION
4400 * nvram_factory_restore_sys_cache
4401 * DESCRIPTION
4402 * Reset system cache
4403 * PARAMETERS
4404 * void
4405 * RETURNS
4406 * Success or not
4407 *****************************************************************************/
4408static kal_bool nvram_factory_restore_sys_cache(nvram_reset_category_enum category, nvram_app_id_enum app_id)
4409{
4410 /*----------------------------------------------------------------*/
4411 /* Local Variables */
4412 /*----------------------------------------------------------------*/
4413 kal_uint32 record_idx;
4414 nvram_ltable_entry_struct *ldi;
4415 kal_uint8 *buffer;
4416 kal_uint8 *tmp_buffer;
4417 nvram_drv_status_enum status;
4418
4419 /*----------------------------------------------------------------*/
4420 /* Code Body */
4421 /*----------------------------------------------------------------*/
4422 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s ====>\r\n",__FUNCTION__);
4423 nvram_util_get_data_item(&ldi, NVRAM_EF_SYS_CACHE_OCTET_LID);
4424 buffer = (kal_uint8*)get_ctrl_buffer(ldi->total_records * ldi->size);
4425
4426 if (NVRAM_IO_ERRNO_OK == (status = nvram_read_data_item(ldi, 1, ldi->total_records, buffer, ldi->total_records * ldi->size)))
4427 {
4428// nvram_restore_system_cache(category, app_id, buffer);
4429 nvram_restore_system_cache(category, 0, buffer);
4430
4431 for (record_idx = 1; record_idx < ldi->total_records; record_idx++)
4432 {
4433 tmp_buffer = buffer + ldi->size * (record_idx - 1);
4434 nvram_write_data_item(ldi, (kal_uint16)record_idx, tmp_buffer, KAL_FALSE);
4435 }
4436
4437 }
4438 else
4439 {
4440 //This function will not be used
4441 free_ctrl_buffer(buffer);
4442 kal_prompt_trace(MOD_NVRAM, "Last status:%d,Errno:0x%x,status:%d",DISPLAY_ERROR(status),NVRAM_LOC_READ_SYS_CACHE_FAIL,status);
4443 return KAL_FALSE;
4444 }
4445
4446 free_ctrl_buffer(buffer);
4447
4448 return KAL_TRUE;
4449}
4450
4451/*****************************************************************************
4452 * FUNCTION
4453 * nvram_factory_rmdir_user
4454 * DESCRIPTION
4455 * Remove customizable folder list
4456 * PARAMETERS
4457 * void
4458 * RETURNS
4459 * Success or not
4460 *****************************************************************************/
4461static kal_bool nvram_factory_rmdir_user(nvram_reset_category_enum category)
4462{
4463
4464#ifdef __MMI_FMI__
4465
4466 /*----------------------------------------------------------------*/
4467 /* Local Variables */
4468 /*----------------------------------------------------------------*/
4469 kal_int32 dir_idx;
4470 nvram_clean_folder_enum clean_folder_category;
4471 kal_int32 result = FS_NO_ERROR;
4472 /*----------------------------------------------------------------*/
4473 /* Code Body */
4474 /*----------------------------------------------------------------*/
4475 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s ====>\r\n",__FUNCTION__);
4476 switch (category)
4477 {
4478 case NVRAM_RESET_ALL:
4479 clean_folder_category = NVRAM_CLEAN_FOLDER_ALL;
4480 break;
4481 case NVRAM_RESET_BRANCH:
4482 clean_folder_category = NVRAM_CLEAN_FOLDER_BRANCH;
4483 break;
4484 case NVRAM_RESET_FACTORY:
4485 clean_folder_category = NVRAM_CLEAN_FOLDER_FACTORY;
4486 break;
4487 default:
4488 clean_folder_category = NVRAM_CLEAN_FOLDER_NONE;
4489 break;
4490 }
4491
4492 if (clean_folder_category != NVRAM_CLEAN_FOLDER_NONE)
4493 {
4494 for (dir_idx = nvram_custom_max_clean_folder_size() - 1; dir_idx >= 0 ; dir_idx--)
4495 {
4496 if ((clean_folder_category & nvram_clean_folder_list[dir_idx].category) &&
4497 nvram_clean_folder_list[dir_idx].folder_path != NULL)
4498 {
4499 NVRAM_FS_START_EX(FS_OP_XDELETE,nvram_clean_folder_list[dir_idx].folder_path);
4500 result = FS_XDelete(nvram_clean_folder_list[dir_idx].folder_path, (FS_FILE_TYPE | FS_RECURSIVE_TYPE), NULL, 0);
4501 NVRAM_FS_END(FS_OP_XDELETE,result);
4502 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"delete file %s result=%d\r\n",nvram_clean_folder_list[dir_idx].folder_path,result);
4503 }
4504 }
4505 }
4506#else
4507 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s ====>\r\n",__FUNCTION__);
4508#endif /* __MMI_FMI__ */
4509 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s <====\r\n",__FUNCTION__);
4510 return KAL_TRUE;
4511}
4512
4513
4514#if (defined(__CCCIFS_SUPPORT__) && defined(__MTK_TARGET__)) || defined(__NVRAM_BIN_REGION_SIMULATION__)
4515/*****************************************************************************
4516 * FUNCTION
4517 * nvram_recover_data_item
4518 * DESCRIPTION
4519 * Data item auto-receovery for smart phone
4520 * PARAMETERS
4521 * ldi [?]
4522 * RETURNS
4523 * kal_int32 error code from AP FS
4524 *****************************************************************************/
4525kal_int32 nvram_recover_data_item(nvram_ltable_entry_struct *ldi)
4526{
4527 /*----------------------------------------------------------------*/
4528 /* Local Variables */
4529 /*----------------------------------------------------------------*/
4530 kal_int32 drv_status[2] = {0, 0};
4531 NVRAM_FILE_NAME nvramname;
4532 nvram_folder_enum folder_index;
4533
4534 /*----------------------------------------------------------------*/
4535 /* Code Body */
4536 /*----------------------------------------------------------------*/
4537
4538 folder_index = nvram_query_folder_index(ldi->category);
4539 nvram_util_make_lid_filename(ldi, nvramname, KAL_TRUE);
4540 drv_status[0] = nvram_drv_fat_auto_recover(nvramname, folder_index);
4541
4542 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"recover LID:0x%04X filename:%s drv_status[0]=%d\r\n",ldi->LID,nvramname,drv_status[0]);
4543 MD_TRC_IO_READ_DATA_ITEM_MULTIPLE(ldi->LID, drv_status[0],drv_status[0],nvram_drv_fat_get_last_err(), __LINE__);
4544
4545 if (NVRAM_IS_ATTR_MULTIPLE(ldi->attr))
4546 {
4547 nvram_util_make_lid_filename(ldi, nvramname, KAL_FALSE);
4548 drv_status[1] = nvram_drv_fat_auto_recover(nvramname, folder_index);
4549
4550 NVRAM_DEBUG_DUMP(NVRAM_INFO_DUMP,"recover LID:0x%04X filename:%s drv_status[1]=%d\r\n",ldi->LID,nvramname,drv_status[1]);
4551 MD_TRC_IO_READ_DATA_ITEM_MULTIPLE(ldi->LID, drv_status[0],drv_status[1], nvram_drv_fat_get_last_err(), __LINE__);
4552 }
4553
4554 if ((drv_status[0] != 0) || (drv_status[1] != 0))
4555 {
4556 kal_prompt_trace(MOD_NVRAM, "NVRAM ASSERT ERROR NVRAM_LOC_BIN_REGION_RESTORE_FAIL:%d\n\r", drv_status[0]?drv_status[0]:drv_status[1]);
4557 kal_prompt_trace(MOD_NVRAM, "LID:0x%x, total_records:%d, record_size:%d\n\r", ldi->LID, ldi->total_records, ldi->size);
4558 kal_prompt_trace(MOD_NVRAM, "category:0x%x, attr:0x%x\n\r", ldi->category, ldi->attr);
4559 kal_prompt_trace(MOD_NVRAM, "fileprefix:%s, fileverno:%s\n\r", ldi->fileprefix, ldi->fileverno);
4560
4561 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"[Error]NVRAM_LOC_BIN_REGION_RESTORE_FAIL:%d \r\n", drv_status[0]?drv_status[0]:drv_status[1]);
4562 if(NVRAM_IS_ATTR_FAULT_ASSERT(ldi->attr) && (nvram_ptr->state == NVRAM_STATE_READY)) {
4563 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"LID:0x%04X, total_records:%d, record_size:%d \r\n", ldi->LID, ldi->total_records, ldi->size);
4564 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"category:0x%08X, attr:0x%08X\r\n", ldi->category, ldi->attr);
4565 NVRAM_DEBUG_DUMP(NVRAM_CRITICAL_DUMP,"fileprefix:%s, fileverno:%s\r\n", ldi->fileprefix, ldi->fileverno);
4566 NVRAM_EXT_ASSERT(KAL_FALSE, drv_status[0]?drv_status[0]:drv_status[1], NVRAM_LOC_BIN_REGION_RESTORE_FAIL, ldi->LID);
4567 } else {
4568 NVRAM_DEBUG_DUMP(NVRAM_WARNING_DUMP,"%s return NVRAM_IO_ERRNO_CHK\r\n",__FUNCTION__);
4569 return NVRAM_IO_ERRNO_CHK;
4570 }
4571 }
4572
4573 #if defined(__NVRAM_CREATE_FILE_ON_WRITE__)
4574 nvram_util_post_reset_gen_default_lid(ldi);
4575 #endif
4576 return NVRAM_IO_ERRNO_OK;
4577}
4578
4579#endif
4580