• Home
  • Raw
  • Download

Lines Matching full:block

50 	struct w1_cb_block *block;  member
58 * @block: block to calculate
64 static u16 w1_reply_len(struct w1_cb_block *block) in w1_reply_len() argument
66 if (!block->cn) in w1_reply_len()
68 return (u8 *)block->cn - (u8 *)block->first_cn + block->cn->len; in w1_reply_len()
71 static void w1_unref_block(struct w1_cb_block *block) in w1_unref_block() argument
73 if (atomic_sub_return(1, &block->refcnt) == 0) { in w1_unref_block()
74 u16 len = w1_reply_len(block); in w1_unref_block()
76 cn_netlink_send_mult(block->first_cn, len, in w1_unref_block()
77 block->portid, 0, GFP_KERNEL); in w1_unref_block()
79 kfree(block); in w1_unref_block()
85 * @block: block to make space on
91 static void w1_reply_make_space(struct w1_cb_block *block, u16 space) in w1_reply_make_space() argument
93 u16 len = w1_reply_len(block); in w1_reply_make_space()
94 if (len + space >= block->maxlen) { in w1_reply_make_space()
95 cn_netlink_send_mult(block->first_cn, len, block->portid, 0, GFP_KERNEL); in w1_reply_make_space()
96 block->first_cn->len = 0; in w1_reply_make_space()
97 block->cn = NULL; in w1_reply_make_space()
98 block->msg = NULL; in w1_reply_make_space()
99 block->cmd = NULL; in w1_reply_make_space()
104 static void w1_netlink_check_send(struct w1_cb_block *block) in w1_netlink_check_send() argument
106 if (!(block->request_cn.flags & W1_CN_BUNDLE) && block->cn) in w1_netlink_check_send()
107 w1_reply_make_space(block, block->maxlen); in w1_netlink_check_send()
111 * w1_netlink_setup_msg() - prepare to write block->msg
112 * @block: block to operate on
115 * block->cn will be setup with the correct ack, advancing if needed
116 * block->cn->len does not include space for block->msg
117 * block->msg advances but remains uninitialized
119 static void w1_netlink_setup_msg(struct w1_cb_block *block, u32 ack) in w1_netlink_setup_msg() argument
121 if (block->cn && block->cn->ack == ack) { in w1_netlink_setup_msg()
122 block->msg = (struct w1_netlink_msg *)(block->cn->data + block->cn->len); in w1_netlink_setup_msg()
125 if (block->cn) in w1_netlink_setup_msg()
126 block->cn = (struct cn_msg *)(block->cn->data + in w1_netlink_setup_msg()
127 block->cn->len); in w1_netlink_setup_msg()
129 block->cn = block->first_cn; in w1_netlink_setup_msg()
131 memcpy(block->cn, &block->request_cn, sizeof(*block->cn)); in w1_netlink_setup_msg()
132 block->cn->len = 0; in w1_netlink_setup_msg()
133 block->cn->ack = ack; in w1_netlink_setup_msg()
134 block->msg = (struct w1_netlink_msg *)block->cn->data; in w1_netlink_setup_msg()
142 static void w1_netlink_queue_cmd(struct w1_cb_block *block, in w1_netlink_queue_cmd() argument
146 w1_reply_make_space(block, sizeof(struct cn_msg) + in w1_netlink_queue_cmd()
153 w1_netlink_setup_msg(block, block->request_cn.seq + 1); in w1_netlink_queue_cmd()
154 memcpy(block->msg, block->cur_msg, sizeof(*block->msg)); in w1_netlink_queue_cmd()
155 block->cn->len += sizeof(*block->msg); in w1_netlink_queue_cmd()
156 block->msg->len = 0; in w1_netlink_queue_cmd()
157 block->cmd = (struct w1_netlink_cmd *)(block->msg->data); in w1_netlink_queue_cmd()
160 if (block->cmd != cmd) in w1_netlink_queue_cmd()
161 memcpy(block->cmd, cmd, space); in w1_netlink_queue_cmd()
162 block->cn->len += space; in w1_netlink_queue_cmd()
163 block->msg->len += space; in w1_netlink_queue_cmd()
169 static void w1_netlink_queue_status(struct w1_cb_block *block, in w1_netlink_queue_status() argument
174 w1_reply_make_space(block, space); in w1_netlink_queue_status()
175 w1_netlink_setup_msg(block, block->request_cn.ack); in w1_netlink_queue_status()
177 memcpy(block->msg, req_msg, sizeof(*req_msg)); in w1_netlink_queue_status()
178 block->cn->len += sizeof(*req_msg); in w1_netlink_queue_status()
179 block->msg->len = 0; in w1_netlink_queue_status()
180 block->msg->status = (u8)-error; in w1_netlink_queue_status()
182 struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)block->msg->data; in w1_netlink_queue_status()
184 block->cn->len += sizeof(*cmd); in w1_netlink_queue_status()
185 block->msg->len += sizeof(*cmd); in w1_netlink_queue_status()
188 w1_netlink_check_send(block); in w1_netlink_queue_status()
198 * Use when a block isn't available to queue the message to and cn, msg
245 struct w1_cb_block *block = dev->priv; in w1_send_slave() local
246 struct w1_netlink_cmd *cache_cmd = block->cmd; in w1_send_slave()
249 w1_reply_make_space(block, sizeof(*data)); in w1_send_slave()
252 if (!block->cmd) { in w1_send_slave()
254 w1_netlink_queue_cmd(block, cache_cmd); in w1_send_slave()
257 data = (u64 *)(block->cmd->data + block->cmd->len); in w1_send_slave()
260 block->cn->len += sizeof(*data); in w1_send_slave()
261 block->msg->len += sizeof(*data); in w1_send_slave()
262 block->cmd->len += sizeof(*data); in w1_send_slave()
462 dev->priv = node->block; in w1_process_cb()
465 node->block->cur_msg = node->msg; in w1_process_cb()
477 w1_netlink_check_send(node->block); in w1_process_cb()
479 w1_netlink_queue_status(node->block, node->msg, cmd, err); in w1_process_cb()
488 w1_netlink_queue_status(node->block, node->msg, cmd, err); in w1_process_cb()
491 * the block in w1_process_cb()
504 w1_unref_block(node->block); in w1_process_cb()
552 struct w1_cb_block *block = NULL; in w1_cn_callback() local
600 /* allocate space for the block, a copy of the original message, in w1_cn_callback()
604 * cn->len doesn't include itself which is part of the block in w1_cn_callback()
606 size = /* block + original message */ in w1_cn_callback()
612 block = kzalloc(size, GFP_KERNEL); in w1_cn_callback()
613 if (!block) { in w1_cn_callback()
621 atomic_set(&block->refcnt, 1); in w1_cn_callback()
622 block->portid = nsp->portid; in w1_cn_callback()
623 memcpy(&block->request_cn, cn, sizeof(*cn) + cn->len); in w1_cn_callback()
624 node = (struct w1_cb_node *)(block->request_cn.data + cn->len); in w1_cn_callback()
635 block->maxlen = reply_size; in w1_cn_callback()
636 block->first_cn = (struct cn_msg *)(node + node_count); in w1_cn_callback()
637 memset(block->first_cn, 0, sizeof(*block->first_cn)); in w1_cn_callback()
687 atomic_inc(&block->refcnt); in w1_cn_callback()
689 node->block = block; in w1_cn_callback()
690 node->msg = (struct w1_netlink_msg *)((u8 *)&block->request_cn + in w1_cn_callback()
702 /* Can't queue because that modifies block and another in w1_cn_callback()
718 if (block) in w1_cn_callback()
719 w1_unref_block(block); in w1_cn_callback()