Lines Matching refs:dev
94 static void __mei_me_cl_del(struct mei_device *dev, struct mei_me_client *me_cl) in __mei_me_cl_del() argument
109 void mei_me_cl_add(struct mei_device *dev, struct mei_me_client *me_cl) in mei_me_cl_add() argument
111 down_write(&dev->me_clients_rwsem); in mei_me_cl_add()
112 list_add(&me_cl->list, &dev->me_clients); in mei_me_cl_add()
113 up_write(&dev->me_clients_rwsem); in mei_me_cl_add()
127 static struct mei_me_client *__mei_me_cl_by_uuid(struct mei_device *dev, in __mei_me_cl_by_uuid() argument
133 WARN_ON(!rwsem_is_locked(&dev->me_clients_rwsem)); in __mei_me_cl_by_uuid()
135 list_for_each_entry(me_cl, &dev->me_clients, list) { in __mei_me_cl_by_uuid()
155 struct mei_me_client *mei_me_cl_by_uuid(struct mei_device *dev, in mei_me_cl_by_uuid() argument
160 down_read(&dev->me_clients_rwsem); in mei_me_cl_by_uuid()
161 me_cl = __mei_me_cl_by_uuid(dev, uuid); in mei_me_cl_by_uuid()
162 up_read(&dev->me_clients_rwsem); in mei_me_cl_by_uuid()
178 struct mei_me_client *mei_me_cl_by_id(struct mei_device *dev, u8 client_id) in mei_me_cl_by_id() argument
183 down_read(&dev->me_clients_rwsem); in mei_me_cl_by_id()
184 list_for_each_entry(__me_cl, &dev->me_clients, list) { in mei_me_cl_by_id()
190 up_read(&dev->me_clients_rwsem); in mei_me_cl_by_id()
207 static struct mei_me_client *__mei_me_cl_by_uuid_id(struct mei_device *dev, in __mei_me_cl_by_uuid_id() argument
213 WARN_ON(!rwsem_is_locked(&dev->me_clients_rwsem)); in __mei_me_cl_by_uuid_id()
215 list_for_each_entry(me_cl, &dev->me_clients, list) { in __mei_me_cl_by_uuid_id()
236 struct mei_me_client *mei_me_cl_by_uuid_id(struct mei_device *dev, in mei_me_cl_by_uuid_id() argument
241 down_read(&dev->me_clients_rwsem); in mei_me_cl_by_uuid_id()
242 me_cl = __mei_me_cl_by_uuid_id(dev, uuid, client_id); in mei_me_cl_by_uuid_id()
243 up_read(&dev->me_clients_rwsem); in mei_me_cl_by_uuid_id()
256 void mei_me_cl_rm_by_uuid(struct mei_device *dev, const uuid_le *uuid) in mei_me_cl_rm_by_uuid() argument
260 dev_dbg(dev->dev, "remove %pUl\n", uuid); in mei_me_cl_rm_by_uuid()
262 down_write(&dev->me_clients_rwsem); in mei_me_cl_rm_by_uuid()
263 me_cl = __mei_me_cl_by_uuid(dev, uuid); in mei_me_cl_rm_by_uuid()
264 __mei_me_cl_del(dev, me_cl); in mei_me_cl_rm_by_uuid()
265 up_write(&dev->me_clients_rwsem); in mei_me_cl_rm_by_uuid()
277 void mei_me_cl_rm_by_uuid_id(struct mei_device *dev, const uuid_le *uuid, u8 id) in mei_me_cl_rm_by_uuid_id() argument
281 dev_dbg(dev->dev, "remove %pUl %d\n", uuid, id); in mei_me_cl_rm_by_uuid_id()
283 down_write(&dev->me_clients_rwsem); in mei_me_cl_rm_by_uuid_id()
284 me_cl = __mei_me_cl_by_uuid_id(dev, uuid, id); in mei_me_cl_rm_by_uuid_id()
285 __mei_me_cl_del(dev, me_cl); in mei_me_cl_rm_by_uuid_id()
286 up_write(&dev->me_clients_rwsem); in mei_me_cl_rm_by_uuid_id()
296 void mei_me_cl_rm_all(struct mei_device *dev) in mei_me_cl_rm_all() argument
300 down_write(&dev->me_clients_rwsem); in mei_me_cl_rm_all()
301 list_for_each_entry_safe(me_cl, next, &dev->me_clients, list) in mei_me_cl_rm_all()
302 __mei_me_cl_del(dev, me_cl); in mei_me_cl_rm_all()
303 up_write(&dev->me_clients_rwsem); in mei_me_cl_rm_all()
511 struct mei_device *dev; in mei_cl_flush_queues() local
513 if (WARN_ON(!cl || !cl->dev)) in mei_cl_flush_queues()
516 dev = cl->dev; in mei_cl_flush_queues()
518 cl_dbg(dev, cl, "remove list entry belonging to cl\n"); in mei_cl_flush_queues()
519 mei_io_list_free(&cl->dev->write_list, cl); in mei_cl_flush_queues()
520 mei_io_list_free(&cl->dev->write_waiting_list, cl); in mei_cl_flush_queues()
521 mei_io_list_flush(&cl->dev->ctrl_wr_list, cl); in mei_cl_flush_queues()
522 mei_io_list_flush(&cl->dev->ctrl_rd_list, cl); in mei_cl_flush_queues()
523 mei_io_list_flush(&cl->dev->amthif_cmd_list, cl); in mei_cl_flush_queues()
524 mei_io_list_flush(&cl->dev->amthif_rd_complete_list, cl); in mei_cl_flush_queues()
538 void mei_cl_init(struct mei_cl *cl, struct mei_device *dev) in mei_cl_init() argument
549 cl->dev = dev; in mei_cl_init()
558 struct mei_cl *mei_cl_allocate(struct mei_device *dev) in mei_cl_allocate() argument
566 mei_cl_init(cl, dev); in mei_cl_allocate()
583 struct mei_device *dev; in mei_cl_link() local
586 if (WARN_ON(!cl || !cl->dev)) in mei_cl_link()
589 dev = cl->dev; in mei_cl_link()
593 id = find_first_zero_bit(dev->host_clients_map, in mei_cl_link()
597 dev_err(dev->dev, "id exceeded %d", MEI_CLIENTS_MAX); in mei_cl_link()
601 open_handle_count = dev->open_handle_count + dev->iamthif_open_count; in mei_cl_link()
603 dev_err(dev->dev, "open_handle_count exceeded %d", in mei_cl_link()
608 dev->open_handle_count++; in mei_cl_link()
611 list_add_tail(&cl->link, &dev->file_list); in mei_cl_link()
613 set_bit(id, dev->host_clients_map); in mei_cl_link()
617 cl_dbg(dev, cl, "link cl\n"); in mei_cl_link()
630 struct mei_device *dev; in mei_cl_unlink() local
637 if (!cl->dev) in mei_cl_unlink()
640 dev = cl->dev; in mei_cl_unlink()
642 cl_dbg(dev, cl, "unlink client"); in mei_cl_unlink()
644 if (dev->open_handle_count > 0) in mei_cl_unlink()
645 dev->open_handle_count--; in mei_cl_unlink()
649 clear_bit(cl->host_client_id, dev->host_clients_map); in mei_cl_unlink()
661 struct mei_device *dev = in mei_host_client_init() local
665 mutex_lock(&dev->device_lock); in mei_host_client_init()
668 me_cl = mei_me_cl_by_uuid(dev, &mei_amthif_guid); in mei_host_client_init()
670 mei_amthif_host_init(dev); in mei_host_client_init()
673 me_cl = mei_me_cl_by_uuid(dev, &mei_wd_guid); in mei_host_client_init()
675 mei_wd_host_init(dev); in mei_host_client_init()
678 me_cl = mei_me_cl_by_uuid(dev, &mei_nfc_guid); in mei_host_client_init()
680 mei_nfc_host_init(dev); in mei_host_client_init()
684 dev->dev_state = MEI_DEV_ENABLED; in mei_host_client_init()
685 dev->reset_count = 0; in mei_host_client_init()
686 mutex_unlock(&dev->device_lock); in mei_host_client_init()
688 pm_runtime_mark_last_busy(dev->dev); in mei_host_client_init()
689 dev_dbg(dev->dev, "rpm: autosuspend\n"); in mei_host_client_init()
690 pm_runtime_autosuspend(dev->dev); in mei_host_client_init()
699 bool mei_hbuf_acquire(struct mei_device *dev) in mei_hbuf_acquire() argument
701 if (mei_pg_state(dev) == MEI_PG_ON || in mei_hbuf_acquire()
702 mei_pg_in_transition(dev)) { in mei_hbuf_acquire()
703 dev_dbg(dev->dev, "device is in pg\n"); in mei_hbuf_acquire()
707 if (!dev->hbuf_is_ready) { in mei_hbuf_acquire()
708 dev_dbg(dev->dev, "hbuf is not ready\n"); in mei_hbuf_acquire()
712 dev->hbuf_is_ready = false; in mei_hbuf_acquire()
728 struct mei_device *dev; in mei_cl_disconnect() local
732 if (WARN_ON(!cl || !cl->dev)) in mei_cl_disconnect()
735 dev = cl->dev; in mei_cl_disconnect()
737 cl_dbg(dev, cl, "disconnecting"); in mei_cl_disconnect()
742 rets = pm_runtime_get(dev->dev); in mei_cl_disconnect()
744 pm_runtime_put_noidle(dev->dev); in mei_cl_disconnect()
745 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_disconnect()
754 if (mei_hbuf_acquire(dev)) { in mei_cl_disconnect()
755 if (mei_hbm_cl_disconnect_req(dev, cl)) { in mei_cl_disconnect()
757 cl_err(dev, cl, "failed to disconnect.\n"); in mei_cl_disconnect()
762 list_add_tail(&cb->list, &dev->ctrl_rd_list.list); in mei_cl_disconnect()
764 cl_dbg(dev, cl, "add disconnect cb to control write list\n"); in mei_cl_disconnect()
765 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); in mei_cl_disconnect()
768 mutex_unlock(&dev->device_lock); in mei_cl_disconnect()
774 mutex_lock(&dev->device_lock); in mei_cl_disconnect()
778 cl_dbg(dev, cl, "successfully disconnected from FW client.\n"); in mei_cl_disconnect()
780 cl_dbg(dev, cl, "timeout on disconnect from FW client.\n"); in mei_cl_disconnect()
784 mei_io_list_flush(&dev->ctrl_rd_list, cl); in mei_cl_disconnect()
785 mei_io_list_flush(&dev->ctrl_wr_list, cl); in mei_cl_disconnect()
787 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_disconnect()
788 pm_runtime_mark_last_busy(dev->dev); in mei_cl_disconnect()
789 pm_runtime_put_autosuspend(dev->dev); in mei_cl_disconnect()
806 struct mei_device *dev; in mei_cl_is_other_connecting() local
809 if (WARN_ON(!cl || !cl->dev)) in mei_cl_is_other_connecting()
812 dev = cl->dev; in mei_cl_is_other_connecting()
814 list_for_each_entry(ocl, &dev->file_list, link) { in mei_cl_is_other_connecting()
837 struct mei_device *dev; in mei_cl_connect() local
841 if (WARN_ON(!cl || !cl->dev)) in mei_cl_connect()
844 dev = cl->dev; in mei_cl_connect()
846 rets = pm_runtime_get(dev->dev); in mei_cl_connect()
848 pm_runtime_put_noidle(dev->dev); in mei_cl_connect()
849 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_connect()
859 if (!mei_cl_is_other_connecting(cl) && mei_hbuf_acquire(dev)) { in mei_cl_connect()
861 if (mei_hbm_cl_connect_req(dev, cl)) { in mei_cl_connect()
866 list_add_tail(&cb->list, &dev->ctrl_rd_list.list); in mei_cl_connect()
869 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); in mei_cl_connect()
872 mutex_unlock(&dev->device_lock); in mei_cl_connect()
877 mutex_lock(&dev->device_lock); in mei_cl_connect()
885 mei_io_list_flush(&dev->ctrl_rd_list, cl); in mei_cl_connect()
886 mei_io_list_flush(&dev->ctrl_wr_list, cl); in mei_cl_connect()
892 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_connect()
893 pm_runtime_mark_last_busy(dev->dev); in mei_cl_connect()
894 pm_runtime_put_autosuspend(dev->dev); in mei_cl_connect()
908 struct mei_cl *mei_cl_alloc_linked(struct mei_device *dev, int id) in mei_cl_alloc_linked() argument
913 cl = mei_cl_allocate(dev); in mei_cl_alloc_linked()
942 struct mei_device *dev; in mei_cl_flow_ctrl_creds() local
946 if (WARN_ON(!cl || !cl->dev)) in mei_cl_flow_ctrl_creds()
949 dev = cl->dev; in mei_cl_flow_ctrl_creds()
954 me_cl = mei_me_cl_by_uuid_id(dev, &cl->cl_uuid, cl->me_client_id); in mei_cl_flow_ctrl_creds()
956 cl_err(dev, cl, "no such me client %d\n", cl->me_client_id); in mei_cl_flow_ctrl_creds()
981 struct mei_device *dev; in mei_cl_flow_ctrl_reduce() local
985 if (WARN_ON(!cl || !cl->dev)) in mei_cl_flow_ctrl_reduce()
988 dev = cl->dev; in mei_cl_flow_ctrl_reduce()
990 me_cl = mei_me_cl_by_uuid_id(dev, &cl->cl_uuid, cl->me_client_id); in mei_cl_flow_ctrl_reduce()
992 cl_err(dev, cl, "no such me client %d\n", cl->me_client_id); in mei_cl_flow_ctrl_reduce()
1026 struct mei_device *dev; in mei_cl_read_start() local
1031 if (WARN_ON(!cl || !cl->dev)) in mei_cl_read_start()
1034 dev = cl->dev; in mei_cl_read_start()
1043 me_cl = mei_me_cl_by_uuid_id(dev, &cl->cl_uuid, cl->me_client_id); in mei_cl_read_start()
1045 cl_err(dev, cl, "no such me client %d\n", cl->me_client_id); in mei_cl_read_start()
1052 rets = pm_runtime_get(dev->dev); in mei_cl_read_start()
1054 pm_runtime_put_noidle(dev->dev); in mei_cl_read_start()
1055 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_read_start()
1064 if (mei_hbuf_acquire(dev)) { in mei_cl_read_start()
1065 rets = mei_hbm_cl_flow_control_req(dev, cl); in mei_cl_read_start()
1071 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); in mei_cl_read_start()
1075 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_read_start()
1076 pm_runtime_mark_last_busy(dev->dev); in mei_cl_read_start()
1077 pm_runtime_put_autosuspend(dev->dev); in mei_cl_read_start()
1098 struct mei_device *dev; in mei_cl_irq_write() local
1106 if (WARN_ON(!cl || !cl->dev)) in mei_cl_irq_write()
1109 dev = cl->dev; in mei_cl_irq_write()
1118 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); in mei_cl_irq_write()
1122 slots = mei_hbuf_empty_slots(dev); in mei_cl_irq_write()
1135 } else if (slots == dev->hbuf_depth) { in mei_cl_irq_write()
1145 cl_dbg(dev, cl, "buf: size = %d idx = %lu\n", in mei_cl_irq_write()
1148 rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx); in mei_cl_irq_write()
1163 list_move_tail(&cb->list, &dev->write_waiting_list.list); in mei_cl_irq_write()
1181 struct mei_device *dev; in mei_cl_write() local
1187 if (WARN_ON(!cl || !cl->dev)) in mei_cl_write()
1193 dev = cl->dev; in mei_cl_write()
1198 cl_dbg(dev, cl, "size=%d\n", buf->size); in mei_cl_write()
1200 rets = pm_runtime_get(dev->dev); in mei_cl_write()
1202 pm_runtime_put_noidle(dev->dev); in mei_cl_write()
1203 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_write()
1221 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); in mei_cl_write()
1225 if (!mei_hbuf_acquire(dev)) { in mei_cl_write()
1226 cl_dbg(dev, cl, "Cannot acquire the host buffer: not sending.\n"); in mei_cl_write()
1232 if (buf->size > mei_hbuf_max_len(dev)) { in mei_cl_write()
1233 mei_hdr.length = mei_hbuf_max_len(dev); in mei_cl_write()
1240 rets = mei_write_message(dev, &mei_hdr, buf->data); in mei_cl_write()
1254 list_add_tail(&cb->list, &dev->write_waiting_list.list); in mei_cl_write()
1256 list_add_tail(&cb->list, &dev->write_list.list); in mei_cl_write()
1262 mutex_unlock(&dev->device_lock); in mei_cl_write()
1265 mutex_lock(&dev->device_lock); in mei_cl_write()
1276 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_write()
1277 pm_runtime_mark_last_busy(dev->dev); in mei_cl_write()
1278 pm_runtime_put_autosuspend(dev->dev); in mei_cl_write()
1316 void mei_cl_all_disconnect(struct mei_device *dev) in mei_cl_all_disconnect() argument
1320 list_for_each_entry(cl, &dev->file_list, link) { in mei_cl_all_disconnect()
1333 void mei_cl_all_wakeup(struct mei_device *dev) in mei_cl_all_wakeup() argument
1337 list_for_each_entry(cl, &dev->file_list, link) { in mei_cl_all_wakeup()
1339 cl_dbg(dev, cl, "Waking up reading client!\n"); in mei_cl_all_wakeup()
1343 cl_dbg(dev, cl, "Waking up writing client!\n"); in mei_cl_all_wakeup()
1354 void mei_cl_all_write_clear(struct mei_device *dev) in mei_cl_all_write_clear() argument
1356 mei_io_list_free(&dev->write_list, NULL); in mei_cl_all_write_clear()
1357 mei_io_list_free(&dev->write_waiting_list, NULL); in mei_cl_all_write_clear()