8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * CDDL HEADER START
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * The contents of this file are subject to the terms of the
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Common Development and Distribution License, Version 1.0 only
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * (the "License"). You may not use this file except in compliance
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * with the License.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * or http://www.opensolaris.org/os/licensing.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * See the License for the specific language governing permissions
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * and limitations under the License.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * When distributing Covered Code, include this CDDL HEADER in each
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * If applicable, add the following below this CDDL HEADER, with the
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * fields enclosed by brackets "[]" replaced with your own identifying
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * information: Portions Copyright [yyyy] [name of copyright owner]
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * CDDL HEADER END
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Use is subject to license terms.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#pragma ident "%Z%%M% %I% %E% SMI"
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * dcam_ring_buff.c
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * dcam1394 driver. Video frame ring buffer support.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <sys/types.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <sys/kmem.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <sys/ddidmareq.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <sys/types.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <sys/inttypes.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <sys/tnf_probe.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <sys/cmn_err.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#include <sys/1394/targets/dcam1394/dcam.h>
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_create
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * - alloc ring_buff_t structure
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * - init ring_buff's num_buffs, buff_num_bytes, num_read_ptrs,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * read_ptr_pos
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * - alloc (num buffs) entries in ring_buff's buff_info_array_p
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * - for each buff
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * - alloc DMA handle; store DMA handle in buff's buff_info_array_p
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * - alloc mem for DMA transfer; store base addr, data access handle
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * in buff's buff_info_array_p entry
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * - bind alloc'ed mem to DMA handle; store assoc info in buff's
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * buff_info_array_p entry
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_t *
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_create(dcam_state_t *softc_p, size_t num_buffs,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap size_t buff_num_bytes)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_t *buff_info_p;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap size_t buff;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap int i, rc;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_t *ring_buff_p;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap size_t num_bytes;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap num_bytes = sizeof (ring_buff_t);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p = (ring_buff_t *)kmem_alloc(num_bytes, KM_SLEEP);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->num_buffs = num_buffs;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->buff_num_bytes = buff_num_bytes;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->write_ptr_pos = 0;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->num_read_ptrs = 0;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_incr_val = 1;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap for (i = 0; i < MAX_NUM_READ_PTRS; i++) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_pos[i] = (size_t)-1;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap num_bytes = num_buffs * sizeof (buff_info_t);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->buff_info_array_p =
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (buff_info_t *)kmem_alloc(num_bytes, KM_SLEEP);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap for (buff = 0; buff < num_buffs; buff++) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_p = &(ring_buff_p->buff_info_array_p[buff]);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if ((ddi_dma_alloc_handle(
8eea8e29cc4374d1ee24c25a07f45af132db3499ap softc_p->dip,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap &softc_p->attachinfo.dma_attr,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DDI_DMA_DONTWAIT,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap NULL,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap &(buff_info_p->dma_handle))) != DDI_SUCCESS) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_free(softc_p, ring_buff_p);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (NULL);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (ddi_dma_mem_alloc(
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_p->dma_handle,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_num_bytes,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap &softc_p->attachinfo.acc_attr,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DDI_DMA_STREAMING,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DDI_DMA_DONTWAIT,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (caddr_t)NULL,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap &(buff_info_p->kaddr_p),
8eea8e29cc4374d1ee24c25a07f45af132db3499ap &(buff_info_p->real_len),
8eea8e29cc4374d1ee24c25a07f45af132db3499ap &(buff_info_p->data_acc_handle)) != DDI_SUCCESS) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_free(softc_p, ring_buff_p);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Print a warning, this triggered the bug
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * report #4423667. This call can fail if
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * the memory tests are being run in sunvts.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * The fact is, this code is doing the right
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * thing. I added an error message, so that
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * future occurrences can be dealt with directly.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * This is not a bug... The vmem test in sunvts
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * can eat up all swap/virtual memory.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap cmn_err(CE_WARN,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap "ddi_dma_mem_alloc() failed in ring_buff_create(),"\
8eea8e29cc4374d1ee24c25a07f45af132db3499ap " insufficient memory resources.\n");
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (NULL);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap rc = ddi_dma_addr_bind_handle(
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_p->dma_handle,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (struct as *)NULL,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (caddr_t)buff_info_p->kaddr_p,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_p->real_len,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DDI_DMA_RDWR | DDI_DMA_STREAMING,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap DDI_DMA_DONTWAIT,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap NULL,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap &buff_info_p->dma_cookie,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap &buff_info_p->dma_cookie_count);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (rc != DDI_DMA_MAPPED) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_free(softc_p, ring_buff_p);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (NULL);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (ring_buff_p);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_free
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apvoid
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_free(dcam_state_t *softc_p, ring_buff_t *ring_buff_p)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_t *buff_info_p;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap int i;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (ring_buff_p == NULL) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap softc_p->ring_buff_p = NULL;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (ring_buff_p->buff_info_array_p != NULL) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap for (i = 0; i < ring_buff_p->num_buffs; i++) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_p = &(ring_buff_p->buff_info_array_p[i]);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (void) ddi_dma_unbind_handle(buff_info_p->dma_handle);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ddi_dma_mem_free(&buff_info_p->data_acc_handle);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ddi_dma_free_handle(&buff_info_p->dma_handle);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap kmem_free(ring_buff_p->buff_info_array_p,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->num_buffs * sizeof (buff_info_t));
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap kmem_free(ring_buff_p, sizeof (ring_buff_t));
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap softc_p->ring_buff_p = NULL;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_read_ptr_add
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apint
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_read_ptr_add(ring_buff_t *ring_buff_p)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap int i;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap int read_ptr_id;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap read_ptr_id = -1;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap for (i = 0; i < MAX_NUM_READ_PTRS; i++) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (ring_buff_p->read_ptr_pos[i] == -1) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_pos[i] = 0;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap read_ptr_id = i;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap break;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (read_ptr_id);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_read_ptr_remove
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apint
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_read_ptr_remove(ring_buff_t *ring_buff_p, int read_ptr_id)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_pos[read_ptr_id] = (size_t)-1;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (0);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_read_ptr_buff_get
8eea8e29cc4374d1ee24c25a07f45af132db3499ap *
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * Return pointer to buffer that a read pointer associated with the
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring buffer is pointing to.
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apbuff_info_t *
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_read_ptr_buff_get(ring_buff_t *ring_buff_p, int read_ptr_id)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap size_t read_ptr_pos;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_t *buff_info_p;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap read_ptr_pos = ring_buff_p->read_ptr_pos[read_ptr_id];
8eea8e29cc4374d1ee24c25a07f45af132db3499ap buff_info_p = &(ring_buff_p->buff_info_array_p[read_ptr_pos]);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (buff_info_p);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_read_ptr_pos_get
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apsize_t
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_read_ptr_pos_get(ring_buff_t *ring_buff_p, int read_ptr_id)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (ring_buff_p->read_ptr_pos[read_ptr_id]);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_read_ptr_incr
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apvoid
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_read_ptr_incr(ring_buff_t *ring_buff_p, int read_ptr_id)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap size_t read_ptr_pos;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#if defined(_ADDL_RING_BUFF_CHECK)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap size_t lrp, lwp; /* linear read, write positions */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#endif /* _ADDL_RING_BUFFER_CHECK */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * increment the read pointer based on read_ptr_incr_val
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * which can vary from 1 to 10
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /* get current read pointer pos */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap read_ptr_pos = ring_buff_p->read_ptr_pos[read_ptr_id];
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_pos[read_ptr_id] =
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (read_ptr_pos + 1) % ring_buff_p->num_buffs;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#if defined(_ADDL_RING_BUFF_CHECK)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if ((read_ptr_pos == 0) && (ring_buff_p->write_ptr_pos == 0)) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (read_ptr_pos < ring_buff_p->write_ptr_pos) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /* calculate new read pointer position */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if ((read_ptr_pos + ring_buff_p->read_ptr_incr_val) <
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->write_ptr_pos) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /* there is still some valid frame data */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_pos[read_ptr_id] =
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (read_ptr_pos +
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_incr_val) %
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->num_buffs;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap } else {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * we have skipped beyond available frame
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * data, so the buffer is empty
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_pos[read_ptr_id] =
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->write_ptr_pos;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap } else {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * since read pointer is ahead of write pointer,
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * it becomes easier to check for new read
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * pointer position if we pretend that our data
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * buffer is linear instead of circular
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap lrp = read_ptr_pos + ring_buff_p->read_ptr_incr_val;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap lwp = ring_buff_p->num_buffs +
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->write_ptr_pos;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap if (lrp < lwp) {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /* there is still some valid frame data */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_pos[read_ptr_id] =
8eea8e29cc4374d1ee24c25a07f45af132db3499ap (read_ptr_pos +
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_incr_val) %
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->num_buffs;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap } else {
8eea8e29cc4374d1ee24c25a07f45af132db3499ap /*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * we have skipped beyond available
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * frame data, so the buffer is empty
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->read_ptr_pos[read_ptr_id] =
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->write_ptr_pos;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap }
8eea8e29cc4374d1ee24c25a07f45af132db3499ap#endif /* _ADDL_RING_BUFF_CHECK */
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_write_ptr_pos_get
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apsize_t
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_write_ptr_pos_get(ring_buff_t *ring_buff_p)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap return (ring_buff_p->write_ptr_pos);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap/*
8eea8e29cc4374d1ee24c25a07f45af132db3499ap * ring_buff_write_ptr_incr
8eea8e29cc4374d1ee24c25a07f45af132db3499ap */
8eea8e29cc4374d1ee24c25a07f45af132db3499apvoid
8eea8e29cc4374d1ee24c25a07f45af132db3499apring_buff_write_ptr_incr(ring_buff_t *ring_buff_p)
8eea8e29cc4374d1ee24c25a07f45af132db3499ap{
8eea8e29cc4374d1ee24c25a07f45af132db3499ap size_t write_ptr_pos;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap write_ptr_pos = ring_buff_p->write_ptr_pos;
8eea8e29cc4374d1ee24c25a07f45af132db3499ap
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ring_buff_p->write_ptr_pos =
8eea8e29cc4374d1ee24c25a07f45af132db3499ap ((write_ptr_pos + 1) % ring_buff_p->num_buffs);
8eea8e29cc4374d1ee24c25a07f45af132db3499ap}