| From 7baa8ba760893c6eba8ce3dce261cd784fc513bc Mon Sep 17 00:00:00 2001 |
| From: Eliot Lee <eliot.lee@intel.corp-partner.google.com> |
| Date: Wed, 22 Feb 2023 10:14:05 -0800 |
| Subject: [PATCH] CHROMIUM: net: wwan: t7xx: Restore udev events |
| |
| This patch restores udev events on top of net-next + devlink |
| upstream V5 changes |
| |
| UPSTREAM-TASK=b:278932830 |
| BUG=b:258509032 |
| TEST=Manual connectivity/traffic tests on Brya |
| |
| Signed-off-by: Eliot Lee <eliot.lee@intel.corp-partner.google.com> |
| Signed-off-by: Dinesh Kumar Sharma <dinesh.sharma@intel.corp-partner.google.com> |
| |
| Change-Id: I0c939e44f55b0511e102f2bc542ea347f5711028 |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/4369884 |
| Tested-by: Dinesh Sharma <dinesh.sharma@intel.corp-partner.google.com> |
| Commit-Queue: Daniel Winkler <danielwinkler@google.com> |
| Reviewed-by: Madhav <madhavadas@google.com> |
| --- |
| drivers/net/wwan/t7xx/Makefile | 3 +- |
| drivers/net/wwan/t7xx/t7xx_port_devlink.c | 17 +++++++++ |
| drivers/net/wwan/t7xx/t7xx_state_monitor.c | 6 ++++ |
| drivers/net/wwan/t7xx/t7xx_uevent.c | 41 ++++++++++++++++++++++ |
| drivers/net/wwan/t7xx/t7xx_uevent.h | 39 ++++++++++++++++++++ |
| 5 files changed, 105 insertions(+), 1 deletion(-) |
| create mode 100644 drivers/net/wwan/t7xx/t7xx_uevent.c |
| create mode 100644 drivers/net/wwan/t7xx/t7xx_uevent.h |
| |
| diff --git a/drivers/net/wwan/t7xx/Makefile b/drivers/net/wwan/t7xx/Makefile |
| index b5acffcb10475aac4f2a8cd8b67ac8eeeb7aa6ce..6905c087c77d25220583b960229e51c2329797f5 100644 |
| --- a/drivers/net/wwan/t7xx/Makefile |
| +++ b/drivers/net/wwan/t7xx/Makefile |
| @@ -18,7 +18,8 @@ mtk_t7xx-y:= t7xx_pci.o \ |
| t7xx_netdev.o \ |
| t7xx_pci_rescan.o \ |
| t7xx_port_devlink.o \ |
| - t7xx_port_ap_msg.o |
| + t7xx_port_ap_msg.o \ |
| + t7xx_uevent.o |
| |
| mtk_t7xx-$(CONFIG_WWAN_DEBUGFS) += \ |
| t7xx_port_trace.o \ |
| diff --git a/drivers/net/wwan/t7xx/t7xx_port_devlink.c b/drivers/net/wwan/t7xx/t7xx_port_devlink.c |
| index fa918b33fc9f02825309581cc93d3a00deba5444..71256c6f68819e316a3cc65a3509c75e4f08e2a1 100644 |
| --- a/drivers/net/wwan/t7xx/t7xx_port_devlink.c |
| +++ b/drivers/net/wwan/t7xx/t7xx_port_devlink.c |
| @@ -12,6 +12,7 @@ |
| #include "t7xx_port_devlink.h" |
| #include "t7xx_port_proxy.h" |
| #include "t7xx_state_monitor.h" |
| +#include "t7xx_uevent.h" |
| |
| static struct t7xx_devlink_region_info t7xx_devlink_region_infos[] = { |
| [T7XX_MRDUMP_INDEX] = {"mr_dump", T7XX_MRDUMP_SIZE}, |
| @@ -204,6 +205,7 @@ static int t7xx_devlink_fb_flash_partition(struct t7xx_port *port, const char *p |
| |
| static int t7xx_devlink_fb_get_core(struct t7xx_port *port) |
| { |
| + char mrdump_complete_event[T7XX_FB_EVENT_SIZE]; |
| u32 mrd_mb = T7XX_MRDUMP_SIZE / (1024 * 1024); |
| struct t7xx_devlink *dl = port->t7xx_dev->dl; |
| char mcmd[T7XX_FB_MCMD_SIZE + 1]; |
| @@ -253,11 +255,15 @@ static int t7xx_devlink_fb_get_core(struct t7xx_port *port) |
| } else if ((clen == strlen(T7XX_FB_RESP_MRDUMP_DONE)) && |
| (!strcmp(mcmd, T7XX_FB_RESP_MRDUMP_DONE))) { |
| dev_dbg(port->dev, "%s! size:%zd\n", T7XX_FB_RESP_MRDUMP_DONE, offset_dlen); |
| + snprintf(mrdump_complete_event, sizeof(mrdump_complete_event), |
| + "%s size=%zu", T7XX_UEVENT_MRDUMP_READY, offset_dlen); |
| + t7xx_uevent_send(dl->port->dev, mrdump_complete_event); |
| clear_bit(T7XX_MRDUMP_STATUS, &dl->status); |
| return 0; |
| } |
| dev_err(port->dev, "getcore protocol error (read len %05d, response %s)\n", |
| clen, mcmd); |
| + t7xx_uevent_send(dl->port->dev, T7XX_UEVENT_MRD_DISCD); |
| ret = -EPROTO; |
| goto free_mem; |
| } |
| @@ -272,6 +278,7 @@ static int t7xx_devlink_fb_get_core(struct t7xx_port *port) |
| |
| static int t7xx_devlink_fb_dump_log(struct t7xx_port *port) |
| { |
| + char lkdump_complete_event[T7XX_FB_EVENT_SIZE]; |
| struct t7xx_devlink *dl = port->t7xx_dev->dl; |
| struct t7xx_devlink_region *lkdump_region; |
| char rsp[T7XX_FB_RESPONSE_SIZE]; |
| @@ -302,6 +309,7 @@ static int t7xx_devlink_fb_dump_log(struct t7xx_port *port) |
| if (datasize > lkdump_region->info->size) { |
| dev_err(port->dev, "lkdump size is more than %dKB. Discarded!\n", |
| T7XX_LKDUMP_SIZE / 1024); |
| + t7xx_uevent_send(dl->port->dev, T7XX_UEVENT_LKD_DISCD); |
| clear_bit(T7XX_LKDUMP_STATUS, &dl->status); |
| return -EPROTO; |
| } |
| @@ -325,6 +333,9 @@ static int t7xx_devlink_fb_dump_log(struct t7xx_port *port) |
| } |
| |
| dev_dbg(port->dev, "LKDUMP DONE! size:%zd\n", offset); |
| + snprintf(lkdump_complete_event, sizeof(lkdump_complete_event), "%s size=%zu", |
| + T7XX_UEVENT_LKDUMP_READY, offset); |
| + t7xx_uevent_send(dl->port->dev, lkdump_complete_event); |
| clear_bit(T7XX_LKDUMP_STATUS, &dl->status); |
| return t7xx_devlink_fb_handle_response(port, NULL); |
| } |
| @@ -336,6 +347,7 @@ static int t7xx_devlink_flash_update(struct devlink *devlink, |
| struct t7xx_devlink *dl = devlink_priv(devlink); |
| const char *component = params->component; |
| const struct firmware *fw = params->fw; |
| + char flash_event[T7XX_FB_EVENT_SIZE]; |
| struct t7xx_port *port; |
| int ret; |
| |
| @@ -363,10 +375,15 @@ static int t7xx_devlink_flash_update(struct devlink *devlink, |
| if (ret) { |
| devlink_flash_update_status_notify(devlink, "flashing failure!", |
| params->component, 0, 0); |
| + snprintf(flash_event, sizeof(flash_event), "%s for [%s]", |
| + T7XX_UEVENT_FLASHING_FAILURE, params->component); |
| } else { |
| devlink_flash_update_status_notify(devlink, "flashing success!", |
| params->component, 0, 0); |
| + snprintf(flash_event, sizeof(flash_event), "%s for [%s]", |
| + T7XX_UEVENT_FLASHING_SUCCESS, params->component); |
| } |
| + t7xx_uevent_send(dl->port->dev, flash_event); |
| clear_bit(T7XX_FLASH_STATUS, &dl->status); |
| |
| err_out: |
| diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.c b/drivers/net/wwan/t7xx/t7xx_state_monitor.c |
| index 9474c8076fba11d1e1e00f4b28e151aed9412f29..25359fb70f1011965b969bb4c740aba5d2754709 100644 |
| --- a/drivers/net/wwan/t7xx/t7xx_state_monitor.c |
| +++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.c |
| @@ -41,6 +41,7 @@ |
| #include "t7xx_port_proxy.h" |
| #include "t7xx_reg.h" |
| #include "t7xx_state_monitor.h" |
| +#include "t7xx_uevent.h" |
| |
| #define FSM_DRM_DISABLE_DELAY_MS 200 |
| #define FSM_EVENT_POLL_INTERVAL_MS 20 |
| @@ -250,6 +251,10 @@ static void t7xx_lk_stage_event_handling(struct t7xx_fsm_ctl *ctl, unsigned int |
| port->port_conf->ops->enable_chl(port); |
| |
| t7xx_cldma_start(md_ctrl); |
| + if (lk_event == LK_EVENT_CREATE_PD_PORT) |
| + t7xx_uevent_send(dev, T7XX_UEVENT_MODEM_FASTBOOT_DUMP_MODE); |
| + else |
| + t7xx_uevent_send(dev, T7XX_UEVENT_MODEM_FASTBOOT_DL_MODE); |
| |
| if (lk_event == LK_EVENT_CREATE_POST_DL_PORT) |
| t7xx_mode_update(md->t7xx_dev, T7XX_FASTBOOT_DOWNLOAD); |
| @@ -333,6 +338,7 @@ static void fsm_routine_ready(struct t7xx_fsm_ctl *ctl) |
| ctl->curr_state = FSM_STATE_READY; |
| t7xx_fsm_broadcast_ready_state(ctl); |
| t7xx_mode_update(md->t7xx_dev, T7XX_READY); |
| + t7xx_uevent_send(&md->t7xx_dev->pdev->dev, T7XX_UEVENT_MODEM_READY); |
| t7xx_md_event_notify(md, FSM_READY); |
| } |
| |
| diff --git a/drivers/net/wwan/t7xx/t7xx_uevent.c b/drivers/net/wwan/t7xx/t7xx_uevent.c |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5a320cf3f94b3cb26ff66c4f222cbdde37141978 |
| --- /dev/null |
| +++ b/drivers/net/wwan/t7xx/t7xx_uevent.c |
| @@ -0,0 +1,41 @@ |
| +// SPDX-License-Identifier: GPL-2.0-only |
| +/* |
| + * Copyright (c) 2022, Intel Corporation. |
| + */ |
| + |
| +#include <linux/slab.h> |
| + |
| +#include "t7xx_uevent.h" |
| + |
| +/* Update the uevent in work queue context */ |
| +static void t7xx_uevent_work(struct work_struct *data) |
| +{ |
| + struct t7xx_uevent_info *info; |
| + char *envp[2] = { NULL, NULL }; |
| + |
| + info = container_of(data, struct t7xx_uevent_info, work); |
| + envp[0] = info->uevent; |
| + |
| + if (kobject_uevent_env(&info->dev->kobj, KOBJ_CHANGE, envp)) |
| + pr_err("uevent %s failed to sent", info->uevent); |
| + |
| + kfree(info); |
| +} |
| + |
| +/** |
| + * t7xx_uevent_send - Send modem event to user space. |
| + * @dev: Generic device pointer |
| + * @uevent: Uevent information |
| + */ |
| +void t7xx_uevent_send(struct device *dev, char *uevent) |
| +{ |
| + struct t7xx_uevent_info *info = kzalloc(sizeof(*info), GFP_ATOMIC); |
| + |
| + if (!info) |
| + return; |
| + |
| + INIT_WORK(&info->work, t7xx_uevent_work); |
| + info->dev = dev; |
| + snprintf(info->uevent, T7XX_MAX_UEVENT_LEN, "T7XX_EVENT=%s", uevent); |
| + schedule_work(&info->work); |
| +} |
| diff --git a/drivers/net/wwan/t7xx/t7xx_uevent.h b/drivers/net/wwan/t7xx/t7xx_uevent.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e871dc0e9444df2f623ca851afa6edab3602dec2 |
| --- /dev/null |
| +++ b/drivers/net/wwan/t7xx/t7xx_uevent.h |
| @@ -0,0 +1,39 @@ |
| +/* SPDX-License-Identifier: GPL-2.0-only |
| + * |
| + * Copyright (c) 2022, Intel Corporation. |
| + */ |
| + |
| +#ifndef __T7XX_UEVENT_H__ |
| +#define __T7XX_UEVENT_H__ |
| + |
| +#include <linux/device.h> |
| +#include <linux/kobject.h> |
| + |
| +/* Maximum length of user events */ |
| +#define T7XX_MAX_UEVENT_LEN 64 |
| + |
| +/* T7XX Host driver uevents */ |
| +#define T7XX_UEVENT_MODEM_READY "T7XX_MODEM_READY" |
| +#define T7XX_UEVENT_MODEM_FASTBOOT_DL_MODE "T7XX_MODEM_FASTBOOT_DL_MODE" |
| +#define T7XX_UEVENT_MODEM_FASTBOOT_DUMP_MODE "T7XX_MODEM_FASTBOOT_DUMP_MODE" |
| +#define T7XX_UEVENT_MRDUMP_READY "T7XX_MRDUMP_READY" |
| +#define T7XX_UEVENT_LKDUMP_READY "T7XX_LKDUMP_READY" |
| +#define T7XX_UEVENT_MRD_DISCD "T7XX_MRDUMP_DISCARDED" |
| +#define T7XX_UEVENT_LKD_DISCD "T7XX_LKDUMP_DISCARDED" |
| +#define T7XX_UEVENT_FLASHING_SUCCESS "T7XX_FLASHING_SUCCESS" |
| +#define T7XX_UEVENT_FLASHING_FAILURE "T7XX_FLASHING_FAILURE" |
| + |
| +/** |
| + * struct t7xx_uevent_info - Uevent information structure. |
| + * @dev: Pointer to device structure |
| + * @uevent: Uevent information |
| + * @work: Uevent work struct |
| + */ |
| +struct t7xx_uevent_info { |
| + struct device *dev; |
| + char uevent[T7XX_MAX_UEVENT_LEN]; |
| + struct work_struct work; |
| +}; |
| + |
| +void t7xx_uevent_send(struct device *dev, char *uevent); |
| +#endif |
| -- |
| 2.44.0.478.gd926399ef9-goog |
| |