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
110 void mei_me_cl_del(struct mei_device *dev, struct mei_me_client *me_cl) in mei_me_cl_del() argument
112 down_write(&dev->me_clients_rwsem); in mei_me_cl_del()
113 __mei_me_cl_del(dev, me_cl); in mei_me_cl_del()
114 up_write(&dev->me_clients_rwsem); in mei_me_cl_del()
123 void mei_me_cl_add(struct mei_device *dev, struct mei_me_client *me_cl) in mei_me_cl_add() argument
125 down_write(&dev->me_clients_rwsem); in mei_me_cl_add()
126 list_add(&me_cl->list, &dev->me_clients); in mei_me_cl_add()
127 up_write(&dev->me_clients_rwsem); in mei_me_cl_add()
141 static struct mei_me_client *__mei_me_cl_by_uuid(struct mei_device *dev, in __mei_me_cl_by_uuid() argument
147 WARN_ON(!rwsem_is_locked(&dev->me_clients_rwsem)); in __mei_me_cl_by_uuid()
149 list_for_each_entry(me_cl, &dev->me_clients, list) { in __mei_me_cl_by_uuid()
169 struct mei_me_client *mei_me_cl_by_uuid(struct mei_device *dev, in mei_me_cl_by_uuid() argument
174 down_read(&dev->me_clients_rwsem); in mei_me_cl_by_uuid()
175 me_cl = __mei_me_cl_by_uuid(dev, uuid); in mei_me_cl_by_uuid()
176 up_read(&dev->me_clients_rwsem); in mei_me_cl_by_uuid()
192 struct mei_me_client *mei_me_cl_by_id(struct mei_device *dev, u8 client_id) in mei_me_cl_by_id() argument
197 down_read(&dev->me_clients_rwsem); in mei_me_cl_by_id()
198 list_for_each_entry(__me_cl, &dev->me_clients, list) { in mei_me_cl_by_id()
204 up_read(&dev->me_clients_rwsem); in mei_me_cl_by_id()
221 static struct mei_me_client *__mei_me_cl_by_uuid_id(struct mei_device *dev, in __mei_me_cl_by_uuid_id() argument
227 WARN_ON(!rwsem_is_locked(&dev->me_clients_rwsem)); in __mei_me_cl_by_uuid_id()
229 list_for_each_entry(me_cl, &dev->me_clients, list) { in __mei_me_cl_by_uuid_id()
250 struct mei_me_client *mei_me_cl_by_uuid_id(struct mei_device *dev, in mei_me_cl_by_uuid_id() argument
255 down_read(&dev->me_clients_rwsem); in mei_me_cl_by_uuid_id()
256 me_cl = __mei_me_cl_by_uuid_id(dev, uuid, client_id); in mei_me_cl_by_uuid_id()
257 up_read(&dev->me_clients_rwsem); in mei_me_cl_by_uuid_id()
270 void mei_me_cl_rm_by_uuid(struct mei_device *dev, const uuid_le *uuid) in mei_me_cl_rm_by_uuid() argument
274 dev_dbg(dev->dev, "remove %pUl\n", uuid); in mei_me_cl_rm_by_uuid()
276 down_write(&dev->me_clients_rwsem); in mei_me_cl_rm_by_uuid()
277 me_cl = __mei_me_cl_by_uuid(dev, uuid); in mei_me_cl_rm_by_uuid()
278 __mei_me_cl_del(dev, me_cl); in mei_me_cl_rm_by_uuid()
279 up_write(&dev->me_clients_rwsem); in mei_me_cl_rm_by_uuid()
291 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
295 dev_dbg(dev->dev, "remove %pUl %d\n", uuid, id); in mei_me_cl_rm_by_uuid_id()
297 down_write(&dev->me_clients_rwsem); in mei_me_cl_rm_by_uuid_id()
298 me_cl = __mei_me_cl_by_uuid_id(dev, uuid, id); in mei_me_cl_rm_by_uuid_id()
299 __mei_me_cl_del(dev, me_cl); in mei_me_cl_rm_by_uuid_id()
300 up_write(&dev->me_clients_rwsem); in mei_me_cl_rm_by_uuid_id()
310 void mei_me_cl_rm_all(struct mei_device *dev) in mei_me_cl_rm_all() argument
314 down_write(&dev->me_clients_rwsem); in mei_me_cl_rm_all()
315 list_for_each_entry_safe(me_cl, next, &dev->me_clients, list) in mei_me_cl_rm_all()
316 __mei_me_cl_del(dev, me_cl); in mei_me_cl_rm_all()
317 up_write(&dev->me_clients_rwsem); in mei_me_cl_rm_all()
525 struct mei_device *dev; in mei_cl_flush_queues() local
527 if (WARN_ON(!cl || !cl->dev)) in mei_cl_flush_queues()
530 dev = cl->dev; in mei_cl_flush_queues()
532 cl_dbg(dev, cl, "remove list entry belonging to cl\n"); in mei_cl_flush_queues()
533 mei_io_list_free(&cl->dev->write_list, cl); in mei_cl_flush_queues()
534 mei_io_list_free(&cl->dev->write_waiting_list, cl); in mei_cl_flush_queues()
535 mei_io_list_flush(&cl->dev->ctrl_wr_list, cl); in mei_cl_flush_queues()
536 mei_io_list_flush(&cl->dev->ctrl_rd_list, cl); in mei_cl_flush_queues()
537 mei_io_list_flush(&cl->dev->amthif_cmd_list, cl); in mei_cl_flush_queues()
538 mei_io_list_flush(&cl->dev->amthif_rd_complete_list, cl); in mei_cl_flush_queues()
552 void mei_cl_init(struct mei_cl *cl, struct mei_device *dev) in mei_cl_init() argument
564 cl->dev = dev; in mei_cl_init()
573 struct mei_cl *mei_cl_allocate(struct mei_device *dev) in mei_cl_allocate() argument
581 mei_cl_init(cl, dev); in mei_cl_allocate()
598 struct mei_device *dev; in mei_cl_link() local
601 if (WARN_ON(!cl || !cl->dev)) in mei_cl_link()
604 dev = cl->dev; in mei_cl_link()
608 id = find_first_zero_bit(dev->host_clients_map, in mei_cl_link()
612 dev_err(dev->dev, "id exceeded %d", MEI_CLIENTS_MAX); in mei_cl_link()
616 open_handle_count = dev->open_handle_count + dev->iamthif_open_count; in mei_cl_link()
618 dev_err(dev->dev, "open_handle_count exceeded %d", in mei_cl_link()
623 dev->open_handle_count++; in mei_cl_link()
626 list_add_tail(&cl->link, &dev->file_list); in mei_cl_link()
628 set_bit(id, dev->host_clients_map); in mei_cl_link()
632 cl_dbg(dev, cl, "link cl\n"); in mei_cl_link()
645 struct mei_device *dev; in mei_cl_unlink() local
652 if (!cl->dev) in mei_cl_unlink()
655 dev = cl->dev; in mei_cl_unlink()
657 cl_dbg(dev, cl, "unlink client"); in mei_cl_unlink()
659 if (dev->open_handle_count > 0) in mei_cl_unlink()
660 dev->open_handle_count--; in mei_cl_unlink()
664 clear_bit(cl->host_client_id, dev->host_clients_map); in mei_cl_unlink()
676 struct mei_device *dev = in mei_host_client_init() local
680 mutex_lock(&dev->device_lock); in mei_host_client_init()
683 me_cl = mei_me_cl_by_uuid(dev, &mei_amthif_guid); in mei_host_client_init()
685 mei_amthif_host_init(dev, me_cl); in mei_host_client_init()
688 me_cl = mei_me_cl_by_uuid(dev, &mei_wd_guid); in mei_host_client_init()
690 mei_wd_host_init(dev, me_cl); in mei_host_client_init()
693 dev->dev_state = MEI_DEV_ENABLED; in mei_host_client_init()
694 dev->reset_count = 0; in mei_host_client_init()
695 mutex_unlock(&dev->device_lock); in mei_host_client_init()
697 mei_cl_bus_rescan(dev); in mei_host_client_init()
699 pm_runtime_mark_last_busy(dev->dev); in mei_host_client_init()
700 dev_dbg(dev->dev, "rpm: autosuspend\n"); in mei_host_client_init()
701 pm_runtime_autosuspend(dev->dev); in mei_host_client_init()
710 bool mei_hbuf_acquire(struct mei_device *dev) in mei_hbuf_acquire() argument
712 if (mei_pg_state(dev) == MEI_PG_ON || in mei_hbuf_acquire()
713 mei_pg_in_transition(dev)) { in mei_hbuf_acquire()
714 dev_dbg(dev->dev, "device is in pg\n"); in mei_hbuf_acquire()
718 if (!dev->hbuf_is_ready) { in mei_hbuf_acquire()
719 dev_dbg(dev->dev, "hbuf is not ready\n"); in mei_hbuf_acquire()
723 dev->hbuf_is_ready = false; in mei_hbuf_acquire()
736 struct mei_device *dev = cl->dev; in mei_cl_set_disconnected() local
743 mei_io_list_flush(&dev->ctrl_rd_list, cl); in mei_cl_set_disconnected()
744 mei_io_list_flush(&dev->ctrl_wr_list, cl); in mei_cl_set_disconnected()
791 struct mei_device *dev; in mei_cl_send_disconnect() local
794 dev = cl->dev; in mei_cl_send_disconnect()
796 ret = mei_hbm_cl_disconnect_req(dev, cl); in mei_cl_send_disconnect()
803 list_move_tail(&cb->list, &dev->ctrl_rd_list.list); in mei_cl_send_disconnect()
822 struct mei_device *dev = cl->dev; in mei_cl_irq_disconnect() local
828 slots = mei_hbuf_empty_slots(dev); in mei_cl_irq_disconnect()
850 struct mei_device *dev; in __mei_cl_disconnect() local
854 dev = cl->dev; in __mei_cl_disconnect()
863 cl_dbg(dev, cl, "add disconnect cb to control write list\n"); in __mei_cl_disconnect()
864 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); in __mei_cl_disconnect()
866 if (mei_hbuf_acquire(dev)) { in __mei_cl_disconnect()
869 cl_err(dev, cl, "failed to disconnect.\n"); in __mei_cl_disconnect()
874 mutex_unlock(&dev->device_lock); in __mei_cl_disconnect()
877 mutex_lock(&dev->device_lock); in __mei_cl_disconnect()
881 cl_dbg(dev, cl, "timeout on disconnect from FW client.\n"); in __mei_cl_disconnect()
889 cl_dbg(dev, cl, "successfully disconnected from FW client.\n"); in __mei_cl_disconnect()
906 struct mei_device *dev; in mei_cl_disconnect() local
909 if (WARN_ON(!cl || !cl->dev)) in mei_cl_disconnect()
912 dev = cl->dev; in mei_cl_disconnect()
914 cl_dbg(dev, cl, "disconnecting"); in mei_cl_disconnect()
924 rets = pm_runtime_get(dev->dev); in mei_cl_disconnect()
926 pm_runtime_put_noidle(dev->dev); in mei_cl_disconnect()
927 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_disconnect()
933 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_disconnect()
934 pm_runtime_mark_last_busy(dev->dev); in mei_cl_disconnect()
935 pm_runtime_put_autosuspend(dev->dev); in mei_cl_disconnect()
951 struct mei_device *dev; in mei_cl_is_other_connecting() local
954 dev = cl->dev; in mei_cl_is_other_connecting()
956 list_for_each_entry(cb, &dev->ctrl_rd_list.list, list) { in mei_cl_is_other_connecting()
975 struct mei_device *dev; in mei_cl_send_connect() local
978 dev = cl->dev; in mei_cl_send_connect()
980 ret = mei_hbm_cl_connect_req(dev, cl); in mei_cl_send_connect()
987 list_move_tail(&cb->list, &dev->ctrl_rd_list.list); in mei_cl_send_connect()
1004 struct mei_device *dev = cl->dev; in mei_cl_irq_connect() local
1010 slots = mei_hbuf_empty_slots(dev); in mei_cl_irq_connect()
1039 struct mei_device *dev; in mei_cl_connect() local
1043 if (WARN_ON(!cl || !cl->dev || !me_cl)) in mei_cl_connect()
1046 dev = cl->dev; in mei_cl_connect()
1057 rets = pm_runtime_get(dev->dev); in mei_cl_connect()
1059 pm_runtime_put_noidle(dev->dev); in mei_cl_connect()
1060 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_connect()
1069 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); in mei_cl_connect()
1072 if (!mei_cl_is_other_connecting(cl) && mei_hbuf_acquire(dev)) { in mei_cl_connect()
1078 mutex_unlock(&dev->device_lock); in mei_cl_connect()
1084 mutex_lock(&dev->device_lock); in mei_cl_connect()
1088 mei_io_list_flush(&dev->ctrl_rd_list, cl); in mei_cl_connect()
1089 mei_io_list_flush(&dev->ctrl_wr_list, cl); in mei_cl_connect()
1105 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_connect()
1106 pm_runtime_mark_last_busy(dev->dev); in mei_cl_connect()
1107 pm_runtime_put_autosuspend(dev->dev); in mei_cl_connect()
1126 struct mei_cl *mei_cl_alloc_linked(struct mei_device *dev, int id) in mei_cl_alloc_linked() argument
1131 cl = mei_cl_allocate(dev); in mei_cl_alloc_linked()
1251 struct mei_device *dev = cl->dev; in mei_cl_irq_notify() local
1258 slots = mei_hbuf_empty_slots(dev); in mei_cl_irq_notify()
1264 ret = mei_hbm_cl_notify_req(dev, cl, request); in mei_cl_irq_notify()
1271 list_move_tail(&cb->list, &dev->ctrl_rd_list.list); in mei_cl_irq_notify()
1288 struct mei_device *dev; in mei_cl_notify_request() local
1293 if (WARN_ON(!cl || !cl->dev)) in mei_cl_notify_request()
1296 dev = cl->dev; in mei_cl_notify_request()
1298 if (!dev->hbm_f_ev_supported) { in mei_cl_notify_request()
1299 cl_dbg(dev, cl, "notifications not supported\n"); in mei_cl_notify_request()
1303 rets = pm_runtime_get(dev->dev); in mei_cl_notify_request()
1305 pm_runtime_put_noidle(dev->dev); in mei_cl_notify_request()
1306 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_notify_request()
1317 if (mei_hbuf_acquire(dev)) { in mei_cl_notify_request()
1318 if (mei_hbm_cl_notify_req(dev, cl, request)) { in mei_cl_notify_request()
1322 list_add_tail(&cb->list, &dev->ctrl_rd_list.list); in mei_cl_notify_request()
1324 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); in mei_cl_notify_request()
1327 mutex_unlock(&dev->device_lock); in mei_cl_notify_request()
1330 mutex_lock(&dev->device_lock); in mei_cl_notify_request()
1333 mei_io_list_flush(&dev->ctrl_rd_list, cl); in mei_cl_notify_request()
1334 mei_io_list_flush(&dev->ctrl_wr_list, cl); in mei_cl_notify_request()
1342 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_notify_request()
1343 pm_runtime_mark_last_busy(dev->dev); in mei_cl_notify_request()
1344 pm_runtime_put_autosuspend(dev->dev); in mei_cl_notify_request()
1359 struct mei_device *dev; in mei_cl_notify() local
1361 if (!cl || !cl->dev) in mei_cl_notify()
1364 dev = cl->dev; in mei_cl_notify()
1369 cl_dbg(dev, cl, "notify event"); in mei_cl_notify()
1392 struct mei_device *dev; in mei_cl_notify_get() local
1397 if (WARN_ON(!cl || !cl->dev)) in mei_cl_notify_get()
1400 dev = cl->dev; in mei_cl_notify_get()
1411 mutex_unlock(&dev->device_lock); in mei_cl_notify_get()
1413 mutex_lock(&dev->device_lock); in mei_cl_notify_get()
1435 struct mei_device *dev; in mei_cl_read_start() local
1439 if (WARN_ON(!cl || !cl->dev)) in mei_cl_read_start()
1442 dev = cl->dev; in mei_cl_read_start()
1452 cl_err(dev, cl, "no such me client\n"); in mei_cl_read_start()
1467 rets = pm_runtime_get(dev->dev); in mei_cl_read_start()
1469 pm_runtime_put_noidle(dev->dev); in mei_cl_read_start()
1470 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_read_start()
1474 if (mei_hbuf_acquire(dev)) { in mei_cl_read_start()
1475 rets = mei_hbm_cl_flow_control_req(dev, cl); in mei_cl_read_start()
1482 list_add_tail(&cb->list, &dev->ctrl_wr_list.list); in mei_cl_read_start()
1486 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_read_start()
1487 pm_runtime_mark_last_busy(dev->dev); in mei_cl_read_start()
1488 pm_runtime_put_autosuspend(dev->dev); in mei_cl_read_start()
1509 struct mei_device *dev; in mei_cl_irq_write() local
1518 if (WARN_ON(!cl || !cl->dev)) in mei_cl_irq_write()
1521 dev = cl->dev; in mei_cl_irq_write()
1532 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); in mei_cl_irq_write()
1536 slots = mei_hbuf_empty_slots(dev); in mei_cl_irq_write()
1549 } else if (slots == dev->hbuf_depth) { in mei_cl_irq_write()
1559 cl_dbg(dev, cl, "buf: size = %d idx = %lu\n", in mei_cl_irq_write()
1562 rets = mei_write_message(dev, &mei_hdr, buf->data + cb->buf_idx); in mei_cl_irq_write()
1580 list_move_tail(&cb->list, &dev->write_waiting_list.list); in mei_cl_irq_write()
1597 struct mei_device *dev; in mei_cl_write() local
1604 if (WARN_ON(!cl || !cl->dev)) in mei_cl_write()
1610 dev = cl->dev; in mei_cl_write()
1615 cl_dbg(dev, cl, "size=%d\n", size); in mei_cl_write()
1617 rets = pm_runtime_get(dev->dev); in mei_cl_write()
1619 pm_runtime_put_noidle(dev->dev); in mei_cl_write()
1620 cl_err(dev, cl, "rpm: get failed %d\n", rets); in mei_cl_write()
1638 cl_dbg(dev, cl, "No flow control credentials: not sending.\n"); in mei_cl_write()
1642 if (!mei_hbuf_acquire(dev)) { in mei_cl_write()
1643 cl_dbg(dev, cl, "Cannot acquire the host buffer: not sending.\n"); in mei_cl_write()
1649 if (size > mei_hbuf_max_len(dev)) { in mei_cl_write()
1650 mei_hdr.length = mei_hbuf_max_len(dev); in mei_cl_write()
1657 rets = mei_write_message(dev, &mei_hdr, buf->data); in mei_cl_write()
1671 list_add_tail(&cb->list, &dev->write_waiting_list.list); in mei_cl_write()
1673 list_add_tail(&cb->list, &dev->write_list.list); in mei_cl_write()
1678 mutex_unlock(&dev->device_lock); in mei_cl_write()
1681 mutex_lock(&dev->device_lock); in mei_cl_write()
1692 cl_dbg(dev, cl, "rpm: autosuspend\n"); in mei_cl_write()
1693 pm_runtime_mark_last_busy(dev->dev); in mei_cl_write()
1694 pm_runtime_put_autosuspend(dev->dev); in mei_cl_write()
1708 struct mei_device *dev = cl->dev; in mei_cl_complete() local
1717 pm_runtime_mark_last_busy(dev->dev); in mei_cl_complete()
1718 pm_request_autosuspend(dev->dev); in mei_cl_complete()
1753 void mei_cl_all_disconnect(struct mei_device *dev) in mei_cl_all_disconnect() argument
1757 list_for_each_entry(cl, &dev->file_list, link) in mei_cl_all_disconnect()
1767 void mei_cl_all_wakeup(struct mei_device *dev) in mei_cl_all_wakeup() argument
1771 list_for_each_entry(cl, &dev->file_list, link) { in mei_cl_all_wakeup()
1773 cl_dbg(dev, cl, "Waking up reading client!\n"); in mei_cl_all_wakeup()
1777 cl_dbg(dev, cl, "Waking up writing client!\n"); in mei_cl_all_wakeup()
1783 cl_dbg(dev, cl, "Waking up waiting for event clients!\n"); in mei_cl_all_wakeup()
1794 void mei_cl_all_write_clear(struct mei_device *dev) in mei_cl_all_write_clear() argument
1796 mei_io_list_free(&dev->write_list, NULL); in mei_cl_all_write_clear()
1797 mei_io_list_free(&dev->write_waiting_list, NULL); in mei_cl_all_write_clear()