Lines Matching full:cb
315 * @cb: mei callback struct
317 void mei_io_cb_free(struct mei_cl_cb *cb) in mei_io_cb_free() argument
319 if (cb == NULL) in mei_io_cb_free()
322 list_del(&cb->list); in mei_io_cb_free()
323 kfree(cb->buf.data); in mei_io_cb_free()
324 kfree(cb); in mei_io_cb_free()
332 * @cb: mei callback struct
335 static inline void mei_tx_cb_enqueue(struct mei_cl_cb *cb, in mei_tx_cb_enqueue() argument
338 list_add_tail(&cb->list, head); in mei_tx_cb_enqueue()
339 cb->cl->tx_cb_queued++; in mei_tx_cb_enqueue()
347 * @cb: mei callback struct to dequeue and free
349 static inline void mei_tx_cb_dequeue(struct mei_cl_cb *cb) in mei_tx_cb_dequeue() argument
351 if (!WARN_ON(cb->cl->tx_cb_queued == 0)) in mei_tx_cb_dequeue()
352 cb->cl->tx_cb_queued--; in mei_tx_cb_dequeue()
354 mei_io_cb_free(cb); in mei_tx_cb_dequeue()
391 struct mei_cl_cb *cb; in mei_io_cb_init() local
393 cb = kzalloc(sizeof(*cb), GFP_KERNEL); in mei_io_cb_init()
394 if (!cb) in mei_io_cb_init()
397 INIT_LIST_HEAD(&cb->list); in mei_io_cb_init()
398 cb->fp = fp; in mei_io_cb_init()
399 cb->cl = cl; in mei_io_cb_init()
400 cb->buf_idx = 0; in mei_io_cb_init()
401 cb->fop_type = type; in mei_io_cb_init()
402 cb->vtag = 0; in mei_io_cb_init()
404 return cb; in mei_io_cb_init()
416 struct mei_cl_cb *cb, *next; in mei_io_list_flush_cl() local
418 list_for_each_entry_safe(cb, next, head, list) { in mei_io_list_flush_cl()
419 if (cl == cb->cl) { in mei_io_list_flush_cl()
420 list_del_init(&cb->list); in mei_io_list_flush_cl()
421 if (cb->fop_type == MEI_FOP_READ) in mei_io_list_flush_cl()
422 mei_io_cb_free(cb); in mei_io_list_flush_cl()
428 * mei_io_tx_list_free_cl - removes cb belonging to the cl and free them
432 * @fp: file pointer (matching cb file object), may be NULL
438 struct mei_cl_cb *cb, *next; in mei_io_tx_list_free_cl() local
440 list_for_each_entry_safe(cb, next, head, list) { in mei_io_tx_list_free_cl()
441 if (cl == cb->cl && (!fp || fp == cb->fp)) in mei_io_tx_list_free_cl()
442 mei_tx_cb_dequeue(cb); in mei_io_tx_list_free_cl()
447 * mei_io_list_free_fp - free cb from a list that matches file pointer
450 * @fp: file pointer (matching cb file object), may be NULL
454 struct mei_cl_cb *cb, *next; in mei_io_list_free_fp() local
456 list_for_each_entry_safe(cb, next, head, list) in mei_io_list_free_fp()
457 if (!fp || fp == cb->fp) in mei_io_list_free_fp()
458 mei_io_cb_free(cb); in mei_io_list_free_fp()
462 * mei_cl_free_pending - free pending cb
468 struct mei_cl_cb *cb; in mei_cl_free_pending() local
470 cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list); in mei_cl_free_pending()
471 mei_io_cb_free(cb); in mei_cl_free_pending()
475 * mei_cl_alloc_cb - a convenient wrapper for allocating read cb
482 * Return: cb on success and NULL on failure
488 struct mei_cl_cb *cb; in mei_cl_alloc_cb() local
490 cb = mei_io_cb_init(cl, fop_type, fp); in mei_cl_alloc_cb()
491 if (!cb) in mei_cl_alloc_cb()
495 return cb; in mei_cl_alloc_cb()
497 cb->buf.data = kmalloc(roundup(length, MEI_SLOT_SIZE), GFP_KERNEL); in mei_cl_alloc_cb()
498 if (!cb->buf.data) { in mei_cl_alloc_cb()
499 mei_io_cb_free(cb); in mei_cl_alloc_cb()
502 cb->buf.size = length; in mei_cl_alloc_cb()
504 return cb; in mei_cl_alloc_cb()
509 * and enqueuing of the control commands cb
516 * Return: cb on success and NULL on failure
523 struct mei_cl_cb *cb; in mei_cl_enqueue_ctrl_wr_cb() local
529 cb = mei_cl_alloc_cb(cl, length, fop_type, fp); in mei_cl_enqueue_ctrl_wr_cb()
530 if (!cb) in mei_cl_enqueue_ctrl_wr_cb()
533 list_add_tail(&cb->list, &cl->dev->ctrl_wr_list); in mei_cl_enqueue_ctrl_wr_cb()
534 return cb; in mei_cl_enqueue_ctrl_wr_cb()
542 * @fp: file pointer (matching cb file object), may be NULL
544 * Return: cb on success, NULL if cb is not found
548 struct mei_cl_cb *cb; in mei_cl_read_cb() local
552 list_for_each_entry(cb, &cl->rd_completed, list) in mei_cl_read_cb()
553 if (!fp || fp == cb->fp) { in mei_cl_read_cb()
554 ret_cb = cb; in mei_cl_read_cb()
565 * @fp: file pointer (matching cb file object), may be NULL
581 /* free pending and control cb only in final flush */ in mei_cl_flush_queues()
850 * @cb: callback block
854 static int mei_cl_send_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_disconnect() argument
868 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_send_disconnect()
880 * @cb: callback block.
885 int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_disconnect() argument
901 ret = mei_cl_send_disconnect(cl, cb); in mei_cl_irq_disconnect()
903 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_disconnect()
919 struct mei_cl_cb *cb; in __mei_cl_disconnect() local
926 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DISCONNECT, NULL); in __mei_cl_disconnect()
927 if (!cb) { in __mei_cl_disconnect()
933 rets = mei_cl_send_disconnect(cl, cb); in __mei_cl_disconnect()
960 mei_io_cb_free(cb); in __mei_cl_disconnect()
1027 struct mei_cl_cb *cb; in mei_cl_is_other_connecting() local
1031 list_for_each_entry(cb, &dev->ctrl_rd_list, list) { in mei_cl_is_other_connecting()
1032 if (cb->fop_type == MEI_FOP_CONNECT && in mei_cl_is_other_connecting()
1033 mei_cl_me_id(cl) == mei_cl_me_id(cb->cl)) in mei_cl_is_other_connecting()
1044 * @cb: callback block
1048 static int mei_cl_send_connect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_connect() argument
1062 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_send_connect()
1072 * @cb: callback block
1077 int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_connect() argument
1096 rets = mei_cl_send_connect(cl, cb); in mei_cl_irq_connect()
1098 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_connect()
1118 struct mei_cl_cb *cb; in mei_cl_connect() local
1143 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_CONNECT, fp); in mei_cl_connect()
1144 if (!cb) { in mei_cl_connect()
1151 rets = mei_cl_send_connect(cl, cb); in mei_cl_connect()
1188 mei_io_cb_free(cb); in mei_cl_connect()
1393 * @cb: callback block
1396 void mei_cl_add_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_add_rd_completed() argument
1401 fp = mei_cl_fp_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1404 mei_io_cb_free(cb); in mei_cl_add_rd_completed()
1407 cb->fp = fp; in mei_cl_add_rd_completed()
1408 mei_cl_reset_read_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1413 list_add_tail(&cb->list, &cl->rd_completed); in mei_cl_add_rd_completed()
1421 * @cb: callback block
1424 void mei_cl_del_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_del_rd_completed() argument
1427 mei_io_cb_free(cb); in mei_cl_del_rd_completed()
1465 * @cb: callback block.
1470 int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_notify() argument
1487 request = mei_cl_notify_fop2req(cb->fop_type); in mei_cl_irq_notify()
1491 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_notify()
1495 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_notify()
1514 struct mei_cl_cb *cb; in mei_cl_notify_request() local
1539 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, fop_type, fp); in mei_cl_notify_request()
1540 if (!cb) { in mei_cl_notify_request()
1550 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_notify_request()
1571 mei_io_cb_free(cb); in mei_cl_notify_request()
1666 struct mei_cl_cb *cb; in mei_cl_read_start() local
1691 cb = mei_cl_enqueue_ctrl_wr_cb(cl, length, MEI_FOP_READ, fp); in mei_cl_read_start()
1692 if (!cb) in mei_cl_read_start()
1710 list_move_tail(&cb->list, &cl->rd_pending); in mei_cl_read_start()
1720 mei_io_cb_free(cb); in mei_cl_read_start()
1736 * @cb: message callback structure
1740 static struct mei_msg_hdr *mei_msg_hdr_init(const struct mei_cl_cb *cb) in mei_msg_hdr_init() argument
1748 if (!cb) in mei_msg_hdr_init()
1752 is_vtag = (cb->vtag && cb->buf_idx == 0); in mei_msg_hdr_init()
1770 mei_hdr->host_addr = mei_cl_host_addr(cb->cl); in mei_msg_hdr_init()
1771 mei_hdr->me_addr = mei_cl_me_id(cb->cl); in mei_msg_hdr_init()
1772 mei_hdr->internal = cb->internal; in mei_msg_hdr_init()
1781 meta->size += mei_ext_hdr_set_vtag(meta->hdrs, cb->vtag); in mei_msg_hdr_init()
1793 * @cb: callback block.
1798 int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_write() argument
1820 buf = &cb->buf; in mei_cl_irq_write()
1822 first_chunk = cb->buf_idx == 0; in mei_cl_irq_write()
1833 buf_len = buf->size - cb->buf_idx; in mei_cl_irq_write()
1834 data = buf->data + cb->buf_idx; in mei_cl_irq_write()
1845 mei_hdr = mei_msg_hdr_init(cb); in mei_cl_irq_write()
1853 mei_hdr->extended, cb->vtag); in mei_cl_irq_write()
1884 mei_dma_ring_write(dev, buf->data + cb->buf_idx, buf_len); in mei_cl_irq_write()
1892 cb->buf_idx += buf_len; in mei_cl_irq_write()
1902 list_move_tail(&cb->list, &dev->write_waiting_list); in mei_cl_irq_write()
1910 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_write()
1915 * mei_cl_write - submit a write cb to mei device
1919 * @cb: write callback with filled data
1923 ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_write() argument
1942 if (WARN_ON(!cb)) in mei_cl_write()
1947 buf = &cb->buf; in mei_cl_write()
1952 blocking = cb->blocking; in mei_cl_write()
1962 cb->buf_idx = 0; in mei_cl_write()
1970 mei_hdr = mei_msg_hdr_init(cb); in mei_cl_write()
1978 mei_hdr->extended, cb->vtag); in mei_cl_write()
2036 cb->buf_idx = buf_len; in mei_cl_write()
2042 mei_tx_cb_enqueue(cb, &dev->write_waiting_list); in mei_cl_write()
2044 mei_tx_cb_enqueue(cb, &dev->write_list); in mei_cl_write()
2046 cb = NULL; in mei_cl_write()
2072 mei_io_cb_free(cb); in mei_cl_write()
2083 * @cb: callback block.
2085 void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_complete() argument
2089 switch (cb->fop_type) { in mei_cl_complete()
2091 mei_tx_cb_dequeue(cb); in mei_cl_complete()
2102 mei_cl_add_rd_completed(cl, cb); in mei_cl_complete()
2119 mei_io_cb_free(cb); in mei_cl_complete()