/* * Copyright (c) 2011-2020 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /** * DOC: wlan_hdd_sysfs_wlan_dbg.c * * Implementation for creating sysfs file wlan_dbg */ #include #include "osif_psoc_sync.h" #include #include static ssize_t __hdd_sysfs_wlan_dbg_store(struct hdd_context *hdd_ctx, struct kobj_attribute *attr, const char *buf, size_t count) { char buf_local[MAX_SYSFS_USER_COMMAND_SIZE_LENGTH + 1]; char *sptr, *token; uint32_t val1, val2, val3; int ret; if (!wlan_hdd_validate_modules_state(hdd_ctx)) return -EINVAL; ret = hdd_sysfs_validate_and_copy_buf(buf_local, sizeof(buf_local), buf, count); if (ret) { hdd_err_rl("invalid input"); return ret; } sptr = buf_local; hdd_debug("set_wlan_dbg: count %zu buf_local:(%s)", count, buf_local); /* Get val1 */ token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou32(token, 0, &val1)) return -EINVAL; /* Get val2 */ token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou32(token, 0, &val2)) return -EINVAL; /* Get val3 */ token = strsep(&sptr, " "); if (!token) return -EINVAL; if (kstrtou32(token, 0, &val3)) return -EINVAL; qdf_print_set_category_verbose(qdf_get_pidx(), val1, val2, val3); return count; } static ssize_t hdd_sysfs_wlan_dbg_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count) { struct osif_psoc_sync *psoc_sync; struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); ssize_t errno_size; int ret; ret = wlan_hdd_validate_context(hdd_ctx); if (ret) return ret; errno_size = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), &psoc_sync); if (errno_size) return errno_size; errno_size = __hdd_sysfs_wlan_dbg_store(hdd_ctx, attr, buf, count); osif_psoc_sync_op_stop(psoc_sync); return errno_size; } static struct kobj_attribute set_wlan_dbg_attribute = __ATTR(wlan_dbg, 0220, NULL, hdd_sysfs_wlan_dbg_store); int hdd_sysfs_wlan_dbg_create(struct kobject *driver_kobject) { int error; if (!driver_kobject) { hdd_err("could not get driver kobject!"); return -EINVAL; } error = sysfs_create_file(driver_kobject, &set_wlan_dbg_attribute.attr); if (error) hdd_err("could not create wlan_dbg sysfs file"); return error; } void hdd_sysfs_wlan_dbg_destroy(struct kobject *driver_kobject) { if (!driver_kobject) { hdd_err("could not get driver kobject!"); return; } sysfs_remove_file(driver_kobject, &set_wlan_dbg_attribute.attr); }