123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119 |
- From: Sebastian Gottschall <[email protected]>
- Adds LED and GPIO Control support for 988x, 9887, 9888, 99x0, 9984 based
- chipsets with on chipset connected led's using WMI Firmware API. The LED
- device will get available named as "ath10k-phyX" at sysfs and can be controlled
- with various triggers. adds also debugfs interface for gpio control.
- This patch is specific for OpenWRt base, as is use old backported package
- with old wireless source. Support for QCA9984 is removed.
- Reworked to use ath10k-ct custom source
- Signed-off-by: Sebastian Gottschall <[email protected]>
- Reviewed-by: Steve deRosier <[email protected]>
- [kvalo: major reorg and cleanup]
- Signed-off-by: Kalle Valo <[email protected]>
- Signed-off-by: Ansuel Smith <[email protected]>
- ---
- v13:
- * only compile tested!
- * fix all checkpatch warnings
- * fix commit log
- * sizeof(struct ath10k_gpiocontrol) -> sizeof(*gpio)
- * unsigned -> unsigned int
- * remove GPIOLIB code, that should be added in a separate patch
- * rename gpio.c to leds.c
- * add leds.h
- * rename some functions:
- ath10k_attach_led() -> ath10k_leds_register()
- ath10k_unregister_led() -> ath10k_leds_unregister()
- ath10k_reset_led_pin() -> ath10k_leds_start()
- * call ath10k_leds_unregister() before ath10k_thermal_unregister() to preserve ordering
- * call ath10k_leds_start() only from ath10k_core_start() and not from mac.c
- * rename struct ath10k_gpiocontrol as anonymous function under struct
- ath10k::leds, no need for memory allocation
- * merge ath10k_add_led() to ath10k_attach_led(), which is it's only caller
- * remove #if IS_ENABLED() checks from most of places, memory savings from those were not worth it
- * Kconfig help text improvement and move it lower in the menu, also don't enable it by default
- * switch to set_brightness_blocking() so that the callback can sleep,
- then no need to use ath10k_wmi_cmd_send_nowait() and can take mutex
- to access ar->state
- * don't touch ath10k_wmi_pdev_get_temperature()
- * as QCA6174/QCA9377 are not (yet) supported don't add the command to WMI-TLV interface
- * remove debugfs interface, that should be added in another patch
- * cleanup includes
- ath10k-4.16/Kconfig | 10 +++
- ath10k-4.16/Makefile | 1 +
- ath10k-4.16/core.c | 22 +++++++
- ath10k-4.16/core.h | 9 ++-
- ath10k-4.16/hw.h | 1 +
- ath10k-4.16/leds.c | 103 ++++++++++++++++++++++++++++++
- ath10k-4.16/leds.h | 45 +++++++++++++
- ath10k-4.16/mac.c | 1 +
- ath10k-4.16/wmi-ops.h | 32 ++++++++++
- ath10k-4.16/wmi-tlv.c | 2 +
- ath10k-4.16/wmi.c | 54 ++++++++++++++++
- ath10k-4.16/wmi.h | 35 ++++++++++
- 12 files changed, 314 insertions(+), 1 deletion(-)
- create mode 100644 ath10k-4.16/leds.c
- create mode 100644 ath10k-4.16/leds.h
- --- a/ath10k-4.16/Kconfig
- +++ b/ath10k-4.16/Kconfig
- @@ -60,6 +60,16 @@ config ATH10K_SPECTRAL
- ---help---
- Say Y to enable access to the FFT/spectral data via debugfs.
-
- +config ATH10K_LEDS
- + bool "Atheros ath10k LED support"
- + depends on ATH10K
- + select MAC80211_LEDS
- + select LEDS_CLASS
- + select NEW_LEDS
- + default y
- + ---help---
- + This option is necessary, if you want LED support for chipset connected led pins. If unsure, say N.
- +
- config ATH10K_TRACING
- bool "Atheros ath10k tracing support"
- depends on ATH10K
- --- a/ath10k-4.16/Makefile
- +++ b/ath10k-4.16/Makefile
- @@ -19,6 +19,7 @@ ath10k_core-$(CONFIG_ATH10K_SPECTRAL) +=
- ath10k_core-$(CONFIG_NL80211_TESTMODE) += testmode.o
- ath10k_core-$(CONFIG_ATH10K_TRACING) += trace.o
- ath10k_core-$(CONFIG_THERMAL) += thermal.o
- +ath10k_core-$(CONFIG_ATH10K_LEDS) += leds.o
- ath10k_core-$(CONFIG_MAC80211_DEBUGFS) += debugfs_sta.o
- ath10k_core-$(CONFIG_PM) += wow.o
- ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
- --- a/ath10k-4.16/core.c
- +++ b/ath10k-4.16/core.c
- @@ -34,6 +34,7 @@
- #include "testmode.h"
- #include "wmi-ops.h"
- #include "coredump.h"
- +#include "leds.h"
-
- /* Disable ath10k-ct DBGLOG output by default */
- unsigned int ath10k_debug_mask = ATH10K_DBG_NO_DBGLOG;
- @@ -73,6 +74,7 @@ static const struct ath10k_hw_params ath
- .id = QCA988X_HW_2_0_VERSION,
- .dev_id = QCA988X_2_0_DEVICE_ID,
- .name = "qca988x hw2.0",
- + .led_pin = 1,
- .patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
- @@ -131,6 +133,7 @@ static const struct ath10k_hw_params ath
- .id = QCA9887_HW_1_0_VERSION,
- .dev_id = QCA9887_1_0_DEVICE_ID,
- .name = "qca9887 hw1.0",
- + .led_pin = 1,
- .patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
- @@ -275,6 +278,7 @@ static const struct ath10k_hw_params ath
- .id = QCA99X0_HW_2_0_DEV_VERSION,
- .dev_id = QCA99X0_2_0_DEVICE_ID,
- .name = "qca99x0 hw2.0",
- + .led_pin = 17,
- .patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .otp_exe_param = 0x00000700,
- @@ -309,6 +313,7 @@ static const struct ath10k_hw_params ath
- .id = QCA9984_HW_1_0_DEV_VERSION,
- .dev_id = QCA9984_1_0_DEVICE_ID,
- .name = "qca9984/qca9994 hw1.0",
- + .led_pin = 17,
- .patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
- @@ -348,6 +353,7 @@ static const struct ath10k_hw_params ath
- .id = QCA9888_HW_2_0_DEV_VERSION,
- .dev_id = QCA9888_2_0_DEVICE_ID,
- .name = "qca9888 hw2.0",
- + .led_pin = 17,
- .patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
- @@ -3042,6 +3048,10 @@ int ath10k_core_start(struct ath10k *ar,
- ar->eeprom_overrides.rc_txbf_probe);
- }
-
- + status = ath10k_leds_start(ar);
- + if (status)
- + goto err_hif_stop;
- +
- return 0;
-
- err_hif_stop:
- @@ -3288,9 +3298,18 @@ static void ath10k_core_register_work(st
- goto err_spectral_destroy;
- }
-
- + status = ath10k_leds_register(ar);
- + if (status) {
- + ath10k_err(ar, "could not register leds: %d\n",
- + status);
- + goto err_thermal_unregister;
- + }
- +
- set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags);
- return;
-
- +err_thermal_unregister:
- + ath10k_thermal_unregister(ar);
- err_spectral_destroy:
- ath10k_spectral_destroy(ar);
- err_debug_destroy:
- @@ -3348,6 +3367,8 @@ void ath10k_core_unregister(struct ath10
- if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
- return;
-
- + ath10k_leds_unregister(ar);
- +
- ath10k_thermal_unregister(ar);
- /* Stop spectral before unregistering from mac80211 to remove the
- * relayfs debugfs file cleanly. Otherwise the parent debugfs tree
- --- a/ath10k-4.16/core.h
- +++ b/ath10k-4.16/core.h
- @@ -24,6 +24,7 @@
- #include <linux/pci.h>
- #include <linux/uuid.h>
- #include <linux/time.h>
- +#include <linux/leds.h>
-
- #include "htt.h"
- #include "htc.h"
- @@ -1255,6 +1256,13 @@ struct ath10k {
- } testmode;
-
- struct {
- + struct gpio_led wifi_led;
- + struct led_classdev cdev;
- + char label[48];
- + u32 gpio_state_pin;
- + } leds;
- +
- + struct {
- /* protected by data_lock */
- u32 fw_crash_counter;
- u32 fw_warm_reset_counter;
- --- a/ath10k-4.16/hw.h
- +++ b/ath10k-4.16/hw.h
- @@ -499,6 +499,7 @@ struct ath10k_hw_params {
- const char *name;
- u32 patch_load_addr;
- int uart_pin;
- + int led_pin;
- u32 otp_exe_param;
-
- /* Type of hw cycle counter wraparound logic, for more info
- --- /dev/null
- +++ b/ath10k-4.16/leds.c
- @@ -0,0 +1,103 @@
- +/*
- + * Copyright (c) 2005-2011 Atheros Communications Inc.
- + * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
- + * Copyright (c) 2018 Sebastian Gottschall <[email protected]>
- + * Copyright (c) 2018, 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.
- + */
- +
- +#include <linux/leds.h>
- +
- +#include "core.h"
- +#include "wmi.h"
- +#include "wmi-ops.h"
- +
- +#include "leds.h"
- +
- +static int ath10k_leds_set_brightness_blocking(struct led_classdev *led_cdev,
- + enum led_brightness brightness)
- +{
- + struct ath10k *ar = container_of(led_cdev, struct ath10k,
- + leds.cdev);
- + struct gpio_led *led = &ar->leds.wifi_led;
- +
- + mutex_lock(&ar->conf_mutex);
- +
- + if (ar->state != ATH10K_STATE_ON)
- + goto out;
- +
- + ar->leds.gpio_state_pin = (brightness != LED_OFF) ^ led->active_low;
- + ath10k_wmi_gpio_output(ar, led->gpio, ar->leds.gpio_state_pin);
- +
- +out:
- + mutex_unlock(&ar->conf_mutex);
- +
- + return 0;
- +}
- +
- +int ath10k_leds_start(struct ath10k *ar)
- +{
- + if (ar->hw_params.led_pin == 0)
- + /* leds not supported */
- + return 0;
- +
- + /* under some circumstances, the gpio pin gets reconfigured
- + * to default state by the firmware, so we need to
- + * reconfigure it this behaviour has only ben seen on
- + * QCA9984 and QCA99XX devices so far
- + */
- + ath10k_wmi_gpio_config(ar, ar->hw_params.led_pin, 0,
- + WMI_GPIO_PULL_NONE, WMI_GPIO_INTTYPE_DISABLE);
- + ath10k_wmi_gpio_output(ar, ar->hw_params.led_pin, 1);
- +
- + return 0;
- +}
- +
- +int ath10k_leds_register(struct ath10k *ar)
- +{
- + int ret;
- +
- + if (ar->hw_params.led_pin == 0)
- + /* leds not supported */
- + return 0;
- +
- + snprintf(ar->leds.label, sizeof(ar->leds.label), "ath10k-%s",
- + wiphy_name(ar->hw->wiphy));
- + ar->leds.wifi_led.active_low = 1;
- + ar->leds.wifi_led.gpio = ar->hw_params.led_pin;
- + ar->leds.wifi_led.name = ar->leds.label;
- + ar->leds.wifi_led.default_state = LEDS_GPIO_DEFSTATE_KEEP;
- +
- + ar->leds.cdev.name = ar->leds.label;
- + ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking;
- +
- + /* FIXME: this assignment doesn't make sense as it's NULL, remove it? */
- + ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger;
- +
- + ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev);
- + if (ret)
- + return ret;
- +
- + return 0;
- +}
- +
- +void ath10k_leds_unregister(struct ath10k *ar)
- +{
- + if (ar->hw_params.led_pin == 0)
- + /* leds not supported */
- + return;
- +
- + led_classdev_unregister(&ar->leds.cdev);
- +}
- +
- --- /dev/null
- +++ b/ath10k-4.16/leds.h
- @@ -0,0 +1,41 @@
- +/*
- + * Copyright (c) 2018, 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.
- + */
- +#ifndef _LEDS_H_
- +#define _LEDS_H_
- +
- +#include "core.h"
- +
- +#ifdef CONFIG_ATH10K_LEDS
- +void ath10k_leds_unregister(struct ath10k *ar);
- +int ath10k_leds_start(struct ath10k *ar);
- +int ath10k_leds_register(struct ath10k *ar);
- +#else
- +static inline void ath10k_leds_unregister(struct ath10k *ar)
- +{
- +}
- +
- +static inline int ath10k_leds_start(struct ath10k *ar)
- +{
- + return 0;
- +}
- +
- +static inline int ath10k_leds_register(struct ath10k *ar)
- +{
- + return 0;
- +}
- +
- +#endif
- +#endif /* _LEDS_H_ */
- --- a/ath10k-4.16/mac.c
- +++ b/ath10k-4.16/mac.c
- @@ -33,6 +33,7 @@
- #include "wmi-tlv.h"
- #include "wmi-ops.h"
- #include "wow.h"
- +#include "leds.h"
-
- /*********/
- /* Rates */
- --- a/ath10k-4.16/wmi-ops.h
- +++ b/ath10k-4.16/wmi-ops.h
- @@ -199,6 +199,9 @@ struct wmi_ops {
- (struct ath10k *ar,
- enum wmi_bss_survey_req_type type);
- struct sk_buff *(*gen_echo)(struct ath10k *ar, u32 value);
- + struct sk_buff *(*gen_gpio_config)(struct ath10k *ar, u32 gpio_num,
- + u32 input, u32 pull_type, u32 intr_mode);
- + struct sk_buff *(*gen_gpio_output)(struct ath10k *ar, u32 gpio_num, u32 set);
- };
-
- int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
- @@ -983,6 +986,35 @@ ath10k_wmi_force_fw_hang(struct ath10k *
- return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
- }
-
- +static inline int ath10k_wmi_gpio_config(struct ath10k *ar, u32 gpio_num,
- + u32 input, u32 pull_type, u32 intr_mode)
- +{
- + struct sk_buff *skb;
- +
- + if (!ar->wmi.ops->gen_gpio_config)
- + return -EOPNOTSUPP;
- +
- + skb = ar->wmi.ops->gen_gpio_config(ar, gpio_num, input, pull_type, intr_mode);
- + if (IS_ERR(skb))
- + return PTR_ERR(skb);
- +
- + return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_config_cmdid);
- +}
- +
- +static inline int ath10k_wmi_gpio_output(struct ath10k *ar, u32 gpio_num, u32 set)
- +{
- + struct sk_buff *skb;
- +
- + if (!ar->wmi.ops->gen_gpio_config)
- + return -EOPNOTSUPP;
- +
- + skb = ar->wmi.ops->gen_gpio_output(ar, gpio_num, set);
- + if (IS_ERR(skb))
- + return PTR_ERR(skb);
- +
- + return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_output_cmdid);
- +}
- +
- static inline int
- ath10k_wmi_dbglog_cfg(struct ath10k *ar, u64 module_enable, u32 log_level)
- {
- --- a/ath10k-4.16/wmi-tlv.c
- +++ b/ath10k-4.16/wmi-tlv.c
- @@ -3729,6 +3729,8 @@ static const struct wmi_ops wmi_tlv_ops
- .gen_echo = ath10k_wmi_tlv_op_gen_echo,
- .gen_vdev_spectral_conf = ath10k_wmi_tlv_op_gen_vdev_spectral_conf,
- .gen_vdev_spectral_enable = ath10k_wmi_tlv_op_gen_vdev_spectral_enable,
- + /* .gen_gpio_config not implemented */
- + /* .gen_gpio_output not implemented */
- };
-
- static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = {
- --- a/ath10k-4.16/wmi.c
- +++ b/ath10k-4.16/wmi.c
- @@ -7405,6 +7405,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
- return skb;
- }
-
- +static struct sk_buff *ath10k_wmi_op_gen_gpio_config(struct ath10k *ar,
- + u32 gpio_num, u32 input,
- + u32 pull_type, u32 intr_mode)
- +{
- + struct wmi_gpio_config_cmd *cmd;
- + struct sk_buff *skb;
- +
- + skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
- + if (!skb)
- + return ERR_PTR(-ENOMEM);
- +
- + cmd = (struct wmi_gpio_config_cmd *)skb->data;
- + cmd->pull_type = __cpu_to_le32(pull_type);
- + cmd->gpio_num = __cpu_to_le32(gpio_num);
- + cmd->input = __cpu_to_le32(input);
- + cmd->intr_mode = __cpu_to_le32(intr_mode);
- +
- + ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_config gpio_num 0x%08x input 0x%08x pull_type 0x%08x intr_mode 0x%08x\n",
- + gpio_num, input, pull_type, intr_mode);
- +
- + return skb;
- +}
- +
- +static struct sk_buff *ath10k_wmi_op_gen_gpio_output(struct ath10k *ar,
- + u32 gpio_num, u32 set)
- +{
- + struct wmi_gpio_output_cmd *cmd;
- + struct sk_buff *skb;
- +
- + skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
- + if (!skb)
- + return ERR_PTR(-ENOMEM);
- +
- + cmd = (struct wmi_gpio_output_cmd *)skb->data;
- + cmd->gpio_num = __cpu_to_le32(gpio_num);
- + cmd->set = __cpu_to_le32(set);
- +
- + ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_output gpio_num 0x%08x set 0x%08x\n",
- + gpio_num, set);
- +
- + return skb;
- +}
- +
- static struct sk_buff *
- ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
- enum wmi_sta_ps_mode psmode)
- @@ -9020,6 +9063,9 @@ static const struct wmi_ops wmi_ops = {
- .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
- .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
- .gen_echo = ath10k_wmi_op_gen_echo,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- +
- /* .gen_bcn_tmpl not implemented */
- /* .gen_prb_tmpl not implemented */
- /* .gen_p2p_go_bcn_ie not implemented */
- @@ -9090,6 +9136,8 @@ static const struct wmi_ops wmi_10_1_ops
- .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
- .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
- .gen_echo = ath10k_wmi_op_gen_echo,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- /* .gen_bcn_tmpl not implemented */
- /* .gen_prb_tmpl not implemented */
- /* .gen_p2p_go_bcn_ie not implemented */
- @@ -9167,6 +9215,8 @@ static const struct wmi_ops wmi_10_2_ops
- .gen_delba_send = ath10k_wmi_op_gen_delba_send,
- .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
- .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- /* .gen_pdev_enable_adaptive_cca not implemented */
- };
-
- @@ -9237,6 +9287,8 @@ static const struct wmi_ops wmi_10_2_4_o
- .gen_pdev_enable_adaptive_cca =
- ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
- .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- /* .gen_bcn_tmpl not implemented */
- /* .gen_prb_tmpl not implemented */
- /* .gen_p2p_go_bcn_ie not implemented */
- @@ -9313,6 +9365,8 @@ static const struct wmi_ops wmi_10_4_ops
- .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
- .gen_echo = ath10k_wmi_op_gen_echo,
- .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- };
-
- int ath10k_wmi_attach(struct ath10k *ar)
- --- a/ath10k-4.16/wmi.h
- +++ b/ath10k-4.16/wmi.h
- @@ -3011,6 +3011,41 @@ enum wmi_10_4_feature_mask {
-
- };
-
- +/* WMI_GPIO_CONFIG_CMDID */
- +enum {
- + WMI_GPIO_PULL_NONE,
- + WMI_GPIO_PULL_UP,
- + WMI_GPIO_PULL_DOWN,
- +};
- +
- +enum {
- + WMI_GPIO_INTTYPE_DISABLE,
- + WMI_GPIO_INTTYPE_RISING_EDGE,
- + WMI_GPIO_INTTYPE_FALLING_EDGE,
- + WMI_GPIO_INTTYPE_BOTH_EDGE,
- + WMI_GPIO_INTTYPE_LEVEL_LOW,
- + WMI_GPIO_INTTYPE_LEVEL_HIGH
- +};
- +
- +/* WMI_GPIO_CONFIG_CMDID */
- +struct wmi_gpio_config_cmd {
- + __le32 gpio_num; /* GPIO number to be setup */
- + __le32 input; /* 0 - Output/ 1 - Input */
- + __le32 pull_type; /* Pull type defined above */
- + __le32 intr_mode; /* Interrupt mode defined above (Input) */
- +} __packed;
- +
- +/* WMI_GPIO_OUTPUT_CMDID */
- +struct wmi_gpio_output_cmd {
- + __le32 gpio_num; /* GPIO number to be setup */
- + __le32 set; /* Set the GPIO pin*/
- +} __packed;
- +
- +/* WMI_GPIO_INPUT_EVENTID */
- +struct wmi_gpio_input_event {
- + __le32 gpio_num; /* GPIO number which changed state */
- +} __packed;
- +
- struct wmi_ext_resource_config_10_4_cmd {
- /* contains enum wmi_host_platform_type */
- __le32 host_platform_config;
- --- a/ath10k-4.19/Kconfig
- +++ b/ath10k-4.19/Kconfig
- @@ -64,6 +64,16 @@ config ATH10K_DEBUGFS
-
- If unsure, say Y to make it easier to debug problems.
-
- +config ATH10K_LEDS
- + bool "Atheros ath10k LED support"
- + depends on ATH10K
- + select MAC80211_LEDS
- + select LEDS_CLASS
- + select NEW_LEDS
- + default y
- + ---help---
- + This option is necessary, if you want LED support for chipset connected led pins. If unsure, say N.
- +
- config ATH10K_SPECTRAL
- bool "Atheros ath10k spectral scan support"
- depends on ATH10K_DEBUGFS
- --- a/ath10k-4.19/Makefile
- +++ b/ath10k-4.19/Makefile
- @@ -19,6 +19,7 @@ ath10k_core-$(CONFIG_ATH10K_SPECTRAL) +=
- ath10k_core-$(CONFIG_NL80211_TESTMODE) += testmode.o
- ath10k_core-$(CONFIG_ATH10K_TRACING) += trace.o
- ath10k_core-$(CONFIG_THERMAL) += thermal.o
- +ath10k_core-$(CONFIG_ATH10K_LEDS) += leds.o
- ath10k_core-$(CONFIG_MAC80211_DEBUGFS) += debugfs_sta.o
- ath10k_core-$(CONFIG_PM) += wow.o
- ath10k_core-$(CONFIG_DEV_COREDUMP) += coredump.o
- --- a/ath10k-4.19/core.c
- +++ b/ath10k-4.19/core.c
- @@ -35,6 +35,7 @@
- #include "testmode.h"
- #include "wmi-ops.h"
- #include "coredump.h"
- +#include "leds.h"
-
- /* Disable ath10k-ct DBGLOG output by default */
- unsigned int ath10k_debug_mask = ATH10K_DBG_NO_DBGLOG;
- @@ -72,6 +73,7 @@ static const struct ath10k_hw_params ath
- .id = QCA988X_HW_2_0_VERSION,
- .dev_id = QCA988X_2_0_DEVICE_ID,
- .name = "qca988x hw2.0",
- + .led_pin = 1,
- .patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
- @@ -137,6 +139,7 @@ static const struct ath10k_hw_params ath
- .id = QCA9887_HW_1_0_VERSION,
- .dev_id = QCA9887_1_0_DEVICE_ID,
- .name = "qca9887 hw1.0",
- + .led_pin = 1,
- .patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
- @@ -301,6 +304,7 @@ static const struct ath10k_hw_params ath
- .id = QCA99X0_HW_2_0_DEV_VERSION,
- .dev_id = QCA99X0_2_0_DEVICE_ID,
- .name = "qca99x0 hw2.0",
- + .led_pin = 17,
- .patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .otp_exe_param = 0x00000700,
- @@ -339,6 +343,7 @@ static const struct ath10k_hw_params ath
- .id = QCA9984_HW_1_0_DEV_VERSION,
- .dev_id = QCA9984_1_0_DEVICE_ID,
- .name = "qca9984/qca9994 hw1.0",
- + .led_pin = 17,
- .patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
- @@ -382,6 +387,7 @@ static const struct ath10k_hw_params ath
- .id = QCA9888_HW_2_0_DEV_VERSION,
- .dev_id = QCA9888_2_0_DEVICE_ID,
- .name = "qca9888 hw2.0",
- + .led_pin = 17,
- .patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
- .uart_pin = 7,
- .cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
- @@ -3103,6 +3109,10 @@ int ath10k_core_start(struct ath10k *ar,
- ar->eeprom_overrides.rc_txbf_probe);
- }
-
- + status = ath10k_leds_start(ar);
- + if (status)
- + goto err_hif_stop;
- +
- return 0;
-
- err_hif_stop:
- @@ -3357,9 +3367,18 @@ static void ath10k_core_register_work(st
- goto err_spectral_destroy;
- }
-
- + status = ath10k_leds_register(ar);
- + if (status) {
- + ath10k_err(ar, "could not register leds: %d\n",
- + status);
- + goto err_thermal_unregister;
- + }
- +
- set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags);
- return;
-
- +err_thermal_unregister:
- + ath10k_thermal_unregister(ar);
- err_spectral_destroy:
- ath10k_spectral_destroy(ar);
- err_debug_destroy:
- @@ -3417,6 +3436,8 @@ void ath10k_core_unregister(struct ath10
- if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
- return;
-
- + ath10k_leds_unregister(ar);
- +
- ath10k_thermal_unregister(ar);
- /* Stop spectral before unregistering from mac80211 to remove the
- * relayfs debugfs file cleanly. Otherwise the parent debugfs tree
- --- a/ath10k-4.19/core.h
- +++ b/ath10k-4.19/core.h
- @@ -25,6 +25,7 @@
- #include <linux/pci.h>
- #include <linux/uuid.h>
- #include <linux/time.h>
- +#include <linux/leds.h>
-
- #include "htt.h"
- #include "htc.h"
- @@ -1113,7 +1114,6 @@ struct ath10k {
- u32 low_5ghz_chan;
- u32 high_5ghz_chan;
- bool ani_enabled;
- -
- bool p2p;
- bool ct_all_pkts_htt; /* CT firmware only: native-wifi for all pkts */
-
- @@ -1362,6 +1362,13 @@ struct ath10k {
- } testmode;
-
- struct {
- + struct gpio_led wifi_led;
- + struct led_classdev cdev;
- + char label[48];
- + u32 gpio_state_pin;
- + } leds;
- +
- + struct {
- /* protected by data_lock */
- u32 fw_crash_counter;
- u32 fw_warm_reset_counter;
- --- a/ath10k-4.19/hw.h
- +++ b/ath10k-4.19/hw.h
- @@ -508,6 +508,7 @@ struct ath10k_hw_params {
- const char *name;
- u32 patch_load_addr;
- int uart_pin;
- + int led_pin;
- u32 otp_exe_param;
-
- /* Type of hw cycle counter wraparound logic, for more info
- --- /dev/null
- +++ b/ath10k-4.19/leds.c
- @@ -0,0 +1,103 @@
- +/*
- + * Copyright (c) 2005-2011 Atheros Communications Inc.
- + * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
- + * Copyright (c) 2018 Sebastian Gottschall <[email protected]>
- + * Copyright (c) 2018, 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.
- + */
- +
- +#include <linux/leds.h>
- +
- +#include "core.h"
- +#include "wmi.h"
- +#include "wmi-ops.h"
- +
- +#include "leds.h"
- +
- +static int ath10k_leds_set_brightness_blocking(struct led_classdev *led_cdev,
- + enum led_brightness brightness)
- +{
- + struct ath10k *ar = container_of(led_cdev, struct ath10k,
- + leds.cdev);
- + struct gpio_led *led = &ar->leds.wifi_led;
- +
- + mutex_lock(&ar->conf_mutex);
- +
- + if (ar->state != ATH10K_STATE_ON)
- + goto out;
- +
- + ar->leds.gpio_state_pin = (brightness != LED_OFF) ^ led->active_low;
- + ath10k_wmi_gpio_output(ar, led->gpio, ar->leds.gpio_state_pin);
- +
- +out:
- + mutex_unlock(&ar->conf_mutex);
- +
- + return 0;
- +}
- +
- +int ath10k_leds_start(struct ath10k *ar)
- +{
- + if (ar->hw_params.led_pin == 0)
- + /* leds not supported */
- + return 0;
- +
- + /* under some circumstances, the gpio pin gets reconfigured
- + * to default state by the firmware, so we need to
- + * reconfigure it this behaviour has only ben seen on
- + * QCA9984 and QCA99XX devices so far
- + */
- + ath10k_wmi_gpio_config(ar, ar->hw_params.led_pin, 0,
- + WMI_GPIO_PULL_NONE, WMI_GPIO_INTTYPE_DISABLE);
- + ath10k_wmi_gpio_output(ar, ar->hw_params.led_pin, 1);
- +
- + return 0;
- +}
- +
- +int ath10k_leds_register(struct ath10k *ar)
- +{
- + int ret;
- +
- + if (ar->hw_params.led_pin == 0)
- + /* leds not supported */
- + return 0;
- +
- + snprintf(ar->leds.label, sizeof(ar->leds.label), "ath10k-%s",
- + wiphy_name(ar->hw->wiphy));
- + ar->leds.wifi_led.active_low = 1;
- + ar->leds.wifi_led.gpio = ar->hw_params.led_pin;
- + ar->leds.wifi_led.name = ar->leds.label;
- + ar->leds.wifi_led.default_state = LEDS_GPIO_DEFSTATE_KEEP;
- +
- + ar->leds.cdev.name = ar->leds.label;
- + ar->leds.cdev.brightness_set_blocking = ath10k_leds_set_brightness_blocking;
- +
- + /* FIXME: this assignment doesn't make sense as it's NULL, remove it? */
- + ar->leds.cdev.default_trigger = ar->leds.wifi_led.default_trigger;
- +
- + ret = led_classdev_register(wiphy_dev(ar->hw->wiphy), &ar->leds.cdev);
- + if (ret)
- + return ret;
- +
- + return 0;
- +}
- +
- +void ath10k_leds_unregister(struct ath10k *ar)
- +{
- + if (ar->hw_params.led_pin == 0)
- + /* leds not supported */
- + return;
- +
- + led_classdev_unregister(&ar->leds.cdev);
- +}
- +
- --- /dev/null
- +++ b/ath10k-4.19/leds.h
- @@ -0,0 +1,41 @@
- +/*
- + * Copyright (c) 2018, 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.
- + */
- +#ifndef _LEDS_H_
- +#define _LEDS_H_
- +
- +#include "core.h"
- +
- +#ifdef CONFIG_ATH10K_LEDS
- +void ath10k_leds_unregister(struct ath10k *ar);
- +int ath10k_leds_start(struct ath10k *ar);
- +int ath10k_leds_register(struct ath10k *ar);
- +#else
- +static inline void ath10k_leds_unregister(struct ath10k *ar)
- +{
- +}
- +
- +static inline int ath10k_leds_start(struct ath10k *ar)
- +{
- + return 0;
- +}
- +
- +static inline int ath10k_leds_register(struct ath10k *ar)
- +{
- + return 0;
- +}
- +
- +#endif
- +#endif /* _LEDS_H_ */
- --- a/ath10k-4.19/mac.c
- +++ b/ath10k-4.19/mac.c
- @@ -34,6 +34,7 @@
- #include "wmi-tlv.h"
- #include "wmi-ops.h"
- #include "wow.h"
- +#include "leds.h"
-
- /*********/
- /* Rates */
- --- a/ath10k-4.19/wmi-ops.h
- +++ b/ath10k-4.19/wmi-ops.h
- @@ -218,7 +218,10 @@ struct wmi_ops {
- struct sk_buff *(*gen_echo)(struct ath10k *ar, u32 value);
- struct sk_buff *(*gen_pdev_get_tpc_table_cmdid)(struct ath10k *ar,
- u32 param);
- + struct sk_buff *(*gen_gpio_config)(struct ath10k *ar, u32 gpio_num,
- + u32 input, u32 pull_type, u32 intr_mode);
-
- + struct sk_buff *(*gen_gpio_output)(struct ath10k *ar, u32 gpio_num, u32 set);
- };
-
- int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
- @@ -1079,6 +1082,35 @@ ath10k_wmi_force_fw_hang(struct ath10k *
- return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
- }
-
- +static inline int ath10k_wmi_gpio_config(struct ath10k *ar, u32 gpio_num,
- + u32 input, u32 pull_type, u32 intr_mode)
- +{
- + struct sk_buff *skb;
- +
- + if (!ar->wmi.ops->gen_gpio_config)
- + return -EOPNOTSUPP;
- +
- + skb = ar->wmi.ops->gen_gpio_config(ar, gpio_num, input, pull_type, intr_mode);
- + if (IS_ERR(skb))
- + return PTR_ERR(skb);
- +
- + return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_config_cmdid);
- +}
- +
- +static inline int ath10k_wmi_gpio_output(struct ath10k *ar, u32 gpio_num, u32 set)
- +{
- + struct sk_buff *skb;
- +
- + if (!ar->wmi.ops->gen_gpio_config)
- + return -EOPNOTSUPP;
- +
- + skb = ar->wmi.ops->gen_gpio_output(ar, gpio_num, set);
- + if (IS_ERR(skb))
- + return PTR_ERR(skb);
- +
- + return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->gpio_output_cmdid);
- +}
- +
- static inline int
- ath10k_wmi_dbglog_cfg(struct ath10k *ar, u64 module_enable, u32 log_level)
- {
- --- a/ath10k-4.19/wmi-tlv.c
- +++ b/ath10k-4.19/wmi-tlv.c
- @@ -3976,6 +3976,8 @@ static const struct wmi_ops wmi_tlv_ops
- .gen_echo = ath10k_wmi_tlv_op_gen_echo,
- .gen_vdev_spectral_conf = ath10k_wmi_tlv_op_gen_vdev_spectral_conf,
- .gen_vdev_spectral_enable = ath10k_wmi_tlv_op_gen_vdev_spectral_enable,
- + /* .gen_gpio_config not implemented */
- + /* .gen_gpio_output not implemented */
- };
-
- static const struct wmi_peer_flags_map wmi_tlv_peer_flags_map = {
- --- a/ath10k-4.19/wmi.c
- +++ b/ath10k-4.19/wmi.c
- @@ -7881,6 +7881,49 @@ ath10k_wmi_op_gen_peer_set_param(struct
- return skb;
- }
-
- +static struct sk_buff *ath10k_wmi_op_gen_gpio_config(struct ath10k *ar,
- + u32 gpio_num, u32 input,
- + u32 pull_type, u32 intr_mode)
- +{
- + struct wmi_gpio_config_cmd *cmd;
- + struct sk_buff *skb;
- +
- + skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
- + if (!skb)
- + return ERR_PTR(-ENOMEM);
- +
- + cmd = (struct wmi_gpio_config_cmd *)skb->data;
- + cmd->pull_type = __cpu_to_le32(pull_type);
- + cmd->gpio_num = __cpu_to_le32(gpio_num);
- + cmd->input = __cpu_to_le32(input);
- + cmd->intr_mode = __cpu_to_le32(intr_mode);
- +
- + ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_config gpio_num 0x%08x input 0x%08x pull_type 0x%08x intr_mode 0x%08x\n",
- + gpio_num, input, pull_type, intr_mode);
- +
- + return skb;
- +}
- +
- +static struct sk_buff *ath10k_wmi_op_gen_gpio_output(struct ath10k *ar,
- + u32 gpio_num, u32 set)
- +{
- + struct wmi_gpio_output_cmd *cmd;
- + struct sk_buff *skb;
- +
- + skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
- + if (!skb)
- + return ERR_PTR(-ENOMEM);
- +
- + cmd = (struct wmi_gpio_output_cmd *)skb->data;
- + cmd->gpio_num = __cpu_to_le32(gpio_num);
- + cmd->set = __cpu_to_le32(set);
- +
- + ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi gpio_output gpio_num 0x%08x set 0x%08x\n",
- + gpio_num, set);
- +
- + return skb;
- +}
- +
- static struct sk_buff *
- ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
- enum wmi_sta_ps_mode psmode)
- @@ -9605,6 +9648,9 @@ static const struct wmi_ops wmi_ops = {
- .fw_stats_fill = ath10k_wmi_main_op_fw_stats_fill,
- .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
- .gen_echo = ath10k_wmi_op_gen_echo,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- +
- /* .gen_bcn_tmpl not implemented */
- /* .gen_prb_tmpl not implemented */
- /* .gen_p2p_go_bcn_ie not implemented */
- @@ -9675,6 +9721,8 @@ static const struct wmi_ops wmi_10_1_ops
- .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
- .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
- .gen_echo = ath10k_wmi_op_gen_echo,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- /* .gen_bcn_tmpl not implemented */
- /* .gen_prb_tmpl not implemented */
- /* .gen_p2p_go_bcn_ie not implemented */
- @@ -9752,6 +9800,8 @@ static const struct wmi_ops wmi_10_2_ops
- .gen_delba_send = ath10k_wmi_op_gen_delba_send,
- .fw_stats_fill = ath10k_wmi_10x_op_fw_stats_fill,
- .get_vdev_subtype = ath10k_wmi_op_get_vdev_subtype,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- /* .gen_pdev_enable_adaptive_cca not implemented */
- };
-
- @@ -9822,6 +9872,8 @@ static const struct wmi_ops wmi_10_2_4_o
- .gen_pdev_enable_adaptive_cca =
- ath10k_wmi_op_gen_pdev_enable_adaptive_cca,
- .get_vdev_subtype = ath10k_wmi_10_2_4_op_get_vdev_subtype,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- /* .gen_bcn_tmpl not implemented */
- /* .gen_prb_tmpl not implemented */
- /* .gen_p2p_go_bcn_ie not implemented */
- @@ -9902,6 +9954,8 @@ static const struct wmi_ops wmi_10_4_ops
- .gen_pdev_bss_chan_info_req = ath10k_wmi_10_2_op_gen_pdev_bss_chan_info,
- .gen_echo = ath10k_wmi_op_gen_echo,
- .gen_pdev_get_tpc_config = ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config,
- + .gen_gpio_config = ath10k_wmi_op_gen_gpio_config,
- + .gen_gpio_output = ath10k_wmi_op_gen_gpio_output,
- };
-
- int ath10k_wmi_attach(struct ath10k *ar)
- --- a/ath10k-4.19/wmi.h
- +++ b/ath10k-4.19/wmi.h
- @@ -3040,6 +3040,41 @@ enum wmi_10_4_feature_mask {
-
- };
-
- +/* WMI_GPIO_CONFIG_CMDID */
- +enum {
- + WMI_GPIO_PULL_NONE,
- + WMI_GPIO_PULL_UP,
- + WMI_GPIO_PULL_DOWN,
- +};
- +
- +enum {
- + WMI_GPIO_INTTYPE_DISABLE,
- + WMI_GPIO_INTTYPE_RISING_EDGE,
- + WMI_GPIO_INTTYPE_FALLING_EDGE,
- + WMI_GPIO_INTTYPE_BOTH_EDGE,
- + WMI_GPIO_INTTYPE_LEVEL_LOW,
- + WMI_GPIO_INTTYPE_LEVEL_HIGH
- +};
- +
- +/* WMI_GPIO_CONFIG_CMDID */
- +struct wmi_gpio_config_cmd {
- + __le32 gpio_num; /* GPIO number to be setup */
- + __le32 input; /* 0 - Output/ 1 - Input */
- + __le32 pull_type; /* Pull type defined above */
- + __le32 intr_mode; /* Interrupt mode defined above (Input) */
- +} __packed;
- +
- +/* WMI_GPIO_OUTPUT_CMDID */
- +struct wmi_gpio_output_cmd {
- + __le32 gpio_num; /* GPIO number to be setup */
- + __le32 set; /* Set the GPIO pin*/
- +} __packed;
- +
- +/* WMI_GPIO_INPUT_EVENTID */
- +struct wmi_gpio_input_event {
- + __le32 gpio_num; /* GPIO number which changed state */
- +} __packed;
- +
- struct wmi_ext_resource_config_10_4_cmd {
- /* contains enum wmi_host_platform_type */
- __le32 host_platform_config;
|