1 /* 2 * Copyright (c) 2018 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 qdf_err("Failed to allocate file buffer of %zuB", fw->size + 1); 45 release_firmware(fw); 46 return QDF_STATUS_E_NOMEM; 47 } 48 49 qdf_mem_copy(buf, fw->data, fw->size); 50 release_firmware(fw); 51 *out_buf = buf; 52 53 return QDF_STATUS_SUCCESS; 54 } 55 qdf_export_symbol(qdf_file_read); 56 57 void qdf_file_buf_free(char *file_buf) 58 { 59 QDF_BUG(file_buf); 60 if (!file_buf) 61 return; 62 63 qdf_mem_free(file_buf); 64 } 65 qdf_export_symbol(qdf_file_buf_free); 66 67