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_internal.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 bus master id (msg.id) and slave device id (id[8]). 63 * @id.id: Slave ID (8 bytes) 64 * @id.mst: bus master identification 65 * @id.mst.id: bus master ID 66 * @id.mst.res: bus master reserved 67 * @data: start address of any following data 68 * 69 * The base message structure for w1 messages over netlink. 70 * The netlink connector data sequence is, struct nlmsghdr, struct cn_msg, 71 * then one or more struct w1_netlink_msg (each with optional data). 72 */ 73 struct w1_netlink_msg 74 { 75 __u8 type; 76 __u8 status; 77 __u16 len; 78 union { 79 __u8 id[8]; 80 struct w1_mst { 81 __u32 id; 82 __u32 res; 83 } mst; 84 } id; 85 __u8 data[0]; 86 }; 87 88 /** 89 * enum w1_commands - commands available for master or slave operations 90 * 91 * @W1_CMD_READ: read len bytes 92 * @W1_CMD_WRITE: write len bytes 93 * @W1_CMD_SEARCH: initiate a standard search, returns only the slave 94 * devices found during that search 95 * @W1_CMD_ALARM_SEARCH: search for devices that are currently alarming 96 * @W1_CMD_TOUCH: Touches a series of bytes. 97 * @W1_CMD_RESET: sends a bus reset on the given master 98 * @W1_CMD_SLAVE_ADD: adds a slave to the given master, 99 * 8 byte slave id at data[0] 100 * @W1_CMD_SLAVE_REMOVE: removes a slave to the given master, 101 * 8 byte slave id at data[0] 102 * @W1_CMD_LIST_SLAVES: list of slaves registered on this master 103 * @W1_CMD_MAX: number of available commands 104 */ 105 enum w1_commands { 106 W1_CMD_READ = 0, 107 W1_CMD_WRITE, 108 W1_CMD_SEARCH, 109 W1_CMD_ALARM_SEARCH, 110 W1_CMD_TOUCH, 111 W1_CMD_RESET, 112 W1_CMD_SLAVE_ADD, 113 W1_CMD_SLAVE_REMOVE, 114 W1_CMD_LIST_SLAVES, 115 W1_CMD_MAX 116 }; 117 118 /** 119 * struct w1_netlink_cmd - holds the command and data 120 * 121 * @cmd: one of enum w1_commands 122 * @res: reserved 123 * @len: length of data following w1_netlink_cmd 124 * @data: start address of any following data 125 * 126 * One or more struct w1_netlink_cmd is placed starting at w1_netlink_msg.data 127 * each with optional data. 128 */ 129 struct w1_netlink_cmd 130 { 131 __u8 cmd; 132 __u8 res; 133 __u16 len; 134 __u8 data[0]; 135 }; 136 137 #ifdef __KERNEL__ 138 139 void w1_netlink_send(struct w1_master *, struct w1_netlink_msg *); 140 int w1_init_netlink(void); 141 void w1_fini_netlink(void); 142 143 #endif /* __KERNEL__ */ 144 #endif /* __W1_NETLINK_H */ 145