Lines Matching refs:cl
339 cb->cl->tx_cb_queued++; in mei_tx_cb_enqueue()
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()
365 static void mei_cl_set_read_by_fp(const struct mei_cl *cl, in mei_cl_set_read_by_fp() argument
370 list_for_each_entry(cl_vtag, &cl->vtag_map, list) { in mei_cl_set_read_by_fp()
387 static struct mei_cl_cb *mei_io_cb_init(struct mei_cl *cl, in mei_io_cb_init() argument
399 cb->cl = cl; in mei_io_cb_init()
414 const struct mei_cl *cl) in mei_io_list_flush_cl() argument
419 if (cl == cb->cl) { in mei_io_list_flush_cl()
435 const struct mei_cl *cl, in mei_io_tx_list_free_cl() argument
441 if (cl == cb->cl && (!fp || fp == cb->fp)) in mei_io_tx_list_free_cl()
466 static void mei_cl_free_pending(struct mei_cl *cl) in mei_cl_free_pending() argument
470 cb = list_first_entry_or_null(&cl->rd_pending, struct mei_cl_cb, list); in mei_cl_free_pending()
484 struct mei_cl_cb *mei_cl_alloc_cb(struct mei_cl *cl, size_t length, in mei_cl_alloc_cb() argument
490 cb = mei_io_cb_init(cl, fop_type, fp); in mei_cl_alloc_cb()
519 struct mei_cl_cb *mei_cl_enqueue_ctrl_wr_cb(struct mei_cl *cl, size_t length, in mei_cl_enqueue_ctrl_wr_cb() argument
527 length = max_t(size_t, length, mei_cl_mtu(cl)); in mei_cl_enqueue_ctrl_wr_cb()
529 cb = mei_cl_alloc_cb(cl, length, fop_type, fp); 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()
546 struct mei_cl_cb *mei_cl_read_cb(struct mei_cl *cl, const struct file *fp) in mei_cl_read_cb() argument
551 spin_lock(&cl->rd_completed_lock); in mei_cl_read_cb()
552 list_for_each_entry(cb, &cl->rd_completed, list) in mei_cl_read_cb()
557 spin_unlock(&cl->rd_completed_lock); in mei_cl_read_cb()
569 int mei_cl_flush_queues(struct mei_cl *cl, const struct file *fp) in mei_cl_flush_queues() argument
573 if (WARN_ON(!cl || !cl->dev)) in mei_cl_flush_queues()
576 dev = cl->dev; in mei_cl_flush_queues()
578 cl_dbg(dev, cl, "remove list entry belonging to cl\n"); in mei_cl_flush_queues()
579 mei_io_tx_list_free_cl(&cl->dev->write_list, cl, fp); in mei_cl_flush_queues()
580 mei_io_tx_list_free_cl(&cl->dev->write_waiting_list, cl, fp); in mei_cl_flush_queues()
583 mei_io_list_flush_cl(&cl->dev->ctrl_wr_list, cl); in mei_cl_flush_queues()
584 mei_io_list_flush_cl(&cl->dev->ctrl_rd_list, cl); in mei_cl_flush_queues()
585 mei_cl_free_pending(cl); in mei_cl_flush_queues()
587 spin_lock(&cl->rd_completed_lock); in mei_cl_flush_queues()
588 mei_io_list_free_fp(&cl->rd_completed, fp); in mei_cl_flush_queues()
589 spin_unlock(&cl->rd_completed_lock); in mei_cl_flush_queues()
600 static void mei_cl_init(struct mei_cl *cl, struct mei_device *dev) in mei_cl_init() argument
602 memset(cl, 0, sizeof(*cl)); in mei_cl_init()
603 init_waitqueue_head(&cl->wait); in mei_cl_init()
604 init_waitqueue_head(&cl->rx_wait); in mei_cl_init()
605 init_waitqueue_head(&cl->tx_wait); in mei_cl_init()
606 init_waitqueue_head(&cl->ev_wait); in mei_cl_init()
607 INIT_LIST_HEAD(&cl->vtag_map); in mei_cl_init()
608 spin_lock_init(&cl->rd_completed_lock); in mei_cl_init()
609 INIT_LIST_HEAD(&cl->rd_completed); in mei_cl_init()
610 INIT_LIST_HEAD(&cl->rd_pending); in mei_cl_init()
611 INIT_LIST_HEAD(&cl->link); in mei_cl_init()
612 cl->writing_state = MEI_IDLE; in mei_cl_init()
613 cl->state = MEI_FILE_UNINITIALIZED; in mei_cl_init()
614 cl->dev = dev; in mei_cl_init()
625 struct mei_cl *cl; in mei_cl_allocate() local
627 cl = kmalloc(sizeof(*cl), GFP_KERNEL); in mei_cl_allocate()
628 if (!cl) in mei_cl_allocate()
631 mei_cl_init(cl, dev); in mei_cl_allocate()
633 return cl; in mei_cl_allocate()
645 int mei_cl_link(struct mei_cl *cl) in mei_cl_link() argument
650 if (WARN_ON(!cl || !cl->dev)) in mei_cl_link()
653 dev = cl->dev; in mei_cl_link()
669 cl->host_client_id = id; in mei_cl_link()
670 list_add_tail(&cl->link, &dev->file_list); in mei_cl_link()
674 cl->state = MEI_FILE_INITIALIZING; in mei_cl_link()
676 cl_dbg(dev, cl, "link cl\n"); in mei_cl_link()
687 int mei_cl_unlink(struct mei_cl *cl) in mei_cl_unlink() argument
692 if (!cl) in mei_cl_unlink()
695 if (WARN_ON(!cl->dev)) in mei_cl_unlink()
698 dev = cl->dev; in mei_cl_unlink()
700 cl_dbg(dev, cl, "unlink client"); in mei_cl_unlink()
706 if (cl->host_client_id) in mei_cl_unlink()
707 clear_bit(cl->host_client_id, dev->host_clients_map); in mei_cl_unlink()
709 list_del_init(&cl->link); in mei_cl_unlink()
711 cl->state = MEI_FILE_UNINITIALIZED; in mei_cl_unlink()
712 cl->writing_state = MEI_IDLE; in mei_cl_unlink()
714 WARN_ON(!list_empty(&cl->rd_completed) || in mei_cl_unlink()
715 !list_empty(&cl->rd_pending) || in mei_cl_unlink()
716 !list_empty(&cl->link)); in mei_cl_unlink()
763 static void mei_cl_wake_all(struct mei_cl *cl) in mei_cl_wake_all() argument
765 struct mei_device *dev = cl->dev; in mei_cl_wake_all()
768 if (waitqueue_active(&cl->rx_wait)) { in mei_cl_wake_all()
769 cl_dbg(dev, cl, "Waking up reading client!\n"); in mei_cl_wake_all()
770 wake_up_interruptible(&cl->rx_wait); in mei_cl_wake_all()
773 if (waitqueue_active(&cl->tx_wait)) { in mei_cl_wake_all()
774 cl_dbg(dev, cl, "Waking up writing client!\n"); in mei_cl_wake_all()
775 wake_up_interruptible(&cl->tx_wait); in mei_cl_wake_all()
778 if (waitqueue_active(&cl->ev_wait)) { in mei_cl_wake_all()
779 cl_dbg(dev, cl, "Waking up waiting for event clients!\n"); in mei_cl_wake_all()
780 wake_up_interruptible(&cl->ev_wait); in mei_cl_wake_all()
783 if (waitqueue_active(&cl->wait)) { in mei_cl_wake_all()
784 cl_dbg(dev, cl, "Waking up ctrl write clients!\n"); in mei_cl_wake_all()
785 wake_up(&cl->wait); in mei_cl_wake_all()
795 static void mei_cl_set_disconnected(struct mei_cl *cl) in mei_cl_set_disconnected() argument
797 struct mei_device *dev = cl->dev; in mei_cl_set_disconnected()
799 if (cl->state == MEI_FILE_DISCONNECTED || in mei_cl_set_disconnected()
800 cl->state <= MEI_FILE_INITIALIZING) in mei_cl_set_disconnected()
803 cl->state = MEI_FILE_DISCONNECTED; in mei_cl_set_disconnected()
804 mei_io_tx_list_free_cl(&dev->write_list, cl, NULL); in mei_cl_set_disconnected()
805 mei_io_tx_list_free_cl(&dev->write_waiting_list, cl, NULL); in mei_cl_set_disconnected()
806 mei_io_list_flush_cl(&dev->ctrl_rd_list, cl); in mei_cl_set_disconnected()
807 mei_io_list_flush_cl(&dev->ctrl_wr_list, cl); in mei_cl_set_disconnected()
808 mei_cl_wake_all(cl); in mei_cl_set_disconnected()
809 cl->rx_flow_ctrl_creds = 0; in mei_cl_set_disconnected()
810 cl->tx_flow_ctrl_creds = 0; in mei_cl_set_disconnected()
811 cl->timer_count = 0; in mei_cl_set_disconnected()
813 if (!cl->me_cl) in mei_cl_set_disconnected()
816 if (!WARN_ON(cl->me_cl->connect_count == 0)) in mei_cl_set_disconnected()
817 cl->me_cl->connect_count--; in mei_cl_set_disconnected()
819 if (cl->me_cl->connect_count == 0) in mei_cl_set_disconnected()
820 cl->me_cl->tx_flow_ctrl_creds = 0; in mei_cl_set_disconnected()
822 mei_me_cl_put(cl->me_cl); in mei_cl_set_disconnected()
823 cl->me_cl = NULL; in mei_cl_set_disconnected()
826 static int mei_cl_set_connecting(struct mei_cl *cl, struct mei_me_client *me_cl) in mei_cl_set_connecting() argument
839 cl->me_cl = me_cl; in mei_cl_set_connecting()
840 cl->state = MEI_FILE_CONNECTING; in mei_cl_set_connecting()
841 cl->me_cl->connect_count++; in mei_cl_set_connecting()
854 static int mei_cl_send_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_disconnect() argument
859 dev = cl->dev; in mei_cl_send_disconnect()
861 ret = mei_hbm_cl_disconnect_req(dev, cl); in mei_cl_send_disconnect()
862 cl->status = ret; in mei_cl_send_disconnect()
864 cl->state = MEI_FILE_DISCONNECT_REPLY; in mei_cl_send_disconnect()
869 cl->timer_count = MEI_CONNECT_TIMEOUT; in mei_cl_send_disconnect()
885 int mei_cl_irq_disconnect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_disconnect() argument
888 struct mei_device *dev = cl->dev; in mei_cl_irq_disconnect()
901 ret = mei_cl_send_disconnect(cl, cb); in mei_cl_irq_disconnect()
916 static int __mei_cl_disconnect(struct mei_cl *cl) in __mei_cl_disconnect() argument
922 dev = cl->dev; in __mei_cl_disconnect()
924 cl->state = MEI_FILE_DISCONNECTING; in __mei_cl_disconnect()
926 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_DISCONNECT, NULL); in __mei_cl_disconnect()
933 rets = mei_cl_send_disconnect(cl, cb); in __mei_cl_disconnect()
935 cl_err(dev, cl, "failed to disconnect.\n"); in __mei_cl_disconnect()
941 wait_event_timeout(cl->wait, in __mei_cl_disconnect()
942 cl->state == MEI_FILE_DISCONNECT_REPLY || in __mei_cl_disconnect()
943 cl->state == MEI_FILE_DISCONNECTED, in __mei_cl_disconnect()
947 rets = cl->status; in __mei_cl_disconnect()
948 if (cl->state != MEI_FILE_DISCONNECT_REPLY && in __mei_cl_disconnect()
949 cl->state != MEI_FILE_DISCONNECTED) { in __mei_cl_disconnect()
950 cl_dbg(dev, cl, "timeout on disconnect from FW client.\n"); in __mei_cl_disconnect()
956 mei_cl_set_disconnected(cl); in __mei_cl_disconnect()
958 cl_dbg(dev, cl, "successfully disconnected from FW client.\n"); in __mei_cl_disconnect()
973 int mei_cl_disconnect(struct mei_cl *cl) in mei_cl_disconnect() argument
978 if (WARN_ON(!cl || !cl->dev)) in mei_cl_disconnect()
981 dev = cl->dev; in mei_cl_disconnect()
983 cl_dbg(dev, cl, "disconnecting"); in mei_cl_disconnect()
985 if (!mei_cl_is_connected(cl)) in mei_cl_disconnect()
988 if (mei_cl_is_fixed_address(cl)) { in mei_cl_disconnect()
989 mei_cl_set_disconnected(cl); in mei_cl_disconnect()
994 cl_dbg(dev, cl, "Device is powering down, don't bother with disconnection\n"); in mei_cl_disconnect()
995 mei_cl_set_disconnected(cl); in mei_cl_disconnect()
1002 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_disconnect()
1006 rets = __mei_cl_disconnect(cl); in mei_cl_disconnect()
1008 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_disconnect()
1024 static bool mei_cl_is_other_connecting(struct mei_cl *cl) in mei_cl_is_other_connecting() argument
1029 dev = cl->dev; in mei_cl_is_other_connecting()
1033 mei_cl_me_id(cl) == mei_cl_me_id(cb->cl)) in mei_cl_is_other_connecting()
1048 static int mei_cl_send_connect(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_send_connect() argument
1053 dev = cl->dev; in mei_cl_send_connect()
1055 ret = mei_hbm_cl_connect_req(dev, cl); in mei_cl_send_connect()
1056 cl->status = ret; in mei_cl_send_connect()
1058 cl->state = MEI_FILE_DISCONNECT_REPLY; in mei_cl_send_connect()
1063 cl->timer_count = MEI_CONNECT_TIMEOUT; in mei_cl_send_connect()
1077 int mei_cl_irq_connect(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_connect() argument
1080 struct mei_device *dev = cl->dev; in mei_cl_irq_connect()
1085 if (mei_cl_is_other_connecting(cl)) in mei_cl_irq_connect()
1096 rets = mei_cl_send_connect(cl, cb); in mei_cl_irq_connect()
1114 int mei_cl_connect(struct mei_cl *cl, struct mei_me_client *me_cl, in mei_cl_connect() argument
1121 if (WARN_ON(!cl || !cl->dev || !me_cl)) in mei_cl_connect()
1124 dev = cl->dev; in mei_cl_connect()
1126 rets = mei_cl_set_connecting(cl, me_cl); in mei_cl_connect()
1130 if (mei_cl_is_fixed_address(cl)) { in mei_cl_connect()
1131 cl->state = MEI_FILE_CONNECTED; in mei_cl_connect()
1139 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_connect()
1143 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, MEI_FOP_CONNECT, fp); in mei_cl_connect()
1150 if (!mei_cl_is_other_connecting(cl) && mei_hbuf_acquire(dev)) { in mei_cl_connect()
1151 rets = mei_cl_send_connect(cl, cb); in mei_cl_connect()
1157 wait_event_timeout(cl->wait, in mei_cl_connect()
1158 (cl->state == MEI_FILE_CONNECTED || in mei_cl_connect()
1159 cl->state == MEI_FILE_DISCONNECTED || in mei_cl_connect()
1160 cl->state == MEI_FILE_DISCONNECT_REQUIRED || in mei_cl_connect()
1161 cl->state == MEI_FILE_DISCONNECT_REPLY), in mei_cl_connect()
1165 if (!mei_cl_is_connected(cl)) { in mei_cl_connect()
1166 if (cl->state == MEI_FILE_DISCONNECT_REQUIRED) { in mei_cl_connect()
1167 mei_io_list_flush_cl(&dev->ctrl_rd_list, cl); in mei_cl_connect()
1168 mei_io_list_flush_cl(&dev->ctrl_wr_list, cl); in mei_cl_connect()
1172 __mei_cl_disconnect(cl); in mei_cl_connect()
1178 if (!cl->status) in mei_cl_connect()
1179 cl->status = -EFAULT; in mei_cl_connect()
1182 rets = cl->status; in mei_cl_connect()
1184 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_connect()
1191 if (!mei_cl_is_connected(cl)) in mei_cl_connect()
1192 mei_cl_set_disconnected(cl); in mei_cl_connect()
1206 struct mei_cl *cl; in mei_cl_alloc_linked() local
1209 cl = mei_cl_allocate(dev); in mei_cl_alloc_linked()
1210 if (!cl) { in mei_cl_alloc_linked()
1215 ret = mei_cl_link(cl); in mei_cl_alloc_linked()
1219 return cl; in mei_cl_alloc_linked()
1221 kfree(cl); in mei_cl_alloc_linked()
1232 static int mei_cl_tx_flow_ctrl_creds(struct mei_cl *cl) in mei_cl_tx_flow_ctrl_creds() argument
1234 if (WARN_ON(!cl || !cl->me_cl)) in mei_cl_tx_flow_ctrl_creds()
1237 if (cl->tx_flow_ctrl_creds > 0) in mei_cl_tx_flow_ctrl_creds()
1240 if (mei_cl_is_fixed_address(cl)) in mei_cl_tx_flow_ctrl_creds()
1243 if (mei_cl_is_single_recv_buf(cl)) { in mei_cl_tx_flow_ctrl_creds()
1244 if (cl->me_cl->tx_flow_ctrl_creds > 0) in mei_cl_tx_flow_ctrl_creds()
1260 static int mei_cl_tx_flow_ctrl_creds_reduce(struct mei_cl *cl) in mei_cl_tx_flow_ctrl_creds_reduce() argument
1262 if (WARN_ON(!cl || !cl->me_cl)) in mei_cl_tx_flow_ctrl_creds_reduce()
1265 if (mei_cl_is_fixed_address(cl)) in mei_cl_tx_flow_ctrl_creds_reduce()
1268 if (mei_cl_is_single_recv_buf(cl)) { in mei_cl_tx_flow_ctrl_creds_reduce()
1269 if (WARN_ON(cl->me_cl->tx_flow_ctrl_creds <= 0)) in mei_cl_tx_flow_ctrl_creds_reduce()
1271 cl->me_cl->tx_flow_ctrl_creds--; in mei_cl_tx_flow_ctrl_creds_reduce()
1273 if (WARN_ON(cl->tx_flow_ctrl_creds <= 0)) in mei_cl_tx_flow_ctrl_creds_reduce()
1275 cl->tx_flow_ctrl_creds--; in mei_cl_tx_flow_ctrl_creds_reduce()
1315 const struct file *mei_cl_fp_by_vtag(const struct mei_cl *cl, u8 vtag) in mei_cl_fp_by_vtag() argument
1319 list_for_each_entry(vtag_l, &cl->vtag_map, list) in mei_cl_fp_by_vtag()
1332 static void mei_cl_reset_read_by_vtag(const struct mei_cl *cl, u8 vtag) in mei_cl_reset_read_by_vtag() argument
1336 list_for_each_entry(vtag_l, &cl->vtag_map, list) { in mei_cl_reset_read_by_vtag()
1350 static void mei_cl_read_vtag_add_fc(struct mei_cl *cl) in mei_cl_read_vtag_add_fc() argument
1354 list_for_each_entry(cl_vtag, &cl->vtag_map, list) { in mei_cl_read_vtag_add_fc()
1356 if (mei_cl_enqueue_ctrl_wr_cb(cl, in mei_cl_read_vtag_add_fc()
1357 mei_cl_mtu(cl), in mei_cl_read_vtag_add_fc()
1360 cl->rx_flow_ctrl_creds++; in mei_cl_read_vtag_add_fc()
1375 int mei_cl_vt_support_check(const struct mei_cl *cl) in mei_cl_vt_support_check() argument
1377 struct mei_device *dev = cl->dev; in mei_cl_vt_support_check()
1382 if (!cl->me_cl) in mei_cl_vt_support_check()
1385 return cl->me_cl->props.vt_supported ? 0 : -EOPNOTSUPP; in mei_cl_vt_support_check()
1396 void mei_cl_add_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_add_rd_completed() argument
1400 if (!mei_cl_vt_support_check(cl)) { in mei_cl_add_rd_completed()
1401 fp = mei_cl_fp_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1408 mei_cl_reset_read_by_vtag(cl, cb->vtag); in mei_cl_add_rd_completed()
1409 mei_cl_read_vtag_add_fc(cl); in mei_cl_add_rd_completed()
1412 spin_lock(&cl->rd_completed_lock); in mei_cl_add_rd_completed()
1413 list_add_tail(&cb->list, &cl->rd_completed); in mei_cl_add_rd_completed()
1414 spin_unlock(&cl->rd_completed_lock); in mei_cl_add_rd_completed()
1424 void mei_cl_del_rd_completed(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_del_rd_completed() argument
1426 spin_lock(&cl->rd_completed_lock); in mei_cl_del_rd_completed()
1428 spin_unlock(&cl->rd_completed_lock); in mei_cl_del_rd_completed()
1470 int mei_cl_irq_notify(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_notify() argument
1473 struct mei_device *dev = cl->dev; in mei_cl_irq_notify()
1488 ret = mei_hbm_cl_notify_req(dev, cl, request); in mei_cl_irq_notify()
1490 cl->status = ret; in mei_cl_irq_notify()
1510 int mei_cl_notify_request(struct mei_cl *cl, in mei_cl_notify_request() argument
1518 if (WARN_ON(!cl || !cl->dev)) in mei_cl_notify_request()
1521 dev = cl->dev; in mei_cl_notify_request()
1524 cl_dbg(dev, cl, "notifications not supported\n"); in mei_cl_notify_request()
1528 if (!mei_cl_is_connected(cl)) in mei_cl_notify_request()
1534 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_notify_request()
1539 cb = mei_cl_enqueue_ctrl_wr_cb(cl, 0, fop_type, fp); in mei_cl_notify_request()
1546 if (mei_hbm_cl_notify_req(dev, cl, request)) { in mei_cl_notify_request()
1554 wait_event_timeout(cl->wait, in mei_cl_notify_request()
1555 cl->notify_en == request || in mei_cl_notify_request()
1556 cl->status || in mei_cl_notify_request()
1557 !mei_cl_is_connected(cl), in mei_cl_notify_request()
1561 if (cl->notify_en != request && !cl->status) in mei_cl_notify_request()
1562 cl->status = -EFAULT; in mei_cl_notify_request()
1564 rets = cl->status; in mei_cl_notify_request()
1567 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_notify_request()
1582 void mei_cl_notify(struct mei_cl *cl) in mei_cl_notify() argument
1586 if (!cl || !cl->dev) in mei_cl_notify()
1589 dev = cl->dev; in mei_cl_notify()
1591 if (!cl->notify_en) in mei_cl_notify()
1594 cl_dbg(dev, cl, "notify event"); in mei_cl_notify()
1595 cl->notify_ev = true; in mei_cl_notify()
1596 if (!mei_cl_bus_notify_event(cl)) in mei_cl_notify()
1597 wake_up_interruptible(&cl->ev_wait); in mei_cl_notify()
1599 if (cl->ev_async) in mei_cl_notify()
1600 kill_fasync(&cl->ev_async, SIGIO, POLL_PRI); in mei_cl_notify()
1615 int mei_cl_notify_get(struct mei_cl *cl, bool block, bool *notify_ev) in mei_cl_notify_get() argument
1622 if (WARN_ON(!cl || !cl->dev)) in mei_cl_notify_get()
1625 dev = cl->dev; in mei_cl_notify_get()
1628 cl_dbg(dev, cl, "notifications not supported\n"); in mei_cl_notify_get()
1632 if (!mei_cl_is_connected(cl)) in mei_cl_notify_get()
1635 if (cl->notify_ev) in mei_cl_notify_get()
1642 rets = wait_event_interruptible(cl->ev_wait, cl->notify_ev); in mei_cl_notify_get()
1649 *notify_ev = cl->notify_ev; in mei_cl_notify_get()
1650 cl->notify_ev = false; in mei_cl_notify_get()
1663 int mei_cl_read_start(struct mei_cl *cl, size_t length, const struct file *fp) in mei_cl_read_start() argument
1669 if (WARN_ON(!cl || !cl->dev)) in mei_cl_read_start()
1672 dev = cl->dev; in mei_cl_read_start()
1674 if (!mei_cl_is_connected(cl)) in mei_cl_read_start()
1677 if (!mei_me_cl_is_active(cl->me_cl)) { in mei_cl_read_start()
1678 cl_err(dev, cl, "no such me client\n"); in mei_cl_read_start()
1682 if (mei_cl_is_fixed_address(cl)) in mei_cl_read_start()
1686 if (cl->rx_flow_ctrl_creds) { in mei_cl_read_start()
1687 mei_cl_set_read_by_fp(cl, fp); in mei_cl_read_start()
1691 cb = mei_cl_enqueue_ctrl_wr_cb(cl, length, MEI_FOP_READ, fp); in mei_cl_read_start()
1695 mei_cl_set_read_by_fp(cl, fp); in mei_cl_read_start()
1700 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_read_start()
1706 rets = mei_hbm_cl_flow_control_req(dev, cl); in mei_cl_read_start()
1710 list_move_tail(&cb->list, &cl->rd_pending); in mei_cl_read_start()
1712 cl->rx_flow_ctrl_creds++; in mei_cl_read_start()
1715 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_read_start()
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()
1798 int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb, in mei_cl_irq_write() argument
1815 if (WARN_ON(!cl || !cl->dev)) in mei_cl_irq_write()
1818 dev = cl->dev; in mei_cl_irq_write()
1824 rets = first_chunk ? mei_cl_tx_flow_ctrl_creds(cl) : 1; in mei_cl_irq_write()
1829 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); in mei_cl_irq_write()
1852 cl_dbg(dev, cl, "Extended Header %d vtag = %d\n", in mei_cl_irq_write()
1890 cl->status = 0; in mei_cl_irq_write()
1891 cl->writing_state = MEI_WRITING; in mei_cl_irq_write()
1895 if (mei_cl_tx_flow_ctrl_creds_reduce(cl)) { in mei_cl_irq_write()
1909 cl->status = rets; in mei_cl_irq_write()
1923 ssize_t mei_cl_write(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_write() argument
1939 if (WARN_ON(!cl || !cl->dev)) in mei_cl_write()
1945 dev = cl->dev; in mei_cl_write()
1950 cl_dbg(dev, cl, "buf_len=%zd\n", buf_len); in mei_cl_write()
1958 cl_err(dev, cl, "rpm: get failed %zd\n", rets); in mei_cl_write()
1963 cl->writing_state = MEI_IDLE; in mei_cl_write()
1966 rets = mei_cl_tx_flow_ctrl_creds(cl); in mei_cl_write()
1977 cl_dbg(dev, cl, "Extended Header %d vtag = %d\n", in mei_cl_write()
1983 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); in mei_cl_write()
1989 cl_dbg(dev, cl, "Cannot acquire the host buffer: not sending.\n"); in mei_cl_write()
2031 rets = mei_cl_tx_flow_ctrl_creds_reduce(cl); in mei_cl_write()
2035 cl->writing_state = MEI_WRITING; in mei_cl_write()
2047 if (blocking && cl->writing_state != MEI_WRITE_COMPLETE) { in mei_cl_write()
2050 rets = wait_event_interruptible(cl->tx_wait, in mei_cl_write()
2051 cl->writing_state == MEI_WRITE_COMPLETE || in mei_cl_write()
2052 (!mei_cl_is_connected(cl))); in mei_cl_write()
2060 if (cl->writing_state != MEI_WRITE_COMPLETE) { in mei_cl_write()
2068 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_write()
2085 void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb) in mei_cl_complete() argument
2087 struct mei_device *dev = cl->dev; in mei_cl_complete()
2092 cl->writing_state = MEI_WRITE_COMPLETE; in mei_cl_complete()
2093 if (waitqueue_active(&cl->tx_wait)) { in mei_cl_complete()
2094 wake_up_interruptible(&cl->tx_wait); in mei_cl_complete()
2102 mei_cl_add_rd_completed(cl, cb); in mei_cl_complete()
2103 if (!mei_cl_is_fixed_address(cl) && in mei_cl_complete()
2104 !WARN_ON(!cl->rx_flow_ctrl_creds)) in mei_cl_complete()
2105 cl->rx_flow_ctrl_creds--; in mei_cl_complete()
2106 if (!mei_cl_bus_rx_event(cl)) in mei_cl_complete()
2107 wake_up_interruptible(&cl->rx_wait); in mei_cl_complete()
2114 if (waitqueue_active(&cl->wait)) in mei_cl_complete()
2115 wake_up(&cl->wait); in mei_cl_complete()
2120 mei_cl_set_disconnected(cl); in mei_cl_complete()
2135 struct mei_cl *cl; in mei_cl_all_disconnect() local
2137 list_for_each_entry(cl, &dev->file_list, link) in mei_cl_all_disconnect()
2138 mei_cl_set_disconnected(cl); in mei_cl_all_disconnect()