fm_patch.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include <linux/fs.h>
  2. #include <asm/uaccess.h>
  3. #include "fm_typedef.h"
  4. #include "fm_dbg.h"
  5. #include "fm_err.h"
  6. /*
  7. * fm_file_exist - test file
  8. * @filename - source file name
  9. * If exsit, return 0, else error code
  10. */
  11. fm_s32 fm_file_exist(const fm_s8 *filename)
  12. {
  13. fm_s32 ret = 0;
  14. mm_segment_t old_fs;
  15. struct file *fp = NULL;
  16. old_fs = get_fs();
  17. set_fs(KERNEL_DS);
  18. fp = filp_open(filename, O_RDONLY, 0);
  19. if (IS_ERR(fp)) {
  20. WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
  21. set_fs(old_fs);
  22. return -FM_EPATCH;
  23. }
  24. WCN_DBG(FM_DBG | CHIP, "open \"%s\" ok\n", filename);
  25. if (fp)
  26. filp_close(fp, NULL);
  27. set_fs(old_fs);
  28. return ret;
  29. }
  30. /*
  31. * fm_file_read - read FM DSP patch/coeff/hwcoeff/rom binary file
  32. * @filename - source file name
  33. * @dst - target buffer
  34. * @len - desired read length
  35. * @position - the read position
  36. * If success, return read length in bytes, else error code
  37. */
  38. fm_s32 fm_file_read(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 position)
  39. {
  40. fm_s32 ret = 0;
  41. loff_t pos = position;
  42. mm_segment_t old_fs;
  43. struct file *fp = NULL;
  44. old_fs = get_fs();
  45. set_fs(KERNEL_DS);
  46. fp = filp_open(filename, O_RDONLY, 0);
  47. if ((!fp) || IS_ERR(fp)) {
  48. WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
  49. set_fs(old_fs);
  50. return -FM_EPATCH;
  51. }
  52. ret = vfs_read(fp, (char __user *)dst, len, &pos);
  53. if (ret < 0)
  54. WCN_DBG(FM_ERR | CHIP, "read \"%s\" failed\n", filename);
  55. else if (ret < len)
  56. WCN_DBG(FM_DBG | CHIP, "read \"%s\" part data\n", filename);
  57. else
  58. WCN_DBG(FM_DBG | CHIP, "read \"%s\" full data\n", filename);
  59. if (fp)
  60. filp_close(fp, NULL);
  61. set_fs(old_fs);
  62. return ret;
  63. }
  64. fm_s32 fm_file_write(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 *ppos)
  65. {
  66. fm_s32 ret = 0;
  67. loff_t pos = *ppos;
  68. mm_segment_t old_fs;
  69. struct file *fp = NULL;
  70. old_fs = get_fs();
  71. set_fs(KERNEL_DS);
  72. fp = filp_open(filename, O_CREAT | O_RDWR, 0);
  73. if ((!fp) || IS_ERR(fp)) {
  74. WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
  75. set_fs(old_fs);
  76. return -FM_EPATCH;
  77. }
  78. WCN_DBG(FM_DBG | CHIP, "open \"%s\" ok\n", filename);
  79. WCN_DBG(FM_DBG | CHIP, "\"%s\" old pos %d\n", filename, (int)pos);
  80. ret = vfs_write(fp, (char __user *)dst, len, &pos);
  81. WCN_DBG(FM_DBG | CHIP, "\"%s\" new pos %d\n", filename, (int)pos);
  82. *ppos = pos;
  83. if (ret < 0)
  84. WCN_DBG(FM_ERR | CHIP, "write \"%s\" failed\n", filename);
  85. else if (ret < len)
  86. WCN_DBG(FM_DBG | CHIP, "write \"%s\" data\n", filename);
  87. if (fp)
  88. filp_close(fp, NULL);
  89. set_fs(old_fs);
  90. return ret;
  91. }