Skip to content

Commit

Permalink
net: iosm: uevent support
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
M Chetan Kumar authored and David S. Miller committed Jun 13, 2021
1 parent 64516f6 commit 110e6e0
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 0 deletions.
44 changes: 44 additions & 0 deletions drivers/net/wwan/iosm/iosm_ipc_uevent.c
Original file line number Diff line number Diff line change
@@ -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);
}
41 changes: 41 additions & 0 deletions drivers/net/wwan/iosm/iosm_ipc_uevent.h
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 110e6e0

Please sign in to comment.