1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2003 Evgeniy Polyakov <zbr@ioremap.net> 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef __W1_NETLINK_H 7*4882a593Smuzhiyun #define __W1_NETLINK_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <asm/types.h> 10*4882a593Smuzhiyun #include <linux/connector.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include "w1_internal.h" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /** 15*4882a593Smuzhiyun * enum w1_cn_msg_flags - bitfield flags for struct cn_msg.flags 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * @W1_CN_BUNDLE: Request bundling replies into fewer messagse. Be prepared 18*4882a593Smuzhiyun * to handle multiple struct cn_msg, struct w1_netlink_msg, and 19*4882a593Smuzhiyun * struct w1_netlink_cmd in one packet. 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun enum w1_cn_msg_flags { 22*4882a593Smuzhiyun W1_CN_BUNDLE = 1, 23*4882a593Smuzhiyun }; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /** 26*4882a593Smuzhiyun * enum w1_netlink_message_types - message type 27*4882a593Smuzhiyun * 28*4882a593Smuzhiyun * @W1_SLAVE_ADD: notification that a slave device was added 29*4882a593Smuzhiyun * @W1_SLAVE_REMOVE: notification that a slave device was removed 30*4882a593Smuzhiyun * @W1_MASTER_ADD: notification that a new bus master was added 31*4882a593Smuzhiyun * @W1_MASTER_REMOVE: notification that a bus masterwas removed 32*4882a593Smuzhiyun * @W1_MASTER_CMD: initiate operations on a specific master 33*4882a593Smuzhiyun * @W1_SLAVE_CMD: sends reset, selects the slave, then does a read/write/touch 34*4882a593Smuzhiyun * operation 35*4882a593Smuzhiyun * @W1_LIST_MASTERS: used to determine the bus master identifiers 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun enum w1_netlink_message_types { 38*4882a593Smuzhiyun W1_SLAVE_ADD = 0, 39*4882a593Smuzhiyun W1_SLAVE_REMOVE, 40*4882a593Smuzhiyun W1_MASTER_ADD, 41*4882a593Smuzhiyun W1_MASTER_REMOVE, 42*4882a593Smuzhiyun W1_MASTER_CMD, 43*4882a593Smuzhiyun W1_SLAVE_CMD, 44*4882a593Smuzhiyun W1_LIST_MASTERS, 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /** 48*4882a593Smuzhiyun * struct w1_netlink_msg - holds w1 message type, id, and result 49*4882a593Smuzhiyun * 50*4882a593Smuzhiyun * @type: one of enum w1_netlink_message_types 51*4882a593Smuzhiyun * @status: kernel feedback for success 0 or errno failure value 52*4882a593Smuzhiyun * @len: length of data following w1_netlink_msg 53*4882a593Smuzhiyun * @id: union holding bus master id (msg.id) and slave device id (id[8]). 54*4882a593Smuzhiyun * @id.id: Slave ID (8 bytes) 55*4882a593Smuzhiyun * @id.mst: bus master identification 56*4882a593Smuzhiyun * @id.mst.id: bus master ID 57*4882a593Smuzhiyun * @id.mst.res: bus master reserved 58*4882a593Smuzhiyun * @data: start address of any following data 59*4882a593Smuzhiyun * 60*4882a593Smuzhiyun * The base message structure for w1 messages over netlink. 61*4882a593Smuzhiyun * The netlink connector data sequence is, struct nlmsghdr, struct cn_msg, 62*4882a593Smuzhiyun * then one or more struct w1_netlink_msg (each with optional data). 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun struct w1_netlink_msg 65*4882a593Smuzhiyun { 66*4882a593Smuzhiyun __u8 type; 67*4882a593Smuzhiyun __u8 status; 68*4882a593Smuzhiyun __u16 len; 69*4882a593Smuzhiyun union { 70*4882a593Smuzhiyun __u8 id[8]; 71*4882a593Smuzhiyun struct w1_mst { 72*4882a593Smuzhiyun __u32 id; 73*4882a593Smuzhiyun __u32 res; 74*4882a593Smuzhiyun } mst; 75*4882a593Smuzhiyun } id; 76*4882a593Smuzhiyun __u8 data[]; 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /** 80*4882a593Smuzhiyun * enum w1_commands - commands available for master or slave operations 81*4882a593Smuzhiyun * 82*4882a593Smuzhiyun * @W1_CMD_READ: read len bytes 83*4882a593Smuzhiyun * @W1_CMD_WRITE: write len bytes 84*4882a593Smuzhiyun * @W1_CMD_SEARCH: initiate a standard search, returns only the slave 85*4882a593Smuzhiyun * devices found during that search 86*4882a593Smuzhiyun * @W1_CMD_ALARM_SEARCH: search for devices that are currently alarming 87*4882a593Smuzhiyun * @W1_CMD_TOUCH: Touches a series of bytes. 88*4882a593Smuzhiyun * @W1_CMD_RESET: sends a bus reset on the given master 89*4882a593Smuzhiyun * @W1_CMD_SLAVE_ADD: adds a slave to the given master, 90*4882a593Smuzhiyun * 8 byte slave id at data[0] 91*4882a593Smuzhiyun * @W1_CMD_SLAVE_REMOVE: removes a slave to the given master, 92*4882a593Smuzhiyun * 8 byte slave id at data[0] 93*4882a593Smuzhiyun * @W1_CMD_LIST_SLAVES: list of slaves registered on this master 94*4882a593Smuzhiyun * @W1_CMD_MAX: number of available commands 95*4882a593Smuzhiyun */ 96*4882a593Smuzhiyun enum w1_commands { 97*4882a593Smuzhiyun W1_CMD_READ = 0, 98*4882a593Smuzhiyun W1_CMD_WRITE, 99*4882a593Smuzhiyun W1_CMD_SEARCH, 100*4882a593Smuzhiyun W1_CMD_ALARM_SEARCH, 101*4882a593Smuzhiyun W1_CMD_TOUCH, 102*4882a593Smuzhiyun W1_CMD_RESET, 103*4882a593Smuzhiyun W1_CMD_SLAVE_ADD, 104*4882a593Smuzhiyun W1_CMD_SLAVE_REMOVE, 105*4882a593Smuzhiyun W1_CMD_LIST_SLAVES, 106*4882a593Smuzhiyun W1_CMD_MAX 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /** 110*4882a593Smuzhiyun * struct w1_netlink_cmd - holds the command and data 111*4882a593Smuzhiyun * 112*4882a593Smuzhiyun * @cmd: one of enum w1_commands 113*4882a593Smuzhiyun * @res: reserved 114*4882a593Smuzhiyun * @len: length of data following w1_netlink_cmd 115*4882a593Smuzhiyun * @data: start address of any following data 116*4882a593Smuzhiyun * 117*4882a593Smuzhiyun * One or more struct w1_netlink_cmd is placed starting at w1_netlink_msg.data 118*4882a593Smuzhiyun * each with optional data. 119*4882a593Smuzhiyun */ 120*4882a593Smuzhiyun struct w1_netlink_cmd 121*4882a593Smuzhiyun { 122*4882a593Smuzhiyun __u8 cmd; 123*4882a593Smuzhiyun __u8 res; 124*4882a593Smuzhiyun __u16 len; 125*4882a593Smuzhiyun __u8 data[]; 126*4882a593Smuzhiyun }; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #ifdef __KERNEL__ 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun void w1_netlink_send(struct w1_master *, struct w1_netlink_msg *); 131*4882a593Smuzhiyun int w1_init_netlink(void); 132*4882a593Smuzhiyun void w1_fini_netlink(void); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #endif /* __KERNEL__ */ 135*4882a593Smuzhiyun #endif /* __W1_NETLINK_H */ 136