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