filex_media_read_write_sector_test.c 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253
  1. /* This FileX test concentrates on the basic media read/write sector operation. */
  2. /* While FX_FAULT_TOLERANT is not defined, fx_utility_logical_sector_write will not cache other types of sectors but FX_DATA_SECTOR. */
  3. #ifndef FX_STANDALONE_ENABLE
  4. #include "tx_api.h"
  5. #endif
  6. #include "fx_api.h"
  7. #include "fx_utility.h"
  8. #include "fx_ram_driver_test.h"
  9. #include <stdio.h>
  10. void test_control_return(UINT status);
  11. #ifndef FX_DISABLE_CACHE
  12. #define DEMO_STACK_SIZE 4096
  13. #define CACHE_SIZE 256*128
  14. /* Define the ThreadX and FileX object control blocks... */
  15. #ifndef FX_STANDALONE_ENABLE
  16. static TX_THREAD ftest_0;
  17. #endif
  18. static FX_MEDIA ram_disk;
  19. static UCHAR raw_sector_buffer[128];
  20. /* Define the counters used in the test application... */
  21. #ifndef FX_STANDALONE_ENABLE
  22. static UCHAR *ram_disk_memory;
  23. static UCHAR *direct_buffer;
  24. static UCHAR *cache_buffer;
  25. #else
  26. static UCHAR direct_buffer[20*128];
  27. static UCHAR cache_buffer[CACHE_SIZE];
  28. #endif
  29. /* Define thread prototypes. */
  30. void filex_media_read_write_sector_application_define(void *first_unused_memory);
  31. static void ftest_0_entry(ULONG thread_input);
  32. VOID _fx_ram_driver(FX_MEDIA *media_ptr);
  33. /* Define what the initial system looks like. */
  34. #ifdef CTEST
  35. void test_application_define(void *first_unused_memory)
  36. #else
  37. void filex_media_read_write_sector_application_define(void *first_unused_memory)
  38. #endif
  39. {
  40. #ifndef FX_STANDALONE_ENABLE
  41. UCHAR *pointer;
  42. /* Setup the working pointer. */
  43. pointer = (UCHAR *) first_unused_memory;
  44. /* Create the main thread. */
  45. tx_thread_create(&ftest_0, "thread 0", ftest_0_entry, 0,
  46. pointer, DEMO_STACK_SIZE,
  47. 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
  48. pointer = pointer + DEMO_STACK_SIZE;
  49. /* Setup memory for the RAM disk and the sector cache. */
  50. cache_buffer = pointer;
  51. pointer = pointer + CACHE_SIZE;
  52. direct_buffer = pointer;
  53. pointer = pointer + 20*128;
  54. ram_disk_memory = pointer;
  55. #endif
  56. /* Initialize the FileX system. */
  57. fx_system_initialize();
  58. #ifdef FX_STANDALONE_ENABLE
  59. ftest_0_entry(0);
  60. #endif
  61. }
  62. /* Define the test threads. */
  63. static void ftest_0_entry(ULONG thread_input)
  64. {
  65. UINT status;
  66. #ifdef FX_FAULT_TOLERANT
  67. UINT first_test = 1;
  68. #endif /* FX_FAULT_TOLERANT */
  69. ULONG64 logical_sector;
  70. UINT i, j;
  71. ULONG fat_entry;
  72. ULONG temp;
  73. ULONG64 accessed_sectors[300];
  74. FX_PARAMETER_NOT_USED(thread_input);
  75. /* Print out some test information banners. */
  76. printf("FileX Test: Media read/write sector test...........................");
  77. #ifdef FX_FAULT_TOLERANT
  78. TEST_START:
  79. #endif /* FX_FAULT_TOLERANT */
  80. /* Format the media. This needs to be done before opening it! */
  81. status = fx_media_format(&ram_disk,
  82. _fx_ram_driver, // Driver entry
  83. ram_disk_memory, // RAM disk memory pointer
  84. cache_buffer, // Media buffer pointer
  85. CACHE_SIZE, // Media buffer size
  86. "MY_RAM_DISK", // Volume Name
  87. 2, // Number of FATs
  88. 32, // Directory Entries
  89. 0, // Hidden sectors
  90. 256, // Total sectors
  91. 128, // Sector size
  92. 1, // Sectors per cluster
  93. 1, // Heads
  94. 1); // Sectors per track
  95. return_if_fail( status == FX_SUCCESS);
  96. /* try to read before the media has been opened */
  97. status = fx_media_read(&ram_disk, 1, (VOID *) raw_sector_buffer);
  98. return_if_fail( status == FX_MEDIA_NOT_OPEN);
  99. /* try to write before the media has been opened */
  100. status = fx_media_write(&ram_disk, 1, (VOID *) raw_sector_buffer);
  101. return_if_fail( status == FX_MEDIA_NOT_OPEN);
  102. /* Open the ram_disk. */
  103. status = fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, cache_buffer, CACHE_SIZE);
  104. return_if_fail( status == FX_SUCCESS);
  105. /* try to write while the media is write protected */
  106. ram_disk.fx_media_driver_write_protect = FX_TRUE;
  107. status = fx_media_write(&ram_disk, 1, (VOID *) raw_sector_buffer);
  108. ram_disk.fx_media_driver_write_protect = FX_FALSE;
  109. return_if_fail( status == FX_WRITE_PROTECT);
  110. /* Only run this if error checking is enabled */
  111. #ifndef FX_DISABLE_ERROR_CHECKING
  112. /* send null pointer to generate an error */
  113. status = fx_media_read(FX_NULL, 0, (void *) raw_sector_buffer);
  114. return_if_fail( status == FX_PTR_ERROR);
  115. /* send null pointer to generate an error */
  116. status = fx_media_write(FX_NULL, 0, (void *) raw_sector_buffer);
  117. return_if_fail( status == FX_PTR_ERROR);
  118. #endif /* FX_DISABLE_ERROR_CHECKING */
  119. /* Read the first FAT sector. */
  120. status = fx_media_read(&ram_disk, 1, (VOID *) raw_sector_buffer);
  121. return_if_fail ((status == FX_SUCCESS) &&
  122. (raw_sector_buffer[0] == 0xF8) && /* _fx_media_format_media_type value set during media format */
  123. (raw_sector_buffer[1] == 0xFF) &&
  124. (raw_sector_buffer[2] == 0xFF));
  125. /* Write the same, unchanged sector back. */
  126. status = fx_media_write(&ram_disk, 1, (VOID *) raw_sector_buffer);
  127. return_if_fail( status == FX_SUCCESS);
  128. /* Close the media. */
  129. status = fx_media_close(&ram_disk);
  130. return_if_fail( status == FX_SUCCESS);
  131. /* Format the media. This needs to be done before opening it! */
  132. status = fx_media_format(&ram_disk,
  133. _fx_ram_driver, // Driver entry
  134. ram_disk_memory, // RAM disk memory pointer
  135. cache_buffer, // Media buffer pointer
  136. CACHE_SIZE, // Media buffer size
  137. "MY_RAM_DISK", // Volume Name
  138. 2, // Number of FATs
  139. 32, // Directory Entries
  140. 0, // Hidden sectors
  141. 7000, // Total sectors
  142. 128, // Sector size
  143. 1, // Sectors per cluster
  144. 1, // Heads
  145. 1); // Sectors per track
  146. status += fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, cache_buffer, CACHE_SIZE);
  147. return_if_fail( status == FX_SUCCESS);
  148. /* Test for invalid sector. */
  149. logical_sector = ram_disk.fx_media_total_sectors;
  150. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  151. return_if_fail( status == FX_SECTOR_INVALID);
  152. /* Test for invalid sector. */
  153. logical_sector = 0;
  154. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  155. return_if_fail( status == FX_SECTOR_INVALID);
  156. /* Test for invalid sector. */
  157. logical_sector = 0xFFFFFFFF;
  158. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  159. return_if_fail( status == FX_SECTOR_INVALID);
  160. /* Test for invalid sector. */
  161. logical_sector = ram_disk.fx_media_total_sectors;
  162. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 4, FX_DATA_SECTOR);
  163. return_if_fail( status == FX_SECTOR_INVALID);
  164. /* Test for invalid sector. */
  165. logical_sector = 0;
  166. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  167. return_if_fail( status == FX_SECTOR_INVALID);
  168. /* Test for invalid sector. */
  169. logical_sector = 0xFFFFFFFF;
  170. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  171. return_if_fail( status == FX_SECTOR_INVALID);
  172. /* Test for invalid sector. */
  173. logical_sector = ram_disk.fx_media_total_sectors;
  174. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  175. return_if_fail( status == FX_SECTOR_INVALID);
  176. /* Write to a sector not in the cache. */
  177. status = _fx_utility_logical_sector_write(&ram_disk, 6900, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  178. /* Read/write 256 sectors, filling the caches. */
  179. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  180. for (i = 0; i < 256; i++)
  181. {
  182. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  183. #ifdef FX_FAULT_TOLERANT
  184. if (first_test)
  185. {
  186. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  187. }
  188. else
  189. {
  190. #endif
  191. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  192. #ifdef FX_FAULT_TOLERANT
  193. }
  194. #endif
  195. logical_sector++;
  196. }
  197. /* At this point the cache is complete full. */
  198. /* Now perform direct buffer read ram_disk.fx_media_data_sector_start on sectors before the cache. */
  199. logical_sector = + 2;
  200. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 4, FX_DIRECTORY_SECTOR);
  201. /* Now perform direct buffer write. */
  202. #ifdef FX_FAULT_TOLERANT
  203. if (first_test)
  204. {
  205. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  206. }
  207. else
  208. {
  209. #endif
  210. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DIRECTORY_SECTOR);
  211. #ifdef FX_FAULT_TOLERANT
  212. }
  213. #endif
  214. /* Perform a flush. */
  215. status += _fx_utility_logical_sector_flush(&ram_disk, logical_sector, 300, FX_TRUE);
  216. /* Perform another flush with nothing in the cache. */
  217. status += _fx_utility_logical_sector_flush(&ram_disk, logical_sector, 300, FX_TRUE);
  218. /* Read/write 256 sectors, filling the caches. */
  219. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  220. for (i = 0; i < 256; i++)
  221. {
  222. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  223. #ifdef FX_FAULT_TOLERANT
  224. if (first_test)
  225. {
  226. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  227. }
  228. else
  229. {
  230. #endif
  231. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  232. #ifdef FX_FAULT_TOLERANT
  233. }
  234. #endif
  235. logical_sector++;
  236. }
  237. /* Now perform direct buffer read ram_disk.fx_media_data_sector_start on sectors before the cache. */
  238. logical_sector = (ULONG64)-2;
  239. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 4, FX_DIRECTORY_SECTOR);
  240. /* Now perform direct buffer write. */
  241. #ifdef FX_FAULT_TOLERANT
  242. if (first_test)
  243. {
  244. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  245. }
  246. else
  247. {
  248. #endif
  249. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DIRECTORY_SECTOR);
  250. #ifdef FX_FAULT_TOLERANT
  251. }
  252. #endif
  253. /* Perform a flush. */
  254. status += _fx_utility_logical_sector_flush(&ram_disk, logical_sector, 300, FX_FALSE);
  255. /* Read/write 128 sectors, filling the caches and causing cache misses. */
  256. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  257. for (i = 0; i < 512; i++)
  258. {
  259. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  260. #ifdef FX_FAULT_TOLERANT
  261. if (first_test)
  262. {
  263. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  264. }
  265. else
  266. {
  267. #endif
  268. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  269. #ifdef FX_FAULT_TOLERANT
  270. }
  271. #endif
  272. logical_sector++;
  273. }
  274. /* Perform a flush. */
  275. status += _fx_utility_logical_sector_flush(&ram_disk, logical_sector, 300, FX_FALSE);
  276. /* Read 256 sectors, filling the caches. */
  277. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  278. for (i = 0; i < 256; i++)
  279. {
  280. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  281. logical_sector++;
  282. }
  283. /* Write same 256 sectors in reverse order. */
  284. for (i = 0; i < 256; i++)
  285. {
  286. logical_sector--;
  287. #ifdef FX_FAULT_TOLERANT
  288. if (first_test)
  289. {
  290. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  291. }
  292. else
  293. {
  294. #endif
  295. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  296. #ifdef FX_FAULT_TOLERANT
  297. }
  298. #endif
  299. }
  300. /* Update FAT entires. */
  301. for (i = 2; i < 6000; i++)
  302. {
  303. status += _fx_utility_FAT_entry_write(&ram_disk, (ULONG) i, (ULONG) i+1);
  304. }
  305. /* Flush the FAT. */
  306. status += _fx_utility_FAT_map_flush(&ram_disk);
  307. /* Indicate that the driver needs to know! */
  308. ram_disk.fx_media_driver_free_sector_update = FX_TRUE;
  309. /* Update FAT entries again, but this time with free marker. */
  310. for (i = 2; i < 6000; i++)
  311. {
  312. status += _fx_utility_FAT_entry_write(&ram_disk, (ULONG) i, FX_FREE_CLUSTER);
  313. }
  314. /* Flush the FAT. */
  315. status += _fx_utility_FAT_map_flush(&ram_disk);
  316. ram_disk.fx_media_driver_free_sector_update = FX_FALSE;
  317. /* Random test of 300 sectors. */
  318. for (i = 0; i < 300; i++)
  319. {
  320. accessed_sectors[i] = logical_sector + (ULONG64)(rand() % 5000);
  321. status += _fx_utility_logical_sector_read(&ram_disk, accessed_sectors[i], ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  322. if ((i > 0) && (rand() & 1))
  323. {
  324. j = ((UINT)rand() % i);
  325. status += _fx_utility_logical_sector_write(&ram_disk, accessed_sectors[j], ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  326. }
  327. }
  328. /* Random test of 300 sectors with random logical sector flush. */
  329. for (i = 0; i < 300; i++)
  330. {
  331. accessed_sectors[i] = logical_sector + (ULONG64)(rand() % 5000);
  332. status += _fx_utility_logical_sector_read(&ram_disk, accessed_sectors[i], ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  333. if ((i > 0) && (rand() & 1))
  334. {
  335. j = ((UINT)rand() % i);
  336. status += _fx_utility_logical_sector_write(&ram_disk, accessed_sectors[j], ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  337. }
  338. if ((i > 0) && (rand() & 1))
  339. {
  340. j = ((UINT)rand() % i);
  341. if (rand() & 1)
  342. status += _fx_utility_logical_sector_flush(&ram_disk, accessed_sectors[j], 1, FX_TRUE);
  343. else
  344. status += _fx_utility_logical_sector_flush(&ram_disk, accessed_sectors[j], 1, FX_FALSE);
  345. }
  346. }
  347. /* Random test of 1000 FAT entry reads/writes. */
  348. for (i = 0; i < 1000; i++)
  349. {
  350. j = ((UINT)rand() % 100);
  351. status += _fx_utility_FAT_entry_read(&ram_disk, j+2, &fat_entry);
  352. if (rand() & 1)
  353. {
  354. j = ((UINT)rand() % 100);
  355. if (rand() & 1)
  356. status += _fx_utility_FAT_entry_write(&ram_disk, j+2, j+3);
  357. else
  358. status += _fx_utility_FAT_entry_write(&ram_disk, j+2, FX_FREE_CLUSTER);
  359. }
  360. }
  361. /* Random test of 1000 FAT entry reads/writes with random FAT flush. */
  362. for (i = 0; i < 1000; i++)
  363. {
  364. j = ((UINT)rand() % 100);
  365. status += _fx_utility_FAT_entry_read(&ram_disk, j+2, &fat_entry);
  366. if (rand() & 1)
  367. {
  368. j = ((UINT)rand() % 100);
  369. if (rand() & 1)
  370. status += _fx_utility_FAT_entry_write(&ram_disk, j+2, j+3);
  371. else
  372. status += _fx_utility_FAT_entry_write(&ram_disk, j+2, FX_FREE_CLUSTER);
  373. }
  374. if (rand() & 1)
  375. {
  376. status += _fx_utility_FAT_flush(&ram_disk);
  377. }
  378. if (rand() & 1)
  379. {
  380. status += _fx_utility_FAT_map_flush(&ram_disk);
  381. }
  382. }
  383. return_if_fail( status == FX_SUCCESS);
  384. /* Set the free sector update. */
  385. ram_disk.fx_media_driver_free_sector_update = FX_TRUE;
  386. /* Random test of 1000 FAT entry reads/writes with random FAT flush and random errors. */
  387. _fx_utility_FAT_flush(&ram_disk);
  388. _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  389. _fx_ram_driver_io_error_request = 1000;
  390. for (i = 0; i < 300000; i++)
  391. {
  392. j = ((UINT)rand() % 100);
  393. _fx_utility_FAT_entry_read(&ram_disk, j+2, &fat_entry);
  394. if (rand() & 1)
  395. {
  396. j = ((UINT)rand() % 100);
  397. if (rand() & 1)
  398. _fx_utility_FAT_entry_write(&ram_disk, j+2, j+3);
  399. else
  400. _fx_utility_FAT_entry_write(&ram_disk, j+2, FX_FREE_CLUSTER);
  401. }
  402. if (i & 1)
  403. _fx_utility_FAT_flush(&ram_disk);
  404. else
  405. _fx_utility_FAT_map_flush(&ram_disk);
  406. _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  407. }
  408. _fx_ram_driver_io_error_request = 0;
  409. /* Set the free sector update. */
  410. ram_disk.fx_media_driver_free_sector_update = FX_FALSE;
  411. /* Flush out the logical sector cache. */
  412. status = _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  413. /* Read/write 256 sectors, filling the caches. */
  414. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  415. for (i = 0; i < 256; i++)
  416. {
  417. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  418. #ifdef FX_FAULT_TOLERANT
  419. if (first_test)
  420. {
  421. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  422. }
  423. else
  424. {
  425. #endif
  426. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  427. #ifdef FX_FAULT_TOLERANT
  428. }
  429. #endif
  430. logical_sector++;
  431. }
  432. /* Now test the flush logic with write protection enabled. */
  433. ram_disk.fx_media_driver_write_protect = FX_TRUE;
  434. status += _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  435. ram_disk.fx_media_driver_write_protect = FX_FALSE;
  436. return_if_fail( status == FX_SUCCESS);
  437. /* Flush out the logical sector cache. */
  438. _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  439. /* Read/write 256 sectors, filling the caches. */
  440. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  441. for (i = 0; i < 256; i++)
  442. {
  443. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  444. #ifdef FX_FAULT_TOLERANT
  445. if (first_test)
  446. {
  447. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  448. }
  449. else
  450. {
  451. #endif
  452. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  453. #ifdef FX_FAULT_TOLERANT
  454. }
  455. #endif
  456. logical_sector++;
  457. }
  458. /* Now test the flush logic with an I/O error. */
  459. _fx_ram_driver_io_error_request = 1;
  460. status += _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  461. _fx_ram_driver_io_error_request = 0;
  462. /* Flush out the logical sector cache. */
  463. status = _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  464. /* Read/write 256 sectors, filling the caches. */
  465. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  466. for (i = 0; i < 256; i++)
  467. {
  468. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  469. #ifdef FX_FAULT_TOLERANT
  470. if (first_test)
  471. {
  472. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  473. }
  474. else
  475. {
  476. #endif
  477. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  478. #ifdef FX_FAULT_TOLERANT
  479. }
  480. #endif
  481. logical_sector++;
  482. }
  483. /* Now test the flush logic with an I/O error. */
  484. status += _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  485. /* Close the media. */
  486. status += fx_media_close(&ram_disk);
  487. return_if_fail( status == FX_SUCCESS);
  488. /* Format the media. This needs to be done before opening it! */
  489. status = fx_media_format(&ram_disk,
  490. _fx_ram_driver, // Driver entry
  491. ram_disk_memory, // RAM disk memory pointer
  492. cache_buffer, // Media buffer pointer
  493. CACHE_SIZE, // Media buffer size
  494. "MY_RAM_DISK", // Volume Name
  495. 2, // Number of FATs
  496. 32, // Directory Entries
  497. 0, // Hidden sectors
  498. 7000, // Total sectors
  499. 128, // Sector size
  500. 1, // Sectors per cluster
  501. 1, // Heads
  502. 1); // Sectors per track
  503. /* Open the ram_disk. */
  504. status += fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, cache_buffer, CACHE_SIZE-1);
  505. return_if_fail( status == FX_SUCCESS);
  506. /* Test for invalid sector. */
  507. logical_sector = ram_disk.fx_media_total_sectors;
  508. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  509. return_if_fail( status == FX_SECTOR_INVALID);
  510. /* Test for invalid sector. */
  511. logical_sector = 0;
  512. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  513. return_if_fail( status == FX_SECTOR_INVALID);
  514. /* Test for invalid sector. */
  515. logical_sector = 0xFFFFFFFF;
  516. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  517. return_if_fail( status == FX_SECTOR_INVALID);
  518. /* Test for invalid sector. */
  519. logical_sector = ram_disk.fx_media_total_sectors;
  520. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  521. return_if_fail( status == FX_SECTOR_INVALID);
  522. /* Test for invalid sector. */
  523. logical_sector = 0;
  524. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  525. return_if_fail( status == FX_SECTOR_INVALID);
  526. /* Test for invalid sector. */
  527. logical_sector = 0xFFFFFFFF;
  528. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  529. return_if_fail( status == FX_SECTOR_INVALID);
  530. /* Test for invalid sector. */
  531. logical_sector = ram_disk.fx_media_total_sectors;
  532. status = _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  533. return_if_fail( status == FX_SECTOR_INVALID);
  534. status = 0;
  535. /* Read/write 256 sectors, filling the caches. */
  536. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  537. for (i = 0; i < 256; i++)
  538. {
  539. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  540. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  541. logical_sector++;
  542. }
  543. /* At this point the cache is complete full. */
  544. /* Now perform direct buffer read ram_disk.fx_media_data_sector_start on sectors before the cache. */
  545. logical_sector = + 2;
  546. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 4, FX_DIRECTORY_SECTOR);
  547. /* Now perform direct buffer write. */
  548. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  549. /* Perform a flush. */
  550. status += _fx_utility_logical_sector_flush(&ram_disk, logical_sector, 300, FX_TRUE);
  551. /* Perform another flush with nothing in the cache. */
  552. status += _fx_utility_logical_sector_flush(&ram_disk, logical_sector, 300, FX_TRUE);
  553. /* Read/write 256 sectors, filling the caches. */
  554. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  555. for (i = 0; i < 256; i++)
  556. {
  557. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  558. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  559. logical_sector++;
  560. }
  561. /* Now perform direct buffer read ram_disk.fx_media_data_sector_start on sectors before the cache. */
  562. logical_sector = (ULONG64)-2;
  563. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 4, FX_DIRECTORY_SECTOR);
  564. /* Now perform direct buffer write. */
  565. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 4, FX_DATA_SECTOR);
  566. /* Perform a flush. */
  567. status += _fx_utility_logical_sector_flush(&ram_disk, logical_sector, 300, FX_FALSE);
  568. /* Read/write 300 sectors, filling the caches and causing cache misses. */
  569. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  570. for (i = 0; i < 300; i++)
  571. {
  572. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  573. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  574. logical_sector++;
  575. }
  576. /* Perform a flush. */
  577. status += _fx_utility_logical_sector_flush(&ram_disk, logical_sector, 300, FX_FALSE);
  578. /* Read 256 sectors, filling the caches. */
  579. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  580. for (i = 0; i < 256; i++)
  581. {
  582. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  583. logical_sector++;
  584. }
  585. /* Write same 256 sectors in reverse order. */
  586. for (i = 0; i < 256; i++)
  587. {
  588. logical_sector--;
  589. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  590. }
  591. /* Update FAT entires. */
  592. for (i = 2; i < 6000; i++)
  593. {
  594. status += _fx_utility_FAT_entry_write(&ram_disk, (ULONG) i, (ULONG) i+1);
  595. }
  596. /* Flush the FAT. */
  597. status += _fx_utility_FAT_map_flush(&ram_disk);
  598. /* Indicate that the driver needs to know! */
  599. ram_disk.fx_media_driver_free_sector_update = FX_TRUE;
  600. /* Update FAT entries again, but this time with free marker. */
  601. for (i = 2; i < 6000; i++)
  602. {
  603. status += _fx_utility_FAT_entry_write(&ram_disk, (ULONG) i, FX_FREE_CLUSTER);
  604. }
  605. /* Flush the FAT. */
  606. status += _fx_utility_FAT_map_flush(&ram_disk);
  607. ram_disk.fx_media_driver_free_sector_update = FX_FALSE;
  608. /* Test the case where the logical sector cache has something in it, but the write hasn't been found. */
  609. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  610. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector+1, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  611. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector+2, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  612. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector+3, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  613. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector+4, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  614. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector+1, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  615. /* Random test of 300 sectors. */
  616. for (i = 0; i < 300; i++)
  617. {
  618. accessed_sectors[i] = logical_sector + (ULONG64)(rand() % 5000);
  619. status += _fx_utility_logical_sector_read(&ram_disk, accessed_sectors[i], ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  620. if ((i > 0) && (rand() & 1))
  621. {
  622. j = ((UINT)rand() % i);
  623. status += _fx_utility_logical_sector_write(&ram_disk, accessed_sectors[j], ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  624. }
  625. }
  626. /* Random test of 300 sectors with random logical sector flush. */
  627. for (i = 0; i < 300; i++)
  628. {
  629. accessed_sectors[i] = logical_sector + (ULONG64)(rand() % 5000);
  630. status += _fx_utility_logical_sector_read(&ram_disk, accessed_sectors[i], ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  631. if ((i > 0) && (rand() & 1))
  632. {
  633. j = ((UINT)rand() % i);
  634. status += _fx_utility_logical_sector_write(&ram_disk, accessed_sectors[j], ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  635. }
  636. if ((i > 0) && (rand() & 1))
  637. {
  638. j = ((UINT)rand() % i);
  639. if (rand() & 1)
  640. status += _fx_utility_logical_sector_flush(&ram_disk, accessed_sectors[j], 1, FX_TRUE);
  641. else
  642. status += _fx_utility_logical_sector_flush(&ram_disk, accessed_sectors[j], 1, FX_FALSE);
  643. }
  644. }
  645. /* Random test of 1000 FAT entry reads/writes. */
  646. for (i = 0; i < 1000; i++)
  647. {
  648. j = ((UINT)rand() % 100);
  649. status += _fx_utility_FAT_entry_read(&ram_disk, j+2, &fat_entry);
  650. if (rand() & 1)
  651. {
  652. j = ((UINT)rand() % 100);
  653. if (rand() & 1)
  654. status += _fx_utility_FAT_entry_write(&ram_disk, j+2, j+3);
  655. else
  656. status += _fx_utility_FAT_entry_write(&ram_disk, j+2, FX_FREE_CLUSTER);
  657. }
  658. }
  659. /* Random test of 1000 FAT entry reads/writes with random FAT flush. */
  660. for (i = 0; i < 1000; i++)
  661. {
  662. j = ((UINT)rand() % 100);
  663. status += _fx_utility_FAT_entry_read(&ram_disk, j+2, &fat_entry);
  664. if (rand() & 1)
  665. {
  666. j = ((UINT)rand() % 100);
  667. if (rand() & 1)
  668. status += _fx_utility_FAT_entry_write(&ram_disk, j+2, j+3);
  669. else
  670. status += _fx_utility_FAT_entry_write(&ram_disk, j+2, FX_FREE_CLUSTER);
  671. }
  672. if (rand() & 1)
  673. {
  674. status += _fx_utility_FAT_flush(&ram_disk);
  675. }
  676. if (rand() & 1)
  677. {
  678. status += _fx_utility_FAT_map_flush(&ram_disk);
  679. }
  680. }
  681. return_if_fail( status == FX_SUCCESS);
  682. /* Set the free sector update. */
  683. ram_disk.fx_media_driver_free_sector_update = FX_TRUE;
  684. /* Random test of 1000 FAT entry reads/writes with random FAT flush and random errors. */
  685. _fx_utility_FAT_flush(&ram_disk);
  686. _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  687. _fx_ram_driver_io_error_request = 1000;
  688. for (i = 0; i < 300000; i++)
  689. {
  690. j = ((UINT)rand() % 100);
  691. _fx_utility_logical_sector_read(&ram_disk, (ULONG64) j, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  692. if (rand() & 1)
  693. _fx_utility_logical_sector_write(&ram_disk, (ULONG64) j, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  694. j = ((UINT)rand() % 100);
  695. _fx_utility_FAT_entry_read(&ram_disk, j+2, &fat_entry);
  696. if (rand() & 1)
  697. {
  698. j = ((UINT)rand() % 100);
  699. if (rand() & 1)
  700. _fx_utility_FAT_entry_write(&ram_disk, j+2, j+3);
  701. else
  702. _fx_utility_FAT_entry_write(&ram_disk, j+2, FX_FREE_CLUSTER);
  703. }
  704. if (i & 1)
  705. _fx_utility_FAT_flush(&ram_disk);
  706. else
  707. _fx_utility_FAT_map_flush(&ram_disk);
  708. }
  709. _fx_ram_driver_io_error_request = 0;
  710. /* Set the free sector update. */
  711. ram_disk.fx_media_driver_free_sector_update = FX_FALSE;
  712. /* Read/write 256 sectors, filling the caches. */
  713. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  714. for (i = 0; i < 256; i++)
  715. {
  716. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  717. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  718. logical_sector++;
  719. }
  720. /* Now perform direct buffer read ram_disk.fx_media_data_sector_start on sectors before the cache. */
  721. logical_sector = ram_disk.fx_media_data_sector_start;
  722. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 12, FX_DIRECTORY_SECTOR);
  723. /* Now perform direct buffer write. */
  724. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, direct_buffer, 12, FX_DATA_SECTOR);
  725. /* Flush out the logical sector cache. */
  726. status += _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  727. /* Read/write 256 sectors, filling the caches. */
  728. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  729. for (i = 0; i < 256; i++)
  730. {
  731. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  732. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  733. logical_sector++;
  734. }
  735. return_if_fail( status == FX_SUCCESS);
  736. /* Now direct read a logical sector outside the cache and cause an I/O error in the process. */
  737. _fx_ram_driver_io_error_request = 2;
  738. logical_sector = ram_disk.fx_media_data_sector_start;
  739. status = _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 1, FX_DIRECTORY_SECTOR);
  740. _fx_ram_driver_io_error_request = 0;
  741. /* Flush out the logical sector cache. */
  742. status = _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  743. /* Read/write 256 sectors, filling the caches. */
  744. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  745. for (i = 0; i < 256; i++)
  746. {
  747. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  748. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  749. logical_sector++;
  750. }
  751. /* Perform a direct read that exceeds the amount that can fit into the cache easily. */
  752. logical_sector = 6800;
  753. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 20, FX_UNKNOWN_SECTOR);
  754. return_if_fail( status == FX_SUCCESS);
  755. /* Flush out the logical sector cache. */
  756. status = _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  757. /* Read/write 256 sectors, filling the caches. */
  758. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  759. for (i = 0; i < 256; i++)
  760. {
  761. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  762. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  763. logical_sector++;
  764. }
  765. /* Perform a direct read that suffers an I/O error. */
  766. logical_sector = 6800;
  767. _fx_ram_driver_io_error_request = 1;
  768. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 1, FX_UNKNOWN_SECTOR);
  769. _fx_ram_driver_io_error_request = 0;
  770. /* Flush out the logical sector cache. */
  771. status = _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  772. /* Read/write 256 sectors, filling the caches. */
  773. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  774. for (i = 0; i < 256; i++)
  775. {
  776. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  777. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  778. logical_sector++;
  779. }
  780. /* Perform a direct read that should be successful. */
  781. logical_sector = 6800;
  782. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, direct_buffer, 1, FX_UNKNOWN_SECTOR);
  783. return_if_fail( status == FX_SUCCESS);
  784. /* Flush out the logical sector cache. */
  785. status = _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  786. /* Read/write 256 sectors, filling the caches. */
  787. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  788. for (i = 0; i < 256; i++)
  789. {
  790. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  791. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  792. logical_sector++;
  793. }
  794. /* Now test the flush logic with write protection enabled. */
  795. ram_disk.fx_media_driver_write_protect = FX_TRUE;
  796. status += _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  797. ram_disk.fx_media_driver_write_protect = FX_FALSE;
  798. return_if_fail( status == FX_SUCCESS);
  799. /* Flush out the logical sector cache. */
  800. _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  801. /* Read/write 256 sectors, filling the caches. */
  802. logical_sector = ram_disk.fx_media_data_sector_start + 4;
  803. for (i = 0; i < 256; i++)
  804. {
  805. status += _fx_utility_logical_sector_read(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DIRECTORY_SECTOR);
  806. status += _fx_utility_logical_sector_write(&ram_disk, logical_sector, ram_disk.fx_media_memory_buffer, 1, FX_DATA_SECTOR);
  807. logical_sector++;
  808. }
  809. /* Now test the flush logic with an I/O error. */
  810. _fx_ram_driver_io_error_request = 1;
  811. status += _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  812. _fx_ram_driver_io_error_request = 0;
  813. /* Flush the FAT. */
  814. _fx_utility_logical_sector_flush(&ram_disk, ram_disk.fx_media_data_sector_start, 60000, FX_TRUE);
  815. _fx_utility_FAT_flush(&ram_disk);
  816. /* Now test the FAT map flush with an I/O error on the read of the primary FAT sector. */
  817. _fx_ram_driver_io_error_request = 1;
  818. status = _fx_utility_FAT_map_flush(&ram_disk);
  819. _fx_ram_driver_io_error_request = 0;
  820. /* Now test the FAT map flush with an I/O error on the write of the secondary FAT sector. */
  821. _fx_ram_driver_io_error_request = 3;
  822. status = _fx_utility_FAT_map_flush(&ram_disk);
  823. _fx_ram_driver_io_error_request = 0;
  824. /* Close the media. */
  825. status = fx_media_close(&ram_disk);
  826. return_if_fail( status == FX_SUCCESS);
  827. /* FAT12 FAT flush I/O error testing. */
  828. /* Format the media. This needs to be done before opening it! */
  829. status = fx_media_format(&ram_disk,
  830. _fx_ram_driver, // Driver entry
  831. ram_disk_memory, // RAM disk memory pointer
  832. cache_buffer, // Media buffer pointer
  833. CACHE_SIZE, // Media buffer size
  834. "MY_RAM_DISK", // Volume Name
  835. 2, // Number of FATs
  836. 32, // Directory Entries
  837. 0, // Hidden sectors
  838. 2000, // Total sectors
  839. 128, // Sector size
  840. 1, // Sectors per cluster
  841. 1, // Heads
  842. 1); // Sectors per track
  843. /* Open the ram_disk. */
  844. status += fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, cache_buffer, 128);
  845. return_if_fail( status == FX_SUCCESS);
  846. /* Now loop to write the FAT entries out with random I/O erorrs. */
  847. fat_entry = 4;
  848. for (i = 0; i < 500000; i++)
  849. {
  850. _fx_ram_driver_io_error_request = ((UINT)rand() % 5);
  851. if (_fx_ram_driver_io_error_request == 0)
  852. _fx_ram_driver_io_error_request = 1;
  853. _fx_utility_FAT_entry_read(&ram_disk, fat_entry, &temp);
  854. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  855. _fx_utility_FAT_entry_write(&ram_disk, fat_entry, fat_entry+1);
  856. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  857. /* Move to next FAT entry. */
  858. fat_entry++;
  859. if (fat_entry >= (ram_disk.fx_media_available_clusters-1))
  860. fat_entry = 4;
  861. }
  862. for (i = 0; i < 500000; i++)
  863. {
  864. _fx_ram_driver_io_error_request = ((UINT)rand() % 5);
  865. if (_fx_ram_driver_io_error_request == 0)
  866. _fx_ram_driver_io_error_request = 1;
  867. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  868. _fx_utility_FAT_entry_write(&ram_disk, fat_entry, fat_entry+1);
  869. /* Move to next FAT entry. */
  870. fat_entry++;
  871. if (fat_entry >= (ram_disk.fx_media_available_clusters-1))
  872. fat_entry = 4;
  873. }
  874. _fx_ram_driver_io_error_request = 0;
  875. /* Set the error flag to make logical sector write return an error. */
  876. _fx_utility_logical_sector_write_error_request = 1;
  877. status = _fx_utility_FAT_flush(&ram_disk);
  878. _fx_utility_logical_sector_write_error_request = 70000; /* This should not hit, but satisfy the code coverage. */
  879. _fx_utility_FAT_flush(&ram_disk);
  880. _fx_utility_logical_sector_write_error_request = 0;
  881. /* Close the media. */
  882. status = fx_media_close(&ram_disk);
  883. return_if_fail( status == FX_SUCCESS);
  884. /* FAT16 FAT flush I/O error testing. */
  885. /* Format the media. This needs to be done before opening it! */
  886. status = fx_media_format(&ram_disk,
  887. _fx_ram_driver, // Driver entry
  888. ram_disk_memory, // RAM disk memory pointer
  889. cache_buffer, // Media buffer pointer
  890. CACHE_SIZE, // Media buffer size
  891. "MY_RAM_DISK", // Volume Name
  892. 2, // Number of FATs
  893. 32, // Directory Entries
  894. 0, // Hidden sectors
  895. 7000, // Total sectors
  896. 128, // Sector size
  897. 1, // Sectors per cluster
  898. 1, // Heads
  899. 1); // Sectors per track
  900. status += fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, cache_buffer, 128);
  901. return_if_fail( status == FX_SUCCESS);
  902. /* Now loop to write the FAT entries out with random I/O erorrs. */
  903. fat_entry = 4;
  904. for (i = 0; i < 500000; i++)
  905. {
  906. _fx_ram_driver_io_error_request = ((UINT)rand() % 5);
  907. if (_fx_ram_driver_io_error_request == 0)
  908. _fx_ram_driver_io_error_request = 1;
  909. _fx_utility_FAT_entry_read(&ram_disk, fat_entry, &temp);
  910. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  911. _fx_utility_FAT_entry_write(&ram_disk, fat_entry, fat_entry+1);
  912. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  913. /* Move to next FAT entry. */
  914. fat_entry++;
  915. if (fat_entry >= (ram_disk.fx_media_available_clusters-1))
  916. fat_entry = 4;
  917. }
  918. for (i = 0; i < 500000; i++)
  919. {
  920. _fx_ram_driver_io_error_request = ((UINT)rand() % 5);
  921. if (_fx_ram_driver_io_error_request == 0)
  922. _fx_ram_driver_io_error_request = 1;
  923. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  924. _fx_utility_FAT_entry_write(&ram_disk, fat_entry, fat_entry+1);
  925. /* Move to next FAT entry. */
  926. fat_entry++;
  927. if (fat_entry >= (ram_disk.fx_media_available_clusters-1))
  928. fat_entry = 4;
  929. }
  930. _fx_ram_driver_io_error_request = 0;
  931. /* Set the error flag to make logical sector write return an error. */
  932. _fx_utility_logical_sector_write_error_request = 1;
  933. status = _fx_utility_FAT_flush(&ram_disk);
  934. _fx_utility_logical_sector_write_error_request = 70000; /* This should not hit, but satisfy the code coverage. */
  935. _fx_utility_FAT_flush(&ram_disk);
  936. _fx_utility_logical_sector_write_error_request = 0;
  937. /* Close the media. */
  938. status = fx_media_close(&ram_disk);
  939. return_if_fail( status == FX_SUCCESS);
  940. /* FAT32 FAT flush I/O error testing. */
  941. /* Format the media. This needs to be done before opening it! */
  942. status = fx_media_format(&ram_disk,
  943. _fx_ram_driver, // Driver entry
  944. ram_disk_memory, // RAM disk memory pointer
  945. cache_buffer, // Media buffer pointer
  946. CACHE_SIZE, // Media buffer size
  947. "MY_RAM_DISK", // Volume Name
  948. 2, // Number of FATs
  949. 32, // Directory Entries
  950. 0, // Hidden sectors
  951. 70128, // Total sectors
  952. 128, // Sector size
  953. 1, // Sectors per cluster
  954. 1, // Heads
  955. 1); // Sectors per track
  956. status += fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, cache_buffer, 128);
  957. return_if_fail( status == FX_SUCCESS);
  958. /* Now loop to write the FAT entries out with random I/O erorrs. */
  959. fat_entry = 4;
  960. for (i = 0; i < 500000; i++)
  961. {
  962. _fx_ram_driver_io_error_request = ((UINT)rand() % 5);
  963. if (_fx_ram_driver_io_error_request == 0)
  964. _fx_ram_driver_io_error_request = 1;
  965. _fx_utility_FAT_entry_read(&ram_disk, fat_entry, &temp);
  966. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  967. _fx_utility_FAT_entry_write(&ram_disk, fat_entry, fat_entry+1);
  968. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  969. /* Move to next FAT entry. */
  970. fat_entry++;
  971. if (fat_entry >= (ram_disk.fx_media_available_clusters-1))
  972. fat_entry = 4;
  973. }
  974. for (i = 0; i < 500000; i++)
  975. {
  976. _fx_ram_driver_io_error_request = ((UINT)rand() % 5);
  977. if (_fx_ram_driver_io_error_request == 0)
  978. _fx_ram_driver_io_error_request = 1;
  979. _fx_utility_logical_sector_flush(&ram_disk, 1, 60000, FX_TRUE);
  980. _fx_utility_FAT_entry_write(&ram_disk, fat_entry, fat_entry+1);
  981. /* Move to next FAT entry. */
  982. fat_entry++;
  983. if (fat_entry >= (ram_disk.fx_media_available_clusters-1))
  984. fat_entry = 4;
  985. }
  986. _fx_ram_driver_io_error_request = 0;
  987. /* Set the error flag to make logical sector write return an error. */
  988. _fx_utility_logical_sector_write_error_request = 1;
  989. status = _fx_utility_FAT_flush(&ram_disk);
  990. _fx_utility_logical_sector_write_error_request = 70000; /* This should not hit, but satisfy the code coverage. */
  991. _fx_utility_FAT_flush(&ram_disk);
  992. _fx_utility_logical_sector_write_error_request = 0;
  993. /* Close the media. */
  994. status = fx_media_close(&ram_disk);
  995. return_if_fail( status == FX_SUCCESS);
  996. #ifdef FX_FAULT_TOLERANT
  997. if (first_test)
  998. {
  999. first_test = 0;
  1000. goto TEST_START;
  1001. }
  1002. #endif
  1003. printf("SUCCESS!\n");
  1004. test_control_return(0);
  1005. }
  1006. #else
  1007. #ifdef CTEST
  1008. void test_application_define(void *first_unused_memory)
  1009. #else
  1010. void filex_media_read_write_sector_application_define(void *first_unused_memory)
  1011. #endif
  1012. {
  1013. FX_PARAMETER_NOT_USED(first_unused_memory);
  1014. /* Print out some test information banners. */
  1015. printf("FileX Test: Media read/write sector test...........................N/A\n");
  1016. test_control_return(255);
  1017. }
  1018. #endif