1 /* 2 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <linux/firmware.h> 20 #include "qdf_file.h" 21 #include "qdf_mem.h" 22 #include "qdf_module.h" 23 #include "qdf_status.h" 24 #include "qdf_trace.h" 25 #include "qdf_types.h" 26 27 QDF_STATUS qdf_file_read(const char *path, char **out_buf) 28 { 29 int errno; 30 const struct firmware *fw; 31 char *buf; 32 33 *out_buf = NULL; 34 35 errno = request_firmware(&fw, path, NULL); 36 if (errno) { 37 qdf_err("Failed to read file %s", path); 38 return QDF_STATUS_E_FAILURE; 39 } 40 41 /* qdf_mem_malloc zeros new memory; +1 size ensures null-termination */ 42 buf = qdf_mem_malloc(fw->size + 1); 43 if (!buf) { 44 release_firmware(fw); 45 return QDF_STATUS_E_NOMEM; 46 } 47 48 qdf_mem_copy(buf, fw->data, fw->size); 49 release_firmware(fw); 50 *out_buf = buf; 51 52 return QDF_STATUS_SUCCESS; 53 } 54 qdf_export_symbol(qdf_file_read); 55 56 void qdf_file_buf_free(char *file_buf) 57 { 58 QDF_BUG(file_buf); 59 if (!file_buf) 60 return; 61 62 qdf_mem_free(file_buf); 63 } 64 qdf_export_symbol(qdf_file_buf_free); 65 66