Lines Matching full:handler
38 /* returns 0 if the split timeout handler is already running */
521 struct fw_address_handler *handler; in lookup_overlapping_address_handler() local
523 list_for_each_entry_rcu(handler, list, link) { in lookup_overlapping_address_handler()
524 if (handler->offset < offset + length && in lookup_overlapping_address_handler()
525 offset < handler->offset + handler->length) in lookup_overlapping_address_handler()
526 return handler; in lookup_overlapping_address_handler()
532 static bool is_enclosing_handler(struct fw_address_handler *handler, in is_enclosing_handler() argument
535 return handler->offset <= offset && in is_enclosing_handler()
536 offset + length <= handler->offset + handler->length; in is_enclosing_handler()
542 struct fw_address_handler *handler; in lookup_enclosing_address_handler() local
544 list_for_each_entry_rcu(handler, list, link) { in lookup_enclosing_address_handler()
545 if (is_enclosing_handler(handler, offset, length)) in lookup_enclosing_address_handler()
546 return handler; in lookup_enclosing_address_handler()
574 struct fw_address_handler *handler = container_of(kref, struct fw_address_handler, kref); in complete_address_handler() local
576 complete(&handler->done); in complete_address_handler()
579 static void get_address_handler(struct fw_address_handler *handler) in get_address_handler() argument
581 kref_get(&handler->kref); in get_address_handler()
584 static int put_address_handler(struct fw_address_handler *handler) in put_address_handler() argument
586 return kref_put(&handler->kref, complete_address_handler); in put_address_handler()
591 * @handler: callback
594 * region->start, ->end, and handler->length have to be quadlet-aligned.
604 * The start offset of the handler's address region is determined by
605 * fw_core_add_address_handler() and is returned in handler->offset.
609 int fw_core_add_address_handler(struct fw_address_handler *handler, in fw_core_add_address_handler() argument
618 handler->length & 3 || in fw_core_add_address_handler()
619 handler->length == 0) in fw_core_add_address_handler()
624 handler->offset = region->start; in fw_core_add_address_handler()
625 while (handler->offset + handler->length <= region->end) { in fw_core_add_address_handler()
626 if (is_in_fcp_region(handler->offset, handler->length)) in fw_core_add_address_handler()
631 handler->offset, handler->length); in fw_core_add_address_handler()
633 handler->offset += other->length; in fw_core_add_address_handler()
635 init_completion(&handler->done); in fw_core_add_address_handler()
636 kref_init(&handler->kref); in fw_core_add_address_handler()
637 list_add_tail_rcu(&handler->link, &address_handler_list); in fw_core_add_address_handler()
648 * fw_core_remove_address_handler() - unregister an address handler
649 * @handler: callback
653 * When fw_core_remove_address_handler() returns, @handler->callback() is
656 void fw_core_remove_address_handler(struct fw_address_handler *handler) in fw_core_remove_address_handler() argument
659 list_del_rcu(&handler->link); in fw_core_remove_address_handler()
663 if (!put_address_handler(handler)) in fw_core_remove_address_handler()
664 wait_for_completion(&handler->done); in fw_core_remove_address_handler()
951 struct fw_address_handler *handler; in handle_exclusive_region_request() local
961 handler = lookup_enclosing_address_handler(&address_handler_list, offset, in handle_exclusive_region_request()
963 if (handler) in handle_exclusive_region_request()
964 get_address_handler(handler); in handle_exclusive_region_request()
967 if (!handler) { in handle_exclusive_region_request()
973 handler->address_callback(card, request, tcode, destination, source, p->generation, offset, in handle_exclusive_region_request()
974 request->data, request->length, handler->callback_data); in handle_exclusive_region_request()
975 put_address_handler(handler); in handle_exclusive_region_request()
987 struct fw_address_handler *handler, **handlers; in handle_fcp_region_request() local
1013 list_for_each_entry_rcu(handler, &address_handler_list, link) { in handle_fcp_region_request()
1014 if (is_enclosing_handler(handler, offset, request->length)) { in handle_fcp_region_request()
1041 get_address_handler(handler); in handle_fcp_region_request()
1042 handlers[count++] = handler; in handle_fcp_region_request()
1048 handler = handlers[i]; in handle_fcp_region_request()
1049 handler->address_callback(card, request, tcode, destination, source, in handle_fcp_region_request()
1051 request->length, handler->callback_data); in handle_fcp_region_request()
1052 put_address_handler(handler); in handle_fcp_region_request()
1164 * The response handler may be executed while the request handler in fw_core_handle_response()
1165 * is still pending. Cancel the request handler. in fw_core_handle_response()