diff options
Diffstat (limited to 'drivers/dahdi/wctdm24xxp')
-rw-r--r-- | drivers/dahdi/wctdm24xxp/GpakApi.c | 1630 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/GpakApi.h | 636 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/GpakCust.c | 482 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/GpakCust.h | 180 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/GpakHpi.h | 79 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/Kbuild | 15 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/base.c | 1262 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/gpakErrs.h | 154 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/gpakenum.h | 191 | ||||
l--------- | drivers/dahdi/wctdm24xxp/voicebus.c | 1 | ||||
-rw-r--r-- | drivers/dahdi/wctdm24xxp/wctdm24xxp.h | 60 |
11 files changed, 441 insertions, 4249 deletions
diff --git a/drivers/dahdi/wctdm24xxp/GpakApi.c b/drivers/dahdi/wctdm24xxp/GpakApi.c deleted file mode 100644 index 1f1bb0b..0000000 --- a/drivers/dahdi/wctdm24xxp/GpakApi.c +++ /dev/null @@ -1,1630 +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 <linux/version.h> -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) -#include <linux/semaphore.h> -#else -#include <asm/semaphore.h> -#endif - -#include <dahdi/kernel.h> - -#include "GpakHpi.h" -#include "GpakCust.h" -#include "GpakApi.h" -#include "gpakenum.h" - -/* 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); -#if 0 - printk(KERN_DEBUG "EventDataLength > WORD_BUFFER_SIZE (%d)\n", EventDataLength); -#endif - 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) { -#if 0 - printk(KERN_DEBUG "EventDataLength != 4 it's %d\n", EventDataLength); -#endif - EventError = 1; - } - break; - - default: -#if 0 - printk(KERN_DEBUG "Event Code not in switch\n"); -#endif - 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); -} diff --git a/drivers/dahdi/wctdm24xxp/GpakApi.h b/drivers/dahdi/wctdm24xxp/GpakApi.h deleted file mode 100644 index 2e55e64..0000000 --- a/drivers/dahdi/wctdm24xxp/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/wctdm24xxp/GpakCust.c b/drivers/dahdi/wctdm24xxp/GpakCust.c deleted file mode 100644 index a32fb96..0000000 --- a/drivers/dahdi/wctdm24xxp/GpakCust.c +++ /dev/null @@ -1,482 +0,0 @@ -/* - * Copyright (c) 2005, Adaptive Digital Technologies, Inc. - * - * File Name: GpakCust.c - * - * Description: - * This file contains host system dependent functions to support generic - * G.PAK API functions. The file is integrated into the host processor - * connected to C55x G.PAK DSPs via a Host Port Interface. - * - * Note: This file needs to be modified by the G.PAK system integrator. - * - * 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. - */ - -#include <linux/version.h> -#include <linux/delay.h> -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) -#include <linux/semaphore.h> -#else -#include <asm/semaphore.h> -#endif - -#include <dahdi/kernel.h> - -#include "wctdm24xxp.h" -#include "GpakCust.h" - -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; - } -} - -static inline struct wctdm * wc_find_iface(unsigned short dspid) -{ - int i; - struct wctdm *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 inline struct vpm150m_cmd * vpm150m_empty_slot(struct wctdm *wc) -{ - int x; - - for (x = 0; x < VPM150M_MAX_COMMANDS; x++) - if (!wc->vpm150m->cmdq[x].desc) { - return &wc->vpm150m->cmdq[x]; - } - return NULL; -} - -/* Wait for any outstanding commands to be completed. */ -static inline int vpm150m_io_wait(struct wctdm *wc) -{ - int x; - int ret=0; - for (x=0; x < VPM150M_MAX_COMMANDS;) { - if (wc->vpm150m->cmdq[x].desc) { - if ((ret=schluffen(&wc->regq))) { - return ret; - } - x=0; - } - else { - ++x; - } - } - return ret; -} - -static int wctdm_vpm150m_getreg_full_async(struct wctdm *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)->desc = __VPM150M_RD; - if (pagechange) { - (*hit_p)->desc |= __VPM150M_RWPAGE; - } - (*hit_p)->datalen = len; - (*hit_p)->addr = addr; - memset((*hit_p)->data, 0, len*sizeof(outbuf[0])); - } - else { - ret = -EBUSY; - } - spin_unlock_irqrestore(&wc->reglock, flags); - return ret; -} - -static int wctdm_vpm150m_getreg_full_return(struct wctdm *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)->desc & __VPM150M_FIN) { - memcpy(outbuf, (*hit_p)->data, len*(sizeof(outbuf[0]))); - (*hit_p)->desc = 0; - (*hit_p) = NULL; - ret = 0; - } - else { - spin_unlock_irqrestore(&wc->reglock, flags); - if ((ret=schluffen(&wc->regq))) { - return ret; - } - spin_lock_irqsave(&wc->reglock, flags); - ret = -EBUSY; - } - } while (-EBUSY == ret); - spin_unlock_irqrestore(&wc->reglock, flags); - return ret; -} - -static int wctdm_vpm150m_getreg_full(struct wctdm *wc, int pagechange, unsigned int len, unsigned short addr, unsigned short *outbuf) -{ - struct vpm150m_cmd *hit = NULL; - int ret = 0; - do { - ret = wctdm_vpm150m_getreg_full_async(wc, pagechange, len, addr, outbuf, &hit); - if (!hit) { - if ( -EBUSY == ret ) { - if ((ret = schluffen(&wc->regq))) - return ret; - } - BUG_ON(0 != ret); - } - } while (!hit); - ret = wctdm_vpm150m_getreg_full_return(wc, pagechange, len, addr, outbuf, &hit); - return ret; -} - -static int wctdm_vpm150m_setreg_full(struct wctdm *wc, int pagechange, unsigned int len, unsigned int addr, unsigned short *data) -{ - unsigned long flags; - struct vpm150m_cmd *hit; - int ret, i; - do { - spin_lock_irqsave(&wc->reglock, flags); - hit = vpm150m_empty_slot(wc); - if (hit) { - hit->desc = __VPM150M_WR; - if (pagechange) - hit->desc |= __VPM150M_RWPAGE; - hit->addr = addr; - hit->datalen = len; - for (i = 0; i < len; i++) - hit->data[i] = data[i]; - } - spin_unlock_irqrestore(&wc->reglock, flags); - if (!hit) { - if ((ret = schluffen(&wc->regq))) - return ret; - } - } while (!hit); - return (hit) ? 0 : -1; -} - -int wctdm_vpm150m_setpage(struct wctdm *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 wctdm_vpm150m_setreg_full(wc, 1, 1, 0, &addr); -} - -unsigned char wctdm_vpm150m_getpage(struct wctdm *wc) -{ - unsigned short res; - wctdm_vpm150m_getreg_full(wc, 1, 1, 0, &res); - return res; -} - -unsigned short wctdm_vpm150m_getreg(struct wctdm *wc, unsigned int len, unsigned int addr, unsigned short *data) -{ - unsigned short res; - wctdm_vpm150m_setpage(wc, addr >> 16); - if ((addr >> 16) != ((addr + len) >> 16)) - printk(KERN_INFO "getreg: You found it!\n"); - res = wctdm_vpm150m_getreg_full(wc, 0, len, addr & 0xffff, data); - return res; -} - -int wctdm_vpm150m_setreg(struct wctdm *wc, unsigned int len, unsigned int addr, unsigned short *data) -{ - int res; - wctdm_vpm150m_setpage(wc, addr >> 16); - if ((addr >> 16) != ((addr + len) >> 16)) - printk(KERN_INFO "getreg: You found it!\n"); - res = wctdm_vpm150m_setreg_full(wc, 0, len, addr & 0xffff, data); - return res; -} - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * 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 wctdm *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 }; - wctdm_vpm150m_setpage(wc, DspAddress >> 16); - DspAddress &= 0xffff; - for (i=0; i < NumWords; ++i) { - ret = wctdm_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 = wctdm_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; - wctdm_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 wctdm *wc = wc_find_iface(DspId); - int i; - int transcount; - - //printk(KERN_DEBUG "Writing %d words to memory\n", NumWords); - if (wc && wc->vpm150m) { - for (i = 0; i < NumWords;) { - if ((NumWords - i) > VPM150M_MAX_DATA) - transcount = VPM150M_MAX_DATA; - else - transcount = NumWords - i; - - wctdm_vpm150m_setreg(wc, transcount, DspAddress + i, &pWordValues[i]); - i += transcount; - } -#if 0 - for (i = 0; i < NumWords; i++) { - if (wctdm_vpm150m_getreg(wc, DspAddress + i) != pWordValues[i]) { - printk(KERN_NOTICE "Error in write. Address %x is not %x\n", DspAddress + i, pWordValues[i]); - } - } -#endif - } - 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 wctdm *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 wctdm *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 */ - ) -{ -#ifdef VPM150M_SUPPORT - struct wctdm_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; -#endif -} diff --git a/drivers/dahdi/wctdm24xxp/GpakCust.h b/drivers/dahdi/wctdm24xxp/GpakCust.h deleted file mode 100644 index f2b729f..0000000 --- a/drivers/dahdi/wctdm24xxp/GpakCust.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2005, Adaptive Digital Technologies, Inc. - * - * File Name: GpakCust.h - * - * Description: - * This file contains host system dependent definitions and prototypes of - * functions to support generic G.PAK API functions. The file is used when - * integrating G.PAK API functions in a specific host processor environment. - * - * Note: This file may need to be modified by the G.PAK system integrator. - * - * 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 _GPAKCUST_H /* prevent multiple inclusion */ -#define _GPAKCUST_H - -#include "wctdm24xxp.h" -#ifdef VPM150M_SUPPORT -#include <linux/device.h> -#include <linux/firmware.h> -#endif -#include "gpakenum.h" - - -struct wctdm_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 wctdm_firmware* GPAK_FILE_ID; /* G.PAK Download file identifier */ - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * gpakReadDspMemory - Read DSP memory. - * - * FUNCTION - * This function reads a contiguous block of words from DSP memory starting at - * the specified address. - * - * RETURNS - * nothing - * - */ -extern 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 */ - ); - - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * gpakWriteDspMemory - Write DSP memory. - * - * FUNCTION - * This function writes a contiguous block of words to DSP memory starting at - * the specified address. - * - * RETURNS - * nothing - * - */ -extern 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 */ - ); - - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * 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 - * - */ -extern void gpakHostDelay(void); - - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * gpakLockAccess - Lock access to the specified DSP. - * - * FUNCTION - * This function aquires exclusive access to the specified DSP. - * - * RETURNS - * nothing - * - */ -extern void gpakLockAccess( - unsigned short int DspId /* DSP Identifier (0 to MAX_DSP_CORES-1) */ - ); - - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * gpakUnlockAccess - Unlock access to the specified DSP. - * - * FUNCTION - * This function releases exclusive access to the specified DSP. - * - * RETURNS - * nothing - * - */ -extern void gpakUnlockAccess( - unsigned short int DspId /* DSP Identifier (0 to MAX_DSP_CORES-1) */ - ); - - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * 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) - * - */ -extern 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 */ - ); - - -unsigned char wctdm_vpm150m_getpage(struct wctdm *wc); - -int wctdm_vpm150m_setpage(struct wctdm *wc, unsigned short addr); - -int wctdm_vpm150m_setreg(struct wctdm *wc, unsigned int len, unsigned int addr, unsigned short *data); - -unsigned short wctdm_vpm150m_getreg(struct wctdm *wc, unsigned int len, unsigned int addr, unsigned short *data); - -char vpm150mtone_to_zaptone(GpakToneCodes_t tone); - -#endif /* prevent multiple inclusion */ - - diff --git a/drivers/dahdi/wctdm24xxp/GpakHpi.h b/drivers/dahdi/wctdm24xxp/GpakHpi.h deleted file mode 100644 index ffbf349..0000000 --- a/drivers/dahdi/wctdm24xxp/GpakHpi.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2001, Adaptive Digital Technologies, Inc. - * - * File Name: GpakHpi.h - * - * Description: - * This file contains common definitions related to the G.PAK interface - * between a host processor and a DSP processor via the Host Port Interface. - * - * Version: 1.0 - * - * Revision History: - * 10/17/01 - 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 _GPAKHPI_H /* prevent multiple inclusion */ -#define _GPAKHPI_H - - -/* Definition of G.PAK Command/Reply message type codes. */ -#define MSG_NULL_REPLY 0 /* Null Reply (unsupported Command) */ -#define MSG_SYS_CONFIG_RQST 1 /* System Configuration Request */ -#define MSG_SYS_CONFIG_REPLY 2 /* System Configuration Reply */ -#define MSG_READ_SYS_PARMS 3 /* Read System Parameters */ -#define MSG_READ_SYS_PARMS_REPLY 4 /* Read System Parameters Reply */ -#define MSG_WRITE_SYS_PARMS 5 /* Write System Parameters */ -#define MSG_WRITE_SYS_PARMS_REPLY 6 /* Write System Parameters Reply */ -#define MSG_CONFIGURE_PORTS 7 /* Configure Serial Ports */ -#define MSG_CONFIG_PORTS_REPLY 8 /* Configure Serial Ports Reply */ -#define MSG_CONFIGURE_CHANNEL 9 /* Configure Channel */ -#define MSG_CONFIG_CHAN_REPLY 10 /* Configure Channel Reply */ -#define MSG_TEAR_DOWN_CHANNEL 11 /* Tear Down Channel */ -#define MSG_TEAR_DOWN_REPLY 12 /* Tear Down Channel Reply */ -#define MSG_CHAN_STATUS_RQST 13 /* Channel Status Request */ -#define MSG_CHAN_STATUS_REPLY 14 /* Channel Status Reply */ - -#define MSG_TEST_MODE 17 /* Configure/Perform Test Mode */ -#define MSG_TEST_REPLY 18 /* Configure/Perform Test Mode Reply */ - -#define MSG_ALG_CONTROL 27 /* algorithm control */ -#define MSG_ALG_CONTROL_REPLY 28 /* algorithm control reply */ -#define MSG_GET_TXCID_ADDRESS 29 /* get tx cid buffer start address */ -#define MSG_GET_TXCID_ADDRESS_REPLY 30 /* get tx cid buffer start addr reply */ - -#define MSG_PING 35 /* ping command */ -#define MSG_PING_REPLY 36 /* ping command reply */ -#define MSG_SERIAL_TXVAL 37 /* transmit serial fixed value */ -#define MSG_SERIAL_TXVAL_REPLY 38 /* transmit serial fixed value reply */ -#define MSG_TDM_LOOPBACK 39 /* tdm loopback control */ -#define MSG_TDM_LOOPBACK_REPLY 40 /* tdm loopback control reply */ -#define MSG_RESET_USAGE_STATS 41 /* reset cpu usage stats */ -#define MSG_RESET_USAGE_STATS_REPLY 42 /* reset cpu usage stats reply */ - -#define MSG_RESET_FRAME_STATS 47 /* reset framing stats */ -#define MSG_RESET_FRAME_STATS_REPLY 48 /* reset framing stats reply */ - -#define MSG_READ_DSP_MEMORY 49 /* read small section of DSP's memory */ -#define MSG_READ_DSP_MEMORY_REPLY 50 /* read memory reply */ - -#define MSG_ACCESSGPIO 51 -#define MSG_ACCESSGPIO_REPLY 52 -#endif /* prevent multiple inclusion */ diff --git a/drivers/dahdi/wctdm24xxp/Kbuild b/drivers/dahdi/wctdm24xxp/Kbuild index 69eddc3..6b1d0e7 100644 --- a/drivers/dahdi/wctdm24xxp/Kbuild +++ b/drivers/dahdi/wctdm24xxp/Kbuild @@ -1,18 +1,5 @@ obj-$(DAHDI_BUILD_ALL)$(CONFIG_DAHDI_WCTDM24XXP) += wctdm24xxp.o -FIRM_DIR := ../firmware - EXTRA_CFLAGS += -I$(src)/.. -Wno-undef -ifeq ($(HOTPLUG_FIRMWARE),yes) - EXTRA_CFLAGS+=-DHOTPLUG_FIRMWARE -endif - -wctdm24xxp-objs := base.o GpakCust.o GpakApi.o voicebus.o - -ifneq ($(HOTPLUG_FIRMWARE),yes) -wctdm24xxp-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 +wctdm24xxp-objs := base.o diff --git a/drivers/dahdi/wctdm24xxp/base.c b/drivers/dahdi/wctdm24xxp/base.c index da48cfe..9a6a8ce 100644 --- a/drivers/dahdi/wctdm24xxp/base.c +++ b/drivers/dahdi/wctdm24xxp/base.c @@ -4,7 +4,7 @@ * Written by Mark Spencer <markster@digium.com> * Support for TDM800P and VPM150M by Matthew Fredrickson <creslin@digium.com> * - * Copyright (C) 2005 - 2008 Digium, Inc. + * Copyright (C) 2005 - 2009 Digium, Inc. * All rights reserved. * * Sections for QRV cards written by Jim Dixon <jim@lambdatel.com> @@ -58,12 +58,10 @@ Tx Gain - W/Pre-Emphasis: -23.99 to 0.00 db #include "wctdm24xxp.h" -#ifdef VPM150M_SUPPORT #include "adt_lec.h" -#endif -#include "GpakCust.h" -#include "GpakApi.h" +#include "voicebus/GpakCust.h" +#include "voicebus/GpakApi.h" /* Experimental max loop current limit for the proslic @@ -213,11 +211,8 @@ static int neonmwi_envelope = 10; static int neonmwi_offlimit = 16000; /* Time in milliseconds the monitor is checked before saying no message is waiting */ static int neonmwi_offlimit_cycles; /* Time in milliseconds the monitor is checked before saying no message is waiting */ -#ifdef VPM_SUPPORT static int vpmsupport = 1; -static int vpmdtmfsupport = 0; -#define VPM_DEFAULT_DTMFTHRESHOLD 1250 -static int dtmfthreshold = VPM_DEFAULT_DTMFTHRESHOLD; + /* * This parameter is used to adjust the NLP type used. The options are: * 0 : None @@ -232,7 +227,6 @@ static int vpmnlptype = 1; static int vpmnlpthresh = 24; /* See vpmnlptype = 4 for more info */ static int vpmnlpmaxsupp = 0; -#endif static int wctdm_init_proslic(struct wctdm *wc, int card, int fast , int manual, int sane); @@ -276,12 +270,193 @@ static inline int empty_slot(struct wctdm *wc, int card) return -1; } -#ifdef VPM_SUPPORT -static inline void cmd_dequeue_vpm150m(struct wctdm *wc, volatile unsigned char *writechunk, int whichframe) +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; + chanconfig->PcmOutPortA = SerialPortNull; + chanconfig->PcmOutSlotA = channel; + chanconfig->PcmInPortB = 2; + chanconfig->PcmInSlotB = channel; + chanconfig->PcmOutPortB = 3; + chanconfig->PcmOutSlotB = channel; + 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; + + switch (vpm->span->deflaw) { + case DAHDI_LAW_MULAW: + chanconfig->SoftwareCompand = cmpPCMU; + break; + case DAHDI_LAW_ALAW: + chanconfig->SoftwareCompand = cmpPCMA; + break; + default: + chanconfig->SoftwareCompand = cmpPCMU; + break; + } + + chanconfig->FrameRate = rate2ms; + 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.EcanNlpThreshold = vpm->curecstate[channel].nlp_threshold; + chanconfig->EcanParametersA.EcanNlpConv = 0; + chanconfig->EcanParametersA.EcanNlpUnConv = 0; + 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; + + memcpy(&chanconfig->EcanParametersB, + &chanconfig->EcanParametersA, + sizeof(chanconfig->EcanParametersB)); +} + +static int config_vpmadt032(struct vpmadt032 *vpm) +{ + int res, i; + 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 = SlotCfg2Groups; + portconfig.FirstBlockNum2 = 0; + portconfig.FirstSlotMask2 = 0xffff; + portconfig.SecBlockNum2 = 1; + portconfig.SecSlotMask2 = 0xffff; + portconfig.SerialWordSize2 = SerWordSize8; + portconfig.CompandingMode2 = cmpNone; + portconfig.TxFrameSyncPolarity2 = FrameSyncActHigh; + portconfig.RxFrameSyncPolarity2 = FrameSyncActHigh; + portconfig.TxClockPolarity2 = SerClockActHigh; + portconfig.RxClockPolarity2 = SerClockActLow; + portconfig.TxDataDelay2 = DataDelay0; + portconfig.RxDataDelay2 = DataDelay0; + portconfig.DxDelay2 = Disabled; + portconfig.ThirdSlotMask2 = 0x0000; + portconfig.FouthSlotMask2 = 0x0000; + portconfig.FifthSlotMask2 = 0x0000; + portconfig.SixthSlotMask2 = 0x0000; + portconfig.SevenSlotMask2 = 0x0000; + portconfig.EightSlotMask2 = 0x0000; + + /* Third Serial Port Config */ + portconfig.SlotsSelect3 = SlotCfg2Groups; + portconfig.FirstBlockNum3 = 0; + portconfig.FirstSlotMask3 = 0xffff; + portconfig.SecBlockNum3 = 1; + portconfig.SecSlotMask3 = 0xffff; + 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 = 0x0000; + portconfig.FouthSlotMask3 = 0x0000; + portconfig.FifthSlotMask3 = 0x0000; + 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 (i = 0; i < vpm->span->channels; ++i) { + vpm->curecstate[i].tap_length = 0; + vpm->curecstate[i].nlp_type = vpm->options.vpmnlptype; + vpm->curecstate[i].nlp_threshold = vpm->options.vpmnlpthresh; + vpm->curecstate[i].nlp_max_suppress = vpm->options.vpmnlpmaxsupp; + memcpy(&vpm->desiredecstate[i], &vpm->curecstate[i], sizeof(vpm->curecstate[i])); + + /* set_vpmadt032_chanconfig_from_state(&vpm->curecstate[i], &vpm->options, i, &chanconfig); !!! */ + vpm->setchanconfig_from_state(vpm, i, &chanconfig); + if ((res = gpakConfigureChannel(vpm->dspid, i, tdmToTdm, &chanconfig, &cstatus))) { + printk(KERN_NOTICE "Unable to configure channel #%d (%d)", i, res); + if (res == 1) { + printk(", reason %d", cstatus); + } + printk("\n"); + return -1; + } + + if ((res = gpakAlgControl(vpm->dspid, i, BypassEcanA, &algstatus))) { + printk(KERN_NOTICE "Unable to disable echo can on channel %d (reason %d:%d)\n", i + 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 inline void cmd_dequeue_vpmadt032(struct wctdm *wc, unsigned char *writechunk, int whichframe) { unsigned long flags; - struct vpm150m_cmd *curcmd = NULL; - struct vpm150m *vpm150m = wc->vpm150m; + struct vpmadt032_cmd *curcmd = NULL; + struct vpmadt032 *vpmadt032 = wc->vpmadt032; int x; unsigned char leds = ~((wc->intcount / 1000) % 8) & 0x7; @@ -290,14 +465,14 @@ static inline void cmd_dequeue_vpm150m(struct wctdm *wc, volatile unsigned char spin_lock_irqsave(&wc->reglock, flags); - if (test_bit(VPM150M_SPIRESET, &vpm150m->control) || test_bit(VPM150M_HPIRESET, &vpm150m->control)) { + if (test_bit(VPM150M_SPIRESET, &vpmadt032->control) || test_bit(VPM150M_HPIRESET, &vpmadt032->control)) { if (debug & DEBUG_ECHOCAN) printk(KERN_INFO "HW Resetting VPMADT032...\n"); for (x = 24; x < 28; x++) { if (x == 24) { - if (test_and_clear_bit(VPM150M_SPIRESET, &vpm150m->control)) + if (test_and_clear_bit(VPM150M_SPIRESET, &vpmadt032->control)) writechunk[CMD_BYTE(x, 0, 0)] = 0x08; - else if (test_and_clear_bit(VPM150M_HPIRESET, &vpm150m->control)) + else if (test_and_clear_bit(VPM150M_HPIRESET, &vpmadt032->control)) writechunk[CMD_BYTE(x, 0, 0)] = 0x0b; } else writechunk[CMD_BYTE(x, 0, 0)] = 0x00 | leds; @@ -308,20 +483,11 @@ static inline void cmd_dequeue_vpm150m(struct wctdm *wc, volatile unsigned char return; } - - /* Search for something waiting to transmit */ - for (x = 0; x < VPM150M_MAX_COMMANDS; x++) { - if ((vpm150m->cmdq[x].desc & (__VPM150M_RD | __VPM150M_WR)) && - !(vpm150m->cmdq[x].desc & (__VPM150M_FIN | __VPM150M_TX))) { - curcmd = &vpm150m->cmdq[x]; - curcmd->txident = wc->txident; - curcmd->desc |= __VPM150M_TX; - break; - } - } - if (curcmd) { + if ((curcmd = vpmadt032_get_ready_cmd(vpmadt032))) { + curcmd->txident = wc->txident; #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); + // if (printk_ratelimit()) + printk(KERN_DEBUG "Transmitting txident = %d, desc = 0x%x, addr = 0x%x, data = 0x%x\n", curcmd->txident, curcmd->desc, curcmd->address, curcmd->data); #endif if (curcmd->desc & __VPM150M_RWPAGE) { /* Set CTRL access to page*/ @@ -336,7 +502,7 @@ static inline void cmd_dequeue_vpm150m(struct wctdm *wc, volatile unsigned char writechunk[CMD_BYTE(25, 0, 0)] = ((0x8 | 0x4 | 0x1) << 4); writechunk[CMD_BYTE(25, 1, 0)] = 0; if (curcmd->desc & __VPM150M_WR) - writechunk[CMD_BYTE(25, 2, 0)] = curcmd->data[0] & 0xf; + writechunk[CMD_BYTE(25, 2, 0)] = curcmd->data & 0xf; else writechunk[CMD_BYTE(25, 2, 0)] = 0; @@ -353,54 +519,25 @@ static inline void cmd_dequeue_vpm150m(struct wctdm *wc, volatile unsigned char } else { /* Set address */ writechunk[CMD_BYTE(24, 0, 0)] = ((0x8 | 0x4) << 4); - writechunk[CMD_BYTE(24, 1, 0)] = (curcmd->addr >> 8) & 0xff; - writechunk[CMD_BYTE(24, 2, 0)] = curcmd->addr & 0xff; + writechunk[CMD_BYTE(24, 1, 0)] = (curcmd->address >> 8) & 0xff; + writechunk[CMD_BYTE(24, 2, 0)] = curcmd->address & 0xff; /* Send/Get our data */ - if (curcmd->desc & __VPM150M_WR) { - if (curcmd->datalen > 1) - writechunk[CMD_BYTE(25, 0, 0)] = ((0x8 | (0x1 << 1)) << 4); - else - writechunk[CMD_BYTE(25, 0, 0)] = ((0x8 | (0x3 << 1)) << 4); - } else - if (curcmd->datalen > 1) - writechunk[CMD_BYTE(25, 0, 0)] = ((0x8 | (0x1 << 1) | 0x1) << 4); - else - writechunk[CMD_BYTE(25, 0, 0)] = ((0x8 | (0x3 << 1) | 0x1) << 4); - writechunk[CMD_BYTE(25, 1, 0)] = (curcmd->data[0] >> 8) & 0xff; - writechunk[CMD_BYTE(25, 2, 0)] = curcmd->data[0] & 0xff; + writechunk[CMD_BYTE(25, 0, 0)] = (curcmd->desc & __VPM150M_WR) ? + ((0x8 | (0x3 << 1)) << 4) : ((0x8 | (0x3 << 1) | 0x1) << 4); + writechunk[CMD_BYTE(25, 1, 0)] = (curcmd->data >> 8) & 0xff; + writechunk[CMD_BYTE(25, 2, 0)] = curcmd->data & 0xff; - if (curcmd->datalen > 1) { - if (curcmd->desc & __VPM150M_WR) - writechunk[CMD_BYTE(26, 0, 0)] = ((0x8 | (0x1 << 1)) << 4); - else - writechunk[CMD_BYTE(26, 0, 0)] = ((0x8 | (0x1 << 1) | 0x1) << 4); - writechunk[CMD_BYTE(26, 1, 0)] = (curcmd->data[1] >> 8) & 0xff; - writechunk[CMD_BYTE(26, 2, 0)] = curcmd->data[1] & 0xff; - } else { - /* Fill in the rest */ - writechunk[CMD_BYTE(26, 0, 0)] = 0; - writechunk[CMD_BYTE(26, 1, 0)] = 0; - writechunk[CMD_BYTE(26, 2, 0)] = 0; - } - - if (curcmd->datalen > 2) { - if (curcmd->desc & __VPM150M_WR) - writechunk[CMD_BYTE(27, 0, 0)] = ((0x8 | (0x1 << 1)) << 4); - else - writechunk[CMD_BYTE(27, 0, 0)] = ((0x8 | (0x1 << 1) | 0x1) << 4); - writechunk[CMD_BYTE(27, 1, 0)] = (curcmd->data[2] >> 8) & 0xff; - writechunk[CMD_BYTE(27, 2, 0)] = curcmd->data[2] & 0xff; - } else { - /* Fill in the rest */ - writechunk[CMD_BYTE(27, 0, 0)] = 0; - writechunk[CMD_BYTE(27, 1, 0)] = 0; - writechunk[CMD_BYTE(27, 2, 0)] = 0; - } - + writechunk[CMD_BYTE(26, 0, 0)] = 0; + writechunk[CMD_BYTE(26, 1, 0)] = 0; + writechunk[CMD_BYTE(26, 2, 0)] = 0; + /* Fill in the rest */ + writechunk[CMD_BYTE(27, 0, 0)] = 0; + writechunk[CMD_BYTE(27, 1, 0)] = 0; + writechunk[CMD_BYTE(27, 2, 0)] = 0; } - } else if (test_and_clear_bit(VPM150M_SWRESET, &vpm150m->control)) { + } else if (test_and_clear_bit(VPM150M_SWRESET, &vpmadt032->control)) { printk(KERN_INFO "Booting VPMADT032\n"); for (x = 24; x < 28; x++) { if (x == 24) @@ -421,19 +558,18 @@ static inline void cmd_dequeue_vpm150m(struct wctdm *wc, volatile unsigned char } } -#ifdef VPM150M_SUPPORT /* Add our leds in */ - for (x = 24; x < 28; x++) + for (x = 24; x < 28; x++) { writechunk[CMD_BYTE(x, 0, 0)] |= leds; + } /* Now let's figure out if we need to check for DTMF */ - if (test_bit(VPM150M_ACTIVE, &vpm150m->control) && !whichframe && !(wc->intcount % 100)) - queue_work(vpm150m->wq, &vpm150m->work); -#endif + if (test_bit(VPM150M_ACTIVE, &vpmadt032->control) && !whichframe && !(wc->intcount % 100)) { + schedule_work(&vpmadt032->work); + } spin_unlock_irqrestore(&wc->reglock, flags); } -#endif /* VPM_SUPPORT */ static inline void cmd_dequeue(struct wctdm *wc, volatile unsigned char *writechunk, int card, int pos) { @@ -519,7 +655,6 @@ static inline void cmd_dequeue(struct wctdm *wc, volatile unsigned char *writech writechunk[CMD_BYTE(card, 2, wc->altcs[card])] = 0x80; else writechunk[CMD_BYTE(card, 2, wc->altcs[card])] = 0x00; -#ifdef VPM_SUPPORT } else if (wc->modtype[card] == MOD_TYPE_VPM) { if (curcmd & __CMD_WR) writechunk[CMD_BYTE(card, 0, wc->altcs[card])] = ((card & 0x3) << 4) | 0xc | ((curcmd >> 16) & 0x1); @@ -528,7 +663,7 @@ static inline void cmd_dequeue(struct wctdm *wc, volatile unsigned char *writech writechunk[CMD_BYTE(card, 1, wc->altcs[card])] = (curcmd >> 8) & 0xff; writechunk[CMD_BYTE(card, 2, wc->altcs[card])] = curcmd & 0xff; } else if (wc->modtype[card] == MOD_TYPE_VPM150M) { -#endif + ; } else if (wc->modtype[card] == MOD_TYPE_QRV) { writechunk[CMD_BYTE(card, 0, wc->altcs[card])] = 0x00; @@ -562,42 +697,52 @@ static inline void cmd_dequeue(struct wctdm *wc, volatile unsigned char *writech #endif } -#ifdef VPM_SUPPORT -static inline void cmd_decifer_vpm150m(struct wctdm *wc, volatile unsigned char *readchunk) +static inline void cmd_decipher_vpmadt032(struct wctdm *wc, unsigned char *readchunk) { unsigned long flags; - unsigned char ident; - int x, i; + 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 += 24; - spin_lock_irqsave(&wc->reglock, flags); - /* Search for any pending results */ - for (x = 0; x < VPM150M_MAX_COMMANDS; x++) { - if ((wc->vpm150m->cmdq[x].desc & (__VPM150M_RD | __VPM150M_WR)) && - (wc->vpm150m->cmdq[x].desc & (__VPM150M_TX)) && - !(wc->vpm150m->cmdq[x].desc & (__VPM150M_FIN))) { - ident = wc->vpm150m->cmdq[x].txident; - 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((25 + i), 1, 0)]) << 8; - wc->vpm150m->cmdq[x].data[i] |= readchunk[CMD_BYTE((25 + i), 2, 0)]; - } - if (wc->vpm150m->cmdq[x].desc & __VPM150M_WR) { - /* Go ahead and clear out writes since they need no acknowledgement */ - wc->vpm150m->cmdq[x].desc = 0; - } else - wc->vpm150m->cmdq[x].desc |= __VPM150M_FIN; - break; - } - } + /* Store result */ + cmd->data = (0xff & readchunk[CMD_BYTE(25, 1, 0)]) << 8; + cmd->data |= readchunk[CMD_BYTE(25, 2, 0)]; + 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); } - spin_unlock_irqrestore(&wc->reglock, flags); +#if 0 + // if (printk_ratelimit()) + printk(KERN_DEBUG "Received txident = %d, desc = 0x%x, addr = 0x%x, data = 0x%x\n", cmd->txident, cmd->desc, cmd->address, cmd->data); +#endif } -#endif /* VPM_SUPPORT */ -static inline void cmd_decifer(struct wctdm *wc, volatile unsigned char *readchunk, int card) +static inline void cmd_decipher(struct wctdm *wc, volatile unsigned char *readchunk, int card) { unsigned long flags; unsigned char ident; @@ -700,10 +845,9 @@ static inline void wctdm_transmitprep(struct wctdm *wc, unsigned char *writechun } cmd_dequeue(wc, writechunk, y, x); } -#ifdef VPM_SUPPORT if (!x) wc->blinktimer++; - if (wc->vpm) { + if (wc->vpm100) { for (y=24;y<28;y++) { if (!x) { cmd_checkisr(wc, y); @@ -711,19 +855,19 @@ static inline void wctdm_transmitprep(struct wctdm *wc, unsigned char *writechun cmd_dequeue(wc, writechunk, y, x); } #ifdef FANCY_ECHOCAN - if (wc->vpm && wc->blinktimer >= 0xf) { + if (wc->vpm100 && wc->blinktimer >= 0xf) { wc->blinktimer = -1; wc->echocanpos++; } #endif - } else if (wc->vpm150m) { - cmd_dequeue_vpm150m(wc, writechunk, x); + } else if (wc->vpmadt032) { + cmd_dequeue_vpmadt032(wc, writechunk, x); } -#endif + if (x < DAHDI_CHUNKSIZE - 1) { writechunk[EFRAME_SIZE] = wc->ctlreg; writechunk[EFRAME_SIZE + 1] = wc->txident++; -#if 1 + if ((wc->type == 4) && ((wc->ctlreg & 0x10) || (wc->modtype[NUM_CARDS] == MOD_TYPE_NONE))) { writechunk[EFRAME_SIZE + 2] = 0; for (y = 0; y < 4; y++) { @@ -732,7 +876,6 @@ static inline void wctdm_transmitprep(struct wctdm *wc, unsigned char *writechun } } else writechunk[EFRAME_SIZE + 2] = 0xf; -#endif } writechunk += (EFRAME_SIZE + EFRAME_GAP); } @@ -814,7 +957,6 @@ static inline int wctdm_getreg(struct wctdm *wc, int card, int addr) return ret; } -#ifdef VPM_SUPPORT static inline unsigned char wctdm_vpm_in(struct wctdm *wc, int unit, const unsigned int addr) { return wctdm_getreg(wc, unit + NUM_CARDS, addr); @@ -825,22 +967,24 @@ static inline void wctdm_vpm_out(struct wctdm *wc, int unit, const unsigned int wctdm_setreg(wc, unit + NUM_CARDS, addr, val); } -static inline void cmd_vpm150m_retransmit(struct wctdm *wc) +/* TODO: this should go in the dahdi_voicebus module... */ +static inline void cmd_vpmadt032_retransmit(struct wctdm *wc) { unsigned long flags; - int x; + struct vpmadt032 *vpmadt032 = wc->vpmadt032; + struct vpmadt032_cmd *cmd, *temp; - spin_lock_irqsave(&wc->reglock, flags); - for (x = 0; x < VPM150M_MAX_COMMANDS; x++) { - if (!(wc->vpm150m->cmdq[x].desc & __VPM150M_FIN)) { - //printk(KERN_DEBUG "Retransmit!\n"); - wc->vpm150m->cmdq[x].desc &= ~(__VPM150M_TX); - } - } - spin_unlock_irqrestore(&wc->reglock, flags); + BUG_ON(!vpmadt032); + /* By moving the commands back to the pending list, they will be + * transmitted when room is available */ + spin_lock_irqsave(&vpmadt032->list_lock, flags); + list_for_each_entry_safe(cmd, temp, &vpmadt032->active_cmds, node) { + cmd->desc &= ~(__VPM150M_TX); + list_move_tail(&cmd->node, &vpmadt032->pending_cmds); + } + spin_unlock_irqrestore(&vpmadt032->list_lock, flags); } -#endif static inline void cmd_retransmit(struct wctdm *wc) { @@ -856,8 +1000,8 @@ static inline void cmd_retransmit(struct wctdm *wc) } spin_unlock_irqrestore(&wc->reglock, flags); #ifdef VPM_SUPPORT - if (wc->vpm150m) - cmd_vpm150m_retransmit(wc); + if (wc->vpmadt032) + cmd_vpmadt032_retransmit(wc); #endif } @@ -883,15 +1027,14 @@ static inline void wctdm_receiveprep(struct wctdm *wc, unsigned char *readchunk) wc->chans[y]->readchunk[x] = readchunk[y]; } } - cmd_decifer(wc, readchunk, y); + cmd_decipher(wc, readchunk, y); } -#ifdef VPM_SUPPORT - if (wc->vpm) { + if (wc->vpm100) { for (y=NUM_CARDS;y < NUM_CARDS + NUM_EC; y++) - cmd_decifer(wc, readchunk, y); - } else if (wc->vpm150m) - cmd_decifer_vpm150m(wc, readchunk); -#endif + cmd_decipher(wc, readchunk, y); + } else if (wc->vpmadt032) { + cmd_decipher_vpmadt032(wc, readchunk); + } readchunk += (EFRAME_SIZE + EFRAME_GAP); } @@ -1466,7 +1609,6 @@ static inline void wctdm_proslic_check_hook(struct wctdm *wc, int card) } -#ifdef VPM_SUPPORT static inline void wctdm_vpm_check(struct wctdm *wc, int x) { if (wc->cmdq[x].isrshadow[0]) { @@ -1486,19 +1628,18 @@ static inline void wctdm_vpm_check(struct wctdm *wc, int x) } } -#include "adt_lec.c" - -static int wctdm_echocan_with_params(struct dahdi_chan *chan, struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p) +static int wctdm_echocan_with_params(struct dahdi_chan *chan, + struct dahdi_echocanparams *ecp, struct dahdi_echocanparam *p) { struct wctdm *wc = chan->pvt; - if (wc->vpm) { + if (wc->vpm100) { int channel; int unit; channel = (chan->chanpos - 1); unit = (chan->chanpos - 1) & 0x3; - if (wc->vpm < 2) + if (wc->vpm100 < 2) channel >>= 2; if(debug & DEBUG_ECHOCAN) @@ -1510,27 +1651,13 @@ static int wctdm_echocan_with_params(struct dahdi_chan *chan, struct dahdi_echoc wctdm_vpm_out(wc,unit,channel,0x01); return 0; -#ifdef VPM150M_SUPPORT - } else if (wc->vpm150m) { - struct vpm150m *vpm150m = wc->vpm150m; - unsigned int ret; - int channo = chan->chanpos - 1; - - if ((ret = adt_lec_parse_params(&vpm150m->desiredecstate[channo], ecp, p))) - return ret; - - vpm150m->desiredecstate[channo].tap_length = ecp->tap_length; - - if (memcmp(&vpm150m->curecstate[channo], &vpm150m->desiredecstate[channo], sizeof(vpm150m->curecstate[channo])) - && test_bit(VPM150M_ACTIVE, &vpm150m->control)) - queue_work(vpm150m->wq, &vpm150m->work); - - return 0; -#endif - } else + } else if (wc->vpmadt032) { + return vpmadt032_echocan_with_params(wc->vpmadt032, + chan->chanpos-1, ecp, p); + } else { return -ENODEV; + } } -#endif static inline void wctdm_isr_misc(struct wctdm *wc) { @@ -1581,13 +1708,11 @@ static inline void wctdm_isr_misc(struct wctdm *wc) } } } -#ifdef VPM_SUPPORT - if (wc->vpm > 0) { + if (wc->vpm100 > 0) { for (x=NUM_CARDS;x<NUM_CARDS+NUM_EC;x++) { wctdm_vpm_check(wc, x); } } -#endif } static void handle_receive(void* vbb, void* context) @@ -2598,27 +2723,8 @@ static int wctdm_ioctl(struct dahdi_chan *chan, unsigned int cmd, unsigned long break; #ifdef VPM_SUPPORT case DAHDI_TONEDETECT: - if (get_user(x, (__user int *) data)) - return -EFAULT; - if (!wc->vpm && !wc->vpm150m) - return -ENOSYS; - if ((wc->vpm || wc->vpm150m) && (x && !vpmdtmfsupport)) - return -ENOSYS; - if (x & DAHDI_TONEDETECT_ON) { - set_bit(chan->chanpos - 1, &wc->dtmfmask); - } else { - clear_bit(chan->chanpos - 1, &wc->dtmfmask); - } - 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; + /* Hardware DTMF detection is not supported. */ + return -ENOSYS; #endif case DAHDI_SETPOLARITY: if (get_user(x, (__user int *) data)) @@ -3107,589 +3213,14 @@ static void wctdm_post_initialize(struct wctdm *wc) } } - if (wc->vpm) + if (wc->vpm100) { strncat(wc->span.devicetype, " with VPM100M", sizeof(wc->span.devicetype) - 1); - else if (wc->vpm150m) + } else if (wc->vpmadt032) { strncat(wc->span.devicetype, " with VPMADT032", sizeof(wc->span.devicetype) - 1); -} - -#ifdef VPM_SUPPORT - -#ifdef VPM150M_SUPPORT - -static void vpm150m_set_chanconfig_from_state(struct adt_lec_params * parms, int channum, GpakChannelConfig_t *chanconfig) -{ - chanconfig->PcmInPortA = 3; - chanconfig->PcmInSlotA = channum; - chanconfig->PcmOutPortA = SerialPortNull; - chanconfig->PcmOutSlotA = channum; - chanconfig->PcmInPortB = 2; - chanconfig->PcmInSlotB = channum; - chanconfig->PcmOutPortB = 3; - chanconfig->PcmOutSlotB = channum; - 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; - - if (alawoverride) - chanconfig->SoftwareCompand = cmpPCMA; - else - chanconfig->SoftwareCompand = cmpPCMU; - - chanconfig->FrameRate = rate2ms; - chanconfig->EcanParametersA.EcanTapLength = 1024; - chanconfig->EcanParametersA.EcanNlpType = parms->nlp_type; - chanconfig->EcanParametersA.EcanAdaptEnable = 1; - chanconfig->EcanParametersA.EcanG165DetEnable = 1; - chanconfig->EcanParametersA.EcanDblTalkThresh = 6; - chanconfig->EcanParametersA.EcanNlpThreshold = parms->nlp_threshold; - chanconfig->EcanParametersA.EcanNlpConv = 0; - chanconfig->EcanParametersA.EcanNlpUnConv = 0; - chanconfig->EcanParametersA.EcanNlpMaxSuppress = parms->nlp_max_suppress; - 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 = parms->nlp_type; - chanconfig->EcanParametersB.EcanAdaptEnable = 1; - chanconfig->EcanParametersB.EcanG165DetEnable = 1; - chanconfig->EcanParametersB.EcanDblTalkThresh = 6; - chanconfig->EcanParametersB.EcanNlpThreshold = parms->nlp_threshold; - chanconfig->EcanParametersB.EcanNlpConv = 0; - chanconfig->EcanParametersB.EcanNlpUnConv = 0; - chanconfig->EcanParametersB.EcanNlpMaxSuppress = parms->nlp_max_suppress; - chanconfig->EcanParametersB.EcanCngThreshold = 43; - chanconfig->EcanParametersB.EcanAdaptLimit = 50; - chanconfig->EcanParametersB.EcanCrossCorrLimit = 15; - chanconfig->EcanParametersB.EcanNumFirSegments = 3; - chanconfig->EcanParametersB.EcanFirSegmentLen = 64; } -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) -static void vpm150m_bh(void *data) -{ - struct vpm150m *vpm150m = data; -#else -static void vpm150m_bh(struct work_struct *data) -{ - struct vpm150m *vpm150m = container_of(data, struct vpm150m, work); -#endif - struct wctdm *wc = vpm150m->wc; - int i; - - for (i = 0; i < wc->type; 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 = wc->intcount; - GPAK_AlgControlStat_t pstatus; - int res; - - if (enable) { - res = gpakAlgControl(vpm150m->dspid, i, EnableDTMFMuteA, &pstatus); - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "DTMF mute enable took %d ms\n", wc->intcount - start); - } else { - res = gpakAlgControl(vpm150m->dspid, i, DisableDTMFMuteA, &pstatus); - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "DTMF mute disable took %d ms\n", wc->intcount - 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 = wc->intcount; - - do { - res = gpakReadEventFIFOMessage(vpm150m->dspid, &channel, &eventcode, &eventdata); - - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "ReadEventFIFOMessage took %d ms\n", wc->intcount - start); - - if (res == RefInvalidEvent || res == RefDspCommFailure) { - printk(KERN_NOTICE "VPM Comm Error\n"); - continue; - } - - if (res == RefNoEventAvail) { - continue; - } - - if (eventcode == EventToneDetect) { - GpakToneCodes_t tone = eventdata.toneEvent.ToneCode; - int duration = eventdata.toneEvent.ToneDuration; - char zaptone = vpm150mtone_to_zaptone(tone); - - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "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]; - - 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)) { - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "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)) { - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "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 != RefNoEventAvail) && (res != RefInvalidEvent) && (res != RefDspCommFailure)); - } - - for (i = 0; i < wc->type; i++) { - unsigned int start = wc->intcount; - GPAK_AlgControlStat_t pstatus; - int res = 1; - - if ((vpm150m->desiredecstate[i].nlp_type != vpm150m->curecstate[i].nlp_type) - || (vpm150m->desiredecstate[i].nlp_threshold != vpm150m->curecstate[i].nlp_threshold) - || (vpm150m->desiredecstate[i].nlp_max_suppress != vpm150m->curecstate[i].nlp_max_suppress)) { - - GPAK_ChannelConfigStat_t cstatus; - GPAK_TearDownChanStat_t tstatus; - GpakChannelConfig_t chanconfig; - - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "Reconfiguring chan %d for nlp %d, nlp_thresh %d, and max_supp %d\n", i + 1, vpm150m->desiredecstate[i].nlp_type, - vpm150m->desiredecstate[i].nlp_threshold, vpm150m->desiredecstate[i].nlp_max_suppress); - - vpm150m_set_chanconfig_from_state(&vpm150m->desiredecstate[i], i, &chanconfig); - - if ((res = gpakTearDownChannel(vpm150m->dspid, i, &tstatus))) { - goto vpm_bh_out; - } - - if ((res = gpakConfigureChannel(vpm150m->dspid, i, tdmToTdm, &chanconfig, &cstatus))) { - goto vpm_bh_out; - } - - if (!vpm150m->desiredecstate[i].tap_length) - res = gpakAlgControl(vpm150m->dspid, i, BypassEcanA, &pstatus); - - } else if (vpm150m->desiredecstate[i].tap_length != vpm150m->curecstate[i].tap_length) { - if (vpm150m->desiredecstate[i].tap_length) { - res = gpakAlgControl(vpm150m->dspid, i, EnableEcanA, &pstatus); - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "Echocan enable took %d ms\n", wc->intcount - start); - } else { - res = gpakAlgControl(vpm150m->dspid, i, BypassEcanA, &pstatus); - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "Echocan disable took %d ms\n", wc->intcount - start); - } - } - -vpm_bh_out: - if (!res) - vpm150m->curecstate[i] = vpm150m->desiredecstate[i]; - } - - return; -} - -static int vpm150m_config_hw(struct wctdm *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 = SlotCfg2Groups; - portconfig.FirstBlockNum2 = 0; - portconfig.FirstSlotMask2 = 0xffff; - portconfig.SecBlockNum2 = 1; - portconfig.SecSlotMask2 = 0xffff; - portconfig.SerialWordSize2 = SerWordSize8; - portconfig.CompandingMode2 = cmpNone; - portconfig.TxFrameSyncPolarity2 = FrameSyncActHigh; - portconfig.RxFrameSyncPolarity2 = FrameSyncActHigh; - portconfig.TxClockPolarity2 = SerClockActHigh; - portconfig.RxClockPolarity2 = SerClockActLow; - portconfig.TxDataDelay2 = DataDelay0; - portconfig.RxDataDelay2 = DataDelay0; - portconfig.DxDelay2 = Disabled; - portconfig.ThirdSlotMask2 = 0x0000; - portconfig.FouthSlotMask2 = 0x0000; - portconfig.FifthSlotMask2 = 0x0000; - portconfig.SixthSlotMask2 = 0x0000; - portconfig.SevenSlotMask2 = 0x0000; - portconfig.EightSlotMask2 = 0x0000; - - /* Third Serial Port Config */ - portconfig.SlotsSelect3 = SlotCfg2Groups; - portconfig.FirstBlockNum3 = 0; - portconfig.FirstSlotMask3 = 0xffff; - portconfig.SecBlockNum3 = 1; - portconfig.SecSlotMask3 = 0xffff; - 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 = 0x0000; - portconfig.FouthSlotMask3 = 0x0000; - portconfig.FifthSlotMask3 = 0x0000; - portconfig.SixthSlotMask3 = 0x0000; - portconfig.SevenSlotMask3 = 0x0000; - portconfig.EightSlotMask3 = 0x0000; - - if ((configportstatus = gpakConfigurePorts(vpm150m->dspid, &portconfig, &pstatus))) { - printk(KERN_NOTICE "Configuration of ports failed (%d)!\n", configportstatus); - return -1; - } else { - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "Configured McBSP ports successfully\n"); - } - - if ((res = gpakPingDsp(vpm150m->dspid, &vpm150m->version))) { - printk(KERN_NOTICE "Error pinging DSP (%d)\n", res); - return -1; - } - - for (i = 0; i < wc->type; i++) { - vpm150m->curecstate[i].tap_length = 0; - vpm150m->curecstate[i].nlp_type = vpmnlptype; - vpm150m->curecstate[i].nlp_threshold = vpmnlpthresh; - vpm150m->curecstate[i].nlp_max_suppress = vpmnlpmaxsupp; - - vpm150m->desiredecstate[i].tap_length = 0; - vpm150m->desiredecstate[i].nlp_type = vpmnlptype; - vpm150m->desiredecstate[i].nlp_threshold = vpmnlpthresh; - vpm150m->desiredecstate[i].nlp_max_suppress = vpmnlpmaxsupp; - - vpm150m_set_chanconfig_from_state(&vpm150m->curecstate[i], i, &chanconfig); - - if ((res = gpakConfigureChannel(vpm150m->dspid, i, tdmToTdm, &chanconfig, &cstatus))) { - printk(KERN_NOTICE "Unable to configure channel (%d)", res); - if (res == 1) { - printk(", reason %d", cstatus); - } - printk("\n"); - - return -1; - } - - if ((res = gpakAlgControl(vpm150m->dspid, i, BypassEcanA, &algstatus))) { - printk(KERN_NOTICE "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))) { - printk(KERN_NOTICE "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))) { - printk(KERN_NOTICE "Error pinging DSP (%d)\n", res); - return -1; - } - - vpm150m->wq = create_singlethread_workqueue("wctdm24xxp"); - vpm150m->wc = wc; - - if (!vpm150m->wq) { - printk(KERN_NOTICE "Unable to create work queue!\n"); - return -1; - } - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) - INIT_WORK(&vpm150m->work, vpm150m_bh, vpm150m); -#else - INIT_WORK(&vpm150m->work, vpm150m_bh); -#endif - - /* Turn on DTMF detection */ - if (vpmdtmfsupport) - set_bit(VPM150M_DTMFDETECT, &vpm150m->control); - - set_bit(VPM150M_ACTIVE, &vpm150m->control); - - return 0; -} -#endif /* VPM150M_SUPPORT */ - -enum vpmadt032_init_result { - VPMADT032_SUCCESS, - VPMADT032_NOT_FOUND, - VPMADT032_FAILED, - VPMADT032_DISABLED, -}; - -static enum vpmadt032_init_result wctdm_vpm150m_init(struct wctdm *wc) -{ - unsigned short i; - struct vpm150m *vpm150m; - unsigned short reg; - unsigned long flags; - enum vpmadt032_init_result res = VPMADT032_FAILED; - -#ifdef VPM150M_SUPPORT - struct wctdm_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 - gpakDownloadStatus_t downloadstatus; - gpakPingDspStat_t pingstatus; -#endif - - if (!vpmsupport) { - printk(KERN_NOTICE "VPM: Support Disabled\n"); - wc->vpm150m = NULL; - return VPMADT032_DISABLED; - } - - vpm150m = kmalloc(sizeof(struct vpm150m), GFP_KERNEL); - - if (!vpm150m) { - printk(KERN_NOTICE "Unable to allocate VPM150M!\n"); - return VPMADT032_FAILED; - } - - memset(vpm150m, 0, sizeof(struct vpm150m)); - - /* Init our vpm150m struct */ - sema_init(&vpm150m->sem, 1); - vpm150m->curpage = 0x80; - - for (i = 0; i < WC_MAX_IFACES; i++) { - if (ifaces[i] == wc) - vpm150m->dspid = i; - } - - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "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++) - schluffen(&wc->regq); - - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "VPMADT032 Testing page access: "); - for (i = 0; i < 0xf; i++) { - int x; - for (x = 0; x < 3; x++) { - wctdm_vpm150m_setpage(wc, i); - reg = wctdm_vpm150m_getpage(wc); - if (reg != i) { - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "Failed: Sent %x != %x VPMADT032 Failed HI page test\n", i, reg); - res = VPMADT032_NOT_FOUND; - goto failed_exit; - } - } - } - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "Passed\n"); - - /* Set us up to page 0 */ - wctdm_vpm150m_setpage(wc, 0); - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "VPMADT032 now doing address test: "); - for (i = 0; i < 16; i++) { - int x; - for (x = 0; x < 2; x++) { - wctdm_vpm150m_setreg(wc, 1, 0x1000, &i); - wctdm_vpm150m_getreg(wc, 1, 0x1000, ®); - if (reg != i) { - printk("VPMADT032 Failed address test\n"); - goto failed_exit; - } - - } - } - if (debug & DEBUG_ECHOCAN) - printk("Passed\n"); - -#ifndef VPM150M_SUPPORT - printk(KERN_NOTICE "Found VPMADT032 module but it is not able to function in anything less than a version 2.6 kernel\n"); - printk(KERN_NOTICE "Please update your kernel to a 2.6 or later kernel to enable it\n"); - goto failed_exit; -#else - -#if 0 - /* Load the firmware */ - set_bit(VPM150M_SPIRESET, &vpm150m->control); - - /* Wait for it to boot */ - msleep(7000); - - pingstatus = gpakPingDsp(vpm150m->dspid, &version); - - if (pingstatus || (version != 0x106)) { -#endif -#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)) - schluffen(&wc->regq); - - printk(KERN_INFO "VPMADT032 Loading firmware... "); - downloadstatus = gpakDownloadDsp(vpm150m->dspid, &fw); - - if (firmware != &embedded_firmware) - release_firmware(firmware); - - if (downloadstatus != 0) { - printk("Unable to download firmware to VPMADT032 with cause %d\n", downloadstatus); - goto failed_exit; - } else { - printk("Success\n"); - } - - set_bit(VPM150M_SWRESET, &vpm150m->control); - - while (test_bit(VPM150M_SWRESET, &vpm150m->control)) - schluffen(&wc->regq); - -#if 0 - } -#endif - - pingstatus = gpakPingDsp(vpm150m->dspid, &vpm150m->version); - - if (!pingstatus) { - if (debug & DEBUG_ECHOCAN) - printk(KERN_DEBUG "Version of DSP is %x\n", vpm150m->version); - } else { - printk(KERN_NOTICE "VPMADT032 Failed! Unable to ping the DSP (%d)!\n", pingstatus); - goto failed_exit; - } - - if (vpm150m_config_hw(wc)) { - goto failed_exit; - } - - return VPMADT032_SUCCESS; -#endif /* VPM150M_SUPPORT */ - -failed_exit: - spin_lock_irqsave(&wc->reglock, flags); - wc->vpm150m = NULL; - spin_unlock_irqrestore(&wc->reglock, flags); - kfree(vpm150m); - - return res; -} - -static void wctdm_vpm_set_dtmf_threshold(struct wctdm *wc, unsigned int threshold) -{ - unsigned int x; - - for (x = 0; x < 4; x++) { - wctdm_vpm_out(wc, x, 0xC4, (threshold >> 8) & 0xFF); - wctdm_vpm_out(wc, x, 0xC5, (threshold & 0xFF)); - } - printk(KERN_INFO "VPM: DTMF threshold set to %d\n", threshold); -} - -static void wctdm_vpm_init(struct wctdm *wc) +static int wctdm_vpm_init(struct wctdm *wc) { unsigned char reg; unsigned int mask; @@ -3697,20 +3228,14 @@ static void wctdm_vpm_init(struct wctdm *wc) unsigned char vpmver=0; unsigned int i, x, y; - if (!vpmsupport) { - printk(KERN_INFO "VPM: Support Disabled\n"); - wc->vpm = 0; - return; - } - for (x=0;x<NUM_EC;x++) { ver = wctdm_vpm_in(wc, x, 0x1a0); /* revision */ if (debug & DEBUG_ECHOCAN) printk(KERN_DEBUG "VPM100: Chip %d: ver %02x\n", x, ver); if (ver != 0x33) { printk(KERN_DEBUG "VPM100: %s\n", x ? "Inoperable" : "Not Present"); - wc->vpm = 0; - return; + wc->vpm100 = 0; + return -ENODEV; } if (!x) { @@ -3801,13 +3326,13 @@ static void wctdm_vpm_init(struct wctdm *wc) wctdm_vpm_out(wc, x, i, 0xff); } - /* set DTMF detection threshold */ - wctdm_vpm_set_dtmf_threshold(wc, dtmfthreshold); - if (vpmver == 0x01) - wc->vpm = 2; - else - wc->vpm = 1; + /* TODO: What do the different values for vpm100 mean? */ + if (vpmver == 0x01) { + wc->vpm100 = 2; + } else { + wc->vpm100 = 1; + } printk(KERN_INFO "Enabling VPM100 gain adjustments on any FXO ports found\n"); for (i = 0; i < wc->type; i++) { @@ -3822,9 +3347,79 @@ static void wctdm_vpm_init(struct wctdm *wc) } } + return 0; } -#endif +static void get_default_portconfig(GpakPortConfig_t *portconfig) +{ + 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 = SlotCfg2Groups; + portconfig->FirstBlockNum2 = 0; + portconfig->FirstSlotMask2 = 0xffff; + portconfig->SecBlockNum2 = 1; + portconfig->SecSlotMask2 = 0xffff; + portconfig->SerialWordSize2 = SerWordSize8; + portconfig->CompandingMode2 = cmpNone; + portconfig->TxFrameSyncPolarity2 = FrameSyncActHigh; + portconfig->RxFrameSyncPolarity2 = FrameSyncActHigh; + portconfig->TxClockPolarity2 = SerClockActHigh; + portconfig->RxClockPolarity2 = SerClockActLow; + portconfig->TxDataDelay2 = DataDelay0; + portconfig->RxDataDelay2 = DataDelay0; + portconfig->DxDelay2 = Disabled; + portconfig->ThirdSlotMask2 = 0x0000; + portconfig->FouthSlotMask2 = 0x0000; + portconfig->FifthSlotMask2 = 0x0000; + portconfig->SixthSlotMask2 = 0x0000; + portconfig->SevenSlotMask2 = 0x0000; + portconfig->EightSlotMask2 = 0x0000; + + /* Third Serial Port Config */ + portconfig->SlotsSelect3 = SlotCfg2Groups; + portconfig->FirstBlockNum3 = 0; + portconfig->FirstSlotMask3 = 0xffff; + portconfig->SecBlockNum3 = 1; + portconfig->SecSlotMask3 = 0xffff; + 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 = 0x0000; + portconfig->FouthSlotMask3 = 0x0000; + portconfig->FifthSlotMask3 = 0x0000; + portconfig->SixthSlotMask3 = 0x0000; + portconfig->SevenSlotMask3 = 0x0000; + portconfig->EightSlotMask3 = 0x0000; +} static int wctdm_locate_modules(struct wctdm *wc) { @@ -3838,11 +3433,9 @@ static int wctdm_locate_modules(struct wctdm *wc) wc->span.irqmisses = 0; for (x=0;x<wc->cards;x++) wc->modtype[x] = MOD_TYPE_FXSINIT; -#ifdef VPM_SUPPORT - wc->vpm = -1; + wc->vpm100 = -1; for (x = wc->cards; x < wc->cards+NUM_EC; x++) wc->modtype[x] = MOD_TYPE_VPM; -#endif spin_unlock_irqrestore(&wc->reglock, flags); /* Wait just a bit */ for (x=0;x<10;x++) @@ -3926,40 +3519,61 @@ retry: } } } -#ifdef VPM_SUPPORT - wctdm_vpm_init(wc); - if (wc->vpm) { - printk(KERN_INFO "VPM: Present and operational (Rev %c)\n", 'A' + wc->vpm - 1); + + if (!vpmsupport) { + printk(KERN_NOTICE "VPM: Support Disabled\n"); + } else if (!wctdm_vpm_init(wc)) { + printk(KERN_INFO "VPM: Present and operational (Rev %c)\n", 'A' + wc->vpm100 - 1); wc->ctlreg |= 0x10; } else { - enum vpmadt032_init_result res; + int res; + struct vpmadt032_options options; + GpakPortConfig_t portconfig; + spin_lock_irqsave(&wc->reglock, flags); for (x = NUM_CARDS; x < NUM_CARDS + NUM_EC; x++) wc->modtype[x] = MOD_TYPE_NONE; spin_unlock_irqrestore(&wc->reglock, flags); - res = wctdm_vpm150m_init(wc); + + options.debug = debug; + options.vpmnlptype = vpmnlptype; + options.vpmnlpthresh = vpmnlpthresh; + options.vpmnlpmaxsupp = vpmnlpmaxsupp; + + if (!(wc->vpmadt032=vpmadt032_alloc(&options))) { + return -ENOMEM; + } + wc->vpmadt032->setchanconfig_from_state = setchanconfig_from_state; + wc->vpmadt032->context = wc; + wc->vpmadt032->span = &wc->span; + get_default_portconfig(&portconfig); + res = vpmadt032_init(wc->vpmadt032, wc->vb); /* In case there was an error while we were loading the VPM module. */ if (voicebus_current_latency(wc->vb) > startinglatency) { + vpmadt032_free(wc->vpmadt032); + wc->vpmadt032 = NULL; return -EAGAIN; } - switch (res) { - case VPMADT032_SUCCESS: - printk(KERN_INFO "VPMADT032: Present and operational (Firmware version %x)\n", wc->vpm150m->version); - wc->ctlreg |= 0x10; - break; - case VPMADT032_DISABLED: - case VPMADT032_NOT_FOUND: - /* nothing */ - break; - default: - return -EIO; + if (res) { + vpmadt032_free(wc->vpmadt032); + wc->vpmadt032 = NULL; + return res; + } + + /* Now we need to configure the VPMADT032 module for this + * particular board. */ + res = config_vpmadt032(wc->vpmadt032); + if (res) { + vpmadt032_free(wc->vpmadt032); + wc->vpmadt032 = NULL; + return res; } + + printk(KERN_INFO "VPMADT032: Present and operational (Firmware version %x)\n", wc->vpmadt032->version); + /* TODO what is 0x10 in this context? */ + wc->ctlreg |= 0x10; } -#endif - /* In case there was an error while we were loading the VPM module. */ - if (voicebus_current_latency(wc->vb) > startinglatency) { - return -EAGAIN; - } + return 0; } @@ -4112,40 +3726,30 @@ static void wctdm_release(struct wctdm *wc) static void __devexit wctdm_remove_one(struct pci_dev *pdev) { struct wctdm *wc = pci_get_drvdata(pdev); - -#ifdef VPM150M_SUPPORT - unsigned long flags; - struct vpm150m *vpm150m = wc->vpm150m; -#endif + struct vpmadt032 *vpm = wc->vpmadt032; if (wc) { - -#ifdef VPM150M_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) { + clear_bit(VPM150M_DTMFDETECT, &vpm->control); + clear_bit(VPM150M_ACTIVE, &vpm->control); + flush_scheduled_work(); } -#endif + voicebus_stop(wc->vb); -#ifdef VPM150M_SUPPORT - if (vpm150m) { - spin_lock_irqsave(&wc->reglock, flags); - wc->vpm150m = NULL; - vpm150m->wc = NULL; - spin_unlock_irqrestore(&wc->reglock, flags); - kfree(wc->vpm150m); + if (vpm) { + vpmadt032_free(wc->vpmadt032); + wc->vpmadt032 = NULL; } -#endif + /* Release span, possibly delayed */ if (!wc->usecount) { wctdm_release(wc); printk(KERN_INFO "Freed a Wildcard\n"); } - else + else { wc->dead = 1; + } } } @@ -4245,8 +3849,6 @@ module_param(neonmwi_envelope, int, 0600); module_param(neonmwi_offlimit, int, 0600); #ifdef VPM_SUPPORT module_param(vpmsupport, int, 0600); -module_param(vpmdtmfsupport, int, 0600); -module_param(dtmfthreshold, int, 0600); module_param(vpmnlptype, int, 0600); module_param(vpmnlpthresh, int, 0600); module_param(vpmnlpmaxsupp, int, 0600); diff --git a/drivers/dahdi/wctdm24xxp/gpakErrs.h b/drivers/dahdi/wctdm24xxp/gpakErrs.h deleted file mode 100644 index c36a1b7..0000000 --- a/drivers/dahdi/wctdm24xxp/gpakErrs.h +++ /dev/null @@ -1,154 +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/wctdm24xxp/gpakenum.h b/drivers/dahdi/wctdm24xxp/gpakenum.h deleted file mode 100644 index f488a81..0000000 --- a/drivers/dahdi/wctdm24xxp/gpakenum.h +++ /dev/null @@ -1,191 +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/wctdm24xxp/voicebus.c b/drivers/dahdi/wctdm24xxp/voicebus.c deleted file mode 120000 index 6653619..0000000 --- a/drivers/dahdi/wctdm24xxp/voicebus.c +++ /dev/null @@ -1 +0,0 @@ -../voicebus.c
\ No newline at end of file diff --git a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h index f8da786..4bb90b7 100644 --- a/drivers/dahdi/wctdm24xxp/wctdm24xxp.h +++ b/drivers/dahdi/wctdm24xxp/wctdm24xxp.h @@ -4,7 +4,7 @@ * Written by Mark Spencer <markster@digium.com> * Support for TDM800P and VPM150M by Matthew Fredrickson <creslin@digium.com> * - * Copyright (C) 2005, 2006, Digium, Inc. + * Copyright (C) 2005-2009 Digium, Inc. * * All rights reserved. * @@ -28,7 +28,6 @@ #include <dahdi/kernel.h> -#include "../voicebus.h" #include <linux/version.h> #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) #include <linux/semaphore.h> @@ -36,6 +35,8 @@ #include <asm/semaphore.h> #endif +#include "voicebus/voicebus.h" + #define NUM_FXO_REGS 60 #define WC_MAX_IFACES 128 @@ -76,8 +77,6 @@ #define SDI_DREAD (0x00040000) #define SDI_DIN (0x00080000) -#define PCI_WINDOW_SIZE ((2 * 2 * 2 * SFRAME_SIZE) + (2 * ERING_SIZE * 4)) - #define __CMD_RD (1 << 20) /* Read Operation */ #define __CMD_WR (1 << 21) /* Write Operation */ #define __CMD_FIN (1 << 22) /* Has finished receive */ @@ -103,26 +102,11 @@ #define MAX_COMMANDS (USER_COMMANDS + ISR_COMMANDS) -#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 #define VPM_SUPPORT @@ -138,36 +122,8 @@ #endif #ifdef VPM150M_SUPPORT -#include "adt_lec.h" -#endif - -struct vpm150m_cmd { - unsigned int addr; - unsigned char datalen; - unsigned char desc; - unsigned char txident; - unsigned short data[VPM150M_MAX_DATA]; -}; - -struct vpm150m { -#ifdef VPM150M_SUPPORT - struct workqueue_struct *wq; - struct work_struct work; +#include "voicebus/GpakCust.h" #endif - struct wctdm *wc; - - int dspid; - struct semaphore sem; - unsigned long control; - unsigned char curpage; - unsigned short version; - struct adt_lec_params curecstate[24]; - struct adt_lec_params desiredecstate[24]; - unsigned long curdtmfmutestate; - unsigned long desireddtmfmutestate; - struct vpm150m_cmd cmdq[VPM150M_MAX_COMMANDS]; - unsigned char curtone[24]; -}; struct calregs { unsigned char vals[NUM_CAL_REGS]; @@ -261,22 +217,22 @@ struct wctdm { /* Set hook */ int sethook[NUM_CARDS + NUM_EC]; int dacssrc[NUM_CARDS]; + /* Type is the maximum number of FXO/FXS ports supported */ int type; -#ifdef VPM_SUPPORT - int vpm; + int vpm100; + unsigned long dtmfactive; unsigned long dtmfmask; unsigned long dtmfmutemask; short dtmfenergy[NUM_CARDS]; short dtmfdigit[NUM_CARDS]; - struct vpm150m *vpm150m; + struct vpmadt032 *vpmadt032; #ifdef FANCY_ECHOCAN int echocanpos; int blinktimer; #endif -#endif struct voicebus *vb; struct dahdi_chan *chans[NUM_CARDS]; int initialized; |