• Home
  • Raw
  • Download

Lines Matching refs:block

60 	struct w1_cb_block *block;  member
74 static u16 w1_reply_len(struct w1_cb_block *block) in w1_reply_len() argument
76 if (!block->cn) in w1_reply_len()
78 return (u8 *)block->cn - (u8 *)block->first_cn + block->cn->len; in w1_reply_len()
81 static void w1_unref_block(struct w1_cb_block *block) in w1_unref_block() argument
83 if (atomic_sub_return(1, &block->refcnt) == 0) { in w1_unref_block()
84 u16 len = w1_reply_len(block); in w1_unref_block()
86 cn_netlink_send_mult(block->first_cn, len, in w1_unref_block()
87 block->portid, 0, GFP_KERNEL); in w1_unref_block()
89 kfree(block); in w1_unref_block()
101 static void w1_reply_make_space(struct w1_cb_block *block, u16 space) in w1_reply_make_space() argument
103 u16 len = w1_reply_len(block); in w1_reply_make_space()
104 if (len + space >= block->maxlen) { in w1_reply_make_space()
105 cn_netlink_send_mult(block->first_cn, len, block->portid, 0, GFP_KERNEL); in w1_reply_make_space()
106 block->first_cn->len = 0; in w1_reply_make_space()
107 block->cn = NULL; in w1_reply_make_space()
108 block->msg = NULL; in w1_reply_make_space()
109 block->cmd = NULL; in w1_reply_make_space()
114 static void w1_netlink_check_send(struct w1_cb_block *block) in w1_netlink_check_send() argument
116 if (!(block->request_cn.flags & W1_CN_BUNDLE) && block->cn) in w1_netlink_check_send()
117 w1_reply_make_space(block, block->maxlen); in w1_netlink_check_send()
129 static void w1_netlink_setup_msg(struct w1_cb_block *block, u32 ack) in w1_netlink_setup_msg() argument
131 if (block->cn && block->cn->ack == ack) { in w1_netlink_setup_msg()
132 block->msg = (struct w1_netlink_msg *)(block->cn->data + block->cn->len); in w1_netlink_setup_msg()
135 if (block->cn) in w1_netlink_setup_msg()
136 block->cn = (struct cn_msg *)(block->cn->data + in w1_netlink_setup_msg()
137 block->cn->len); in w1_netlink_setup_msg()
139 block->cn = block->first_cn; in w1_netlink_setup_msg()
141 memcpy(block->cn, &block->request_cn, sizeof(*block->cn)); in w1_netlink_setup_msg()
142 block->cn->len = 0; in w1_netlink_setup_msg()
143 block->cn->ack = ack; in w1_netlink_setup_msg()
144 block->msg = (struct w1_netlink_msg *)block->cn->data; in w1_netlink_setup_msg()
152 static void w1_netlink_queue_cmd(struct w1_cb_block *block, in w1_netlink_queue_cmd() argument
156 w1_reply_make_space(block, sizeof(struct cn_msg) + in w1_netlink_queue_cmd()
163 w1_netlink_setup_msg(block, block->request_cn.seq + 1); in w1_netlink_queue_cmd()
164 memcpy(block->msg, block->cur_msg, sizeof(*block->msg)); in w1_netlink_queue_cmd()
165 block->cn->len += sizeof(*block->msg); in w1_netlink_queue_cmd()
166 block->msg->len = 0; in w1_netlink_queue_cmd()
167 block->cmd = (struct w1_netlink_cmd *)(block->msg->data); in w1_netlink_queue_cmd()
170 if (block->cmd != cmd) in w1_netlink_queue_cmd()
171 memcpy(block->cmd, cmd, space); in w1_netlink_queue_cmd()
172 block->cn->len += space; in w1_netlink_queue_cmd()
173 block->msg->len += space; in w1_netlink_queue_cmd()
179 static void w1_netlink_queue_status(struct w1_cb_block *block, in w1_netlink_queue_status() argument
184 w1_reply_make_space(block, space); in w1_netlink_queue_status()
185 w1_netlink_setup_msg(block, block->request_cn.ack); in w1_netlink_queue_status()
187 memcpy(block->msg, req_msg, sizeof(*req_msg)); in w1_netlink_queue_status()
188 block->cn->len += sizeof(*req_msg); in w1_netlink_queue_status()
189 block->msg->len = 0; in w1_netlink_queue_status()
190 block->msg->status = (u8)-error; in w1_netlink_queue_status()
192 struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)block->msg->data; in w1_netlink_queue_status()
194 block->cn->len += sizeof(*cmd); in w1_netlink_queue_status()
195 block->msg->len += sizeof(*cmd); in w1_netlink_queue_status()
198 w1_netlink_check_send(block); in w1_netlink_queue_status()
255 struct w1_cb_block *block = dev->priv; in w1_send_slave() local
256 struct w1_netlink_cmd *cache_cmd = block->cmd; in w1_send_slave()
259 w1_reply_make_space(block, sizeof(*data)); in w1_send_slave()
262 if (!block->cmd) { in w1_send_slave()
264 w1_netlink_queue_cmd(block, cache_cmd); in w1_send_slave()
267 data = (u64 *)(block->cmd->data + block->cmd->len); in w1_send_slave()
270 block->cn->len += sizeof(*data); in w1_send_slave()
271 block->msg->len += sizeof(*data); in w1_send_slave()
272 block->cmd->len += sizeof(*data); in w1_send_slave()
472 dev->priv = node->block; in w1_process_cb()
475 node->block->cur_msg = node->msg; in w1_process_cb()
487 w1_netlink_check_send(node->block); in w1_process_cb()
489 w1_netlink_queue_status(node->block, node->msg, cmd, err); in w1_process_cb()
498 w1_netlink_queue_status(node->block, node->msg, cmd, err); in w1_process_cb()
514 w1_unref_block(node->block); in w1_process_cb()
562 struct w1_cb_block *block = NULL; in w1_cn_callback() local
622 block = kzalloc(size, GFP_KERNEL); in w1_cn_callback()
623 if (!block) { in w1_cn_callback()
631 atomic_set(&block->refcnt, 1); in w1_cn_callback()
632 block->portid = nsp->portid; in w1_cn_callback()
633 memcpy(&block->request_cn, cn, sizeof(*cn) + cn->len); in w1_cn_callback()
634 node = (struct w1_cb_node *)(block->request_cn.data + cn->len); in w1_cn_callback()
645 block->maxlen = reply_size; in w1_cn_callback()
646 block->first_cn = (struct cn_msg *)(node + node_count); in w1_cn_callback()
647 memset(block->first_cn, 0, sizeof(*block->first_cn)); in w1_cn_callback()
697 atomic_inc(&block->refcnt); in w1_cn_callback()
699 node->block = block; in w1_cn_callback()
700 node->msg = (struct w1_netlink_msg *)((u8 *)&block->request_cn + in w1_cn_callback()
728 if (block) in w1_cn_callback()
729 w1_unref_block(block); in w1_cn_callback()