net: iosm: uevent support

Report modem status via uevent.

Signed-off-by: M Chetan Kumar <m.chetan.kumar@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
M Chetan Kumar 2021-06-13 18:20:21 +05:30 committed by David S. Miller
parent 64516f633b
commit 110e6e02eb
2 changed files with 85 additions and 0 deletions

View File

@ -0,0 +1,44 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2020-21 Intel Corporation.
*/
#include <linux/device.h>
#include <linux/kobject.h>
#include <linux/slab.h>
#include "iosm_ipc_uevent.h"
/* Update the uevent in work queue context */
static void ipc_uevent_work(struct work_struct *data)
{
struct ipc_uevent_info *info;
char *envp[2] = { NULL, NULL };
info = container_of(data, struct ipc_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);
}
void ipc_uevent_send(struct device *dev, char *uevent)
{
struct ipc_uevent_info *info = kzalloc(sizeof(*info), GFP_ATOMIC);
if (!info)
return;
/* Initialize the kernel work queue */
INIT_WORK(&info->work, ipc_uevent_work);
/* Store the device and event information */
info->dev = dev;
snprintf(info->uevent, MAX_UEVENT_LEN, "%s: %s", dev_name(dev), uevent);
/* Schedule uevent in process context using work queue */
schedule_work(&info->work);
}

View File

@ -0,0 +1,41 @@
/* SPDX-License-Identifier: GPL-2.0-only
*
* Copyright (C) 2020-21 Intel Corporation.
*/
#ifndef IOSM_IPC_UEVENT_H
#define IOSM_IPC_UEVENT_H
/* Baseband event strings */
#define UEVENT_MDM_NOT_READY "MDM_NOT_READY"
#define UEVENT_ROM_READY "ROM_READY"
#define UEVENT_MDM_READY "MDM_READY"
#define UEVENT_CRASH "CRASH"
#define UEVENT_CD_READY "CD_READY"
#define UEVENT_CD_READY_LINK_DOWN "CD_READY_LINK_DOWN"
#define UEVENT_MDM_TIMEOUT "MDM_TIMEOUT"
/* Maximum length of user events */
#define MAX_UEVENT_LEN 64
/**
* struct ipc_uevent_info - Uevent information structure.
* @dev: Pointer to device structure
* @uevent: Uevent information
* @work: Uevent work struct
*/
struct ipc_uevent_info {
struct device *dev;
char uevent[MAX_UEVENT_LEN];
struct work_struct work;
};
/**
* ipc_uevent_send - Send modem event to user space.
* @dev: Generic device pointer
* @uevent: Uevent information
*
*/
void ipc_uevent_send(struct device *dev, char *uevent);
#endif