xref: /openbmc/linux/drivers/w1/w1_netlink.h (revision aa931b44ae3e32329b054e3cd8ba1a4f1aa9e0d8)
11da177e4SLinus Torvalds /*
2a8018766SEvgeniy Polyakov  * Copyright (c) 2003 Evgeniy Polyakov <zbr@ioremap.net>
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * This program is free software; you can redistribute it and/or modify
51da177e4SLinus Torvalds  * it under the terms of the GNU General Public License as published by
61da177e4SLinus Torvalds  * the Free Software Foundation; either version 2 of the License, or
71da177e4SLinus Torvalds  * (at your option) any later version.
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  * This program is distributed in the hope that it will be useful,
101da177e4SLinus Torvalds  * but WITHOUT ANY WARRANTY; without even the implied warranty of
111da177e4SLinus Torvalds  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
121da177e4SLinus Torvalds  * GNU General Public License for more details.
131da177e4SLinus Torvalds  */
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds #ifndef __W1_NETLINK_H
161da177e4SLinus Torvalds #define __W1_NETLINK_H
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds #include <asm/types.h>
1912003375SEvgeniy Polyakov #include <linux/connector.h>
201da177e4SLinus Torvalds 
21de0d6dbdSAndrew F. Davis #include "w1_internal.h"
221da177e4SLinus Torvalds 
23b3be177aSDavid Fries /**
248a0427d1SDavid Fries  * enum w1_cn_msg_flags - bitfield flags for struct cn_msg.flags
258a0427d1SDavid Fries  *
268a0427d1SDavid Fries  * @W1_CN_BUNDLE: Request bundling replies into fewer messagse.  Be prepared
278a0427d1SDavid Fries  * to handle multiple struct cn_msg, struct w1_netlink_msg, and
288a0427d1SDavid Fries  * struct w1_netlink_cmd in one packet.
298a0427d1SDavid Fries  */
308a0427d1SDavid Fries enum w1_cn_msg_flags {
318a0427d1SDavid Fries 	W1_CN_BUNDLE = 1,
328a0427d1SDavid Fries };
338a0427d1SDavid Fries 
348a0427d1SDavid Fries /**
35b3be177aSDavid Fries  * enum w1_netlink_message_types - message type
3670b34d2eSDavid Fries  *
3770b34d2eSDavid Fries  * @W1_SLAVE_ADD: notification that a slave device was added
3870b34d2eSDavid Fries  * @W1_SLAVE_REMOVE: notification that a slave device was removed
3970b34d2eSDavid Fries  * @W1_MASTER_ADD: notification that a new bus master was added
4070b34d2eSDavid Fries  * @W1_MASTER_REMOVE: notification that a bus masterwas removed
4170b34d2eSDavid Fries  * @W1_MASTER_CMD: initiate operations on a specific master
4270b34d2eSDavid Fries  * @W1_SLAVE_CMD: sends reset, selects the slave, then does a read/write/touch
4370b34d2eSDavid Fries  * operation
4470b34d2eSDavid Fries  * @W1_LIST_MASTERS: used to determine the bus master identifiers
4570b34d2eSDavid Fries  */
461da177e4SLinus Torvalds enum w1_netlink_message_types {
471da177e4SLinus Torvalds 	W1_SLAVE_ADD = 0,
481da177e4SLinus Torvalds 	W1_SLAVE_REMOVE,
491da177e4SLinus Torvalds 	W1_MASTER_ADD,
501da177e4SLinus Torvalds 	W1_MASTER_REMOVE,
5112003375SEvgeniy Polyakov 	W1_MASTER_CMD,
5212003375SEvgeniy Polyakov 	W1_SLAVE_CMD,
53610705e7SEvgeniy Polyakov 	W1_LIST_MASTERS,
541da177e4SLinus Torvalds };
551da177e4SLinus Torvalds 
568a0427d1SDavid Fries /**
578a0427d1SDavid Fries  * struct w1_netlink_msg - holds w1 message type, id, and result
588a0427d1SDavid Fries  *
598a0427d1SDavid Fries  * @type: one of enum w1_netlink_message_types
608a0427d1SDavid Fries  * @status: kernel feedback for success 0 or errno failure value
618a0427d1SDavid Fries  * @len: length of data following w1_netlink_msg
62*aa931b44SMauro Carvalho Chehab  * @id: union holding bus master id (msg.id) and slave device id (id[8]).
63*aa931b44SMauro Carvalho Chehab  * @id.id: Slave ID (8 bytes)
64*aa931b44SMauro Carvalho Chehab  * @id.mst: bus master identification
65*aa931b44SMauro Carvalho Chehab  * @id.mst.id: bus master ID
66*aa931b44SMauro Carvalho Chehab  * @id.mst.res: bus master reserved
678a0427d1SDavid Fries  * @data: start address of any following data
688a0427d1SDavid Fries  *
698a0427d1SDavid Fries  * The base message structure for w1 messages over netlink.
708a0427d1SDavid Fries  * The netlink connector data sequence is, struct nlmsghdr, struct cn_msg,
718a0427d1SDavid Fries  * then one or more struct w1_netlink_msg (each with optional data).
728a0427d1SDavid Fries  */
731da177e4SLinus Torvalds struct w1_netlink_msg
741da177e4SLinus Torvalds {
751da177e4SLinus Torvalds 	__u8				type;
764037014eSEvgeniy Polyakov 	__u8				status;
7712003375SEvgeniy Polyakov 	__u16				len;
7812003375SEvgeniy Polyakov 	union {
7912003375SEvgeniy Polyakov 		__u8			id[8];
8012003375SEvgeniy Polyakov 		struct w1_mst {
811da177e4SLinus Torvalds 			__u32		id;
8212003375SEvgeniy Polyakov 			__u32		res;
831da177e4SLinus Torvalds 		} mst;
841da177e4SLinus Torvalds 	} id;
8512003375SEvgeniy Polyakov 	__u8				data[0];
8612003375SEvgeniy Polyakov };
8712003375SEvgeniy Polyakov 
88b3be177aSDavid Fries /**
89b3be177aSDavid Fries  * enum w1_commands - commands available for master or slave operations
908a0427d1SDavid Fries  *
9170b34d2eSDavid Fries  * @W1_CMD_READ: read len bytes
9270b34d2eSDavid Fries  * @W1_CMD_WRITE: write len bytes
9370b34d2eSDavid Fries  * @W1_CMD_SEARCH: initiate a standard search, returns only the slave
9470b34d2eSDavid Fries  * devices found during that search
9570b34d2eSDavid Fries  * @W1_CMD_ALARM_SEARCH: search for devices that are currently alarming
9670b34d2eSDavid Fries  * @W1_CMD_TOUCH: Touches a series of bytes.
9770b34d2eSDavid Fries  * @W1_CMD_RESET: sends a bus reset on the given master
9870b34d2eSDavid Fries  * @W1_CMD_SLAVE_ADD: adds a slave to the given master,
9970b34d2eSDavid Fries  * 8 byte slave id at data[0]
10070b34d2eSDavid Fries  * @W1_CMD_SLAVE_REMOVE: removes a slave to the given master,
10170b34d2eSDavid Fries  * 8 byte slave id at data[0]
10270b34d2eSDavid Fries  * @W1_CMD_LIST_SLAVES: list of slaves registered on this master
10370b34d2eSDavid Fries  * @W1_CMD_MAX: number of available commands
10470b34d2eSDavid Fries  */
105325a06fbSEvgeniy Polyakov enum w1_commands {
106325a06fbSEvgeniy Polyakov 	W1_CMD_READ = 0,
107325a06fbSEvgeniy Polyakov 	W1_CMD_WRITE,
108325a06fbSEvgeniy Polyakov 	W1_CMD_SEARCH,
109325a06fbSEvgeniy Polyakov 	W1_CMD_ALARM_SEARCH,
110325a06fbSEvgeniy Polyakov 	W1_CMD_TOUCH,
111f89735c4SEvgeniy Polyakov 	W1_CMD_RESET,
11270b34d2eSDavid Fries 	W1_CMD_SLAVE_ADD,
11370b34d2eSDavid Fries 	W1_CMD_SLAVE_REMOVE,
11470b34d2eSDavid Fries 	W1_CMD_LIST_SLAVES,
11570b34d2eSDavid Fries 	W1_CMD_MAX
116325a06fbSEvgeniy Polyakov };
11712003375SEvgeniy Polyakov 
1188a0427d1SDavid Fries /**
1198a0427d1SDavid Fries  * struct w1_netlink_cmd - holds the command and data
1208a0427d1SDavid Fries  *
1218a0427d1SDavid Fries  * @cmd: one of enum w1_commands
1228a0427d1SDavid Fries  * @res: reserved
1238a0427d1SDavid Fries  * @len: length of data following w1_netlink_cmd
1248a0427d1SDavid Fries  * @data: start address of any following data
1258a0427d1SDavid Fries  *
1268a0427d1SDavid Fries  * One or more struct w1_netlink_cmd is placed starting at w1_netlink_msg.data
1278a0427d1SDavid Fries  * each with optional data.
1288a0427d1SDavid Fries  */
12912003375SEvgeniy Polyakov struct w1_netlink_cmd
13012003375SEvgeniy Polyakov {
13112003375SEvgeniy Polyakov 	__u8				cmd;
13212003375SEvgeniy Polyakov 	__u8				res;
13312003375SEvgeniy Polyakov 	__u16				len;
13412003375SEvgeniy Polyakov 	__u8				data[0];
1351da177e4SLinus Torvalds };
1361da177e4SLinus Torvalds 
1371da177e4SLinus Torvalds #ifdef __KERNEL__
1381da177e4SLinus Torvalds 
1391da177e4SLinus Torvalds void w1_netlink_send(struct w1_master *, struct w1_netlink_msg *);
14012003375SEvgeniy Polyakov int w1_init_netlink(void);
14112003375SEvgeniy Polyakov void w1_fini_netlink(void);
1421da177e4SLinus Torvalds 
1431da177e4SLinus Torvalds #endif /* __KERNEL__ */
1441da177e4SLinus Torvalds #endif /* __W1_NETLINK_H */
145