/*===========================================================================
FUNCTION DIAGCOMM_SMD_SEND

DESCRIPTION
  Sends a packet over SMD channel
  
PARAMETERS
  req_pkt - packet to send
  pkt_len - length of 'req_pkt'
  port_num - channel to send pkt on
  
RETURN VALUE
  None
  
===========================================================================*/
void diagcomm_smd_send( void *req_pkt, uint16 pkt_len, 
                        diagcomm_enum_port_type port_num )
{
  diagcomm_io_tx_params_type tx_params;
  dsm_item_type *app_req_item_ptr = NULL;
  
  if( diagcomm_status() && diagcomm_smd_status(port_num) )
  {
    ASSERT(req_pkt != NULL);

    if( dsm_pushdown_tail(&app_req_item_ptr, req_pkt, pkt_len, 
        DSM_DIAG_SMD_RX_ITEM_POOL) == pkt_len )
    { 
      tx_params.dsm_ptr = app_req_item_ptr;
      diagcomm_io_transmit( &diagcomm_io_conn[DIAGCOMM_PORT_SMD][port_num], &tx_params, FALSE );
      diag_sleep_vote(DIAG_SLEEP_DIAG, TRUE);
    }
    else
    {
      dsm_free_packet(&app_req_item_ptr);
      MSG(MSG_SSID_DIAG, MSG_LEGACY_HIGH,
            "diagcomm_smd_send - Ran out of DSM items");
    }
  }
} /* diagcomm_smd_send */
PACKED void * diag_userDataBackUp_handler(PACKED void *req_pkt_ptr,uint16 pkt_len)
{
	udbp_req_type		*req_ptr = (udbp_req_type *) req_pkt_ptr;
	udbp_rsp_type	  	*rsp_ptr = NULL;

	const rsp_len = sizeof( udbp_rsp_type ); 
	
	rsp_ptr = (udbp_rsp_type *) diagpkt_alloc (DIAG_USET_DATA_BACKUP, rsp_len);

    if(rsp_ptr)
	{
		switch(req_ptr->header.sub_cmd)
  		{
  			case SRD_INIT_OPERATION :
				diag_SRD_Init(req_ptr,rsp_ptr);							
				break;
				
			case USERDATA_BACKUP_REQUEST :
				diag_userDataBackUp_entrySet(req_ptr,rsp_ptr);
				break;

			case GET_DOWNLOAD_INFO :
				break;

			case EXTRA_NV_OPERATION :
#ifdef LG_FW_SRD_EXTRA_NV				
				diag_extraNv_entrySet(req_ptr,rsp_ptr);
#endif
				break;
				
			case PRL_OPERATION :
#ifdef LG_FW_SRD_PRL				
				diag_PRL_entrySet(req_ptr,rsp_ptr);
#endif
				break;
				
			default :
  				rsp_ptr = (void *) diagpkt_err_rsp (DIAG_BAD_PARM_F, req_ptr, pkt_len);
				break;
		
		}
	}
	/* Execption*/	
	if (rsp_ptr == NULL){
		return NULL;
	}
	if (!diagcomm_status()){
		diagpkt_free(rsp_ptr);
		return NULL;
	}

	return rsp_ptr;
}
void diagcomm_smd_process_slave_tx(diagcomm_enum_port_type port_num)
{
  static dsm_item_type *diagcomm_app_item_ptr = NULL;
  diagcomm_io_tx_params_type tx_params;
  
  if (DIAGCOMM_PORT_2 == port_num)
  {
    #if defined (DIAG_MP_MASTER) && defined (FEATURE_DIAG_8K_QDSP6)
	{}
	#else
	return;
	#endif
  }
   
   if (diagcomm_status())
   {
     diagcomm_app_item_ptr = diagcomm_io_dequeue_rx_wmq( &diagcomm_io_conn[DIAGCOMM_PORT_SMD][port_num] );
     if(diagcomm_app_item_ptr!=NULL)
     {
       tx_params.dsm_ptr = diagcomm_app_item_ptr;
       diagcomm_io_transmit( &diagcomm_io_conn[DIAGCOMM_PORT_SIO][DIAGCOMM_PORT_1], &tx_params, FALSE );
     }
   }
} /* diagcomm_smd_process_slave_tx */