/** * \file dsl_hal_support.c * * \author Copyright (C) 2001-2006 Texas Instruments Incorporated. * * \brief This file contains DSL HAL support function source code. * * \date 18May06 0.00.00 EP Created: Ported from AR7. * 05Oct06 0.00.01 AV Adding DSP mailbox log and re-added the NOT_DRV_BUILD flag. * 12Oct06 0.00.02 EP Added UR8 ATM TC statistics reporting. * 19Oct06 0.00.03 EP Fixed UR8 ATM TC statistics reporting. * 13Dec06 0.00.04 EP CQ11241: Delayed showtime until DSP_ACTIVE. * 15Dec06 0.00.05 EP Set mhzFalg to 1 by default and fixed counters. * 01Feb07 0.00.06 EP CQ11413: Fixed showtime counter. * 09Feb07 0.00.06 EP CQ11354:Change dsMargin read to account for it being made 16 bits * Merge of CQ11194 from AR7 * 13Feb07 0.00.07 EP CQ11354: Fixed dsMargin reading. * 16Feb07 0.00.08 EP Fixed bug in interrupt mask setting. * 23Feb07 0.00.09 EP CQ11512: Added API for retrieving DSP heartbeat info. */ #include #include #ifndef NO_ACT #include #endif #ifdef DSL_DSP_MBOX_LOG #define MBOX_LOG DDA_printf #else #define MBOX_LOG(szFmt, args...) #endif #ifdef AFE_DIAG int runningAfeDiag = 0; #endif /*** Primary Support Function ***/ /** * \brief HOST-DSP mailbox communication message handling. * * @param ptidsl Pointer to main DSL HAL data structure. * @return ErrCode */ unsigned dslhal_support_processMailBox(tidsl_t *ptidsl, unsigned intFlag) { int cmd; int tag; int parm1,parm2; int rc; DEV_HOST_dspHostMsg_t msg; while (dslhal_support_readDspMailbox(ptidsl,&cmd, &tag, &parm1, &parm2) == DSLHAL_ERROR_NO_ERRORS ) { msg.cmd = cmd; msg.tag = tag; msg.param1 = parm1; msg.param2 = parm2; dgprintf(4,"mailbox message: 0x%x\n", msg.cmd); switch (msg.cmd) { #ifdef AFE_DIAG case DSP_QUIT_ADIAG: { extern unsigned test_status; DDA_printf("DSP_QUIT_ADIAG\n"); dgprintf(3,"DSP_QUIT_ADIAG\n"); MBOX_LOG("%s: Recieved DSP_QUIT_ADIAG\n", __FUNCTION__); if (test_status == AFE_TEST_START) test_status = AFE_TEST_STOP; break; } #endif case DSP_IDLE: { #ifdef AFE_DIAG if (runningAfeDiag) { break; } #endif dgprintf(4,"DSP_IDLE\n"); MBOX_LOG("%s: Recieved DSP_IDLE\n", __FUNCTION__); #ifndef YAMUNA if ((intFlag == 0) // if polling(intFlag=0), put some delay && (ptidsl->bAutoRetrain == 0) ) { while(ptidsl->bOverlayPageLoaded == 0) shim_osClockWait(6400); } #endif if (ptidsl->lConnected == 1) { dslhal_support_resetTrainFailureLog(ptidsl); #ifndef NO_ACT dslhal_advcfg_advancedIdleProcessing(ptidsl); #endif } ptidsl->lConnected=0; ptidsl->AppData.bState=RSTATE_IDLE; ptidsl->hybrid_selected=888; if (msg.param1) { dslhal_support_addTrainFailureLog(ptidsl, (unsigned)msg.param1); } #ifdef NOT_DRV_BUILD dslhal_support_ghsBufInit(ptidsl); #endif #ifndef YAMUNA /* add code for reload overlay pages */ if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 0) { dslhal_support_restoreTrainingInfo(ptidsl); ptidsl->bOverlayPageLoaded = 1; } #endif /* command DSP to ACTREQ */ rc = dslhal_support_writeHostMailbox(ptidsl, HOST_ACTREQ, 0, 0, 0); if (rc) return DSLHAL_ERROR_MAILBOX_WRITE; break; } case DSP_ACTMON: { dgprintf(5,"DSP_ACTMON: statechange = %d, rcv = %d, xmt = %d\n", msg.tag, msg.param1, msg.param2); MBOX_LOG("%s: Recieved DSP_ACTMON: statechange = %d, rcv = %d, xmt = %d\n", __FUNCTION__, msg.tag, msg.param1, msg.param2); break; } case DSP_ATM_TC_SYNC: { dgprintf(4,"\nDSP_ATM_TC_SYNC\n"); MBOX_LOG("%s: Recieved DSP_ATM_TC_SYNC\n",__FUNCTION__); ptidsl->lConnected=1; #ifndef YAMUNA if(ptidsl->bAutoRetrain == 0 && ptidsl->bOverlayPageLoaded == 1) { dslhal_support_clearTrainingInfo(ptidsl); ptidsl->bOverlayPageLoaded = 0; } #endif /* moved here from driver codei. -ep */ if(ptidsl->AppData.TrainedMode < 5) { dslhal_support_getCMsgsRa(ptidsl); } break; } case DSP_ACTIVE: { ptidsl->AppData.showtimeCount ++; ptidsl->lConnected=0; ptidsl->AppData.bState = RSTATE_SHOWTIME; dgprintf(4,"DSP_ACTIVE"); MBOX_LOG("%s: Recieved DSP_ACTIVE\n",__FUNCTION__); /* Local variable initialization, -ep20060208 */ dslhal_support_updateTrainMode(ptidsl); #if 1 // LOF CQ10226 // clean the LOF and LPR flags/counters. ptidsl->AppData.LOF_f = 0; ptidsl->AppData.LOF_errors = 0; ptidsl->AppData.coLOF_f = 0; ptidsl->AppData.coLofErrors = 0; ptidsl->AppData.LPR = 0; // clear Loss-of-Power primitive #endif break; } case DSP_ATM_NO_TC_SYNC: { dgprintf(4,"\nDSP_ATM_TC_NOSYNC\n"); MBOX_LOG("%s: Recieved DSP_ATM_TC_NOSYNC\n",__FUNCTION__); ptidsl->lConnected=0; /* add code for reload overlay pages */ break; } #ifndef YAMUNA case DSP_OVERLAY_START: { dgprintf(2,"DSP_OVERLAY_START: %d \n", msg.tag); break; } case DSP_OVERLAY_END: { dgprintf(2,"DSP_OVERLAY_END: %d \n", msg.tag); rc = dslhal_support_checkOverlayPage(ptidsl, msg.tag); if(rc == DSLHAL_ERROR_OVERLAY_CORRUPTED) { dgprintf(0,"Overlay Page: %d CORRUPTED \n", msg.tag); return(DSLHAL_ERROR_OVERLAY_CORRUPTED); } break; } #endif case DSP_HYBRID: { dgprintf(2,"DSP_HYBRID (Hybrid Metrics Avail)\n"); MBOX_LOG("%s: Recieved DSP_HYBRID (Hybrid Metrics Avail)\n", __FUNCTION__); ptidsl->hybrid_selected = msg.tag; break; } case DSP_XMITBITSWAP: { dgprintf(4,"DSP_XMITBITSWAP\n"); MBOX_LOG("%s: Recieved DSP_XMITBITSWAP\n",__FUNCTION__); #ifndef NO_ACT rc = dslhal_advcfg_aocBitSwapProcessing(ptidsl,0); #endif break; } case DSP_RCVBITSWAP: { dgprintf(4, "DSP_RCVBITSWAP\n"); MBOX_LOG("%s: Recieved DSP_RCVBITSWAP\n", __FUNCTION__); #ifndef NO_ACT rc = dslhal_advcfg_aocBitSwapProcessing(ptidsl,1); #endif break; } case DSP_GHSMSG: { dgprintf(3,"DSP_GHSMSG: Rcvd bytes: %d \n", msg.tag); MBOX_LOG("%s: Recieved DSP_GHSMSG: Rcvd bytes: %d \n", __FUNCTION__, msg.tag); #ifdef NOT_DRV_BUILD rc = dslhal_support_ghsMsgGet(ptidsl, msg.tag); #endif break; } case DSP_CRATES1: { dgprintf(3,"DSP_CRATES1: (C-Rates1 Ready)\n"); MBOX_LOG("%s: Recieved DSP_CRATES1: (C-Rates1 Ready)\n",__FUNCTION__); rc = dslhal_support_gatherRateMessages(ptidsl); break; } case DSP_SNR: { dgprintf(3,"DSP_SNR: SNR Data Ready\n"); MBOX_LOG("%s: Recieved DSP_SNR: SNR Data Ready\n", __FUNCTION__); rc = dslhal_support_gatherSnrPerBin(ptidsl, msg.tag); break; } case DSP_EOC: { dgprintf(3,"DSP_EOC message:tag=%02x, cmd1=%02x, cmd2=%02x (%s%02x)\n", msg.tag, msg.param1, msg.param2, (msg.param1 & 0x04) ? "Reg" : "Data", ((msg.param1>>5)|(msg.param2<<3))&0xFF); #ifndef NO_ACT rc = dslhal_advcfg_logEocMessages(ptidsl, msg.tag,msg.param1,msg.param2); #endif break; } case DSP_TRAINING_MSGS: { dgprintf(3,"DSP_TRAINING_MSGSi \n"); MBOX_LOG("%s: Recievied DSP_TRAINING_MSGSi \n", __FUNCTION__); rc = dslhal_support_gatherAdsl2Messages(ptidsl, msg.tag); break; } case DSP_CLEAR_EOC: { dgprintf(2, "DSP_CLEAR_EOC:tag=%02x, cmd1=%02x, cmd2=%02x\n", msg.tag, msg.param1, msg.param2); ptidsl->AppData.clear_eoc = 1; break; } case DSP_DGASP: { dgprintf(0,"\nDSP_GASP!!!\n"); ptidsl->AppData.LPR = 1; break; } #if 1 // LOF CQ10226 case DSP_LOF: { dgprintf(0,"\nDSP_LOF!!! tag=%02x, cmd1=%02x, cmd2=%02x\n", msg.tag, msg.param1, msg.param2); MBOX_LOG("%s: Recievied DSP_LOF!!! tag=%02x, cmd1=%02x, cmd2=%02x\n", __FUNCTION__, msg.tag, msg.param1, msg.param2); if (msg.param1 == 0) { ptidsl->AppData.LOF_f = msg.param2; ptidsl->AppData.LOF_errors += msg.param2; } else { ptidsl->AppData.coLOF_f = msg.param2; ptidsl->AppData.coLofErrors += msg.param2; } break; } #endif default: { dgprintf(0,"DSP_Unknown? 0x%x\n", msg.cmd); MBOX_LOG("%s: Recievied DSP_Unknown? 0x%x\n", __FUNCTION__, msg.cmd); break; } }; // switch } // while return DSLHAL_ERROR_NO_ERRORS; } /** * \brief Read one message from the mailbox. * * @param ptidsl Pointer to main DSL HAL data structure. * @param pcmd Pointer to 1st byte of message. * @param ptag Pointer to 2nd byte of message. * @param pprm1 Pointer to 3rd byte of message. * @param pprm2 Pointer to 4th byte of message. * @return ErrCode */ unsigned dslhal_support_readDspMailbox(tidsl_t *ptidsl, int *pcmd, int *ptag, int *pprm1, int *pprm2) { int rc; int cmd; int tag; int prm1; int prm2; unsigned char dspOutInx; DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface; DEV_HOST_mailboxControl_t mailboxControl; DEV_HOST_dspHostMsg_t dspMailboxMsg[DEV_HOST_DSPQUEUE_LENGTH]; dgprintf(6,"dslhal_support_readDspMailbox\n"); /* get the DSP main pointer */ pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr; rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, sizeof(DEV_HOST_dspOamSharedInterface_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /* Read in the command/response buffer */ dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p); rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p, &mailboxControl, sizeof(DEV_HOST_mailboxControl_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /* Change the endianness of the Mailbox Pointer */ mailboxControl.dspMsgBuf_p = (DEV_HOST_dspHostMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.dspMsgBuf_p); rc = dslhal_support_blockRead((PVOID)mailboxControl.dspMsgBuf_p, &dspMailboxMsg, (sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_DSPQUEUE_LENGTH)); if (rc) return DSLHAL_ERROR_BLOCK_READ; /* Extract the command/response message index */ mailboxControl.hostInInx &= 7; mailboxControl.hostOutInx &= 7; mailboxControl.dspOutInx &= 7; mailboxControl.dspInInx &= 7; /* check for messages in the mailbox */ if (mailboxControl.dspOutInx == mailboxControl.dspInInx) { return DSLHAL_ERROR_MAILBOX_NOMAIL; /* no messages to read */ } /* use bDRESPOutInx as index to DRESPMsgBuf */ cmd = dspMailboxMsg[mailboxControl.dspOutInx].cmd; tag = dspMailboxMsg[mailboxControl.dspOutInx].tag; prm1= dspMailboxMsg[mailboxControl.dspOutInx].param1; prm2= dspMailboxMsg[mailboxControl.dspOutInx].param2; mailboxControl.dspOutInx++; /* increment count */ mailboxControl.dspOutInx &= 7; /* only two bits */ dspOutInx = mailboxControl.dspOutInx; /* Read in the command response buffer again to take care of changes */ mailboxControl.dspOutInx = dspOutInx; rc = dslhal_support_blockWrite(&mailboxControl.dspOutInx, &dspOamSharedInterface.dspHostMailboxControl_p->dspOutInx, sizeof(BYTE)); if (rc) return DSLHAL_ERROR_BLOCK_WRITE; /* Is the input parameter address non-zero*/ if (pcmd) { *pcmd = cmd; } if (ptag) { *ptag = tag; } if (pprm1) { *pprm1 = prm1; } if (pprm2) { *pprm2 = prm2; } dgprintf(6,"dslhal_support_readDspMailbox done\n"); dgprintf(6,"cmd=%d, tag=%d\n", cmd, tag); dgprintf(6,"dslhal_support_readDspMailbox:cmd: 0x%x, tag=%d\n", cmd, tag); return DSLHAL_ERROR_NO_ERRORS; } /* end of dslhal_support_readDspMailbox() */ /** * \brief Write one message to the mailbox. * * @param ptidsl Pointer to main DSL HAL data structure. * @param cmd Pointer to 1st byte of message. * @param tag Pointer to 2nd byte of message. * @param p1 Pointer to 3rd byte of message. * @param p2 Pointer to 4th byte of message. * @return ErrCode */ unsigned dslhal_support_writeHostMailbox(tidsl_t *ptidsl, int cmd, int tag, int p1, int p2) { int rc; int index; DEV_HOST_dspOamSharedInterface_t *pdspOamSharedInterface, dspOamSharedInterface; DEV_HOST_mailboxControl_t mailboxControl; DEV_HOST_dspHostMsg_t hostMailboxMsg[DEV_HOST_HOSTQUEUE_LENGTH]; unsigned char hostInInx; dgprintf(5, "dslhal_support_writeHostMailbox: cmd = 0x%x, tag = %d\n", cmd, tag); pdspOamSharedInterface = (DEV_HOST_dspOamSharedInterfacePtr_t) ptidsl->pmainAddr; rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, sizeof(DEV_HOST_dspOamSharedInterface_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /* Read in the command/response buffer */ dspOamSharedInterface.dspHostMailboxControl_p = (DEV_HOST_mailboxControl_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspHostMailboxControl_p); rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspHostMailboxControl_p, &mailboxControl, sizeof(DEV_HOST_mailboxControl_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /* Change the endianness of the Mailbox Control Pointer */ mailboxControl.hostMsgBuf_p = (DEV_HOST_dspHostMsg_t *) dslhal_support_byteSwap32((unsigned int)mailboxControl.hostMsgBuf_p); rc = dslhal_support_blockRead((PVOID)mailboxControl.hostMsgBuf_p, &hostMailboxMsg, (sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_HOSTQUEUE_LENGTH)); if (rc) return DSLHAL_ERROR_BLOCK_READ; /* Extract the command/response message index */ mailboxControl.hostInInx &= 7; mailboxControl.hostOutInx &= 7; mailboxControl.dspOutInx &= 7; mailboxControl.dspInInx &= 7; /* make sure there's room in the mailbox */ index = mailboxControl.hostInInx; mailboxControl.hostInInx++; mailboxControl.hostInInx &= 7; hostInInx = mailboxControl.hostInInx; if (mailboxControl.hostInInx == mailboxControl.hostOutInx) { /* mailbox is full */ return DSLHAL_ERROR_MAILBOX_OVERFLOW; } /* use bOCMDInInx as index to OCMDMsgBuf */ hostMailboxMsg[index].cmd = (BYTE) cmd; hostMailboxMsg[index].tag = (BYTE) tag; hostMailboxMsg[index].param1 = (BYTE) p1; hostMailboxMsg[index].param2 = (BYTE) p2; rc = dslhal_support_blockWrite(&hostMailboxMsg, (PVOID)mailboxControl.hostMsgBuf_p, sizeof(DEV_HOST_dspHostMsg_t)*DEV_HOST_HOSTQUEUE_LENGTH); if (rc) { dgprintf(1,"dslhal_support_blockWrite failed\n"); return DSLHAL_ERROR_BLOCK_READ; } #if 0 // 10/6/05 CPH, comment out the follwing redundent code that could cause crash. rc = dslhal_support_blockWrite(&mailboxControl, &dspOamSharedInterface.dspHostMailboxControl_p, sizeof(DEV_HOST_mailboxControl_t)); if (rc) return DSLHAL_ERROR_BLOCK_WRITE; #endif /* update the index */ mailboxControl.hostInInx = hostInInx; rc = dslhal_support_blockWrite(&mailboxControl.hostInInx, &dspOamSharedInterface.dspHostMailboxControl_p->hostInInx, sizeof(BYTE)); if (rc) return DSLHAL_ERROR_BLOCK_WRITE; dgprintf(5,"dslhal_support_writeHostMailbox done\n"); return DSLHAL_ERROR_NO_ERRORS; } /* end of dslhal_support_writeHostMailbox() */ /** * \brief Modem state change handling. * * @param ptidsl Pointer to main DSL HAL data structure. * @return ErrCode */ unsigned int dslhal_support_processModemStateBitField(tidsl_t * ptidsl) { int rc, changedField; unsigned modemState[NUMBER_OF_BITFIELDS]; rc = dslhal_support_getModemState(ptidsl, (void *)(&modemState[0])); if (rc) return DSLHAL_ERROR_BLOCK_READ; for(rc=0;rc=0; rc--) { if (ptidsl->modemStateBitField[rc] != modemState[rc]) { if (modemState[rc] == 0) { /* ignore bogus data */ return DSLHAL_ERROR_NO_ERRORS; } changedField = rc+1; break; } } if (changedField == 0) { return DSLHAL_ERROR_NO_ERRORS; } else { for (rc=31; rc>=0; rc--) { if (modemState[changedField-1] & BYTE_SWAP32((1<rState = ((changedField*100) + rc); dgprintf(5,"Modem State : %d \n",ptidsl->rState); for (rc=0; rcmodemStateBitField[rc] = modemState[rc]; } } switch (changedField) { case 1: if((ptidsl->rState >= ATU_RIDLE) && (ptidsl->AppData.bState < RSTATE_IDLE)) ptidsl->AppData.bState = RSTATE_IDLE; if((ptidsl->rState >= GDMT_NSFLR) && (ptidsl->AppData.bState < RSTATE_INIT)) ptidsl->AppData.bState = RSTATE_INIT; if((ptidsl->rState >= GDMT_ACKX) && (ptidsl->AppData.bState < RSTATE_HS)) ptidsl->AppData.bState = RSTATE_HS; break; case 2: if((ptidsl->rState >= T1413_NSFLR) && (ptidsl->AppData.bState < RSTATE_INIT)) ptidsl->AppData.bState = RSTATE_INIT; if((ptidsl->rState >= T1413_ACKX) && (ptidsl->AppData.bState < RSTATE_HS)) ptidsl->AppData.bState = RSTATE_HS; #if 0 /*CQ11241*/ if((ptidsl->rState == ATU_RSHOWTIME) && (ptidsl->AppData.bState < RSTATE_SHOWTIME)) ptidsl->AppData.bState = RSTATE_SHOWTIME; #endif break; case 3: if((ptidsl->rState >= ADSL2_COMB3) && (ptidsl->AppData.bState < RSTATE_INIT)) ptidsl->AppData.bState = RSTATE_INIT; if((ptidsl->rState >= ADSL2_RPARAMS) && (ptidsl->AppData.bState < RSTATE_HS)) ptidsl->AppData.bState = RSTATE_HS; break; case 4: break; default: break; } #if 0 /*ep*/ ptidsl->stateTransition = modemStateBitFields[1]; #endif switch(ptidsl->AppData.bState) { case RSTATE_IDLE: ptidsl->AppData.idleTick=shim_osClockTick(); ptidsl->AppData.initTick=0; ptidsl->AppData.showtimeTick=0; break; case RSTATE_HS: if(!ptidsl->AppData.initTick) { ptidsl->AppData.initTick=shim_osClockTick(); } ptidsl->AppData.showtimeTick=0; break; case RSTATE_SHOWTIME: if(!ptidsl->AppData.showtimeTick) ptidsl->AppData.showtimeTick=shim_osClockTick(); break; default: break; } return DSLHAL_ERROR_NO_ERRORS; } /** * \brief Parses the Interrupt Source Bit Field. * * @param ptidsl Pointer to main DSL HAL data structure. * @return ErrCode */ unsigned dslhal_support_parseInterruptSource(tidsl_t *ptidsl, unsigned *intrSrc) { unsigned rc=0, intrCode=0; rc = dslhal_support_intrSrc(ptidsl, 1/*read*/, &intrCode); if (rc) { return (DSLHAL_ERROR_BLOCK_READ); } if (intrCode == 0) return DSLHAL_ERROR_NO_ERRORS; dgprintf(4, "dslhal_support_parseInterruptSource(): %x\n", intrCode); *intrSrc = intrCode; intrCode = 0; rc = dslhal_support_intrSrc(ptidsl, 0/*write*/, &intrCode); if (rc) return (DSLHAL_ERROR_BLOCK_WRITE); return DSLHAL_ERROR_NO_ERRORS; } /*** Data Logging Function ***/ /** * \brief Store Hlog data. * * @param ptidsl Pointer to main DSL HAL data structure. * @param index Index. * @return ErrCode */ unsigned dslhal_support_getHlog(tidsl_t *ptidsl, unsigned index) { int temVar; //,dsNumTones; dgprintf(7, "dslhal_staticapi_getHlog\n"); /* Derivation of hLog from R-MSG6-LD and R-MSG7-LD for Non-ADSL2+ */ if(ptidsl->AppData.max_ds_tones == NUM_TONE_DS_DEFAULT) { if(index < 128) { temVar=0; temVar = ((ptidsl->adsl2DiagnosticMessages.rMsg6Ld[(2*index)+3]) & 0x3); return (60 - (((temVar << 8) + (ptidsl->adsl2DiagnosticMessages.rMsg6Ld[(2*index)+2])))); } if(index > 127 && index <256) { temVar=0; temVar = ((ptidsl->adsl2DiagnosticMessages.rMsg7Ld[(2*(index-128))+3]) & 0x3); return (60 - (((temVar << 8) + (ptidsl->adsl2DiagnosticMessages.rMsg7Ld[(2*(index-128))+2])))); } } /* Derivation of hLog from R-MSGx-LD for ADSL2+ modes */ if(ptidsl->AppData.max_ds_tones == NUM_TONE_DS_ADSL2PLUS) { if(index < 128) { temVar=0; temVar = ((ptidsl->adsl2DiagnosticMessages.rMsg6Ld[(2*index)+3]) & 0x3); return (60 - (((temVar << 8) + (ptidsl->adsl2DiagnosticMessages.rMsg10Ld[(2*index)+2])))); } if(index > 127 && index <256) { temVar=0; temVar = ((ptidsl->adsl2DiagnosticMessages.rMsg11Ld[(2*(index-128))+3]) & 0x3); return (60 - (((temVar << 8) + (ptidsl->adsl2DiagnosticMessages.rMsg11Ld[(2*(index-128))+2])))); } if(index > 255 && index <384) { temVar=0; temVar = ((ptidsl->adsl2DiagnosticMessages.rMsg11Ld[(2*(index-256))+3]) & 0x3); return (60 - (((temVar << 8) + (ptidsl->adsl2DiagnosticMessages.rMsg12Ld[(2*(index-256))+2])))); } if(index > 383 && index <512) { temVar=0; temVar = ((ptidsl->adsl2DiagnosticMessages.rMsg11Ld[(2*(index-384))+3]) & 0x3); return (60 - (((temVar << 8) + (ptidsl->adsl2DiagnosticMessages.rMsg13Ld[(2*(index-384))+2])))); } } return DSLHAL_ERROR_NO_ERRORS; } /** * \brief Gather ADSL2 Training Messages. * * @param ptidsl Pointer to main DSL HAL data structure. * @param msgId Message ID. * @return ErrCode */ unsigned dslhal_support_gatherAdsl2Messages(tidsl_t *ptidsl, unsigned msgId) { unsigned adsl2MsgLoc, rc = 0; switch (msgId) { case CMSGFMT_INDEX: dgprintf(5,"C-Msg-FMT rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSGFMT_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cMsgFmt,CMSGFMT_SIZE); break; case RMSGFMT_INDEX: case RMSGFMT2_INDEX: dgprintf(5,"R-Msg-FMT rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSGFMT_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rMsgFmt,RMSGFMT_SIZE); break; case CMSGPCB_INDEX: dgprintf(5,"C-Msg-PCB rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSGPCB_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB_SIZE); ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB_SIZE; break; case CMSGPCB2_INDEX: dgprintf(5,"C-Msg-PCB2 rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSGPCB2_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB2_SIZE); ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB2_SIZE; #ifndef NO_ACT rc += dslhal_advcfg_setBlackOutBits(ptidsl); #endif break; case CMSGPCB2L_INDEX: dgprintf(5,"C-Msg-PCB2L rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSGPCB2L_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cMsgPcb,CMSGPCB2L_SIZE); ptidsl->adsl2TrainingMessages.cMsgPcbLen = CMSGPCB2L_SIZE; break; case RMSGPCB_INDEX: dgprintf(5,"R-Msg-PCB rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSGPCB_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rMsgPcb,RMSGPCB_SIZE); ptidsl->adsl2TrainingMessages.rMsgPcbLen = RMSGPCB_SIZE; break; case RMSGPCB2L_INDEX: dgprintf(5,"R-Msg-PCB 2L rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSGPCB2L_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rMsgPcb,RMSGPCB2L_SIZE); ptidsl->adsl2TrainingMessages.rMsgPcbLen = RMSGPCB2L_SIZE; break; case RMSGPCB2PL_INDEX: dgprintf(5,"R-Msg-PCB 2PL rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSGPCB2PL_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rMsgPcb,RMSGPCB2PL_SIZE); ptidsl->adsl2TrainingMessages.rMsgPcbLen = RMSGPCB2PL_SIZE; break; case CMSG1ADSL2_INDEX: dgprintf(5,"C-Msg1 rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSG1ADSL2_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cMsg1,CMSG1ADSL2_SIZE); ptidsl->adsl2TrainingMessages.cMsg1Len = CMSG1ADSL2_SIZE; break; case CMSG1ADSL2P_INDEX: dgprintf(5,"C-Msg1 Plus rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSG1ADSL2P_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cMsg1,CMSG1ADSL2P_SIZE); ptidsl->adsl2TrainingMessages.cMsg1Len = CMSG1ADSL2P_SIZE; break; case CMSG2ADSL2_INDEX: dgprintf(5,"C-Msg2 rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSG2ADSL2_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cMsg2,CMSG2ADSL2_SIZE); ptidsl->adsl2TrainingMessages.cMsg2Len = CMSG2ADSL2_SIZE; break; case RMSG1ADSL2_INDEX: dgprintf(5,"R-Msg1 rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG1ADSL2_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rMsg1,RMSG1ADSL2_SIZE); ptidsl->adsl2TrainingMessages.rMsg1Len = RMSG1ADSL2_SIZE; break; case RMSG2ADSL2_INDEX: dgprintf(5,"R-Msg2 rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG2ADSL2_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rMsg2,RMSG2ADSL2_SIZE); ptidsl->adsl2TrainingMessages.rMsg2Len = RMSG2ADSL2_SIZE; break; case RMSG2ADSL2P_INDEX: dgprintf(5,"R-Msg2 Plus rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG2ADSL2P_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rMsg2,RMSG2ADSL2P_SIZE); ptidsl->adsl2TrainingMessages.rMsg2Len = RMSG2ADSL2P_SIZE; break; case CPARAMS_INDEX: dgprintf(5,"C-Params rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CPARAMS_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cParams,CPARAMS_SIZE); ptidsl->adsl2TrainingMessages.cParamsLen = CPARAMS_SIZE; break; case RPARAMS_INDEX: dgprintf(5,"R-Params rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RPARAMS_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rParams,RPARAMS_SIZE); ptidsl->adsl2TrainingMessages.rParamsLen = RPARAMS_SIZE; break; case CPARAMSPL_INDEX: dgprintf(5,"C-Params Plus rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CPARAMSPL_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.cParams,CPARAMSPL_SIZE); ptidsl->adsl2TrainingMessages.cParamsLen = CPARAMSPL_SIZE; break; case RPARAMSPL_INDEX: dgprintf(5,"R-Params Plus rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RPARAMS_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2TrainingMessages.rParams,RPARAMSPL_SIZE); ptidsl->adsl2TrainingMessages.rParamsLen = RPARAMSPL_SIZE; break; case RMSG1LD_INDEX: dgprintf(5,"R-Msg1 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG1LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg1Ld,RMSG1LD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsg1LdLen = RMSG1LD_SIZE; break; case RMSG2LD_INDEX: dgprintf(5,"R-Msg2 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG2LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg2Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG3LD_INDEX: dgprintf(5,"R-Msg3 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG3LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg3Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG4LD_INDEX: dgprintf(5,"R-Msg4 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG4LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg4Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG5LD_INDEX: dgprintf(5,"R-Msg5 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG5LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg5Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG6LD_INDEX: dgprintf(5,"R-Msg6 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG6LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg6Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG7LD_INDEX: dgprintf(5,"R-Msg7 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG7LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg7Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG8LD_INDEX: dgprintf(5,"R-Msg8 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG8LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg8Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG9LD_INDEX: dgprintf(5,"R-Msg9 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG9LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg9Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG10LD_INDEX: dgprintf(5,"R-Msg10 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG10LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg10Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG11LD_INDEX: dgprintf(5,"R-Msg11 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG11LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg11Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG12LD_INDEX: dgprintf(5,"R-Msg12 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG12LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg12Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG13LD_INDEX: dgprintf(5,"R-Msg13 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG13LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg13Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG14LD_INDEX: dgprintf(5,"R-Msg14 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG14LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg14Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG15LD_INDEX: dgprintf(5,"R-Msg15 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG15LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg15Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG16LD_INDEX: dgprintf(5,"R-Msg16 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG16LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg16Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case RMSG17LD_INDEX: dgprintf(5,"R-Msg17 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, RMSG17LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.rMsg17Ld,RMSGxLD_SIZE); ptidsl->adsl2DiagnosticMessages.rMsgxLdLen = RMSGxLD_SIZE; break; case CMSG1LD_INDEX: dgprintf(5,"C-Msg1 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSG1LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.cMsg1Ld,CMSG1LD_SIZE); ptidsl->adsl2DiagnosticMessages.cMsg1LdLen = CMSG1LD_SIZE; break; case CMSG2LD_INDEX: dgprintf(5,"C-Msg2 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSG2LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.cMsg2Ld,CMSG2LD_SIZE); ptidsl->adsl2DiagnosticMessages.cMsg2LdLen = CMSG2LD_SIZE; break; case CMSG3LD_INDEX: dgprintf(5,"C-Msg3 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSG3LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.cMsg3Ld,CMSG3LD_SIZE); ptidsl->adsl2DiagnosticMessages.cMsg3LdLen = CMSG3LD_SIZE; break; case CMSG4LD_INDEX: dgprintf(5,"C-Msg4 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSG4LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.cMsg4Ld,CMSG4LD_SIZE); ptidsl->adsl2DiagnosticMessages.cMsg4LdLen = CMSG4LD_SIZE; break; case CMSG5LD_INDEX: dgprintf(5,"C-Msg5 LD rec'd\n"); adsl2MsgLoc = dslhal_support_getAdsl2MessageLocation (ptidsl, CMSG5LD_INDEX); rc += dslhal_support_blockRead((PVOID)adsl2MsgLoc, ptidsl->adsl2DiagnosticMessages.cMsg5Ld,CMSG5LD_SIZE); ptidsl->adsl2DiagnosticMessages.cMsg5LdLen = CMSG5LD_SIZE; break; default: dgprintf(5,"Unknown ADSL2 Message rec'd\n"); break; } return rc; } /** * \brief Gather Rate Training Messages * * @param ptidsl Pointer to main DSL HAL data structure. * @return ErrCode */ unsigned int dslhal_support_gatherRateMessages(tidsl_t * ptidsl) { int rc; DEV_HOST_dspWrNegoParaDef_t negoParms; DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface; dgprintf(1, "dslhal_support_gatherRateMessages\n"); rc += dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface,sizeof(DEV_HOST_dspOamSharedInterface_t)); dspOamSharedInterface.dspWriteNegoParams_p = (DEV_HOST_dspWrNegoParaDef_t *) dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.dspWriteNegoParams_p); rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.dspWriteNegoParams_p, &negoParms, sizeof(DEV_HOST_dspWrNegoParaDef_t)); if (rc) return DSLHAL_ERROR_BLOCK_READ; else { shim_osMoveMemory((void *)ptidsl->AppData.bCRates1, (void *)negoParms.cRates1, 120); shim_osMoveMemory((void *)ptidsl->AppData.bRRates1, (void *)negoParms.rRates1, 44); } return DSLHAL_ERROR_NO_ERRORS; } /** * \brief Calls Advanced Snr per bin buffering Functions * * Note (Important): This function is used to gather training SNR. The function can only be * used internally (when DSLHAL is handling DSP_SNR). After showtime, the datapump holding * training SNR is reused for other purpose, therefore calling this function will not * getting meaningful information. * The training SNR gathered is stored in AppData.rxSnrPerBin0, AppData.rxSnrPerBin1, and * AppData.rxSnrPerBin2. After training, the information in these buffer representing * training SNR. * Also note that each entry in the buffer is a 16 bit little endian value. * To convert each 16 bit entry to dB, you need to: * 1. Endian conversion by dslhal_support_byteSwap16 (if Host not in little endian). * 2. Divide each 16 bit value by 85.04 (= 256/(10*Log2)) * * @param ptidsl Pointer to main DSL HAL data structure. * @param snrBufferOpt * @return ErrCode */ unsigned dslhal_support_gatherSnrPerBin(tidsl_t *ptidsl, unsigned snrBufferOpt) { DEV_HOST_snrBuffer_t snrBuffer; DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface; int rc, max_ds_tones; dgprintf(5,"dslhal_support_gatherSnrPerBin\n"); rc = dslhal_support_InterfaceGet(ptidsl, &dspOamSharedInterface); if (rc) { return rc; } if(snrBufferOpt <0 || snrBufferOpt >2) { dgprintf(1,"Invalid input for Snr Buffer\n"); return DSLHAL_ERROR_INVALID_PARAM; } // // Note we can't use ptidsl->max_ds_tones in the following statement because // this function could be invoked before showtime. (tidsl->max_ds_tones won't // be ready before showtime). // /***TBD, ep***/ dslhal_support_updateTrainMode(ptidsl); max_ds_tones = ptidsl->AppData.max_ds_tones; dspOamSharedInterface.snrBuffer_p = (DEV_HOST_snrBuffer_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.snrBuffer_p); rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.snrBuffer_p,&snrBuffer, sizeof(DEV_HOST_snrBuffer_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } snrBuffer.buffer1_p = (short *)dslhal_support_byteSwap32((unsigned int)snrBuffer.buffer1_p); snrBuffer.buffer2_p = (short *)dslhal_support_byteSwap32((unsigned int)snrBuffer.buffer2_p); if(snrBufferOpt <2) { rc = dslhal_support_blockRead((PVOID)snrBuffer.buffer1_p,(void *)ptidsl->AppData.rxSnrPerBin0, max_ds_tones*2); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } #ifdef DEBUG_BUILD dgprintf(5," Rx Snr 0\n"); for(rc=0;rcAppData.rxSnrPerBin0[rc++])); if((rc%8==0)&&(rc!=0)) dgprintf(6,"\n"); } #endif } if(snrBufferOpt ==1) { rc = dslhal_support_blockRead((PVOID)snrBuffer.buffer2_p,(void *)ptidsl->AppData.rxSnrPerBin1, max_ds_tones*2); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } #ifdef DEBUG_BUILD dgprintf(5," Rx Snr 1\n"); for(rc=0;rcAppData.rxSnrPerBin1[rc++])); if((rc%8==0)&&(rc!=0)) dgprintf(6,"\n"); } #endif } if(snrBufferOpt ==2) { rc = dslhal_support_blockRead((PVOID)snrBuffer.buffer1_p,(void *)ptidsl->AppData.rxSnrPerBin2, max_ds_tones*2); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } #ifdef DEBUG_BUILD dgprintf(5," Rx Snr 2\n"); for(rc=0;rcAppData.rxSnrPerBin2[rc++])); if((rc%8==0)&&(rc!=0)) dgprintf(6,"\n"); } #endif } if(rc) return DSLHAL_ERROR_CONFIG_API_FAILURE; else return DSLHAL_ERROR_NO_ERRORS; } /** * \brief Update Training Mode and max tone number. * If the TIOIDINFO.useBitField is not set, * then the returned mode is the old (ordinal) mode. * If the TIOIDINFO.useBitField is set, * then the returned mode is the bitfield mode. * * @param ptidsl Pointer to main DSL HAL data structure. * @return ErrCode */ unsigned dslhal_support_updateTrainMode(tidsl_t *ptidsl) { unsigned rc = 0, data[3]; unsigned trainMode; dgprintf(4, "dslhal_support_updateTrainMode\n"); rc = dslhal_support_getTrainMode(ptidsl, data); if (rc) return rc; trainMode = data[0]; switch (data[1]) { case ANNEXI: if (data[0] & ADSL2_MODE) trainMode = ADSL2_ANNEX_I; else if (data[0] & ADSL2PLUS_MODE) trainMode = ADSL2PLUS_ANNEX_I; break; case ANNEXJ: if (data[0] & ADSL2_MODE) trainMode = ADSL2_ANNEX_J; else if (data[0] & ADSL2PLUS_MODE) trainMode = ADSL2PLUS_ANNEX_J; break; case ANNEXM: if (data[0] & ADSL2_MODE) trainMode = ADSL2_ANNEX_M; else if (data[0] & ADSL2PLUS_MODE) trainMode = ADSL2PLUS_ANNEX_M; break; case ANNEXA: case ANNEXB: case ANNEXL: default: break; } trainMode |= (data[0] & DELT_ENABLE); // preserve DELT bit if (!ptidsl->AppData.useBitField) { // override if (data[0] == T1413_MODE) trainMode = DSLTRAIN_T1413_MODE; else if (data[0] == GDMT_MODE) trainMode = DSLTRAIN_GDMT_MODE; } ptidsl->AppData.TrainedMode= trainMode; ptidsl->AppData.annex_selected = data[1]; ptidsl->AppData.psd_mask_qualifier= data[2]; dgprintf(4," trainMode=%02x, annex_selected=%04x, psd_mask_qualifier=%04x\n", ptidsl->AppData.TrainedMode, ptidsl->AppData.annex_selected, ptidsl->AppData.psd_mask_qualifier ); if (trainMode & ADSL2PLUS_MASKS) { ptidsl->AppData.max_ds_tones = NUM_TONE_DS_ADSL2PLUS; } else { ptidsl->AppData.max_ds_tones = NUM_TONE_DS_DEFAULT; } if (data[1] & ANNEXB) { ptidsl->AppData.max_us_tones = NUM_TONE_US_ADSL_B; } else if (data[1] & ANNEXM) { // check EU ptidsl->AppData.max_us_tones = NUM_TONE_US_DEFAULT + ((data[2] & ANNEXM_US_SUBMODE_BITMASK) >> ANNEXMJ_SUBMODE_MASK_BITPOS)*4; } else { ptidsl->AppData.max_us_tones = NUM_TONE_US_DEFAULT; } return rc; } /** * \brief This function check current train mode see if it's GDMT, T1413, or GLITE. * Detect & take care both old train mode scheme & new train mode scheme. * It is expected the ptidsl->AppData.TrainedMode is been set before calling * this function. * * @param ptidsl Pointer to main DSL HAL data structure. * @return 1: One of ADSL1 (GDMT, T1413, or GLITE) mode. * 0: Not ADSL1 mode. */ unsigned dslhal_support_IsADSL1Mode(tidsl_t *ptidsl) { unsigned mode = ptidsl->AppData.TrainedMode & ~0x01; // mask out DELT mode if (ptidsl->AppData.useBitField) { // bitfield TrainMode: GDMT=2, T1413=0x80, GLITE=4 if (mode & (GDMT_ANNEX_A_OR_B | GLITE_ANNEX_A_AND_B | T1413_ANSI)) return 1; // It's ADSL1 mode } else { // ordinal number TrainMode: T1413=2, GDMT=3, GLITE=4 if (mode <= DSLTRAIN_GLITE_MODE) return 1; // It's ADSL1 mode } return 0; // not ADSL1 mode } /** * \brief Reset failed training state log. * * @param ptidsl Pointer to main DSL HAL data structure. * @return None. */ void dslhal_support_resetTrainFailureLog(tidsl_t *ptidsl) { int rc; for(rc=0;rcAppData.trainFails;rc++) { ptidsl->AppData.trainFailStates[rc]=0; } ptidsl->AppData.trainFails = 0; } /** * \brief Log failed training state. * * @param ptidsl Pointer to main DSL HAL data structure. * @param state Failed training state. * @return None. */ void dslhal_support_addTrainFailureLog(tidsl_t *ptidsl, unsigned state) { ptidsl->AppData.trainFailStates[ptidsl->AppData.trainFails] = state; ptidsl->AppData.trainFails++; if(ptidsl->AppData.trainFails >= 30) ptidsl->AppData.trainFails=0; } /*** Interface Access Function ***/ /** * \brief This rouin performs DSP memory write. * * @param buffer Data need to be written * @param addr Memory address to be written * @param count Number of bytes to be written * @return ErrCode */ int dslhal_support_blockWrite(void *buffer, void *addr, unsigned count) { int rc; //, byteCnt=0; // unsigned char* ptr; union { unsigned char *cptr; short *sptr; int *iptr; } src; union { int anint; /* DSP location */ unsigned char *cptr; /* to avoid casts */ } dst; union { unsigned int anint; unsigned char byte[4]; }data,dsttmp; //,srctmp; int misaligned_flag, i; unsigned int trailing_misaligned_bytes; unsigned int misaligned_bytes; if (count==0) return DSLHAL_ERROR_NO_ERRORS; // do nothing /* Enter Critical Section */ shim_osCriticalEnter(); dgprintf(6, "dslhal_support_blockWrite\n"); dgprintf(6,"addr=0x%X, length=0x%X, buffer=0x%X\n", (unsigned int) addr, (unsigned int) count, (unsigned int)buffer); src.cptr = (unsigned char*) buffer; /* local buffer */ dst.cptr = addr; /* DSP memory location */ misaligned_flag = (((unsigned int) addr&0x03) || ((unsigned int) buffer&0x03)) ? 1: 0; /*Maps address first*/ rc=dslhal_support_hostDspAddressTranslate((unsigned int)addr); dgprintf(6, "NewAddr: %08x\n", rc); if(rc==0) { dgprintf(1, "dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } dst.cptr=(unsigned char *)rc; /* check wether address is at 32bits boundary */ if (misaligned_flag) { // // For misaligned dst, do read-modify-write to preserve the un-written data // For misaligned src, always use byte handling // unsigned int pre_aligned_addr=(unsigned int)dst.cptr & 0xfffffffc; dsttmp.anint = DSL_GET32(pre_aligned_addr); // aligned read destination // trailing_misaligned_bytes = (count+(dst.anint&3)) & 3; misaligned_bytes = count+(dst.anint&3); if (misaligned_bytes<4) trailing_misaligned_bytes = 0; else trailing_misaligned_bytes = misaligned_bytes & 3; for (i=(dst.anint&3); i<4; i++, count--, dst.anint++) { if (count==0) break; // in case the data can't even fill up the first aligned-word dsttmp.byte[i]= *src.cptr++; } DSL_SET32(pre_aligned_addr, dsttmp.anint); for (i=0; count>0; count--) { dsttmp.byte[i++]=*src.cptr++; i &=3; if (i==0) { // for each aligned 4 bytes do output DSL_SET32((unsigned)dst.cptr, dsttmp.anint); // dst.cptr must be aligned dst.anint+=4; if (count ==(trailing_misaligned_bytes+1)) { // read modify write dsttmp.anint = DSL_GET32((unsigned int) dst.anint); } } } if (trailing_misaligned_bytes) { DSL_SET32((unsigned)dst.cptr, dsttmp.anint); // dst.cptr must be aligned } } else //dst & src address already aligned, (dst.anint & 0x3)==0 { while (count > 3) { DSL_SET32((unsigned)dst.cptr, *src.iptr); src.iptr++; /* bump the data pointer by four */ dst.anint += 4; /* bump the address by four */ count -= 4; /* decrement the byte count by four */ } /* write remaining bytes */ if(count) { int i; // do read-modify-write data.anint= DSL_GET32((unsigned int)dst.cptr); for (i=0; i< count; i++) { data.byte[i]=*(src.cptr+i); } DSL_SET32((unsigned)dst.cptr, data.anint); } } dgprintf(6, "dslhal_support_blockWrite done\n"); /* Exit Critical Section */ shim_osCriticalExit(); return DSLHAL_ERROR_NO_ERRORS; } /* end of dslhal_supp */ /** * \brief This rouin performs DSP memory read. * * @param buffer Buffer to be filled with data * @param addr Memory address to be read * @param count Number of bytes to be read * @return ErrCode */ int dslhal_support_blockRead(void *addr, void *buffer, unsigned count) { int rc; union { int anint; /* DSP location */ char *cptr; /* to avoid casts */ } src; union { char byte[4]; int anint; /* DSP data */ } data; union { char *cptr; int *iptr; } dst; int misaligned_flag, i; /* Enter Critical Section */ shim_osCriticalEnter(); dgprintf(6,"dslhal_support_blockRead\n"); // // Check if any of dsp & mips buffer is not 32bit aligned. // Need byte process later on if mis-aligned (misalign_flag=1) // misaligned_flag = (((unsigned int) addr&0x03) || ((unsigned int) buffer&0x03)) ? 1: 0; src.cptr = addr; /* DSP memory location */ dst.cptr = buffer; /* local buffer */ dgprintf(6, "Read addr=0x%X, size=0x%X, dst.cptr=%08x\n", (unsigned int)addr, count, dst.cptr); /*Maps address first*/ rc=dslhal_support_hostDspAddressTranslate((unsigned int)addr); if(rc==0) { dgprintf(1, "dslhal_support_hostDspAddressTranslate failed\n"); return DSLHAL_ERROR_ADDRESS_TRANSLATE; } src.cptr=(unsigned char *)rc; /********************************************** * if the source is NOT on a 32-bit boundary * * then we read the full word * * and ignore the first part of it * **********************************************/ if ((src.anint & 3) && count) { data.anint = DSL_GET32((unsigned int)src.cptr & 0xfffffffc); /************************************ * there is no need for case 0 * * notice that there are no breaks * * each falls through to the next * ************************************/ //cph Optimize for(i=(src.anint & 3);i<4; i++, src.anint++, count--) { if (count==0) break; // aligned case don't need byte treament *(dst.cptr++) = data.byte[i]; } } /* the src pointer should now be on a 32-bit boundary */ if (misaligned_flag) { while (count > 3) { // since src is 32 bit aligned now, we can use 32 bit read data.anint = DSL_GET32((unsigned int)src.cptr); // destination not aligned, need byte process dst.cptr[0]= data.byte[0]; dst.cptr[1]= data.byte[1]; dst.cptr[2]= data.byte[2]; dst.cptr[3]= data.byte[3]; src.anint += 4; /* bump the address by four */ dst.cptr+=4; count -= 4; /* decrement the byte count by four */ } } else { while (count > 3) { *dst.iptr = DSL_GET32((unsigned int)src.cptr); src.anint += 4; /* bump the address by four */ dst.iptr++; /* bump the data pointer by four */ count -= 4; /* decrement the byte count by four */ } } /******************************* * if there's any count left * * then we read the next word * * and ignore the end of it * *******************************/ //cph optimize. count is less than 4 if (count) { data.anint = DSL_GET32((unsigned int)src.cptr); for (i=0; ipmainAddr, hostPtr, IF_SIZE); if (rc) { dgprintf(5, "dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } for (rc=0; rcpmainAddr, offset, 1, buf, 4); } unsigned dslhal_support_getNetService(tidsl_t *ptidsl) { unsigned rc = 0, data = 0; unsigned offset[] = { 2, IFACE_OFFSET(datapumpVersion_p), /*1*/ IFACE_DSPVER_OFFSET(netService) /*2*/ }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); if (rc) { return rc; } ptidsl->netService = BYTE_GET(data, 0); return DSLHAL_ERROR_NO_ERRORS; } unsigned dslhal_support_getDspVerStruct(tidsl_t *ptidsl, void *buf) { unsigned offset[] = { 2, IFACE_OFFSET(datapumpVersion_p), /*1*/ 0 }; return dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, buf, sizeof(DEV_HOST_dspVersionDef_t)); } unsigned dslhal_support_getModemState(tidsl_t *ptidsl, void *buf) { unsigned offset[] = { 2, IFACE_OFFSET(modemStateBitField_p), /*2*/ 0 }; return dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, buf, sizeof(unsigned)*4); } unsigned dslhal_support_getTrellis(tidsl_t *ptidsl) { unsigned data = 0; unsigned offset[] = { 2, IFACE_OFFSET(aturMsg_p), /*8*/ IFACE_HSTMSG_OFFSET(trellis) /*1*/ }; dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); ptidsl->AppData.trellis = BYTE_GET(data, 0); return ptidsl->AppData.trellis; } unsigned dslhal_support_dbgHalt(tidsl_t *ptidsl, unsigned rw, unsigned *d) { unsigned rc = 0, data = 0; unsigned offset[] = { 2, 7, //IFACE_INT_OFFSET(modemEnv_p), /*7*/ 0 }; if (rw) { rc = dslhal_support_interfaceRW((unsigned)ptidsl->pIntAddr, offset, 1, &data, 4); if (rc) return rc; *d = BYTE_GET(data, 0); } else { data = BYTE_SWAP32(*d); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pIntAddr, offset, 0, &data, 4); } return rc; } unsigned dslhal_support_getStateLog(tidsl_t *ptidsl) { unsigned rc = 0, data[4]; unsigned offset[] = { 2, 15, //IFACE_INT_OFFSET(stateLog_p), /*15*/ 0 }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pIntAddr, offset, 1, &data[0], 16); if (rc) return rc; if ((data[0] == ptidsl->stateLog[0]) && (data[1] == ptidsl->stateLog[1]) && (data[2] == ptidsl->stateLog[2]) && (data[3] == ptidsl->stateLog[3])) { rc = 1; } else { ptidsl->stateLog[0] = data[0]; ptidsl->stateLog[1] = data[1]; ptidsl->stateLog[2] = data[2]; ptidsl->stateLog[3] = data[3]; } return rc; } unsigned dslhal_support_autoRetrain(tidsl_t *ptidsl, unsigned rw, unsigned *d) { unsigned rc = 0, data = 0; unsigned offset[]={ 2, IFACE_OFFSET(oamWriteNegoParams_p), /*4*/ IFACE_OAMWRI_OFFSET(oamFeature) /*11*/ }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); if (rc) return rc; if (rw) { /*read*/ *d = (data & 1); return 0; } else { /*write*/ data |= (*d & 1); data = BYTE_SWAP32(data); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 0, &data, 4); return rc; } } unsigned dslhal_support_getATUCVendorId(tidsl_t *ptidsl, void *d) { unsigned offset[] = { 3, 7, //IFACE_INT_OFFSET(modemEnv_p), /*7*/ 11, //IFACE_INT_MDMENV_OFFSET(ghsATUCVendorIdAddr), /*11*/ 0 }; return dslhal_support_interfaceRW((unsigned)ptidsl->pIntAddr, offset, 1, d, 8); } unsigned dslhal_support_getGhsMsg(tidsl_t *ptidsl, void *d, unsigned size) { unsigned offset[] = { 2, IFACE_OFFSET(ghsDspRxBuf_p), /*29*/ 0 }; return dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, d, size); } unsigned dslhal_support_getTrainMode(tidsl_t *ptidsl, unsigned *d) { unsigned rc = 0, data = 0; unsigned offset1[]= { 2, IFACE_OFFSET(dspWriteNegoParams_p), /*3*/ IFACE_DSPWRI_OFFSET(trainMode) /*0*/ }; unsigned offset2[]= { 2, IFACE_OFFSET(dspWriteNegoParams_p), /*3*/ IFACE_DSPWRI_OFFSET(annex_selected) /*52*/ }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset1, 1, &data, 4); if (rc) return rc; d[0] = BYTE_GET(data, 0); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset2, 1, &data, 4); if (rc) return rc; data = BYTE_SWAP32(data); d[1] = data & 0x0FFFF; /*annex_selected*/ d[2] = (data >> 16) & 0x0FFFF; /*psd_mask_qualifier*/ return 0; } unsigned dslhal_support_getSubState(tidsl_t *ptidsl, unsigned *d) { unsigned rc = 0, data = 0; unsigned offset[]= { 2, IFACE_OFFSET(modemEnvPublic_p), /*25*/ IFACE_MDMENV_OFFSET(subStateIndex) /*0*/ }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); if (rc) return rc; *d = BYTE_SWAP32(data) & 0x0FFFF; return 0; } unsigned dslhal_support_intrSrc(tidsl_t *ptidsl, unsigned rw, unsigned *d) { unsigned rc = 0, data = 0; unsigned offset[] = { 2, IFACE_OFFSET(hostInterruptSource_p), /*21*/ 0 }; if (rw) { /*read*/ rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); *d = (rc) ? 0 : BYTE_SWAP32(data); } else { /*write*/ data = BYTE_SWAP32(*d); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 0, &data, 4); } return rc; } /** * DESCRIPTION: * * Return: Error Condition */ unsigned dslhal_support_getRMsgsRa(tidsl_t *ptidsl) { unsigned rc = 0; unsigned offset[] = { 2, IFACE_OFFSET(raMsgs_p), /*5*/ IFACE_RAMSGS_OFFSET(rMsgsRaString) /*1*/ }; void *buf = &(ptidsl->AppData.rMsgRa[0]); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, buf, 12); return rc; } /** * DESCRIPTION: * * Return: Error Condition */ unsigned dslhal_support_getCMsgsRa(tidsl_t *ptidsl) { unsigned rc = 0; unsigned offset[] = { 2, IFACE_OFFSET(raMsgs_p), /*5*/ IFACE_RAMSGS_OFFSET(cMsgsRaString) /*4*/ }; void *buf = &(ptidsl->AppData.cMsgRa[0]); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, buf, 6); return rc; } /** * \brief Write Host Interrupt bit mask in Host Interface. * * @param ptidsl Pointer to main DSL HAL data structure. * @param inMask Bit mask to be set. * @return ErrCode */ unsigned dslhal_support_setInterruptMask(tidsl_t * ptidsl, unsigned inMask) { unsigned rc = 0, mask = 0; unsigned offset[] = { 2, IFACE_OFFSET(hostInterruptMask_p), /*19*/ 0 }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &mask, 4); if (rc) return rc; mask = BYTE_SWAP32(mask); mask &= 0x00FFFFFF; mask |= ((inMask & 0x7) << 24); mask = BYTE_SWAP32(mask); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 0, &mask, 4); return rc; } /** * \brief Get address of ADSL2 Message in Host Interface. * * @param ptidsl Pointer to main DSL HAL data structure. * @param msgId Message ID. * @return ErrCode */ unsigned dslhal_support_getAdsl2MessageLocation(tidsl_t *ptidsl, unsigned msgId) { unsigned rc = 0, data = 0; unsigned offset[] = { 3, IFACE_OFFSET(dspWriteNegoParams_p), /*3*/ IFACE_DSPWRI_OFFSET(adsl2DeltMsgs_p), /*49*/ msgId }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); if (rc) return rc; data = BYTE_SWAP32(data); dgprintf(5," Message Address: 0x%x\n", data); return data; } /** * */ static unsigned dslhal_support_getSuperFrmCnt(tidsl_t *ptidsl) { unsigned rc = 0, data[2] = {0,0}; unsigned offset[] = { 2, IFACE_OFFSET(dspWriteSuperFrameCnt_p), /*6*/ 0 }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data[0], 8); if (rc) return rc; ptidsl->AppData.dsSuperFrmCnt = BYTE_SWAP32(data[0]); ptidsl->AppData.usSuperFrmCnt = BYTE_SWAP32(data[1]); return 0; } static unsigned dslhal_support_getFramingMode(tidsl_t *ptidsl) { unsigned rc = 0, data = 0; unsigned offset[] = { 2, IFACE_OFFSET(atucMsg_p), /*7*/ IFACE_HSTMSG_OFFSET(actualPsd) /*2*/ /*TBD: framingMode*/ }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); if (rc) return rc; ptidsl->AppData.FrmMode = BYTE_GET(data, 2); ptidsl->AppData.MaxFrmMode = BYTE_GET(data, 3); return 0; } static unsigned dslhal_support_getGrossGain(tidsl_t *ptidsl) { unsigned rc = 0, data = 0; unsigned offset[] = { 2, IFACE_OFFSET(aturMsg_p), /*8*/ IFACE_HSTMSG_OFFSET(grossGain) /*5*/ }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); if (rc) return rc; ptidsl->AppData.grossGain = BYTE_GET(data, 0); return 0; } static unsigned dslhal_support_getLineAtten(tidsl_t *ptidsl) { unsigned rc = 0, data = 0; unsigned offset[] = { 2, IFACE_OFFSET(eocVar_p), /*11*/ IFACE_EOCVAR_OFFSET(lineAtten) /*29*/ }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); if (rc) return rc; ptidsl->AppData.dsLineAttn = BYTE_GET(data, 0); ptidsl->AppData.dsMargin = (BYTE_SWAP32(data) >> 16) & 0x0FFFF; return 0; } /** * */ unsigned dslhal_support_getModemStatistics(tidsl_t *ptidsl) { unsigned rc = 0; unsigned offset[] = { 2, IFACE_OFFSET(modemStats_p), 0 }; DEV_HOST_modemStatsDef_t modemStats; DEV_HOST_atmStats_t atmStats; DEV_HOST_errorStats_t txErr[2]; DEV_HOST_errorStats_t rxErr[2]; #ifndef YAMUNA DEV_HOST_usAtmStats_t txAtm[2]; DEV_HOST_dsAtmStats_t rxAtm[2]; #else DEV_HOST_txAtmStats_t txAtm[2]; DEV_HOST_rxAtmStats_t rxAtm[2]; #endif if(ptidsl->AppData.bState <= RSTATE_INIT) return rc; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &modemStats, sizeof(DEV_HOST_modemStatsDef_t)); if (rc) return rc; offset[1] = IFACE_OFFSET(atmStats_p); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &atmStats, sizeof(DEV_HOST_atmStats_t)); if (rc) return rc; /* Change the endianness of the Pointer */ modemStats.txErrorStatsLpa_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned)modemStats.txErrorStatsLpa_p); modemStats.rxErrorStatsLpa_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned)modemStats.rxErrorStatsLpa_p); modemStats.txErrorStatsLpb_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned)modemStats.txErrorStatsLpb_p); modemStats.rxErrorStatsLpb_p = (DEV_HOST_errorStats_t *) dslhal_support_byteSwap32((unsigned)modemStats.rxErrorStatsLpb_p); rc = dslhal_support_blockRead((PVOID)modemStats.txErrorStatsLpa_p, &txErr[0], (sizeof(DEV_HOST_errorStats_t))); if (rc) return rc; rc = dslhal_support_blockRead((PVOID)modemStats.rxErrorStatsLpa_p, &rxErr[0], (sizeof(DEV_HOST_errorStats_t))); if (rc) return rc; rc = dslhal_support_blockRead((PVOID)modemStats.txErrorStatsLpb_p, &txErr[1], (sizeof(DEV_HOST_errorStats_t))); if (rc) return rc; rc = dslhal_support_blockRead((PVOID)modemStats.rxErrorStatsLpb_p, &rxErr[1], (sizeof(DEV_HOST_errorStats_t))); if (rc) return rc; /* Change the endianness of the Pointer */ atmStats.tx0_p = (DEV_HOST_txAtmStats_t *) dslhal_support_byteSwap32((unsigned)atmStats.tx0_p); atmStats.rx0_p = (DEV_HOST_rxAtmStats_t *) dslhal_support_byteSwap32((unsigned)atmStats.rx0_p); atmStats.tx1_p = (DEV_HOST_txAtmStats_t *) dslhal_support_byteSwap32((unsigned)atmStats.tx1_p); atmStats.rx1_p = (DEV_HOST_rxAtmStats_t *) dslhal_support_byteSwap32((unsigned)atmStats.rx1_p); rc = dslhal_support_blockRead((PVOID)atmStats.tx0_p, &txAtm[0], (sizeof(DEV_HOST_txAtmStats_t))); if (rc) return rc; rc = dslhal_support_blockRead((PVOID)atmStats.tx1_p, &txAtm[1], (sizeof(DEV_HOST_txAtmStats_t))); if (rc) return rc; rc = dslhal_support_blockRead((PVOID)atmStats.rx0_p, &rxAtm[0], (sizeof(DEV_HOST_rxAtmStats_t))); if (rc) return rc; rc = dslhal_support_blockRead((PVOID)atmStats.rx1_p, &rxAtm[1], (sizeof(DEV_HOST_rxAtmStats_t))); if (rc) return rc; /* Get CRC Errors Stats for both US and DS */ ptidsl->AppData.dsICRC_errors = dslhal_support_byteSwap32((unsigned int)rxErr[0].crcErrors); ptidsl->AppData.dsFCRC_errors = dslhal_support_byteSwap32((unsigned int)rxErr[0].crcErrors); ptidsl->AppData.usICRC_errors = dslhal_support_byteSwap32((unsigned int)txErr[0].crcErrors); ptidsl->AppData.usFCRC_errors = dslhal_support_byteSwap32((unsigned int)txErr[0].crcErrors); /* Get FEC Errors Stats for both US and DS */ ptidsl->AppData.dsIFEC_errors = dslhal_support_byteSwap32((unsigned int)rxErr[0].fecErrors); ptidsl->AppData.dsFFEC_errors = dslhal_support_byteSwap32((unsigned int)rxErr[0].fecErrors); ptidsl->AppData.usIFEC_errors = dslhal_support_byteSwap32((unsigned int)txErr[0].fecErrors); ptidsl->AppData.usFFEC_errors = dslhal_support_byteSwap32((unsigned int)txErr[0].fecErrors); /* Get NCD Errors Stats for both US and DS */ #ifndef YAMUNA /* Get NCD Errors Stats for both US and DS */ ptidsl->AppData.dsINCD_error = dslhal_support_byteSwap32((unsigned int)rxAtm[0].ncdError); ptidsl->AppData.dsFNCD_error = dslhal_support_byteSwap32((unsigned int)rxAtm[0].ncdError); ptidsl->AppData.usINCD_error = dslhal_support_byteSwap32((unsigned int)txAtm[0].ncdError); ptidsl->AppData.usFNCD_error = dslhal_support_byteSwap32((unsigned int)txAtm[0].ncdError); #else ptidsl->AppData.dsINCD_error = dslhal_support_byteSwap32((unsigned int)rxAtm[0].ocdErrors); ptidsl->AppData.dsFNCD_error = dslhal_support_byteSwap32((unsigned int)rxAtm[0].ocdErrors); #endif /* Get LCD Errors Stats for both US and DS */ ptidsl->AppData.dsILCD_errors = dslhal_support_byteSwap32((unsigned int)rxAtm[0].lcdErrors); ptidsl->AppData.dsFLCD_errors = dslhal_support_byteSwap32((unsigned int)rxAtm[0].lcdErrors); #ifndef YAMUNA ptidsl->AppData.usILCD_errors = dslhal_support_byteSwap32((unsigned int)txAtm[0].lcdErrors); ptidsl->AppData.usFLCD_errors = dslhal_support_byteSwap32((unsigned int)txAtm[0].lcdErrors); #endif /*Get HEC Errors Stats for both US and DS */ ptidsl->AppData.dsIHEC_errors = dslhal_support_byteSwap32((unsigned int)rxAtm[0].hecErrors); ptidsl->AppData.dsFHEC_errors = dslhal_support_byteSwap32((unsigned int)rxAtm[0].hecErrors); #ifndef YAMUNA ptidsl->AppData.usIHEC_errors = dslhal_support_byteSwap32((unsigned int)txAtm[0].hecErrors); ptidsl->AppData.usFHEC_errors = dslhal_support_byteSwap32((unsigned int)txAtm[0].hecErrors); #endif /* Get LOS and SEF error Stats */ ptidsl->AppData.LOS_errors = dslhal_support_byteSwap32(modemStats.losErrors); ptidsl->AppData.SEF_errors = dslhal_support_byteSwap32(modemStats.sefErrors); ptidsl->AppData.coLosErrors = dslhal_support_byteSwap32(modemStats.farEndLosErrors); ptidsl->AppData.coRdiErrors = dslhal_support_byteSwap32(modemStats.farEndRdiErrors); /* Get ATM Stats for both US and DS for Channel 0*/ ptidsl->AppData.usAtm_count[0] = dslhal_support_byteSwap32(txAtm[0].goodCount); ptidsl->AppData.usIdle_count[0] = dslhal_support_byteSwap32(txAtm[0].idleCount); ptidsl->AppData.dsGood_count[0] = dslhal_support_byteSwap32(rxAtm[0].goodCount); ptidsl->AppData.dsIdle_count[0] = dslhal_support_byteSwap32(rxAtm[0].idleCount); ptidsl->AppData.dsBadHec_count[0] = dslhal_support_byteSwap32((rxAtm[0].badHecCount)); ptidsl->AppData.dsOVFDrop_count[0] = dslhal_support_byteSwap32((rxAtm[0].ovflwDropCount)); /* Get ATM Stats for both US and DS for Channel 1*/ ptidsl->AppData.usAtm_count[1] = dslhal_support_byteSwap32(txAtm[1].goodCount); ptidsl->AppData.usIdle_count[1] = dslhal_support_byteSwap32(txAtm[1].idleCount); ptidsl->AppData.dsGood_count[1] = dslhal_support_byteSwap32(rxAtm[1].goodCount); ptidsl->AppData.dsIdle_count[1] = dslhal_support_byteSwap32(rxAtm[1].idleCount); ptidsl->AppData.dsBadHec_count[1] = dslhal_support_byteSwap32((rxAtm[1].badHecCount)); ptidsl->AppData.dsOVFDrop_count[1] = dslhal_support_byteSwap32((rxAtm[1].ovflwDropCount)); /* Determine the US and DS Superframe Count */ rc = dslhal_support_getSuperFrmCnt(ptidsl); if (rc) return rc; /* Determine Frame Mode and Max Frame Mode */ rc = dslhal_support_getFramingMode(ptidsl); if (rc) return rc; /* Determine Gross Gain */ rc = dslhal_support_getGrossGain(ptidsl); if (rc) return rc; /* Determine DS Line Attenuation & Margin */ rc = dslhal_support_getLineAtten(ptidsl); if (rc) return rc; return 0; } /** * */ unsigned dslhal_support_getDspSharedTbls(tidsl_t *ptidsl) { unsigned rc = 0; unsigned offset[] = { 2, IFACE_OFFSET(dspWrSharedTables_p), 0 }; DEV_HOST_dspWrSharedTables_t *tblPtr, tblS; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &tblS, sizeof(DEV_HOST_dspWrSharedTables_t)); if (rc) return rc; tblPtr = &tblS; /* Read the ATU-R Bits and Gains Table */ tblPtr->aturBng_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)tblPtr->aturBng_p); rc = dslhal_support_blockRead((PVOID)tblPtr->aturBng_p,ptidsl->AppData.rBng, ptidsl->AppData.max_ds_tones*sizeof(unsigned short)); if (rc) return rc; /* Read the ATU-C Bits and Gains Table */ tblPtr->atucBng_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)tblPtr->atucBng_p); rc = dslhal_support_blockRead((PVOID)tblPtr->atucBng_p,ptidsl->AppData.cBng, (ptidsl->AppData.max_us_tones-1)*sizeof(unsigned short)); if (rc) return rc; /* ds bit allocation */ tblPtr->bitAllocTblDstrm_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)tblPtr->bitAllocTblDstrm_p); rc = dslhal_support_blockRead((PVOID)tblPtr->bitAllocTblDstrm_p,ptidsl->AppData.BitAllocTblDstrm, ptidsl->AppData.max_ds_tones*sizeof(unsigned char)); if(rc) return rc; /* us bit allocation */ tblPtr->bitAllocTblUstrm_p = (unsigned char *)dslhal_support_byteSwap32((unsigned int)tblPtr->bitAllocTblUstrm_p); rc = dslhal_support_blockRead((PVOID)tblPtr->bitAllocTblUstrm_p,ptidsl->AppData.BitAllocTblUstrm, 32*sizeof(unsigned char)); if(rc) return rc; /* margin per tone */ tblPtr->marginTblDstrm_p = (signed char *)dslhal_support_byteSwap32((unsigned int)tblPtr->marginTblDstrm_p); rc = dslhal_support_blockRead((PVOID)tblPtr->marginTblDstrm_p,ptidsl->AppData.marginTblDstrm, ptidsl->AppData.max_ds_tones*sizeof(signed char)); if(rc) return rc; return rc; } /** * \brief Set the trigger to run DSP at 250Mhz. * * @param ptidsl Pointer to main DSL HAL data structure. * @return ErrCode */ int dslhal_support_setDsp250MHzTrigger(tidsl_t *ptidsl) { unsigned rc = 0, data = 0; unsigned offset[] = { 2, IFACE_OFFSET(oamWriteNegoParams_p), /*4*/ IFACE_OAMWRI_OFFSET(mhzFlag) /*34*/ }; rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 1, &data, 4); if (rc) return rc; data &= dslhal_support_byteSwap32(0xffff00ff); data |= dslhal_support_byteSwap32(0x00000100); rc = dslhal_support_interfaceRW((unsigned)ptidsl->pmainAddr, offset, 0, &data, 4); if (rc) return rc; return DSLHAL_ERROR_NO_ERRORS; } /*** Code Download Function ***/ /*** TBD ***/ #define NUM_READ_RETRIES 3 //dsl phy ENV feature control unsigned int _dsl_Feature_0; unsigned int _dsl_Feature_1; unsigned int _dsl_Feature_0_defined; unsigned int _dsl_Feature_1_defined; //CQ10280 unsigned int _dsl_PhyControl_0; unsigned int _dsl_PhyControl_1; unsigned int _dsl_PhyControl_0_defined; unsigned int _dsl_PhyControl_1_defined; unsigned int _DEBUG_HALT_=0; /******************************************************************************************** * FUNCTION NAME: dslhal_support_computeCrc32() * ********************************************************************************************* * DESCRIPTION: * Computes the CRC-32 for the input data * * Return: 32 bit CRC of the input data * * * NOTE: * DSP image is based on LITTLE endian * ********************************************************************************************/ unsigned dslhal_support_computeCrc32(unsigned char *data, int len) { unsigned int result; int i,j; unsigned char octet; if ((len < 4) || (data==NULL)) return(0xdeaddead); result = *data++ << 24; result |= *data++ << 16; result |= *data++ << 8; result |= *data++; result = ~ result; len -=4; for (i=0; i> 7); } else { result = (result << 1) ^ (octet >> 7); } octet <<= 1; } } return ~result; /* The complement of the remainder */ } #ifdef YAMUNA #ifdef DSP_RST_WORKAROUND /*work-around*/ #define OFFSET_ALIGN(ad) (((ad) & ~0x3F) + 0x40) static unsigned gDspImageDum[8+0x10] = {0}; #endif /** * \brief DSP code download. * * @param ptidsl Pointer to main DSL HAL data structure. * @return ErrCode */ int dslhal_support_hostDspCodeDownload(tidsl_t * ptidsl) { unsigned i, rc, index, numbytes; //, crc32; unsigned char *image, *iptr; char *tmp = (char *)DEV_HOST_DSP_OAM_POINTER_LOCATION; DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface, *pdspOamSharedInterface; DEV_HOST_oamWrNegoParaDef_t OamWrNegoParaDef; struct _header { char signature[6]; unsigned short sectcount; unsigned int length; } header; struct _section { unsigned int addr; unsigned int length; unsigned int offset; unsigned int page; };/* section[MAXSECTIONS]; */ struct _section *sptr; unsigned int secAddr, secLength, secOffset, secPage; struct { unsigned head; unsigned tail; } memLoc[3], *memLocP; dgprintf(5,"dslhal_support_hostDspCodeDownload\n"); image = ptidsl->fwimage; if (!image) { dgprintf(1,"no image file\n"); return DSLHAL_ERROR_NO_FIRMWARE_IMAGE; } iptr=image; shim_osMoveMemory((char *) &header, (char *)iptr, sizeof(header)); header.length = dslhal_support_byteSwap32(header.length); header.sectcount = dslhal_support_byteSwap16(header.sectcount); dgprintf(5,"header.length=%08X, header.sectcount=0x%X\n", header.length, header.sectcount); #if 0 /* point to the checksum */ /* compute the checksum on CRC32 here */ dgprintf(5,"tiload: check checksum\n"); iptr = image + header.length-4; shim_osMoveMemory((char *)&(data.byte), (char *)iptr, 4); data.aword = dslhal_support_byteSwap32(data.aword); dgprintf(5,"CRC-32 in the Binary: 0x%x\n",data.aword); crc32 = dslhal_support_computeCrc32(image,ptidsl->imagesize); dgprintf(5,"CRC-32 for the Binary: 0x%x\n",crc32); /* CRC currently not added to the DSP binary, so this code is commented out */ if (data.aword != crc32) { dgprintf(1,"Checksum error\n"); } #endif /* Verify signature - Changed from "320C6x" to "TIDSL" for load 80 */ header.signature[5]='\0'; dgprintf(5, "signature=%s\n", header.signature); if (shim_osStringCmp(header.signature, "TIDSL")) { dgprintf(1,"Signature not match\n"); } /* Actual Code loading to DSP Memory */ dgprintf(4,"tiload: load binary\n"); HOST_REG(REG_DM2EMIF) = DDA_dsl_DspImageAddrGet(); MBOX_LOG("tiload: DMEM_OFFSET: 0x%08X\n", HOST_REG(REG_DM2EMIF)); #ifdef DSP_RST_WORKAROUND /*work-around*/ dgprintf(5,"tiload: Dummy DSP address: 0x%08X\n", (unsigned)(gDspImageDum)); HOST_REG(REG_PM2EMIF) = OFFSET_ALIGN((unsigned)(gDspImageDum)); *(unsigned *)(HOST_MEM_V2P(OFFSET_ALIGN((unsigned)(gDspImageDum)))) = 0x12; /*jump-to-self*/ dgprintf(5,"tiload: Dummy Offset: 0x%08X\n", HOST_REG(REG_PM2EMIF)); dslhal_support_unresetDsp(); #else HOST_REG(REG_PM2EMIF) = HOST_REG(REG_DM2EMIF); #endif for (i=0; i<3; i++) { memLoc[i].head = 0; memLoc[i].tail = 0; } /* Load sections from the image */ for (index=0; indexaddr); secOffset = dslhal_support_byteSwap32(sptr->offset); secLength = dslhal_support_byteSwap32(sptr->length); secPage = dslhal_support_byteSwap32(sptr->page); dgprintf(6,"loading section %u\n", index); dgprintf(6,"section %u: addr: %X\n", index, secAddr); dgprintf(6,"section %u: length: %X\n", index, secLength); dgprintf(6,"section %u: offset: %X\n", index, secOffset); dgprintf(6,"section %u: page: %X\n", index, secPage); /* validate offset */ if ( secOffset== 0xffffffff) { /* special case: zero fill */ } else { if (secOffset > header.length-4) { dgprintf(1,"Offset error\n"); return DSLHAL_ERROR_FIRMWARE_OFFSET; } /* all addresses must be on word boundaries */ if (secAddr & 3) { dgprintf(1,"tiload: secAddr not aligned (0x%08x)\n", secAddr); } /* Load this section of data */ iptr = image + secOffset; dgprintf(6, "iptr=%8x, *iptr=%08X\n", (unsigned int)iptr, *(unsigned *)iptr); } switch ( secAddr & 0xff000000) { case 0x00000000 : memLocP = &memLoc[0]; break; case 0x10000000 : memLocP = &memLoc[1]; break; case 0x80000000 : memLocP = &memLoc[2]; break; default : memLocP = NULL; dgprintf(-1,"tiload: bad secAddr (0x%08x)\n", secAddr); break; } if (memLocP) { unsigned head = secAddr; unsigned tail = secAddr + secLength - 1; #if 0 if (((head >= memLocP->head) && (head <= memLocP->tail)) || ((tail >= memLocP->head) && (tail <= memLocP->tail))) { dgprintf(1, "Error: sections overlapping!\n"); } else #endif { if (memLocP->head == memLocP->tail) { memLocP->head = head; memLocP->tail = tail; } if (head > memLocP->tail) { memLocP->tail = tail; } if (tail < memLocP->head) { memLocP->head = head; } /* IMPORTANT: write image to DSP memory */ rc=dslhal_support_blockWrite((void *)iptr, (void *)secAddr, secLength); if(rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } shim_osClockWait(0x80000); } } } /* end of write dsp image */ for (i=0; i<3; i++) { dgprintf(4, "MemLoc %d: head = %08x, tail = %08x\n", i, memLoc[i].head, memLoc[i].tail); } /* Initialize host interface */ #if 1 { rc = dslhal_support_blockRead(tmp, &pdspOamSharedInterface, sizeof(unsigned int)); pdspOamSharedInterface= (DEV_HOST_dspOamSharedInterface_t *)dslhal_support_byteSwap32((unsigned int)pdspOamSharedInterface); dgprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } if (!pdspOamSharedInterface) { dgprintf(1,"Couldn't read main pointer\n"); return DSLHAL_ERROR_INVALID_PARAM; } } ptidsl->pmainAddr=pdspOamSharedInterface; /*TBD, ep*/ rc = dslhal_support_blockRead((void *)(0x80000004), &ptidsl->pIntAddr, sizeof(unsigned)); ptidsl->pIntAddr = (void *)dslhal_support_byteSwap32((unsigned)ptidsl->pIntAddr); dgprintf(5, "pIntAddr=0x%X\n", (unsigned)ptidsl->pIntAddr); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /*TBD, ep*/ dgprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr); /* get the pointer to DSP-OAM Shared Interface */ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, sizeof(DEV_HOST_dspOamSharedInterface_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /* Select the Multimode Training */ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p); rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.oamWriteNegoParams_p, &OamWrNegoParaDef, sizeof(DEV_HOST_oamWrNegoParaDef_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } dslhal_support_getNetService(ptidsl); switch(ptidsl->netService) { case 1: // Set POTS load default training mode to Multi-Mode OamWrNegoParaDef.stdMode = MULTI_MODE8; OamWrNegoParaDef.stdMode_byte2 = MULTI_MODE8; dgprintf(5,"POTS Service \n"); break; case 2: // Set ISDN load default training mode to MultiMode //was GDMT // OamWrNegoParaDef.stdMode = GDMT_MODE; // OamWrNegoParaDef.stdMode_byte2 = 0; OamWrNegoParaDef.stdMode = MULTI_MODE8; OamWrNegoParaDef.stdMode_byte2 = MULTI_MODE8; dgprintf(5,"ISDN Service \n"); break; default: OamWrNegoParaDef.stdMode = T1413_MODE; OamWrNegoParaDef.stdMode_byte2 = 0; dgprintf(5,"Default Service \n"); break; } #if 0 /*ep*/ ptidsl->AppData.StdMode = (unsigned int)OamWrNegoParaDef.stdMode; #endif OamWrNegoParaDef.oamFeature = dslhal_support_byteSwap32((OAMFEATURE_TC_SYNC_DETECT_MASK)); /* Set the flag to start retraining if the margin of the modem drops below default margin during showtime */ OamWrNegoParaDef.marginMonitorShwtme = FALSE; /* Set the flag to start retraining if the margin of the modem drops below default margin during training */ OamWrNegoParaDef.marginMonitorTrning = FALSE; OamWrNegoParaDef.dsToneTurnoff_f = 0; dslhal_support_blockWrite(&OamWrNegoParaDef, (PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t)); rc=dslhal_support_setInterruptMask(ptidsl,0); if(rc!=DSLHAL_ERROR_NO_ERRORS) return rc; // DSL phy feature control if (_dsl_Feature_0_defined) { dslhal_api_setPhyFeatureController(ptidsl, INTEROP_FEATURELIST0_PARAMID, _dsl_Feature_0); dslhal_api_enableDisablePhyFeatures(ptidsl, INTEROP_FEATURELIST0_PARAMID, _dsl_Feature_0); } if (_dsl_Feature_1_defined) { dslhal_api_setPhyFeatureController(ptidsl, INTEROP_FEATURELIST1_PARAMID, _dsl_Feature_1); dslhal_api_enableDisablePhyFeatures(ptidsl, INTEROP_FEATURELIST1_PARAMID, _dsl_Feature_1); } //CQ10280 if (_dsl_PhyControl_0_defined) { dslhal_api_setPhyFeatureController(ptidsl, DSL_PHY_FEATURELIST0_PARAMID, _dsl_PhyControl_0); dslhal_api_enableDisablePhyFeatures(ptidsl, DSL_PHY_FEATURELIST0_PARAMID, _dsl_PhyControl_0); } if (_dsl_PhyControl_1_defined) { dslhal_api_setPhyFeatureController(ptidsl, DSL_PHY_FEATURELIST1_PARAMID, _dsl_PhyControl_1); dslhal_api_enableDisablePhyFeatures(ptidsl, DSL_PHY_FEATURELIST1_PARAMID, _dsl_PhyControl_1); } // set Debug Halt if _DEBUG_HALT_ not zero if (_DEBUG_HALT_) { unsigned dbgHalt = 1; // set debugHalt to 1, this is used for concurrent debugging dslhal_support_dbgHalt(ptidsl, 0/*write*/, &dbgHalt); } #if 1 /*EP: TBD*/ dslhal_support_setDsp250MHzTrigger(ptidsl); #endif #endif /* DSP code download completed. */ #ifdef DSP_RST_WORKAROUND /*work-around*/ dslhal_support_resetDsp(); HOST_REG(REG_PM2EMIF) = HOST_REG(REG_DM2EMIF); #endif dgprintf(4,"tiload: PMEM_OFFSET: 0x%08X\n", HOST_REG(REG_PM2EMIF)); dgprintf(5,"dslhal_support_hostDspCodeDownload() completed.\n"); return DSLHAL_ERROR_NO_ERRORS; } /* end of dslhal_support_hostDspCodeDownload() */ #else /*YAMUNA*/ static unsigned dslhal_support_findProfileIndex(tidsl_t *ptidsl, unsigned int binAddr) { int i=0; for(i=0; inumProfiles; i++) { dgprintf(6, "Comparing %x with %x \n",binAddr, ptidsl->coProfiles[i].BinAddr); if(ptidsl->coProfiles[i].BinAddr == binAddr) return (ptidsl->coProfiles[i].overlayHostAddr); } return dslhal_support_byteSwap32(binAddr); } /******************************************************************************************** * FUNCTION NAME: dslhal_support_hostDspCodeDownload() * ********************************************************************************************* * DESCRIPTION: * download DSP image from host memory to dsp memory * * Return: 0 success * 1 failed * * NOTE: * DSP image is based on LITTLE endian * ********************************************************************************************/ #define DSP_CONSTELLATION_BUFFER_SIZE (1024*4) int dslhal_support_hostDspCodeDownload(tidsl_t * ptidsl) { unsigned int index, numProfile=0; int rc = 0, i; unsigned char *iptr; /* image pointer */ unsigned int numbytes,olayXfer,olayStore; /* unsigned int holdSecPhyAddr=0,holdSecVirtAddr; */ unsigned int *olayStart; unsigned len; /* size of the file */ unsigned expoffset; /* expected offset for next section header */ unsigned short checksum; unsigned int crc32; unsigned char * image; char *tmp = (char *)DEV_HOST_DSP_OAM_POINTER_LOCATION; #if SWTC DEV_HOST_tcHostCommDef_t TCHostCommDef; #endif DEV_HOST_oamWrNegoParaDef_t OamWrNegoParaDef; DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface, *pdspOamSharedInterface; DEV_HOST_olayDpDef_t olayDpParms; DEV_HOST_profileBase_t profileList; #ifndef NO_ACT DEV_HOST_consBufDef_t constDisp; #endif #if CO_PROFILES DEV_HOST_coData_t coData; #endif DEV_HOST_olayDpPageDef_t olayDpPageDef[32]; union { char byte[4]; unsigned short hword[2]; unsigned int aword; } data; struct _header { char signature[6]; unsigned short sectcount; unsigned int length; } header; struct _section { unsigned int addr; unsigned int length; unsigned int offset; unsigned int page; };/* section[MAXSECTIONS]; */ struct _section *sptr; unsigned int secAddr, secLength, secOffset, secPage; unsigned int adjSecLength; unsigned int read_retry = NUM_READ_RETRIES; dgprintf(5,"dslhal_support_hostDspCodeDownload\n"); image = ptidsl->fwimage; if (!image) { dgprintf(1,"no image file\n"); return DSLHAL_ERROR_NO_FIRMWARE_IMAGE; } iptr=image; numbytes = sizeof(header); shim_osMoveMemory((char *) &header, (char *)iptr, numbytes); dgprintf(4,"header.length=%08X, header.sectcount=0x%X\n", header.length, header.sectcount); header.length = dslhal_support_byteSwap32(header.length); header.sectcount = dslhal_support_byteSwap16(header.sectcount); dgprintf(4,"header.length=%08X, header.sectcount=0x%X\n", header.length, header.sectcount); #if 0 crc32 = dslhal_support_computeCrc32((unsigned char*)&crcTest[0],20); dgprintf(6,"CRC-32 for the crcTest: 0x%x",crc32); #endif /* point to the checksum */ /* compute the checksum on CRC32 here */ iptr = image + header.length-4; numbytes = sizeof(data.aword); dgprintf(5,"tiload: check checksum\n"); shim_osMoveMemory((char *)&(data.byte), (char *)iptr, numbytes); crc32 = dslhal_support_computeCrc32(image,ptidsl->imagesize); dgprintf(5,"CRC-32 for the Binary: 0x%x\n",crc32); /* CRC currently not added to the DSP binary, so this code is commented out */ dgprintf(5,"CRC-32 in the Binary: 0x%x\n",data.aword); data.aword = dslhal_support_byteSwap32(data.aword); dgprintf(5,"CRC-32 in the Binary: 0x%x\n",data.aword); if (data.aword != crc32) { dgprintf(1,"Checksum error\n"); } /* Verify signature - Changed from "320C6x" to "TIDSL" for load 80 */ header.signature[5]='\0'; dgprintf(5, "signature=%s\n", header.signature); if (shim_osStringCmp(header.signature, "TIDSL")) { dgprintf(1,"Signature not match\n"); } dgprintf(5,"tiload: check sect count\n"); /* check section count */ if (header.sectcount > MAXSECTIONS) { dgprintf(5,"Unusually high Section Count# %d %d\n", header.sectcount, MAXSECTIONS); } else { dgprintf(5,"found %d sections\n", header.sectcount); } /* Validation of Section offsets */ /* point to the first section */ len = header.length; /* file size in bytes */ expoffset = sizeof(struct _header) + header.sectcount * sizeof(struct _section); ptidsl->numOlayPages = 1; ptidsl->numProfiles=0; dgprintf(5,"tiload: check offset\n"); for (index=0; indexaddr); secOffset = dslhal_support_byteSwap32(sptr->offset); secLength = dslhal_support_byteSwap32(sptr->length); secPage = dslhal_support_byteSwap32(sptr->page); /* validate offset */ if ( secOffset== 0xffffffff) { /* special case: zero fill */ /* offset is valid, don't change expoffset */ } else { if (secOffset > len-4) { dgprintf(5,"Offset error\n"); return DSLHAL_ERROR_FIRMWARE_OFFSET; } /* determine expected offset of NEXT section */ expoffset = secLength + secOffset; /* all addresses must be on word boundaries */ if (secAddr & 3) { } } } /* check final offset - should just be a checksum left */ /* IMPORTANT 11/24/02 --> Got this error... but bypassed for Pf of Concept*/ /* if (expoffset != len-4) { dgprintf(5,"Final offset error\n"); return DSLHAL_ERROR_FIRMWARE_OFFSET; } */ /* Actual Code loading to DSP Memory */ /* Initialize DSP Data Memory before code load*/ /* dgprintf(5,"Zero Prefill DSP DMEM\n"); DSLHAL_REG32(ADSLSSADR)=0x80000000; shim_osZeroMemory((char *)0xa1000000, 0x10000); */ /* Load sections from the image */ for (index=0; indexaddr); secOffset = dslhal_support_byteSwap32(sptr->offset); secLength = dslhal_support_byteSwap32(sptr->length); secPage = dslhal_support_byteSwap32(sptr->page); data.aword = secAddr; checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3]; data.aword = secLength; checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3]; data.aword = secOffset; checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3]; data.aword = secPage; checksum += data.byte[0] + data.byte[1] + data.byte[2] + data.byte[3]; /* validate offset */ if (secOffset == 0xffffffff) { /* special case: zero fill */ /* offset is valid, don't change expoffset */ } else { /* real offset */ if(secOffset > len-4) { dgprintf(5,"section[%u] offset too big (%X/%X)\n", index, secOffset, len-4); return DSLHAL_ERROR_FIRMWARE_OFFSET; } /* determine expected offset of NEXT section */ expoffset = secLength + secOffset; } } /* check final offset - should just be a checksum left */ /* if(expoffset != len-4) { dgprintf(1,"sections don't span full file (%X/%X)\n",expoffset,len-2); return DSLHAL_ERROR_FIRMWARE_OFFSET; } */ dgprintf(5,"tiload: load binary\n"); for (index=0; indexaddr); secOffset = dslhal_support_byteSwap32(sptr->offset); secLength = dslhal_support_byteSwap32(sptr->length); secPage = dslhal_support_byteSwap32(sptr->page); dgprintf(6,"loading section %u\n", index); dgprintf(6,"section %u: addr: %X\n", index, secAddr); dgprintf(6,"section %u: length: %X\n", index, secLength); dgprintf(6,"section %u: offset: %X\n", index, secOffset); dgprintf(6,"section %u: page: %X\n", index, secPage); /* point to the section's data */ if(secOffset != 0xffffffff) { /* Load this section of data */ iptr = image + secOffset; dgprintf(6, "iptr %8x\n", (unsigned int)iptr); } if(secPage) { dgprintf(6,"OVERLAY PAGE #%d\n",secPage); /* overlay page, don't write to dsp yet, save into host memory*/ dgprintf(6,"Section Length: %d \n",secLength); ptidsl->olayDpPage[secPage].PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength); ptidsl->numOlayPages++; if(ptidsl->olayDpPage[secPage].PmemStartWtAddr == NULL) { dgprintf(1, "overlay page allocate error\n"); return DSLHAL_ERROR_OVERLAY_MALLOC; } #ifdef PRE_SILICON ptidsl->olayDpPage[secPage].overlayHostAddr = ((((ptidsl->olayDpPage[secPage].PmemStartWtAddr)-0x84000000)-0x10000000)+0x030b0000); #else /* ptidsl->olayDpPage[secPage].overlayHostAddr = ((unsigned int)(ptidsl->olayDpPage[secPage].PmemStartWtAddr)&~0xe0000000); */ ptidsl->olayDpPage[secPage].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->olayDpPage[secPage].PmemStartWtAddr); #endif dgprintf(6,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->olayDpPage[secPage].PmemStartWtAddr,ptidsl->olayDpPage[secPage].overlayHostAddr); ptidsl->olayDpPage[secPage].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->olayDpPage[secPage].overlayHostAddr); ptidsl->olayDpPage[secPage].OverlayXferCount = secLength; ptidsl->olayDpPage[secPage].BinAddr = secAddr; ptidsl->olayDpPage[secPage].SecOffset = secOffset; shim_osMoveMemory((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, (char *)iptr, secLength); /* RamP Image ByteSwap test */ olayStart = (unsigned int *)ptidsl->olayDpPage[secPage].PmemStartWtAddr; for(olayXfer=0;olayXfer< secLength/4;olayXfer++) { olayStore = *(unsigned int *)olayStart; olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore); *(unsigned int*)olayStart = olayStore; // dgprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore); dgprintf(7, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore); olayStart++; olayStore=0; } /* RamP Image ByteSwap test */ /* compute the CRC of each overlay page and Store the Checksum in a local global variable */ /* This Value of CRC is to be compared with the header where all the CRC bytes are lumped together */ ptidsl->olayDpPage[secPage].olayPageCrc32 = dslhal_support_computeCrc32((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, ptidsl->olayDpPage[secPage].OverlayXferCount); shim_osWriteBackCache((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, secLength); } else { rc = secAddr&0xff000000; if(rc && rc!=0x80000000) { dgprintf(4,"Not DSP PMEM/DMEM\n"); /* don't write to dsp, save into host memory*/ dgprintf(4,"Section Addr: %x Section Length: %d \n",secAddr,secLength); //CQ9717 cph fixed odd bytes not swaped problem adjSecLength = ((secLength+3)/4)*4; // cph adjusted section length (must be multiple of 4) ptidsl->coProfiles[numProfile].PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(adjSecLength); ptidsl->numProfiles++; if(ptidsl->coProfiles[numProfile].PmemStartWtAddr == NULL) { dgprintf(1, "memory allocate error\n"); return DSLHAL_ERROR_OVERLAY_MALLOC; } ptidsl->coProfiles[numProfile].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->coProfiles[numProfile].PmemStartWtAddr); dgprintf(4,"Num: %d Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",numProfile, ptidsl->coProfiles[numProfile].PmemStartWtAddr, ptidsl->coProfiles[numProfile].overlayHostAddr); ptidsl->coProfiles[numProfile].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->coProfiles[numProfile].overlayHostAddr); ptidsl->coProfiles[numProfile].OverlayXferCount = secLength; ptidsl->coProfiles[numProfile].BinAddr = secAddr; ptidsl->coProfiles[numProfile].SecOffset = secOffset; if (secOffset==0xFFFFFFFF) //7/20/05, cph virtual address doesn't need move data { olayStart = (unsigned int *)ptidsl->coProfiles[numProfile].PmemStartWtAddr; for(olayXfer=0;olayXfercoProfiles[numProfile].PmemStartWtAddr, (char *)iptr, secLength); /* RamP Image ByteSwap test */ olayStart = (unsigned int *)ptidsl->coProfiles[numProfile].PmemStartWtAddr; //CQ9717, cph fixed odd bytes not swaped problem for(olayXfer=0;olayXfer< adjSecLength/4;olayXfer++) { olayStore = *(unsigned int *)olayStart; olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore); *(unsigned int*)olayStart = olayStore; dgprintf(7, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore); olayStart++; olayStore=0; } } shim_osWriteBackCache((void *)ptidsl->coProfiles[numProfile].PmemStartWtAddr, secLength); numProfile++; if(numProfile > 6) dgprintf(5, "Error in Binary! Too Much Scratch! \n "); } else { /* IMPORTANT: write image to DSP memory */ rc=dslhal_support_blockWrite((void *)iptr, (void *)secAddr, secLength); if(rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } shim_osClockWait(0x80000); /* rc=dslhal_support_blockRead((void*)secAddr, (void*)tmpBuffer, secLength); if(rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } for(i=0;inumOlayPages, ptidsl->numProfiles); /* get main pointer for data */ while(read_retry--) { rc = dslhal_support_blockRead(tmp, &pdspOamSharedInterface, sizeof(unsigned int)); dgprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface); pdspOamSharedInterface= (DEV_HOST_dspOamSharedInterface_t *)dslhal_support_byteSwap32((unsigned int)pdspOamSharedInterface); dgprintf(5, "tmp=0x%X, addr=0x%X\n", (unsigned int)tmp, (unsigned int)pdspOamSharedInterface); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } if(!pdspOamSharedInterface) { if(!read_retry) { dgprintf(1,"Couldn't read main pointer\n"); return DSLHAL_ERROR_INVALID_PARAM; } else shim_osClockWait(0x100); } else break; } ptidsl->pmainAddr=pdspOamSharedInterface; /*TBD, ep*/ rc = dslhal_support_blockRead((void *)(0x80000004), &ptidsl->pIntAddr, sizeof(unsigned)); ptidsl->pIntAddr = (void *)dslhal_support_byteSwap32((unsigned)ptidsl->pIntAddr); dgprintf(5, "pIntAddr=0x%X\n", (unsigned)ptidsl->pIntAddr); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /*TBD, ep*/ /* read the OamSharedInterfaceStructure */ dgprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr); /* get the pointer to DSP-OAM Shared Interface */ rc = dslhal_support_blockRead(pdspOamSharedInterface, &dspOamSharedInterface, sizeof(DEV_HOST_dspOamSharedInterface_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /* Communicate the Allocated Memory Address to DSP to choose CO Profiles */ /* Change the Endianness of the profileList pointer */ dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p); /* Access the profileList Structure */ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } dgprintf(2,"Old Addr:%x New: %x \n",profileList.hostProfileBase_p,ptidsl->coProfiles[0].overlayHostAddr); profileList.hostProfileBase_p = (DEV_HOST_coData_t *)dslhal_support_findProfileIndex(ptidsl, dslhal_support_byteSwap32((unsigned int)profileList.hostProfileBase_p)); // profileList.hostProfileBase_p = (DEV_HOST_coData_t *)ptidsl->coProfiles[1].overlayHostAddr; profileList.dspScratchMem_p0 = (unsigned int *) dslhal_support_findProfileIndex(ptidsl, dslhal_support_byteSwap32((unsigned int)profileList.dspScratchMem_p0)); profileList.dspScratchMem_p1 = (unsigned int *)dslhal_support_findProfileIndex(ptidsl,dslhal_support_byteSwap32((unsigned int)profileList.dspScratchMem_p1)); profileList.dspScratchMem_p2 = (unsigned int *)dslhal_support_findProfileIndex(ptidsl,dslhal_support_byteSwap32((unsigned int)profileList.dspScratchMem_p2)); profileList.dspScratchMem_p3 = (unsigned int *)dslhal_support_findProfileIndex(ptidsl,dslhal_support_byteSwap32((unsigned int)profileList.dspScratchMem_p3)); rc = dslhal_support_blockWrite(&profileList,(PVOID)dspOamSharedInterface.profileList_p,sizeof(DEV_HOST_profileBase_t)); if (rc) return DSLHAL_ERROR_BLOCK_WRITE; /* Communicate the Allocated Memory Address to DSP to do overlays */ /* Change the Endianness of the olayDpDef pointer */ dspOamSharedInterface.olayDpParms_p = (DEV_HOST_olayDpDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.olayDpParms_p); /* Access the olayDpDef Structure */ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.olayDpParms_p,&olayDpParms, sizeof(DEV_HOST_olayDpDef_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } for(i=1;inumOlayPages;i++) { /* Change the endianness of the olayDpPageDef Pointer */ olayDpParms.olayDpPage_p[i] = (DEV_HOST_olayDpPageDef_t *) dslhal_support_byteSwap32((unsigned int)olayDpParms.olayDpPage_p[i]); /* Access the olayDpPageDef Structure */ rc = dslhal_support_blockRead((PVOID)olayDpParms.olayDpPage_p[i],&olayDpPageDef[i],sizeof(DEV_HOST_olayDpPageDef_t)); if (rc) return DSLHAL_ERROR_BLOCK_READ; olayDpPageDef[i].overlayHostAddr = ptidsl->olayDpPage[i].overlayHostAddr; rc = dslhal_support_blockWrite(&olayDpPageDef[i],(PVOID)olayDpParms.olayDpPage_p[i],sizeof(DEV_HOST_olayDpPageDef_t)); if (rc) return DSLHAL_ERROR_BLOCK_WRITE; } /* table_dsp info */ #if SWTC dspOamSharedInterface.tcHostComm_p = (DEV_HOST_tcHostCommDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.tcHostComm_p); rc = dslhal_support_blockRead(&pdspOamSharedInterface->tcHostComm_p, &pTCHostCommDef, 4); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } pTCHostCommDef=(DEV_HOST_tcHostCommDef_t *) dslhal_support_byteSwap32((unsigned int)pTCHostCommDef); rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.tcHostComm_p, &TCHostCommDef, sizeof(DEV_HOST_tcHostCommDef_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } #endif /* Select the Multimode Training */ dspOamSharedInterface.oamWriteNegoParams_p = (DEV_HOST_oamWrNegoParaDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.oamWriteNegoParams_p); rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.oamWriteNegoParams_p, &OamWrNegoParaDef, sizeof(DEV_HOST_oamWrNegoParaDef_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } dslhal_support_getNetService(ptidsl); switch(ptidsl->netService) { case 1: // Set POTS load default training mode to Multi-Mode OamWrNegoParaDef.stdMode = MULTI_MODE8; OamWrNegoParaDef.stdMode_byte2 = MULTI_MODE8; dgprintf(5,"POTS Service \n"); break; case 2: // Set ISDN load default training mode to MultiMode //was GDMT // OamWrNegoParaDef.stdMode = GDMT_MODE; // OamWrNegoParaDef.stdMode_byte2 = 0; OamWrNegoParaDef.stdMode = MULTI_MODE8; OamWrNegoParaDef.stdMode_byte2 = MULTI_MODE8; dgprintf(5,"ISDN Service \n"); break; default: OamWrNegoParaDef.stdMode = T1413_MODE; OamWrNegoParaDef.stdMode_byte2 = 0; dgprintf(5,"Default Service \n"); break; } #if 0 /*ep*/ ptidsl->AppData.StdMode = (unsigned int)OamWrNegoParaDef.stdMode; #endif OamWrNegoParaDef.oamFeature = dslhal_support_byteSwap32((OAMFEATURE_TC_SYNC_DETECT_MASK)); /* Set the flag to start retraining if the margin of the modem drops below default margin during showtime */ OamWrNegoParaDef.marginMonitorShwtme = FALSE; /* Set the flag to start retraining if the margin of the modem drops below default margin during training */ OamWrNegoParaDef.marginMonitorTrning = FALSE; OamWrNegoParaDef.dsToneTurnoff_f = 0; dslhal_support_blockWrite(&OamWrNegoParaDef, (PVOID)dspOamSharedInterface.oamWriteNegoParams_p, sizeof(DEV_HOST_oamWrNegoParaDef_t)); rc=dslhal_support_setInterruptMask(ptidsl,0); if(rc!=DSLHAL_ERROR_NO_ERRORS) return rc; // DSL phy feature control if (_dsl_Feature_0_defined) { dslhal_api_setPhyFeatureController(ptidsl, INTEROP_FEATURELIST0_PARAMID, _dsl_Feature_0); dslhal_api_enableDisablePhyFeatures(ptidsl, INTEROP_FEATURELIST0_PARAMID, _dsl_Feature_0); } if (_dsl_Feature_1_defined) { dslhal_api_setPhyFeatureController(ptidsl, INTEROP_FEATURELIST1_PARAMID, _dsl_Feature_1); dslhal_api_enableDisablePhyFeatures(ptidsl, INTEROP_FEATURELIST1_PARAMID, _dsl_Feature_1); } //CQ10280 if (_dsl_PhyControl_0_defined) { dslhal_api_setPhyFeatureController(ptidsl, DSL_PHY_FEATURELIST0_PARAMID, _dsl_PhyControl_0); dslhal_api_enableDisablePhyFeatures(ptidsl, DSL_PHY_FEATURELIST0_PARAMID, _dsl_PhyControl_0); } if (_dsl_PhyControl_1_defined) { dslhal_api_setPhyFeatureController(ptidsl, DSL_PHY_FEATURELIST1_PARAMID, _dsl_PhyControl_1); dslhal_api_enableDisablePhyFeatures(ptidsl, DSL_PHY_FEATURELIST1_PARAMID, _dsl_PhyControl_1); } // set Debug Halt if _DEBUG_HALT_ not zero if (_DEBUG_HALT_) { unsigned dbgHalt = 1; // set debugHalt to 1, this is used for concurrent debugging dslhal_support_dbgHalt(ptidsl, 0/*write*/, &dbgHalt); } /* Co Profile Test */ #if CO_PROFILES dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p); /* Access the profileList Structure */ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } profileList.hostProfileBase_p = (DEV_HOST_coData_t *)dslhal_support_byteSwap32((unsigned int)profileList.hostProfileBase_p); rc = dslhal_support_blockRead((PVOID)profileList.hostProfileBase_p,&coData, sizeof(DEV_HOST_coData_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } dgprintf(2,"Current Profile Vendor Id: %x \n",coData.phyAgcPgaTarget); coData.phyAgcPgaTarget = 0xcaba; rc = dslhal_support_blockWrite(&coData,(PVOID)profileList.hostProfileBase_p,sizeof(DEV_HOST_coData_t)); if(rc) return DSLHAL_ERROR_BLOCK_WRITE; #endif /* End of CO Profile Test */ #ifndef NO_ACT /* Constellation Display Buffer Allocate */ ptidsl->constDisplay.PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(DSP_CONSTELLATION_BUFFER_SIZE); if(ptidsl->constDisplay.PmemStartWtAddr == NULL) { dgprintf(1, "memory allocate error\n"); return DSLHAL_ERROR_OVERLAY_MALLOC; } shim_osZeroMemory((void*)ptidsl->constDisplay.PmemStartWtAddr,DSP_CONSTELLATION_BUFFER_SIZE); ptidsl->constDisplay.overlayHostAddr = virtual2Physical((unsigned int)ptidsl->constDisplay.PmemStartWtAddr); dgprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.overlayHostAddr); ptidsl->constDisplay.OverlayXferCount = DSP_CONSTELLATION_BUFFER_SIZE; /* Communicate the Allocated Buffer for DSP load Constellation Data */ /* Change the Endianness of the profileList pointer */ dspOamSharedInterface.consDispVar_p = (DEV_HOST_consBufDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.consDispVar_p); /* Access the profileList Structure */ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.consDispVar_p,&constDisp, sizeof(DEV_HOST_consBufDef_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } dgprintf(2,"Constellation Old Addr:%x New: %x \n",constDisp.consDispStartAddr,ptidsl->constDisplay.overlayHostAddr); constDisp.consDispStartAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->constDisplay.overlayHostAddr); constDisp.consDispCurrentAddr = constDisp.consDispStartAddr; constDisp.consDispBufLen = (unsigned int)dslhal_support_byteSwap32(DSP_CONSTELLATION_BUFFER_SIZE); rc = dslhal_support_blockWrite(&constDisp,(PVOID)dspOamSharedInterface.consDispVar_p,sizeof(DEV_HOST_consBufDef_t)); if (rc) return DSLHAL_ERROR_BLOCK_WRITE; #endif dgprintf(5,"dslhal_support_hostDspCodeDownload() completed.\n"); return DSLHAL_ERROR_NO_ERRORS; } /* end of dslhal_support_hostDspCodeDownload() */ /******************************************************************************************** * FUNCTION NAME: dslhal_support_checkOverlayPage() * ********************************************************************************************* * DESCRIPTION: * Computes the CRC-32 for the input data and compares it with reference * * Return: Error Condition (if any) * * * NOTE: * DSP image is based on LITTLE endian * ********************************************************************************************/ unsigned int dslhal_support_checkOverlayPage(tidsl_t *ptidsl, unsigned int tag) { unsigned int computedCrc; if((unsigned char *)ptidsl->olayDpPage[tag].PmemStartWtAddr == NULL) { dgprintf(5,"Null Address for Page: %d\n",tag); return DSLHAL_ERROR_OVERLAY_MALLOC; } computedCrc = dslhal_support_computeCrc32((unsigned char *)ptidsl->olayDpPage[tag].PmemStartWtAddr, ptidsl->olayDpPage[tag].OverlayXferCount); dgprintf(6,"\n Pre-Computed CRC32 = 0x%x \t Current CRC32 = 0x%x \n",ptidsl->olayDpPage[tag].olayPageCrc32,computedCrc); if(computedCrc != ptidsl->olayDpPage[tag].olayPageCrc32) return DSLHAL_ERROR_OVERLAY_CORRUPTED; else return DSLHAL_ERROR_NO_ERRORS; } /******************************************************************************************** * FUNCTION NAME: dslhal_support_clearTrainingInfo() * ********************************************************************************************* * DESCRIPTION: * Computes the CRC-32 for the input data and compares it with reference * * Return: Error Condition (if any) * * * NOTE: * DSP image is based on LITTLE endian * ********************************************************************************************/ int dslhal_support_clearTrainingInfo(tidsl_t *ptidsl) { int i; for(i=0; inumOlayPages; i++) { if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL) { shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr, ptidsl->olayDpPage[i].OverlayXferCount); ptidsl->olayDpPage[i].PmemStartWtAddr =NULL; } } for(i=0; inumProfiles; i++) { if(ptidsl->coProfiles[i].PmemStartWtAddr != NULL) { shim_osFreeDmaMemory((void *)ptidsl->coProfiles[i].PmemStartWtAddr, ptidsl->coProfiles[i].OverlayXferCount); ptidsl->coProfiles[i].PmemStartWtAddr = NULL; } } return 0; } /******************************************************************************************** * FUNCTION NAME: dslhal_support_reloadTrainingInfo() * ********************************************************************************************* * DESCRIPTION: * Reload overlay pages from flash or memory * * Return: 0 success * 1 failed * * NOTE: * DSP image is based on LITTLE endian * ********************************************************************************************/ static int dslhal_support_reloadTrainingInfo(tidsl_t * ptidsl) { int rc = 0, i; unsigned int olayXfer,olayStore; unsigned int *olayStart; unsigned int crc32; DEV_HOST_dspOamSharedInterface_t dspOamSharedInterface; DEV_HOST_olayDpDef_t olayDpParms; DEV_HOST_olayDpPageDef_t olayDpPageDef[ptidsl->numOlayPages]; DEV_HOST_profileBase_t profileList; unsigned int secLength, secOffset, secPage; /* co profile */ for(i=0; inumProfiles;i++) { secLength = ptidsl->coProfiles[i].OverlayXferCount; secOffset = ptidsl->coProfiles[i].SecOffset; ptidsl->coProfiles[i].PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength); if(ptidsl->coProfiles[i].PmemStartWtAddr == NULL) { dgprintf(1, "memory allocate error\n"); return DSLHAL_ERROR_OVERLAY_MALLOC; } /* holdSecPhyAddr = virtual2Physical((unsigned int)holdSecVirtAddr); */ ptidsl->coProfiles[i].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->coProfiles[i].PmemStartWtAddr); dgprintf(4,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->coProfiles[i].PmemStartWtAddr, ptidsl->coProfiles[i].overlayHostAddr); ptidsl->coProfiles[i].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->coProfiles[i].overlayHostAddr); rc = shim_read_overlay_page((void *)ptidsl->coProfiles[i].PmemStartWtAddr, secOffset, secLength); if(rc != secLength) { dgprintf(1, "shim_read_overlay_page failed\n"); return DSLHAL_ERROR_OVERLAY_MALLOC; } /*shim_osMoveMemory((char *)ptidsl->coProfiles[i].PmemStartWtAddr, (char *)iptr, secLength);*/ /* RamP Image ByteSwap test */ olayStart = (unsigned int *)ptidsl->coProfiles[i].PmemStartWtAddr; for(olayXfer=0;olayXfer< secLength/4;olayXfer++) { olayStore = *(unsigned int *)olayStart; olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore); *(unsigned int*)olayStart = olayStore; // dgprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore); dgprintf(7, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore); olayStart++; olayStore=0; } shim_osWriteBackCache((void *)ptidsl->coProfiles[i].PmemStartWtAddr, secLength); } for (secPage=1;secPagenumOlayPages; secPage++) { dgprintf(6,"OVERLAY PAGE #%d\n",secPage); secLength = ptidsl->olayDpPage[secPage].OverlayXferCount; dgprintf(4,"Section[%d] Length: %d \n",secPage, secLength); secOffset = ptidsl->olayDpPage[secPage].SecOffset; ptidsl->olayDpPage[secPage].PmemStartWtAddr = (unsigned int) shim_osAllocateDmaMemory(secLength); if(ptidsl->olayDpPage[secPage].PmemStartWtAddr == NULL) { dgprintf(1, "overlay page allocate error\n"); return DSLHAL_ERROR_OVERLAY_MALLOC; } rc = shim_read_overlay_page((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr,secOffset, secLength); if(rc != secLength) { dgprintf(1, "overlay page read error\n"); return DSLHAL_ERROR_OVERLAY_MALLOC; } /* ptidsl->olayDpPage[secPage].overlayHostAddr = ((unsigned int)(ptidsl->olayDpPage[secPage].PmemStartWtAddr)&~0xe0000000); */ ptidsl->olayDpPage[secPage].overlayHostAddr = virtual2Physical((unsigned int)ptidsl->olayDpPage[secPage].PmemStartWtAddr); dgprintf(6,"Allocated Addr: 0x%x \t Xlated Addr: 0x%x \n",ptidsl->olayDpPage[secPage].PmemStartWtAddr,ptidsl->olayDpPage[secPage].overlayHostAddr); ptidsl->olayDpPage[secPage].overlayHostAddr = (unsigned int)dslhal_support_byteSwap32(ptidsl->olayDpPage[secPage].overlayHostAddr); /*ptidsl->olayDpPage[secPage].OverlayXferCount = secLength; ptidsl->olayDpPage[secPage].BinAddr = secAddr; shim_osMoveMemory((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, (char *)iptr, secLength); */ olayStart = (unsigned int *)ptidsl->olayDpPage[secPage].PmemStartWtAddr; for(olayXfer=0;olayXfer< secLength/4;olayXfer++) { olayStore = *(unsigned int *)olayStart; olayStore = (unsigned int)dslhal_support_byteSwap32(olayStore); *(unsigned int*)olayStart = olayStore; // dgprintf(5, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore); dgprintf(7, "Addr:0x%x \t Content: 0x%x \n",olayStart,olayStore); olayStart++; olayStore=0; } /* RamP Image ByteSwap test */ /* compute the CRC of each overlay page and Store the Checksum in a local global variable */ /* This Value of CRC is to be compared with the header where all the CRC bytes are lumped together */ crc32 = dslhal_support_computeCrc32((char *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, ptidsl->olayDpPage[secPage].OverlayXferCount); if(crc32 != ptidsl->olayDpPage[secPage].olayPageCrc32) return DSLHAL_ERROR_OVERLAY_MALLOC; shim_osWriteBackCache((void *)ptidsl->olayDpPage[secPage].PmemStartWtAddr, secLength); } dgprintf(5,"ptidsl->hostIf.mainAddr=0x%X\n", (unsigned int)ptidsl->pmainAddr); /* get the pointer to DSP-OAM Shared Interface */ rc = dslhal_support_blockRead(ptidsl->pmainAddr, &dspOamSharedInterface, sizeof(DEV_HOST_dspOamSharedInterface_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } /* Communicate the Allocated Memory Address to DSP to choose CO Profiles */ /* Change the Endianness of the profileList pointer */ dspOamSharedInterface.profileList_p = (DEV_HOST_profileBase_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.profileList_p); /* Access the profileList Structure */ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.profileList_p,&profileList, sizeof(DEV_HOST_profileBase_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } dgprintf(2,"Old Addr:%x New: %x \n",profileList.hostProfileBase_p,ptidsl->coProfiles[0].overlayHostAddr); profileList.hostProfileBase_p = (DEV_HOST_coData_t *)dslhal_support_findProfileIndex(ptidsl, dslhal_support_byteSwap32((unsigned int)profileList.hostProfileBase_p)); // profileList.hostProfileBase_p = (DEV_HOST_coData_t *)ptidsl->coProfiles[1].overlayHostAddr; profileList.dspScratchMem_p0 = (unsigned int *) dslhal_support_findProfileIndex(ptidsl, dslhal_support_byteSwap32((unsigned int)profileList.dspScratchMem_p0)); profileList.dspScratchMem_p1 = (unsigned int *)dslhal_support_findProfileIndex(ptidsl,dslhal_support_byteSwap32((unsigned int)profileList.dspScratchMem_p1)); profileList.dspScratchMem_p2 = (unsigned int *)dslhal_support_findProfileIndex(ptidsl,dslhal_support_byteSwap32((unsigned int)profileList.dspScratchMem_p2)); profileList.dspScratchMem_p3 = (unsigned int *)dslhal_support_findProfileIndex(ptidsl,dslhal_support_byteSwap32((unsigned int)profileList.dspScratchMem_p3)); rc = dslhal_support_blockWrite(&profileList,(PVOID)dspOamSharedInterface.profileList_p,sizeof(DEV_HOST_profileBase_t)); if (rc) return DSLHAL_ERROR_BLOCK_WRITE; /* Communicate the Allocated Memory Address to DSP to do overlays */ /* Change the Endianness of the olayDpDef pointer */ dspOamSharedInterface.olayDpParms_p = (DEV_HOST_olayDpDef_t *)dslhal_support_byteSwap32((unsigned int)dspOamSharedInterface.olayDpParms_p); /* Access the olayDpDef Structure */ rc = dslhal_support_blockRead((PVOID)dspOamSharedInterface.olayDpParms_p,&olayDpParms, sizeof(DEV_HOST_olayDpDef_t)); if (rc) { dgprintf(1,"dslhal_support_blockRead failed\n"); return DSLHAL_ERROR_BLOCK_READ; } for(i=1;inumOlayPages;i++) { /* Change the endianness of the olayDpPageDef Pointer */ olayDpParms.olayDpPage_p[i] = (DEV_HOST_olayDpPageDef_t *) dslhal_support_byteSwap32((unsigned int)olayDpParms.olayDpPage_p[i]); /* Access the olayDpPageDef Structure */ rc = dslhal_support_blockRead((PVOID)olayDpParms.olayDpPage_p[i],&olayDpPageDef[i],sizeof(DEV_HOST_olayDpPageDef_t)); if (rc) return DSLHAL_ERROR_BLOCK_READ; olayDpPageDef[i].overlayHostAddr = ptidsl->olayDpPage[i].overlayHostAddr; rc = dslhal_support_blockWrite(&olayDpPageDef[i],(PVOID)olayDpParms.olayDpPage_p[i],sizeof(DEV_HOST_olayDpPageDef_t)); if (rc) return DSLHAL_ERROR_BLOCK_WRITE; } ptidsl->bOverlayPageLoaded = 1; return DSLHAL_ERROR_NO_ERRORS; } /* end of dslhal_support_reloadTrainingInfo() */ /******************************************************************************************** * FUNCTION NAME: dslhal_support_restoreTrainingInfo() * ********************************************************************************************* * DESCRIPTION: * Computes the CRC-32 for the input data and compares it with reference * * Return: Error Condition (if any) * * * NOTE: * DSP image is based on LITTLE endian * ********************************************************************************************/ int dslhal_support_restoreTrainingInfo(tidsl_t *ptidsl) { int rc; rc=1; while(rc != 0) { dslhal_support_clearTrainingInfo(ptidsl); //shim_osCriticalEnter(); rc = dslhal_support_reloadTrainingInfo(ptidsl); //shim_osCriticalExit(); shim_osClockWait(6400); } return 0; } /******************************************************************************* * EP-added, 20060301 *******************************************************************************/ void dslhal_support_freeOverlayPage(tidsl_t *ptidsl) { unsigned i; for(i=0; inumOlayPages; i++) { if(ptidsl->olayDpPage[i].PmemStartWtAddr !=NULL) { shim_osFreeDmaMemory((void *) ptidsl->olayDpPage[i].PmemStartWtAddr, ptidsl->olayDpPage[i].OverlayXferCount); } } for(i=0; inumProfiles; i++) { if(ptidsl->coProfiles[i].PmemStartWtAddr != NULL) shim_osFreeDmaMemory((void *)ptidsl->coProfiles[i].PmemStartWtAddr, ptidsl->coProfiles[i].OverlayXferCount); } if(ptidsl->constDisplay.PmemStartWtAddr != NULL) shim_osFreeDmaMemory((void *)ptidsl->constDisplay.PmemStartWtAddr, ptidsl->constDisplay.OverlayXferCount); } #endif /*YAMUNA*/