Example #1
0
DSL_DRV_STATIC DSL_uint_t DSL_DRV_Poll(DSL_DRV_DevHeader_t *pDrvHdr)
{
   DSL_int_t nRet = 0;
   DSL_OpenContext_t *pOpenCtx = pDrvHdr->pOpenCtx;

   DSL_DEBUG(DSL_DBG_MSG, (DSL_NULL, "IN - DSL_DRV_Poll" DSL_DRV_CRLF));

   if (pOpenCtx == DSL_NULL)
   {
      /* This should never happen */
      DSL_DEBUG(DSL_DBG_ERR, (DSL_NULL, "!!! Ioctl call for file which "
         "was not opened" DSL_DRV_CRLF));

      return -EFAULT;
   }
#if 0
   poll_wait(pFile, &pOpenCtx->eventWaitQueue, wait);

   if(DSL_DRV_MUTEX_LOCK(pOpenCtx->eventMutex))
   {
      DSL_DEBUG( DSL_DBG_ERR, (DSL_NULL, "Couldn't lock event mutex"DSL_DRV_CRLF));
      return DSL_ERROR;
   }

   if (pOpenCtx->eventFifo == DSL_NULL
      || pOpenCtx->eventFifoBuf == DSL_NULL
      || pOpenCtx->bEventActivation == DSL_FALSE)
   {
      DSL_DEBUG(DSL_DBG_WRN,
         (DSL_NULL, "!!! Ioctl call for file which was not configured"
                    " for event handling!!!" DSL_DRV_CRLF));
   }
   else
   {
      if ( DSL_Fifo_isEmpty( pOpenCtx->eventFifo ) == DSL_FALSE )
      {
         nRet |= POLLIN | POLLRDNORM; /* an event available */
      }
   }

   DSL_DRV_MUTEX_UNLOCK(pOpenCtx->eventMutex);

   DSL_DEBUG(DSL_DBG_MSG, (DSL_NULL, "OUT - DSL_DRV_Poll" DSL_DRV_CRLF));
#endif

   return nRet;
}
static DSL_Error_t DSL_CEOC_CallbackHandle(
   DSL_Context_t *pContext,
   DSL_uint16_t protIdent,
   DSL_CEOC_Message_t *pMsg)
{
   DSL_Error_t nErrCode = DSL_SUCCESS;
   DSL_uint8_t i = 0;

   DSL_CHECK_POINTER(pContext, pMsg);
   DSL_CHECK_ERR_CODE();

   if( DSL_CEOC_CONTEXT(pContext) == DSL_NULL )
   {
      DSL_DEBUG(DSL_DBG_ERR,
         (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - CEOC module not started!"
         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

      return DSL_ERROR;
   }

   /* Lock CEOC internal API mutex*/
   if( DSL_DRV_MUTEX_LOCK( DSL_CEOC_CONTEXT(pContext)->ceocInternMutex ) )
   {
      return DSL_ERROR;
   }

   for( i = 0; i < DSL_DRV_MAX_DEVICE_NUMBER; i++ )
   {
      if( !(DSL_CEOC_CONTEXT(pContext)->pCeocEventCallback[i]) )
         continue;

      if( DSL_CEOC_CONTEXT(pContext)->pCeocEventCallback[i](protIdent, pMsg) != DSL_SUCCESS )
      {
         DSL_DEBUG(DSL_DBG_ERR,
            (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - CEOC CallBack(%d) handle failed!"
            DSL_DRV_CRLF, DSL_DEV_NUM(pContext), i));
      }
   }

   /* Unlock CEOC internal API mutex*/
   DSL_DRV_MUTEX_UNLOCK( DSL_CEOC_CONTEXT(pContext)->ceocInternMutex );

   return nErrCode;
}
static DSL_Error_t DSL_CEOC_FifoSnmpMessageWrite(
   DSL_Context_t *pContext,
   DSL_CEOC_Message_t *pMsg)
{
   DSL_Error_t nErrCode = DSL_SUCCESS;
   DSL_uint8_t *pElmnt = DSL_NULL;
   DSL_OpenContext_t *pCurr;

   DSL_CHECK_POINTER(pContext, pContext->pDevCtx);
   DSL_CHECK_ERR_CODE();
   DSL_CHECK_POINTER(pContext, DSL_CEOC_CONTEXT(pContext));
   DSL_CHECK_ERR_CODE();

   DSL_DEBUG(DSL_DBG_MSG,
      (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_CEOC_FifoSnmpMessageWrite"
      DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

   /* Lock Open Context list*/
   if (DSL_DRV_MUTEX_LOCK(pContext->pDevCtx->openContextListMutex))
   {
      DSL_DEBUG( DSL_DBG_ERR,
         (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: ERROR - Couldn't lock Context List mutex!"
         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

      return DSL_ERR_SEMAPHORE_GET;
   }

   for (pCurr = pOpenContextList; pCurr != DSL_NULL; pCurr = pCurr->pNext)
   {
      if (DSL_DRV_MUTEX_LOCK(pCurr->rxSnmpFifoMutex))
      {
         DSL_DEBUG( DSL_DBG_ERR,
            (DSL_NULL, SYS_DBG_ERR"DSL[%02d]: ERROR - Couldn't lock Rx SNMP FIFO mutex!"
            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

         nErrCode = DSL_ERR_SEMAPHORE_GET;

         break;
      }

      if ((pCurr->rxSnmpFifo != DSL_NULL) &&
          (pCurr->rxSnmpFifoBuf != DSL_NULL) &&
          ((pCurr->nResourceActivationMask & DSL_RESOURCE_ACTIVATION_SNMP) == DSL_RESOURCE_ACTIVATION_CLEANED))
      {
         /* Check if there is a free space in the SNMP FIFO*/
         if ( DSL_Fifo_isFull(pCurr->rxSnmpFifo) )
         {
            DSL_DEBUG( DSL_DBG_WRN,
              (pContext, SYS_DBG_WRN"DSL[%02d]: WARNING - CEOC Rx SNMP fifo is full!"
              DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
         }
         else
         {
            if ((pElmnt = DSL_Fifo_writeElement(pCurr->rxSnmpFifo)) == DSL_NULL)
            {
               DSL_DEBUG( DSL_DBG_ERR,
                  (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - received NULL pointer to the CEOC SNMP fifo!"
                  DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

               nErrCode = DSL_ERROR;
            }
            else
            {
               /* copy an element */
               /*  DSL_G997_SnmpData_t and DSL_CEOC_Message_t structures are identical,
                    we can use any*/
               memcpy(pElmnt, pMsg, sizeof(DSL_G997_SnmpData_t));
            }
          }
      }

      DSL_DRV_MUTEX_UNLOCK(pCurr->rxSnmpFifoMutex);
   }

   /* Unlock Open Context list*/
   DSL_DRV_MUTEX_UNLOCK(pContext->pDevCtx->openContextListMutex);

   if (nErrCode == DSL_SUCCESS)
   {
      /* Generate DSL_EVENT_S_SNMP_MESSAGE_AVAILABLE event*/
      nErrCode = DSL_DRV_EventGenerate(
                    pContext, 0, DSL_ACCESSDIR_NA, DSL_XTUDIR_NA,
                    DSL_EVENT_S_SNMP_MESSAGE_AVAILABLE, DSL_NULL, 0);

      if( nErrCode != DSL_SUCCESS )
      {
         DSL_DEBUG(DSL_DBG_ERR,
            (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - DSL_EVENT_S_SNMP_MESSAGE_AVAILABLE "
            "event generation failed!"DSL_DRV_CRLF,
            DSL_DEV_NUM(pContext)));
      }
   }

   DSL_DEBUG(DSL_DBG_MSG,
      (pContext, SYS_DBG_MSG"DSL[%02d]: OUT - DSL_CEOC_FifoSnmpMessageWrite, rerCode=%d"
      DSL_DRV_CRLF, DSL_DEV_NUM(pContext), nErrCode));

   return nErrCode;
}
static DSL_Error_t DSL_CEOC_FifoSnmpMessageRead(
   DSL_OpenContext_t *pOpenCtx,
   DSL_Context_t *pContext,
   DSL_CEOC_Message_t *pMsg)
{
   DSL_Error_t nErrCode = DSL_SUCCESS;
   DSL_uint8_t *pElmnt = DSL_NULL;

   DSL_CHECK_POINTER(pContext, pMsg);
   DSL_CHECK_ERR_CODE();

   DSL_DEBUG(DSL_DBG_MSG, (pContext,
      SYS_DBG_MSG"DSL[%02d]: IN - DSL_CEOC_FifoSnmpMessageRead" DSL_DRV_CRLF,
      DSL_DEV_NUM(pContext)));

   if (DSL_DRV_MUTEX_LOCK(pOpenCtx->rxSnmpFifoMutex))
   {
      DSL_DEBUG( DSL_DBG_ERR,
         (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - CEOC mutex lock failed!"
         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

      return DSL_ERR_SEMAPHORE_GET;
   }

   if ((pOpenCtx->rxSnmpFifo != DSL_NULL) &&
       (pOpenCtx->rxSnmpFifoBuf != DSL_NULL) &&
       ((pOpenCtx->nResourceActivationMask & DSL_RESOURCE_ACTIVATION_SNMP) == DSL_RESOURCE_ACTIVATION_CLEANED))
   {
      if (DSL_Fifo_isEmpty(pOpenCtx->rxSnmpFifo))
      {
         DSL_DEBUG( DSL_DBG_WRN,
            (pContext, SYS_DBG_WRN"DSL[%02d]: WARNING - CEOC Rx SNMP fifo is empty!"
            DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

         nErrCode = DSL_WRN_SNMP_NO_DATA;
      }
      else
      {
         pElmnt = DSL_Fifo_readElement(pOpenCtx->rxSnmpFifo);

         if( pElmnt == DSL_NULL )
         {
            DSL_DEBUG( DSL_DBG_ERR,
               (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - received NULL pointer to the CEOC SNMP fifo!"
               DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

            nErrCode = DSL_ERROR;
         }
         else
         {
            /* copy an element */
            memcpy(pMsg, pElmnt, sizeof(DSL_G997_SnmpData_t));
         }
      }
   }
   else
   {
      nErrCode = DSL_WRN_SNMP_NO_DATA;
   }

   DSL_DRV_MUTEX_UNLOCK(pOpenCtx->rxSnmpFifoMutex);

   DSL_DEBUG(DSL_DBG_MSG, (pContext,
      SYS_DBG_MSG"DSL[%02d]: OUT - DSL_CEOC_FifoSnmpMessageRead, retCode=%d"
      DSL_DRV_CRLF, DSL_DEV_NUM(pContext), nErrCode));

   return nErrCode;
}
/*
   For a detailed description of the function, its arguments and return value
   please refer to the description in the header file 'drv_dsl_cpe_intern_ceoc.h'
*/
DSL_Error_t DSL_CEOC_MessageSend(
   DSL_Context_t *pContext,
   DSL_uint16_t protIdent,
   DSL_CEOC_Message_t *pMsg)
{
   DSL_Error_t nErrCode = DSL_SUCCESS;
   DSL_LineStateValue_t nCurrentState = DSL_LINESTATE_UNKNOWN;

   DSL_CHECK_POINTER(pContext, pMsg);
   DSL_CHECK_ERR_CODE();

   DSL_DEBUG(DSL_DBG_MSG,
      (pContext, SYS_DBG_MSG"DSL[%02d]: IN - DSL_CEOC_MessageSend"DSL_DRV_CRLF,
      DSL_DEV_NUM(pContext)));

   if( DSL_CEOC_CONTEXT(pContext) == DSL_NULL )
   {
      DSL_DEBUG(DSL_DBG_ERR,
         (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - CEOC module not started!"
         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

      return DSL_ERROR;
   }

   if( !DSL_CEOC_CONTEXT(pContext)->bInit )
   {
      DSL_DEBUG(DSL_DBG_ERR,
         (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - CEOC module not initialized!"
         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

      return DSL_ERROR;
   }

   /* Check message length*/
   if( pMsg->length > DSL_G997_SNMP_MESSAGE_LENGTH || pMsg->length == 0 )
   {
      DSL_DEBUG(DSL_DBG_ERR, (pContext,
         SYS_DBG_ERR"DSL[%02d]: ERROR - EOC message length should "
         "be in range [1...%d]!" DSL_DRV_CRLF, DSL_DEV_NUM(pContext),
         DSL_G997_SNMP_MESSAGE_LENGTH));

      return DSL_ERR_INVALID_PARAMETER;
   }

   /* Only proceed if the specified line is in SHOWTIME state*/
   DSL_CTX_READ_SCALAR(pContext, nErrCode, nLineState, nCurrentState);

   /* Lock CEOC common mutex*/
   if( DSL_DRV_MUTEX_LOCK( DSL_CEOC_CONTEXT(pContext)->ceocMutex ) )
   {
      DSL_DEBUG(DSL_DBG_ERR,
         (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - EOC common mutex lock failed!"
         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

      return DSL_ERROR;
   }

   if ((nCurrentState == DSL_LINESTATE_SHOWTIME_TC_SYNC) ||
       (nCurrentState == DSL_LINESTATE_SHOWTIME_NO_SYNC))
   {
      /* Call device specific stuff*/
      nErrCode = DSL_CEOC_DEV_MessageSend(pContext, protIdent, pMsg);
      if( nErrCode != DSL_SUCCESS )
      {
         DSL_DEBUG(DSL_DBG_ERR,
           (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - EOC message send failed!"
           DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
      }
   }
   else
   {
      nErrCode = DSL_ERR_ONLY_AVAILABLE_IN_SHOWTIME;
      DSL_DEBUG(DSL_DBG_ERR,
        (pContext, SYS_DBG_ERR"DSL[%02d]: ERROR - function only available in the SHOWTIME!"
        DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));
   }

   /* Unlock CEOC common mutex*/
   DSL_DRV_MUTEX_UNLOCK( DSL_CEOC_CONTEXT(pContext)->ceocMutex );


   DSL_DEBUG(DSL_DBG_MSG,
      (pContext, SYS_DBG_MSG"DSL[%02d]: OUT - DSL_CEOC_MessageSend, rerCode=%d"
      DSL_DRV_CRLF, DSL_DEV_NUM(pContext), nErrCode));

   return nErrCode;
}
Example #6
0
/*
   For a detailed description of the function, its arguments and return value
   please refer to the description in the header file 'drv_dsl_cpe_intern_led.h'
*/
DSL_Error_t DSL_DRV_LED_ModuleInit(
   DSL_Context_t *pContext)
{
   DSL_Error_t nErrCode = DSL_SUCCESS;
   DSL_FwVersion_t *pVer = DSL_NULL;
     
   DSL_CHECK_POINTER(pContext, pContext->pDevCtx);
   DSL_CHECK_ERR_CODE();

   DSL_DEBUG(DSL_DBG_MSG,
      (pContext, "DSL[%02d]: IN - DSL_DRV_LED_ModuleInit"DSL_DRV_CRLF,
       DSL_DEV_NUM(pContext)));

   if (pContext->bLedInit)
   {
      DSL_DEBUG(DSL_DBG_WRN,
         (pContext, "DSL[%02d]: WARNING - LED module already started" DSL_DRV_CRLF,
         DSL_DEV_NUM(pContext)));
         
      return DSL_SUCCESS;
   }

   if(DSL_DRV_MUTEX_LOCK(pContext->dataMutex))
   {
      DSL_DEBUG( DSL_DBG_ERR,
         (pContext, "DSL[%02d]: ERROR - Couldn't lock data mutex!"DSL_DRV_CRLF,
         DSL_DEV_NUM(pContext)));

      return DSL_ERROR;
   }

   pVer = &(pContext->pDevCtx->data.version.fwVersion);

   if (pVer->bValid == DSL_TRUE)
   {
      if (pVer->nMajorVersion != DSL_AMAZON_SE_FW_MAJOR_NUMBER &&
          pVer->nMajorVersion != DSL_AR9_FW_MAJOR_NUMBER && 
          pVer->nMajorVersion != DSL_DANUBE_FW_MAJOR_NUMBER)
      {
         DSL_DEBUG(DSL_DBG_ERR,
            (pContext, "DSL[%02d]: ADSL Data LED handling included but not implemented for Danube!"
            DSL_DRV_CRLF,
            DSL_DEV_NUM(pContext)));

         nErrCode = DSL_ERR_NOT_IMPLEMENTED;
      }
   }
   else
   {
      DSL_DEBUG(DSL_DBG_ERR, (pContext,
         "DSL[%02d]: ERROR - No firmware version available" DSL_DRV_CRLF,
         DSL_DEV_NUM(pContext)));
            
      nErrCode = DSL_WRN_DEVICE_NO_DATA;
   }

   DSL_DRV_MUTEX_UNLOCK(pContext->dataMutex);   

   if (nErrCode != DSL_SUCCESS)
   {
      return nErrCode;
   }

   spin_lock_init(&dsl_led_lock);
   pGlobalContext = pContext;
   pContext->bLedNeedToFlash = DSL_FALSE;
   pContext->bLedStatusOn = DSL_FALSE;
#if !((DSL_DATA_LED_FLASH_FREQUENCY >= 1) && (DSL_DATA_LED_FLASH_FREQUENCY <= 32))
#error Please use --with-adsl-data-led-flash-frequency=[1-32] to define ADSL Data Flash Frequency
#endif
   DSL_DEBUG(DSL_DBG_MSG, (pContext, "DSL[%02d]: ADSL data led flashing at %d Hz" DSL_DRV_CRLF,
      DSL_DEV_NUM(pContext), DSL_DATA_LED_FLASH_FREQUENCY));
   flash_freq = DSL_DATA_LED_FLASH_FREQUENCY;
   if (flash_freq == 16)
   {
      flash = (pVer->nMajorVersion == DSL_DANUBE_FW_MAJOR_NUMBER) ? 0x901 : 0xA01;
   }
   else
   {
      flash_freq = ((flash_freq * 2) << 2) & 0xFC;
      flash = (pVer->nMajorVersion == DSL_DANUBE_FW_MAJOR_NUMBER) ? 0x902 : 0xA02;
      flash |= flash_freq;
   }
   
   off = (pVer->nMajorVersion == DSL_DANUBE_FW_MAJOR_NUMBER) ? 0x900 : 0xA00;

   on  = off | 0x3;
   
   /* adsl led for led function */
   DSL_DRV_INIT_EVENT ("atm_led", pContext->ledPollingEvent);

#ifdef INCLUDE_DSL_DATA_LED_SIMULATOR
   pContext->nDataLedSimControlData.nLedBehavior  = DSL_DATA_LED_OFF;
   pContext->nDataLedSimControlData.nBlinkTimeout = 1000;
   DSL_DRV_INIT_EVENT ("led_sim", pContext->dataLedSimEvent);   
   if ( DSL_DRV_THREAD (
           &LedSim, "atm_led_sim",
           DSL_DRV_LED_Sim, (DSL_uint32_t)pContext))
   {
      DSL_DEBUG(DSL_DBG_ERR, (pContext, "DSL[%02d]: ADSL DATA LED Simulator task start failed!"
         DSL_DRV_CRLF, DSL_DEV_NUM(pContext)));

      return DSL_ERROR;
   }
#else
   DSL_BSP_ATMLedCBRegister (DSL_DRV_LED_Flash);
#endif /* INCLUDE_DSL_DATA_LED_SIMULATOR*/

   pContext->bLedInit = DSL_TRUE;

   return (DSL_Error_t)DSL_DRV_THREAD (&LedControl, "atm_led_completion", DSL_DRV_LED_Poll, (DSL_uint32_t)pContext);
}