| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #include <linux/fs.h>
- #include <asm/uaccess.h>
- #include "fm_typedef.h"
- #include "fm_dbg.h"
- #include "fm_err.h"
- /*
- * fm_file_exist - test file
- * @filename - source file name
- * If exsit, return 0, else error code
- */
- fm_s32 fm_file_exist(const fm_s8 *filename)
- {
- fm_s32 ret = 0;
- mm_segment_t old_fs;
- struct file *fp = NULL;
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- fp = filp_open(filename, O_RDONLY, 0);
- if (IS_ERR(fp)) {
- WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
- set_fs(old_fs);
- return -FM_EPATCH;
- }
- WCN_DBG(FM_DBG | CHIP, "open \"%s\" ok\n", filename);
- if (fp)
- filp_close(fp, NULL);
- set_fs(old_fs);
- return ret;
- }
- /*
- * fm_file_read - read FM DSP patch/coeff/hwcoeff/rom binary file
- * @filename - source file name
- * @dst - target buffer
- * @len - desired read length
- * @position - the read position
- * If success, return read length in bytes, else error code
- */
- fm_s32 fm_file_read(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 position)
- {
- fm_s32 ret = 0;
- loff_t pos = position;
- mm_segment_t old_fs;
- struct file *fp = NULL;
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- fp = filp_open(filename, O_RDONLY, 0);
- if ((!fp) || IS_ERR(fp)) {
- WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
- set_fs(old_fs);
- return -FM_EPATCH;
- }
- ret = vfs_read(fp, (char __user *)dst, len, &pos);
- if (ret < 0)
- WCN_DBG(FM_ERR | CHIP, "read \"%s\" failed\n", filename);
- else if (ret < len)
- WCN_DBG(FM_DBG | CHIP, "read \"%s\" part data\n", filename);
- else
- WCN_DBG(FM_DBG | CHIP, "read \"%s\" full data\n", filename);
- if (fp)
- filp_close(fp, NULL);
- set_fs(old_fs);
- return ret;
- }
- fm_s32 fm_file_write(const fm_s8 *filename, fm_u8 *dst, fm_s32 len, fm_s32 *ppos)
- {
- fm_s32 ret = 0;
- loff_t pos = *ppos;
- mm_segment_t old_fs;
- struct file *fp = NULL;
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- fp = filp_open(filename, O_CREAT | O_RDWR, 0);
- if ((!fp) || IS_ERR(fp)) {
- WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
- set_fs(old_fs);
- return -FM_EPATCH;
- }
- WCN_DBG(FM_DBG | CHIP, "open \"%s\" ok\n", filename);
- WCN_DBG(FM_DBG | CHIP, "\"%s\" old pos %d\n", filename, (int)pos);
- ret = vfs_write(fp, (char __user *)dst, len, &pos);
- WCN_DBG(FM_DBG | CHIP, "\"%s\" new pos %d\n", filename, (int)pos);
- *ppos = pos;
- if (ret < 0)
- WCN_DBG(FM_ERR | CHIP, "write \"%s\" failed\n", filename);
- else if (ret < len)
- WCN_DBG(FM_DBG | CHIP, "write \"%s\" data\n", filename);
- if (fp)
- filp_close(fp, NULL);
- set_fs(old_fs);
- return ret;
- }
|