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