Lines Matching full:cb

294  * @cb: mei callback struct
296 void mei_io_cb_free(struct mei_cl_cb *cb) in mei_io_cb_free() argument
298 if (cb == NULL) in mei_io_cb_free()
301 list_del(&cb->list); in mei_io_cb_free()
302 kvfree(cb->buf.data); in mei_io_cb_free()
303 kfree(cb->ext_hdr); in mei_io_cb_free()
304 kfree(cb); in mei_io_cb_free()
310 * @cb: mei callback struct
315 static inline void mei_tx_cb_enqueue(struct mei_cl_cb *cb, in mei_tx_cb_enqueue() argument
318 list_add_tail(&cb->list, head); in mei_tx_cb_enqueue()
319 cb->cl->tx_cb_queued++; in mei_tx_cb_enqueue()
325 * @cb: mei callback struct to dequeue and free
329 static inline void mei_tx_cb_dequeue(struct mei_cl_cb *cb) in mei_tx_cb_dequeue() argument
331 if (!WARN_ON(cb->cl->tx_cb_queued == 0)) in mei_tx_cb_dequeue()
332 cb->cl->tx_cb_queued--; in mei_tx_cb_dequeue()
334 mei_io_cb_free(cb); in mei_tx_cb_dequeue()
371 struct mei_cl_cb *cb; in mei_io_cb_init() local
373 cb = kzalloc(sizeof(*cb), GFP_KERNEL); in mei_io_cb_init()
374 if (!cb) in mei_io_cb_init()
377 INIT_LIST_HEAD(&cb->list); in mei_io_cb_init()
378 cb->fp = fp; in mei_io_cb_init()
379 cb->cl = cl; in mei_io_cb_init()
380 cb->buf_idx = 0; in mei_io_cb_init()
381 cb->fop_type = type; in mei_io_cb_init()
382 cb->vtag = 0; in mei_io_cb_init()
383 cb->ext_hdr = NULL; in mei_io_cb_init()
385 return cb; in mei_io_cb_init()
397 struct mei_cl_cb *cb, *next; in mei_io_list_flush_cl() local
399 list_for_each_entry_safe(cb, next, head, list) { in mei_io_list_flush_cl()
400 if (cl == cb->cl) { in mei_io_list_flush_cl()
401 list_del_init(&cb->list); in mei_io_list_flush_cl()
402 if (cb->fop_type == MEI_FOP_READ) in mei_io_list_flush_cl()
403 mei_io_cb_free(cb); in mei_io_list_flush_cl()
409 * mei_io_tx_list_free_cl - removes cb belonging to the cl and free them
413 * @fp: file pointer (matching cb file object), may be NULL
419 struct mei_cl_cb *cb, *next; in mei_io_tx_list_free_cl() local
421 list_for_each_entry_safe(cb, next, head, list) { in mei_io_tx_list_free_cl()
422 if (cl == cb->cl && (!fp || fp == cb->fp)) in mei_io_tx_list_free_cl()
423 mei_tx_cb_dequeue(cb); in mei_io_tx_list_free_cl()
428 * mei_io_list_free_fp - free cb from a list that matches file pointer
431 * @fp: file pointer (matching cb file object), may be NULL
435 struct mei_cl_cb *cb, *next; in mei_io_list_free_fp() local
437 list_for_each_entry_safe(cb, next, head, list) in mei_io_list_free_fp()
438 if (!fp || fp == cb->fp) in mei_io_list_free_fp()
439 mei_io_cb_free(cb); in mei_io_list_free_fp()
443 * mei_cl_free_pending - free pending cb
449 struct mei_cl_cb *cb; in mei_cl_free_pending() local
451 cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list); in mei_cl_free_pending()
452 mei_io_cb_free(cb); in mei_cl_free_pending()
456 * mei_cl_alloc_cb - a convenient wrapper for allocating read cb
463 * Return: cb on success and NULL on failure
469 struct mei_cl_cb *cb; in mei_cl_alloc_cb() local
471 cb = mei_io_cb_init(cl, fop_type, fp); in mei_cl_alloc_cb()
472 if (!cb) in mei_cl_alloc_cb()
476 return cb; in mei_cl_alloc_cb()
478 cb->buf.data = kvmalloc(roundup(length, MEI_SLOT_SIZE), GFP_KERNEL); in mei_cl_alloc_cb()
479 if (!cb->buf.data) { in mei_cl_alloc_cb()
480 mei_io_cb_free(cb); in mei_cl_alloc_cb()
483 cb->buf.size = length; in mei_cl_alloc_cb()
485 return cb; in mei_cl_alloc_cb()
490 * and enqueuing of the control commands cb
497 * Return: cb on success and NULL on failure
504 struct mei_cl_cb *cb; in mei_cl_enqueue_ctrl_wr_cb() local
510 cb = mei_cl_alloc_cb(cl, length, fop_type, fp); in mei_cl_enqueue_ctrl_wr_cb()
511 if (!cb) in mei_cl_enqueue_ctrl_wr_cb()
514 list_add_tail(&cb->list, &cl->dev->ctrl_wr_list); in mei_cl_enqueue_ctrl_wr_cb()
515 return cb; in mei_cl_enqueue_ctrl_wr_cb()
523 * @fp: file pointer (matching cb file object), may be NULL
525 * Return: cb on success, NULL if cb is not found
529 struct mei_cl_cb *cb; in mei_cl_read_cb() local
533 list_for_each_entry(cb, &cl->rd_completed, list) in mei_cl_read_cb()
534 if (!fp || fp == cb->fp) { in mei_cl_read_cb()
535 ret_cb = cb; in mei_cl_read_cb()
546 * @fp: file pointer (matching cb file object), may be NULL
562 /* free pending and control cb only in final flush */ in mei_cl_flush_queues()
834 * @cb: callback block
838 static int mei_cl_send_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_disconnect() argument
852 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_send_disconnect()
864 * @cb: callback block.
869 int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_disconnect() argument
885 ret = mei_cl_send_disconnect(cl, cb); in mei_cl_irq_disconnect()
887 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_disconnect()
903 struct mei_cl_cb *cb; in __mei_cl_disconnect() local
910 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DISCONNECT, NULL); in __mei_cl_disconnect()
911 if (!cb) { in __mei_cl_disconnect()
917 rets = mei_cl_send_disconnect(cl, cb); in __mei_cl_disconnect()
944 mei_io_cb_free(cb); in __mei_cl_disconnect()
1012 struct mei_cl_cb *cb; in mei_cl_is_other_connecting() local
1016 list_for_each_entry(cb, &dev->ctrl_rd_list, list) { in mei_cl_is_other_connecting()
1017 if (cb->fop_type == MEI_FOP_CONNECT && in mei_cl_is_other_connecting()
1018 mei_cl_me_id(cl) == mei_cl_me_id(cb->cl)) in mei_cl_is_other_connecting()
1029 * @cb: callback block
1033 static int mei_cl_send_connect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_connect() argument
1047 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_send_connect()
1057 * @cb: callback block
1062 int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_connect() argument
1081 rets = mei_cl_send_connect(cl, cb); in mei_cl_irq_connect()
1083 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_connect()
1103 struct mei_cl_cb *cb; in mei_cl_connect() local
1128 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_CONNECT, fp); in mei_cl_connect()
1129 if (!cb) { in mei_cl_connect()
1136 rets = mei_cl_send_connect(cl, cb); in mei_cl_connect()
1173 mei_io_cb_free(cb); in mei_cl_connect()
1382 * @cb: callback block
1385 void mei_cl_add_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_add_rd_completed() argument
1390 fp = mei_cl_fp_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1393 mei_io_cb_free(cb); in mei_cl_add_rd_completed()
1396 cb->fp = fp; in mei_cl_add_rd_completed()
1397 mei_cl_reset_read_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1402 list_add_tail(&cb->list, &cl->rd_completed); in mei_cl_add_rd_completed()
1410 * @cb: callback block
1413 void mei_cl_del_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_del_rd_completed() argument
1416 mei_io_cb_free(cb); in mei_cl_del_rd_completed()
1454 * @cb: callback block.
1459 int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_notify() argument
1476 request = mei_cl_notify_fop2req(cb->fop_type); in mei_cl_irq_notify()
1480 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_notify()
1484 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_notify()
1503 struct mei_cl_cb *cb; in mei_cl_notify_request() local
1528 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, fop_type, fp); in mei_cl_notify_request()
1529 if (!cb) { in mei_cl_notify_request()
1539 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_notify_request()
1560 mei_io_cb_free(cb); in mei_cl_notify_request()
1655 struct mei_cl_cb *cb; in mei_cl_read_start() local
1680 cb = mei_cl_enqueue_ctrl_wr_cb(cl, length, MEI_FOP_READ, fp); in mei_cl_read_start()
1681 if (!cb) in mei_cl_read_start()
1699 list_move_tail(&cb->list, &cl->rd_pending); in mei_cl_read_start()
1709 mei_io_cb_free(cb); in mei_cl_read_start()
1739 * @cb: message callback structure
1743 static struct mei_msg_hdr *mei_msg_hdr_init(const struct mei_cl_cb *cb) in mei_msg_hdr_init() argument
1751 if (!cb) in mei_msg_hdr_init()
1755 is_vtag = (cb->vtag && cb->buf_idx == 0); in mei_msg_hdr_init()
1756 is_hbm = cb->cl->me_cl->client_id == 0; in mei_msg_hdr_init()
1757 is_gsc = ((!is_hbm) && cb->cl->dev->hbm_f_gsc_supported && mei_ext_hdr_is_gsc(cb->ext_hdr)); in mei_msg_hdr_init()
1771 hdr_len += mei_ext_hdr_len(cb->ext_hdr); in mei_msg_hdr_init()
1778 mei_hdr->host_addr = mei_cl_host_addr(cb->cl); in mei_msg_hdr_init()
1779 mei_hdr->me_addr = mei_cl_me_id(cb->cl); in mei_msg_hdr_init()
1780 mei_hdr->internal = cb->internal; in mei_msg_hdr_init()
1791 meta->size += mei_ext_hdr_set_vtag(next_ext, cb->vtag); in mei_msg_hdr_init()
1797 meta->size += mei_ext_hdr_set_gsc(next_ext, cb->ext_hdr); in mei_msg_hdr_init()
1811 * @cb: callback block.
1816 int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_write() argument
1838 buf = &cb->buf; in mei_cl_irq_write()
1840 first_chunk = cb->buf_idx == 0; in mei_cl_irq_write()
1852 buf_len = buf->size - cb->buf_idx; in mei_cl_irq_write()
1853 data = buf->data + cb->buf_idx; in mei_cl_irq_write()
1865 mei_hdr = mei_msg_hdr_init(cb); in mei_cl_irq_write()
1901 mei_dma_ring_write(dev, buf->data + cb->buf_idx, buf_len); in mei_cl_irq_write()
1909 cb->buf_idx += buf_len; in mei_cl_irq_write()
1919 list_move_tail(&cb->list, &dev->write_waiting_list); in mei_cl_irq_write()
1927 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_write()
1932 * mei_cl_write - submit a write cb to mei device
1936 * @cb: write callback with filled data
1938 * effective only for blocking writes: the cb->blocking is set.
1943 ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, unsigned long timeout) in mei_cl_write() argument
1962 if (WARN_ON(!cb)) in mei_cl_write()
1967 buf = &cb->buf; in mei_cl_write()
1972 blocking = cb->blocking; in mei_cl_write()
1982 cb->buf_idx = 0; in mei_cl_write()
1990 mei_hdr = mei_msg_hdr_init(cb); in mei_cl_write()
2053 cb->buf_idx = buf_len; in mei_cl_write()
2059 mei_tx_cb_enqueue(cb, &dev->write_waiting_list); in mei_cl_write()
2061 mei_tx_cb_enqueue(cb, &dev->write_list); in mei_cl_write()
2063 cb = NULL; in mei_cl_write()
2098 mei_io_cb_free(cb); in mei_cl_write()
2109 * @cb: callback block.
2111 void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_complete() argument
2115 switch (cb->fop_type) { in mei_cl_complete()
2117 mei_tx_cb_dequeue(cb); in mei_cl_complete()
2128 mei_cl_add_rd_completed(cl, cb); in mei_cl_complete()
2147 mei_io_cb_free(cb); in mei_cl_complete()
2184 * @cb: callback block.
2189 int mei_cl_irq_dma_map(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_dma_map() argument
2208 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_dma_map()
2212 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_dma_map()
2220 * @cb: callback block.
2225 int mei_cl_irq_dma_unmap(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_dma_unmap() argument
2244 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_dma_unmap()
2248 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_dma_unmap()
2296 struct mei_cl_cb *cb; in mei_cl_dma_alloc_and_map() local
2337 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DMA_MAP, fp); in mei_cl_dma_alloc_and_map()
2338 if (!cb) { in mei_cl_dma_alloc_and_map()
2348 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_dma_alloc_and_map()
2372 mei_io_cb_free(cb); in mei_cl_dma_alloc_and_map()
2389 struct mei_cl_cb *cb; in mei_cl_dma_unmap() local
2416 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DMA_UNMAP, fp); in mei_cl_dma_unmap()
2417 if (!cb) { in mei_cl_dma_unmap()
2427 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_dma_unmap()
2450 mei_io_cb_free(cb); in mei_cl_dma_unmap()