xref: /kernel/linux/linux-6.6/drivers/w1/w1_netlink.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2003 Evgeniy Polyakov <zbr@ioremap.net>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __W1_NETLINK_H
762306a36Sopenharmony_ci#define __W1_NETLINK_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <asm/types.h>
1062306a36Sopenharmony_ci#include <linux/connector.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "w1_internal.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/**
1562306a36Sopenharmony_ci * enum w1_cn_msg_flags - bitfield flags for struct cn_msg.flags
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * @W1_CN_BUNDLE: Request bundling replies into fewer messagse.  Be prepared
1862306a36Sopenharmony_ci * to handle multiple struct cn_msg, struct w1_netlink_msg, and
1962306a36Sopenharmony_ci * struct w1_netlink_cmd in one packet.
2062306a36Sopenharmony_ci */
2162306a36Sopenharmony_cienum w1_cn_msg_flags {
2262306a36Sopenharmony_ci	W1_CN_BUNDLE = 1,
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/**
2662306a36Sopenharmony_ci * enum w1_netlink_message_types - message type
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci * @W1_SLAVE_ADD: notification that a slave device was added
2962306a36Sopenharmony_ci * @W1_SLAVE_REMOVE: notification that a slave device was removed
3062306a36Sopenharmony_ci * @W1_MASTER_ADD: notification that a new bus master was added
3162306a36Sopenharmony_ci * @W1_MASTER_REMOVE: notification that a bus masterwas removed
3262306a36Sopenharmony_ci * @W1_MASTER_CMD: initiate operations on a specific master
3362306a36Sopenharmony_ci * @W1_SLAVE_CMD: sends reset, selects the slave, then does a read/write/touch
3462306a36Sopenharmony_ci * operation
3562306a36Sopenharmony_ci * @W1_LIST_MASTERS: used to determine the bus master identifiers
3662306a36Sopenharmony_ci */
3762306a36Sopenharmony_cienum w1_netlink_message_types {
3862306a36Sopenharmony_ci	W1_SLAVE_ADD = 0,
3962306a36Sopenharmony_ci	W1_SLAVE_REMOVE,
4062306a36Sopenharmony_ci	W1_MASTER_ADD,
4162306a36Sopenharmony_ci	W1_MASTER_REMOVE,
4262306a36Sopenharmony_ci	W1_MASTER_CMD,
4362306a36Sopenharmony_ci	W1_SLAVE_CMD,
4462306a36Sopenharmony_ci	W1_LIST_MASTERS,
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci/**
4862306a36Sopenharmony_ci * struct w1_netlink_msg - holds w1 message type, id, and result
4962306a36Sopenharmony_ci *
5062306a36Sopenharmony_ci * @type: one of enum w1_netlink_message_types
5162306a36Sopenharmony_ci * @status: kernel feedback for success 0 or errno failure value
5262306a36Sopenharmony_ci * @len: length of data following w1_netlink_msg
5362306a36Sopenharmony_ci * @id: union holding bus master id (msg.id) and slave device id (id[8]).
5462306a36Sopenharmony_ci * @id.id: Slave ID (8 bytes)
5562306a36Sopenharmony_ci * @id.mst: bus master identification
5662306a36Sopenharmony_ci * @id.mst.id: bus master ID
5762306a36Sopenharmony_ci * @id.mst.res: bus master reserved
5862306a36Sopenharmony_ci * @data: start address of any following data
5962306a36Sopenharmony_ci *
6062306a36Sopenharmony_ci * The base message structure for w1 messages over netlink.
6162306a36Sopenharmony_ci * The netlink connector data sequence is, struct nlmsghdr, struct cn_msg,
6262306a36Sopenharmony_ci * then one or more struct w1_netlink_msg (each with optional data).
6362306a36Sopenharmony_ci */
6462306a36Sopenharmony_cistruct w1_netlink_msg
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	__u8				type;
6762306a36Sopenharmony_ci	__u8				status;
6862306a36Sopenharmony_ci	__u16				len;
6962306a36Sopenharmony_ci	union {
7062306a36Sopenharmony_ci		__u8			id[8];
7162306a36Sopenharmony_ci		struct w1_mst {
7262306a36Sopenharmony_ci			__u32		id;
7362306a36Sopenharmony_ci			__u32		res;
7462306a36Sopenharmony_ci		} mst;
7562306a36Sopenharmony_ci	} id;
7662306a36Sopenharmony_ci	__u8				data[];
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci/**
8062306a36Sopenharmony_ci * enum w1_commands - commands available for master or slave operations
8162306a36Sopenharmony_ci *
8262306a36Sopenharmony_ci * @W1_CMD_READ: read len bytes
8362306a36Sopenharmony_ci * @W1_CMD_WRITE: write len bytes
8462306a36Sopenharmony_ci * @W1_CMD_SEARCH: initiate a standard search, returns only the slave
8562306a36Sopenharmony_ci * devices found during that search
8662306a36Sopenharmony_ci * @W1_CMD_ALARM_SEARCH: search for devices that are currently alarming
8762306a36Sopenharmony_ci * @W1_CMD_TOUCH: Touches a series of bytes.
8862306a36Sopenharmony_ci * @W1_CMD_RESET: sends a bus reset on the given master
8962306a36Sopenharmony_ci * @W1_CMD_SLAVE_ADD: adds a slave to the given master,
9062306a36Sopenharmony_ci * 8 byte slave id at data[0]
9162306a36Sopenharmony_ci * @W1_CMD_SLAVE_REMOVE: removes a slave to the given master,
9262306a36Sopenharmony_ci * 8 byte slave id at data[0]
9362306a36Sopenharmony_ci * @W1_CMD_LIST_SLAVES: list of slaves registered on this master
9462306a36Sopenharmony_ci * @W1_CMD_MAX: number of available commands
9562306a36Sopenharmony_ci */
9662306a36Sopenharmony_cienum w1_commands {
9762306a36Sopenharmony_ci	W1_CMD_READ = 0,
9862306a36Sopenharmony_ci	W1_CMD_WRITE,
9962306a36Sopenharmony_ci	W1_CMD_SEARCH,
10062306a36Sopenharmony_ci	W1_CMD_ALARM_SEARCH,
10162306a36Sopenharmony_ci	W1_CMD_TOUCH,
10262306a36Sopenharmony_ci	W1_CMD_RESET,
10362306a36Sopenharmony_ci	W1_CMD_SLAVE_ADD,
10462306a36Sopenharmony_ci	W1_CMD_SLAVE_REMOVE,
10562306a36Sopenharmony_ci	W1_CMD_LIST_SLAVES,
10662306a36Sopenharmony_ci	W1_CMD_MAX
10762306a36Sopenharmony_ci};
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci/**
11062306a36Sopenharmony_ci * struct w1_netlink_cmd - holds the command and data
11162306a36Sopenharmony_ci *
11262306a36Sopenharmony_ci * @cmd: one of enum w1_commands
11362306a36Sopenharmony_ci * @res: reserved
11462306a36Sopenharmony_ci * @len: length of data following w1_netlink_cmd
11562306a36Sopenharmony_ci * @data: start address of any following data
11662306a36Sopenharmony_ci *
11762306a36Sopenharmony_ci * One or more struct w1_netlink_cmd is placed starting at w1_netlink_msg.data
11862306a36Sopenharmony_ci * each with optional data.
11962306a36Sopenharmony_ci */
12062306a36Sopenharmony_cistruct w1_netlink_cmd
12162306a36Sopenharmony_ci{
12262306a36Sopenharmony_ci	__u8				cmd;
12362306a36Sopenharmony_ci	__u8				res;
12462306a36Sopenharmony_ci	__u16				len;
12562306a36Sopenharmony_ci	__u8				data[];
12662306a36Sopenharmony_ci};
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci#ifdef __KERNEL__
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_civoid w1_netlink_send(struct w1_master *, struct w1_netlink_msg *);
13162306a36Sopenharmony_ciint w1_init_netlink(void);
13262306a36Sopenharmony_civoid w1_fini_netlink(void);
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci#endif /* __KERNEL__ */
13562306a36Sopenharmony_ci#endif /* __W1_NETLINK_H */
136