diff options
Diffstat (limited to 'drivers/staging/vc04_services/interface')
9 files changed, 118 insertions, 193 deletions
diff --git a/drivers/staging/vc04_services/interface/vchi/TODO b/drivers/staging/vc04_services/interface/vchi/TODO index 86708c7c8ec3..0b3ec75ff627 100644 --- a/drivers/staging/vc04_services/interface/vchi/TODO +++ b/drivers/staging/vc04_services/interface/vchi/TODO @@ -40,17 +40,12 @@ should properly handle a module unload. This also includes that all resouces must be freed (kthreads, debugfs entries, ...) and global variables avoided. -5) Fix stack hog - -Running make checkstack shows that vchiq_dump_service_use_state() has -an extensive stack usage. Maybe other functions are also affected. - -6) Cleanup logging mechanism +5) Cleanup logging mechanism The driver should probably be using the standard kernel logging mechanisms such as dev_info, dev_dbg, and friends. -7) Documentation +6) Documentation A short top-down description of this driver's architecture (function of kthreads, userspace, limitations) could be very helpful for reviewers. diff --git a/drivers/staging/vc04_services/interface/vchi/vchi_common.h b/drivers/staging/vc04_services/interface/vchi/vchi_common.h index 76e10fe65d9b..8eb2bb9f0fe2 100644 --- a/drivers/staging/vc04_services/interface/vchi/vchi_common.h +++ b/drivers/staging/vc04_services/interface/vchi/vchi_common.h @@ -97,12 +97,10 @@ typedef enum { VCHI_CALLBACK_PEER_RESUMED, VCHI_CALLBACK_FORCED_POWER_OFF, -#ifdef USE_VCHIQ_ARM // some extra notifications provided by vchiq_arm VCHI_CALLBACK_SERVICE_OPENED, VCHI_CALLBACK_BULK_RECEIVE_ABORTED, VCHI_CALLBACK_BULK_TRANSMIT_ABORTED, -#endif VCHI_CALLBACK_REASON_MAX } VCHI_CALLBACK_REASON_T; diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c index afdd3e944f3f..e76720903064 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c @@ -475,7 +475,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type) /* do not try and release vmalloc pages */ } else { actual_pages = get_user_pages_fast( - (unsigned long)buf & PAGE_MASK, + (unsigned long)buf & PAGE_MASK, num_pages, type == PAGELIST_READ, pages); @@ -582,8 +582,8 @@ free_pagelist(struct vchiq_pagelist_info *pagelistinfo, struct page **pages = pagelistinfo->pages; unsigned int num_pages = pagelistinfo->num_pages; - vchiq_log_trace(vchiq_arm_log_level, "free_pagelist - %pK, %d", - pagelistinfo->pagelist, actual); + vchiq_log_trace(vchiq_arm_log_level, "%s - %pK, %d", + __func__, pagelistinfo->pagelist, actual); /* * NOTE: dma_unmap_sg must be called before the diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c index 24d456b0a6f0..bc05c69383b8 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -168,6 +168,7 @@ static VCHIQ_STATE_T g_state; static struct class *vchiq_class; static struct device *vchiq_dev; static DEFINE_SPINLOCK(msg_queue_spinlock); +static struct platform_device *bcm2835_camera; static const char *const ioctl_names[] = { "CONNECT", @@ -215,7 +216,7 @@ VCHIQ_STATUS_T vchiq_initialise(VCHIQ_INSTANCE_T *instance_out) state = vchiq_get_state(); if (state) break; - udelay(500); + usleep_range(500, 600); } if (i == VCHIQ_INIT_RETRIES) { vchiq_log_error(vchiq_core_log_level, @@ -563,7 +564,7 @@ add_completion(VCHIQ_INSTANCE_T instance, VCHIQ_REASON_T reason, /* Out of space - wait for the client */ DEBUG_TRACE(SERVICE_CALLBACK_LINE); vchiq_log_trace(vchiq_arm_log_level, - "add_completion - completion queue full"); + "%s - completion queue full", __func__); DEBUG_COUNT(COMPLETION_QUEUE_FULL_COUNT); if (down_interruptible(&instance->remove_event) != 0) { vchiq_log_info(vchiq_arm_log_level, @@ -641,9 +642,9 @@ service_callback(VCHIQ_REASON_T reason, VCHIQ_HEADER_T *header, return VCHIQ_SUCCESS; vchiq_log_trace(vchiq_arm_log_level, - "service_callback - service %lx(%d,%p), reason %d, header %lx, " + "%s - service %lx(%d,%p), reason %d, header %lx, " "instance %lx, bulk_userdata %lx", - (unsigned long)user_service, + __func__, (unsigned long)user_service, service->localport, user_service->userdata, reason, (unsigned long)header, (unsigned long)instance, (unsigned long)bulk_userdata); @@ -679,12 +680,12 @@ service_callback(VCHIQ_REASON_T reason, VCHIQ_HEADER_T *header, if (down_interruptible(&user_service->remove_event) != 0) { vchiq_log_info(vchiq_arm_log_level, - "service_callback interrupted"); + "%s interrupted", __func__); DEBUG_TRACE(SERVICE_CALLBACK_LINE); return VCHIQ_RETRY; } else if (instance->closing) { vchiq_log_info(vchiq_arm_log_level, - "service_callback closing"); + "%s closing", __func__); DEBUG_TRACE(SERVICE_CALLBACK_LINE); return VCHIQ_ERROR; } @@ -740,8 +741,8 @@ user_service_free(void *userdata) static void close_delivered(USER_SERVICE_T *user_service) { vchiq_log_info(vchiq_arm_log_level, - "close_delivered(handle=%x)", - user_service->service->handle); + "%s(handle=%x)", + __func__, user_service->service->handle); if (user_service->close_pending) { /* Allow the underlying service to be culled */ @@ -872,8 +873,8 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) DEBUG_INITIALISE(g_state.local) vchiq_log_trace(vchiq_arm_log_level, - "vchiq_ioctl - instance %pK, cmd %s, arg %lx", - instance, + "%s - instance %pK, cmd %s, arg %lx", + __func__, instance, ((_IOC_TYPE(cmd) == VCHIQ_IOC_MAGIC) && (_IOC_NR(cmd) <= VCHIQ_IOC_MAX)) ? ioctl_names[_IOC_NR(cmd)] : "<invalid>", arg); @@ -2017,7 +2018,6 @@ vchiq_open(struct inode *inode, struct file *file) vchiq_log_info(vchiq_arm_log_level, "vchiq_open"); switch (dev) { case VCHIQ_MINOR: { - int ret; VCHIQ_STATE_T *state = vchiq_get_state(); VCHIQ_INSTANCE_T instance; @@ -2034,11 +2034,7 @@ vchiq_open(struct inode *inode, struct file *file) instance->state = state; instance->pid = current->tgid; - ret = vchiq_debugfs_add_instance(instance); - if (ret != 0) { - kfree(instance); - return ret; - } + vchiq_debugfs_add_instance(instance); sema_init(&instance->insert_event, 0); sema_init(&instance->remove_event, 0); @@ -2078,8 +2074,8 @@ vchiq_release(struct inode *inode, struct file *file) int i; vchiq_log_info(vchiq_arm_log_level, - "vchiq_release: instance=%lx", - (unsigned long)instance); + "%s: instance=%lx", + __func__, (unsigned long)instance); if (!state) { ret = -EPERM; @@ -2128,9 +2124,11 @@ vchiq_release(struct inode *inode, struct file *file) while (user_service->msg_remove != user_service->msg_insert) { - VCHIQ_HEADER_T *header = user_service-> - msg_queue[user_service->msg_remove & - (MSG_QUEUE_SIZE - 1)]; + VCHIQ_HEADER_T *header; + int m = user_service->msg_remove & + (MSG_QUEUE_SIZE - 1); + + header = user_service->msg_queue[m]; user_service->msg_remove++; spin_unlock(&msg_queue_spinlock); @@ -2666,8 +2664,7 @@ start_suspend_timer(VCHIQ_ARM_STATE_T *arm_state) { del_timer(&arm_state->suspend_timer); arm_state->suspend_timer.expires = jiffies + - msecs_to_jiffies(arm_state-> - suspend_timer_timeout); + msecs_to_jiffies(arm_state->suspend_timer_timeout); add_timer(&arm_state->suspend_timer); arm_state->suspend_timer_running = 1; } @@ -3019,7 +3016,6 @@ vchiq_check_suspend(VCHIQ_STATE_T *state) out: vchiq_log_trace(vchiq_susp_log_level, "%s exit", __func__); - return; } int @@ -3414,13 +3410,18 @@ vchiq_release_service(VCHIQ_SERVICE_HANDLE_T handle) return ret; } +struct service_data_struct { + int fourcc; + int clientid; + int use_count; +}; + void vchiq_dump_service_use_state(VCHIQ_STATE_T *state) { VCHIQ_ARM_STATE_T *arm_state = vchiq_platform_get_arm_state(state); - int i, j = 0; - /* Only dump 64 services */ - static const int local_max_services = 64; + struct service_data_struct *service_data; + int i, found = 0; /* If there's more than 64 services, only dump ones with * non-zero counts */ int only_nonzero = 0; @@ -3431,25 +3432,25 @@ vchiq_dump_service_use_state(VCHIQ_STATE_T *state) int peer_count; int vc_use_count; int active_services; - struct service_data_struct { - int fourcc; - int clientid; - int use_count; - } service_data[local_max_services]; if (!arm_state) return; + service_data = kmalloc_array(MAX_SERVICES, sizeof(*service_data), + GFP_KERNEL); + if (!service_data) + return; + read_lock_bh(&arm_state->susp_res_lock); vc_suspend_state = arm_state->vc_suspend_state; vc_resume_state = arm_state->vc_resume_state; peer_count = arm_state->peer_use_count; vc_use_count = arm_state->videocore_use_count; active_services = state->unused_service; - if (active_services > local_max_services) + if (active_services > MAX_SERVICES) only_nonzero = 1; - for (i = 0; (i < active_services) && (j < local_max_services); i++) { + for (i = 0; i < active_services; i++) { VCHIQ_SERVICE_T *service_ptr = state->services[i]; if (!service_ptr) @@ -3461,9 +3462,12 @@ vchiq_dump_service_use_state(VCHIQ_STATE_T *state) if (service_ptr->srvstate == VCHIQ_SRVSTATE_FREE) continue; - service_data[j].fourcc = service_ptr->base.fourcc; - service_data[j].clientid = service_ptr->client_id; - service_data[j++].use_count = service_ptr->service_use_count; + service_data[found].fourcc = service_ptr->base.fourcc; + service_data[found].clientid = service_ptr->client_id; + service_data[found].use_count = service_ptr->service_use_count; + found++; + if (found >= MAX_SERVICES) + break; } read_unlock_bh(&arm_state->susp_res_lock); @@ -3478,10 +3482,9 @@ vchiq_dump_service_use_state(VCHIQ_STATE_T *state) if (only_nonzero) vchiq_log_warning(vchiq_susp_log_level, "Too many active " "services (%d). Only dumping up to first %d services " - "with non-zero use-count", active_services, - local_max_services); + "with non-zero use-count", active_services, found); - for (i = 0; i < j; i++) { + for (i = 0; i < found; i++) { vchiq_log_warning(vchiq_susp_log_level, "----- %c%c%c%c:%d service count %d %s", VCHIQ_FOURCC_AS_4CHARS(service_data[i].fourcc), @@ -3494,6 +3497,8 @@ vchiq_dump_service_use_state(VCHIQ_STATE_T *state) vchiq_log_warning(vchiq_susp_log_level, "--- Overall vchiq instance use count %d", vc_use_count); + kfree(service_data); + vchiq_dump_platform_use_state(state); } @@ -3620,19 +3625,19 @@ static int vchiq_probe(struct platform_device *pdev) goto failed_device_create; /* create debugfs entries */ - err = vchiq_debugfs_init(); - if (err != 0) - goto failed_debugfs_init; + vchiq_debugfs_init(); vchiq_log_info(vchiq_arm_log_level, "vchiq: initialised - version %d (min %d), device %d.%d", VCHIQ_VERSION, VCHIQ_VERSION_MIN, MAJOR(vchiq_devid), MINOR(vchiq_devid)); + bcm2835_camera = platform_device_register_data(&pdev->dev, + "bcm2835-camera", -1, + NULL, 0); + return 0; -failed_debugfs_init: - device_destroy(vchiq_class, vchiq_devid); failed_device_create: class_destroy(vchiq_class); failed_class_create: @@ -3646,6 +3651,7 @@ failed_platform_init: static int vchiq_remove(struct platform_device *pdev) { + platform_device_unregister(bcm2835_camera); vchiq_debugfs_deinit(); device_destroy(vchiq_class, vchiq_devid); class_destroy(vchiq_class); diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c index 5d28fff46557..7642ced31436 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c @@ -601,6 +601,7 @@ reserve_space(VCHIQ_STATE_T *state, size_t space, int is_blocking) } if (tx_pos == (state->slot_queue_available * VCHIQ_SLOT_SIZE)) { + up(&state->slot_available_event); pr_warn("%s: invalid tx_pos: %d\n", __func__, tx_pos); return NULL; } @@ -619,10 +620,9 @@ reserve_space(VCHIQ_STATE_T *state, size_t space, int is_blocking) /* Called by the recycle thread. */ static void -process_free_queue(VCHIQ_STATE_T *state) +process_free_queue(VCHIQ_STATE_T *state, BITSET_T *service_found, size_t length) { VCHIQ_SHARED_STATE_T *local = state->local; - BITSET_T service_found[BITSET_SIZE(VCHIQ_MAX_SERVICES)]; int slot_queue_available; /* Find slots which have been freed by the other side, and return them @@ -655,7 +655,7 @@ process_free_queue(VCHIQ_STATE_T *state) /* Initialise the bitmask for services which have used this ** slot */ - BITSET_ZERO(service_found); + memset(service_found, 0, length); pos = 0; @@ -1197,8 +1197,8 @@ release_slot(VCHIQ_STATE_T *state, VCHIQ_SLOT_INFO_T *slot_info, SLOT_INDEX_FROM_INFO(state, slot_info); state->remote->slot_queue_recycle = slot_queue_recycle + 1; vchiq_log_info(vchiq_core_log_level, - "%d: release_slot %d - recycle->%x", - state->id, SLOT_INDEX_FROM_INFO(state, slot_info), + "%d: %s %d - recycle->%x", state->id, __func__, + SLOT_INDEX_FROM_INFO(state, slot_info), state->remote->slot_queue_recycle); /* A write barrier is necessary, but remote_event_signal @@ -2182,11 +2182,20 @@ recycle_func(void *v) { VCHIQ_STATE_T *state = (VCHIQ_STATE_T *) v; VCHIQ_SHARED_STATE_T *local = state->local; + BITSET_T *found; + size_t length; + + length = sizeof(*found) * BITSET_SIZE(VCHIQ_MAX_SERVICES); + + found = kmalloc_array(BITSET_SIZE(VCHIQ_MAX_SERVICES), sizeof(*found), + GFP_KERNEL); + if (!found) + return -ENOMEM; while (1) { remote_event_wait(state, &local->recycle); - process_free_queue(state); + process_free_queue(state, found, length); } return 0; } @@ -2329,8 +2338,8 @@ vchiq_init_slots(void *mem_base, int mem_size) if (num_slots < 4) { vchiq_log_error(vchiq_core_log_level, - "vchiq_init_slots - insufficient memory %x bytes", - mem_size); + "%s - insufficient memory %x bytes", + __func__, mem_size); return NULL; } @@ -2544,7 +2553,6 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero, return VCHIQ_ERROR; } set_user_nice(state->slot_handler_thread, -19); - wake_up_process(state->slot_handler_thread); snprintf(threadname, sizeof(threadname), "vchiq-recy/%d", state->id); state->recycle_thread = kthread_create(&recycle_func, @@ -2554,10 +2562,9 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero, vchiq_loud_error_header(); vchiq_loud_error("couldn't create thread %s", threadname); vchiq_loud_error_footer(); - return VCHIQ_ERROR; + goto fail_free_handler_thread; } set_user_nice(state->recycle_thread, -19); - wake_up_process(state->recycle_thread); snprintf(threadname, sizeof(threadname), "vchiq-sync/%d", state->id); state->sync_thread = kthread_create(&sync_func, @@ -2567,9 +2574,12 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero, vchiq_loud_error_header(); vchiq_loud_error("couldn't create thread %s", threadname); vchiq_loud_error_footer(); - return VCHIQ_ERROR; + goto fail_free_recycle_thread; } set_user_nice(state->sync_thread, -20); + + wake_up_process(state->slot_handler_thread); + wake_up_process(state->recycle_thread); wake_up_process(state->sync_thread); vchiq_states[0] = state; @@ -2578,6 +2588,13 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero, local->initialised = 1; return status; + +fail_free_recycle_thread: + kthread_stop(state->recycle_thread); +fail_free_handler_thread: + kthread_stop(state->slot_handler_thread); + + return VCHIQ_ERROR; } /* Called from application thread when a client or server service is created. */ @@ -2861,9 +2878,9 @@ close_service_complete(VCHIQ_SERVICE_T *service, int failstate) break; default: vchiq_log_error(vchiq_core_log_level, - "close_service_complete(%x) called in state %s", + "%s(%x) called in state %s", __func__, service->handle, srvstate_names[service->srvstate]); - WARN(1, "close_service_complete in unexpected state\n"); + WARN(1, "%s in unexpected state\n", __func__); return VCHIQ_ERROR; } @@ -2915,9 +2932,9 @@ vchiq_close_service_internal(VCHIQ_SERVICE_T *service, int close_recvd) case VCHIQ_SRVSTATE_CLOSEWAIT: if (close_recvd) vchiq_log_error(vchiq_core_log_level, - "vchiq_close_service_internal(1) called " + "%s(1) called " "in state %s", - srvstate_names[service->srvstate]); + __func__, srvstate_names[service->srvstate]); else if (is_server) { if (service->srvstate == VCHIQ_SRVSTATE_LISTENING) { status = VCHIQ_ERROR; @@ -3024,7 +3041,7 @@ vchiq_close_service_internal(VCHIQ_SERVICE_T *service, int close_recvd) default: vchiq_log_error(vchiq_core_log_level, - "vchiq_close_service_internal(%d) called in state %s", + "%s(%d) called in state %s", __func__, close_recvd, srvstate_names[service->srvstate]); break; } @@ -3145,8 +3162,8 @@ vchiq_pause_internal(VCHIQ_STATE_T *state) break; default: vchiq_log_error(vchiq_core_log_level, - "vchiq_pause_internal in state %s\n", - conn_state_names[state->conn_state]); + "%s in state %s\n", + __func__, conn_state_names[state->conn_state]); status = VCHIQ_ERROR; VCHIQ_STATS_INC(state, error_count); break; diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h index afc1d8144a84..10deb5745dda 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h @@ -147,7 +147,6 @@ vchiq_static_assert((sizeof(BITSET_T) * 8) == 32); #define BITSET_SIZE(b) ((b + 31) >> 5) #define BITSET_WORD(b) (b >> 5) #define BITSET_BIT(b) (1 << (b & 31)) -#define BITSET_ZERO(bs) memset(bs, 0, sizeof(bs)) #define BITSET_IS_SET(bs, b) (bs[BITSET_WORD(b)] & BITSET_BIT(b)) #define BITSET_SET(bs, b) (bs[BITSET_WORD(b)] |= BITSET_BIT(b)) #define BITSET_CLR(bs, b) (bs[BITSET_WORD(b)] &= ~BITSET_BIT(b)) diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c index 766b4fe5f32c..38805504d462 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c @@ -51,25 +51,14 @@ #define VCHIQ_LOG_INFO_STR "info" #define VCHIQ_LOG_TRACE_STR "trace" -/* Top-level debug info */ -struct vchiq_debugfs_info { - /* Global 'vchiq' debugfs entry used by all instances */ - struct dentry *vchiq_cfg_dir; - - /* one entry per client process */ - struct dentry *clients; - - /* log categories */ - struct dentry *log_categories; -}; - -static struct vchiq_debugfs_info debugfs_info; +/* Global 'vchiq' debugfs and clients entry used by all instances */ +struct dentry *vchiq_dbg_dir; +struct dentry *vchiq_dbg_clients; /* Log category debugfs entries */ struct vchiq_debugfs_log_entry { const char *name; - int *plevel; - struct dentry *dir; + void *plevel; }; static struct vchiq_debugfs_log_entry vchiq_debugfs_log_entries[] = { @@ -81,9 +70,6 @@ static struct vchiq_debugfs_log_entry vchiq_debugfs_log_entries[] = { }; static int n_log_entries = ARRAY_SIZE(vchiq_debugfs_log_entries); -static struct dentry *vchiq_clients_top(void); -static struct dentry *vchiq_debugfs_top(void); - static int debugfs_log_show(struct seq_file *f, void *offset) { int *levp = f->private; @@ -157,36 +143,6 @@ static const struct file_operations debugfs_log_fops = { .release = single_release, }; -/* create an entry under <debugfs>/vchiq/log for each log category */ -static int vchiq_debugfs_create_log_entries(struct dentry *top) -{ - struct dentry *dir; - size_t i; - int ret = 0; - - dir = debugfs_create_dir("log", vchiq_debugfs_top()); - if (!dir) - return -ENOMEM; - debugfs_info.log_categories = dir; - - for (i = 0; i < n_log_entries; i++) { - void *levp = (void *)vchiq_debugfs_log_entries[i].plevel; - - dir = debugfs_create_file(vchiq_debugfs_log_entries[i].name, - 0644, - debugfs_info.log_categories, - levp, - &debugfs_log_fops); - if (!dir) { - ret = -ENOMEM; - break; - } - - vchiq_debugfs_log_entries[i].dir = dir; - } - return ret; -} - static int debugfs_usecount_show(struct seq_file *f, void *offset) { VCHIQ_INSTANCE_T instance = f->private; @@ -268,43 +224,21 @@ static const struct file_operations debugfs_trace_fops = { }; /* add an instance (process) to the debugfs entries */ -int vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance) +void vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance) { char pidstr[16]; - struct dentry *top, *use_count, *trace; - struct dentry *clients = vchiq_clients_top(); + struct dentry *top; snprintf(pidstr, sizeof(pidstr), "%d", vchiq_instance_get_pid(instance)); - top = debugfs_create_dir(pidstr, clients); - if (!top) - goto fail_top; + top = debugfs_create_dir(pidstr, vchiq_dbg_clients); - use_count = debugfs_create_file("use_count", - 0444, top, - instance, - &debugfs_usecount_fops); - if (!use_count) - goto fail_use_count; - - trace = debugfs_create_file("trace", - 0644, top, - instance, - &debugfs_trace_fops); - if (!trace) - goto fail_trace; + debugfs_create_file("use_count", 0444, top, instance, + &debugfs_usecount_fops); + debugfs_create_file("trace", 0644, top, instance, &debugfs_trace_fops); vchiq_instance_get_debugfs_node(instance)->dentry = top; - - return 0; - -fail_trace: - debugfs_remove(use_count); -fail_use_count: - debugfs_remove(top); -fail_top: - return -ENOMEM; } void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance) @@ -314,64 +248,41 @@ void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance) debugfs_remove_recursive(node->dentry); } -int vchiq_debugfs_init(void) +void vchiq_debugfs_init(void) { - BUG_ON(debugfs_info.vchiq_cfg_dir != NULL); - - debugfs_info.vchiq_cfg_dir = debugfs_create_dir("vchiq", NULL); - if (debugfs_info.vchiq_cfg_dir == NULL) - goto fail; - - debugfs_info.clients = debugfs_create_dir("clients", - vchiq_debugfs_top()); - if (!debugfs_info.clients) - goto fail; - - if (vchiq_debugfs_create_log_entries(vchiq_debugfs_top()) != 0) - goto fail; + struct dentry *dir; + int i; - return 0; + vchiq_dbg_dir = debugfs_create_dir("vchiq", NULL); + vchiq_dbg_clients = debugfs_create_dir("clients", vchiq_dbg_dir); -fail: - vchiq_debugfs_deinit(); - vchiq_log_error(vchiq_arm_log_level, - "%s: failed to create debugfs directory", - __func__); + /* create an entry under <debugfs>/vchiq/log for each log category */ + dir = debugfs_create_dir("log", vchiq_dbg_dir); - return -ENOMEM; + for (i = 0; i < n_log_entries; i++) + debugfs_create_file(vchiq_debugfs_log_entries[i].name, 0644, + dir, vchiq_debugfs_log_entries[i].plevel, + &debugfs_log_fops); } /* remove all the debugfs entries */ void vchiq_debugfs_deinit(void) { - debugfs_remove_recursive(vchiq_debugfs_top()); -} - -static struct dentry *vchiq_clients_top(void) -{ - return debugfs_info.clients; -} - -static struct dentry *vchiq_debugfs_top(void) -{ - BUG_ON(debugfs_info.vchiq_cfg_dir == NULL); - return debugfs_info.vchiq_cfg_dir; + debugfs_remove_recursive(vchiq_dbg_dir); } #else /* CONFIG_DEBUG_FS */ -int vchiq_debugfs_init(void) +void vchiq_debugfs_init(void) { - return 0; } void vchiq_debugfs_deinit(void) { } -int vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance) +void vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance) { - return 0; } void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance) diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h index 1d95e3d70621..3af6397ada19 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.h @@ -40,11 +40,11 @@ typedef struct vchiq_debugfs_node_struct { struct dentry *dentry; } VCHIQ_DEBUGFS_NODE_T; -int vchiq_debugfs_init(void); +void vchiq_debugfs_init(void); void vchiq_debugfs_deinit(void); -int vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance); +void vchiq_debugfs_add_instance(VCHIQ_INSTANCE_T instance); void vchiq_debugfs_remove_instance(VCHIQ_INSTANCE_T instance); diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c index 29984f9795c7..dddc828390d0 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c @@ -590,7 +590,6 @@ static VCHIQ_STATUS_T shim_callback(VCHIQ_REASON_T reason, VCHI_CALLBACK_MSG_AVAILABLE, NULL); goto done; - break; case VCHIQ_BULK_TRANSMIT_DONE: service->callback(service->callback_param, |