summaryrefslogtreecommitdiff
path: root/drivers/dahdi/wcte12xp
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dahdi/wcte12xp')
-rw-r--r--drivers/dahdi/wcte12xp/GpakApi.c1615
-rw-r--r--drivers/dahdi/wcte12xp/GpakApi.h636
-rw-r--r--drivers/dahdi/wcte12xp/GpakErrs.h155
-rw-r--r--drivers/dahdi/wcte12xp/Kbuild15
-rw-r--r--drivers/dahdi/wcte12xp/base.c528
-rw-r--r--drivers/dahdi/wcte12xp/gpakenum.h190
l---------drivers/dahdi/wcte12xp/voicebus.c1
-rw-r--r--drivers/dahdi/wcte12xp/vpmadt032.c1317
-rw-r--r--drivers/dahdi/wcte12xp/vpmadt032.h151
-rw-r--r--drivers/dahdi/wcte12xp/wcte12xp.h8
10 files changed, 435 insertions, 4181 deletions
diff --git a/drivers/dahdi/wcte12xp/GpakApi.c b/drivers/dahdi/wcte12xp/GpakApi.c
deleted file mode 100644
index 748cc94..0000000
--- a/drivers/dahdi/wcte12xp/GpakApi.c
+++ /dev/null
@@ -1,1615 +0,0 @@
-/*
- * Copyright (c) 2005, Adaptive Digital Technologies, Inc.
- *
- * File Name: GpakApi.c
- *
- * Description:
- * This file contains user API functions to communicate with DSPs executing
- * G.PAK software. The file is integrated into the host processor connected
- * to C55X G.PAK DSPs via a Host Port Interface.
- *
- * Version: 1.0
- *
- * Revision History:
- * 06/15/05 - Initial release.
- * 11/15/2006 - 24 TDM-TDM Channels EC release
- *
- * This program has been released under the terms of the GPL version 2 by
- * permission of Adaptive Digital Technologies, Inc.
- */
-
-/*
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2 as published by the
- * Free Software Foundation. See the LICENSE file included with
- * this program for more details.
- */
-
-#include <dahdi/kernel.h>
-
-#include "GpakHpi.h"
-#include "vpmadt032.h"
-#include "GpakApi.h"
-#include "gpakenum.h"
-
-#ifdef VPM_SUPPORT
-
-/* DSP to Host interface block offsets. */
-#define REPLY_MSG_PNTR_OFFSET 0 /* I/F blk offset to Reply Msg Pointer */
-#define CMD_MSG_PNTR_OFFSET 2 /* I/F blk offset to Command Msg Pointer */
-#define EVENT_MSG_PNTR_OFFSET 4 /* I/F blk offset to Event Msg Pointer */
-#define PKT_BUFR_MEM_OFFSET 6 /* I/F blk offset to Packet Buffer memory */
-#define DSP_STATUS_OFFSET 8 /* I/F blk offset to DSP Status */
-#define VERSION_ID_OFFSET 9 /* I/F blk offset to G.PAK Version Id */
-#define MAX_CMD_MSG_LEN_OFFSET 10 /* I/F blk offset to Max Cmd Msg Length */
-#define CMD_MSG_LEN_OFFSET 11 /* I/F blk offset to Command Msg Length */
-#define REPLY_MSG_LEN_OFFSET 12 /* I/F blk offset to Reply Msg Length */
-#define NUM_CHANNELS_OFFSET 13 /* I/F blk offset to Num Built Channels */
-#define NUM_PKT_CHANNELS_OFFSET 14 /* I/F blk offset to Num Pkt Channels */
-#define NUM_CONFERENCES_OFFSET 15 /* I/F blk offset to Num Conferences */
-//#define CPU_USAGE_OFFSET_1MS 16 /* I/F blk offset to CPU Usage statistics */
-#define CPU_USAGE_OFFSET 18 /* I/F blk offset to CPU Usage statistics */
-//#define CPU_USAGE_OFFSET_10MS 20 /* I/F blk offset to CPU Usage statistics */
-#define FRAMING_STATS_OFFSET 22 /* I/F blk offset to Framing statistics */
-
-//#define GPAK_RELEASE_Rate rate10ms
-// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
-// Macro to reconstruct a 32-bit value from two 16-bit values.
-// Parameter p32: 32-bit-wide destination
-// Parameter p16: 16-bit-wide source array of length 2 words
-#define RECONSTRUCT_LONGWORD(p32, p16) p32 = (DSP_ADDRESS)p16[0]<<16; \
- p32 |= (unsigned long)p16[1]
-// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
-
-/* DSP Status value definitions. */
-#define DSP_INIT_STATUS 0x5555 /* DSP Initialized status value */
-#define HOST_INIT_STATUS 0xAAAA /* Host Initialized status value */
-
-/* Circular packet buffer information structure offsets. */
-#define CB_BUFR_BASE 0 /* pointer to base of circular buffer */
-#define CB_BUFR_SIZE 2 /* size of buffer (words) */
-#define CB_BUFR_PUT_INDEX 3 /* offset in buffer for next write */
-#define CB_BUFR_TAKE_INDEX 4 /* offset in buffer for next read */
-#define CIRC_BUFFER_INFO_STRUCT_SIZE 6
-
-/* Miscellaneous definitions. */
-#define MSG_BUFFER_SIZE 100 /* size (words) of Host msg buffer */
-#define WORD_BUFFER_SIZE 84 /* size of DSP Word buffer (words) */
-
-#ifdef __TMS320C55XX__ // debug sections if not on host
-#pragma DATA_SECTION(pDspIfBlk,"GPAKAPIDEBUG_SECT")
-#pragma DATA_SECTION(MaxCmdMsgLen,"GPAKAPIDEBUG_SECT")
-#pragma DATA_SECTION(MaxChannels,"GPAKAPIDEBUG_SECT")
-#pragma DATA_SECTION(DlByteBufr,"GPAKAPIDEBUG_SECT")
-#pragma DATA_SECTION(DlWordBufr,"GPAKAPIDEBUG_SECT")
-#pragma DATA_SECTION(pEventFifoAddress,"GPAKAPIDEBUG_SECT")
-#endif
-
-/* Host variables related to Host to DSP interface. */
-static DSP_ADDRESS pDspIfBlk[MAX_DSP_CORES]; /* DSP address of I/F block */
-static DSP_WORD MaxCmdMsgLen[MAX_DSP_CORES]; /* max Cmd msg length (octets) */
-static unsigned short int MaxChannels[MAX_DSP_CORES]; /* max num channels */
-
-//static unsigned short int MaxPktChannels[MAX_DSP_CORES]; /* max num pkt channels */
-//static unsigned short int MaxConfs[MAX_DSP_CORES]; /* max num conferences */
-//static DSP_ADDRESS pPktInBufr[MAX_DSP_CORES][MAX_PKT_CHANNELS]; /* Pkt In buffer */
-//static DSP_ADDRESS pPktOutBufr[MAX_DSP_CORES][MAX_PKT_CHANNELS]; /* Pkt Out buffer */
-static DSP_ADDRESS pEventFifoAddress[MAX_DSP_CORES]; /* event fifo */
-
-static unsigned char DlByteBufr[DOWNLOAD_BLOCK_SIZE * 2]; /* Dowload byte buf */
-static DSP_WORD DlWordBufr[DOWNLOAD_BLOCK_SIZE]; /* Dowload word buffer */
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * CheckDspReset - Check if the DSP was reset.
- *
- * FUNCTION
- * This function determines if the DSP was reset and is ready. If reset
- * occurred, it reads interface parameters and calculates DSP addresses.
- *
- * RETURNS
- * -1 = DSP is not ready.
- * 0 = Reset did not occur.
- * 1 = Reset occurred.
- *
- */
-static int CheckDspReset(
- int DspId /* DSP Identifier (0 to MaxDSPCores-1) */
- )
-{
- DSP_ADDRESS IfBlockPntr; /* Interface Block pointer */
- DSP_WORD DspStatus; /* DSP Status */
- DSP_WORD DspChannels; /* number of DSP channels */
- DSP_WORD Temp[2];
-#if 0
- DSP_WORD DspConfs; /* number of DSP conferences */
- DSP_ADDRESS PktBufrMem; /* address of Packet Buffer */
- unsigned short int i; /* loop index / counter */
-#endif
-
- /* Read the pointer to the Interface Block. */
- gpakReadDspMemory(DspId, DSP_IFBLK_ADDRESS, 2, Temp);
- RECONSTRUCT_LONGWORD(IfBlockPntr, Temp);
-
- /* If the pointer is zero, return with an indication the DSP is not
- ready. */
- if (IfBlockPntr == 0)
- return (-1);
-
- /* Read the DSP's Status. */
- gpakReadDspMemory(DspId, IfBlockPntr + DSP_STATUS_OFFSET, 1, &DspStatus);
-
- /* If status indicates the DSP was reset, read the DSP's interface
- parameters and calculate DSP addresses. */
- if (DspStatus == DSP_INIT_STATUS ||
- ((DspStatus == HOST_INIT_STATUS) && (pDspIfBlk[DspId] == 0)))
- {
- /* Save the address of the DSP's Interface Block. */
- pDspIfBlk[DspId] = IfBlockPntr;
-
- /* Read the DSP's interface parameters. */
- gpakReadDspMemory(DspId, IfBlockPntr + MAX_CMD_MSG_LEN_OFFSET, 1,
- &(MaxCmdMsgLen[DspId]));
-
- /* read the number of configured DSP channels */
- gpakReadDspMemory(DspId, IfBlockPntr + NUM_CHANNELS_OFFSET, 1,
- &DspChannels);
- if (DspChannels > MAX_CHANNELS)
- MaxChannels[DspId] = MAX_CHANNELS;
- else
- MaxChannels[DspId] = (unsigned short int) DspChannels;
-#if 0
- /* read the number of configured DSP conferences */
- gpakReadDspMemory(DspId, IfBlockPntr + NUM_CONFERENCES_OFFSET, 1,
- &DspConfs);
- if (DspConfs > MAX_CONFS)
- MaxConfs[DspId] = MAX_CONFS;
- else
- MaxConfs[DspId] = (unsigned short int) DspConfs;
-
-
- /* read the number of configured DSP packet channels */
- gpakReadDspMemory(DspId, IfBlockPntr + NUM_PKT_CHANNELS_OFFSET, 1,
- &DspChannels);
- if (DspChannels > MAX_PKT_CHANNELS)
- MaxPktChannels[DspId] = MAX_PKT_CHANNELS;
- else
- MaxPktChannels[DspId] = (unsigned short int) DspChannels;
-
-
- /* read the pointer to the circular buffer infor struct table */
- gpakReadDspMemory(DspId, IfBlockPntr + PKT_BUFR_MEM_OFFSET, 2, Temp);
- RECONSTRUCT_LONGWORD(PktBufrMem, Temp);
-
-
- /* Determine the addresses of each channel's Packet buffers. */
- for (i = 0; i < MaxPktChannels[DspId]; i++)
- {
- pPktInBufr[DspId][i] = PktBufrMem;
- pPktOutBufr[DspId][i] = PktBufrMem + CIRC_BUFFER_INFO_STRUCT_SIZE;
- PktBufrMem += (CIRC_BUFFER_INFO_STRUCT_SIZE*2);
- }
-#endif
-
- /* read the pointer to the event fifo info struct */
- gpakReadDspMemory(DspId, IfBlockPntr + EVENT_MSG_PNTR_OFFSET, 2, Temp);
- RECONSTRUCT_LONGWORD(pEventFifoAddress[DspId], Temp);
-
- /* Set the DSP Status to indicate the host recognized the reset. */
- DspStatus = HOST_INIT_STATUS;
- gpakWriteDspMemory(DspId, IfBlockPntr + DSP_STATUS_OFFSET, 1,
- &DspStatus);
-
- /* Return with an indication that a reset occurred. */
- return (1);
- }
-
- /* If status doesn't indicate the host recognized a reset, return with an
- indication the DSP is not ready. */
- if ((DspStatus != HOST_INIT_STATUS) || (pDspIfBlk[DspId] == 0))
- return (-1);
-
- /* Return with an indication that a reset did not occur. */
- return (0);
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * WriteDspCmdMessage - Write a Host Command/Request message to DSP.
- *
- * FUNCTION
- * This function writes a Host Command/Request message into DSP memory and
- * informs the DSP of the presence of the message.
- *
- * RETURNS
- * -1 = Unable to write message (msg len or DSP Id invalid or DSP not ready)
- * 0 = Temporarily unable to write message (previous Cmd Msg busy)
- * 1 = Message written successfully
- *
- */
-static int WriteDspCmdMessage(
- int DspId, /* DSP Identifier (0 to MaxDSPCores-1) */
- DSP_WORD *pMessage, /* pointer to Command message */
- DSP_WORD MsgLength /* length of message (octets) */
- )
-{
- DSP_WORD CmdMsgLength; /* current Cmd message length */
- DSP_WORD Temp[2];
- DSP_ADDRESS BufferPointer; /* message buffer pointer */
-
- /* Check if the DSP was reset and is ready. */
- if (CheckDspReset(DspId) == -1)
- return (-1);
-
- /* Make sure the message length is valid. */
- if ((MsgLength < 1) || (MsgLength > MaxCmdMsgLen[DspId]))
- return (-1);
-
- /* Make sure a previous Command message is not in use by the DSP. */
- gpakReadDspMemory(DspId, pDspIfBlk[DspId] + CMD_MSG_LEN_OFFSET, 1,
- &CmdMsgLength);
- if (CmdMsgLength != 0)
- return (0);
-
- /* Purge any previous Reply message that wasn't read. */
- gpakWriteDspMemory(DspId, pDspIfBlk[DspId] + REPLY_MSG_LEN_OFFSET, 1,
- &CmdMsgLength);
-
- /* Copy the Command message into DSP memory. */
- gpakReadDspMemory(DspId, pDspIfBlk[DspId] + CMD_MSG_PNTR_OFFSET, 2, Temp);
- RECONSTRUCT_LONGWORD(BufferPointer, Temp);
- gpakWriteDspMemory(DspId, BufferPointer, (MsgLength + 1) / 2, pMessage);
-
- /* Store the message length in DSP's Command message length (flags DSP that
- a Command message is ready). */
- CmdMsgLength = MsgLength;
- gpakWriteDspMemory(DspId, pDspIfBlk[DspId] + CMD_MSG_LEN_OFFSET, 1,
- &CmdMsgLength);
-
- /* Return with an indication the message was written. */
- return (1);
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * ReadDspReplyMessage - Read a DSP Reply message from DSP.
- *
- * FUNCTION
- * This function reads a DSP Reply message from DSP memory.
- *
- * RETURNS
- * -1 = Unable to write message (msg len or DSP Id invalid or DSP not ready)
- * 0 = No message available (DSP Reply message empty)
- * 1 = Message read successfully (message and length stored in variables)
- *
- */
-static int ReadDspReplyMessage(
- int DspId, /* DSP Identifier (0 to MaxDSPCores-1) */
- DSP_WORD *pMessage, /* pointer to Reply message buffer */
- DSP_WORD *pMsgLength /* pointer to msg length var (octets) */
- )
-{
- DSP_WORD MsgLength; /* message length */
- DSP_ADDRESS BufferPointer; /* message buffer pointer */
- DSP_WORD Temp[2];
-
- /* Check if the DSP was reset and is ready. */
- if (CheckDspReset(DspId) == -1)
- return (-1);
-
- /* Check if a Reply message is ready. */
- gpakReadDspMemory(DspId, pDspIfBlk[DspId] + REPLY_MSG_LEN_OFFSET, 1,
- &MsgLength);
- if (MsgLength == 0)
- return (0);
-
- /* Make sure the message length is valid. */
- if (MsgLength > *pMsgLength)
- return (-1);
-
- /* Copy the Reply message from DSP memory. */
- gpakReadDspMemory(DspId, pDspIfBlk[DspId] + REPLY_MSG_PNTR_OFFSET, 2, Temp);
- RECONSTRUCT_LONGWORD(BufferPointer, Temp);
- gpakReadDspMemory(DspId, BufferPointer, (MsgLength + 1) / 2, pMessage);
-
- /* Store the message length in the message length variable. */
- *pMsgLength = MsgLength;
-
- /* Indicate a Reply message is not ready. */
- MsgLength = 0;
- gpakWriteDspMemory(DspId, pDspIfBlk[DspId] + REPLY_MSG_LEN_OFFSET, 1,
- &MsgLength);
-
- /* Return with an indication the message was read. */
- return (1);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * ReadCircBuffer - Read from a DSP circular buffer.
- *
- * FUNCTION
- * This function reads a block of words from a DSP circular buffer. The Take
- * address is incremented by the number of words read adjusting for buffer
- * wrap.
- *
- * RETURNS
- * nothing
- *
- */
-static void ReadCircBuffer(
- int DspId, /* DSP Identifier (0 to MaxDSPCores-1) */
- DSP_ADDRESS BufrBaseAddress, /* address of base of circular buffer */
- DSP_ADDRESS BufrLastAddress, /* address of last word in buffer */
- DSP_ADDRESS *TakeAddress, /* pointer to address in buffer for read */
- DSP_WORD *pWordBuffer, /* pointer to buffer for words read */
- DSP_WORD NumWords /* number of words to read */
- )
-{
- DSP_WORD WordsTillEnd; /* number of words until end of buffer */
-
- /* Determine the number of words from the start address until the end of the
- buffer. */
- WordsTillEnd = BufrLastAddress - *TakeAddress + 1;
-
- /* If a buffer wrap will occur, read the first part at the end of the
- buffer followed by the second part at the beginning of the buffer. */
- if (NumWords > WordsTillEnd)
- {
- gpakReadDspMemory(DspId, *TakeAddress, WordsTillEnd, pWordBuffer);
- gpakReadDspMemory(DspId, BufrBaseAddress, NumWords - WordsTillEnd,
- &(pWordBuffer[WordsTillEnd]));
- *TakeAddress = BufrBaseAddress + NumWords - WordsTillEnd;
- }
-
- /* If a buffer wrap will not occur, read all words starting at the current
- take address in the buffer. */
- else
- {
- gpakReadDspMemory(DspId, *TakeAddress, NumWords, pWordBuffer);
- if (NumWords == WordsTillEnd)
- *TakeAddress = BufrBaseAddress;
- else
- *TakeAddress = *TakeAddress + NumWords;
- }
- return;
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * VerifyReply - Verify the reply message is correct for the command sent.
- *
- * FUNCTION
- * This function verifies correct reply message content for the command that
- * was just sent.
- *
- * RETURNS
- * 0 = Incorrect
- * 1 = Correct
- *
- */
-static int VerifyReply(
- DSP_WORD *pMsgBufr, /* pointer to Reply message buffer */
- int CheckType, /* reply check type */
- DSP_WORD CheckValue /* reply check value */
- )
-{
-
- /* Verify Channel or Conference Id. */
- if (CheckType == 1)
- {
- if (((pMsgBufr[1] >> 8) & 0xFF) != CheckValue)
- return (0);
- }
-
- /* Verify Test Mode Id. */
- else if (CheckType == 2)
- {
- if (pMsgBufr[1] != CheckValue)
- return (0);
- }
-
- /* Return with an indication of correct reply. */
- return (1);
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * TransactCmd - Send a command to the DSP and receive it's reply.
- *
- * FUNCTION
- * This function sends the specified command to the DSP and receives the DSP's
- * reply.
- *
- * RETURNS
- * Length of reply message (0 = Failure)
- *
- */
-static unsigned int TransactCmd(
- int DspId, /* DSP Identifier (0 to MaxDSPCores-1) */
- DSP_WORD *pMsgBufr, /* pointer to Cmd/Reply message buffer */
- DSP_WORD CmdLength, /* length of command message (octets) */
- DSP_WORD ReplyType, /* required type of reply message */
- DSP_WORD ReplyLength, /* required length of reply message (octets) */
- int ReplyCheckType, /* reply check type */
- DSP_WORD ReplyCheckValue /* reply check value */
- )
-{
- int FuncStatus; /* function status */
- int LoopCount; /* wait loop counter */
- DSP_WORD RcvReplyLength; /* received Reply message length */
- DSP_WORD RcvReplyType; /* received Reply message type code */
- DSP_WORD RetValue; /* return value */
-
- /* Default the return value to indicate a failure. */
- RetValue = 0;
-
- /* Lock access to the DSP. */
- gpakLockAccess(DspId);
-
- /* Attempt to write the command message to the DSP. */
- LoopCount = 0;
- while ((FuncStatus = WriteDspCmdMessage(DspId, pMsgBufr, CmdLength)) != 1)
- {
- if (FuncStatus == -1)
- break;
- if (++LoopCount > MAX_WAIT_LOOPS)
- break;
- gpakHostDelay();
- }
-
- /* Attempt to read the reply message from the DSP if the command message was
- sent successfully. */
- if (FuncStatus == 1)
- {
- for (LoopCount = 0; LoopCount < MAX_WAIT_LOOPS; LoopCount++)
- {
- RcvReplyLength = MSG_BUFFER_SIZE * 2;
- FuncStatus = ReadDspReplyMessage(DspId, pMsgBufr, &RcvReplyLength);
- if (FuncStatus == 1)
- {
- RcvReplyType = (pMsgBufr[0] >> 8) & 0xFF;
- if ((RcvReplyLength >= ReplyLength) &&
- (RcvReplyType == ReplyType) &&
- VerifyReply(pMsgBufr, ReplyCheckType, ReplyCheckValue))
- {
- RetValue = RcvReplyLength;
- break;
- }
- else if (RcvReplyType == MSG_NULL_REPLY)
- break;
- }
- else if (FuncStatus == -1)
- break;
- gpakHostDelay();
- }
- }
-
- /* Unlock access to the DSP. */
- gpakUnlockAccess(DspId);
-
- /* Return the length of the reply message (0 = failure). */
- return (RetValue);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakConfigurePorts - Configure a DSP's serial ports.
- *
- * FUNCTION
- * This function configures a DSP's serial ports.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-gpakConfigPortStatus_t gpakConfigurePorts(
- unsigned short int DspId, /* DSP Id (0 to MaxDSPCores-1) */
- GpakPortConfig_t *pPortConfig, /* pointer to Port Config info */
- GPAK_PortConfigStat_t *pStatus /* pointer to Port Config Status */
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (CpsInvalidDsp);
-
- /* Build the Configure Serial Ports message. */
- MsgBuffer[0] = MSG_CONFIGURE_PORTS << 8;
- MsgBuffer[1] = (DSP_WORD)
- ((pPortConfig->SlotsSelect1 << 12) |
- ((pPortConfig->FirstBlockNum1 << 8) & 0x0F00) |
- ((pPortConfig->SecBlockNum1 << 4) & 0x00F0));
- MsgBuffer[2] = (DSP_WORD) pPortConfig->FirstSlotMask1;
- MsgBuffer[3] = (DSP_WORD) pPortConfig->SecSlotMask1;
- MsgBuffer[4] = (DSP_WORD)
- ((pPortConfig->SlotsSelect2 << 12) |
- ((pPortConfig->FirstBlockNum2 << 8) & 0x0F00) |
- ((pPortConfig->SecBlockNum2 << 4) & 0x00F0));
- MsgBuffer[5] = (DSP_WORD) pPortConfig->FirstSlotMask2;
- MsgBuffer[6] = (DSP_WORD) pPortConfig->SecSlotMask2;
- MsgBuffer[7] = (DSP_WORD)
- ((pPortConfig->SlotsSelect3 << 12) |
- ((pPortConfig->FirstBlockNum3 << 8) & 0x0F00) |
- ((pPortConfig->SecBlockNum3 << 4) & 0x00F0));
- MsgBuffer[8] = (DSP_WORD) pPortConfig->FirstSlotMask3;
- MsgBuffer[9] = (DSP_WORD) pPortConfig->SecSlotMask3;
-
- MsgBuffer[10] = (DSP_WORD)
- (((pPortConfig->DxDelay1 << 11) & 0x0800) |
- ((pPortConfig->RxDataDelay1 << 9) & 0x0600) |
- ((pPortConfig->TxDataDelay1 << 7) & 0x0180) |
- ((pPortConfig->RxClockPolarity1 << 6) & 0x0040) |
- ((pPortConfig->TxClockPolarity1 << 5) & 0x0020) |
- ((pPortConfig->RxFrameSyncPolarity1 << 4) & 0x0010) |
- ((pPortConfig->TxFrameSyncPolarity1 << 3) & 0x0008) |
- ((pPortConfig->CompandingMode1 << 1) & 0x0006) |
- (pPortConfig->SerialWordSize1 & 0x0001));
-
- MsgBuffer[11] = (DSP_WORD)
- (((pPortConfig->DxDelay2 << 11) & 0x0800) |
- ((pPortConfig->RxDataDelay2 << 9) & 0x0600) |
- ((pPortConfig->TxDataDelay2 << 7) & 0x0180) |
- ((pPortConfig->RxClockPolarity2 << 6) & 0x0040) |
- ((pPortConfig->TxClockPolarity2 << 5) & 0x0020) |
- ((pPortConfig->RxFrameSyncPolarity2 << 4) & 0x0010) |
- ((pPortConfig->TxFrameSyncPolarity2 << 3) & 0x0008) |
- ((pPortConfig->CompandingMode2 << 1) & 0x0006) |
- (pPortConfig->SerialWordSize1 & 0x0001));
-
- MsgBuffer[12] = (DSP_WORD)
- (((pPortConfig->DxDelay3 << 11) & 0x0800) |
- ((pPortConfig->RxDataDelay3 << 9) & 0x0600) |
- ((pPortConfig->TxDataDelay3 << 7) & 0x0180) |
- ((pPortConfig->RxClockPolarity3 << 6) & 0x0040) |
- ((pPortConfig->TxClockPolarity3 << 5) & 0x0020) |
- ((pPortConfig->RxFrameSyncPolarity3 << 4) & 0x0010) |
- ((pPortConfig->TxFrameSyncPolarity3 << 3) & 0x0008) |
- ((pPortConfig->CompandingMode3 << 1) & 0x0006) |
- (pPortConfig->SerialWordSize3 & 0x0001));
-
- MsgBuffer[13] = (DSP_WORD) pPortConfig->ThirdSlotMask1;
- MsgBuffer[14] = (DSP_WORD) pPortConfig->FouthSlotMask1;
- MsgBuffer[15] = (DSP_WORD) pPortConfig->FifthSlotMask1;
- MsgBuffer[16] = (DSP_WORD) pPortConfig->SixthSlotMask1;
- MsgBuffer[17] = (DSP_WORD) pPortConfig->SevenSlotMask1;
- MsgBuffer[18] = (DSP_WORD) pPortConfig->EightSlotMask1;
-
- MsgBuffer[19] = (DSP_WORD) pPortConfig->ThirdSlotMask2;;
- MsgBuffer[20] = (DSP_WORD) pPortConfig->FouthSlotMask2;
- MsgBuffer[21] = (DSP_WORD) pPortConfig->FifthSlotMask2;;
- MsgBuffer[22] = (DSP_WORD) pPortConfig->SixthSlotMask2;
- MsgBuffer[23] = (DSP_WORD) pPortConfig->SevenSlotMask2;;
- MsgBuffer[24] = (DSP_WORD) pPortConfig->EightSlotMask2;
-
- MsgBuffer[25] = (DSP_WORD) pPortConfig->ThirdSlotMask3;;
- MsgBuffer[26] = (DSP_WORD) pPortConfig->FouthSlotMask3;
- MsgBuffer[27] = (DSP_WORD) pPortConfig->FifthSlotMask3;;
- MsgBuffer[28] = (DSP_WORD) pPortConfig->SixthSlotMask3;
- MsgBuffer[29] = (DSP_WORD) pPortConfig->SevenSlotMask3;;
- MsgBuffer[30] = (DSP_WORD) pPortConfig->EightSlotMask3;
-
-
- /* Attempt to send the Configure Serial Ports message to the DSP and receive
- it's reply. */
- if (!TransactCmd(DspId, MsgBuffer, 62, MSG_CONFIG_PORTS_REPLY, 4, 0, 0))
- return (CpsDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- *pStatus = (GPAK_PortConfigStat_t) (MsgBuffer[1] & 0xFF);
- if (*pStatus == Pc_Success)
- return (CpsSuccess);
- else
- return (CpsParmError);
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakConfigureChannel - Configure a DSP's Channel.
- *
- * FUNCTION
- * This function configures a DSP's Channel.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-gpakConfigChanStatus_t gpakConfigureChannel(
- unsigned short int DspId, /* DSP Id (0 to MaxDSPCores-1) */
- unsigned short int ChannelId, /* Channel Id (0 to MaxChannels-1) */
- GpakChanType ChannelType, /* Channel Type */
- GpakChannelConfig_t *pChanConfig, /* pointer to Channel Config info */
- GPAK_ChannelConfigStat_t *pStatus /* pointer to Channel Config Status */
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD MsgLength; /* message length */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (CcsInvalidDsp);
-
- /* Make sure the Channel Id is valid. */
- if (ChannelId >= MaxChannels[DspId])
- return (CcsInvalidChannel);
-
- /* Build the Configure Channel message based on the Channel Type. */
- switch (ChannelType)
- {
-
- /* PCM to Packet channel type. */
- case tdmToTdm:
-
- MsgBuffer[2] = (DSP_WORD)
- ((pChanConfig->PcmInPortA << 8) |
- (pChanConfig->PcmInSlotA & 0xFF));
- MsgBuffer[3] = (DSP_WORD)
- ((pChanConfig->PcmOutPortA << 8) |
- (pChanConfig->PcmOutSlotA & 0xFF));
-
- MsgBuffer[4] = (DSP_WORD)
- ((pChanConfig->PcmInPortB << 8) |
- (pChanConfig->PcmInSlotB & 0xFF));
- MsgBuffer[5] = (DSP_WORD)
- ((pChanConfig->PcmOutPortB << 8) |
- (pChanConfig->PcmOutSlotB & 0xFF));
-
- MsgBuffer[6] = (DSP_WORD)
- (
- ((pChanConfig->FaxCngDetB <<11) & 0x0800) |
- ((pChanConfig->FaxCngDetA <<10) & 0x0400) |
- ((pChanConfig->MuteToneB << 9) & 0x0200) |
- ((pChanConfig->MuteToneA << 8) & 0x0100) |
- ((pChanConfig->FrameRate << 6) & 0x00C0) |
- ((pChanConfig->ToneTypesB << 5) & 0x0020) |
- ((pChanConfig->ToneTypesA << 4) & 0x0010) |
- ((pChanConfig->SoftwareCompand & 3) << 2) |
- (pChanConfig->EcanEnableB << 1) |
- (pChanConfig->EcanEnableA & 1)
- );
-
- MsgBuffer[7] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanTapLength;
- MsgBuffer[8] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanNlpType;
- MsgBuffer[9] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanAdaptEnable;
- MsgBuffer[10] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanG165DetEnable;
- MsgBuffer[11] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanDblTalkThresh;
- MsgBuffer[12] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanNlpThreshold;
- MsgBuffer[13] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanNlpConv;
- MsgBuffer[14] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanNlpUnConv;
- MsgBuffer[15] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanNlpMaxSuppress;
-
- MsgBuffer[16] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanCngThreshold;
- MsgBuffer[17] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanAdaptLimit;
- MsgBuffer[18] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanCrossCorrLimit;
- MsgBuffer[19] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanNumFirSegments;
- MsgBuffer[20] = (DSP_WORD)
- pChanConfig->EcanParametersA.EcanFirSegmentLen;
-
- MsgBuffer[21] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanTapLength;
- MsgBuffer[22] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanNlpType;
- MsgBuffer[23] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanAdaptEnable;
- MsgBuffer[24] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanG165DetEnable;
- MsgBuffer[25] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanDblTalkThresh;
- MsgBuffer[26] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanNlpThreshold;
- MsgBuffer[27] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanNlpConv;
- MsgBuffer[28] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanNlpUnConv;
- MsgBuffer[29] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanNlpMaxSuppress;
- MsgBuffer[30] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanCngThreshold;
- MsgBuffer[31] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanAdaptLimit;
- MsgBuffer[32] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanCrossCorrLimit;
- MsgBuffer[33] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanNumFirSegments;
- MsgBuffer[34] = (DSP_WORD)
- pChanConfig->EcanParametersB.EcanFirSegmentLen;
-
- MsgLength = 70; // byte number == 35*2
- break;
-
-
- /* Unknown (invalid) channel type. */
- default:
- *pStatus = Cc_InvalidChannelType;
- return (CcsParmError);
- }
-
- MsgBuffer[0] = MSG_CONFIGURE_CHANNEL << 8;
- MsgBuffer[1] = (DSP_WORD) ((ChannelId << 8) | (ChannelType & 0xFF));
-
- /* Attempt to send the Configure Channel message to the DSP and receive it's
- reply. */
- if (!TransactCmd(DspId, MsgBuffer, MsgLength, MSG_CONFIG_CHAN_REPLY, 4, 1,
- (DSP_WORD) ChannelId))
- return (CcsDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- *pStatus = (GPAK_ChannelConfigStat_t) (MsgBuffer[1] & 0xFF);
- if (*pStatus == Cc_Success)
- return (CcsSuccess);
- else
- return (CcsParmError);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakTearDownChannel - Tear Down a DSP's Channel.
- *
- * FUNCTION
- * This function tears down a DSP's Channel.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-gpakTearDownStatus_t gpakTearDownChannel(
- unsigned short int DspId, /* DSP Id (0 to MaxDSPCores-1) */
- unsigned short int ChannelId, /* Channel Id (0 to MaxChannels-1) */
- GPAK_TearDownChanStat_t *pStatus /* pointer to Tear Down Status */
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (TdsInvalidDsp);
-
- /* Make sure the Channel Id is valid. */
- if (ChannelId >= MaxChannels[DspId])
- return (TdsInvalidChannel);
-
- /* Build the Tear Down Channel message. */
- MsgBuffer[0] = MSG_TEAR_DOWN_CHANNEL << 8;
- MsgBuffer[1] = (DSP_WORD) (ChannelId << 8);
-
- /* Attempt to send the Tear Down Channel message to the DSP and receive it's
- reply. */
- if (!TransactCmd(DspId, MsgBuffer, 3, MSG_TEAR_DOWN_REPLY, 4, 1,
- (DSP_WORD) ChannelId))
- return (TdsDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- *pStatus = (GPAK_TearDownChanStat_t) (MsgBuffer[1] & 0xFF);
- if (*pStatus == Td_Success)
- return (TdsSuccess);
- else
- return (TdsError);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakAlgControl - Control an Algorithm.
- *
- * FUNCTION
- * This function controls an Algorithm
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-gpakAlgControlStat_t gpakAlgControl(
- unsigned short int DspId, // DSP identifier
- unsigned short int ChannelId, // channel identifier
- GpakAlgCtrl_t ControlCode, // algorithm control code
- GPAK_AlgControlStat_t *pStatus // pointer to return status
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (AcInvalidDsp);
-
- /* Make sure the Channel Id is valid. */
- if (ChannelId >= MaxChannels[DspId])
- return (AcInvalidChannel);
-
- MsgBuffer[0] = MSG_ALG_CONTROL << 8;
- MsgBuffer[1] = (DSP_WORD) ((ChannelId << 8) | (ControlCode & 0xFF));
-
- /* Attempt to send the Tear Down Channel message to the DSP and receive it's
- reply. */
- //need_reply_len;
- if (!TransactCmd(DspId, MsgBuffer, 4, MSG_ALG_CONTROL_REPLY, 4, 1,
- (DSP_WORD) ChannelId))
- return (AcDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- *pStatus = (GPAK_AlgControlStat_t) (MsgBuffer[1] & 0xFF);
- if (*pStatus == Ac_Success)
- return (AcSuccess);
- else
- return (AcParmError);
-
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadEventFIFOMessage - read from the event fifo
- *
- * FUNCTION
- * This function reads a single event from the event fifo if one is available
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- * Notes: This function should be called in a loop until the return status
- * indicates that the fifo is empty.
- *
- * If the event code equals "EventLoopbackTeardownComplete", then the
- * contents of *pChannelId hold the coderBlockId that was assigned to
- * the loopback coder that was torn down.
- */
-gpakReadEventFIFOMessageStat_t gpakReadEventFIFOMessage(
- unsigned short int DspId, // DSP identifier
- unsigned short int *pChannelId, // pointer to channel identifier
- GpakAsyncEventCode_t *pEventCode, // pointer to Event Code
- GpakAsyncEventData_t *pEventData // pointer to Event Data Struct
- )
-{
- DSP_WORD WordBuffer[WORD_BUFFER_SIZE]; /* DSP words buffer */
- GpakAsyncEventCode_t EventCode; /* DSP's event code */
- DSP_WORD EventDataLength; /* Length of event to read */
- DSP_WORD ChannelId; /* DSP's channel Id */
- DSP_ADDRESS EventInfoAddress; /* address of EventFIFO info structure */
- DSP_ADDRESS BufrBaseAddress; /* base address of EventFIFO buffer */
- DSP_ADDRESS BufrLastAddress; /* last address of EventFIFO buffer */
- DSP_ADDRESS TakeAddress; /* current take address in fifo buffer */
- DSP_WORD BufrSize; /* size (in words) of event FIFO buffer */
- DSP_WORD PutIndex; /* event fifo put index */
- DSP_WORD TakeIndex; /* event fifo take index */
- DSP_WORD WordsReady; /* number words ready for read out of event fifo */
- DSP_WORD EventError; /* flag indicating error with event fifo msg */
-#if 0
- DSP_WORD *pDebugData; /* debug data buffer pointer in event data struct */
-#endif
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (RefInvalidDsp);
-
- /* Lock access to the DSP. */
- gpakLockAccess(DspId);
-
- /* Check if the DSP was reset and is ready. */
- if (CheckDspReset(DspId) == -1)
- {
- gpakUnlockAccess(DspId);
- return (RefDspCommFailure);
- }
-
- /* Check if an event message is ready in the DSP. */
- EventInfoAddress = pEventFifoAddress[DspId];
- gpakReadDspMemory(DspId, EventInfoAddress, CIRC_BUFFER_INFO_STRUCT_SIZE,
- WordBuffer);
- RECONSTRUCT_LONGWORD(BufrBaseAddress, ((DSP_WORD *)&WordBuffer[CB_BUFR_BASE]));
- BufrSize = WordBuffer[CB_BUFR_SIZE];
- PutIndex = WordBuffer[CB_BUFR_PUT_INDEX];
- TakeIndex = WordBuffer[CB_BUFR_TAKE_INDEX];
- if (PutIndex >= TakeIndex)
- WordsReady = PutIndex - TakeIndex;
- else
- WordsReady = PutIndex + BufrSize - TakeIndex;
-
- if (WordsReady < 2)
- {
- gpakUnlockAccess(DspId);
- return (RefNoEventAvail);
- }
-
- /* Read the event header from the DSP's Event FIFO. */
- TakeAddress = BufrBaseAddress + TakeIndex;
- BufrLastAddress = BufrBaseAddress + BufrSize - 1;
- ReadCircBuffer(DspId, BufrBaseAddress, BufrLastAddress, &TakeAddress,
- WordBuffer, 2);
- TakeIndex += 2;
- if (TakeIndex >= BufrSize)
- TakeIndex -= BufrSize;
-
- ChannelId = (WordBuffer[0] >> 8) & 0xFF;
- EventCode = (GpakAsyncEventCode_t)(WordBuffer[0] & 0xFF);
- EventDataLength = WordBuffer[1];
- EventError = 0;
-
- switch (EventCode)
- {
- case EventToneDetect:
- if (EventDataLength > WORD_BUFFER_SIZE)
- {
- gpakUnlockAccess(DspId);
- return (RefInvalidEvent);
- }
- ReadCircBuffer(DspId, BufrBaseAddress, BufrLastAddress, &TakeAddress,
- WordBuffer, EventDataLength);
- pEventData->toneEvent.ToneCode = (GpakToneCodes_t)
- (WordBuffer[0] & 0xFF);
- pEventData->toneEvent.ToneDuration = WordBuffer[1];
- pEventData->toneEvent.Direction = WordBuffer[2];
- pEventData->toneEvent.DebugToneStatus = WordBuffer[3];
- TakeIndex += EventDataLength;
- if (TakeIndex >= BufrSize)
- TakeIndex -= BufrSize;
- if (EventDataLength != 4)
- EventError = 1;
- break;
-
- default:
- EventError = 1;
- break;
- };
-
- /* Update the Take index in the DSP's Packet Out buffer information. */
- gpakWriteDspMemory(DspId, EventInfoAddress + CB_BUFR_TAKE_INDEX, 1,
- &TakeIndex);
-
- /* Unlock access to the DSP. */
- gpakUnlockAccess(DspId);
-
- if (EventError)
- return(RefInvalidEvent);
-
- *pChannelId = ChannelId;
- *pEventCode = EventCode;
- return(RefEventAvail);
-
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakPingDsp - ping the DSP to see if it's alive
- *
- * FUNCTION
- * This function checks if the DSP is still communicating with the host
- * and returns the DSP SW version
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-gpakPingDspStat_t gpakPingDsp(
- unsigned short int DspId, // DSP identifier
- unsigned short int *pDspSwVersion // DSP software version
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD DspStatus; /* DSP's reply status */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (PngInvalidDsp);
-
- /* send value of 1, DSP increments it */
- MsgBuffer[0] = (MSG_PING << 8);
-
- /* Attempt to send the ping message to the DSP and receive it's
- reply. */
- if (!TransactCmd(DspId, MsgBuffer, 1, MSG_PING_REPLY, 6, 0, 0))
- return (PngDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- DspStatus = (MsgBuffer[1] & 0xFF);
- if (DspStatus == 0)
- {
- *pDspSwVersion = MsgBuffer[2];
- return (PngSuccess);
- }
- else
- return (PngDspCommFailure);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakSerialTxFixedValue - transmit a fixed value on a timeslot
- *
- * FUNCTION
- * This function controls transmission of a fixed value out onto a serial
- * port's timeslot.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-gpakSerialTxFixedValueStat_t gpakSerialTxFixedValue(
- unsigned short int DspId, // DSP identifier
- unsigned short int ChannelId, // channel identifier
- GpakSerialPort_t PcmOutPort, // PCM Output Serial Port Id
- unsigned short int PcmOutSlot, // PCM Output Time Slot
- unsigned short int Value, // 16-bit value
- GpakActivation State // activation state
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD DspStatus; /* DSP's reply status */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (TfvInvalidDsp);
-
- /* Make sure the Channel Id is valid. */
- if (ChannelId >= MaxChannels[DspId])
- return (TfvInvalidChannel);
-
-
- /* Build the message. */
- MsgBuffer[0] = MSG_SERIAL_TXVAL << 8;
- MsgBuffer[1] = (DSP_WORD) ((ChannelId << 8) | (State & 0xFF));
- MsgBuffer[2] = (DSP_WORD) ((PcmOutPort << 8) | (PcmOutSlot & 0xFF));
- MsgBuffer[3] = (DSP_WORD) Value;
-
- /* Attempt to send the message to the DSP and receive it's
- reply. */
- //need_reply_len;
- if (!TransactCmd(DspId, MsgBuffer, 8, MSG_SERIAL_TXVAL_REPLY, 4,
- 1, ChannelId))
- return (TfvDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- DspStatus = (MsgBuffer[1] & 0xFF);
- if (DspStatus == 0)
- return (TfvSuccess);
- else
- return (TfvDspCommFailure);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakControlTdmLoopBack - control a serial port's loopback state
- *
- * FUNCTION
- * This function enables/disables the tdm input to output looback mode on a
- * serial port
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-gpakControlTdmLoopBackStat_t gpakControlTdmLoopBack(
- unsigned short int DspId, // DSP identifier
- GpakSerialPort_t SerialPort, // Serial Port Id
- GpakActivation LoopBackState // Loopback State
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD DspStatus; /* DSP's reply status */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (ClbInvalidDsp);
-
- /* Build the message. */
- MsgBuffer[0] = MSG_TDM_LOOPBACK << 8;
- MsgBuffer[1] = (DSP_WORD) ((SerialPort << 8) | (LoopBackState & 0xFF));
-
- /* Attempt to send the message to the DSP and receive it's
- reply. */
- //need_reply_len;
- if (!TransactCmd(DspId, MsgBuffer, 4, MSG_TDM_LOOPBACK_REPLY, 4, 0, 0))
- return (ClbDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- DspStatus = (MsgBuffer[1] & 0xFF);
- if (DspStatus == 0)
- return (ClbSuccess);
- else
- return (ClbDspCommFailure);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadCpuUsage - Read CPU usage statistics from a DSP.
- *
- * FUNCTION
- * This function reads the CPU usage statistics from a DSP's memory. The
- * average CPU usage in units of .1 percent are obtained for each of the frame
- * rates.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-gpakReadCpuUsageStat_t gpakReadCpuUsage(
- unsigned short int DspId, // Dsp Identifier
- unsigned short int *pPeakUsage, // pointer to peak usage variable
- unsigned short int *pPrev1SecPeakUsage // peak usage over previous 1 second
- )
-{
- DSP_WORD ReadBuffer[2]; /* DSP read buffer */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (RcuInvalidDsp);
-
- /* Lock access to the DSP. */
- gpakLockAccess(DspId);
-
- /* Check if the DSP was reset and is ready. */
- if (CheckDspReset(DspId) == -1)
- return (RcuDspCommFailure);
-
- /* Read the CPU Usage statistics from the DSP. */
- gpakReadDspMemory(DspId, pDspIfBlk[DspId] + CPU_USAGE_OFFSET, 2,
- ReadBuffer);
-
- /* Unlock access to the DSP. */
- gpakUnlockAccess(DspId);
-
- /* Store the usage statistics in the specified variables. */
- *pPrev1SecPeakUsage = ReadBuffer[0];
- *pPeakUsage = ReadBuffer[1];
-
- /* Return with an indication the usage staistics were read successfully. */
- return (RcuSuccess);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakResetCpuUsageStats - reset the cpu usage statistics
- *
- * FUNCTION
- * This function resets the cpu utilization statistics
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-gpakResetCpuUsageStat_t gpakResetCpuUsageStats(
- unsigned short int DspId // DSP identifier
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD DspStatus; /* DSP's reply status */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (RstcInvalidDsp);
-
- MsgBuffer[0] = (MSG_RESET_USAGE_STATS << 8);
-
- /* Attempt to send the message to the DSP and receive it's reply. */
- //need_reply_len;
- if (!TransactCmd(DspId, MsgBuffer, 2, MSG_RESET_USAGE_STATS_REPLY, 4, 0, 0))
- return (RstcDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- DspStatus = (MsgBuffer[1] & 0xFF);
- if (DspStatus == 0)
- return (RstcSuccess);
- else
- return (RstcDspCommFailure);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadFramingStats
- *
- * FUNCTION
- * This function reads a DSP's framing interrupt statistics
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-gpakReadFramingStatsStatus_t gpakReadFramingStats(
- unsigned short int DspId, // DSP identifier
- unsigned short int *pFramingError1Count, // port 1 Framing error count
- unsigned short int *pFramingError2Count, // port 2 Framing error count
- unsigned short int *pFramingError3Count, // port 3 Framing error count
- unsigned short int *pDmaStopErrorCount, // DMA-stoppage error count
- unsigned short int *pDmaSlipStatsBuffer // DMA slips count
- )
-{
- DSP_WORD ReadBuffer[10]; /* DSP read buffer */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (RfsInvalidDsp);
-
- /* Lock access to the DSP. */
- gpakLockAccess(DspId);
-
- /* Check if the DSP was reset and is ready. */
- if (CheckDspReset(DspId) == -1)
- return (RfsDspCommFailure);
-
- /* Read the framing interrupt statistics from the DSP. */
- gpakReadDspMemory(DspId, pDspIfBlk[DspId] + FRAMING_STATS_OFFSET, 10,
- ReadBuffer);
-
- /* Unlock access to the DSP. */
- gpakUnlockAccess(DspId);
-
- /* Store the framing statistics in the specified variables. */
- *pFramingError1Count = ReadBuffer[0];
- *pFramingError2Count = ReadBuffer[1];
- *pFramingError3Count = ReadBuffer[2];
- *pDmaStopErrorCount = ReadBuffer[3];
-
- if(pDmaSlipStatsBuffer != NULL)
- // If users want to get the DMA slips count
- {
- pDmaSlipStatsBuffer[0] = ReadBuffer[4];
- pDmaSlipStatsBuffer[1] = ReadBuffer[5];
- pDmaSlipStatsBuffer[2] = ReadBuffer[6];
- pDmaSlipStatsBuffer[3] = ReadBuffer[7];
- pDmaSlipStatsBuffer[4] = ReadBuffer[8];
- pDmaSlipStatsBuffer[5] = ReadBuffer[9];
-
- }
- /* Return with an indication the statistics were read successfully. */
- return (RfsSuccess);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakResetFramingStats - reset a DSP's framing interrupt statistics
- *
- * FUNCTION
- * This function resets a DSP's framing interrupt statistics
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-gpakResetFramingStatsStatus_t gpakResetFramingStats(
- unsigned short int DspId // DSP identifier
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD DspStatus; /* DSP's reply status */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (RstfInvalidDsp);
-
- MsgBuffer[0] = (MSG_RESET_FRAME_STATS << 8);
-
- /* Attempt to send the message to the DSP and receive it's reply. */
- //need_reply_len;
- if (!TransactCmd(DspId, MsgBuffer, 2, MSG_RESET_FRAME_STATS_REPLY, 4, 0, 0))
- return (RstfDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- DspStatus = (MsgBuffer[1] & 0xFF);
- if (DspStatus == 0)
- return (RstfSuccess);
- else
- return (RstfDspCommFailure);
-}
-
-/*
- * gpakDownloadDsp - Download a DSP's Program and initialized Data memory.
- *
- * FUNCTION
- * This function reads a DSP's Program and Data memory image from the
- * specified file and writes the image to the DSP's memory.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-gpakDownloadStatus_t gpakDownloadDsp(
- unsigned short DspId, /* DSP Identifier (0 to MaxDSPCores-1) */
- GPAK_FILE_ID FileId /* G.PAK Download File Identifier */
- )
-{
- gpakDownloadStatus_t RetStatus; /* function return status */
- int NumRead; /* number of file bytes read */
- DSP_ADDRESS Address; /* DSP address */
- unsigned int WordCount; /* number of words in record */
- unsigned int NumWords; /* number of words to read/write */
- unsigned int i; /* loop index / counter */
- unsigned int j; /* loop index */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (GdlInvalidDsp);
-
- /* Lock access to the DSP. */
- gpakLockAccess(DspId);
-
- RetStatus = GdlSuccess;
- while (RetStatus == GdlSuccess)
- {
-
- /* Read a record header from the file. */
- NumRead = gpakReadFile(FileId, DlByteBufr, 6);
- if (NumRead == -1)
- {
- RetStatus = GdlFileReadError;
- break;
- }
- if (NumRead != 6)
- {
- RetStatus = GdlInvalidFile;
- break;
- }
- Address = (((DSP_ADDRESS) DlByteBufr[1]) << 16) |
- (((DSP_ADDRESS) DlByteBufr[2]) << 8) |
- ((DSP_ADDRESS) DlByteBufr[3]);
- WordCount = (((unsigned int) DlByteBufr[4]) << 8) |
- ((unsigned int) DlByteBufr[5]);
-
- /* Check for the End Of File record. */
- if (DlByteBufr[0] == 0xFF)
- break;
-
- /* Verify the record is for a valid memory type. */
- if ((DlByteBufr[0] != 0x00) && (DlByteBufr[0] != 0x01))
- {
- RetStatus = GdlInvalidFile;
- break;
- }
-
- /* Read a block of words at a time from the file and write to the
- DSP's memory .*/
- while (WordCount != 0)
- {
- if (WordCount < DOWNLOAD_BLOCK_SIZE)
- NumWords = WordCount;
- else
- NumWords = DOWNLOAD_BLOCK_SIZE;
- WordCount -= NumWords;
- NumRead = gpakReadFile(FileId, DlByteBufr, NumWords * 2);
- if (NumRead == -1)
- {
- RetStatus = GdlFileReadError;
- break;
- }
- if (NumRead != (NumWords * 2))
- {
- RetStatus = GdlInvalidFile;
- break;
- }
- for (i = 0, j = 0; i < NumWords; i++, j += 2)
- DlWordBufr[i] = (((DSP_WORD) DlByteBufr[j]) << 8) |
- ((DSP_WORD) DlByteBufr[j + 1]);
- gpakWriteDspMemory(DspId, Address, NumWords, DlWordBufr);
- Address += ((DSP_ADDRESS) NumWords);
- }
- }
-
- /* Unlock access to the DSP. */
- gpakUnlockAccess(DspId);
-
- /* Return with an indication of success or failure. */
- return (RetStatus);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadCpuUsage - Read CPU usage statistics from a DSP.
- *
- * FUNCTION
- * This function reads the memory map register section of DSP memory.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-gpakReadDSPMemoryStat_t gpakReadDSPMemoryMap(
- unsigned short int DspId, // Dsp Identifier
- unsigned short int *pDest, // Buffer on host to hold DSP memory map
- DSP_ADDRESS BufrBaseAddress, // DSP memory users want to read out
- unsigned short int MemoryLength_Word16 // Length of memory section read out, unit is 16-bit word
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD DspStatus; /* DSP reply's status */
- int i; /* loop index / counter */
-
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (RmmInvalidDsp);
-
- /* Verify the message buffer is large enough */
- if (MSG_BUFFER_SIZE < MemoryLength_Word16 )
- return (RmmSizeTooBig);
-
- MsgBuffer[0] = MSG_READ_DSP_MEMORY << 8;
- MsgBuffer[1] = (DSP_WORD) ((BufrBaseAddress >> 16) & 0xFFFF);
- MsgBuffer[2] = (DSP_WORD) (BufrBaseAddress & 0xFFFF);
- MsgBuffer[3] = (DSP_WORD) MemoryLength_Word16;
-
- /* Attempt to send the Read memory section message to the DSP and receive it's
- reply. */
- //need_reply_len;
- if (!TransactCmd(DspId, MsgBuffer, 8, MSG_READ_DSP_MEMORY_REPLY,
- (MemoryLength_Word16+2)*2, 0, 0) )
- return (RmmInvalidAddress);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- DspStatus = (MsgBuffer[1] & 0xFF);
- if (DspStatus != 0)
- return (RmmFailure);
-
- for (i = 0; i < MemoryLength_Word16; i++)
- pDest[i] = (short int) MsgBuffer[2 + i];
-
-
- return (RmmSuccess);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakAccessGPIO - change Direction/read/write the GPIO on DSP
- *
- * FUNCTION
- * This function read/write GPIO and change the GPIO direction
- *
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-gpakAccessGPIOStat_t gpakAccessGPIO(
- unsigned short int DspId, // DSP identifier
- GpakGPIOCotrol_t gpakControlGPIO,// select oeration, changeDIR/write/read
- unsigned short int *pGPIOValue // DSP software version
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD DspStatus; /* DSP's reply status */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (GPIOInvalidDsp);
-
- /* send value of 1, DSP increments it */
- MsgBuffer[0] = (MSG_ACCESSGPIO << 8);
- MsgBuffer[1] = (DSP_WORD) ((gpakControlGPIO << 8) | (*pGPIOValue & 0xFF) );
- /* Attempt to send the ping message to the DSP and receive it's
- reply. */
- if (!TransactCmd(DspId, MsgBuffer, 4, MSG_ACCESSGPIO_REPLY, 6, 0, 0))
- return (GPIODspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- DspStatus = (MsgBuffer[1] & 0xFF);
- if (DspStatus == 0)
- {
- *pGPIOValue = MsgBuffer[2];
- return (GPIOSuccess);
- }
- else
- return (GPIODspCommFailure);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakWriteSystemParms - Write a DSP's System Parameters.
- *
- * FUNCTION
- * This function writes a DSP's System Parameters information.
- *
- * Note:
- * Or-together the desired bit-mask #defines that are listed below. Only
- * those algorithm parameters whose bit-mask is selected in the UpdateBits
- * function parameter will be updated.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-
-gpakWriteSysParmsStatus_t gpakWriteSystemParms(
- unsigned short int DspId, // DSP identifier
- GpakSystemParms_t *pSysParms, /* pointer to System Parms info var */
- unsigned short int UpdateBits, /* input: flags indicating which parms to update */
- GPAK_SysParmsStat_t *pStatus /* pointer to Write System Parms Status */
- )
-{
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
- DSP_WORD DspStatus; /* DSP's reply status */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (WspInvalidDsp);
-
- /* Build the Write System Parameters message. */
- MsgBuffer[0] = MSG_WRITE_SYS_PARMS << 8;
-
- if (UpdateBits & DTMF_UPDATE_MASK)
- {
- MsgBuffer[1] |= DTMF_UPDATE_MASK;
- MsgBuffer[8] = (DSP_WORD) pSysParms->MinSigLevel;
- MsgBuffer[9] = (DSP_WORD) (pSysParms->FreqDeviation & 0xff);
- if (pSysParms->SNRFlag)
- MsgBuffer[9] |= (1<<8);
- }
-
- MsgBuffer[10] = (DSP_WORD) 0;
- if (UpdateBits & DTMF_TWIST_UPDATE_MASK)
- {
- MsgBuffer[1] |= DTMF_TWIST_UPDATE_MASK;
- MsgBuffer[10] |= (DSP_WORD) (pSysParms->DtmfFwdTwist & 0x000f);
- MsgBuffer[10] |= (DSP_WORD) ((pSysParms->DtmfRevTwist << 4) & 0x00f0);
- }
-
-
- if (UpdateBits & DTMF_VALID_MASK)
- {
- MsgBuffer[1] |= DTMF_VALID_MASK;
- MsgBuffer[11] = (DSP_WORD) (pSysParms->DtmfValidityMask & 0x00ff);
- }
-
- /* Attempt to send the ping message to the DSP and receive it's
- reply. */
- if (!TransactCmd(DspId, MsgBuffer, 24, MSG_WRITE_SYS_PARMS_REPLY, 6, 0, 0))
- return (WspDspCommFailure);
-
- /* Return with an indication of success or failure based on the return
- status in the reply message. */
- *pStatus = (GPAK_SysParmsStat_t) (MsgBuffer[2] );
-
- DspStatus = (MsgBuffer[1] & 0xFF);
- if (DspStatus == 0)
- return (WspSuccess);
- else
- return (WspDspCommFailure);
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadSystemParms - Read a DSP's System Parameters.
- *
- * FUNCTION
- * This function reads a DSP's System Parameters information.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-gpakReadSysParmsStatus_t gpakReadSystemParms(
- unsigned short int DspId, // DSP identifier
- GpakSystemParms_t *pSysParms /* pointer to System Parms info var */
- )
-{
-
- DSP_WORD MsgBuffer[MSG_BUFFER_SIZE]; /* message buffer */
-
- /* Make sure the DSP Id is valid. */
- if (DspId >= MAX_DSP_CORES)
- return (RspInvalidDsp);
-
- /* Build the Read System Parameters message. */
- MsgBuffer[0] = MSG_READ_SYS_PARMS << 8;
-
- /* Attempt to send the ping message to the DSP and receive it's
- reply. */
- if (!TransactCmd(DspId, MsgBuffer, 2, MSG_READ_SYS_PARMS_REPLY, 22, 0, 0))
- return (RspDspCommFailure);
-
- /* Extract the System Parameters information from the message. */
- pSysParms->DtmfValidityMask = (short int)(MsgBuffer[7]) ;
-
- pSysParms->MinSigLevel = (short int)MsgBuffer[8];
- pSysParms->SNRFlag = (short int)((MsgBuffer[9]>>8) & 0x1);
- pSysParms->FreqDeviation = (short int)(MsgBuffer[9] & 0xff);
- pSysParms->DtmfFwdTwist = (short int)MsgBuffer[10] & 0x000f;
- pSysParms->DtmfRevTwist = (short int)(MsgBuffer[10] >> 4) & 0x000f;
-
- /* Return with an indication that System Parameters info was obtained. */
- return (RspSuccess);
-}
-#endif
diff --git a/drivers/dahdi/wcte12xp/GpakApi.h b/drivers/dahdi/wcte12xp/GpakApi.h
deleted file mode 100644
index ebd440e..0000000
--- a/drivers/dahdi/wcte12xp/GpakApi.h
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
- * Copyright (c) 2005 , Adaptive Digital Technologies, Inc.
- *
- * File Name: GpakApi.h
- *
- * Description:
- * This file contains the function prototypes and data types for the user
- * API functions that communicate with DSPs executing G.PAK software. The
- * file is used by application software in the host processor connected to
- * C55X G.PAK DSPs via a Host Port Interface.
- *
- * Version: 1.0
- *
- * Revision History:
- * 06/15/05 - Initial release.
- * 11/15/2006 - 24 TDM-TDM Channels EC release
- *
- * This program has been released under the terms of the GPL version 2 by
- * permission of Adaptive Digital Technologies, Inc.
- *
- */
-
-/*
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2 as published by the
- * Free Software Foundation. See the LICENSE file included with
- * this program for more details.
- */
-
-#ifndef _GPAKAPI_H /* prevent multiple inclusion */
-#define _GPAKAPI_H
-#include "GpakErrs.h"
-#include "gpakenum.h"
-
-// Bit masks to select which algorithm's parameters to update: Or-together the
-// desired masks into the UpdateBits function parameter.
-#define DTMF_UPDATE_MASK 0x0010 // update DTMF params, MinLevel, SNRFlag and Freq
-#define DTMF_TWIST_UPDATE_MASK 0x0020 // update DTMF TWIST system params
-#define DTMF_VALID_MASK 0x0080 // update DTMF ValidMask params
-
-#define DSP_DEBUG_BUFF_SIZE 42 // units of 16-bit words
-
-/* Definition of an Asynchronous Event Data Structure */
-typedef union
-{
- struct
- {
- GpakToneCodes_t ToneCode; // detected tone code
- unsigned short int ToneDuration; // tone duration
- GpakTdmDirection Direction; // detected on A r B side
- short int DebugToneStatus;// reserved for debug info
- } toneEvent;
-
-} GpakAsyncEventData_t;
-
-/* Definition of an Echo Canceller Parameters information structure. */
-typedef struct
-{
- short int EcanTapLength; // Echo Can Num Taps (tail length)
- short int EcanNlpType; // Echo Can NLP Type
- short int EcanAdaptEnable; // Echo Can Adapt Enable flag
- short int EcanG165DetEnable; // Echo Can G165 Detect Enable flag
- short int EcanDblTalkThresh; // Echo Can Double Talk threshold
- short int EcanNlpThreshold; // Echo Can NLP threshold
- short int EcanNlpConv; // Dynamic NLP control, NLP limit when EC about to converged
- short int EcanNlpUnConv;// Dynamic NLP control, NLP limit when EC not converged yet
- short int EcanNlpMaxSuppress; // suppression level for NLP_SUPP mode
- short int EcanCngThreshold; // Echo Can CNG Noise threshold
- short int EcanAdaptLimit; // Echo Can Max Adapts per frame
- short int EcanCrossCorrLimit; // Echo Can Cross Correlation limit
- short int EcanNumFirSegments; // Echo Can Num FIR Segments
- short int EcanFirSegmentLen; // Echo Can FIR Segment Length
-} GpakEcanParms_t;
-
-/* Definition of a Channel Configuration information structure. */
-typedef struct
-{
- GpakSerialPort_t PcmInPortA; // A side PCM Input Serial Port Id
- unsigned short int PcmInSlotA; // A side PCM Input Time Slot
- GpakSerialPort_t PcmOutPortA; // A side PCM Output Serial Port Id
- unsigned short int PcmOutSlotA; // A side PCM Output Time Slot
- GpakSerialPort_t PcmInPortB; // B side PCM Input Serial Port Id
- unsigned short int PcmInSlotB; // B side PCM Input Time Slot
- GpakSerialPort_t PcmOutPortB; // B side PCM Output Serial Port Id
- unsigned short int PcmOutSlotB; // B side PCM Output Time Slot
- GpakToneTypes ToneTypesA; // A side Tone Detect Types
- GpakToneTypes ToneTypesB; // B side Tone Detect Types
- GpakActivation EcanEnableA; // Echo Cancel A Enabled
- GpakActivation EcanEnableB; // Echo Cancel B Enabled
- GpakEcanParms_t EcanParametersA; // Echo Cancel parameters
- GpakEcanParms_t EcanParametersB; // Echo Cancel parameters
- GpakCompandModes SoftwareCompand; // software companding
- GpakRate_t FrameRate; // Gpak Frame Rate
- GpakActivation MuteToneA; // A side mute DTMF Enabled
- GpakActivation MuteToneB; // B side mute DTMF Enabled
- GpakActivation FaxCngDetA; // A side FaxCng Tone Detector Enabled
- GpakActivation FaxCngDetB; // B side FaxCng Tone Detector Enabled
-
-} GpakChannelConfig_t;
-
-
-/* Definition of a Serial Port Configuration Structure */
-typedef struct
-{
- GpakSlotCfg_t SlotsSelect1; // port 1 Slot selection
- unsigned short int FirstBlockNum1; // port 1 first group Block Number
- unsigned short int FirstSlotMask1; // port 1 first group Slot Mask
- unsigned short int SecBlockNum1; // port 1 second group Block Number
- unsigned short int SecSlotMask1; // port 1 second group Slot Mask
-
- GpakSerWordSize_t SerialWordSize1; // port 1 serial word size
- GpakCompandModes CompandingMode1; // port 1 companding mode
- GpakSerFrameSyncPol_t TxFrameSyncPolarity1; // port 1 Tx Frame Sync Polarity
- GpakSerFrameSyncPol_t RxFrameSyncPolarity1; // port 1 Rx Frame Sync Polarity
- GpakSerClockPol_t TxClockPolarity1; // port 1 Tx Clock Polarity
- GpakSerClockPol_t RxClockPolarity1; // port 1 Rx Clock Polarity
- GpakSerDataDelay_t TxDataDelay1; // port 1 Tx data delay
- GpakSerDataDelay_t RxDataDelay1; // port 1 Rx data delay
- GpakActivation DxDelay1; // port 1 DX Delay
-
- unsigned short int ThirdSlotMask1; // port 1 3rd group Slot Mask
- unsigned short int FouthSlotMask1; // port 1 4th group Slot Mask
- unsigned short int FifthSlotMask1; // port 1 5th group Slot Mask
- unsigned short int SixthSlotMask1; // port 1 6th group Slot Mask
- unsigned short int SevenSlotMask1; // port 1 7th group Slot Mask
- unsigned short int EightSlotMask1; // port 1 8th group Slot Mask
-
-
- GpakSlotCfg_t SlotsSelect2; // port 2 Slot selection
- unsigned short int FirstBlockNum2; // port 2 first group Block Number
- unsigned short int FirstSlotMask2; // port 2 first group Slot Mask
- unsigned short int SecBlockNum2; // port 2 second group Block Number
- unsigned short int SecSlotMask2; // port 2 second group Slot Mask
- GpakSerWordSize_t SerialWordSize2; // port 2 serial word size
- GpakCompandModes CompandingMode2; // port 2 companding mode
- GpakSerFrameSyncPol_t TxFrameSyncPolarity2; // port 2 Tx Frame Sync Polarity
- GpakSerFrameSyncPol_t RxFrameSyncPolarity2; // port 2 Rx Frame Sync Polarity
- GpakSerClockPol_t TxClockPolarity2; // port 2 Tx Clock Polarity
- GpakSerClockPol_t RxClockPolarity2; // port 2 Rx Clock Polarity
- GpakSerDataDelay_t TxDataDelay2; // port 2 Tx data delay
- GpakSerDataDelay_t RxDataDelay2; // port 2 Rx data delay
- GpakActivation DxDelay2; // port 2 DX Delay
-
- unsigned short int ThirdSlotMask2; // port 2 3rd group Slot Mask
- unsigned short int FouthSlotMask2; // port 2 4th group Slot Mask
- unsigned short int FifthSlotMask2; // port 2 5th group Slot Mask
- unsigned short int SixthSlotMask2; // port 2 6th group Slot Mask
- unsigned short int SevenSlotMask2; // port 2 7th group Slot Mask
- unsigned short int EightSlotMask2; // port 2 8th group Slot Mask
-
- GpakSlotCfg_t SlotsSelect3; // port 3 Slot selection
- unsigned short int FirstBlockNum3; // port 3 first group Block Number
- unsigned short int FirstSlotMask3; // port 3 first group Slot Mask
- unsigned short int SecBlockNum3; // port 3 second group Block Number
- unsigned short int SecSlotMask3; // port 3 second group Slot Mask
- GpakSerWordSize_t SerialWordSize3; // port 3 serial word size
- GpakCompandModes CompandingMode3; // port 3 companding mode
- GpakSerFrameSyncPol_t TxFrameSyncPolarity3; // port 3 Tx Frame Sync Polarity
- GpakSerFrameSyncPol_t RxFrameSyncPolarity3; // port 3 Rx Frame Sync Polarity
- GpakSerClockPol_t TxClockPolarity3; // port 3 Tx Clock Polarity
- GpakSerClockPol_t RxClockPolarity3; // port 3 Rx Clock Polarity
- GpakSerDataDelay_t TxDataDelay3; // port 3 Tx data delay
- GpakSerDataDelay_t RxDataDelay3; // port 3 Rx data delay
- GpakActivation DxDelay3; // port 3 DX Delay
-
- unsigned short int ThirdSlotMask3; // port 3 3rd group Slot Mask
- unsigned short int FouthSlotMask3; // port 3 4th group Slot Mask
- unsigned short int FifthSlotMask3; // port 3 5th group Slot Mask
- unsigned short int SixthSlotMask3; // port 3 6th group Slot Mask
- unsigned short int SevenSlotMask3; // port 3 7th group Slot Mask
- unsigned short int EightSlotMask3; // port 3 8th group Slot Mask
-
-} GpakPortConfig_t;
-
-/* Definition of a Tone Generation Parameter Structure */
-/*
-typedef struct
-{
- GpakToneGenType_t ToneType; // Tone Type
- unsigned short int Frequency[4]; // Frequency (Hz)
- short int Level[4]; // Frequency's Level (1 dBm)
- unsigned short int OnTime[4]; // On Times (msecs)
- unsigned short int OffTime[4]; // Off Times (msecs)
-} GpakToneGenParms_t;
-*/
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-/* gpakConfigureChannel return status. */
-typedef enum
-{
- CcsSuccess = 0, /* Channel Configured successfully */
- CcsParmError = 1, /* Channel Config Parameter error */
- CcsInvalidChannel = 2, /* invalid channel */
- CcsInvalidDsp = 3, /* invalid DSP */
- CcsDspCommFailure = 4 /* failed to communicate with DSP */
-} gpakConfigChanStatus_t;
-
-/*
- * gpakConfigureChannel - Configure a DSP's Channel.
- *
- * FUNCTION
- * This function configures a DSP's Channel.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-extern gpakConfigChanStatus_t gpakConfigureChannel(
- unsigned short int DspId, // DSP identifier
- unsigned short int ChannelId, // channel identifier
- GpakChanType ChannelType, // channel type
- GpakChannelConfig_t *pChanConfig, // pointer to channel config info
- GPAK_ChannelConfigStat_t *pStatus // pointer to Channel Config Status
- );
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-/* gpakTearDownChannel return status. */
-typedef enum
-{
- TdsSuccess = 0, /* Channel Tear Down successful */
- TdsError = 1, /* Channel Tear Down error */
- TdsInvalidChannel = 2, /* invalid channel */
- TdsInvalidDsp = 3, /* invalid DSP */
- TdsDspCommFailure = 4 /* failed to communicate with DSP */
-} gpakTearDownStatus_t;
-
-/*
- * gpakTearDownChannel - Tear Down a DSP's Channel.
- *
- * FUNCTION
- * This function tears down a DSP's Channel.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-
-extern gpakTearDownStatus_t gpakTearDownChannel(
- unsigned short int DspId, // DSP identifier
- unsigned short int ChannelId, // channel identifier
- GPAK_TearDownChanStat_t *pStatus // pointer to Tear Down Status
- );
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-/* gpakAlgControl return status. */
-typedef enum
-{
- AcSuccess = 0, /* control successful */
- AcInvalidChannel = 1, /* invalid channel identifier */
- AcInvalidDsp = 2, /* invalid DSP */
- AcParmError = 3, /* invalid control parameter */
- AcDspCommFailure = 4 /* failed to communicate with DSP */
-} gpakAlgControlStat_t;
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakAlgControl - Control an Algorithm.
- *
- * FUNCTION
- * This function controls an Algorithm
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-extern gpakAlgControlStat_t gpakAlgControl(
- unsigned short int DspId, // DSP identifier
- unsigned short int ChannelId, // channel identifier
- GpakAlgCtrl_t ControlCode, // algorithm control code
- GPAK_AlgControlStat_t *pStatus // pointer to return status
- );
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-/* gpakConfigurePorts return status. */
-typedef enum
-{
- CpsSuccess = 0, /* Serial Ports configured successfully */
- CpsParmError = 1, /* Configure Ports Parameter error */
- CpsInvalidDsp = 2, /* invalid DSP */
- CpsDspCommFailure = 3 /* failed to communicate with DSP */
-} gpakConfigPortStatus_t;
-
-/*
- * gpakConfigurePorts - Configure a DSP's serial ports.
- *
- * FUNCTION
- * This function configures a DSP's serial ports.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-extern gpakConfigPortStatus_t gpakConfigurePorts(
- unsigned short int DspId, // DSP identifier
- GpakPortConfig_t *pPortConfig, // pointer to Port Config info
- GPAK_PortConfigStat_t *pStatus // pointer to Port Config Status
- );
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-/* gpakDownloadDsp return status. */
-typedef enum
-{
- GdlSuccess = 0, /* DSP download successful */
- GdlFileReadError = 1, /* error reading Download file */
- GdlInvalidFile = 2, /* invalid Download file content */
- GdlInvalidDsp = 3 /* invalid DSP */
-} gpakDownloadStatus_t;
-
-/*
- * gpakDownloadDsp - Download a DSP's Program and initialized Data memory.
- *
- * FUNCTION
- * This function reads a DSP's Program and Data memory image from the
- * specified file and writes the image to the DSP's memory.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- */
-extern gpakDownloadStatus_t gpakDownloadDsp(
- unsigned short int DspId, // DSP identifier
- GPAK_FILE_ID FileId // G.PAK download file identifier
- );
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-/* gpakReadEventFIFOMessage return status */
-typedef enum
-{
- RefEventAvail = 0, /* an event was successfully read from the fifo */
- RefNoEventAvail = 1, /* no event was in the fifo */
- RefInvalidDsp = 2, /* invalid DSP identifier */
- RefInvalidEvent = 3, /* invalid event */
- RefDspCommFailure = 4 /* error communicating with DSP */
-} gpakReadEventFIFOMessageStat_t;
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadEventFIFOMessage - read from the event fifo
- *
- * FUNCTION
- * This function reads a single event from the event fifo if one is available
- *
- * RETURNS
- * Status code indicating success or a specific error.
- *
- * Note: This function should be called in a loop until the return status
- * indicates that the fifo is empty.
- */
-extern gpakReadEventFIFOMessageStat_t gpakReadEventFIFOMessage(
- unsigned short int DspId, // DSP identifier
- unsigned short int *pChannelId, // pointer to channel identifier
- GpakAsyncEventCode_t *pEventCode, // pointer to Event Code
- GpakAsyncEventData_t *pEventData // pointer to Event Data Struct
- );
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-/* gpakPingDsp return status values */
-typedef enum
-{
- PngSuccess = 0, /* DSP responded successfully */
- PngInvalidDsp = 1, /* invalid DSP identifier */
- PngDspCommFailure = 2 /* error communicating with DSP */
-} gpakPingDspStat_t;
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakPingDsp - ping the DSP to see if it's alive
- *
- * FUNCTION
- * This function checks if the DSP is still communicating with the host
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-extern gpakPingDspStat_t gpakPingDsp(
- unsigned short int DspId, // DSP identifier
- unsigned short int *pDspSwVersion // DSP software version
- );
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-/* gpakSerialTxFixedValue return status values */
-typedef enum
-{
- TfvSuccess = 0, /* operation successful */
- TfvInvalidChannel = 1, /* invalid channel identifier */
- TfvInvalidDsp = 2, /* invalid DSP identifier */
- TfvDspCommFailure = 3 /* failed to communicate with DSP */
-} gpakSerialTxFixedValueStat_t;
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakSerialTxFixedValue - transmit a fixed value on a timeslot
- *
- * FUNCTION
- * This function controls transmission of a fixed value out onto a serial
- * port's timeslot.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-extern gpakSerialTxFixedValueStat_t gpakSerialTxFixedValue(
- unsigned short int DspId, // DSP identifier
- unsigned short int ChannelId, // channel identifier
- GpakSerialPort_t PcmOutPort, // PCM Output Serial Port Id
- unsigned short int PcmOutSlot, // PCM Output Time Slot
- unsigned short int Value, // 16-bit value
- GpakActivation State // activation state
- );
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-/* gpakControlTdmLoopBack return status values */
-typedef enum
-{
- ClbSuccess = 0, /* operation successful */
- ClbSerPortInactive = 1, /* serial port is inactive */
- ClbInvalidDsp = 2, /* invalid DSP identifier */
- ClbDspCommFailure = 3 /* failed to communicate with DSP */
-} gpakControlTdmLoopBackStat_t;
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakControlTdmLoopBack - control a serial port's loopback state
- *
- * FUNCTION
- * This function enables/disables the tdm input to output looback mode on a
- * serial port
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-gpakControlTdmLoopBackStat_t gpakControlTdmLoopBack(
- unsigned short int DspId, // DSP identifier
- GpakSerialPort_t SerialPort, // Serial Port Id
- GpakActivation LoopBackState // Loopback State
- );
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-/* gpakReadCpuUsage return status values */
-typedef enum
-{
- RcuSuccess = 0, /* operation successful */
- RcuInvalidDsp = 1, /* invalid DSP identifier */
- RcuDspCommFailure = 2 /* communication failure */
-} gpakReadCpuUsageStat_t;
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadCpuUsage - read the cpu usage statistics
- *
- * FUNCTION
- * This function reads cpu utilization from the DSP.
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-extern gpakReadCpuUsageStat_t gpakReadCpuUsage(
- unsigned short int DspId, // DSP identifier
- unsigned short int *pPeakUsage, // pointer to peak usage variable
- unsigned short int *pPrev1SecPeakUsage // peak usage over previous 1 second
- );
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-/* gpakResetCpuUsageStats return status values */
-typedef enum
-{
- RstcSuccess = 0, /* operation successful */
- RstcInvalidDsp = 1, /* invalid DSP identifier */
- RstcDspCommFailure = 2 /* communication failure */
-} gpakResetCpuUsageStat_t;
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakResetCpuUsageStats - reset the cpu usage statistics
- *
- * FUNCTION
- * This function resets the cpu utilization statistics
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-extern gpakResetCpuUsageStat_t gpakResetCpuUsageStats(
- unsigned short int DspId // DSP identifier
- );
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-/* gpakReadFramingStats return status values */
-typedef enum
-{
- RfsSuccess = 0, /* operation successful */
- RfsInvalidDsp = 1, /* invalid DSP identifier */
- RfsDspCommFailure = 2 /* communication failure */
-} gpakReadFramingStatsStatus_t;
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadFramingStats
- *
- * FUNCTION
- * This function reads a DSP's framing interrupt statistics
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-extern gpakReadFramingStatsStatus_t gpakReadFramingStats(
- unsigned short int DspId, // DSP identifier
- unsigned short int *pFramingError1Count, // port 1 Framing error count
- unsigned short int *pFramingError2Count, // port 2 Framing error count
- unsigned short int *pFramingError3Count, // port 3 Framing error count
- unsigned short int *pDmaStopErrorCount, // DMA-stoppage error count
- unsigned short int *pDmaSlipStatsBuffer // DMA slips count
- );
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-/* gpakResetFramingStats return values */
-typedef enum
-{
- RstfSuccess = 0, /* operation successful */
- RstfInvalidDsp = 1, /* invalid DSP identifier */
- RstfDspCommFailure = 2 /* communication failure */
-} gpakResetFramingStatsStatus_t;
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakResetFramingStats - reset a DSP's framing interrupt statistics
- *
- * FUNCTION
- * This function resets a DSP's framing interrupt statistics
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-extern gpakResetFramingStatsStatus_t gpakResetFramingStats(
- unsigned short int DspId // DSP identifier
- );
-
-
-typedef enum
-{
- RmmSuccess =0,
- RmmInvalidDsp = 1,
- RmmSizeTooBig = 2,
- RmmFailure = 3,
- RmmInvalidAddress = 4
-
-} gpakReadDSPMemoryStat_t;
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakResetFramingStats - read a section of DSP memory
- * to get access DSP registers, since 0x00--0x60 not HPI-accessable
- *
- * FUNCTION
- * This function resets a DSP's framing interrupt statistics
- *
- * RETURNS
- * Status code indicating success or a specific error.
- */
-
-extern gpakReadDSPMemoryStat_t gpakReadDSPMemoryMap(
- unsigned short int DspId, // Dsp Identifier
- unsigned short int *pDest, // Buffer on host to hold DSP memory map
- DSP_ADDRESS BufrBaseAddress, // DSP memory users want to read out
- unsigned short int MemoryLength_Word16 // Length of memory section read out, unit is 16-bit word
- );
-
-typedef enum
-{
- GPIOSuccess =0,
- GPIOInvalidDsp = 1,
- GPIODspCommFailure = 2
-}gpakAccessGPIOStat_t;
-
-extern gpakAccessGPIOStat_t gpakAccessGPIO(
- unsigned short int DspId, // DSP identifier
- GpakGPIOCotrol_t gpakControlGPIO,// select oeration, changeDIR/write/read
- unsigned short int *pGPIOValue // pointer for the read/write value or DIR mask
- );
-
-/* gpakWriteSystemParms return status. */
-typedef enum
-{
- WspSuccess = 0, /* System Parameters written successfully */
- WspParmError = 1, /* Write System Parms's Parameter error */
- WspInvalidDsp = 2, /* invalid DSP */
- WspDspCommFailure = 3 /* failed to communicate with DSP */
-} gpakWriteSysParmsStatus_t;
-
-/* Definition of a System Parameters information structure. */
-typedef struct
-{
- /* DTMF Parameters */
- short int MinSigLevel; /* 0 = Disabled, Min Sig Power Level for detection */
- short int SNRFlag; /* 0 = Disabled, relax SNR tolerances */
- short int FreqDeviation; /* 0 = Disabled, X Percent Deviation times 10 (e.g. 1.7% is entered as 17) */
- short int DtmfFwdTwist; /* 0 to 8 db */
- short int DtmfRevTwist; /* 0 to 8 db */
-
- short int DtmfValidityMask; /* This flag allows users to relax the trailing conditions of the tone */
-
-} GpakSystemParms_t;
-/* gpakReadSystemParms return status. */
-typedef enum
-{
- RspSuccess = 0, /* System Parameters read successfully */
- RspInvalidDsp = 1, /* invalid DSP */
- RspDspCommFailure = 2 /* failed to communicate with DSP */
-} gpakReadSysParmsStatus_t;
-
-extern gpakReadSysParmsStatus_t gpakReadSystemParms(
- unsigned short int DspId, // DSP identifier
- GpakSystemParms_t *pSysParms /* pointer to System Parms info var */
- );
-
-extern gpakWriteSysParmsStatus_t gpakWriteSystemParms(
- unsigned short int DspId, // DSP identifier
- GpakSystemParms_t *pSysParms, /* pointer to System Parms info var */
- unsigned short int UpdateBits, /* input: flags indicating which parms to update */
- GPAK_SysParmsStat_t *pStatus /* pointer to Write System Parms Status */
- );
-
-#endif // end multiple inclusion
-
diff --git a/drivers/dahdi/wcte12xp/GpakErrs.h b/drivers/dahdi/wcte12xp/GpakErrs.h
deleted file mode 100644
index 2f5083b..0000000
--- a/drivers/dahdi/wcte12xp/GpakErrs.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2002 - 2004, Adaptive Digital Technologies, Inc.
- *
- * File Name: GpakErrs.h
- *
- * Description:
- * This file contains DSP reply status codes used by G.PAK API functions to
- * indicate specific errors.
- *
- * Version: 1.0
- *
- * Revision History:
- * 10/17/01 - Initial release.
- * 07/03/02 - Updates for conferencing.
- * 06/15/04 - Tone type updates.
- *
- * This program has been released under the terms of the GPL version 2 by
- * permission of Adaptive Digital Technologies, Inc.
- *
- */
-
-/*
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2 as published by the
- * Free Software Foundation. See the LICENSE file included with
- * this program for more details.
- */
-
-#ifndef _GPAKERRS_H /* prevent multiple inclusion */
-#define _GPAKERRS_H
-
-/* Configure Serial Ports reply status codes. */
-typedef enum
-{
- Pc_Success = 0, /* serial ports configured successfully */
- Pc_ChannelsActive = 1, /* unable to configure while channels active */
- Pc_TooManySlots1 = 2, /* too many slots selected for port 1 */
- Pc_InvalidBlockCombo1 = 3, /* invalid combination of blocks for port 1 */
- Pc_NoSlots1 = 4, /* no slots selected for port 1 */
- Pc_InvalidSlots1 = 5, /* invalid slot (> max) selected for port 1 */
- Pc_TooManySlots2 = 6, /* too many slots selected for port 2 */
- Pc_InvalidBlockCombo2 = 7, /* invalid combination of blocks for port 2 */
- Pc_NoSlots2 = 8, /* no slots selected for port 2 */
- Pc_InvalidSlots2 = 9, /* invalid slot (> max) selected for port 2 */
- Pc_TooManySlots3 = 10, /* too many slots selected for port 3 */
- Pc_InvalidBlockCombo3 = 11, /* invalid combination of blocks for port 3 */
- Pc_NoSlots3 = 12, /* no slots selected for port 3 */
- Pc_InvalidSlots3 = 13 /* invalid slot (> max) selected for port 3 */
-} GPAK_PortConfigStat_t;
-
-/* Configure Channel reply status codes. */
-typedef enum
-{
- Cc_Success = 0, /* channel configured successfully */
- Cc_InvalidChannelType = 1, /* invalid Channel Type */
- Cc_InvalidChannel = 2, /* invalid Channel A Id */
- Cc_ChannelActiveA = 3, /* Channel A is currently active */
- Cc_InvalidInputPortA = 4, /* invalid Input A Port */
- Cc_InvalidInputSlotA = 5, /* invalid Input A Slot */
- Cc_BusyInputSlotA = 6, /* busy Input A Slot */
- Cc_InvalidOutputPortA = 7, /* invalid Output A Port */
- Cc_InvalidOutputSlotA = 8, /* invalid Output A Slot */
- Cc_BusyOutputSlotA = 9, /* busy Output A Slot */
- Cc_InvalidInputPortB = 10, /* invalid Input B Port */
- Cc_InvalidInputSlotB = 11, /* invalid Input B Slot */
- Cc_BusyInputSlotB = 12, /* busy Input B Slot */
- Cc_InvalidPktInCodingA = 13, /* invalid Packet In A Coding */
- Cc_InvalidPktOutCodingA = 14, /* invalid Packet Out A Coding */
- Cc_InvalidPktInSizeA = 15, /* invalid Packet In A Frame Size */
- Cc_InvalidPktOutSizeA = 16, /* invalid Packet Out A Frame Size */
-
- Cc_ChanTypeNotConfigured = 21, /* channel type was not configured */
- Cc_InsuffECResources = 22, /* insufficient ecan resources avail. */
- Cc_InsuffTDMResources = 23, /* insufficient tdm block resources avail. */
-
- Cc_InsuffPktBufResources = 25, /* insufficient pkt buffer resources avail. */
- Cc_InsuffPcmBufResources = 26, /* insufficient pcm buffer resources avail. */
-
- Cc_BadPcmEcNlpType = 30, /* invalid EC Nlp type */
- Cc_BadPcmEcTapLength = 31, /* invalid EC tap length */
- Cc_BadPcmEcDblTalkThresh = 32, /* invalid EC double-talk threshold */
- Cc_BadPcmEcNlpThreshold = 33, /* invalid EC Nlp threshold */
- Cc_BadPcmEcCngThreshold = 34, /* invalid EC Cng threshold */
- Cc_BadPcmEcAdaptLimit = 35, /* invalid EC Adapt Limit */
- Cc_BadPcmEcCrossCorrLim = 36, /* invalid EC Cross Correlation Limit */
- Cc_BadPcmEcNumFirSegs = 37, /* invalid EC Number of FirSegments */
- Cc_BadPcmEcFirSegLen = 38, /* invalid EC Fir Segment Length */
-
- /*Cc_InvalidNumEcsEnabled = 48, */ /* more than 1 Ec enabled on channel */
- Cc_InvalidFrameRate = 49, /* invalid gpak frame rate */
- Cc_InvalidSoftCompand = 50, /* invalid softCompanding type */
-
- Cc_InvalidMuteToneA = 51, /* invalid MuteToneA set, no detector */
- Cc_InvalidMuteToneB = 52, /* invalid MuteToneB set, no detector */
- Cc_InsuffFaxCngDetResources = 53 /* insufficient tdm block resources avail. */
-
-} GPAK_ChannelConfigStat_t;
-
-/* Tear Down Channel reply status codes. */
-typedef enum
-{
- Td_Success = 0, /* channel torn down successfully */
- Td_InvalidChannel = 1, /* invalid Channel Id */
- Td_ChannelNotActive = 2 /* channel is not active */
-} GPAK_TearDownChanStat_t;
-
-
-typedef enum
-{
- Ac_Success = 0, /* algorithm control is successfull */
- Ac_InvalidChannel = 1, /* invalid channel identifier */
- Ac_InvalidCode = 2, /* invalid algorithm control code */
- Ac_ECNotEnabled = 3, /* echo canceller was not allocated */
- Ac_InvalidSoftComp = 4, /* invalid softcompanding, 'cause serial port not in companding mode */
- Ac_InvalidDTMFMuteA = 5, /* A side invalid Mute, since no dtmf detector */
- Ac_InvalidDTMFMuteB = 6, /* B side invalid Mute, since no dtmf detector */
- Ac_InvalidFaxCngA = 7, /* A side FAXCNG detector not available */
- Ac_InvalidFaxCngB = 8, /* B side FAXCNG detector not available */
- Ac_InvalidSysConfig = 9 /* No new system parameters (DTMF config) wrriten yet */
-} GPAK_AlgControlStat_t;
-
-/* Write System Parameters reply status codes. */
-typedef enum
-{
- Sp_Success = 0, /* System Parameters written successfully */
- Sp_BadTwistThresh = 29 /* invalid twist threshold */
-
-} GPAK_SysParmsStat_t;
-
-#endif /* prevent multiple inclusion */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/drivers/dahdi/wcte12xp/Kbuild b/drivers/dahdi/wcte12xp/Kbuild
index c462a32..77efd7d 100644
--- a/drivers/dahdi/wcte12xp/Kbuild
+++ b/drivers/dahdi/wcte12xp/Kbuild
@@ -1,18 +1,5 @@
obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_WCTE12XP) += wcte12xp.o
-FIRM_DIR := ../firmware
-
EXTRA_CFLAGS += -I$(src)/.. -Wno-undef
-ifeq ($(HOTPLUG_FIRMWARE),yes)
- EXTRA_CFLAGS+=-DHOTPLUG_FIRMWARE
-endif
-
-wcte12xp-objs := base.o vpmadt032.o GpakApi.o voicebus.o
-
-ifneq ($(HOTPLUG_FIRMWARE),yes)
-wcte12xp-objs += $(FIRM_DIR)/dahdi-fw-vpmadt032.o
-endif
-
-$(obj)/$(FIRM_DIR)/dahdi-fw-vpmadt032.o: $(obj)/base.o
- $(MAKE) -C $(obj)/$(FIRM_DIR) dahdi-fw-vpmadt032.o
+wcte12xp-objs := base.o
diff --git a/drivers/dahdi/wcte12xp/base.c b/drivers/dahdi/wcte12xp/base.c
index 9294350..30f89e9 100644
--- a/drivers/dahdi/wcte12xp/base.c
+++ b/drivers/dahdi/wcte12xp/base.c
@@ -41,15 +41,13 @@
#include <dahdi/kernel.h>
-#include "../wct4xxp/wct4xxp.h" /* For certain definitions */
+#include "wct4xxp/wct4xxp.h" /* For certain definitions */
-#include "../voicebus.h"
+#include "voicebus/voicebus.h"
#include "wcte12xp.h"
-#if defined(VPM_SUPPORT)
-#include "vpmadt032.h"
-#include "GpakApi.h"
-#endif
+#include "voicebus/GpakCust.h"
+#include "voicebus/GpakApi.h"
struct pci_driver te12xp_driver;
@@ -60,14 +58,11 @@ static int loopback = 0;
static int t1e1override = -1;
static int unchannelized = 0;
static int latency = VOICEBUS_DEFAULT_LATENCY;
-#ifdef VPM_SUPPORT
int vpmsupport = 1;
-int vpmdtmfsupport = 0;
static int vpmtsisupport = 0;
-int vpmnlptype = 1;
+int vpmnlptype = 3;
int vpmnlpthresh = 24;
int vpmnlpmaxsupp = 0;
-#endif
struct t1 *ifaces[WC_MAX_IFACES];
spinlock_t ifacelock = SPIN_LOCK_UNLOCKED;
@@ -205,6 +200,329 @@ static inline void cmd_decipher(struct t1 *wc, volatile unsigned char *readchunk
spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
}
+inline void cmd_decipher_vpmadt032(struct t1 *wc, unsigned char *readchunk)
+{
+ unsigned long flags;
+ struct vpmadt032 *vpm = wc->vpmadt032;
+ struct vpmadt032_cmd *cmd;
+
+ BUG_ON(!vpm);
+
+ /* If the hardware is not processing any commands currently, then
+ * there is nothing for us to do here. */
+ if (list_empty(&vpm->active_cmds)) {
+ return;
+ }
+
+ spin_lock_irqsave(&vpm->list_lock, flags);
+ cmd = list_entry(vpm->active_cmds.next, struct vpmadt032_cmd, node);
+ if (wc->rxident == cmd->txident) {
+ list_del_init(&cmd->node);
+ } else {
+ cmd = NULL;
+ }
+ spin_unlock_irqrestore(&vpm->list_lock, flags);
+
+ if (!cmd) {
+ return;
+ }
+
+ /* Skip audio */
+ readchunk += 66;
+
+ /* Store result */
+ cmd->data = (0xff & readchunk[CMD_BYTE(2, 1, 1)]) << 8;
+ cmd->data |= readchunk[CMD_BYTE(2, 2, 1)];
+ if (cmd->desc & __VPM150M_WR) {
+ /* Writes do not need any acknowledgement */
+ list_add_tail(&cmd->node, &vpm->free_cmds);
+ } else {
+ cmd->desc |= __VPM150M_FIN;
+ complete(&cmd->complete);
+ }
+}
+
+static int config_vpmadt032(struct vpmadt032 *vpm)
+{
+ int res, channel;
+ GpakPortConfig_t portconfig = {0};
+ gpakConfigPortStatus_t configportstatus;
+ GPAK_PortConfigStat_t pstatus;
+ GpakChannelConfig_t chanconfig;
+ GPAK_ChannelConfigStat_t cstatus;
+ GPAK_AlgControlStat_t algstatus;
+
+ /* First Serial Port config */
+ portconfig.SlotsSelect1 = SlotCfgNone;
+ portconfig.FirstBlockNum1 = 0;
+ portconfig.FirstSlotMask1 = 0x0000;
+ portconfig.SecBlockNum1 = 1;
+ portconfig.SecSlotMask1 = 0x0000;
+ portconfig.SerialWordSize1 = SerWordSize8;
+ portconfig.CompandingMode1 = cmpNone;
+ portconfig.TxFrameSyncPolarity1 = FrameSyncActHigh;
+ portconfig.RxFrameSyncPolarity1 = FrameSyncActHigh;
+ portconfig.TxClockPolarity1 = SerClockActHigh;
+ portconfig.RxClockPolarity1 = SerClockActHigh;
+ portconfig.TxDataDelay1 = DataDelay0;
+ portconfig.RxDataDelay1 = DataDelay0;
+ portconfig.DxDelay1 = Disabled;
+ portconfig.ThirdSlotMask1 = 0x0000;
+ portconfig.FouthSlotMask1 = 0x0000;
+ portconfig.FifthSlotMask1 = 0x0000;
+ portconfig.SixthSlotMask1 = 0x0000;
+ portconfig.SevenSlotMask1 = 0x0000;
+ portconfig.EightSlotMask1 = 0x0000;
+
+ /* Second Serial Port config */
+ portconfig.SlotsSelect2 = SlotCfg8Groups;
+ portconfig.FirstBlockNum2 = 0;
+ portconfig.FirstSlotMask2 = 0x5554;
+ portconfig.SecBlockNum2 = 1;
+ portconfig.SecSlotMask2 = 0x5555;
+ portconfig.ThirdSlotMask2 = 0x5555;
+ portconfig.FouthSlotMask2 = 0x5555;
+ portconfig.SerialWordSize2 = SerWordSize8;
+ portconfig.CompandingMode2 = cmpNone;
+ portconfig.TxFrameSyncPolarity2 = FrameSyncActHigh;
+ portconfig.RxFrameSyncPolarity2 = FrameSyncActHigh;
+ portconfig.TxClockPolarity2 = SerClockActHigh;
+ portconfig.RxClockPolarity2 = SerClockActHigh;
+ portconfig.TxDataDelay2 = DataDelay0;
+ portconfig.RxDataDelay2 = DataDelay0;
+ portconfig.DxDelay2 = Disabled;
+ portconfig.FifthSlotMask2 = 0x0001;
+ portconfig.SixthSlotMask2 = 0x0000;
+ portconfig.SevenSlotMask2 = 0x0000;
+ portconfig.EightSlotMask2 = 0x0000;
+
+ /* Third Serial Port Config */
+ portconfig.SlotsSelect3 = SlotCfg8Groups;
+ portconfig.FirstBlockNum3 = 0;
+ portconfig.FirstSlotMask3 = 0x5554;
+ portconfig.SecBlockNum3 = 1;
+ portconfig.SecSlotMask3 = 0x5555;
+ portconfig.SerialWordSize3 = SerWordSize8;
+ portconfig.CompandingMode3 = cmpNone;
+ portconfig.TxFrameSyncPolarity3 = FrameSyncActHigh;
+ portconfig.RxFrameSyncPolarity3 = FrameSyncActHigh;
+ portconfig.TxClockPolarity3 = SerClockActHigh;
+ portconfig.RxClockPolarity3 = SerClockActLow;
+ portconfig.TxDataDelay3 = DataDelay0;
+ portconfig.RxDataDelay3 = DataDelay0;
+ portconfig.DxDelay3 = Disabled;
+ portconfig.ThirdSlotMask3 = 0x5555;
+ portconfig.FouthSlotMask3 = 0x5555;
+ portconfig.FifthSlotMask3 = 0x0001;
+ portconfig.SixthSlotMask3 = 0x0000;
+ portconfig.SevenSlotMask3 = 0x0000;
+ portconfig.EightSlotMask3 = 0x0000;
+
+ if ((configportstatus = gpakConfigurePorts(vpm->dspid, &portconfig, &pstatus))) {
+ printk(KERN_NOTICE "Configuration of ports failed (%d)!\n", configportstatus);
+ return -1;
+ } else {
+ if (vpm->options.debug & DEBUG_ECHOCAN)
+ printk(KERN_DEBUG "Configured McBSP ports successfully\n");
+ }
+
+ if ((res = gpakPingDsp(vpm->dspid, &vpm->version))) {
+ printk(KERN_NOTICE "Error pinging DSP (%d)\n", res);
+ return -1;
+ }
+
+ for (channel = 0; channel < MAX_CHANNELS_PER_SPAN; ++channel) {
+ vpm->curecstate[channel].tap_length = 0;
+ vpm->curecstate[channel].nlp_type = vpm->options.vpmnlptype;
+ vpm->curecstate[channel].nlp_threshold = vpm->options.vpmnlpthresh;
+ vpm->curecstate[channel].nlp_max_suppress = vpm->options.vpmnlpmaxsupp;
+ memcpy(&vpm->desiredecstate[channel], &vpm->curecstate[channel], sizeof(vpm->curecstate[channel]));
+
+ vpm->setchanconfig_from_state(vpm, channel, &chanconfig);
+ if ((res = gpakConfigureChannel(vpm->dspid, channel, tdmToTdm, &chanconfig, &cstatus))) {
+ printk(KERN_NOTICE "Unable to configure channel #%d (%d)", channel, res);
+ if (res == 1) {
+ printk(", reason %d", cstatus);
+ }
+ printk("\n");
+ return -1;
+ }
+
+ if ((res = gpakAlgControl(vpm->dspid, channel, BypassEcanA, &algstatus))) {
+ printk(KERN_NOTICE "Unable to disable echo can on channel %d (reason %d:%d)\n", channel + 1, res, algstatus);
+ return -1;
+ }
+ }
+
+ if ((res = gpakPingDsp(vpm->dspid, &vpm->version))) {
+ printk(KERN_NOTICE "Error pinging DSP (%d)\n", res);
+ return -1;
+ }
+
+ set_bit(VPM150M_ACTIVE, &vpm->control);
+
+ return 0;
+}
+
+static void cmd_dequeue_vpmadt032(struct t1 *wc, unsigned char *writechunk, int whichframe)
+{
+ struct vpmadt032_cmd *cmd;
+ struct vpmadt032 *vpm = wc->vpmadt032;
+ int x;
+ unsigned char leds = ~((atomic_read(&wc->txints) / 1000) % 8) & 0x7;
+
+ /* Skip audio */
+ writechunk += 66;
+
+ if (test_bit(VPM150M_SPIRESET, &vpm->control) || test_bit(VPM150M_HPIRESET, &vpm->control)) {
+ debug_printk(1, "HW Resetting VPMADT032 ...\n");
+ for (x = 0; x < 4; x++) {
+ if (!x) {
+ if (test_and_clear_bit(VPM150M_SPIRESET, &vpm->control))
+ writechunk[CMD_BYTE(x, 0, 1)] = 0x08;
+ else if (test_and_clear_bit(VPM150M_HPIRESET, &vpm->control))
+ writechunk[CMD_BYTE(x, 0, 1)] = 0x0b;
+ } else
+ writechunk[CMD_BYTE(x, 0, 1)] = 0x00 | leds;
+ writechunk[CMD_BYTE(x, 1, 1)] = 0;
+ writechunk[CMD_BYTE(x, 2, 1)] = 0x00;
+ }
+ return;
+ }
+
+ if ((cmd = vpmadt032_get_ready_cmd(vpm))) {
+ cmd->txident = wc->txident;
+#if 0
+ printk(KERN_DEBUG "Found command txident = %d, desc = 0x%x, addr = 0x%x, data = 0x%x\n", cmd->txident, cmd->desc, cmd->address, cmd->data);
+#endif
+ if (cmd->desc & __VPM150M_RWPAGE) {
+ /* Set CTRL access to page*/
+ writechunk[CMD_BYTE(0, 0, 1)] = (0x8 << 4);
+ writechunk[CMD_BYTE(0, 1, 1)] = 0;
+ writechunk[CMD_BYTE(0, 2, 1)] = 0x20;
+
+ /* Do a page write */
+ if (cmd->desc & __VPM150M_WR) {
+ writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | 0x4) << 4);
+ } else {
+ writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | 0x4 | 0x1) << 4);
+ }
+ writechunk[CMD_BYTE(1, 1, 1)] = 0;
+ if (cmd->desc & __VPM150M_WR) {
+ writechunk[CMD_BYTE(1, 2, 1)] = cmd->data & 0xf;
+ } else {
+ writechunk[CMD_BYTE(1, 2, 1)] = 0;
+ }
+
+ if (cmd->desc & __VPM150M_WR) {
+ /* Fill in buffer to size */
+ writechunk[CMD_BYTE(2, 0, 1)] = 0;
+ writechunk[CMD_BYTE(2, 1, 1)] = 0;
+ writechunk[CMD_BYTE(2, 2, 1)] = 0;
+ } else {
+ /* Do reads twice b/c of vpmadt032 bug */
+ writechunk[CMD_BYTE(2, 0, 1)] = ((0x8 | 0x4 | 0x1) << 4);
+ writechunk[CMD_BYTE(2, 1, 1)] = 0;
+ writechunk[CMD_BYTE(2, 2, 1)] = 0;
+ }
+
+ /* Clear XADD */
+ writechunk[CMD_BYTE(3, 0, 1)] = (0x8 << 4);
+ writechunk[CMD_BYTE(3, 1, 1)] = 0;
+ writechunk[CMD_BYTE(3, 2, 1)] = 0;
+
+ /* Fill in buffer to size */
+ writechunk[CMD_BYTE(4, 0, 1)] = 0;
+ writechunk[CMD_BYTE(4, 1, 1)] = 0;
+ writechunk[CMD_BYTE(4, 2, 1)] = 0;
+
+ } else {
+ /* Set address */
+ writechunk[CMD_BYTE(0, 0, 1)] = ((0x8 | 0x4) << 4);
+ writechunk[CMD_BYTE(0, 1, 1)] = (cmd->address >> 8) & 0xff;
+ writechunk[CMD_BYTE(0, 2, 1)] = cmd->address & 0xff;
+
+ /* Send/Get our data */
+ if (cmd->desc & __VPM150M_WR) {
+ writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | (0x3 << 1)) << 4);
+ } else {
+ writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | (0x3 << 1) | 0x1) << 4);
+ }
+ writechunk[CMD_BYTE(1, 1, 1)] = (cmd->data >> 8) & 0xff;
+ writechunk[CMD_BYTE(1, 2, 1)] = cmd->data & 0xff;
+
+ if (cmd->desc & __VPM150M_WR) {
+ /* Fill in */
+ writechunk[CMD_BYTE(2, 0, 1)] = 0;
+ writechunk[CMD_BYTE(2, 1, 1)] = 0;
+ writechunk[CMD_BYTE(2, 2, 1)] = 0;
+ } else {
+ /* Do this again for reads b/c of the bug in vpmadt032 */
+ writechunk[CMD_BYTE(2, 0, 1)] = ((0x8 | (0x3 << 1) | 0x1) << 4);
+ writechunk[CMD_BYTE(2, 1, 1)] = (cmd->data >> 8) & 0xff;
+ writechunk[CMD_BYTE(2, 2, 1)] = cmd->data & 0xff;
+ }
+
+ /* Fill in the rest */
+ writechunk[CMD_BYTE(3, 0, 1)] = 0;
+ writechunk[CMD_BYTE(3, 1, 1)] = 0;
+ writechunk[CMD_BYTE(3, 2, 1)] = 0;
+
+ /* Fill in the rest */
+ writechunk[CMD_BYTE(4, 0, 1)] = 0;
+ writechunk[CMD_BYTE(4, 1, 1)] = 0;
+ writechunk[CMD_BYTE(4, 2, 1)] = 0;
+ }
+ } else if (test_and_clear_bit(VPM150M_SWRESET, &vpm->control)) {
+ debug_printk(1, "Booting VPMADT032\n");
+ for (x = 0; x < 7; x++) {
+ if (0 == x) {
+ writechunk[CMD_BYTE(x, 0, 1)] = (0x8 << 4);
+ } else {
+ writechunk[CMD_BYTE(x, 0, 1)] = 0x00;
+ }
+ writechunk[CMD_BYTE(x, 1, 1)] = 0;
+ if (0 == x) {
+ writechunk[CMD_BYTE(x, 2, 1)] = 0x01;
+ } else {
+ writechunk[CMD_BYTE(x, 2, 1)] = 0x00;
+ }
+ }
+ } else {
+ for (x = 0; x < 7; x++) {
+ writechunk[CMD_BYTE(x, 0, 1)] = 0x00;
+ writechunk[CMD_BYTE(x, 1, 1)] = 0x00;
+ writechunk[CMD_BYTE(x, 2, 1)] = 0x00;
+ }
+ }
+
+ /* Add our leds in */
+ for (x = 0; x < 7; x++)
+ writechunk[CMD_BYTE(x, 0, 1)] |= leds;
+
+#if 0
+ int y;
+ for (x = 0; x < 7; x++) {
+ for (y = 0; y < 3; y++) {
+ if (writechunk[CMD_BYTE(x, y, 1)] & 0x2) {
+ module_printk("the test bit is high for byte %d\n", y);
+ }
+ }
+ }
+#endif
+
+ /* Now let's figure out if we need to check for DTMF */
+ /* polling */
+ if (test_bit(VPM150M_ACTIVE, &vpm->control) && !whichframe && !(atomic_read(&wc->txints) % 100))
+ schedule_work(&vpm->work);
+
+#if 0
+ /* This may be needed sometime in the future to troubleshoot ADT related issues. */
+ if (test_bit(VPM150M_ACTIVE, &vpm->control) && !whichframe && !(atomic_read(&wc->txints) % 10000))
+ queue_work(vpm->wq, &vpm->work_debug);
+#endif
+}
+
static inline int t1_setreg_full(struct t1 *wc, int addr, int val, int vpm_num)
{
struct command *cmd;
@@ -817,9 +1135,6 @@ static int t1xxp_close(struct dahdi_chan *chan)
static int t1xxp_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long data)
{
- unsigned int x;
- struct t1 *wc = chan->pvt;
-
switch (cmd) {
case WCT4_GET_REGS:
/* Since all register access was moved into the voicebus
@@ -829,78 +1144,22 @@ static int t1xxp_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long
WARN_ON(1);
return -ENOSYS;
break;
-#ifdef VPM_SUPPORT
- case DAHDI_TONEDETECT:
- if (get_user(x, (__user int *) data))
- return -EFAULT;
- if (!wc->vpm150m)
- return -ENOSYS;
- if (wc->vpm150m && (x && !vpmdtmfsupport))
- return -ENOSYS;
- if (x & DAHDI_TONEDETECT_ON) {
- set_bit(chan->chanpos - 1, &wc->dtmfmask);
- module_printk("turning on tone detection\n");
- } else {
- clear_bit(chan->chanpos - 1, &wc->dtmfmask);
- module_printk("turning off tone detection\n");
- }
- if (x & DAHDI_TONEDETECT_MUTE) {
- if(wc->vpm150m)
- set_bit(chan->chanpos - 1, &wc->vpm150m->desireddtmfmutestate);
- } else {
- if(wc->vpm150m)
- clear_bit(chan->chanpos - 1, &wc->vpm150m->desireddtmfmutestate);
- }
- return 0;
-#endif
default:
return -ENOTTY;
}
return 0;
}
-#ifdef VPM_SUPPORT
-
-#include "adt_lec.c"
-
-static int t1xxp_echocan_with_params(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p)
+static int t1xxp_echocan_with_params(struct dahdi_chan *chan,
+ struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p)
{
- struct adt_lec_params params;
struct t1 *wc = chan->pvt;
- struct vpm150m *vpm150m = wc->vpm150m;
- unsigned long flags;
- struct vpm150m_workentry *work;
- unsigned int ret;
-
- if (!wc->vpm150m)
+ if (!wc->vpmadt032) {
return -ENODEV;
-
- adt_lec_init_defaults(&params, 32);
-
- if ((ret = adt_lec_parse_params(&params, ecp, p)))
- return ret;
-
- /* we can't really control the tap length, but the value is used
- to control whether the ec is on or off, so translate it */
- params.tap_length = ecp->tap_length ? 1 : 0;
-
- if (!(work = kmalloc(sizeof(*work), GFP_KERNEL)))
- return -ENOMEM;
-
- work->params = params;
- work->wc = wc;
- work->chan = chan;
- spin_lock_irqsave(&vpm150m->lock, flags);
- list_add_tail(&work->list, &vpm150m->worklist);
- spin_unlock_irqrestore(&vpm150m->lock, flags);
-
- /* we must do this later since we cannot sleep in the echocan function */
- if (test_bit(VPM150M_ACTIVE, &vpm150m->control))
- queue_work(vpm150m->wq, &vpm150m->work_echocan);
-
- return 0; /* how do I return the status since it is done later by the workqueue? */
+ }
+ return vpmadt032_echocan_with_params(wc->vpmadt032, chan->chanpos - 1,
+ ecp, p);
}
-#endif
static int t1_software_init(struct t1 *wc)
{
@@ -930,7 +1189,7 @@ static int t1_software_init(struct t1 *wc)
strncpy(wc->span.devicetype, wc->variety, sizeof(wc->span.devicetype) - 1);
#if defined(VPM_SUPPORT)
- if (wc->vpm150m)
+ if (wc->vpmadt032)
strncat(wc->span.devicetype, " with VPMADT032", sizeof(wc->span.devicetype) - 1);
#endif
@@ -1001,9 +1260,64 @@ static inline unsigned char t1_vpm_out(struct t1 *wc, int unit, const unsigned i
#endif
+static void setchanconfig_from_state(struct vpmadt032 *vpm, int channel, GpakChannelConfig_t *chanconfig)
+{
+ const struct vpmadt032_options *options;
+
+ BUG_ON(!vpm);
+
+ options = &vpm->options;
+
+ chanconfig->PcmInPortA = 3;
+ chanconfig->PcmInSlotA = (channel + 1) * 2;
+ chanconfig->PcmOutPortA = 2;
+ chanconfig->PcmOutSlotA = (channel + 1) * 2;
+ chanconfig->PcmInPortB = 2;
+ chanconfig->PcmInSlotB = (channel + 1) * 2;
+ chanconfig->PcmOutPortB = 3;
+ chanconfig->PcmOutSlotB = (channel + 1) * 2;
+ chanconfig->ToneTypesA = Null_tone;
+ chanconfig->MuteToneA = Disabled;
+ chanconfig->FaxCngDetA = Disabled;
+ chanconfig->ToneTypesB = Null_tone;
+ chanconfig->EcanEnableA = Enabled;
+ chanconfig->EcanEnableB = Disabled;
+ chanconfig->MuteToneB = Disabled;
+ chanconfig->FaxCngDetB = Disabled;
+
+ chanconfig->SoftwareCompand = cmpPCMU;
+
+ chanconfig->FrameRate = rate10ms;
+ chanconfig->EcanParametersA.EcanTapLength = 1024;
+ chanconfig->EcanParametersA.EcanNlpType = vpm->curecstate[channel].nlp_type;
+ chanconfig->EcanParametersA.EcanAdaptEnable = 1;
+ chanconfig->EcanParametersA.EcanG165DetEnable = 1;
+ chanconfig->EcanParametersA.EcanDblTalkThresh = 6;
+ chanconfig->EcanParametersA.EcanMaxDoubleTalkThres = 40;
+ chanconfig->EcanParametersA.EcanNlpThreshold = vpm->curecstate[channel].nlp_threshold;
+ chanconfig->EcanParametersA.EcanNlpConv = 0;
+ chanconfig->EcanParametersA.EcanNlpUnConv = 12;
+ chanconfig->EcanParametersA.EcanNlpMaxSuppress = vpm->curecstate[channel].nlp_max_suppress;
+ chanconfig->EcanParametersA.EcanCngThreshold = 43;
+ chanconfig->EcanParametersA.EcanAdaptLimit = 50;
+ chanconfig->EcanParametersA.EcanCrossCorrLimit = 15;
+ chanconfig->EcanParametersA.EcanNumFirSegments = 3;
+ chanconfig->EcanParametersA.EcanFirSegmentLen = 48;
+ chanconfig->EcanParametersA.EcanReconvergenceCheckEnable = 1;
+ chanconfig->EcanParametersA.EcanTandemOperationEnable = 1;
+ chanconfig->EcanParametersA.EcanMixedFourWireMode = 1;
+
+
+ memcpy(&chanconfig->EcanParametersB,
+ &chanconfig->EcanParametersA,
+ sizeof(chanconfig->EcanParametersB));
+}
+
static int t1_hardware_post_init(struct t1 *wc)
{
+ struct vpmadt032_options options;
unsigned int reg;
+ int res;
int x;
/* T1 or E1 */
@@ -1036,17 +1350,41 @@ static int t1_hardware_post_init(struct t1 *wc)
t1_setleds(wc, wc->ledstate);
#ifdef VPM_SUPPORT
- t1_vpm150m_init(wc);
- if (wc->vpm150m) {
- module_printk("VPM present and operational (Firmware version %x)\n", wc->vpm150m->version);
- set_bit(4, &wc->ctlreg); /* turn on vpm (RX audio from vpm module) */
+ if (vpmsupport) {
+ memset(&options, 0, sizeof(options));
+ options.debug = debug;
+ options.vpmnlptype = vpmnlptype;
+ options.vpmnlpthresh = vpmnlpthresh;
+ options.vpmnlpmaxsupp = vpmnlpmaxsupp;
+
+ wc->vpmadt032 = vpmadt032_alloc(&options);
+ if (!wc->vpmadt032)
+ return -ENOMEM;
+
+ wc->vpmadt032->context = wc;
+ wc->vpmadt032->setchanconfig_from_state = setchanconfig_from_state;
+ wc->vpmadt032->span = &wc->span;
+
+ res = vpmadt032_init(wc->vpmadt032, wc->vb);
+ if (res) {
+ vpmadt032_free(wc->vpmadt032);
+ wc->vpmadt032=NULL;
+ return -EIO;
+ }
+
+ config_vpmadt032(wc->vpmadt032);
+
+ module_printk("VPM present and operational (Firmware version %x)\n", wc->vpmadt032->version);
+ wc->ctlreg |= 0x10; /* turn on vpm (RX audio from vpm module) */
if (vpmtsisupport) {
debug_printk(1, "enabling VPM TSI pin\n");
- set_bit(0, &wc->ctlreg); /* turn on vpm timeslot interchange pin */
+ wc->ctlreg |= 0x01; /* turn on vpm timeslot interchange pin */
}
+ } else {
+ module_printk("VPM Support Disabled\n");
+ wc->vpmadt032 = NULL;
}
#endif
-
return 0;
}
@@ -1234,9 +1572,9 @@ static inline void t1_transmitprep(struct t1 *wc, unsigned char* writechunk)
cmd_dequeue(wc, writechunk, x, y);
}
#ifdef VPM_SUPPORT
- if(likely(wc->vpm150m)) {
+ if(likely(wc->vpmadt032)) {
spin_lock(&wc->reglock);
- vpm150m_cmd_dequeue(wc, writechunk, x);
+ cmd_dequeue_vpmadt032(wc, writechunk, x);
spin_unlock(&wc->reglock);
}
#endif
@@ -1273,9 +1611,9 @@ static inline void t1_receiveprep(struct t1 *wc, unsigned char* readchunk)
}
cmd_decipher(wc, readchunk);
#ifdef VPM_SUPPORT
- if (wc->vpm150m) {
+ if (wc->vpmadt032) {
spin_lock(&wc->reglock);
- vpm150m_cmd_decipher(wc, readchunk);
+ cmd_decipher_vpmadt032(wc, readchunk);
spin_unlock(&wc->reglock);
}
#endif
@@ -1445,17 +1783,16 @@ static void __devexit te12xp_remove_one(struct pci_dev *pdev)
struct t1 *wc = pci_get_drvdata(pdev);
#ifdef VPM_SUPPORT
unsigned long flags;
- struct vpm150m *vpm150m = wc->vpm150m;
+ struct vpmadt032 *vpm = wc->vpmadt032;
#endif
if (!wc)
return;
#ifdef VPM_SUPPORT
- if(vpm150m) {
- clear_bit(VPM150M_DTMFDETECT, &vpm150m->control);
- clear_bit(VPM150M_ACTIVE, &vpm150m->control);
- flush_workqueue(vpm150m->wq);
- destroy_workqueue(vpm150m->wq);
+ if(vpm) {
+ wc->vpmadt032 = NULL;
+ clear_bit(VPM150M_DTMFDETECT, &vpm->control);
+ clear_bit(VPM150M_ACTIVE, &vpm->control);
}
#endif
clear_bit(INITIALIZED, &wc->bit_flags);
@@ -1468,12 +1805,10 @@ static void __devexit te12xp_remove_one(struct pci_dev *pdev)
wc->vb = NULL;
#ifdef VPM_SUPPORT
- if(vpm150m) {
+ if(vpm) {
spin_lock_irqsave(&wc->reglock, flags);
- wc->vpm150m = NULL;
- vpm150m->wc = NULL;
spin_unlock_irqrestore(&wc->reglock, flags);
- kfree(wc->vpm150m);
+ vpmadt032_free(vpm);
}
#endif
t1_release(wc);
@@ -1537,7 +1872,6 @@ module_param(alarmdebounce, int, S_IRUGO | S_IWUSR);
module_param(latency, int, S_IRUGO | S_IWUSR);
#ifdef VPM_SUPPORT
module_param(vpmsupport, int, S_IRUGO | S_IWUSR);
-module_param(vpmdtmfsupport, int, S_IRUGO | S_IWUSR);
module_param(vpmtsisupport, int, S_IRUGO | S_IWUSR);
#endif
diff --git a/drivers/dahdi/wcte12xp/gpakenum.h b/drivers/dahdi/wcte12xp/gpakenum.h
deleted file mode 100644
index c2a5175..0000000
--- a/drivers/dahdi/wcte12xp/gpakenum.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (c) 2005, Adaptive Digital Technologies, Inc.
- *
- * File Name: gpakenum.h
- *
- * Description:
- * This file contains common enumerations related to G.PAK application
- * software.
- *
- * Version: 1.0
- *
- * Revision History:
- * 06/15/05 - Initial release.
- *
- * This program has been released under the terms of the GPL version 2 by
- * permission of Adaptive Digital Technologies, Inc.
- *
- */
-
-/*
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2 as published by the
- * Free Software Foundation. See the LICENSE file included with
- * this program for more details.
- */
-
-#ifndef _GPAKENUM_H /* prevent multiple inclusion */
-#define _GPAKENUM_H
-
-/* G.PAK Serial Port Word Size */
-typedef enum
-{
- SerWordSize8 = 0, // 8-bit seial word
- SerWordSize16 = 1 // 16-bit serial word
-} GpakSerWordSize_t;
-
-/* G.PAK Serial Port FrameSync Polarity */
-typedef enum
-{
- FrameSyncActLow = 0, // active low frame sync signal
- FrameSyncActHigh = 1 // active high frame sync signal
-} GpakSerFrameSyncPol_t;
-
-/* G.PAK Serial Port Clock Polarity */
-typedef enum
-{
- SerClockActLow = 0, // active low serial clock
- SerClockActHigh = 1 // active high serial clock
-} GpakSerClockPol_t;
-
-/* G.PAK Serial Port Data Delay */
-typedef enum
-{
- DataDelay0 = 0, // no data delay
- DataDelay1 = 1, // 1-bit data delay
- DataDelay2 = 2 // 2-bit data delay
-} GpakSerDataDelay_t;
-
-/* G.PAK Serial Port Ids. */
-typedef enum
-{
- SerialPortNull = 0, // null serial port
- SerialPort1 = 1, // first PCM serial stream port (McBSP0)
- SerialPort2 = 2, // second PCM serial stream port (McBSP1)
- SerialPort3 = 3 // third PCM serial stream port (McBSP2)
-} GpakSerialPort_t;
-
-/* G.PAK serial port Slot Configuration selection codes. */
-typedef enum
-{
- SlotCfgNone = 0, // no time slots used
- SlotCfg2Groups = 2, // 2 groups of 16 time slots used, 32 Channels system
- SlotCfg8Groups = 8 // 8-partition mode for 128-channel system
-} GpakSlotCfg_t;
-
-/* G.PAK serial port Companding Mode codes. */
-typedef enum
-{
- cmpPCMU=0, // u-Law
- cmpPCMA=1, // A-Law
- cmpNone=2 // none
-} GpakCompandModes;
-
-/* G.PAK Active/Inactive selection codes. */
-typedef enum
-{
- Disabled=0, // Inactive
- Enabled=1 // Active
-} GpakActivation;
-
-/* G.PAK Channel Type codes. */
-typedef enum
-{
- inactive=0, // channel inactive
- tdmToTdm=1 // tdmToTdm
-} GpakChanType;
-
-/* G.PAK Algorithm control commands */
-typedef enum
-{
- EnableEcanA = 0, // Enable A side echo canceller
- BypassEcanA = 1, // Bypass A side echo canceller
- ResetEcanA = 2, // Reset A side echo canceller
- EnableEcanB = 3, // Enable B side echo canceller
- BypassEcanB = 4, // Bypass B side echo canceller
- ResetEcanB = 5, // Reset B side echo canceller
-
- EnableMuLawSwCompanding = 6,// Enable Mu-law Software companding
- EnableALawSwCompanding = 7, // Enable Mu-law Software companding
- BypassSwCompanding = 8, // Bypass Software companding
- EnableDTMFMuteA = 9, // Mute A side Dtmf digit after tone detected
- DisableDTMFMuteA = 10, // Do not mute A side Dtmf digit once tone detected
- EnableDTMFMuteB = 11, // Mute B side Dtmf digit after tone detected
- DisableDTMFMuteB = 12, // Do not mute B side Dtmf digit once tone detected
- EnableFaxCngDetectA = 13, // Enable A side Fax CNG detector, channel must be configed already
- DisableFaxCngDetectA = 14, // Disable A side Fax CNG detector, channel must be configed already
- EnableFaxCngDetectB = 15, // Enable B side Fax CNG detector, channel must be configed already
- DisableFaxCngDetectB = 16 // Disable B side Fax CNG detector, channel must be configed already
-} GpakAlgCtrl_t;
-
-/* G.PAK Tone types. */
-typedef enum
-{
- Null_tone = 0, // no tone detection
- DTMF_tone = 1 // DTMF tone
-} GpakToneTypes;
-
-/* G.PAK direction. */
-typedef enum
-{
- TDMAToB = 0, // A to B
- TDMBToA = 1 // B to A
-} GpakTdmDirection;
-
-
-typedef enum
-{
- rate1ms=0,
- rate2ms=1,
- rate10ms=2
-} GpakRate_t;
-
-/* G.PAK Asynchronous Event Codes */
-typedef enum
-{
- EventToneDetect = 0, // Tone detection event
- EventDSPDebug = 7 // DSP debug data event
-} GpakAsyncEventCode_t;
-
-/* G.PAK MF Tone Code Indices */
-typedef enum
-{
- DtmfDigit1 = 0, // DTMF Digit 1
- DtmfDigit2 = 1, // DTMF Digit 2
- DtmfDigit3 = 2, // DTMF Digit 3
- DtmfDigitA = 3, // DTMF Digit A
- DtmfDigit4 = 4, // DTMF Digit 4
- DtmfDigit5 = 5, // DTMF Digit 5
- DtmfDigit6 = 6, // DTMF Digit 6
- DtmfDigitB = 7, // DTMF Digit B
- DtmfDigit7 = 8, // DTMF Digit 7
- DtmfDigit8 = 9, // DTMF Digit 8
- DtmfDigit9 = 10, // DTMF Digit 9
- DtmfDigitC = 11, // DTMF Digit C
- DtmfDigitSt = 12, // DTMF Digit *
- DtmfDigit0 = 13, // DTMF Digit 0
- DtmfDigitPnd = 14, // DTMF Digit #
- DtmfDigitD = 15, // DTMF Digit D
-
- FaxCngDigit = 90, // Fax Calling Tone (1100 Hz)
-
- EndofMFDigit = 100, // End of MF digit
- EndofCngDigit = 101 // End of Cng Digit
-} GpakToneCodes_t;
-
-/* GPIO control code*/
-typedef enum
-{
- GPIO_READ = 0,
- GPIO_WRITE = 1,
- GPIO_DIR = 2
-} GpakGPIOCotrol_t;
-
-#endif // end multiple inclusion
diff --git a/drivers/dahdi/wcte12xp/voicebus.c b/drivers/dahdi/wcte12xp/voicebus.c
deleted file mode 120000
index 6653619..0000000
--- a/drivers/dahdi/wcte12xp/voicebus.c
+++ /dev/null
@@ -1 +0,0 @@
-../voicebus.c \ No newline at end of file
diff --git a/drivers/dahdi/wcte12xp/vpmadt032.c b/drivers/dahdi/wcte12xp/vpmadt032.c
deleted file mode 100644
index 2424f67..0000000
--- a/drivers/dahdi/wcte12xp/vpmadt032.c
+++ /dev/null
@@ -1,1317 +0,0 @@
-/*
- * Digium, Inc. Wildcard TE12xP T1/E1 card Driver
- *
- * Written by Michael Spiceland <mspiceland@digium.com>
- *
- * Adapted from the wctdm24xxp and wcte11xp drivers originally
- * written by Mark Spencer <markster@digium.com>
- * Matthew Fredrickson <creslin@digium.com>
- * William Meadows <wmeadows@digium.com>
- *
- * Copyright (C) 2007, Digium, Inc.
- *
- * All rights reserved.
- *
- */
-
-/*
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2 as published by the
- * Free Software Foundation. See the LICENSE file included with
- * this program for more details.
- */
-
-#include <linux/delay.h>
-#include <linux/version.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
-#include <linux/semaphore.h>
-#else
-#include <asm/semaphore.h>
-#endif
-#include <linux/pci.h>
-#include <linux/firmware.h>
-#include <linux/list.h>
-
-#include <dahdi/kernel.h>
-
-#include "voicebus.h"
-
-#include "wcte12xp.h"
-#include "vpmadt032.h"
-#include "GpakApi.h"
-
-#ifdef VPM_SUPPORT
-
-inline void vpm150m_cmd_dequeue(struct t1 *wc, volatile unsigned char *writechunk, int whichframe)
-{
- struct vpm150m_cmd *curcmd = NULL;
- struct vpm150m *vpm150m = wc->vpm150m;
- int x;
- unsigned char leds = ~((atomic_read(&wc->txints) / 1000) % 8) & 0x7;
-
- /* Skip audio */
- writechunk += 66;
-
- if (test_bit(VPM150M_SPIRESET, &vpm150m->control) || test_bit(VPM150M_HPIRESET, &vpm150m->control)) {
- debug_printk(1, "HW Resetting VPMADT032 ...\n");
- for (x = 0; x < 4; x++) {
- if (!x) {
- if (test_and_clear_bit(VPM150M_SPIRESET, &vpm150m->control))
- writechunk[CMD_BYTE(x, 0, 1)] = 0x08;
- else if (test_and_clear_bit(VPM150M_HPIRESET, &vpm150m->control))
- writechunk[CMD_BYTE(x, 0, 1)] = 0x0b;
- } else
- writechunk[CMD_BYTE(x, 0, 1)] = 0x00 | leds;
- writechunk[CMD_BYTE(x, 1, 1)] = 0;
- writechunk[CMD_BYTE(x, 2, 1)] = 0x00;
- }
- return;
- }
-
- /* Search for something waiting to transmit */
- for (x = 0; x < VPM150M_MAX_COMMANDS; x++) {
- if ((vpm150m->cmdq[x].flags & (__VPM150M_RD | __VPM150M_WR)) &&
- !(vpm150m->cmdq[x].flags & (__VPM150M_FIN | __VPM150M_TX))) {
- curcmd = &vpm150m->cmdq[x];
- curcmd->ident = wc->txident;
- curcmd->flags |= __VPM150M_TX;
- break;
- }
- }
- if (curcmd) {
-#if 0
- printk(KERN_DEBUG "Found command txident = %d, desc = 0x%x, addr = 0x%x, data = 0x%x\n", curcmd->txident, curcmd->desc, curcmd->addr, curcmd->data);
-#endif
- if (curcmd->flags & __VPM150M_RWPAGE) {
- /* Set CTRL access to page*/
- writechunk[CMD_BYTE(0, 0, 1)] = (0x8 << 4);
- writechunk[CMD_BYTE(0, 1, 1)] = 0;
- writechunk[CMD_BYTE(0, 2, 1)] = 0x20;
-
- /* Do a page write */
- if (curcmd->flags & __VPM150M_WR)
- writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | 0x4) << 4);
- else
- writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | 0x4 | 0x1) << 4);
- writechunk[CMD_BYTE(1, 1, 1)] = 0;
- if (curcmd->flags & __VPM150M_WR)
- writechunk[CMD_BYTE(1, 2, 1)] = curcmd->data[0] & 0xf;
- else
- writechunk[CMD_BYTE(1, 2, 1)] = 0;
-
- if (curcmd->flags & __VPM150M_WR) {
- /* Fill in buffer to size */
- writechunk[CMD_BYTE(2, 0, 1)] = 0;
- writechunk[CMD_BYTE(2, 1, 1)] = 0;
- writechunk[CMD_BYTE(2, 2, 1)] = 0;
- } else {
- /* Do reads twice b/c of vpmadt032 bug */
- writechunk[CMD_BYTE(2, 0, 1)] = ((0x8 | 0x4 | 0x1) << 4);
- writechunk[CMD_BYTE(2, 1, 1)] = 0;
- writechunk[CMD_BYTE(2, 2, 1)] = 0;
- }
-
- /* Clear XADD */
- writechunk[CMD_BYTE(3, 0, 1)] = (0x8 << 4);
- writechunk[CMD_BYTE(3, 1, 1)] = 0;
- writechunk[CMD_BYTE(3, 2, 1)] = 0;
-
- /* Fill in buffer to size */
- writechunk[CMD_BYTE(4, 0, 1)] = 0;
- writechunk[CMD_BYTE(4, 1, 1)] = 0;
- writechunk[CMD_BYTE(4, 2, 1)] = 0;
-
- } else {
- /* Set address */
- writechunk[CMD_BYTE(0, 0, 1)] = ((0x8 | 0x4) << 4);
- writechunk[CMD_BYTE(0, 1, 1)] = (curcmd->address >> 8) & 0xff;
- writechunk[CMD_BYTE(0, 2, 1)] = curcmd->address & 0xff;
-
- /* Send/Get our data */
- if (curcmd->flags & __VPM150M_WR) {
- if (curcmd->datalen > 1)
- writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | (0x1 << 1)) << 4);
- else
- writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | (0x3 << 1)) << 4);
- } else
- if (curcmd->datalen > 1)
- writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | (0x1 << 1) | 0x1) << 4);
- else
- writechunk[CMD_BYTE(1, 0, 1)] = ((0x8 | (0x3 << 1) | 0x1) << 4);
- writechunk[CMD_BYTE(1, 1, 1)] = (curcmd->data[0] >> 8) & 0xff;
- writechunk[CMD_BYTE(1, 2, 1)] = curcmd->data[0] & 0xff;
-
- if (curcmd->flags & __VPM150M_WR) {
- /* Fill in */
- writechunk[CMD_BYTE(2, 0, 1)] = 0;
- writechunk[CMD_BYTE(2, 1, 1)] = 0;
- writechunk[CMD_BYTE(2, 2, 1)] = 0;
- } else {
- /* Do this again for reads b/c of the bug in vpmadt032 */
- writechunk[CMD_BYTE(2, 0, 1)] = ((0x8 | (0x3 << 1) | 0x1) << 4);
- writechunk[CMD_BYTE(2, 1, 1)] = (curcmd->data[0] >> 8) & 0xff;
- writechunk[CMD_BYTE(2, 2, 1)] = curcmd->data[0] & 0xff;
- }
-
- if (curcmd->datalen > 1) {
- if (curcmd->flags & __VPM150M_WR)
- writechunk[CMD_BYTE(3, 0, 1)] = ((0x8 | (0x1 << 1)) << 4);
- else
- writechunk[CMD_BYTE(3, 0, 1)] = ((0x8 | (0x1 << 1) | 0x1) << 4);
- writechunk[CMD_BYTE(3, 1, 1)] = (curcmd->data[1] >> 8) & 0xff;
- writechunk[CMD_BYTE(3, 2, 1)] = curcmd->data[1] & 0xff;
- } else {
- /* Fill in the rest */
- writechunk[CMD_BYTE(3, 0, 1)] = 0;
- writechunk[CMD_BYTE(3, 1, 1)] = 0;
- writechunk[CMD_BYTE(3, 2, 1)] = 0;
- }
-
- if (curcmd->datalen > 2) {
- if (curcmd->flags & __VPM150M_WR)
- writechunk[CMD_BYTE(4, 0, 1)] = ((0x8 | (0x1 << 1)) << 4);
- else
- writechunk[CMD_BYTE(4, 0, 1)] = ((0x8 | (0x1 << 1) | 0x1) << 4);
- writechunk[CMD_BYTE(4, 1, 1)] = (curcmd->data[2] >> 8) & 0xff;
- writechunk[CMD_BYTE(4, 2, 1)] = curcmd->data[2] & 0xff;
- } else {
- /* Fill in the rest */
- writechunk[CMD_BYTE(4, 0, 1)] = 0;
- writechunk[CMD_BYTE(4, 1, 1)] = 0;
- writechunk[CMD_BYTE(4, 2, 1)] = 0;
- }
- }
- } else if (test_and_clear_bit(VPM150M_SWRESET, &vpm150m->control)) {
- debug_printk(1, "Booting VPMADT032\n");
- for (x = 0; x < 7; x++) {
- if (x == 0)
- writechunk[CMD_BYTE(x, 0, 1)] = (0x8 << 4);
- else
- writechunk[CMD_BYTE(x, 0, 1)] = 0x00;
- writechunk[CMD_BYTE(x, 1, 1)] = 0;
- if (x == 0)
- writechunk[CMD_BYTE(x, 2, 1)] = 0x01;
- else
- writechunk[CMD_BYTE(x, 2, 1)] = 0x00;
- }
- } else {
- for (x = 0; x < 7; x++) {
- writechunk[CMD_BYTE(x, 0, 1)] = 0x00;
- writechunk[CMD_BYTE(x, 1, 1)] = 0x00;
- writechunk[CMD_BYTE(x, 2, 1)] = 0x00;
- }
- }
-
- /* Add our leds in */
- for (x = 0; x < 7; x++)
- writechunk[CMD_BYTE(x, 0, 1)] |= leds;
-
-#if 0
- int y;
- for (x = 0; x < 7; x++) {
- for (y = 0; y < 3; y++) {
- if (writechunk[CMD_BYTE(x, y, 1)] & 0x2) {
- module_printk("the test bit is high for byte %d\n", y);
- }
- }
- }
-#endif
-
- /* Now let's figure out if we need to check for DTMF */
- /* polling */
- if (test_bit(VPM150M_ACTIVE, &vpm150m->control) && !whichframe && !(atomic_read(&wc->txints) % 100))
- queue_work(vpm150m->wq, &vpm150m->work_dtmf);
-
-#if 0
- /* This may be needed sometime in the future to troubleshoot ADT related issues. */
- if (test_bit(VPM150M_ACTIVE, &vpm150m->control) && !whichframe && !(wc->intcount % 10000))
- queue_work(vpm150m->wq, &vpm150m->work_debug);
-#endif
-}
-
-inline void vpm150m_cmd_decipher(struct t1 *wc, volatile unsigned char *readchunk)
-{
- unsigned char ident;
- int x, i;
-
- /* Skip audio */
- readchunk += 66;
- /* Search for any pending results */
- for (x = 0; x < VPM150M_MAX_COMMANDS; x++) {
- if ((wc->vpm150m->cmdq[x].flags & (__VPM150M_RD | __VPM150M_WR)) &&
- (wc->vpm150m->cmdq[x].flags & (__VPM150M_TX)) &&
- !(wc->vpm150m->cmdq[x].flags & (__VPM150M_FIN))) {
- ident = wc->vpm150m->cmdq[x].ident;
- if (ident == wc->rxident) {
- /* Store result */
- for (i = 0; i < wc->vpm150m->cmdq[x].datalen; i++) {
- wc->vpm150m->cmdq[x].data[i] = (0xff & readchunk[CMD_BYTE((2 + i), 1, 1)]) << 8;
- wc->vpm150m->cmdq[x].data[i] |= readchunk[CMD_BYTE((2 + i), 2, 1)];
- }
- if (wc->vpm150m->cmdq[x].flags & __VPM150M_WR) {
- /* Go ahead and clear out writes since they need no acknowledgement */
- wc->vpm150m->cmdq[x].flags = 0;
- } else
- wc->vpm150m->cmdq[x].flags |= __VPM150M_FIN;
- break;
- }
- }
- }
-}
-
-static inline struct t1 * wc_find_iface(unsigned short dspid)
-{
- int i;
- struct t1 *ret = NULL;
- unsigned long flags;
-
- spin_lock_irqsave(&ifacelock, flags);
- for (i = 0; i < WC_MAX_IFACES; i++)
- if (ifaces[i] && ifaces[i]->vpm150m && (ifaces[i]->vpm150m->dspid == dspid))
- ret = ifaces[i];
- spin_unlock_irqrestore(&ifacelock, flags);
-
- return ret;
-}
-
-static struct vpm150m_cmd * vpm150m_empty_slot(struct t1 *wc)
-{
- unsigned int x;
-
- for (x = 0; x < VPM150M_MAX_COMMANDS; x++) {
- if (!wc->vpm150m->cmdq[x].flags) {
- return &wc->vpm150m->cmdq[x];
- }
- }
- return NULL;
-}
-
-/* Wait for any outstanding commands to be completed. */
-static inline int vpm150m_io_wait(struct t1 *wc)
-{
- int x;
- for (x=0; x < VPM150M_MAX_COMMANDS;) {
- if (wc->vpm150m->cmdq[x].flags) {
- if (msleep_interruptible(1)) {
- return -EINTR;
- }
- x=0;
- }
- else {
- ++x;
- }
- }
- return 0;
-}
-
-static int t1_vpm150m_getreg_full_async(struct t1 *wc, int pagechange, unsigned int len,
- unsigned short addr, unsigned short *outbuf, struct vpm150m_cmd **hit_p)
-{
- int ret=0;
- unsigned long flags;
- BUG_ON(!hit_p);
- spin_lock_irqsave(&wc->reglock, flags);
- (*hit_p) = vpm150m_empty_slot(wc);
- if (*hit_p) {
- (*hit_p)->flags = __VPM150M_RD;
- if (pagechange) {
- (*hit_p)->flags |= __VPM150M_RWPAGE;
- }
- (*hit_p)->datalen = len;
- (*hit_p)->address = addr;
- memset((*hit_p)->data, 0, len*sizeof(outbuf[0]));
- }
- else {
- ret = -EBUSY;
- }
- spin_unlock_irqrestore(&wc->reglock, flags);
- return ret;
-}
-
-static int t1_vpm150m_getreg_full_return(struct t1 *wc, int pagechange, unsigned int len,
- unsigned short addr, unsigned short *outbuf, struct vpm150m_cmd **hit_p)
-{
- int ret = 0;
- unsigned long flags;
- BUG_ON(!hit_p);
- spin_lock_irqsave(&wc->reglock, flags);
- do {
- if ((*hit_p)->flags & __VPM150M_FIN) {
- memcpy(outbuf, (*hit_p)->data, len*(sizeof(outbuf[0])));
- (*hit_p)->flags = 0;
- (*hit_p) = NULL;
- ret = 0;
- }
- else {
- spin_unlock_irqrestore(&wc->reglock, flags);
- if (msleep_interruptible(1)) {
- return -EINTR;
- }
- spin_lock_irqsave(&wc->reglock, flags);
- ret = -EBUSY;
- }
- } while (-EBUSY == ret);
- spin_unlock_irqrestore(&wc->reglock, flags);
- return ret;
-}
-
-static int t1_vpm150m_getreg_full(struct t1 *wc, int pagechange, unsigned int len, unsigned short addr, unsigned short *outbuf)
-{
- struct vpm150m_cmd *hit = NULL;
- int ret = 0;
- do {
- ret = t1_vpm150m_getreg_full_async(wc, pagechange, len, addr, outbuf, &hit);
- if (!hit) {
- if ( -EBUSY == ret ) {
- if (msleep_interruptible(1))
- return -EINTR;
- }
- BUG_ON( 0 != ret);
- }
- } while (!hit);
-
- ret = t1_vpm150m_getreg_full_return(wc, pagechange, len, addr, outbuf, &hit);
- return ret;
-}
-
-static int t1_vpm150m_setreg_full(struct t1 *wc, int pagechange, unsigned int len, unsigned int addr, unsigned short *data)
-{
- unsigned long flags;
- struct vpm150m_cmd *hit;
- int i;
- do {
- spin_lock_irqsave(&wc->reglock, flags);
- hit = vpm150m_empty_slot(wc);
- if (hit) {
- hit->flags = __VPM150M_WR;
- if (pagechange)
- hit->flags |= __VPM150M_RWPAGE;
- hit->address = addr;
- hit->datalen = len;
- for (i = 0; i < len; i++)
- hit->data[i] = data[i];
- }
- spin_unlock_irqrestore(&wc->reglock, flags);
- if (!hit) {
- if (msleep_interruptible(1))
- return -EINTR;
- }
- } while (!hit);
- return (hit) ? 0 : -1;
-}
-
-static int t1_vpm150m_setpage(struct t1 *wc, unsigned short addr)
-{
- addr &= 0xf;
- /* Let's optimize this a little bit */
- if (wc->vpm150m->curpage == addr)
- return 0;
- else {
- wc->vpm150m->curpage = addr;
- }
-
- return t1_vpm150m_setreg_full(wc, 1, 1, 0, &addr);
-}
-
-static unsigned char t1_vpm150m_getpage(struct t1 *wc)
-{
- unsigned short res;
- t1_vpm150m_getreg_full(wc, 1, 1, 0, &res);
- return res;
-}
-
-static int t1_vpm150m_setreg(struct t1 *wc, unsigned int len, unsigned int addr, unsigned short *data)
-{
- int res;
- t1_vpm150m_setpage(wc, addr >> 16);
- if ((addr >> 16) != ((addr + len) >> 16))
- module_printk("setreg: You found it!\n");
- res = t1_vpm150m_setreg_full(wc, 0, len, addr & 0xffff, data);
- return res;
-}
-
-static unsigned short t1_vpm150m_getreg(struct t1 *wc, unsigned int len, unsigned int addr, unsigned short *data)
-{
- unsigned short res;
- t1_vpm150m_setpage(wc, addr >> 16);
- if ((addr >> 16) != ((addr + len) >> 16))
- module_printk("getreg: You found it!\n");
- res = t1_vpm150m_getreg_full(wc, 0, len, addr & 0xffff, data);
- return res;
-}
-
-static char vpm150mtone_to_zaptone(GpakToneCodes_t tone)
-{
- switch (tone) {
- case DtmfDigit0:
- return '0';
- case DtmfDigit1:
- return '1';
- case DtmfDigit2:
- return '2';
- case DtmfDigit3:
- return '3';
- case DtmfDigit4:
- return '4';
- case DtmfDigit5:
- return '5';
- case DtmfDigit6:
- return '6';
- case DtmfDigit7:
- return '7';
- case DtmfDigit8:
- return '8';
- case DtmfDigit9:
- return '9';
- case DtmfDigitPnd:
- return '#';
- case DtmfDigitSt:
- return '*';
- case DtmfDigitA:
- return 'A';
- case DtmfDigitB:
- return 'B';
- case DtmfDigitC:
- return 'C';
- case DtmfDigitD:
- return 'D';
- case EndofCngDigit:
- return 'f';
- default:
- return 0;
- }
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-static void vpm150m_echocan_bh(void *data)
-{
- struct vpm150m *vpm150m = data;
-#else
-static void vpm150m_echocan_bh(struct work_struct *data)
-{
- struct vpm150m *vpm150m = container_of(data, struct vpm150m, work_echocan);
-#endif
- struct t1 *wc = vpm150m->wc;
- unsigned long flags;
- struct vpm150m_workentry *we;
- struct dahdi_chan *chan;
- int deflaw;
- int res;
- GPAK_AlgControlStat_t pstatus;
-
- while (!list_empty(&vpm150m->worklist)) {
- we = list_entry(vpm150m->worklist.next, struct vpm150m_workentry, list);
-
- spin_lock_irqsave(&vpm150m->lock, flags);
- list_del(&we->list);
- spin_unlock_irqrestore(&vpm150m->lock, flags);
-
- chan = we->chan;
-
- if (we->params.tap_length) {
- /* configure channel for the ulaw/alaw */
- unsigned int start = atomic_read(&wc->txints);
-
- if (memcmp(&we->params, &vpm150m->chan_params[chan->chanpos - 1], sizeof(we->params))) {
- /* set parameters */
- vpm150m->chan_params[chan->chanpos - 1] = we->params;
- }
-
- deflaw = chan->span->deflaw;
- debug_printk(1, "Enabling EC on channel %d (law %d)\n", chan->chanpos, deflaw);
- if (deflaw == 2) /* alaw */
- res = gpakAlgControl(vpm150m->dspid, chan->chanpos - 1, EnableALawSwCompanding, &pstatus);
- else if (deflaw == 1) /* alaw */
- res = gpakAlgControl(vpm150m->dspid, chan->chanpos - 1, EnableMuLawSwCompanding, &pstatus);
- else {
- module_printk("Undefined law for channel %d.\n", chan->chanpos);
- res = -1;
- }
-
- if (res) {
- module_printk("Unable to set SW Companding on channel %d (reason %d)\n", chan->chanpos, res);
- }
-
- res = gpakAlgControl(vpm150m->dspid, chan->chanpos - 1, EnableEcanA, &pstatus);
- debug_printk(2, "Echo can enable took %d ms\n", atomic_read(&wc->txints) - start);
- } else {
- unsigned int start = atomic_read(&wc->txints);
- debug_printk(1, "Disabling EC on channel %d\n", chan->chanpos);
- res = gpakAlgControl(vpm150m->dspid, chan->chanpos - 1, BypassSwCompanding, &pstatus);
- if (res)
- module_printk("Unable to disable sw companding on echo cancellation channel %d (reason %d)\n", chan->chanpos, res);
- res = gpakAlgControl(vpm150m->dspid, chan->chanpos - 1, BypassEcanA, &pstatus);
- if (res)
- module_printk("Unable to disable echo can on channel %d (reason %d)\n", chan->chanpos, res);
- debug_printk(2, "Echocan disable took %d ms\n", atomic_read(&wc->txints) - start);
- }
- if (res) {
- module_printk("Unable to toggle echo cancellation on channel %d (reason %d)\n", chan->chanpos, res);
- }
-
- kfree(we);
- }
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-static void vpm150m_debug_bh(void *data)
-{
- struct vpm150m *vpm150m = data;
-#else
-static void vpm150m_debug_bh(struct work_struct *data)
-{
- struct vpm150m *vpm150m = container_of(data, struct vpm150m, work_debug);
-#endif
- unsigned short int FrammingError1Count, FramingError2Count, FramingError3Count,
- DmaStopErrorCount, DmaSlipStatsBuffer;
-
- if (gpakReadFramingStats(vpm150m->dspid, &FrammingError1Count, &FramingError2Count, &FramingError3Count,
- &DmaStopErrorCount, &DmaSlipStatsBuffer))
- {
- module_printk("There was an error getting framing stats.\n");
- }
- if (FrammingError1Count||FramingError2Count||FramingError3Count||DmaStopErrorCount||DmaSlipStatsBuffer)
- {
- module_printk("FramingStats Error: %d %d %d %d %d\n",
- FrammingError1Count, FramingError2Count, FramingError3Count, DmaStopErrorCount, DmaSlipStatsBuffer);
- }
-}
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-static void vpm150m_dtmf_bh(void *data)
-{
- struct vpm150m *vpm150m = data;
-#else
-static void vpm150m_dtmf_bh(struct work_struct *data)
-{
- struct vpm150m *vpm150m = container_of(data, struct vpm150m, work_dtmf);
-#endif
- struct t1 *wc = vpm150m->wc;
- int i;
-
- for (i = 0; i < wc->span.channels; i++) {
- int enable = -1;
- if (test_bit(i, &vpm150m->desireddtmfmutestate)) {
- if (!test_bit(i, &vpm150m->curdtmfmutestate)) {
- enable = 1;
- }
- } else {
- if (test_bit(i, &vpm150m->curdtmfmutestate)) {
- enable = 0;
- }
- }
- if (enable > -1) {
- unsigned int start = atomic_read(&wc->txints);
- GPAK_AlgControlStat_t pstatus;
- int res;
-
- if (enable) {
- res = gpakAlgControl(vpm150m->dspid, i, EnableDTMFMuteA, &pstatus);
- debug_printk(2, "DTMF mute enable took %d ms\n", atomic_read(&wc->txints) - start);
- } else {
- res = gpakAlgControl(vpm150m->dspid, i, DisableDTMFMuteA, &pstatus);
- debug_printk(2, "DTMF mute disable took %d ms\n", atomic_read(&wc->txints) - start);
- }
- if (!res)
- change_bit(i, &vpm150m->curdtmfmutestate);
- }
- }
-
- if (test_bit(VPM150M_DTMFDETECT, &vpm150m->control)) {
- unsigned short channel;
- GpakAsyncEventCode_t eventcode;
- GpakAsyncEventData_t eventdata;
- gpakReadEventFIFOMessageStat_t res;
- unsigned int start = atomic_read(&wc->txints);
-
- do {
- res = gpakReadEventFIFOMessage(vpm150m->dspid, &channel, &eventcode, &eventdata);
- debug_printk(3, "ReadEventFIFOMessage took %d ms\n", atomic_read(&wc->txints) - start);
-
- if (res == RefInvalidEvent || res == RefDspCommFailure) {
- module_printk("Uh oh (%d)\n", res);
- continue;
- }
-
- if (eventcode == EventToneDetect) {
- GpakToneCodes_t tone = eventdata.toneEvent.ToneCode;
- int duration = eventdata.toneEvent.ToneDuration;
- char zaptone = vpm150mtone_to_zaptone(tone);
-
- debug_printk(1, "Channel %d: Detected DTMF tone %d of duration %d\n", channel + 1, tone, duration);
-
- if (test_bit(channel, &wc->dtmfmask) && (eventdata.toneEvent.ToneDuration > 0)) {
- struct dahdi_chan *chan = wc->chans[channel];
-
- module_printk("DTMF detected channel=%d tone=%d duration=%d\n", channel + 1, tone, duration);
-
- if ((tone != EndofMFDigit) && (zaptone != 0)) {
- vpm150m->curtone[channel] = tone;
-
- if (test_bit(channel, &vpm150m->curdtmfmutestate)) {
- unsigned long flags;
- int y;
-
- /* Mute the audio data buffers */
- spin_lock_irqsave(&chan->lock, flags);
- for (y = 0; y < chan->numbufs; y++) {
- if ((chan->inreadbuf > -1) && (chan->readidx[y]))
- memset(chan->readbuf[chan->inreadbuf], DAHDI_XLAW(0, chan), chan->readidx[y]);
- }
- spin_unlock_irqrestore(&chan->lock, flags);
- }
- if (!test_bit(channel, &wc->dtmfactive)) {
- debug_printk(1,"Queuing DTMFDOWN %c\n", zaptone);
- set_bit(channel, &wc->dtmfactive);
- dahdi_qevent_lock(chan, (DAHDI_EVENT_DTMFDOWN | zaptone));
- }
- } else if ((tone == EndofMFDigit) && test_bit(channel, &wc->dtmfactive)) {
- debug_printk(1,"Queuing DTMFUP %c\n", vpm150mtone_to_zaptone(vpm150m->curtone[channel]));
- dahdi_qevent_lock(chan, (DAHDI_EVENT_DTMFUP | vpm150mtone_to_zaptone(vpm150m->curtone[channel])));
- clear_bit(channel, &wc->dtmfactive);
- }
- }
- }
- } while ((res == RefEventAvail));
- }
-
- return;
-}
-
-void t1_vpm150m_init(struct t1 *wc) {
- struct vpm150m *vpm150m;
- unsigned short i;
- unsigned short reg;
- unsigned long flags;
- gpakPingDspStat_t pingstatus;
- gpakDownloadStatus_t downloadstatus;
- struct t1_firmware fw;
- struct firmware embedded_firmware;
- const struct firmware *firmware = &embedded_firmware;
-#if !defined(HOTPLUG_FIRMWARE)
- extern void _binary_dahdi_fw_vpmadt032_bin_size;
- extern u8 _binary_dahdi_fw_vpmadt032_bin_start[];
-#else
- static const char vpmadt032_firmware[] = "dahdi-fw-vpmadt032.bin";
- struct pci_dev* pdev = voicebus_get_pci_dev(wc->vb);
-#endif
-
-#if 0
- unsigned short omsg[4] = { 0xdead, 0xbeef, 0x1111, 0x2222};
- unsigned short imsg[4];
-#endif
-
- if (!vpmsupport) {
- module_printk("VPM Support Disabled\n");
- wc->vpm150m = NULL;
- return;
- }
-
- vpm150m = kmalloc(sizeof(struct vpm150m), GFP_KERNEL);
-
- if (!vpm150m) {
- module_printk("Unable to allocate VPMADT032!\n");
- return;
- }
- memset(vpm150m, 0, sizeof(struct vpm150m));
-
- /* Init our vpm150m struct */
- sema_init(&vpm150m->sem, 1);
- vpm150m->curpage = 0x80;
-
- for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++) {
- if (ifaces[i] == wc)
- vpm150m->dspid = i;
- }
-
- debug_printk(1, "Setting VPMADT032 DSP ID to %d\n", vpm150m->dspid);
- spin_lock_irqsave(&wc->reglock, flags);
- wc->vpm150m = vpm150m;
- spin_unlock_irqrestore(&wc->reglock, flags);
-
- for (i = 0; i < 10; i++)
- msleep_interruptible(1);
-
- debug_printk(1, "Looking for VPMADT032 by testing page access: ");
- for (i = 0; i < 0xf; i++) {
- int x;
- for (x = 0; x < 3; x++) {
- t1_vpm150m_setpage(wc, i);
- reg = t1_vpm150m_getpage(wc);
- if (reg != i) {
- /* If they have debug turned on we want them to be able to
- * report where in the code the module failed to come up. */
- debug_printk(1, "Either no VPMADT032 module present or the module failed VPM page access test (%x != %x)\n", i, reg);
- goto failed_exit;
- }
- }
- }
- debug_printk(1, "Passed\n");
-
- set_bit(VPM150M_HPIRESET, &vpm150m->control);
- msleep(2000);
-
- /* Set us up to page 0 */
- t1_vpm150m_setpage(wc, 0);
- debug_printk(1, "VPMADT032 now doing address test: ");
- for (i = 0; i < 16; i++) {
- int x;
- for (x = 0; x < 2; x++) {
- t1_vpm150m_setreg(wc, 1, 0x1000, &i);
- t1_vpm150m_getreg(wc, 1, 0x1000, &reg);
- if (reg != i) {
- module_printk("VPMADT032 Failed address test: sent %x != %x on try %d\n", i, reg, x);
- goto failed_exit;
- }
- }
- }
- debug_printk(1, "Passed\n");
-
-#define TEST_SIZE 2
- if (debug) {
- unsigned short msg[TEST_SIZE];
-
- set_bit(VPM150M_HPIRESET, &vpm150m->control);
- msleep(2000);
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- for (i = 0; i< TEST_SIZE; i++)
- msg[i] = 0xdead;
- gpakWriteDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- gpakWriteDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- for (i = 0; i< TEST_SIZE; i++)
- msg[i] = 0xbeef;
- gpakWriteDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- for (i = 0; i< TEST_SIZE; i++)
- msg[i] = 0x1111;
- gpakWriteDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- for (i = 0; i< TEST_SIZE; i++)
- msg[i] = 0x2222;
- gpakWriteDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- gpakReadDspMemory(vpm150m->dspid, 0x1000, TEST_SIZE, msg);
- debug_printk(1, "");
- for (i = 0; i< TEST_SIZE; i++)
- printk("%x ", msg[i]);
- printk("\n");
- }
-
-#if defined(HOTPLUG_FIRMWARE)
- if ((request_firmware(&firmware, vpmadt032_firmware, &pdev->dev) != 0) ||
- !firmware) {
- printk(KERN_NOTICE "VPMADT032: firmware %s not available from userspace\n", vpmadt032_firmware);
- goto failed_exit;
- }
-#else
- embedded_firmware.data = _binary_dahdi_fw_vpmadt032_bin_start;
- embedded_firmware.size = (size_t) &_binary_dahdi_fw_vpmadt032_bin_size;
-#endif
- fw.fw = firmware;
- fw.offset = 0;
-
- set_bit(VPM150M_HPIRESET, &vpm150m->control);
-
- while (test_bit(VPM150M_HPIRESET, &vpm150m->control))
- msleep(1);
-
- module_printk("VPMADT032 Loading firmware... ");
- downloadstatus = gpakDownloadDsp(vpm150m->dspid, &fw);
-
- if (firmware != &embedded_firmware)
- release_firmware(firmware);
-
- if (downloadstatus != 0) {
- module_printk("Unable to download firmware to VPMADT032 with cause %d\n", downloadstatus);
- goto failed_exit;
- } else {
- module_printk("Success\n");
- }
-
- set_bit(VPM150M_SWRESET, &vpm150m->control);
-
- while (test_bit(VPM150M_SWRESET, &vpm150m->control))
- msleep(1);
-
- msleep(700);
-#if 0
- }
-#endif
-
- pingstatus = gpakPingDsp(vpm150m->dspid, &vpm150m->version);
-
- if (!pingstatus) {
- debug_printk(1, "Version of DSP is %x\n", vpm150m->version);
- } else {
- module_printk("Unable to ping the DSP (%d)!\n", pingstatus);
- goto failed_exit;
- }
-
- /* workqueue for DTMF and wc->span functions that cannot sleep */
- spin_lock_init(&vpm150m->lock);
- vpm150m->wq = create_singlethread_workqueue("wcte12xp");
- vpm150m->wc = wc;
- if (!vpm150m->wq) {
- module_printk("Unable to create work queue!\n");
- goto failed_exit;
- }
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
- INIT_WORK(&vpm150m->work_echocan, vpm150m_echocan_bh, vpm150m);
- INIT_WORK(&vpm150m->work_dtmf, vpm150m_dtmf_bh, vpm150m);
- INIT_WORK(&vpm150m->work_debug, vpm150m_debug_bh, vpm150m);
-#else
- INIT_WORK(&vpm150m->work_echocan, vpm150m_echocan_bh);
- INIT_WORK(&vpm150m->work_dtmf, vpm150m_dtmf_bh);
- INIT_WORK(&vpm150m->work_debug, vpm150m_debug_bh);
-#endif
- INIT_LIST_HEAD(&wc->vpm150m->worklist); /* list of echocan tasks */
-
- if (vpm150m_config_hw(wc)) {
- goto failed_exit;
- }
-
- return;
-
-failed_exit:
- if (vpm150m->wq) {
- destroy_workqueue(vpm150m->wq);
- }
- spin_lock_irqsave(&wc->reglock, flags);
- wc->vpm150m = NULL;
- spin_unlock_irqrestore(&wc->reglock, flags);
- kfree(vpm150m);
-
- return;
-}
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadDspMemory - Read DSP memory.
- *
- * FUNCTION
- * This function reads a contiguous block of words from DSP memory starting at
- * the specified address.
- *
- * RETURNS
- * nothing
- *
- */
-void gpakReadDspMemory(
- unsigned short int DspId, /* DSP Identifier (0 to MAX_DSP_CORES-1) */
- DSP_ADDRESS DspAddress, /* DSP's memory address of first word */
- unsigned int NumWords, /* number of contiguous words to read */
- DSP_WORD *pWordValues /* pointer to array of word values variable */
- )
-{
- struct t1 *wc = wc_find_iface(DspId);
- int i;
- int transcount;
- int ret;
-
- vpm150m_io_wait(wc);
- if ( NumWords < VPM150M_MAX_COMMANDS ) {
- struct vpm150m_cmd* cmds[VPM150M_MAX_COMMANDS] = { NULL };
- t1_vpm150m_setpage(wc, DspAddress >> 16);
- DspAddress &= 0xffff;
- for (i=0; i < NumWords; ++i) {
- ret = t1_vpm150m_getreg_full_async(wc,0,1,DspAddress+i,&pWordValues[i],
- &cmds[i]);
- if (0 != ret) {
- return;
- }
- }
- for (i=NumWords-1; i >=0; --i) {
- ret = t1_vpm150m_getreg_full_return(wc,0,1,DspAddress+i,&pWordValues[i],
- &cmds[i]);
- if (0 != ret) {
- return;
- }
- }
- }
- else {
- for (i = 0; i < NumWords;) {
- if ((NumWords - i) > VPM150M_MAX_DATA)
- transcount = VPM150M_MAX_DATA;
- else
- transcount = NumWords - i;
- t1_vpm150m_getreg(wc, transcount, DspAddress + i, &pWordValues[i]);
- i += transcount;
- }
- }
- return;
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakWriteDspMemory - Write DSP memory.
- *
- * FUNCTION
- * This function writes a contiguous block of words to DSP memory starting at
- * the specified address.
- *
- * RETURNS
- * nothing
- *
- */
-void gpakWriteDspMemory(
- unsigned short int DspId, /* DSP Identifier (0 to MAX_DSP_CORES-1) */
- DSP_ADDRESS DspAddress, /* DSP's memory address of first word */
- unsigned int NumWords, /* number of contiguous words to write */
- DSP_WORD *pWordValues /* pointer to array of word values to write */
- )
-{
-
- struct t1 *wc = wc_find_iface(DspId);
- int i;
- int transcount;
-
- if (wc && wc->vpm150m) {
- for (i = 0; i < NumWords;) {
- if ((NumWords - i) > VPM150M_MAX_DATA)
- transcount = VPM150M_MAX_DATA;
- else
- transcount = NumWords - i;
- t1_vpm150m_setreg(wc, transcount, DspAddress + i, &pWordValues[i]);
- i += transcount;
- }
- }
- return;
-
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakHostDelay - Delay for a fixed time interval.
- *
- * FUNCTION
- * This function delays for a fixed time interval before returning. The time
- * interval is the Host Port Interface sampling period when polling a DSP for
- * replies to command messages.
- *
- * RETURNS
- * nothing
- *
- */
-void gpakHostDelay(void)
-{
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakLockAccess - Lock access to the specified DSP.
- *
- * FUNCTION
- * This function aquires exclusive access to the specified DSP.
- *
- * RETURNS
- * nothing
- *
- */
-void gpakLockAccess(unsigned short DspId)
-{
- struct t1 *wc;
-
- wc = wc_find_iface(DspId);
-
- if (wc) {
- struct vpm150m *vpm = wc->vpm150m;
-
- if (vpm)
- if (down_interruptible(&vpm->sem)) {
- return;
- }
- }
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakUnlockAccess - Unlock access to the specified DSP.
- *
- * FUNCTION
- * This function releases exclusive access to the specified DSP.
- *
- * RETURNS
- * nothing
- *
- */
-void gpakUnlockAccess(unsigned short DspId)
-{
- struct t1 *wc;
-
- wc = wc_find_iface(DspId);
-
- if (wc) {
- struct vpm150m *vpm = wc->vpm150m;
-
- if (vpm)
- up(&vpm->sem);
- }
-}
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- * gpakReadFile - Read a block of bytes from a G.PAK Download file.
- *
- * FUNCTION
- * This function reads a contiguous block of bytes from a G.PAK Download file
- * starting at the current file position.
- *
- * RETURNS
- * The number of bytes read from the file.
- * -1 indicates an error occurred.
- * 0 indicates all bytes have been read (end of file)
- *
- */
-int gpakReadFile(
- GPAK_FILE_ID FileId, /* G.PAK Download File Identifier */
- unsigned char *pBuffer, /* pointer to buffer for storing bytes */
- unsigned int NumBytes /* number of bytes to read */
- )
-{
- struct t1_firmware *fw = FileId;
- unsigned int i, count;
-
- if (!fw || !fw->fw)
- return -1;
-
- if (NumBytes > (fw->fw->size - fw->offset))
- count = fw->fw->size - fw->offset;
- else
- count = NumBytes;
-
- for (i = 0; i < count; i++)
- pBuffer[i] = fw->fw->data[fw->offset + i];
-
- fw->offset += count;
-
- return count;
-}
-
-int vpm150m_config_hw(struct t1 *wc)
-{
- struct vpm150m *vpm150m = wc->vpm150m;
- gpakConfigPortStatus_t configportstatus;
- GpakPortConfig_t portconfig;
- GPAK_PortConfigStat_t pstatus;
- GpakChannelConfig_t chanconfig;
- GPAK_ChannelConfigStat_t cstatus;
- GPAK_AlgControlStat_t algstatus;
-
- int res, i;
-
- memset(&portconfig, 0, sizeof(GpakPortConfig_t));
-
- /* First Serial Port config */
- portconfig.SlotsSelect1 = SlotCfgNone;
- portconfig.FirstBlockNum1 = 0;
- portconfig.FirstSlotMask1 = 0x0000;
- portconfig.SecBlockNum1 = 1;
- portconfig.SecSlotMask1 = 0x0000;
- portconfig.SerialWordSize1 = SerWordSize8;
- portconfig.CompandingMode1 = cmpNone;
- portconfig.TxFrameSyncPolarity1 = FrameSyncActHigh;
- portconfig.RxFrameSyncPolarity1 = FrameSyncActHigh;
- portconfig.TxClockPolarity1 = SerClockActHigh;
- portconfig.RxClockPolarity1 = SerClockActHigh;
- portconfig.TxDataDelay1 = DataDelay0;
- portconfig.RxDataDelay1 = DataDelay0;
- portconfig.DxDelay1 = Disabled;
- portconfig.ThirdSlotMask1 = 0x0000;
- portconfig.FouthSlotMask1 = 0x0000;
- portconfig.FifthSlotMask1 = 0x0000;
- portconfig.SixthSlotMask1 = 0x0000;
- portconfig.SevenSlotMask1 = 0x0000;
- portconfig.EightSlotMask1 = 0x0000;
-
- /* Second Serial Port config */
- portconfig.SlotsSelect2 = SlotCfg8Groups;
- portconfig.FirstBlockNum2 = 0;
- portconfig.FirstSlotMask2 = 0x5554;
- portconfig.SecBlockNum2 = 1;
- portconfig.SecSlotMask2 = 0x5555;
- portconfig.ThirdSlotMask2 = 0x5555;
- portconfig.FouthSlotMask2 = 0x5555;
- portconfig.SerialWordSize2 = SerWordSize8;
- portconfig.CompandingMode2 = cmpNone;
- portconfig.TxFrameSyncPolarity2 = FrameSyncActHigh;
- portconfig.RxFrameSyncPolarity2 = FrameSyncActHigh;
- portconfig.TxClockPolarity2 = SerClockActHigh;
- portconfig.RxClockPolarity2 = SerClockActHigh;
- portconfig.TxDataDelay2 = DataDelay0;
- portconfig.RxDataDelay2 = DataDelay0;
- portconfig.DxDelay2 = Disabled;
- portconfig.FifthSlotMask2 = 0x0001;
- portconfig.SixthSlotMask2 = 0x0000;
- portconfig.SevenSlotMask2 = 0x0000;
- portconfig.EightSlotMask2 = 0x0000;
-
- /* Third Serial Port Config */
- portconfig.SlotsSelect3 = SlotCfg8Groups;
- portconfig.FirstBlockNum3 = 0;
- portconfig.FirstSlotMask3 = 0x5554;
- portconfig.SecBlockNum3 = 1;
- portconfig.SecSlotMask3 = 0x5555;
- portconfig.SerialWordSize3 = SerWordSize8;
- portconfig.CompandingMode3 = cmpNone;
- portconfig.TxFrameSyncPolarity3 = FrameSyncActHigh;
- portconfig.RxFrameSyncPolarity3 = FrameSyncActHigh;
- portconfig.TxClockPolarity3 = SerClockActHigh;
- portconfig.RxClockPolarity3 = SerClockActLow;
- portconfig.TxDataDelay3 = DataDelay0;
- portconfig.RxDataDelay3 = DataDelay0;
- portconfig.DxDelay3 = Disabled;
- portconfig.ThirdSlotMask3 = 0x5555;
- portconfig.FouthSlotMask3 = 0x5555;
- portconfig.FifthSlotMask3 = 0x0001;
- portconfig.SixthSlotMask3 = 0x0000;
- portconfig.SevenSlotMask3 = 0x0000;
- portconfig.EightSlotMask3 = 0x0000;
-
- if ((configportstatus = gpakConfigurePorts(vpm150m->dspid, &portconfig, &pstatus))) {
- module_printk("Configuration of ports failed (%d)!\n", configportstatus);
- return -1;
- } else {
- debug_printk(1, "Configured McBSP ports successfully\n");
- }
-
- if ((res = gpakPingDsp(vpm150m->dspid, &vpm150m->version))) {
- module_printk("Error pinging DSP (%d)\n", res);
- return -1;
- }
-
- for (i = 0; i < 32; i++) {
- /* Let's configure a channel */
- chanconfig.PcmInPortA = 3;
- chanconfig.PcmInSlotA = (i + 1) * 2;
- chanconfig.PcmOutPortA = 2;
- chanconfig.PcmOutSlotA = (i + 1) * 2;
- chanconfig.PcmInPortB = 2;
- chanconfig.PcmInSlotB = (i + 1) * 2;
- chanconfig.PcmOutPortB = 3;
- chanconfig.PcmOutSlotB = (i + 1) * 2;
- if (vpmdtmfsupport) {
- chanconfig.ToneTypesA = DTMF_tone;
- chanconfig.MuteToneA = Enabled;
- chanconfig.FaxCngDetA = Enabled;
- } else {
- chanconfig.ToneTypesA = Null_tone;
- chanconfig.MuteToneA = Disabled;
- chanconfig.FaxCngDetA = Disabled;
- }
- chanconfig.ToneTypesB = Null_tone;
- chanconfig.EcanEnableA = Enabled;
- chanconfig.EcanEnableB = Disabled;
- chanconfig.MuteToneB = Disabled;
- chanconfig.FaxCngDetB = Disabled;
-
- chanconfig.SoftwareCompand = cmpNone;
-
- chanconfig.FrameRate = rate10ms;
-
- chanconfig.EcanParametersA.EcanTapLength = 1024;
- chanconfig.EcanParametersA.EcanNlpType = vpmnlptype;
- chanconfig.EcanParametersA.EcanAdaptEnable = 1;
- chanconfig.EcanParametersA.EcanG165DetEnable = 1;
- chanconfig.EcanParametersA.EcanDblTalkThresh = 6;
- chanconfig.EcanParametersA.EcanNlpThreshold = vpmnlpthresh;
- chanconfig.EcanParametersA.EcanNlpConv = 0;
- chanconfig.EcanParametersA.EcanNlpUnConv = 0;
- chanconfig.EcanParametersA.EcanNlpMaxSuppress = vpmnlpmaxsupp;
- chanconfig.EcanParametersA.EcanCngThreshold = 43;
- chanconfig.EcanParametersA.EcanAdaptLimit = 50;
- chanconfig.EcanParametersA.EcanCrossCorrLimit = 15;
- chanconfig.EcanParametersA.EcanNumFirSegments = 3;
- chanconfig.EcanParametersA.EcanFirSegmentLen = 64;
-
- chanconfig.EcanParametersB.EcanTapLength = 1024;
- chanconfig.EcanParametersB.EcanNlpType = vpmnlptype;
- chanconfig.EcanParametersB.EcanAdaptEnable = 1;
- chanconfig.EcanParametersB.EcanG165DetEnable = 1;
- chanconfig.EcanParametersB.EcanDblTalkThresh = 6;
- chanconfig.EcanParametersB.EcanNlpThreshold = vpmnlpthresh;
- chanconfig.EcanParametersB.EcanNlpConv = 0;
- chanconfig.EcanParametersB.EcanNlpUnConv = 0;
- chanconfig.EcanParametersB.EcanNlpMaxSuppress = vpmnlpmaxsupp;
- chanconfig.EcanParametersB.EcanCngThreshold = 43;
- chanconfig.EcanParametersB.EcanAdaptLimit = 50;
- chanconfig.EcanParametersB.EcanCrossCorrLimit = 15;
- chanconfig.EcanParametersB.EcanNumFirSegments = 3;
- chanconfig.EcanParametersB.EcanFirSegmentLen = 64;
-
- if ((res = gpakConfigureChannel(vpm150m->dspid, i, tdmToTdm, &chanconfig, &cstatus))) {
- module_printk("Unable to configure channel (%d)\n", res);
- if (res == 1) {
- module_printk("Reason %d\n", cstatus);
- }
-
- return -1;
- }
-
- if ((res = gpakAlgControl(vpm150m->dspid, i, BypassEcanA, &algstatus))) {
- module_printk("Unable to disable echo can on channel %d (reason %d:%d)\n", i + 1, res, algstatus);
- return -1;
- }
-
- if (vpmdtmfsupport) {
- if ((res = gpakAlgControl(vpm150m->dspid, i, DisableDTMFMuteA, &algstatus))) {
- module_printk("Unable to disable dtmf muting on channel %d (reason %d:%d)\n", i + 1, res, algstatus);
- return -1;
- }
- }
- }
-
- if ((res = gpakPingDsp(vpm150m->dspid, &vpm150m->version))) {
- module_printk("Error pinging DSP (%d)\n", res);
- return -1;
- }
-
- /* Turn on DTMF detection */
- if (vpmdtmfsupport)
- set_bit(VPM150M_DTMFDETECT, &vpm150m->control);
- set_bit(VPM150M_ACTIVE, &vpm150m->control);
-
- return 0;
-}
-
-#endif
diff --git a/drivers/dahdi/wcte12xp/vpmadt032.h b/drivers/dahdi/wcte12xp/vpmadt032.h
deleted file mode 100644
index da50d6a..0000000
--- a/drivers/dahdi/wcte12xp/vpmadt032.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Digium, Inc. Wildcard TE12xP T1/E1 card Driver
- *
- * Written by Michael Spiceland <mspiceland@digium.com>
- *
- * Adapted from the wctdm24xxp and wcte11xp drivers originally
- * written by Mark Spencer <markster@digium.com>
- * Matthew Fredrickson <creslin@digium.com>
- * William Meadows <wmeadows@digium.com>
- *
- * Copyright (C) 2007, Digium, Inc.
- *
- * All rights reserved.
- *
- */
-
-/*
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * This program is free software, distributed under the terms of
- * the GNU General Public License Version 2 as published by the
- * Free Software Foundation. See the LICENSE file included with
- * this program for more details.
- */
-
-#ifndef _VPM150M_H
-#define _VPM150M_H
-
-#include "wcte12xp.h"
-#include "adt_lec.h"
-
-struct t1_firmware {
- const struct firmware *fw;
- unsigned int offset;
-};
-
-/* Host and DSP system dependent related definitions. */
-#define MAX_DSP_CORES 128 /* maximum number of DSP cores */
-//#define MAX_CONFS 1 /* maximum number of conferences */
-//#define MAX_PKT_CHANNELS 8 /* maximum number of packet channels */
-#define MAX_CHANNELS 32 /* maximum number of channels */
-#define MAX_WAIT_LOOPS 50 /* max number of wait delay loops */
-#define DSP_IFBLK_ADDRESS 0x0100 /* DSP address of I/F block pointer */
-#define DOWNLOAD_BLOCK_SIZE 512 /* download block size (DSP words) */
-//#define MAX_CIDPAYLOAD_BYTES 512 /* max size of a CID payload (octets) */
-typedef unsigned short DSP_WORD; /* 16 bit DSP word */
-typedef unsigned int DSP_ADDRESS; /* 32 bit DSP address */
-typedef struct t1_firmware* GPAK_FILE_ID; /* G.PAK Download file identifier */
-
-#define __VPM150M_RWPAGE (1 << 4)
-#define __VPM150M_RD (1 << 3)
-#define __VPM150M_WR (1 << 2)
-#define __VPM150M_FIN (1 << 1)
-#define __VPM150M_TX (1 << 0)
-
-#define VPM150M_HPI_CONTROL 0x00
-#define VPM150M_HPI_ADDRESS 0x02
-#define VPM150M_HPI_DATA 0x03
-
-#define VPM150M_MAX_COMMANDS 8
-
-/* Some Bit ops for different operations */
-#define VPM150M_SPIRESET 0
-#define VPM150M_HPIRESET 1
-#define VPM150M_SWRESET 2
-#define VPM150M_DTMFDETECT 3
-#define VPM150M_ACTIVE 4
-#define VPM150M_MAX_DATA 1
-
-struct vpm150m_cmd {
- unsigned short address;
- unsigned short data[VPM150M_MAX_DATA];
- unsigned char ident;
- unsigned char datalen;
- unsigned int flags;
- unsigned char cs_slot;
-};
-
-struct vpm150m {
- unsigned short dspid;
- unsigned long control;
- unsigned char curpage;
- unsigned short version;
- struct vpm150m_cmd cmdq[VPM150M_MAX_COMMANDS];
- spinlock_t lock; /* control access to list of bottom half tasks */
- struct semaphore sem;
- struct workqueue_struct *wq;
- struct work_struct work_dtmf;
- struct work_struct work_debug;
- struct work_struct work_echocan;
- struct list_head worklist;
- unsigned char curtone[32];
- unsigned long curdtmfmutestate;
- unsigned long desireddtmfmutestate;
- struct adt_lec_params chan_params[32];
- struct t1 *wc;
-};
-
-/* linked list for vpm echocan workqueue*/
-struct vpm150m_workentry {
- struct list_head list;
- struct t1 *wc; /* what card are we dealing with? */
- struct dahdi_chan *chan; /* what channels are we going to deal with? */
- struct adt_lec_params params; /* how should we behave? */
-};
-
-extern int debug;
-extern int vpmsupport;
-extern int vpmdtmfsupport;
-extern struct pci_driver te12xp_driver;
-extern struct t1 *ifaces[WC_MAX_IFACES];
-extern int vpmnlptype;
-extern int vpmnlpthresh;
-extern int vpmnlpmaxsupp;
-
-void t1_vpm150m_init(struct t1 *wc);
-void vpm150m_cmd_dequeue(struct t1 *wc, volatile unsigned char *writechunk, int whichframe);
-void vpm150m_cmd_decipher(struct t1 *wc, volatile unsigned char *readchunk);
-int vpm150m_config_hw(struct t1 *wc);
-
-/* gpak API functions */
-void gpakReadDspMemory(
- unsigned short int DspId, /* DSP Identifier (0 to MAX_DSP_CORES-1) */
- DSP_ADDRESS DspAddress, /* DSP's memory address of first word */
- unsigned int NumWords, /* number of contiguous words to read */
- DSP_WORD *pWordValues /* pointer to array of word values variable */
- );
-void gpakWriteDspMemory(
- unsigned short int DspId, /* DSP Identifier (0 to MAX_DSP_CORES-1) */
- DSP_ADDRESS DspAddress, /* DSP's memory address of first word */
- unsigned int NumWords, /* number of contiguous words to write */
- DSP_WORD *pWordValues /* pointer to array of word values to write */
- );
-void gpakHostDelay(void);
-void gpakLockAccess(
- unsigned short int DspId /* DSP Identifier (0 to MAX_DSP_CORES-1) */
- );
-void gpakUnlockAccess(
- unsigned short int DspId /* DSP Identifier (0 to MAX_DSP_CORES-1) */
- );
-int gpakReadFile(
- GPAK_FILE_ID FileId, /* G.PAK Download File Identifier */
- unsigned char *pBuffer, /* pointer to buffer for storing bytes */
- unsigned int NumBytes /* number of bytes to read */
- );
-
-#endif
diff --git a/drivers/dahdi/wcte12xp/wcte12xp.h b/drivers/dahdi/wcte12xp/wcte12xp.h
index 655ac30..a93df54 100644
--- a/drivers/dahdi/wcte12xp/wcte12xp.h
+++ b/drivers/dahdi/wcte12xp/wcte12xp.h
@@ -8,7 +8,7 @@
* Matthew Fredrickson <creslin@digium.com>
* William Meadows <wmeadows@digium.com>
*
- * Copyright (C) 2007, Digium, Inc.
+ * Copyright (C) 2007-2009, Digium, Inc.
*
* All rights reserved.
*
@@ -130,13 +130,11 @@ struct t1 {
unsigned long ctlreg;
struct voicebus* vb;
atomic_t txints;
-#ifdef VPM_SUPPORT
- int vpm;
- struct vpm150m *vpm150m;
+ int vpm100;
+ struct vpmadt032 *vpmadt032;
unsigned long dtmfactive;
unsigned long dtmfmask;
unsigned long dtmfmutemask;
-#endif
spinlock_t cmd_list_lock;
struct list_head pending_cmds;