xref: /openbmc/linux/drivers/w1/w1_netlink.h (revision 8a0427d192e6043834414210dd14cc1289daff18)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * w1_netlink.h
31da177e4SLinus Torvalds  *
4a8018766SEvgeniy Polyakov  * Copyright (c) 2003 Evgeniy Polyakov <zbr@ioremap.net>
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * This program is free software; you can redistribute it and/or modify
81da177e4SLinus Torvalds  * it under the terms of the GNU General Public License as published by
91da177e4SLinus Torvalds  * the Free Software Foundation; either version 2 of the License, or
101da177e4SLinus Torvalds  * (at your option) any later version.
111da177e4SLinus Torvalds  *
121da177e4SLinus Torvalds  * This program is distributed in the hope that it will be useful,
131da177e4SLinus Torvalds  * but WITHOUT ANY WARRANTY; without even the implied warranty of
141da177e4SLinus Torvalds  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151da177e4SLinus Torvalds  * GNU General Public License for more details.
161da177e4SLinus Torvalds  *
171da177e4SLinus Torvalds  * You should have received a copy of the GNU General Public License
181da177e4SLinus Torvalds  * along with this program; if not, write to the Free Software
191da177e4SLinus Torvalds  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
201da177e4SLinus Torvalds  */
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds #ifndef __W1_NETLINK_H
231da177e4SLinus Torvalds #define __W1_NETLINK_H
241da177e4SLinus Torvalds 
251da177e4SLinus Torvalds #include <asm/types.h>
2612003375SEvgeniy Polyakov #include <linux/connector.h>
271da177e4SLinus Torvalds 
281da177e4SLinus Torvalds #include "w1.h"
291da177e4SLinus Torvalds 
30b3be177aSDavid Fries /**
31*8a0427d1SDavid Fries  * enum w1_cn_msg_flags - bitfield flags for struct cn_msg.flags
32*8a0427d1SDavid Fries  *
33*8a0427d1SDavid Fries  * @W1_CN_BUNDLE: Request bundling replies into fewer messagse.  Be prepared
34*8a0427d1SDavid Fries  * to handle multiple struct cn_msg, struct w1_netlink_msg, and
35*8a0427d1SDavid Fries  * struct w1_netlink_cmd in one packet.
36*8a0427d1SDavid Fries  */
37*8a0427d1SDavid Fries enum w1_cn_msg_flags {
38*8a0427d1SDavid Fries 	W1_CN_BUNDLE = 1,
39*8a0427d1SDavid Fries };
40*8a0427d1SDavid Fries 
41*8a0427d1SDavid Fries /**
42b3be177aSDavid Fries  * enum w1_netlink_message_types - message type
4370b34d2eSDavid Fries  *
4470b34d2eSDavid Fries  * @W1_SLAVE_ADD: notification that a slave device was added
4570b34d2eSDavid Fries  * @W1_SLAVE_REMOVE: notification that a slave device was removed
4670b34d2eSDavid Fries  * @W1_MASTER_ADD: notification that a new bus master was added
4770b34d2eSDavid Fries  * @W1_MASTER_REMOVE: notification that a bus masterwas removed
4870b34d2eSDavid Fries  * @W1_MASTER_CMD: initiate operations on a specific master
4970b34d2eSDavid Fries  * @W1_SLAVE_CMD: sends reset, selects the slave, then does a read/write/touch
5070b34d2eSDavid Fries  * operation
5170b34d2eSDavid Fries  * @W1_LIST_MASTERS: used to determine the bus master identifiers
5270b34d2eSDavid Fries  */
531da177e4SLinus Torvalds enum w1_netlink_message_types {
541da177e4SLinus Torvalds 	W1_SLAVE_ADD = 0,
551da177e4SLinus Torvalds 	W1_SLAVE_REMOVE,
561da177e4SLinus Torvalds 	W1_MASTER_ADD,
571da177e4SLinus Torvalds 	W1_MASTER_REMOVE,
5812003375SEvgeniy Polyakov 	W1_MASTER_CMD,
5912003375SEvgeniy Polyakov 	W1_SLAVE_CMD,
60610705e7SEvgeniy Polyakov 	W1_LIST_MASTERS,
611da177e4SLinus Torvalds };
621da177e4SLinus Torvalds 
63*8a0427d1SDavid Fries /**
64*8a0427d1SDavid Fries  * struct w1_netlink_msg - holds w1 message type, id, and result
65*8a0427d1SDavid Fries  *
66*8a0427d1SDavid Fries  * @type: one of enum w1_netlink_message_types
67*8a0427d1SDavid Fries  * @status: kernel feedback for success 0 or errno failure value
68*8a0427d1SDavid Fries  * @len: length of data following w1_netlink_msg
69*8a0427d1SDavid Fries  * @id: union holding master bus id (msg.id) and slave device id (id[8]).
70*8a0427d1SDavid Fries  * @data: start address of any following data
71*8a0427d1SDavid Fries  *
72*8a0427d1SDavid Fries  * The base message structure for w1 messages over netlink.
73*8a0427d1SDavid Fries  * The netlink connector data sequence is, struct nlmsghdr, struct cn_msg,
74*8a0427d1SDavid Fries  * then one or more struct w1_netlink_msg (each with optional data).
75*8a0427d1SDavid Fries  */
761da177e4SLinus Torvalds struct w1_netlink_msg
771da177e4SLinus Torvalds {
781da177e4SLinus Torvalds 	__u8				type;
794037014eSEvgeniy Polyakov 	__u8				status;
8012003375SEvgeniy Polyakov 	__u16				len;
8112003375SEvgeniy Polyakov 	union {
8212003375SEvgeniy Polyakov 		__u8			id[8];
8312003375SEvgeniy Polyakov 		struct w1_mst {
841da177e4SLinus Torvalds 			__u32		id;
8512003375SEvgeniy Polyakov 			__u32		res;
861da177e4SLinus Torvalds 		} mst;
871da177e4SLinus Torvalds 	} id;
8812003375SEvgeniy Polyakov 	__u8				data[0];
8912003375SEvgeniy Polyakov };
9012003375SEvgeniy Polyakov 
91b3be177aSDavid Fries /**
92b3be177aSDavid Fries  * enum w1_commands - commands available for master or slave operations
93*8a0427d1SDavid Fries  *
9470b34d2eSDavid Fries  * @W1_CMD_READ: read len bytes
9570b34d2eSDavid Fries  * @W1_CMD_WRITE: write len bytes
9670b34d2eSDavid Fries  * @W1_CMD_SEARCH: initiate a standard search, returns only the slave
9770b34d2eSDavid Fries  * devices found during that search
9870b34d2eSDavid Fries  * @W1_CMD_ALARM_SEARCH: search for devices that are currently alarming
9970b34d2eSDavid Fries  * @W1_CMD_TOUCH: Touches a series of bytes.
10070b34d2eSDavid Fries  * @W1_CMD_RESET: sends a bus reset on the given master
10170b34d2eSDavid Fries  * @W1_CMD_SLAVE_ADD: adds a slave to the given master,
10270b34d2eSDavid Fries  * 8 byte slave id at data[0]
10370b34d2eSDavid Fries  * @W1_CMD_SLAVE_REMOVE: removes a slave to the given master,
10470b34d2eSDavid Fries  * 8 byte slave id at data[0]
10570b34d2eSDavid Fries  * @W1_CMD_LIST_SLAVES: list of slaves registered on this master
10670b34d2eSDavid Fries  * @W1_CMD_MAX: number of available commands
10770b34d2eSDavid Fries  */
108325a06fbSEvgeniy Polyakov enum w1_commands {
109325a06fbSEvgeniy Polyakov 	W1_CMD_READ = 0,
110325a06fbSEvgeniy Polyakov 	W1_CMD_WRITE,
111325a06fbSEvgeniy Polyakov 	W1_CMD_SEARCH,
112325a06fbSEvgeniy Polyakov 	W1_CMD_ALARM_SEARCH,
113325a06fbSEvgeniy Polyakov 	W1_CMD_TOUCH,
114f89735c4SEvgeniy Polyakov 	W1_CMD_RESET,
11570b34d2eSDavid Fries 	W1_CMD_SLAVE_ADD,
11670b34d2eSDavid Fries 	W1_CMD_SLAVE_REMOVE,
11770b34d2eSDavid Fries 	W1_CMD_LIST_SLAVES,
11870b34d2eSDavid Fries 	W1_CMD_MAX
119325a06fbSEvgeniy Polyakov };
12012003375SEvgeniy Polyakov 
121*8a0427d1SDavid Fries /**
122*8a0427d1SDavid Fries  * struct w1_netlink_cmd - holds the command and data
123*8a0427d1SDavid Fries  *
124*8a0427d1SDavid Fries  * @cmd: one of enum w1_commands
125*8a0427d1SDavid Fries  * @res: reserved
126*8a0427d1SDavid Fries  * @len: length of data following w1_netlink_cmd
127*8a0427d1SDavid Fries  * @data: start address of any following data
128*8a0427d1SDavid Fries  *
129*8a0427d1SDavid Fries  * One or more struct w1_netlink_cmd is placed starting at w1_netlink_msg.data
130*8a0427d1SDavid Fries  * each with optional data.
131*8a0427d1SDavid Fries  */
13212003375SEvgeniy Polyakov struct w1_netlink_cmd
13312003375SEvgeniy Polyakov {
13412003375SEvgeniy Polyakov 	__u8				cmd;
13512003375SEvgeniy Polyakov 	__u8				res;
13612003375SEvgeniy Polyakov 	__u16				len;
13712003375SEvgeniy Polyakov 	__u8				data[0];
1381da177e4SLinus Torvalds };
1391da177e4SLinus Torvalds 
1401da177e4SLinus Torvalds #ifdef __KERNEL__
1411da177e4SLinus Torvalds 
1421da177e4SLinus Torvalds void w1_netlink_send(struct w1_master *, struct w1_netlink_msg *);
14312003375SEvgeniy Polyakov int w1_init_netlink(void);
14412003375SEvgeniy Polyakov void w1_fini_netlink(void);
1451da177e4SLinus Torvalds 
1461da177e4SLinus Torvalds #endif /* __KERNEL__ */
1471da177e4SLinus Torvalds #endif /* __W1_NETLINK_H */
148