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