From aca02352ec31bc07e2f74834de4e576c41bd28f9 Mon Sep 17 00:00:00 2001 From: Debasis Das Date: Fri, 31 Jul 2020 16:33:00 +0530 Subject: [PATCH] qcacmn: Add non-inline OS-abstraction APIs Use non-inline OS-abstraction APIs to avoid OS APIs usage directly in driver. Add new non-inline OS-abstraction APIs. CRs-Fixed: 2742480 Change-Id: I177b41d69ca8f102fa67316d8901b6991dea3203 --- qal/inc/qal_bridge.h | 94 ++++++++++++++ qal/inc/qal_devnode.h | 96 ++++++++++++++ qal/linux/src/i_qal_bridge.h | 92 +++++++++++++ qal/linux/src/i_qal_devnode.h | 112 ++++++++++++++++ qdf/Kbuild | 7 + qdf/inc/qdf_irq.h | 52 ++++++++ qdf/linux/src/i_qdf_irq.h | 52 ++++++++ qdf/linux/src/qdf_hrtimer.c | 103 +++++++++++++++ qdf/linux/src/qdf_time.c | 236 ++++++++++++++++++++++++++++++++++ 9 files changed, 844 insertions(+) create mode 100644 qal/inc/qal_bridge.h create mode 100644 qal/inc/qal_devnode.h create mode 100644 qal/linux/src/i_qal_bridge.h create mode 100644 qal/linux/src/i_qal_devnode.h create mode 100644 qdf/inc/qdf_irq.h create mode 100644 qdf/linux/src/i_qdf_irq.h create mode 100644 qdf/linux/src/qdf_hrtimer.c create mode 100644 qdf/linux/src/qdf_time.c diff --git a/qal/inc/qal_bridge.h b/qal/inc/qal_bridge.h new file mode 100644 index 0000000000..1eaa7fb90c --- /dev/null +++ b/qal/inc/qal_bridge.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2021 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: qal_bridge + * QCA driver framework for bridge related APIs prototype + */ + +#ifndef __QAL_BRIDGE_H +#define __QAL_BRIDGE_H + +/* Include Files */ +#include "qdf_types.h" +#include "i_qal_bridge.h" + +typedef __qal_notify_blk_t qal_notify_blk_t; +typedef __qal_netdev_t qal_netdev_t; +typedef __qal_br_fdb_entry_t qal_br_fdb_entry_t; + +#ifdef ENHANCED_OS_ABSTRACTION + +QDF_STATUS +qal_bridge_fdb_register_notify(qal_notify_blk_t nb); + +QDF_STATUS +qal_bridge_fdb_unregister_notify(qal_notify_blk_t nb); + +qal_br_fdb_entry_t +qal_bridge_fdb_has_entry(qal_netdev_t dev, const char *addr, uint16_t vid); + +QDF_STATUS +qal_bridge_fdb_delete_by_netdev(qal_netdev_t dev, + const unsigned char *addr, uint16_t vid); + +QDF_STATUS +qal_bridge_fdb_update_register_notify(qal_notify_blk_t nb); + +QDF_STATUS +qal_bridge_fdb_update_unregister_notify(qal_notify_blk_t nb); +#else +static inline QDF_STATUS +qal_bridge_fdb_register_notify(qal_notify_blk_t nb) +{ + return __qal_bridge_fdb_register_notify(nb); +} + +static inline QDF_STATUS +qal_bridge_fdb_unregister_notify(qal_notify_blk_t nb) +{ + return __qal_bridge_fdb_unregister_notify(nb); +} + +static inline qal_br_fdb_entry_t +qal_bridge_fdb_has_entry(qal_netdev_t dev, const char *addr, uint16_t vid) +{ + return __qal_bridge_fdb_has_entry(dev, addr, vid); +} + +static inline QDF_STATUS +qal_bridge_fdb_delete_by_netdev(qal_netdev_t dev, + const unsigned char *addr, uint16_t vid) +{ + return __qal_bridge_fdb_delete_by_netdev(dev, addr, vid); +} + +static inline QDF_STATUS +qal_bridge_fdb_update_register_notify(qal_notify_blk_t nb) +{ + return __qal_bridge_fdb_update_register_notify(nb); +} + +static inline QDF_STATUS +qal_bridge_fdb_update_unregister_notify(qal_notify_blk_t nb) +{ + return __qal_bridge_fdb_update_unregister_notify(nb); +} +#endif + +#endif /* __QAL_BRIDGE_H */ diff --git a/qal/inc/qal_devnode.h b/qal/inc/qal_devnode.h new file mode 100644 index 0000000000..8dd37d058e --- /dev/null +++ b/qal/inc/qal_devnode.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2021 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: qal_devnode + * QCA driver framework for device node related APIs prototype + */ + +#ifndef __QAL_DEVNODE_H +#define __QAL_DEVNODE_H + +/* Include Files */ +#include "qdf_types.h" +#include "qdf_trace.h" +#include "i_qal_devnode.h" + +#define PCI_DOMAIN_ID_MIN 0x0000 +#define PCI_DOMAIN_ID_MAX 0xFFFF + +typedef __qdf_devnode_t qdf_devnode_t; + +#ifdef ENHANCED_OS_ABSTRACTION + +/** + * qal_devnode_fetch_pci_domain_id() - This function will try to obtain the + * host bridge domain number + * @node: device tree node + * @domain_id: pointer to domain number + * + * Return: QDF_STATUS_SUCCESS if domain_id is in the range, error code otherwise + */ +QDF_STATUS +qal_devnode_fetch_pci_domain_id(qdf_devnode_t devnode, int *domain_id); + +/** + * qal_devnode_read_u32_array() - Find and read an array of 32 bit integers + * from a property. + * @devnode: device node from which the property value is to be read. + * @pname: name of the property to be searched. + * @u32_val: pointer to return value, modified only if return value is 0. + * @elem: number of array elements to read + * + * Return: QDF_STATUS_SUCCESS on success, error code + */ +QDF_STATUS +qal_devnode_read_u32_array(const qdf_devnode_t devnode, + const char *pname, uint32_t *u32_val, size_t elem); +/** + * qal_devnode_read_u32() - Find and read 32 bit integer from a property. + * @devnode: device node from which the property value is to be read. + * @pname: name of the property to be searched. + * @u32_val: pointer to return value, modified only if return value is 0. + * + * Return: QDF_STATUS_SUCCESS on success, error code + */ +QDF_STATUS +qal_devnode_read_u32(const qdf_devnode_t devnode, + const char *pname, uint32_t *u32_val); +#else +static inline QDF_STATUS +qal_devnode_fetch_pci_domain_id(qdf_devnode_t devnode, int *domain_id) +{ + return __qal_devnode_fetch_pci_domain_id(devnode, domain_id); +} + +static inline QDF_STATUS +qal_devnode_read_u32_array(const qdf_devnode_t devnode, + const char *pname, uint32_t *u32_val, size_t elem) +{ + return __qal_devnode_read_u32_array(devnode, pname, u32_val, elem); +} + +static inline QDF_STATUS +qal_devnode_read_u32(const qdf_devnode_t devnode, + const char *pname, uint32_t *u32_val) +{ + return __qal_devnode_read_u32(devnode, pname, u32_val); +} +#endif + +#endif /* __QAL_DEVNODE_H */ diff --git a/qal/linux/src/i_qal_bridge.h b/qal/linux/src/i_qal_bridge.h new file mode 100644 index 0000000000..2b365e95b1 --- /dev/null +++ b/qal/linux/src/i_qal_bridge.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2021 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: i_qal_bridge + * QCA abstraction layer (QAL) bridge APIs + */ + +#if !defined(__I_QAL_BRIDGE_H) +#define __I_QAL_BRIDGE_H + +/* Include Files */ +#include +#include "qdf_types.h" + +typedef struct notifier_block *__qal_notify_blk_t; +typedef struct net_device *__qal_netdev_t; +typedef struct net_bridge_fdb_entry *__qal_br_fdb_entry_t; + +static inline QDF_STATUS +__qal_bridge_fdb_register_notify(__qal_notify_blk_t nb) +{ + br_fdb_register_notify(nb); + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +__qal_bridge_fdb_unregister_notify(__qal_notify_blk_t nb) +{ + br_fdb_unregister_notify(nb); + return QDF_STATUS_SUCCESS; +} + +static inline __qal_br_fdb_entry_t +__qal_bridge_fdb_has_entry(__qal_netdev_t dev, const char *addr, uint16_t vid) +{ + return br_fdb_has_entry(dev, addr, vid); +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 24) +static inline QDF_STATUS +__qal_bridge_fdb_delete_by_netdev(__qal_netdev_t dev, + const unsigned char *addr, uint16_t vid) +{ + /* Use 5.4-specific API */ + qdf_info("Needs alternative implementation"); + + return QDF_STATUS_SUCCESS; +} +#else +static inline QDF_STATUS +__qal_bridge_fdb_delete_by_netdev(__qal_netdev_t dev, + const unsigned char *addr, uint16_t vid) +{ + int ret; + + ret = br_fdb_delete_by_netdev(dev, addr, vid); + + return qdf_status_from_os_return(ret); +} +#endif + +static inline QDF_STATUS +__qal_bridge_fdb_update_register_notify(__qal_notify_blk_t nb) +{ + br_fdb_update_register_notify(nb); + return QDF_STATUS_SUCCESS; +} + +static inline QDF_STATUS +__qal_bridge_fdb_update_unregister_notify(__qal_notify_blk_t nb) +{ + br_fdb_update_unregister_notify(nb); + return QDF_STATUS_SUCCESS; +} + +#endif /* __I_QAL_BRIDGE_H */ diff --git a/qal/linux/src/i_qal_devnode.h b/qal/linux/src/i_qal_devnode.h new file mode 100644 index 0000000000..f35823368f --- /dev/null +++ b/qal/linux/src/i_qal_devnode.h @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2021 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: qal_devnode + * QCA abstraction layer (QAL) device config APIs + */ + +#if !defined(__I_QAL_DEVNODE_H) +#define __I_QAL_DEVNODE_H + +/* Include Files */ +#include +#include +#include "qdf_types.h" + +#define PCI_DOMAIN_ID_MIN 0x0000 +#define PCI_DOMAIN_ID_MAX 0xFFFF + +typedef struct device_node *__qdf_devnode_t; + +/** + * __qal_devnode_fetch_pci_domain_id() - This function will try to obtain the + * host bridge domain number + * @node: device tree node + * @domain_id: pointer to domain number + * + * Return: QDF_STATUS_SUCCESS if domain_id is in the range, + * error code otherwise + */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 18, 0)) +static inline QDF_STATUS +__qal_devnode_fetch_pci_domain_id(__qdf_devnode_t devnode, int *domain_id) +{ + *domain_id = 0; + + return QDF_STATUS_SUCCESS; +} +#else +static inline QDF_STATUS +__qal_devnode_fetch_pci_domain_id(__qdf_devnode_t devnode, int *domain_id) +{ + int ret; + + ret = of_get_pci_domain_nr(devnode); + if ((ret >= PCI_DOMAIN_ID_MIN) && (ret <= PCI_DOMAIN_ID_MAX)) { + *domain_id = ret; + return QDF_STATUS_SUCCESS; + } + + return qdf_status_from_os_return(ret); +} +#endif + +/** + * __qal_devnode_read_u32_array() - Find and read an array of 32 bit integers + * from a property. + * @devnode: device node from which the property value is to be read. + * @pname: name of the property to be searched. + * @u32_val: pointer to return value, modified only if return value is 0. + * @elem: number of array elements to read + * + * Return: QDF_STATUS_SUCCESS if valid value can be decoded, + * error code otherwise + */ +static inline QDF_STATUS +__qal_devnode_read_u32_array(const __qdf_devnode_t devnode, + const char *pname, u32 *u32_val, size_t elem) +{ + int ret; + + ret = of_property_read_u32_array(devnode, pname, u32_val, elem); + + return qdf_status_from_os_return(ret); +} + +/** + * __qal_devnode_read_u32() - Find and read 32 bit integer from a property. + * @devnode: device node from which the property value is to be read. + * @pname: name of the property to be searched. + * @u32_val: pointer to return value, modified only if return value is 0. + * + * Return: QDF_STATUS_SUCCESS if valid value can be decoded, + * error code otherwise + */ +static inline QDF_STATUS +__qal_devnode_read_u32(const __qdf_devnode_t devnode, + const char *pname, u32 *u32_val) +{ + int ret; + + ret = of_property_read_u32(devnode, pname, u32_val); + + return qdf_status_from_os_return(ret); +} + +#endif /* __I_QAL_DEVNODE_H */ diff --git a/qdf/Kbuild b/qdf/Kbuild index edef66bbdc..509191ab37 100644 --- a/qdf/Kbuild +++ b/qdf/Kbuild @@ -67,6 +67,8 @@ $(HOST_CMN_CONVG_NLINK)/src/wlan_nlink_srv.o \ $(HOST_QAL_SRC)/linux/src/qal_devcfg.o \ $(HOST_QAL_SRC)/linux/src/qal_vbus_dev.o \ $(HOST_QAL_SRC)/linux/src/qal_notifier.o \ +$(HOST_QAL_SRC)/linux/src/qal_devnode.o \ +$(HOST_QAL_SRC)/linux/src/qal_bridge.o \ #linux/src/qdf_net.o \ #linux/src/qdf_net_event.o \ #linux/src/qdf_net_ioctl.o @@ -85,6 +87,11 @@ ifeq ($(WLAN_DEBUGFS),1) qdf-objs += linux/src/qdf_debugfs.o endif +ifeq ($(ENHANCED_OS_ABSTRACTION),1) +qdf-objs += linux/src/qdf_hrtimer.o +qdf-objs += linux/src/qdf_time.o +endif + ifeq ($(WLAN_STREAMFS),1) qdf-objs += linux/src/qdf_streamfs.o endif diff --git a/qdf/inc/qdf_irq.h b/qdf/inc/qdf_irq.h new file mode 100644 index 0000000000..77d5e36e70 --- /dev/null +++ b/qdf/inc/qdf_irq.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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: qdf_irq.h + * This file abstracts interrupt related API's. + */ + +#ifndef __QDF_IRQ_H +#define __QDF_IRQ_H + +#include "i_qdf_irq.h" + +#define QDF_IRQ_TYPE_NONE __QDF_IRQ_TYPE_NONE +#define QDF_IRQ_TYPE_EDGE_RISING __QDF_IRQ_TYPE_EDGE_RISING +#define QDF_IRQ_TYPE_EDGE_FALLING __QDF_IRQ_TYPE_EDGE_FALLING +#define QDF_IRQ_TYPE_EDGE_BOTH __QDF_IRQ_TYPE_EDGE_BOTH +#define QDF_IRQ_TYPE_LEVEL_HIGH __QDF_IRQ_TYPE_LEVEL_HIGH +#define QDF_IRQ_TYPE_LEVEL_LOW __QDF_IRQ_TYPE_LEVEL_LOW +#define QDF_IRQ_TYPE_LEVEL_MASK __QDF_IRQ_TYPE_LEVEL_MASK +#define QDF_IRQ_TYPE_SENSE_MASK __QDF_IRQ_TYPE_SENSE_MASK +#define QDF_IRQ_TYPE_DEFAULT __QDF_IRQ_TYPE_DEFAULT +#define QDF_IRQ_TYPE_PROBE __QDF_IRQ_TYPE_PROBE +#define QDF_IRQ_LEVEL __QDF_IRQ_LEVEL +#define QDF_IRQ_PER_CPU __QDF_IRQ_PER_CPU +#define QDF_IRQ_NOPROBE __QDF_IRQ_NOPROBE +#define QDF_IRQ_NOREQUEST __QDF_IRQ_NOREQUEST +#define QDF_IRQ_NOAUTOEN __QDF_IRQ_NOAUTOEN +#define QDF_IRQ_NO_BALANCING __QDF_IRQ_NO_BALANCING +#define QDF_IRQ_MOVE_PCNTXT __QDF_IRQ_MOVE_PCNTXT +#define QDF_IRQ_NESTED_THREAD __QDF_IRQ_NESTED_THREAD +#define QDF_IRQ_NOTHREAD __QDF_IRQ_NOTHREAD +#define QDF_IRQ_PER_CPU_DEVID __QDF_IRQ_PER_CPU_DEVID +#define QDF_IRQ_IS_POLLED __QDF_IRQ_IS_POLLED +#define QDF_IRQ_DISABLE_UNLAZY __QDF_IRQ_DISABLE_UNLAZY + +#endif /* __QDF_IRQ_H */ diff --git a/qdf/linux/src/i_qdf_irq.h b/qdf/linux/src/i_qdf_irq.h new file mode 100644 index 0000000000..7591d924c2 --- /dev/null +++ b/qdf/linux/src/i_qdf_irq.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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: i_qdf_irq.h + * This file provides OS dependent interrupt API's. + */ + +#ifndef _I_QDF_IRQ_H +#define _I_QDF_IRQ_H + +#include + +#define __QDF_IRQ_TYPE_NONE IRQ_TYPE_NONE +#define __QDF_IRQ_TYPE_EDGE_RISING IRQ_TYPE_EDGE_RISING +#define __QDF_IRQ_TYPE_EDGE_FALLING IRQ_TYPE_EDGE_FALLING +#define __QDF_IRQ_TYPE_EDGE_BOTH IRQ_TYPE_EDGE_BOTH +#define __QDF_IRQ_TYPE_LEVEL_HIGH IRQ_TYPE_LEVEL_HIGH +#define __QDF_IRQ_TYPE_LEVEL_LOW IRQ_TYPE_LEVEL_LOW +#define __QDF_IRQ_TYPE_LEVEL_MASK IRQ_TYPE_LEVEL_MASK +#define __QDF_IRQ_TYPE_SENSE_MASK IRQ_TYPE_SENSE_MASK +#define __QDF_IRQ_TYPE_DEFAULT IRQ_TYPE_DEFAULT +#define __QDF_IRQ_TYPE_PROBE IRQ_TYPE_PROBE +#define __QDF_IRQ_LEVEL IRQ_LEVEL +#define __QDF_IRQ_PER_CPU IRQ_PER_CPU +#define __QDF_IRQ_NOPROBE IRQ_NOPROBE +#define __QDF_IRQ_NOREQUEST IRQ_NOREQUEST +#define __QDF_IRQ_NOAUTOEN IRQ_NOAUTOEN +#define __QDF_IRQ_NO_BALANCING IRQ_NO_BALANCING +#define __QDF_IRQ_MOVE_PCNTXT IRQ_MOVE_PCNTXT +#define __QDF_IRQ_NESTED_THREAD IRQ_NESTED_THREAD +#define __QDF_IRQ_NOTHREAD IRQ_NOTHREAD +#define __QDF_IRQ_PER_CPU_DEVID IRQ_PER_CPU_DEVID +#define __QDF_IRQ_IS_POLLED IRQ_IS_POLLED +#define __QDF_IRQ_DISABLE_UNLAZY IRQ_DISABLE_UNLAZY + +#endif /* _I_QDF_IRQ_H */ diff --git a/qdf/linux/src/qdf_hrtimer.c b/qdf/linux/src/qdf_hrtimer.c new file mode 100644 index 0000000000..a859cc9a7f --- /dev/null +++ b/qdf/linux/src/qdf_hrtimer.c @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2021 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: qdf_hrtimer + * QCA driver framework (QDF) high resolution timers timer APIs + */ + +#include "i_qdf_hrtimer.h" +#include "qdf_hrtimer.h" +#include + +void qdf_hrtimer_start(qdf_hrtimer_data_t *timer, qdf_ktime_t interval, + enum qdf_hrtimer_mode mode) +{ + __qdf_hrtimer_start(timer, interval, mode); +} + +qdf_export_symbol(qdf_hrtimer_start); + +int qdf_hrtimer_cancel(qdf_hrtimer_data_t *timer) +{ + return __qdf_hrtimer_cancel(timer); +} + +qdf_export_symbol(qdf_hrtimer_cancel); + +void qdf_hrtimer_init(qdf_hrtimer_data_t *timer, + qdf_hrtimer_func_t callback, + enum qdf_clock_id clock, + enum qdf_hrtimer_mode mode, + enum qdf_context_mode ctx) +{ + __qdf_hrtimer_init(timer, callback, clock, mode, ctx); +} + +qdf_export_symbol(qdf_hrtimer_init); + +void qdf_hrtimer_kill(qdf_hrtimer_data_t *timer) +{ + __qdf_hrtimer_kill(timer); +} + +qdf_export_symbol(qdf_hrtimer_kill); + +qdf_ktime_t qdf_hrtimer_get_remaining(qdf_hrtimer_data_t *timer) +{ + return __qdf_hrtimer_get_remaining(timer); +} + +qdf_export_symbol(qdf_hrtimer_get_remaining); + +bool qdf_hrtimer_is_queued(qdf_hrtimer_data_t *timer) +{ + return __qdf_hrtimer_is_queued(timer); +} + +qdf_export_symbol(qdf_hrtimer_is_queued); + +bool qdf_hrtimer_callback_running(qdf_hrtimer_data_t *timer) +{ + return __qdf_hrtimer_callback_running(timer); +} + +qdf_export_symbol(qdf_hrtimer_callback_running); + +bool qdf_hrtimer_active(qdf_hrtimer_data_t *timer) +{ + return __qdf_hrtimer_active(timer); +} + +qdf_export_symbol(qdf_hrtimer_active); + +qdf_ktime_t qdf_hrtimer_cb_get_time(qdf_hrtimer_data_t *timer) +{ + return __qdf_hrtimer_cb_get_time(timer); +} + +qdf_export_symbol(qdf_hrtimer_cb_get_time); + +uint64_t qdf_hrtimer_forward(qdf_hrtimer_data_t *timer, + qdf_ktime_t now, + qdf_ktime_t interval) +{ + return __qdf_hrtimer_forward(timer, now, interval); +} + +qdf_export_symbol(qdf_hrtimer_forward); diff --git a/qdf/linux/src/qdf_time.c b/qdf/linux/src/qdf_time.c new file mode 100644 index 0000000000..6ba3dd0914 --- /dev/null +++ b/qdf/linux/src/qdf_time.c @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2021 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: qdf_time + * QCA driver framework (QDF) timer APIs + */ + +#include +#include "qdf_time.h" +#include + +qdf_ktime_t qdf_ns_to_ktime(uint64_t ns) +{ + return __qdf_ns_to_ktime(ns); +} + +qdf_export_symbol(qdf_ns_to_ktime); + +qdf_ktime_t qdf_ktime_add(qdf_ktime_t ktime1, qdf_ktime_t ktime2) +{ + return __qdf_ktime_add(ktime1, ktime2); +} + +qdf_export_symbol(qdf_ktime_add); + +qdf_ktime_t qdf_ktime_get(void) +{ + return __qdf_ktime_get(); +} + +qdf_export_symbol(qdf_ktime_get); + +qdf_ktime_t qdf_ktime_real_get(void) +{ + return __qdf_ktime_real_get(); +} + +qdf_export_symbol(qdf_ktime_real_get); + +qdf_ktime_t qdf_ktime_add_ns(qdf_ktime_t ktime, int64_t ns) +{ + return __qdf_ktime_add_ns(ktime, ns); +} + +qdf_export_symbol(qdf_ktime_add_ns); + +int64_t qdf_ktime_to_ms(qdf_ktime_t ktime) +{ + return __qdf_ktime_to_ms(ktime); +} + +qdf_export_symbol(qdf_ktime_to_ms); + +int64_t qdf_ktime_to_ns(qdf_ktime_t ktime) +{ + return __qdf_ktime_to_ns(ktime); +} + +qdf_export_symbol(qdf_ktime_to_ns); + +qdf_time_t qdf_system_ticks(void) +{ + return __qdf_system_ticks(); +} + +qdf_export_symbol(qdf_system_ticks); + +uint32_t qdf_system_ticks_to_msecs(unsigned long clock_ticks) +{ + return __qdf_system_ticks_to_msecs(clock_ticks); +} + +qdf_export_symbol(qdf_system_ticks_to_msecs); + +qdf_time_t qdf_system_msecs_to_ticks(uint32_t msecs) +{ + return __qdf_system_msecs_to_ticks(msecs); +} + +qdf_export_symbol(qdf_system_msecs_to_ticks); + +qdf_time_t qdf_get_system_uptime(void) +{ + return __qdf_get_system_uptime(); +} + +qdf_export_symbol(qdf_get_system_uptime); + +uint64_t qdf_get_bootbased_boottime_ns(void) +{ + return __qdf_get_bootbased_boottime_ns(); +} + +qdf_export_symbol(qdf_get_bootbased_boottime_ns); + +unsigned long qdf_get_system_timestamp(void) +{ + return __qdf_get_system_timestamp(); +} + +qdf_export_symbol(qdf_get_system_timestamp); + +void qdf_udelay(int usecs) +{ + __qdf_udelay(usecs); +} + +qdf_export_symbol(qdf_udelay); + +void qdf_mdelay(int msecs) +{ + __qdf_mdelay(msecs); +} + +qdf_export_symbol(qdf_mdelay); + +bool qdf_system_time_after(qdf_time_t a, qdf_time_t b) +{ + return __qdf_system_time_after(a, b); +} + +qdf_export_symbol(qdf_system_time_after); + +bool qdf_system_time_before(qdf_time_t a, qdf_time_t b) +{ + return __qdf_system_time_before(a, b); +} + +qdf_export_symbol(qdf_system_time_before); + +bool qdf_system_time_after_eq(qdf_time_t a, qdf_time_t b) +{ + return __qdf_system_time_after_eq(a, b); +} + +qdf_export_symbol(qdf_system_time_after_eq); + +#ifdef MSM_PLATFORM +uint64_t qdf_log_timestamp_to_usecs(uint64_t time) +{ + /* + * Try to preserve precision by multiplying by 10 first. + * If that would cause a wrap around, divide first instead. + */ + if (time * 10 < time) { + do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US); + return time * 10; + } + + time = time * 10; + do_div(time, QDF_LOG_TIMESTAMP_CYCLES_PER_10_US); + + return time; +} + +qdf_export_symbol(qdf_log_timestamp_to_usecs); +#else +uint64_t qdf_log_timestamp_to_usecs(uint64_t time) +{ + /* timestamps are already in micro seconds */ + return time; +} + +qdf_export_symbol(qdf_log_timestamp_to_usecs); +#endif /* end of MSM_PLATFORM */ + +void qdf_log_timestamp_to_secs(uint64_t time, uint64_t *secs, + uint64_t *usecs) +{ + *secs = qdf_log_timestamp_to_usecs(time); + *usecs = do_div(*secs, 1000000ul); +} + +qdf_export_symbol(qdf_log_timestamp_to_secs); + +uint64_t qdf_usecs_to_log_timestamp(uint64_t usecs) +{ + uint64_t ts; + + ts = (usecs * QDF_LOG_TIMESTAMP_CYCLES_PER_10_US); + + return do_div(ts, 10ul); +} + +qdf_export_symbol(qdf_usecs_to_log_timestamp); + +uint64_t qdf_get_log_timestamp(void) +{ + return __qdf_get_log_timestamp(); +} + +qdf_export_symbol(qdf_get_log_timestamp); + +uint64_t qdf_get_log_timestamp_usecs(void) +{ + return qdf_log_timestamp_to_usecs(qdf_get_log_timestamp()); +} + +qdf_export_symbol(qdf_get_log_timestamp_usecs); + +uint64_t qdf_get_monotonic_boottime(void) +{ + return __qdf_get_monotonic_boottime(); +} + +qdf_export_symbol(qdf_get_monotonic_boottime); + +void qdf_time_ktime_get_real_time(qdf_timespec_t *ts) +{ + return __qdf_time_ktime_get_real_time(ts); +} + +qdf_export_symbol(qdf_time_ktime_get_real_time); + +unsigned long long qdf_time_sched_clock(void) +{ + return __qdf_time_sched_clock(); +} + +qdf_export_symbol(qdf_time_sched_clock);