Lines Matching refs:ctl
41 #define tb_ctl_WARN(ctl, format, arg...) \ argument
42 dev_WARN(&(ctl)->nhi->pdev->dev, format, ## arg)
44 #define tb_ctl_err(ctl, format, arg...) \ argument
45 dev_err(&(ctl)->nhi->pdev->dev, format, ## arg)
47 #define tb_ctl_warn(ctl, format, arg...) \ argument
48 dev_warn(&(ctl)->nhi->pdev->dev, format, ## arg)
50 #define tb_ctl_info(ctl, format, arg...) \ argument
51 dev_info(&(ctl)->nhi->pdev->dev, format, ## arg)
53 #define tb_ctl_dbg(ctl, format, arg...) \ argument
54 dev_dbg(&(ctl)->nhi->pdev->dev, format, ## arg)
111 static int tb_cfg_request_enqueue(struct tb_ctl *ctl, in tb_cfg_request_enqueue() argument
115 WARN_ON(req->ctl); in tb_cfg_request_enqueue()
117 mutex_lock(&ctl->request_queue_lock); in tb_cfg_request_enqueue()
118 if (!ctl->running) { in tb_cfg_request_enqueue()
119 mutex_unlock(&ctl->request_queue_lock); in tb_cfg_request_enqueue()
122 req->ctl = ctl; in tb_cfg_request_enqueue()
123 list_add_tail(&req->list, &ctl->request_queue); in tb_cfg_request_enqueue()
125 mutex_unlock(&ctl->request_queue_lock); in tb_cfg_request_enqueue()
131 struct tb_ctl *ctl = req->ctl; in tb_cfg_request_dequeue() local
133 mutex_lock(&ctl->request_queue_lock); in tb_cfg_request_dequeue()
138 mutex_unlock(&ctl->request_queue_lock); in tb_cfg_request_dequeue()
147 tb_cfg_request_find(struct tb_ctl *ctl, struct ctl_pkg *pkg) in tb_cfg_request_find() argument
152 mutex_lock(&pkg->ctl->request_queue_lock); in tb_cfg_request_find()
153 list_for_each_entry(req, &pkg->ctl->request_queue, list) { in tb_cfg_request_find()
161 mutex_unlock(&pkg->ctl->request_queue_lock); in tb_cfg_request_find()
255 static void tb_cfg_print_error(struct tb_ctl *ctl, in tb_cfg_print_error() argument
269 tb_ctl_WARN(ctl, in tb_cfg_print_error()
279 tb_ctl_WARN(ctl, "CFG_ERROR(%llx:%x): Invalid port\n", in tb_cfg_print_error()
283 tb_ctl_WARN(ctl, "CFG_ERROR(%llx:%x): Route contains a loop\n", in tb_cfg_print_error()
288 tb_ctl_WARN(ctl, "CFG_ERROR(%llx:%x): Unknown error\n", in tb_cfg_print_error()
302 dma_pool_free(pkg->ctl->frame_pool, in tb_ctl_pkg_free()
308 static struct ctl_pkg *tb_ctl_pkg_alloc(struct tb_ctl *ctl) in tb_ctl_pkg_alloc() argument
313 pkg->ctl = ctl; in tb_ctl_pkg_alloc()
314 pkg->buffer = dma_pool_alloc(ctl->frame_pool, GFP_KERNEL, in tb_ctl_pkg_alloc()
340 static int tb_ctl_tx(struct tb_ctl *ctl, const void *data, size_t len, in tb_ctl_tx() argument
346 tb_ctl_WARN(ctl, "TX: invalid size: %zu\n", len); in tb_ctl_tx()
350 tb_ctl_WARN(ctl, "TX: packet too large: %zu/%d\n", in tb_ctl_tx()
354 pkg = tb_ctl_pkg_alloc(ctl); in tb_ctl_tx()
364 res = tb_ring_tx(ctl->tx, &pkg->frame); in tb_ctl_tx()
373 static bool tb_ctl_handle_event(struct tb_ctl *ctl, enum tb_cfg_pkg_type type, in tb_ctl_handle_event() argument
376 return ctl->callback(ctl->callback_data, type, pkg->buffer, size); in tb_ctl_handle_event()
381 tb_ring_rx(pkg->ctl->rx, &pkg->frame); /* in tb_ctl_rx_submit()
421 tb_ctl_err(pkg->ctl, "RX: invalid size %#x, dropping packet\n", in tb_ctl_rx_callback()
437 tb_ctl_err(pkg->ctl, in tb_ctl_rx_callback()
442 tb_ctl_handle_event(pkg->ctl, frame->eof, in tb_ctl_rx_callback()
452 tb_ctl_err(pkg->ctl, in tb_ctl_rx_callback()
458 if (tb_ctl_handle_event(pkg->ctl, frame->eof, pkg, frame->size)) in tb_ctl_rx_callback()
472 req = tb_cfg_request_find(pkg->ctl, pkg); in tb_ctl_rx_callback()
504 int tb_cfg_request(struct tb_ctl *ctl, struct tb_cfg_request *req, in tb_cfg_request() argument
516 ret = tb_cfg_request_enqueue(ctl, req); in tb_cfg_request()
520 ret = tb_ctl_tx(ctl, req->request, req->request_size, in tb_cfg_request()
570 struct tb_cfg_result tb_cfg_request_sync(struct tb_ctl *ctl, in tb_cfg_request_sync() argument
579 ret = tb_cfg_request(ctl, req, tb_cfg_request_complete, &done); in tb_cfg_request_sync()
605 struct tb_ctl *ctl = kzalloc(sizeof(*ctl), GFP_KERNEL); in tb_ctl_alloc() local
606 if (!ctl) in tb_ctl_alloc()
608 ctl->nhi = nhi; in tb_ctl_alloc()
609 ctl->callback = cb; in tb_ctl_alloc()
610 ctl->callback_data = cb_data; in tb_ctl_alloc()
612 mutex_init(&ctl->request_queue_lock); in tb_ctl_alloc()
613 INIT_LIST_HEAD(&ctl->request_queue); in tb_ctl_alloc()
614 ctl->frame_pool = dma_pool_create("thunderbolt_ctl", &nhi->pdev->dev, in tb_ctl_alloc()
616 if (!ctl->frame_pool) in tb_ctl_alloc()
619 ctl->tx = tb_ring_alloc_tx(nhi, 0, 10, RING_FLAG_NO_SUSPEND); in tb_ctl_alloc()
620 if (!ctl->tx) in tb_ctl_alloc()
623 ctl->rx = tb_ring_alloc_rx(nhi, 0, 10, RING_FLAG_NO_SUSPEND, 0xffff, in tb_ctl_alloc()
625 if (!ctl->rx) in tb_ctl_alloc()
629 ctl->rx_packets[i] = tb_ctl_pkg_alloc(ctl); in tb_ctl_alloc()
630 if (!ctl->rx_packets[i]) in tb_ctl_alloc()
632 ctl->rx_packets[i]->frame.callback = tb_ctl_rx_callback; in tb_ctl_alloc()
635 tb_ctl_dbg(ctl, "control channel created\n"); in tb_ctl_alloc()
636 return ctl; in tb_ctl_alloc()
638 tb_ctl_free(ctl); in tb_ctl_alloc()
649 void tb_ctl_free(struct tb_ctl *ctl) in tb_ctl_free() argument
653 if (!ctl) in tb_ctl_free()
656 if (ctl->rx) in tb_ctl_free()
657 tb_ring_free(ctl->rx); in tb_ctl_free()
658 if (ctl->tx) in tb_ctl_free()
659 tb_ring_free(ctl->tx); in tb_ctl_free()
663 tb_ctl_pkg_free(ctl->rx_packets[i]); in tb_ctl_free()
666 dma_pool_destroy(ctl->frame_pool); in tb_ctl_free()
667 kfree(ctl); in tb_ctl_free()
673 void tb_ctl_start(struct tb_ctl *ctl) in tb_ctl_start() argument
676 tb_ctl_dbg(ctl, "control channel starting...\n"); in tb_ctl_start()
677 tb_ring_start(ctl->tx); /* is used to ack hotplug packets, start first */ in tb_ctl_start()
678 tb_ring_start(ctl->rx); in tb_ctl_start()
680 tb_ctl_rx_submit(ctl->rx_packets[i]); in tb_ctl_start()
682 ctl->running = true; in tb_ctl_start()
693 void tb_ctl_stop(struct tb_ctl *ctl) in tb_ctl_stop() argument
695 mutex_lock(&ctl->request_queue_lock); in tb_ctl_stop()
696 ctl->running = false; in tb_ctl_stop()
697 mutex_unlock(&ctl->request_queue_lock); in tb_ctl_stop()
699 tb_ring_stop(ctl->rx); in tb_ctl_stop()
700 tb_ring_stop(ctl->tx); in tb_ctl_stop()
702 if (!list_empty(&ctl->request_queue)) in tb_ctl_stop()
703 tb_ctl_WARN(ctl, "dangling request in request_queue\n"); in tb_ctl_stop()
704 INIT_LIST_HEAD(&ctl->request_queue); in tb_ctl_stop()
705 tb_ctl_dbg(ctl, "control channel stopped\n"); in tb_ctl_stop()
715 int tb_cfg_error(struct tb_ctl *ctl, u64 route, u32 port, in tb_cfg_error() argument
723 tb_ctl_dbg(ctl, "resetting error on %llx:%x.\n", route, port); in tb_cfg_error()
724 return tb_ctl_tx(ctl, &pkg, sizeof(pkg), TB_CFG_PKG_ERROR); in tb_cfg_error()
777 struct tb_cfg_result tb_cfg_reset(struct tb_ctl *ctl, u64 route, in tb_cfg_reset() argument
800 res = tb_cfg_request_sync(ctl, req, timeout_msec); in tb_cfg_reset()
812 struct tb_cfg_result tb_cfg_read_raw(struct tb_ctl *ctl, void *buffer, in tb_cfg_read_raw() argument
849 res = tb_cfg_request_sync(ctl, req, timeout_msec); in tb_cfg_read_raw()
875 struct tb_cfg_result tb_cfg_write_raw(struct tb_ctl *ctl, const void *buffer, in tb_cfg_write_raw() argument
914 res = tb_cfg_request_sync(ctl, req, timeout_msec); in tb_cfg_write_raw()
933 static int tb_cfg_get_error(struct tb_ctl *ctl, enum tb_cfg_space space, in tb_cfg_get_error() argument
946 tb_cfg_print_error(ctl, res); in tb_cfg_get_error()
950 int tb_cfg_read(struct tb_ctl *ctl, void *buffer, u64 route, u32 port, in tb_cfg_read() argument
953 struct tb_cfg_result res = tb_cfg_read_raw(ctl, buffer, route, port, in tb_cfg_read()
962 return tb_cfg_get_error(ctl, space, &res); in tb_cfg_read()
965 tb_ctl_warn(ctl, "timeout reading config space %u from %#x\n", in tb_cfg_read()
976 int tb_cfg_write(struct tb_ctl *ctl, const void *buffer, u64 route, u32 port, in tb_cfg_write() argument
979 struct tb_cfg_result res = tb_cfg_write_raw(ctl, buffer, route, port, in tb_cfg_write()
988 return tb_cfg_get_error(ctl, space, &res); in tb_cfg_write()
991 tb_ctl_warn(ctl, "timeout writing config space %u to %#x\n", in tb_cfg_write()
1011 int tb_cfg_get_upstream_port(struct tb_ctl *ctl, u64 route) in tb_cfg_get_upstream_port() argument
1014 struct tb_cfg_result res = tb_cfg_read_raw(ctl, &dummy, route, 0, in tb_cfg_get_upstream_port()