diff options
author | 2022-03-28 12:50:50 -0700 | |
---|---|---|
committer | 2022-03-28 12:50:50 -0700 | |
commit | dfdc1de64248b5e1024d8188aeaf0e59ec6cecd5 (patch) | |
tree | a1ced75e6a54c6dc0f7e41bbf517012bb0d21af6 /drivers/staging/vc04_services | |
parent | Merge tag 'driver-core-5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core (diff) | |
parent | staging: r8188eu: remove unnecessary memset in r8188eu (diff) | |
download | wireguard-linux-dfdc1de64248b5e1024d8188aeaf0e59ec6cecd5.tar.xz wireguard-linux-dfdc1de64248b5e1024d8188aeaf0e59ec6cecd5.zip |
Merge tag 'staging-5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging driver updates from Greg KH:
"Here is the big set of staging driver updates for 5.18-rc1.
Loads of tiny cleanups for almost all staging drivers in here, nothing
major at all. Highlights include:
- remove the ashmem Android driver. It is long-dead and if there are
any legacy userspace applications still using it, the Android
kernel images will maintain it, the community shouldn't care about
it anymore
- wfx wifi driver major cleanups. Should be ready to merge out of
staging soon, and will coordinate with the wifi maintainers after
-rc1 is out
- major cleanups and unwinding of the layers of the r8188eu driver.
It's amazing just how many unneeded layers of abstraction is in
there, just when we think it's done, another is found...
- lots of tiny coding style cleanups in many other staging drivers.
All have been in linux-next for a while with no reported problems"
* tag 'staging-5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (455 commits)
staging: r8188eu: remove unnecessary memset in r8188eu
staging: greybus: introduce pwm_ops::apply
staging: rts5208: Resolve checkpatch.pl issues.
staging: sm750fb: fix naming style
staging: fbtft: Consider type of init sequence values in fbtft_init_display()
staging: fbtft: Constify buf parameter in fbtft_dbg_hex()
staging: mmal-vchiq: clear redundant item named bulk_scratch
mips: dts: ralink: add MT7621 SoC
staging: r8188eu: remove some unused local ieee80211 macros
staging: r8188eu: make rtl8188e_process_phy_info static
staging: r8188eu: remove unused function prototype
staging: r8188eu: remove three unused receive defines
staging: r8188eu: remove unnecessary initializations
staging: rtl8192e: Fix spelling mistake "RESQUEST" -> "REQUEST"
MAINTAINERS: remove the obsolete file entry for staging in ANDROID DRIVERS
staging: r8188eu: proper error handling in rtw_init_drv_sw
staging: r8188eu: call _cancel_timer_ex from _rtw_free_recv_priv
staging: vt6656: Removed unused variable vt3342_vnt_threshold
staging: vt6656: Removed unused variable bb_vga_0
staging: remove ashmem
...
Diffstat (limited to 'drivers/staging/vc04_services')
8 files changed, 110 insertions, 150 deletions
diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c index 253d755e547f..88b1878854e0 100644 --- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c @@ -33,8 +33,6 @@ #include "mmal-parameters.h" #include "bcm2835-camera.h" -#define BM2835_MMAL_VERSION "0.0.2" -#define BM2835_MMAL_MODULE_NAME "bcm2835-v4l2" #define MIN_WIDTH 32 #define MIN_HEIGHT 32 #define MIN_BUFFER_SIZE (80 * 1024) @@ -1894,8 +1892,7 @@ static int bcm2835_mmal_probe(struct platform_device *pdev) dev->capture.fmt = &formats[3]; /* JPEG */ /* v4l device registration */ - dev->camera_num = v4l2_device_set_name(&dev->v4l2_dev, - BM2835_MMAL_MODULE_NAME, + dev->camera_num = v4l2_device_set_name(&dev->v4l2_dev, KBUILD_MODNAME, &camera_instance); ret = v4l2_device_register(NULL, &dev->v4l2_dev); if (ret) { @@ -1954,9 +1951,7 @@ static int bcm2835_mmal_probe(struct platform_device *pdev) goto unreg_dev; } - v4l2_info(&dev->v4l2_dev, - "Broadcom 2835 MMAL video capture ver %s loaded.\n", - BM2835_MMAL_VERSION); + v4l2_info(&dev->v4l2_dev, "Broadcom 2835 MMAL video capture loaded.\n"); gdev[camera] = dev; } @@ -2008,5 +2003,4 @@ module_platform_driver(bcm2835_camera_driver) MODULE_DESCRIPTION("Broadcom 2835 MMAL video capture"); MODULE_AUTHOR("Vincent Sanders"); MODULE_LICENSE("GPL"); -MODULE_VERSION(BM2835_MMAL_VERSION); MODULE_ALIAS("platform:bcm2835-camera"); diff --git a/drivers/staging/vc04_services/interface/TODO b/drivers/staging/vc04_services/interface/TODO index 241ca004735c..97085a0b3223 100644 --- a/drivers/staging/vc04_services/interface/TODO +++ b/drivers/staging/vc04_services/interface/TODO @@ -1,4 +1,4 @@ -1) Import drivers using VCHI. +* Import drivers using VCHI. VCHI is just a tool to let drivers talk to the firmware. Here are some of the ones we want: @@ -16,71 +16,42 @@ some of the ones we want: to manage these buffers as dmabufs so that we can zero-copy import camera images into vc4 for rendering/display. -2) Garbage-collect unused code - -One of the reasons this driver wasn't upstreamed previously was that -there's a lot code that got built that's probably unnecessary these -days. Once we have the set of VCHI-using drivers we want in tree, we -should be able to do a sweep of the code to see what's left that's -unused. - -3) Make driver more portable - -Building this driver with arm/multi_v7_defconfig or arm64/defconfig -leads to data corruption during the following command: - - vchiq_test -f 1 - -This should be fixed. - -4) Fix kernel module support +* Fix kernel module support Even the VPU firmware doesn't support a VCHI re-connect, the driver should properly handle a module unload. This also includes that all resources must be freed (kthreads, debugfs entries, ...) and global variables avoided. -5) Cleanup logging mechanism +* Cleanup logging mechanism The driver should probably be using the standard kernel logging mechanisms such as dev_info, dev_dbg, and friends. -6) Documentation +* Documentation A short top-down description of this driver's architecture (function of kthreads, userspace, limitations) could be very helpful for reviewers. -7) Review and comment memory barriers +* Review and comment memory barriers There is a heavy use of memory barriers in this driver, it would be very beneficial to go over all of them and, if correct, comment on their merits. Extra points to whomever confidently reviews the remote_event_*() family of functions. -8) Get rid of custom function return values +* Get rid of custom function return values Most functions use a custom set of return values, we should force proper Linux error numbers. Special care is needed for VCHIQ_RETRY. -9) Reformat core code with more sane indentations +* Reformat core code with more sane indentations The code follows the 80 characters limitation yet tends to go 3 or 4 levels of indentation deep making it very unpleasant to read. This is specially relevant in the character driver ioctl code and in the core thread functions. -10) Reorganize file structure: Move char driver to it's own file and join both -platform files - -The cdev is defined alongside with the platform code in vchiq_arm.c. It would -be nice to completely decouple it from the actual core code. For instance to be -able to use bcm2835-audio without having /dev/vchiq created. One could argue -it's better for security reasons or general cleanliness. It could even be -interesting to create two different kernel modules, something the likes of -vchiq-core.ko and vchiq-dev.ko. This would also ease the upstreaming process. - -The code in vchiq_bcm2835_arm.c should fit in the generic platform file. - -11) Get rid of all non essential global structures and create a proper per +* Get rid of all non essential global structures and create a proper per device structure The first thing one generally sees in a probe function is a memory allocation @@ -88,6 +59,15 @@ for all the device specific data. This structure is then passed all over the driver. This is good practice since it makes the driver work regardless of the number of devices probed. -12) Clean up Sparse warnings from __user annotations. See +* Clean up Sparse warnings from __user annotations. See vchiq_irq_queue_bulk_tx_rx(). Ensure that the address of "&waiter->bulk_waiter" is never disclosed to userspace. + +* Fix behavior of message handling + +The polling behavior of vchiq_bulk_transmit(), vchiq_bulk_receive() and +vchiq_queue_kernel_message() looks broken. A possible signal should be +propagated back to user space to let the calling task handle it before +retrying. Hopefully these msleep(1) shouldn't be necessary anymore. + +https://lore.kernel.org/linux-staging/CAK8P3a3HGm1cPo4sW9fOY4E8AN8yAq3tevXxU5m8bmtmsU8WKw@mail.gmail.com/ 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 3a2e4582db8e..f0bfacfdea80 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -189,6 +189,20 @@ cleanup_pagelistinfo(struct vchiq_pagelist_info *pagelistinfo) pagelistinfo->pagelist, pagelistinfo->dma_addr); } +static inline bool +is_adjacent_block(u32 *addrs, u32 addr, unsigned int k) +{ + u32 tmp; + + if (!k) + return false; + + tmp = (addrs[k - 1] & PAGE_MASK) + + (((addrs[k - 1] & ~PAGE_MASK) + 1) << PAGE_SHIFT); + + return tmp == (addr & PAGE_MASK); +} + /* There is a potential problem with partial cache lines (pages?) * at the ends of the block when reading. If the CPU accessed anything in * the same line (page?) then it may have pulled old data into the cache, @@ -349,10 +363,7 @@ create_pagelist(char *buf, char __user *ubuf, WARN_ON(len == 0); WARN_ON(i && (i != (dma_buffers - 1)) && (len & ~PAGE_MASK)); WARN_ON(i && (addr & ~PAGE_MASK)); - if (k > 0 && - ((addrs[k - 1] & PAGE_MASK) + - (((addrs[k - 1] & ~PAGE_MASK) + 1) << PAGE_SHIFT)) - == (addr & PAGE_MASK)) + if (is_adjacent_block(addrs, addr, k)) addrs[k - 1] += ((len + PAGE_SIZE - 1) >> PAGE_SHIFT); else addrs[k++] = (addr & PAGE_MASK) | @@ -582,8 +593,7 @@ vchiq_platform_init_state(struct vchiq_state *state) return 0; } -struct vchiq_arm_state* -vchiq_platform_get_arm_state(struct vchiq_state *state) +static struct vchiq_arm_state *vchiq_platform_get_arm_state(struct vchiq_state *state) { struct vchiq_2835_state *platform_state; @@ -1209,6 +1219,9 @@ int vchiq_dump_platform_instances(void *dump_context) int len; int i; + if (!state) + return -ENOTCONN; + /* * There is no list of instances, so instead scan all services, * marking those that have been dumped. @@ -1290,14 +1303,18 @@ int vchiq_dump_platform_service_state(void *dump_context, struct vchiq_state * vchiq_get_state(void) { - if (!g_state.remote) + if (!g_state.remote) { pr_err("%s: g_state.remote == NULL\n", __func__); - else if (g_state.remote->initialised != 1) + return NULL; + } + + if (g_state.remote->initialised != 1) { pr_notice("%s: g_state.remote->initialised != 1 (%d)\n", __func__, g_state.remote->initialised); + return NULL; + } - return (g_state.remote && - (g_state.remote->initialised == 1)) ? &g_state : NULL; + return &g_state; } /* 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 7fe20d4b7ba2..8f99272dbd6f 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c @@ -205,27 +205,27 @@ release_message_sync(struct vchiq_state *state, struct vchiq_header *header); static const char *msg_type_str(unsigned int msg_type) { switch (msg_type) { - case VCHIQ_MSG_PADDING: return "PADDING"; - case VCHIQ_MSG_CONNECT: return "CONNECT"; - case VCHIQ_MSG_OPEN: return "OPEN"; - case VCHIQ_MSG_OPENACK: return "OPENACK"; - case VCHIQ_MSG_CLOSE: return "CLOSE"; - case VCHIQ_MSG_DATA: return "DATA"; - case VCHIQ_MSG_BULK_RX: return "BULK_RX"; - case VCHIQ_MSG_BULK_TX: return "BULK_TX"; - case VCHIQ_MSG_BULK_RX_DONE: return "BULK_RX_DONE"; - case VCHIQ_MSG_BULK_TX_DONE: return "BULK_TX_DONE"; - case VCHIQ_MSG_PAUSE: return "PAUSE"; - case VCHIQ_MSG_RESUME: return "RESUME"; - case VCHIQ_MSG_REMOTE_USE: return "REMOTE_USE"; - case VCHIQ_MSG_REMOTE_RELEASE: return "REMOTE_RELEASE"; - case VCHIQ_MSG_REMOTE_USE_ACTIVE: return "REMOTE_USE_ACTIVE"; + case VCHIQ_MSG_PADDING: return "PADDING"; + case VCHIQ_MSG_CONNECT: return "CONNECT"; + case VCHIQ_MSG_OPEN: return "OPEN"; + case VCHIQ_MSG_OPENACK: return "OPENACK"; + case VCHIQ_MSG_CLOSE: return "CLOSE"; + case VCHIQ_MSG_DATA: return "DATA"; + case VCHIQ_MSG_BULK_RX: return "BULK_RX"; + case VCHIQ_MSG_BULK_TX: return "BULK_TX"; + case VCHIQ_MSG_BULK_RX_DONE: return "BULK_RX_DONE"; + case VCHIQ_MSG_BULK_TX_DONE: return "BULK_TX_DONE"; + case VCHIQ_MSG_PAUSE: return "PAUSE"; + case VCHIQ_MSG_RESUME: return "RESUME"; + case VCHIQ_MSG_REMOTE_USE: return "REMOTE_USE"; + case VCHIQ_MSG_REMOTE_RELEASE: return "REMOTE_RELEASE"; + case VCHIQ_MSG_REMOTE_USE_ACTIVE: return "REMOTE_USE_ACTIVE"; } return "???"; } static inline void -vchiq_set_service_state(struct vchiq_service *service, int newstate) +set_service_state(struct vchiq_service *service, int newstate) { vchiq_log_info(vchiq_core_log_level, "%d: srv:%d %s->%s", service->state->id, service->localport, @@ -255,9 +255,9 @@ find_service_by_handle(unsigned int handle) } struct vchiq_service * -find_service_by_port(struct vchiq_state *state, int localport) +find_service_by_port(struct vchiq_state *state, unsigned int localport) { - if ((unsigned int)localport <= VCHIQ_PORT_MAX) { + if (localport <= VCHIQ_PORT_MAX) { struct vchiq_service *service; rcu_read_lock(); @@ -271,7 +271,7 @@ find_service_by_port(struct vchiq_state *state, int localport) rcu_read_unlock(); } vchiq_log_info(vchiq_core_log_level, - "Invalid port %d", localport); + "Invalid port %u", localport); return NULL; } @@ -872,9 +872,8 @@ copy_message_data(ssize_t (*copy_callback)(void *context, void *dest, size_t off ssize_t callback_result; size_t max_bytes = size - pos; - callback_result = - copy_callback(context, dest + pos, - pos, max_bytes); + callback_result = copy_callback(context, dest + pos, pos, + max_bytes); if (callback_result < 0) return callback_result; @@ -1028,8 +1027,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, if (callback_result < 0) { mutex_unlock(&state->slot_mutex); - VCHIQ_SERVICE_STATS_INC(service, - error_count); + VCHIQ_SERVICE_STATS_INC(service, error_count); return VCHIQ_ERROR; } @@ -1037,8 +1035,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, VCHIQ_LOG_INFO)) vchiq_log_dump_mem("Sent", 0, header->data, - min((size_t)16, - (size_t)callback_result)); + min_t(size_t, 16, callback_result)); spin_lock("a_spinlock); quota->message_use_count++; @@ -1122,7 +1119,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, wmb(); if (service && (type == VCHIQ_MSG_CLOSE)) - vchiq_set_service_state(service, VCHIQ_SRVSTATE_CLOSESENT); + set_service_state(service, VCHIQ_SRVSTATE_CLOSESENT); if (!(flags & QMFLAGS_NO_MUTEX_UNLOCK)) mutex_unlock(&state->slot_mutex); @@ -1177,8 +1174,7 @@ queue_message_sync(struct vchiq_state *state, struct vchiq_service *service, if (callback_result < 0) { mutex_unlock(&state->slot_mutex); - VCHIQ_SERVICE_STATS_INC(service, - error_count); + VCHIQ_SERVICE_STATS_INC(service, error_count); return VCHIQ_ERROR; } @@ -1187,8 +1183,7 @@ queue_message_sync(struct vchiq_state *state, struct vchiq_service *service, VCHIQ_LOG_INFO)) vchiq_log_dump_mem("Sent", 0, header->data, - min((size_t)16, - (size_t)callback_result)); + min_t(size_t, 16, callback_result)); VCHIQ_SERVICE_STATS_INC(service, ctrl_tx_count); VCHIQ_SERVICE_STATS_ADD(service, ctrl_tx_bytes, size); @@ -1524,15 +1519,17 @@ parse_open(struct vchiq_state *state, struct vchiq_header *header) if (queue_message_sync(state, NULL, openack_id, memcpy_copy_callback, &ack_payload, sizeof(ack_payload), 0) == VCHIQ_RETRY) goto bail_not_ready; + + /* The service is now open */ + set_service_state(service, VCHIQ_SRVSTATE_OPENSYNC); } else { if (queue_message(state, NULL, openack_id, memcpy_copy_callback, &ack_payload, sizeof(ack_payload), 0) == VCHIQ_RETRY) goto bail_not_ready; - } - /* The service is now open */ - vchiq_set_service_state(service, service->sync ? VCHIQ_SRVSTATE_OPENSYNC - : VCHIQ_SRVSTATE_OPEN); + /* The service is now open */ + set_service_state(service, VCHIQ_SRVSTATE_OPEN); + } } /* Success - the message has been dealt with */ @@ -1666,7 +1663,7 @@ parse_message(struct vchiq_state *state, struct vchiq_header *header) service->peer_version); if (service->srvstate == VCHIQ_SRVSTATE_OPENING) { service->remoteport = remoteport; - vchiq_set_service_state(service, VCHIQ_SRVSTATE_OPEN); + set_service_state(service, VCHIQ_SRVSTATE_OPEN); complete(&service->remove_event); } else { vchiq_log_error(vchiq_core_log_level, "OPENACK received in state %s", @@ -2063,7 +2060,7 @@ sync_func(void *v) service->peer_version); if (service->srvstate == VCHIQ_SRVSTATE_OPENING) { service->remoteport = remoteport; - vchiq_set_service_state(service, VCHIQ_SRVSTATE_OPENSYNC); + set_service_state(service, VCHIQ_SRVSTATE_OPENSYNC); service->sync = 1; complete(&service->remove_event); } @@ -2097,16 +2094,6 @@ sync_func(void *v) return 0; } -static void -init_bulk_queue(struct vchiq_bulk_queue *queue) -{ - queue->local_insert = 0; - queue->remote_insert = 0; - queue->process = 0; - queue->remote_notify = 0; - queue->remove = 0; -} - inline const char * get_conn_state_name(enum vchiq_connstate conn_state) { @@ -2220,8 +2207,7 @@ vchiq_init_state(struct vchiq_state *state, struct vchiq_slot_zero *slot_zero) state->default_slot_quota = state->slot_queue_available / 2; state->default_message_quota = - min((unsigned short)(state->default_slot_quota * 256), - (unsigned short)~0); + min_t(unsigned short, state->default_slot_quota * 256, ~0); state->previous_data_index = -1; state->data_use_count = 0; @@ -2306,6 +2292,9 @@ void vchiq_msg_queue_push(unsigned int handle, struct vchiq_header *header) struct vchiq_service *service = find_service_by_handle(handle); int pos; + if (!service) + return; + while (service->msg_queue_write == service->msg_queue_read + VCHIQ_MAX_SLOTS) { if (wait_for_completion_interruptible(&service->msg_queue_pop)) @@ -2326,6 +2315,9 @@ struct vchiq_header *vchiq_msg_hold(unsigned int handle) struct vchiq_header *header; int pos; + if (!service) + return NULL; + if (service->msg_queue_write == service->msg_queue_read) return NULL; @@ -2371,7 +2363,7 @@ vchiq_add_service_internal(struct vchiq_state *state, if (ret) return NULL; - service = kmalloc(sizeof(*service), GFP_KERNEL); + service = kzalloc(sizeof(*service), GFP_KERNEL); if (!service) return service; @@ -2387,28 +2379,17 @@ vchiq_add_service_internal(struct vchiq_state *state, service->public_fourcc = (srvstate == VCHIQ_SRVSTATE_OPENING) ? VCHIQ_FOURCC_INVALID : params->fourcc; - service->client_id = 0; service->auto_close = 1; - service->sync = 0; - service->closing = 0; - service->trace = 0; atomic_set(&service->poll_flags, 0); service->version = params->version; service->version_min = params->version_min; service->state = state; service->instance = instance; - service->service_use_count = 0; - service->msg_queue_read = 0; - service->msg_queue_write = 0; - init_bulk_queue(&service->bulk_tx); - init_bulk_queue(&service->bulk_rx); init_completion(&service->remove_event); init_completion(&service->bulk_remove_event); init_completion(&service->msg_queue_pop); init_completion(&service->msg_queue_push); mutex_init(&service->bulk_mutex); - memset(&service->stats, 0, sizeof(service->stats)); - memset(&service->msg_queue, 0, sizeof(service->msg_queue)); /* * Although it is perfectly possible to use a spinlock @@ -2486,7 +2467,7 @@ vchiq_add_service_internal(struct vchiq_state *state, - 1; /* Bring this service online */ - vchiq_set_service_state(service, srvstate); + set_service_state(service, srvstate); vchiq_log_info(vchiq_core_msg_log_level, "%s Service %c%c%c%c SrcPort:%d", (srvstate == VCHIQ_SRVSTATE_OPENING) ? "Open" : "Add", @@ -2642,7 +2623,7 @@ close_service_complete(struct vchiq_service *service, int failstate) } else { newstate = VCHIQ_SRVSTATE_CLOSED; } - vchiq_set_service_state(service, newstate); + set_service_state(service, newstate); break; case VCHIQ_SRVSTATE_LISTENING: break; @@ -2678,7 +2659,7 @@ close_service_complete(struct vchiq_service *service, int failstate) complete(&service->remove_event); } } else { - vchiq_set_service_state(service, failstate); + set_service_state(service, failstate); } return status; @@ -2711,9 +2692,8 @@ vchiq_close_service_internal(struct vchiq_service *service, int close_recvd) } else { service->client_id = 0; service->remoteport = VCHIQ_PORT_FREE; - if (service->srvstate == - VCHIQ_SRVSTATE_CLOSEWAIT) - vchiq_set_service_state(service, VCHIQ_SRVSTATE_LISTENING); + if (service->srvstate == VCHIQ_SRVSTATE_CLOSEWAIT) + set_service_state(service, VCHIQ_SRVSTATE_LISTENING); } complete(&service->remove_event); } else { @@ -2723,7 +2703,7 @@ vchiq_close_service_internal(struct vchiq_service *service, int close_recvd) case VCHIQ_SRVSTATE_OPENING: if (close_recvd) { /* The open was rejected - tell the user */ - vchiq_set_service_state(service, VCHIQ_SRVSTATE_CLOSEWAIT); + set_service_state(service, VCHIQ_SRVSTATE_CLOSEWAIT); complete(&service->remove_event); } else { /* Shutdown mid-open - let the other side know */ @@ -2754,8 +2734,7 @@ vchiq_close_service_internal(struct vchiq_service *service, int close_recvd) if (!close_recvd) { /* Change the state while the mutex is still held */ - vchiq_set_service_state(service, - VCHIQ_SRVSTATE_CLOSESENT); + set_service_state(service, VCHIQ_SRVSTATE_CLOSESENT); mutex_unlock(&state->slot_mutex); if (service->sync) mutex_unlock(&state->sync_mutex); @@ -2763,7 +2742,7 @@ vchiq_close_service_internal(struct vchiq_service *service, int close_recvd) } /* Change the state while the mutex is still held */ - vchiq_set_service_state(service, VCHIQ_SRVSTATE_CLOSERECVD); + set_service_state(service, VCHIQ_SRVSTATE_CLOSERECVD); mutex_unlock(&state->slot_mutex); if (service->sync) mutex_unlock(&state->sync_mutex); @@ -2788,7 +2767,7 @@ vchiq_close_service_internal(struct vchiq_service *service, int close_recvd) case VCHIQ_SRVSTATE_CLOSERECVD: if (!close_recvd && is_server) /* Force into LISTENING mode */ - vchiq_set_service_state(service, VCHIQ_SRVSTATE_LISTENING); + set_service_state(service, VCHIQ_SRVSTATE_LISTENING); status = close_service_complete(service, VCHIQ_SRVSTATE_CLOSERECVD); break; @@ -2837,7 +2816,7 @@ vchiq_free_service_internal(struct vchiq_service *service) return; } - vchiq_set_service_state(service, VCHIQ_SRVSTATE_FREE); + set_service_state(service, VCHIQ_SRVSTATE_FREE); complete(&service->remove_event); @@ -2855,7 +2834,7 @@ vchiq_connect_internal(struct vchiq_state *state, struct vchiq_instance *instanc i = 0; while ((service = next_service_by_instance(state, instance, &i)) != NULL) { if (service->srvstate == VCHIQ_SRVSTATE_HIDDEN) - vchiq_set_service_state(service, VCHIQ_SRVSTATE_LISTENING); + set_service_state(service, VCHIQ_SRVSTATE_LISTENING); vchiq_service_put(service); } @@ -2918,7 +2897,7 @@ vchiq_close_service(unsigned int handle) status = vchiq_close_service_internal(service, NO_CLOSE_RECVD); WARN_ON(status == VCHIQ_RETRY); } else { - /* Mark the service for termination by the slot handler */ + /* Mark the service for termination by the slot handler */ request_poll(service->state, service, VCHIQ_POLL_TERMINATE); } @@ -3666,10 +3645,10 @@ enum vchiq_status vchiq_send_remote_use_active(struct vchiq_state *state) void vchiq_log_dump_mem(const char *label, u32 addr, const void *void_mem, size_t num_bytes) { - const u8 *mem = void_mem; - size_t offset; - char line_buf[100]; - char *s; + const u8 *mem = void_mem; + size_t offset; + char line_buf[100]; + char *s; while (num_bytes > 0) { s = line_buf; 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 55abaf02a196..82b7bd7b54b2 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.h @@ -524,7 +524,7 @@ extern struct vchiq_service * find_service_by_handle(unsigned int handle); extern struct vchiq_service * -find_service_by_port(struct vchiq_state *state, int localport); +find_service_by_port(struct vchiq_state *state, unsigned int localport); extern struct vchiq_service * find_service_for_instance(struct vchiq_instance *instance, unsigned int handle); 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 8f3d9cb2d562..dc667afd1f8c 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_debugfs.c @@ -36,8 +36,6 @@ static struct vchiq_debugfs_log_entry vchiq_debugfs_log_entries[] = { { "arm", &vchiq_arm_log_level }, }; -static int n_log_entries = ARRAY_SIZE(vchiq_debugfs_log_entries); - static int debugfs_log_show(struct seq_file *f, void *offset) { int *levp = f->private; @@ -216,7 +214,7 @@ void vchiq_debugfs_init(void) /* create an entry under <debugfs>/vchiq/log for each log category */ dir = debugfs_create_dir("log", vchiq_dbg_dir); - for (i = 0; i < n_log_entries; i++) + for (i = 0; i < ARRAY_SIZE(vchiq_debugfs_log_entries); i++) debugfs_create_file(vchiq_debugfs_log_entries[i].name, 0644, dir, vchiq_debugfs_log_entries[i].plevel, &debugfs_log_fops); diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c index 2325844b0880..b41c2a267355 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c @@ -146,15 +146,14 @@ static int vchiq_ioc_create_service(struct vchiq_instance *instance, struct vchiq_service_params_kernel params; int srvstate; + if (args->is_open && !instance->connected) + return -ENOTCONN; + user_service = kmalloc(sizeof(*user_service), GFP_KERNEL); if (!user_service) return -ENOMEM; if (args->is_open) { - if (!instance->connected) { - kfree(user_service); - return -ENOTCONN; - } srvstate = VCHIQ_SRVSTATE_OPENING; } else { srvstate = instance->connected ? diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c index cb6cdbfaf6ec..70c9d5544b56 100644 --- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c +++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c @@ -168,9 +168,6 @@ struct vchiq_mmal_instance { /* ensure serialised access to service */ struct mutex vchiq_mutex; - /* vmalloc page to receive scratch bulk xfers into */ - void *bulk_scratch; - struct idr context_map; /* protect accesses to context_map */ struct mutex context_map_lock; @@ -1847,8 +1844,6 @@ int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance) flush_workqueue(instance->bulk_wq); destroy_workqueue(instance->bulk_wq); - vfree(instance->bulk_scratch); - idr_destroy(&instance->context_map); kfree(instance); @@ -1908,7 +1903,6 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance) mutex_init(&instance->vchiq_mutex); - instance->bulk_scratch = vmalloc(PAGE_SIZE); instance->vchiq_instance = vchiq_instance; mutex_init(&instance->context_map_lock); @@ -1939,7 +1933,6 @@ err_close_services: vchiq_close_service(instance->service_handle); destroy_workqueue(instance->bulk_wq); err_free: - vfree(instance->bulk_scratch); kfree(instance); err_shutdown_vchiq: vchiq_shutdown(vchiq_instance); |