Lines Matching refs:cb

318 void mei_io_cb_free(struct mei_cl_cb *cb)  in mei_io_cb_free()  argument
320 if (cb == NULL) in mei_io_cb_free()
323 list_del(&cb->list); in mei_io_cb_free()
324 kfree(cb->buf.data); in mei_io_cb_free()
325 kfree(cb); in mei_io_cb_free()
336 static inline void mei_tx_cb_enqueue(struct mei_cl_cb *cb, in mei_tx_cb_enqueue() argument
339 list_add_tail(&cb->list, head); in mei_tx_cb_enqueue()
340 cb->cl->tx_cb_queued++; in mei_tx_cb_enqueue()
350 static inline void mei_tx_cb_dequeue(struct mei_cl_cb *cb) in mei_tx_cb_dequeue() argument
352 if (!WARN_ON(cb->cl->tx_cb_queued == 0)) in mei_tx_cb_dequeue()
353 cb->cl->tx_cb_queued--; in mei_tx_cb_dequeue()
355 mei_io_cb_free(cb); in mei_tx_cb_dequeue()
392 struct mei_cl_cb *cb; in mei_io_cb_init() local
394 cb = kzalloc(sizeof(*cb), GFP_KERNEL); in mei_io_cb_init()
395 if (!cb) in mei_io_cb_init()
398 INIT_LIST_HEAD(&cb->list); in mei_io_cb_init()
399 cb->fp = fp; in mei_io_cb_init()
400 cb->cl = cl; in mei_io_cb_init()
401 cb->buf_idx = 0; in mei_io_cb_init()
402 cb->fop_type = type; in mei_io_cb_init()
403 cb->vtag = 0; in mei_io_cb_init()
405 return cb; in mei_io_cb_init()
417 struct mei_cl_cb *cb, *next; in mei_io_list_flush_cl() local
419 list_for_each_entry_safe(cb, next, head, list) { in mei_io_list_flush_cl()
420 if (cl == cb->cl) { in mei_io_list_flush_cl()
421 list_del_init(&cb->list); in mei_io_list_flush_cl()
422 if (cb->fop_type == MEI_FOP_READ) in mei_io_list_flush_cl()
423 mei_io_cb_free(cb); in mei_io_list_flush_cl()
439 struct mei_cl_cb *cb, *next; in mei_io_tx_list_free_cl() local
441 list_for_each_entry_safe(cb, next, head, list) { in mei_io_tx_list_free_cl()
442 if (cl == cb->cl && (!fp || fp == cb->fp)) in mei_io_tx_list_free_cl()
443 mei_tx_cb_dequeue(cb); in mei_io_tx_list_free_cl()
455 struct mei_cl_cb *cb, *next; in mei_io_list_free_fp() local
457 list_for_each_entry_safe(cb, next, head, list) in mei_io_list_free_fp()
458 if (!fp || fp == cb->fp) in mei_io_list_free_fp()
459 mei_io_cb_free(cb); in mei_io_list_free_fp()
469 struct mei_cl_cb *cb; in mei_cl_free_pending() local
471 cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list); in mei_cl_free_pending()
472 mei_io_cb_free(cb); in mei_cl_free_pending()
489 struct mei_cl_cb *cb; in mei_cl_alloc_cb() local
491 cb = mei_io_cb_init(cl, fop_type, fp); in mei_cl_alloc_cb()
492 if (!cb) in mei_cl_alloc_cb()
496 return cb; in mei_cl_alloc_cb()
498 cb->buf.data = kmalloc(roundup(length, MEI_SLOT_SIZE), GFP_KERNEL); in mei_cl_alloc_cb()
499 if (!cb->buf.data) { in mei_cl_alloc_cb()
500 mei_io_cb_free(cb); in mei_cl_alloc_cb()
503 cb->buf.size = length; in mei_cl_alloc_cb()
505 return cb; in mei_cl_alloc_cb()
524 struct mei_cl_cb *cb; in mei_cl_enqueue_ctrl_wr_cb() local
530 cb = mei_cl_alloc_cb(cl, length, fop_type, fp); in mei_cl_enqueue_ctrl_wr_cb()
531 if (!cb) in mei_cl_enqueue_ctrl_wr_cb()
534 list_add_tail(&cb->list, &cl->dev->ctrl_wr_list); in mei_cl_enqueue_ctrl_wr_cb()
535 return cb; in mei_cl_enqueue_ctrl_wr_cb()
549 struct mei_cl_cb *cb; in mei_cl_read_cb() local
553 list_for_each_entry(cb, &cl->rd_completed, list) in mei_cl_read_cb()
554 if (!fp || fp == cb->fp) { in mei_cl_read_cb()
555 ret_cb = cb; in mei_cl_read_cb()
855 static int mei_cl_send_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_disconnect() argument
869 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_send_disconnect()
886 int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_disconnect() argument
902 ret = mei_cl_send_disconnect(cl, cb); in mei_cl_irq_disconnect()
904 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_disconnect()
920 struct mei_cl_cb *cb; in __mei_cl_disconnect() local
927 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DISCONNECT, NULL); in __mei_cl_disconnect()
928 if (!cb) { in __mei_cl_disconnect()
934 rets = mei_cl_send_disconnect(cl, cb); in __mei_cl_disconnect()
961 mei_io_cb_free(cb); in __mei_cl_disconnect()
1029 struct mei_cl_cb *cb; in mei_cl_is_other_connecting() local
1033 list_for_each_entry(cb, &dev->ctrl_rd_list, list) { in mei_cl_is_other_connecting()
1034 if (cb->fop_type == MEI_FOP_CONNECT && in mei_cl_is_other_connecting()
1035 mei_cl_me_id(cl) == mei_cl_me_id(cb->cl)) in mei_cl_is_other_connecting()
1050 static int mei_cl_send_connect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_connect() argument
1064 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_send_connect()
1079 int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_connect() argument
1098 rets = mei_cl_send_connect(cl, cb); in mei_cl_irq_connect()
1100 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_connect()
1120 struct mei_cl_cb *cb; in mei_cl_connect() local
1145 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_CONNECT, fp); in mei_cl_connect()
1146 if (!cb) { in mei_cl_connect()
1153 rets = mei_cl_send_connect(cl, cb); in mei_cl_connect()
1190 mei_io_cb_free(cb); in mei_cl_connect()
1400 void mei_cl_add_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_add_rd_completed() argument
1405 fp = mei_cl_fp_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1408 mei_io_cb_free(cb); in mei_cl_add_rd_completed()
1411 cb->fp = fp; in mei_cl_add_rd_completed()
1412 mei_cl_reset_read_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1417 list_add_tail(&cb->list, &cl->rd_completed); in mei_cl_add_rd_completed()
1428 void mei_cl_del_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_del_rd_completed() argument
1431 mei_io_cb_free(cb); in mei_cl_del_rd_completed()
1474 int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_notify() argument
1491 request = mei_cl_notify_fop2req(cb->fop_type); in mei_cl_irq_notify()
1495 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_notify()
1499 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_notify()
1518 struct mei_cl_cb *cb; in mei_cl_notify_request() local
1543 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, fop_type, fp); in mei_cl_notify_request()
1544 if (!cb) { in mei_cl_notify_request()
1554 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_notify_request()
1575 mei_io_cb_free(cb); in mei_cl_notify_request()
1670 struct mei_cl_cb *cb; in mei_cl_read_start() local
1695 cb = mei_cl_enqueue_ctrl_wr_cb(cl, length, MEI_FOP_READ, fp); in mei_cl_read_start()
1696 if (!cb) in mei_cl_read_start()
1714 list_move_tail(&cb->list, &cl->rd_pending); in mei_cl_read_start()
1724 mei_io_cb_free(cb); in mei_cl_read_start()
1747 static struct mei_msg_hdr *mei_msg_hdr_init(const struct mei_cl_cb *cb) in mei_msg_hdr_init() argument
1754 if (!cb) in mei_msg_hdr_init()
1758 is_vtag = (cb->vtag && cb->buf_idx == 0); in mei_msg_hdr_init()
1776 mei_hdr->host_addr = mei_cl_host_addr(cb->cl); in mei_msg_hdr_init()
1777 mei_hdr->me_addr = mei_cl_me_id(cb->cl); in mei_msg_hdr_init()
1778 mei_hdr->internal = cb->internal; in mei_msg_hdr_init()
1787 meta->size += mei_ext_hdr_set_vtag(meta->hdrs, cb->vtag); in mei_msg_hdr_init()
1804 int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_write() argument
1826 buf = &cb->buf; in mei_cl_irq_write()
1828 first_chunk = cb->buf_idx == 0; in mei_cl_irq_write()
1839 buf_len = buf->size - cb->buf_idx; in mei_cl_irq_write()
1840 data = buf->data + cb->buf_idx; in mei_cl_irq_write()
1851 mei_hdr = mei_msg_hdr_init(cb); in mei_cl_irq_write()
1859 mei_hdr->extended, cb->vtag); in mei_cl_irq_write()
1890 mei_dma_ring_write(dev, buf->data + cb->buf_idx, buf_len); in mei_cl_irq_write()
1898 cb->buf_idx += buf_len; in mei_cl_irq_write()
1908 list_move_tail(&cb->list, &dev->write_waiting_list); in mei_cl_irq_write()
1916 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_write()
1929 ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_write() argument
1948 if (WARN_ON(!cb)) in mei_cl_write()
1953 buf = &cb->buf; in mei_cl_write()
1958 blocking = cb->blocking; in mei_cl_write()
1968 cb->buf_idx = 0; in mei_cl_write()
1976 mei_hdr = mei_msg_hdr_init(cb); in mei_cl_write()
1984 mei_hdr->extended, cb->vtag); in mei_cl_write()
2042 cb->buf_idx = buf_len; in mei_cl_write()
2048 mei_tx_cb_enqueue(cb, &dev->write_waiting_list); in mei_cl_write()
2050 mei_tx_cb_enqueue(cb, &dev->write_list); in mei_cl_write()
2052 cb = NULL; in mei_cl_write()
2078 mei_io_cb_free(cb); in mei_cl_write()
2091 void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_complete() argument
2095 switch (cb->fop_type) { in mei_cl_complete()
2097 mei_tx_cb_dequeue(cb); in mei_cl_complete()
2108 mei_cl_add_rd_completed(cl, cb); in mei_cl_complete()
2127 mei_io_cb_free(cb); in mei_cl_complete()
2168 int mei_cl_irq_dma_map(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_dma_map() argument
2187 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_dma_map()
2191 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_dma_map()
2204 int mei_cl_irq_dma_unmap(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_dma_unmap() argument
2223 list_move_tail(&cb->list, cmpl_list); in mei_cl_irq_dma_unmap()
2227 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_irq_dma_unmap()
2275 struct mei_cl_cb *cb; in mei_cl_dma_alloc_and_map() local
2316 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DMA_MAP, fp); in mei_cl_dma_alloc_and_map()
2317 if (!cb) { in mei_cl_dma_alloc_and_map()
2327 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_dma_alloc_and_map()
2349 mei_io_cb_free(cb); in mei_cl_dma_alloc_and_map()
2366 struct mei_cl_cb *cb; in mei_cl_dma_unmap() local
2393 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DMA_UNMAP, fp); in mei_cl_dma_unmap()
2394 if (!cb) { in mei_cl_dma_unmap()
2404 list_move_tail(&cb->list, &dev->ctrl_rd_list); in mei_cl_dma_unmap()
2425 mei_io_cb_free(cb); in mei_cl_dma_unmap()