Lines Matching refs:ipmb_dev

56 struct ipmb_dev {  struct
69 static inline struct ipmb_dev *to_ipmb_dev(struct file *file) in to_ipmb_dev() argument
71 return container_of(file->private_data, struct ipmb_dev, miscdev); in to_ipmb_dev()
77 struct ipmb_dev *ipmb_dev = to_ipmb_dev(file); in ipmb_read() local
84 spin_lock_irq(&ipmb_dev->lock); in ipmb_read()
86 while (list_empty(&ipmb_dev->request_queue)) { in ipmb_read()
87 spin_unlock_irq(&ipmb_dev->lock); in ipmb_read()
92 ret = wait_event_interruptible(ipmb_dev->wait_queue, in ipmb_read()
93 !list_empty(&ipmb_dev->request_queue)); in ipmb_read()
97 spin_lock_irq(&ipmb_dev->lock); in ipmb_read()
100 queue_elem = list_first_entry(&ipmb_dev->request_queue, in ipmb_read()
105 atomic_dec(&ipmb_dev->request_queue_len); in ipmb_read()
107 spin_unlock_irq(&ipmb_dev->lock); in ipmb_read()
138 struct ipmb_dev *ipmb_dev = to_ipmb_dev(file); in ipmb_write() local
157 if (ipmb_dev->is_i2c_protocol) { in ipmb_write()
158 ret = ipmb_i2c_write(ipmb_dev->client, msg, rq_sa); in ipmb_write()
172 ret = i2c_smbus_xfer(ipmb_dev->client->adapter, rq_sa, in ipmb_write()
173 ipmb_dev->client->flags, in ipmb_write()
182 struct ipmb_dev *ipmb_dev = to_ipmb_dev(file); in ipmb_poll() local
185 mutex_lock(&ipmb_dev->file_mutex); in ipmb_poll()
186 poll_wait(file, &ipmb_dev->wait_queue, wait); in ipmb_poll()
188 if (atomic_read(&ipmb_dev->request_queue_len)) in ipmb_poll()
190 mutex_unlock(&ipmb_dev->file_mutex); in ipmb_poll()
203 static void ipmb_handle_request(struct ipmb_dev *ipmb_dev) in ipmb_handle_request() argument
207 if (atomic_read(&ipmb_dev->request_queue_len) >= in ipmb_handle_request()
215 memcpy(&queue_elem->request, &ipmb_dev->request, in ipmb_handle_request()
217 list_add(&queue_elem->list, &ipmb_dev->request_queue); in ipmb_handle_request()
218 atomic_inc(&ipmb_dev->request_queue_len); in ipmb_handle_request()
219 wake_up_all(&ipmb_dev->wait_queue); in ipmb_handle_request()
222 static u8 ipmb_verify_checksum1(struct ipmb_dev *ipmb_dev, u8 rs_sa) in ipmb_verify_checksum1() argument
225 return (rs_sa + ipmb_dev->request.netfn_rs_lun + in ipmb_verify_checksum1()
226 ipmb_dev->request.checksum1); in ipmb_verify_checksum1()
233 static bool is_ipmb_msg(struct ipmb_dev *ipmb_dev, u8 rs_sa) in is_ipmb_msg() argument
235 if ((ipmb_dev->msg_idx >= IPMB_REQUEST_LEN_MIN) && in is_ipmb_msg()
236 (!ipmb_verify_checksum1(ipmb_dev, rs_sa))) in is_ipmb_msg()
252 struct ipmb_dev *ipmb_dev = i2c_get_clientdata(client); in ipmb_slave_cb() local
253 u8 *buf = (u8 *)&ipmb_dev->request; in ipmb_slave_cb()
256 spin_lock_irqsave(&ipmb_dev->lock, flags); in ipmb_slave_cb()
259 memset(&ipmb_dev->request, 0, sizeof(ipmb_dev->request)); in ipmb_slave_cb()
260 ipmb_dev->msg_idx = 0; in ipmb_slave_cb()
278 buf[++ipmb_dev->msg_idx] = GET_8BIT_ADDR(client->addr); in ipmb_slave_cb()
282 if (ipmb_dev->msg_idx >= sizeof(struct ipmb_msg) - 1) in ipmb_slave_cb()
285 buf[++ipmb_dev->msg_idx] = *val; in ipmb_slave_cb()
289 ipmb_dev->request.len = ipmb_dev->msg_idx; in ipmb_slave_cb()
290 if (is_ipmb_msg(ipmb_dev, GET_8BIT_ADDR(client->addr))) in ipmb_slave_cb()
291 ipmb_handle_request(ipmb_dev); in ipmb_slave_cb()
297 spin_unlock_irqrestore(&ipmb_dev->lock, flags); in ipmb_slave_cb()
305 struct ipmb_dev *ipmb_dev; in ipmb_probe() local
308 ipmb_dev = devm_kzalloc(&client->dev, sizeof(*ipmb_dev), in ipmb_probe()
310 if (!ipmb_dev) in ipmb_probe()
313 spin_lock_init(&ipmb_dev->lock); in ipmb_probe()
314 init_waitqueue_head(&ipmb_dev->wait_queue); in ipmb_probe()
315 atomic_set(&ipmb_dev->request_queue_len, 0); in ipmb_probe()
316 INIT_LIST_HEAD(&ipmb_dev->request_queue); in ipmb_probe()
318 mutex_init(&ipmb_dev->file_mutex); in ipmb_probe()
320 ipmb_dev->miscdev.minor = MISC_DYNAMIC_MINOR; in ipmb_probe()
322 ipmb_dev->miscdev.name = devm_kasprintf(&client->dev, GFP_KERNEL, in ipmb_probe()
325 ipmb_dev->miscdev.fops = &ipmb_fops; in ipmb_probe()
326 ipmb_dev->miscdev.parent = &client->dev; in ipmb_probe()
327 ret = misc_register(&ipmb_dev->miscdev); in ipmb_probe()
331 ipmb_dev->is_i2c_protocol in ipmb_probe()
334 ipmb_dev->client = client; in ipmb_probe()
335 i2c_set_clientdata(client, ipmb_dev); in ipmb_probe()
338 misc_deregister(&ipmb_dev->miscdev); in ipmb_probe()
347 struct ipmb_dev *ipmb_dev = i2c_get_clientdata(client); in ipmb_remove() local
350 misc_deregister(&ipmb_dev->miscdev); in ipmb_remove()