/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (c) 2003 Evgeniy Polyakov <zbr@ioremap.net>
 */

#ifndef __W1_NETLINK_H
#define __W1_NETLINK_H

#include <asm/types.h>
#include <linux/connector.h>

#include "w1_internal.h"

/**
 * enum w1_cn_msg_flags - bitfield flags for struct cn_msg.flags
 *
 * @W1_CN_BUNDLE: Request bundling replies into fewer messagse.  Be prepared
 * to handle multiple struct cn_msg, struct w1_netlink_msg, and
 * struct w1_netlink_cmd in one packet.
 */
enum w1_cn_msg_flags {
	W1_CN_BUNDLE = 1,
};

/**
 * enum w1_netlink_message_types - message type
 *
 * @W1_SLAVE_ADD: notification that a slave device was added
 * @W1_SLAVE_REMOVE: notification that a slave device was removed
 * @W1_MASTER_ADD: notification that a new bus master was added
 * @W1_MASTER_REMOVE: notification that a bus masterwas removed
 * @W1_MASTER_CMD: initiate operations on a specific master
 * @W1_SLAVE_CMD: sends reset, selects the slave, then does a read/write/touch
 * operation
 * @W1_LIST_MASTERS: used to determine the bus master identifiers
 */
enum w1_netlink_message_types {
	W1_SLAVE_ADD = 0,
	W1_SLAVE_REMOVE,
	W1_MASTER_ADD,
	W1_MASTER_REMOVE,
	W1_MASTER_CMD,
	W1_SLAVE_CMD,
	W1_LIST_MASTERS,
};

/**
 * struct w1_netlink_msg - holds w1 message type, id, and result
 *
 * @type: one of enum w1_netlink_message_types
 * @status: kernel feedback for success 0 or errno failure value
 * @len: length of data following w1_netlink_msg
 * @id: union holding bus master id (msg.id) and slave device id (id[8]).
 * @id.id: Slave ID (8 bytes)
 * @id.mst: bus master identification
 * @id.mst.id: bus master ID
 * @id.mst.res: bus master reserved
 * @data: start address of any following data
 *
 * The base message structure for w1 messages over netlink.
 * The netlink connector data sequence is, struct nlmsghdr, struct cn_msg,
 * then one or more struct w1_netlink_msg (each with optional data).
 */
struct w1_netlink_msg
{
	__u8				type;
	__u8				status;
	__u16				len;
	union {
		__u8			id[8];
		struct w1_mst {
			__u32		id;
			__u32		res;
		} mst;
	} id;
	__u8				data[0];
};

/**
 * enum w1_commands - commands available for master or slave operations
 *
 * @W1_CMD_READ: read len bytes
 * @W1_CMD_WRITE: write len bytes
 * @W1_CMD_SEARCH: initiate a standard search, returns only the slave
 * devices found during that search
 * @W1_CMD_ALARM_SEARCH: search for devices that are currently alarming
 * @W1_CMD_TOUCH: Touches a series of bytes.
 * @W1_CMD_RESET: sends a bus reset on the given master
 * @W1_CMD_SLAVE_ADD: adds a slave to the given master,
 * 8 byte slave id at data[0]
 * @W1_CMD_SLAVE_REMOVE: removes a slave to the given master,
 * 8 byte slave id at data[0]
 * @W1_CMD_LIST_SLAVES: list of slaves registered on this master
 * @W1_CMD_MAX: number of available commands
 */
enum w1_commands {
	W1_CMD_READ = 0,
	W1_CMD_WRITE,
	W1_CMD_SEARCH,
	W1_CMD_ALARM_SEARCH,
	W1_CMD_TOUCH,
	W1_CMD_RESET,
	W1_CMD_SLAVE_ADD,
	W1_CMD_SLAVE_REMOVE,
	W1_CMD_LIST_SLAVES,
	W1_CMD_MAX
};

/**
 * struct w1_netlink_cmd - holds the command and data
 *
 * @cmd: one of enum w1_commands
 * @res: reserved
 * @len: length of data following w1_netlink_cmd
 * @data: start address of any following data
 *
 * One or more struct w1_netlink_cmd is placed starting at w1_netlink_msg.data
 * each with optional data.
 */
struct w1_netlink_cmd
{
	__u8				cmd;
	__u8				res;
	__u16				len;
	__u8				data[0];
};

#ifdef __KERNEL__

void w1_netlink_send(struct w1_master *, struct w1_netlink_msg *);
int w1_init_netlink(void);
void w1_fini_netlink(void);

#endif /* __KERNEL__ */
#endif /* __W1_NETLINK_H */
