Commit 110e6e02 authored by M Chetan Kumar's avatar M Chetan Kumar Committed by David S. Miller
Browse files

net: iosm: uevent support



Report modem status via uevent.

Signed-off-by: default avatarM Chetan Kumar <m.chetan.kumar@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 64516f63
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
// 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 −0
Original line number Diff line number Diff line
/* 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