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()
833 * @cb: callback block
837 static int mei_cl_send_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_disconnect() argument
851 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_send_disconnect()
863 * @cb: callback block.
868 int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_disconnect() argument
884 ret = mei_cl_send_disconnect(cl, cb); in mei_cl_irq_disconnect()
886 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_disconnect()
902 struct mei_cl_cb *cb; in __mei_cl_disconnect() local
909 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DISCONNECT, NULL); in __mei_cl_disconnect()
910 if (!cb) { in __mei_cl_disconnect()
916 rets = mei_cl_send_disconnect(cl, cb); in __mei_cl_disconnect()
943 mei_io_cb_free(cb); in __mei_cl_disconnect()
1010 struct mei_cl_cb *cb; in mei_cl_is_other_connecting() local
1014 list_for_each_entry(cb, &dev->ctrl_rd_list, list) { in mei_cl_is_other_connecting()
1015 if (cb->fop_type == MEI_FOP_CONNECT && in mei_cl_is_other_connecting()
1016 mei_cl_me_id(cl) == mei_cl_me_id(cb->cl)) in mei_cl_is_other_connecting()
1027 * @cb: callback block
1031 static int mei_cl_send_connect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_connect() argument
1045 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_send_connect()
1055 * @cb: callback block
1060 int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_connect() argument
1079 rets = mei_cl_send_connect(cl, cb); in mei_cl_irq_connect()
1081 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_connect()
1101 struct mei_cl_cb *cb; in mei_cl_connect() local
1126 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_CONNECT, fp); in mei_cl_connect()
1127 if (!cb) { in mei_cl_connect()
1134 rets = mei_cl_send_connect(cl, cb); in mei_cl_connect()
1170 mei_io_cb_free(cb); in mei_cl_connect()
1379 * @cb: callback block
1382 void mei_cl_add_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_add_rd_completed() argument
1387 fp = mei_cl_fp_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1390 mei_io_cb_free(cb); in mei_cl_add_rd_completed()
1393 cb->fp = fp; in mei_cl_add_rd_completed()
1394 mei_cl_reset_read_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1399 list_add_tail(&cb->list, &cl->rd_completed); in mei_cl_add_rd_completed()
1407 * @cb: callback block
1410 void mei_cl_del_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_del_rd_completed() argument
1413 mei_io_cb_free(cb); in mei_cl_del_rd_completed()
1451 * @cb: callback block.
1456 int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_notify() argument
1473 request = mei_cl_notify_fop2req(cb->fop_type); in mei_cl_irq_notify()
1477 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_notify()
1481 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_notify()
1500 struct mei_cl_cb *cb; in mei_cl_notify_request() local
1525 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, fop_type, fp); in mei_cl_notify_request()
1526 if (!cb) { in mei_cl_notify_request()
1536 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_notify_request()
1556 mei_io_cb_free(cb); in mei_cl_notify_request()
1651 struct mei_cl_cb *cb; in mei_cl_read_start() local
1676 cb = mei_cl_enqueue_ctrl_wr_cb(cl, length, MEI_FOP_READ, fp); in mei_cl_read_start()
1677 if (!cb) in mei_cl_read_start()
1695 list_move_tail(&cb->list, &cl->rd_pending); in mei_cl_read_start()
1704 mei_io_cb_free(cb); in mei_cl_read_start()
1734 * @cb: message callback structure
1738 static struct mei_msg_hdr *mei_msg_hdr_init(const struct mei_cl_cb *cb) in mei_msg_hdr_init() argument
1746 if (!cb) in mei_msg_hdr_init()
1750 is_vtag = (cb->vtag && cb->buf_idx == 0); in mei_msg_hdr_init()
1751 is_hbm = cb->cl->me_cl->client_id == 0; in mei_msg_hdr_init()
1752 is_gsc = ((!is_hbm) && cb->cl->dev->hbm_f_gsc_supported && mei_ext_hdr_is_gsc(cb->ext_hdr)); in mei_msg_hdr_init()
1766 hdr_len += mei_ext_hdr_len(cb->ext_hdr); in mei_msg_hdr_init()
1773 mei_hdr->host_addr = mei_cl_host_addr(cb->cl); in mei_msg_hdr_init()
1774 mei_hdr->me_addr = mei_cl_me_id(cb->cl); in mei_msg_hdr_init()
1775 mei_hdr->internal = cb->internal; in mei_msg_hdr_init()
1786 meta->size += mei_ext_hdr_set_vtag(next_ext, cb->vtag); in mei_msg_hdr_init()
1792 meta->size += mei_ext_hdr_set_gsc(next_ext, cb->ext_hdr); in mei_msg_hdr_init()
1806 * @cb: callback block.
1811 int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_write() argument
1833 buf = &cb->buf; in mei_cl_irq_write()
1835 first_chunk = cb->buf_idx == 0; in mei_cl_irq_write()
1847 buf_len = buf->size - cb->buf_idx; in mei_cl_irq_write()
1848 data = buf->data + cb->buf_idx; in mei_cl_irq_write()
1860 mei_hdr = mei_msg_hdr_init(cb); in mei_cl_irq_write()
1896 mei_dma_ring_write(dev, buf->data + cb->buf_idx, buf_len); in mei_cl_irq_write()
1904 cb->buf_idx += buf_len; in mei_cl_irq_write()
1914 list_move_tail(&cb->list, &dev->write_waiting_list); in mei_cl_irq_write()
1922 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_write()
1927 * mei_cl_write - submit a write cb to mei device
1931 * @cb: write callback with filled data
1933 * effective only for blocking writes: the cb->blocking is set.
1938 ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb, unsigned long timeout) in mei_cl_write() argument
1957 if (WARN_ON(!cb)) in mei_cl_write()
1962 buf = &cb->buf; in mei_cl_write()
1967 blocking = cb->blocking; in mei_cl_write()
1977 cb->buf_idx = 0; in mei_cl_write()
1985 mei_hdr = mei_msg_hdr_init(cb); in mei_cl_write()
2048 cb->buf_idx = buf_len; in mei_cl_write()
2054 mei_tx_cb_enqueue(cb, &dev->write_waiting_list); in mei_cl_write()
2056 mei_tx_cb_enqueue(cb, &dev->write_list); in mei_cl_write()
2058 cb = NULL; in mei_cl_write()
2092 mei_io_cb_free(cb); in mei_cl_write()
2103 * @cb: callback block.
2105 void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_complete() argument
2109 switch (cb->fop_type) { in mei_cl_complete()
2111 mei_tx_cb_dequeue(cb); in mei_cl_complete()
2120 mei_cl_add_rd_completed(cl, cb); in mei_cl_complete()
2139 mei_io_cb_free(cb); in mei_cl_complete()
2176 * @cb: callback block.
2181 int mei_cl_irq_dma_map(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_dma_map() argument
2200 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_dma_map()
2204 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_dma_map()
2212 * @cb: callback block.
2217 int mei_cl_irq_dma_unmap(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_dma_unmap() argument
2236 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_dma_unmap()
2240 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_dma_unmap()
2288 struct mei_cl_cb *cb; in mei_cl_dma_alloc_and_map() local
2329 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DMA_MAP, fp); in mei_cl_dma_alloc_and_map()
2330 if (!cb) { in mei_cl_dma_alloc_and_map()
2340 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_dma_alloc_and_map()
2363 mei_io_cb_free(cb); in mei_cl_dma_alloc_and_map()
2380 struct mei_cl_cb *cb; in mei_cl_dma_unmap() local
2407 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DMA_UNMAP, fp); in mei_cl_dma_unmap()
2408 if (!cb) { in mei_cl_dma_unmap()
2418 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_dma_unmap()
2440 mei_io_cb_free(cb); in mei_cl_dma_unmap()