blob: cd4d64f7816b2398cc3348e1e4d96387164e4cb4 [file] [log] [blame]
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