mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
w1: optional bundling of netlink kernel replies
Applications can submit a set of commands in one packet to the kernel, and in some cases it is required such as reading the temperature sensor results. This adds an option W1_CN_BUNDLE to the flags of cn_msg to request the kernel to reply in one packet for efficiency. The cn_msg flags now check for unknown flag values and return an error if one is seen. See "Proper handling of unknown flags in system calls" http://lwn.net/Articles/588444/ This corrects the ack values returned as per the protocol standard, namely the original ack for status messages and seq + 1 for all others such as the data returned from a read. Some of the common variable names have been standardized as follows. struct cn_msg *cn struct w1_netlink_msg *msg struct w1_netlink_cmd *cmd struct w1_master *dev When an argument and a function scope variable would collide, add req_ to the argument. Signed-off-by: David Fries <David@Fries.net> Acked-by: Evgeniy Polyakov <zbr@ioremap.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
34470e0bfa
commit
8a0427d192
@@ -118,7 +118,7 @@ acknowledge number MUST be the same + 1.
|
||||
If we receive a message and its sequence number is not equal to one we
|
||||
are expecting, then it is a new message. If we receive a message and
|
||||
its sequence number is the same as one we are expecting, but its
|
||||
acknowledge is not equal to the acknowledge number in the original
|
||||
acknowledge is not equal to the sequence number in the original
|
||||
message + 1, then it is a new message.
|
||||
|
||||
Obviously, the protocol header contains the above id.
|
||||
|
||||
@@ -82,7 +82,7 @@ driver - (standard) symlink to the w1 driver
|
||||
w1_master_add - Manually register a slave device
|
||||
w1_master_attempts - the number of times a search was attempted
|
||||
w1_master_max_slave_count
|
||||
- the maximum slaves that may be attached to a master
|
||||
- maximum number of slaves to search for at a time
|
||||
w1_master_name - the name of the device (w1_bus_masterX)
|
||||
w1_master_pullup - 5V strong pullup 0 enabled, 1 disabled
|
||||
w1_master_remove - Manually remove a slave device
|
||||
|
||||
@@ -30,7 +30,7 @@ Protocol.
|
||||
W1_SLAVE_CMD
|
||||
userspace command for slave device
|
||||
(read/write/touch)
|
||||
__u8 res - reserved
|
||||
__u8 status - error indication from kernel
|
||||
__u16 len - size of data attached to this header data
|
||||
union {
|
||||
__u8 id[8]; - slave unique device id
|
||||
@@ -44,10 +44,14 @@ Protocol.
|
||||
__u8 cmd - command opcode.
|
||||
W1_CMD_READ - read command
|
||||
W1_CMD_WRITE - write command
|
||||
W1_CMD_TOUCH - touch command
|
||||
(write and sample data back to userspace)
|
||||
W1_CMD_SEARCH - search command
|
||||
W1_CMD_ALARM_SEARCH - alarm search command
|
||||
W1_CMD_TOUCH - touch command
|
||||
(write and sample data back to userspace)
|
||||
W1_CMD_RESET - send bus reset
|
||||
W1_CMD_SLAVE_ADD - add slave to kernel list
|
||||
W1_CMD_SLAVE_REMOVE - remove slave from kernel list
|
||||
W1_CMD_LIST_SLAVES - get slaves list from kernel
|
||||
__u8 res - reserved
|
||||
__u16 len - length of data for this command
|
||||
For read command data must be allocated like for write command
|
||||
@@ -87,8 +91,7 @@ format:
|
||||
id0 ... idN
|
||||
|
||||
Each message is at most 4k in size, so if number of master devices
|
||||
exceeds this, it will be split into several messages,
|
||||
cn.seq will be increased for each one.
|
||||
exceeds this, it will be split into several messages.
|
||||
|
||||
W1 search and alarm search commands.
|
||||
request:
|
||||
|
||||
@@ -203,7 +203,6 @@ enum w1_master_flags {
|
||||
* @search_id: allows continuing a search
|
||||
* @refcnt: reference count
|
||||
* @priv: private data storage
|
||||
* @priv_size: size allocated
|
||||
* @enable_pullup: allows a strong pullup
|
||||
* @pullup_duration: time for the next strong pullup
|
||||
* @flags: one of w1_master_flags
|
||||
@@ -214,7 +213,6 @@ enum w1_master_flags {
|
||||
* @dev: sysfs device
|
||||
* @bus_master: io operations available
|
||||
* @seq: sequence number used for netlink broadcasts
|
||||
* @portid: destination for the current netlink command
|
||||
*/
|
||||
struct w1_master
|
||||
{
|
||||
@@ -241,7 +239,6 @@ struct w1_master
|
||||
atomic_t refcnt;
|
||||
|
||||
void *priv;
|
||||
int priv_size;
|
||||
|
||||
/** 5V strong pullup enabled flag, 1 enabled, zero disabled. */
|
||||
int enable_pullup;
|
||||
@@ -260,11 +257,6 @@ struct w1_master
|
||||
struct w1_bus_master *bus_master;
|
||||
|
||||
u32 seq;
|
||||
/* port id to send netlink responses to. The value is temporarily
|
||||
* stored here while processing a message, set after locking the
|
||||
* mutex, zero before unlocking the mutex.
|
||||
*/
|
||||
u32 portid;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
+401
-248
File diff suppressed because it is too large
Load Diff
@@ -27,6 +27,17 @@
|
||||
|
||||
#include "w1.h"
|
||||
|
||||
/**
|
||||
* enum w1_cn_msg_flags - bitfield flags for struct cn_msg.flags
|
||||
*
|
||||
* @W1_CN_BUNDLE: Request bundling replies into fewer messagse. Be prepared
|
||||
* to handle multiple struct cn_msg, struct w1_netlink_msg, and
|
||||
* struct w1_netlink_cmd in one packet.
|
||||
*/
|
||||
enum w1_cn_msg_flags {
|
||||
W1_CN_BUNDLE = 1,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum w1_netlink_message_types - message type
|
||||
*
|
||||
@@ -49,6 +60,19 @@ enum w1_netlink_message_types {
|
||||
W1_LIST_MASTERS,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct w1_netlink_msg - holds w1 message type, id, and result
|
||||
*
|
||||
* @type: one of enum w1_netlink_message_types
|
||||
* @status: kernel feedback for success 0 or errno failure value
|
||||
* @len: length of data following w1_netlink_msg
|
||||
* @id: union holding master bus id (msg.id) and slave device id (id[8]).
|
||||
* @data: start address of any following data
|
||||
*
|
||||
* The base message structure for w1 messages over netlink.
|
||||
* The netlink connector data sequence is, struct nlmsghdr, struct cn_msg,
|
||||
* then one or more struct w1_netlink_msg (each with optional data).
|
||||
*/
|
||||
struct w1_netlink_msg
|
||||
{
|
||||
__u8 type;
|
||||
@@ -66,6 +90,7 @@ struct w1_netlink_msg
|
||||
|
||||
/**
|
||||
* enum w1_commands - commands available for master or slave operations
|
||||
*
|
||||
* @W1_CMD_READ: read len bytes
|
||||
* @W1_CMD_WRITE: write len bytes
|
||||
* @W1_CMD_SEARCH: initiate a standard search, returns only the slave
|
||||
@@ -93,6 +118,17 @@ enum w1_commands {
|
||||
W1_CMD_MAX
|
||||
};
|
||||
|
||||
/**
|
||||
* struct w1_netlink_cmd - holds the command and data
|
||||
*
|
||||
* @cmd: one of enum w1_commands
|
||||
* @res: reserved
|
||||
* @len: length of data following w1_netlink_cmd
|
||||
* @data: start address of any following data
|
||||
*
|
||||
* One or more struct w1_netlink_cmd is placed starting at w1_netlink_msg.data
|
||||
* each with optional data.
|
||||
*/
|
||||
struct w1_netlink_cmd
|
||||
{
|
||||
__u8 cmd;
|
||||
|
||||
Reference in New Issue
Block a user