WE310F5  39.00.000
M2MB SDIO SLAVE

This section describes the M2MB APIs to perform various SDIO slave operations. More...

#define M2MB_SLAVE_WRITE_DONE_EVT   (0x00000001)
 
#define M2MB_SLAVE_INIT_DONE_EVT   (0x00000002)
 
#define M2MB_SDIO_SLAVE_RECEIVE_BUFFER_COUNT   (16)
 
#define M2MB_SDIO_SLAVE_RECEIVE_BUFFER_SIZE   (1536)
 
#define M2MB_NUM_BUFFERS_PER_MBOX   (16)
 
#define M2MB_SDIO_SLAVE_WRITE_BUFFER_SIZE   (2048)
 
#define M2MB_MBOX_BLOCK_SIZE   256
 
#define M2MB_MBOX_MSG_HDR_SIZE   (2)
 
#define M2MB_MBOX_PAYLOAD_MAX_SIZE   (M2MB_SDIO_SLAVE_RECEIVE_BUFFER_SIZE-M2MB_MBOX_MSG_HDR_SIZE)
 
#define M2MB_SDIO_SLAVE_WRITE_BUFFER_MAX   (1)
 
#define M2MB_MBOX_MAX_TX_SIZE   256
 
#define M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD   6
 
#define M2MB_SDIO_SLAVE_FLOW_CTRL_HIGH_THRESHOLD   9
 
#define M2MB_SDIO_SLAVE_MBOX_ID   (0)
 
enum  qapi_HTC_Instance_id_t {
  M2MB_SDIO_SLAVE_INSTANCE_ID = 0,
  M2MB_SPI_SLAVE_INSTANCE_ID,
  M2MB_MAX_INSTANCES
}
 
typedef struct M2MB_SLAVE_SDIO_WRITE_REQUEST_S M2MB_SLAVE_SDIO_WRITE_REQUEST_T
 
typedef struct M2MB_SLAVE_MBOX_MSG_S M2MB_SLAVE_MBOX_MSG_T
 
typedef struct M2M_SLAVE_SDIO_BUFFER_S M2MB_SLAVE_SDIO_BUFFER_T
 
typedef struct M2MB_SLAVE_SDIO_S M2MB_SLAVE_SDIO_T
 
INT32 m2mb_slave_sdio_send_buflist_enqueue (INT32 instance_id, INT32 mbox, M2MB_SLAVE_SDIO_BUFFER_T *bufinfo)
 enques tx buffer. More...
 
INT32 m2mb_slave_sdio_send_buflist_dequeue (INT32 instance_id, INT32 mbox, M2MB_SLAVE_SDIO_BUFFER_T **pbufinfo)
 deques a list of completed send buffers. More...
 
INT32 m2mb_slave_sdio_recv_buflist_enqueue (INT32 instance_id, INT32 mbox, M2MB_SLAVE_SDIO_BUFFER_T *bufinfo)
 enques recieve buffer. More...
 
INT32 m2mb_slave_sdio_recv_buflist_dequeue (INT32 instance_id, INT32 mbox, M2MB_SLAVE_SDIO_BUFFER_T **pbufinfo)
 deques a list of completed receive buffers. More...
 
void m2mb_slave_sdio_resume_recv (INT32 instance_id, INT32 mbox)
 sends rx resume indication to host More...
 
void m2mb_slave_sdio_pause_recv (INT32 instance_id, INT32 mbox)
 sends rx pause indication to host More...
 
void m2mb_slave_sdio_tx_credit_inc (INT32 instance_id, INT32 mbox)
 Increments the Host Tx credit counter registers. More...
 
void m2mb_slave_sdio_deinit (int instance_id, int mbox)
 stops mbox h/w and deallocates dma resources More...
 
void m2mb_slave_sdio_post_init (UINT32 instance_id, INT32 mbox, UINT32 block_size, UINT32 rxmsg_size, void *pResetCb)
 additional initialisation needed for mbox More...
 
INT32 m2m_slave_sdio_is_initialized (void)
 mobox initialisation More...
 
INT32 m2mb_slave_sdio_pre_init (UINT32 instance_id, INT32 mbox, UINT32 rx_buf_size, void *pInitCb, void *pSendCb, void *pRecvCb, void *pContext)
 mobox initialisation More...
 

Detailed Description

This section describes the M2MB APIs to perform various SDIO slave operations.

Macro Definition Documentation

◆ M2MB_MBOX_BLOCK_SIZE

#define M2MB_MBOX_BLOCK_SIZE   256

MBOX block size

Definition at line 63 of file m2mb_sdio_slave.h.

◆ M2MB_MBOX_MAX_TX_SIZE

#define M2MB_MBOX_MAX_TX_SIZE   256

MBOX maximum transmit size

Definition at line 74 of file m2mb_sdio_slave.h.

◆ M2MB_MBOX_MSG_HDR_SIZE

#define M2MB_MBOX_MSG_HDR_SIZE   (2)

MBOX message header size

Definition at line 64 of file m2mb_sdio_slave.h.

◆ M2MB_MBOX_PAYLOAD_MAX_SIZE

#define M2MB_MBOX_PAYLOAD_MAX_SIZE   (M2MB_SDIO_SLAVE_RECEIVE_BUFFER_SIZE-M2MB_MBOX_MSG_HDR_SIZE)

MBOX payload maximum size

Definition at line 65 of file m2mb_sdio_slave.h.

◆ M2MB_NUM_BUFFERS_PER_MBOX

#define M2MB_NUM_BUFFERS_PER_MBOX   (16)

SDIO number of buffers per MBOX

Definition at line 59 of file m2mb_sdio_slave.h.

◆ M2MB_SDIO_SLAVE_FLOW_CTRL_HIGH_THRESHOLD

#define M2MB_SDIO_SLAVE_FLOW_CTRL_HIGH_THRESHOLD   9

SDIO slave flow control high threshold,75 percent

Definition at line 77 of file m2mb_sdio_slave.h.

◆ M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD

#define M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD   6

SDIO slave flow control low threshold,25 percent

Definition at line 76 of file m2mb_sdio_slave.h.

◆ M2MB_SDIO_SLAVE_MBOX_ID

#define M2MB_SDIO_SLAVE_MBOX_ID   (0)

SDIO slave MBOX ID

Definition at line 79 of file m2mb_sdio_slave.h.

◆ M2MB_SDIO_SLAVE_RECEIVE_BUFFER_COUNT

#define M2MB_SDIO_SLAVE_RECEIVE_BUFFER_COUNT   (16)

SDIO slave receive buffer count

Definition at line 56 of file m2mb_sdio_slave.h.

◆ M2MB_SDIO_SLAVE_RECEIVE_BUFFER_SIZE

#define M2MB_SDIO_SLAVE_RECEIVE_BUFFER_SIZE   (1536)

SDIO slave receive buffer size

Definition at line 57 of file m2mb_sdio_slave.h.

◆ M2MB_SDIO_SLAVE_WRITE_BUFFER_MAX

#define M2MB_SDIO_SLAVE_WRITE_BUFFER_MAX   (1)

SDIO slave write buffer maximum size

Definition at line 70 of file m2mb_sdio_slave.h.

◆ M2MB_SDIO_SLAVE_WRITE_BUFFER_SIZE

#define M2MB_SDIO_SLAVE_WRITE_BUFFER_SIZE   (2048)

SDIO slve write buffer size

Definition at line 61 of file m2mb_sdio_slave.h.

◆ M2MB_SLAVE_INIT_DONE_EVT

#define M2MB_SLAVE_INIT_DONE_EVT   (0x00000002)

slave init done event

Definition at line 54 of file m2mb_sdio_slave.h.

◆ M2MB_SLAVE_WRITE_DONE_EVT

#define M2MB_SLAVE_WRITE_DONE_EVT   (0x00000001)

slave write done event

Definition at line 53 of file m2mb_sdio_slave.h.

Typedef Documentation

◆ M2MB_SLAVE_MBOX_MSG_T

Structure used for SDIO slave MBOX message, Important note: This structure must be packed

◆ M2MB_SLAVE_SDIO_BUFFER_T

Structure used for SDIO slave buffers

◆ M2MB_SLAVE_SDIO_T

Structure used for SDIO slave

◆ M2MB_SLAVE_SDIO_WRITE_REQUEST_T

Structure used for SDIO slave write request

Enumeration Type Documentation

◆ qapi_HTC_Instance_id_t

M2MB instance IDs

Enumerator
M2MB_SDIO_SLAVE_INSTANCE_ID 
M2MB_SPI_SLAVE_INSTANCE_ID 
M2MB_MAX_INSTANCES 

Definition at line 136 of file m2mb_sdio_slave.h.

Function Documentation

◆ m2m_slave_sdio_is_initialized()

INT32 m2m_slave_sdio_is_initialized ( void  )

mobox initialisation

This function checks if sdio is initialized

◆ m2mb_slave_sdio_deinit()

void m2mb_slave_sdio_deinit ( int  instance_id,
int  mbox 
)

stops mbox h/w and deallocates dma resources

This function stops mbox h/w and deallocates dma resources

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
Note
<Notes>

Example

INT32 nbufs;
INT32 ret_val = -1;
while (1)
{
nbufs = m2mb_slave_sdio_recv_buflist_dequeue(Instance, mbox_id, &bufinfo);
if (nbufs)
{
if(pSlaveSdio_context->rx_enque_cnt >= nbufs)
pSlaveSdio_context->rx_enque_cnt -= nbufs;
else
pSlaveSdio_context->rx_enque_cnt = 0;//This case shouldnt happen.
// Notify caller that he has received a message.
while(nbufs)
{
ret_val = m2mb_os_sem_put(pSlaveSdio_context->sem_handle);
nbufs--;
}
}
else
{
break;
}
if((pSlaveSdio_context->rx_pause ==0) &&
(pSlaveSdio_context->rx_enque_cnt <= M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD))
{
m2mb_slave_sdio_pause_recv(Instance,mbox_id);
pSlaveSdio_context->rx_pause = 1;
// Flow control state change indication to host
m2mb_slave_sdio_tx_credit_inc(Instance, mbox_id);
}
}
if((pSlaveSdio_context->rx_pause ==0) &&
(pSlaveSdio_context->rx_enque_cnt <= M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD))
{
m2mb_slave_sdio_pause_recv(Instance,mbox_id);
pSlaveSdio_context->rx_pause = 1;
// Flow control state change indication to host
m2mb_slave_sdio_tx_credit_inc(Instance, mbox_id);
}
m2mb_slave_sdio_deinit(pSlaveSdio_context->instance_id,pSlaveSdio_context->mbox_id);

◆ m2mb_slave_sdio_pause_recv()

void m2mb_slave_sdio_pause_recv ( INT32  instance_id,
INT32  mbox 
)

sends rx pause indication to host

This function sends rx pause indication to host

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
Note
<Notes>

Example

INT32 nbufs;
INT32 ret_val = -1;
while (1)
{
nbufs = m2mb_slave_sdio_recv_buflist_dequeue(Instance, mbox_id, &bufinfo);
if (nbufs)
{
if(pSlaveSdio_context->rx_enque_cnt >= nbufs)
pSlaveSdio_context->rx_enque_cnt -= nbufs;
else
pSlaveSdio_context->rx_enque_cnt = 0;//This case shouldnt happen.
// Notify caller that he has received a message.
while(nbufs)
{
ret_val = m2mb_os_sem_put(pSlaveSdio_context->sem_handle);
nbufs--;
}
}
else
{
break;
}
if((pSlaveSdio_context->rx_pause ==0) &&
(pSlaveSdio_context->rx_enque_cnt <= M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD))
{
m2mb_slave_sdio_pause_recv(Instance,mbox_id);
pSlaveSdio_context->rx_pause = 1;
// Flow control state change indication to host
m2mb_slave_sdio_tx_credit_inc(Instance, mbox_id);
}
}
if((pSlaveSdio_context->rx_pause ==0) &&
(pSlaveSdio_context->rx_enque_cnt <= M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD))
{
m2mb_slave_sdio_pause_recv(Instance,mbox_id);
pSlaveSdio_context->rx_pause = 1;
// Flow control state change indication to host
m2mb_slave_sdio_tx_credit_inc(Instance, mbox_id);
}

◆ m2mb_slave_sdio_post_init()

void m2mb_slave_sdio_post_init ( UINT32  instance_id,
INT32  mbox,
UINT32  block_size,
UINT32  rxmsg_size,
void *  pResetCb 
)

additional initialisation needed for mbox

This function does additional initialisation needed for mbox

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
[in]block_sizembox block size
[in]rxmsg_sizereceive message size
[in]pResetCbPointer to callback function
Note
<Notes>

Example

INT32 mbox;
if(pSlaveSdio_context->init_done == 1)
{
return ;
}
pSlaveSdio_context->init_done=1;
mbox = pSlaveSdio_context->mbox_id;
M2MB_SDIO_SLAVE_RECEIVE_BUFFER_SIZE,m2m_slave_sdio_mbox_reset_service);

◆ m2mb_slave_sdio_pre_init()

INT32 m2mb_slave_sdio_pre_init ( UINT32  instance_id,
INT32  mbox,
UINT32  rx_buf_size,
void *  pInitCb,
void *  pSendCb,
void *  pRecvCb,
void *  pContext 
)

mobox initialisation

This function does mobox initialisation

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
[in]rx_buf_sizereceive message size
[in]pInitCbinit callback function
[in]pSendCbsend callback function
[in]pRecvCbreceive callback function
[in]pContextcontext
Returns
M2MB_OK – when init was successful M2MB_ERROR – when init failed
Note
<Notes>

Example

M2MB_OS_SEM_ATTR_HANDLE semAttrHandle = NULL;
pSlaveSdio_context = (M2MB_SLAVE_SDIO_T *)m2mb_os_malloc(sizeof(M2MB_SLAVE_SDIO_T));
if (pSlaveSdio_context == NULL) {
goto m2m_slave_sdio_io_init_exit;
}
memset(pSlaveSdio_context,0x00, sizeof(*pSlaveSdio_context));
pSlaveSdio_context->instance_id = M2MB_SDIO_SLAVE_INSTANCE_ID;
pSlaveSdio_context->mbox_id = M2MB_SDIO_SLAVE_MBOX_ID;
// recieve done semaphore handler init
m2mb_os_sem_setAttrItem( &semAttrHandle,
"data_ready_sem",
0,
m2mb_os_sem_init( &pSlaveSdio_context->sem_handle, &semAttrHandle );
// Flush the event if any
m2mb_os_sem_get(pSlaveSdio_context->sem_handle,0);
// write complete event handler init
ret = m2mb_os_ev_setAttrItem( &pEvAttr, CMDS( M2MB_OS_EV_SEL_CMD_USRNAME ), "tx_done_Event");
if( ret != M2MB_OS_SUCCESS )
goto m2m_slave_sdio_io_init_exit;
ret = m2mb_os_ev_init( &pSlaveSdio_context->ev_tx_handle, &pEvAttr );
if( ret != M2MB_OS_SUCCESS )
goto m2m_slave_sdio_io_init_exit;
// Set the transmit done event by default.
ret = m2mb_os_ev_set( pSlaveSdio_context->ev_tx_handle, M2MB_SLAVE_WRITE_DONE_EVT, M2MB_OS_EV_SET );
if( ret != M2MB_OS_SUCCESS )
goto m2m_slave_sdio_io_init_exit;
// slave init complete event handler init
ret = m2mb_os_ev_setAttrItem( &pEvAttr1, CMDS( M2MB_OS_EV_SEL_CMD_USRNAME ), "init_done_Event");
if( ret != M2MB_OS_SUCCESS )
goto m2m_slave_sdio_io_init_exit;
ret = m2mb_os_ev_init( &pSlaveSdio_context->ev_init_handle, &pEvAttr1 );
if( ret != M2MB_OS_SUCCESS )
goto m2m_slave_sdio_io_init_exit;
// mbox init section
ret_val = m2mb_slave_sdio_pre_init(pSlaveSdio_context->instance_id,
pSlaveSdio_context->mbox_id,
m2m_slave_sdio_init_service,
m2m_slave_sdio_send_done,
m2m_slave_sdio_recv_done,pSlaveSdio_context);
if(ret_val != M2MB_OK)
goto m2m_slave_sdio_io_init_exit;

◆ m2mb_slave_sdio_recv_buflist_dequeue()

INT32 m2mb_slave_sdio_recv_buflist_dequeue ( INT32  instance_id,
INT32  mbox,
M2MB_SLAVE_SDIO_BUFFER_T **  pbufinfo 
)

deques a list of completed receive buffers.

This function deques a list of completed receive buffers

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
[in]pbufinfo
buffer chain of completed buffers
Returns
number of buffers dequeued
Note
<Notes>

Example

INT32 nbufs;
INT32 ret_val = -1;
while (1)
{
nbufs = m2mb_slave_sdio_recv_buflist_dequeue(Instance, mbox_id, &bufinfo);
if (nbufs)
{
if(pSlaveSdio_context->rx_enque_cnt >= nbufs)
pSlaveSdio_context->rx_enque_cnt -= nbufs;
else
pSlaveSdio_context->rx_enque_cnt = 0;//This case shouldnt happen.
// Notify caller that he has received a message.
while(nbufs)
{
ret_val = m2mb_os_sem_put(pSlaveSdio_context->sem_handle);
nbufs--;
}
}
else
{
break;
}
if((pSlaveSdio_context->rx_pause ==0) &&
(pSlaveSdio_context->rx_enque_cnt <= M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD))
{
m2mb_slave_sdio_pause_recv(Instance,mbox_id);
pSlaveSdio_context->rx_pause = 1;
// Flow control state change indication to host
m2mb_slave_sdio_tx_credit_inc(Instance, mbox_id);
}
}

◆ m2mb_slave_sdio_recv_buflist_enqueue()

INT32 m2mb_slave_sdio_recv_buflist_enqueue ( INT32  instance_id,
INT32  mbox,
M2MB_SLAVE_SDIO_BUFFER_T bufinfo 
)

enques recieve buffer.

This function enques recieve buffer.

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
[in]bufinfo
pointer to the buffer chain
Returns
number of buffers queued
Note
<Notes>

Example

INT32 nbuf=0;
UINT32 Instance = slave_context->instance_id;
bufinfo = &slave_context->tx_buf_info[0];
tempRxBufEnqCnt = rxBufEnqCnt;
while(rxBufEnqCnt)
{
bufinfo = &(pSdioContext->rx_buf_info[pSdioContext->rx_recycle_index]);
bufinfo->buffer = pSdioContext->rx_buffer[pSdioContext->rx_recycle_index];
bufinfo->next = NULL;
pMboxMsg = (M2MB_SLAVE_MBOX_MSG_T *)bufinfo->buffer;
pMboxMsg->length = 0;
nbufs = m2mb_slave_sdio_recv_buflist_enqueue(pSdioContext->instance_id,pSdioContext->mbox_id,bufinfo);
if(nbufs)
pSdioContext->rx_enque_cnt++;
pSdioContext->rx_recycle_index++;
if(pSdioContext->rx_recycle_index >= M2MB_SDIO_SLAVE_RECEIVE_BUFFER_COUNT)
pSdioContext->rx_recycle_index = 0;
rxBufEnqCnt--;
}

◆ m2mb_slave_sdio_resume_recv()

void m2mb_slave_sdio_resume_recv ( INT32  instance_id,
INT32  mbox 
)

sends rx resume indication to host

This function sends rx resume indication to host

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
Note
<Notes>

Example

INT32 nbufs;
INT32 ret_val = -1;
while (1)
{
nbufs = m2mb_slave_sdio_recv_buflist_dequeue(Instance, mbox_id, &bufinfo);
if (nbufs)
{
if(pSlaveSdio_context->rx_enque_cnt >= nbufs)
pSlaveSdio_context->rx_enque_cnt -= nbufs;
else
pSlaveSdio_context->rx_enque_cnt = 0;//This case shouldnt happen.
// Notify caller that he has received a message.
while(nbufs)
{
ret_val = m2mb_os_sem_put(pSlaveSdio_context->sem_handle);
nbufs--;
}
}
else
{
break;
}
if((pSlaveSdio_context->rx_pause ==0) &&
(pSlaveSdio_context->rx_enque_cnt <= M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD))
{
m2mb_slave_sdio_pause_recv(Instance,mbox_id);
pSlaveSdio_context->rx_pause = 1;
// Flow control state change indication to host
m2mb_slave_sdio_tx_credit_inc(Instance, mbox_id);
}
}
if((pSdioContext->rx_pause==1) &&
(pSdioContext->rx_enque_cnt >= M2MB_SDIO_SLAVE_FLOW_CTRL_HIGH_THRESHOLD))
{
m2mb_slave_sdio_resume_recv(pSdioContext->instance_id,pSdioContext->mbox_id);
pSdioContext->rx_pause = 0;
m2mb_slave_sdio_tx_credit_inc(pSdioContext->instance_id, pSdioContext->mbox_id);
}

◆ m2mb_slave_sdio_send_buflist_dequeue()

INT32 m2mb_slave_sdio_send_buflist_dequeue ( INT32  instance_id,
INT32  mbox,
M2MB_SLAVE_SDIO_BUFFER_T **  pbufinfo 
)

deques a list of completed send buffers.

This function deques a list of completed send buffers.

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
[in]pbufinfo
buffer chain of completed buffers
Returns
number of buffers dequeued
Note
<Notes>

Example

INT32 nbuf=0;
UINT32 Instance = slave_context->instance_id;
bufinfo = &slave_context->tx_buf_info[0];
memset(bufinfo,0x00,sizeof(*bufinfo));
pMboxMsg = (M2MB_SLAVE_MBOX_MSG_T *)&slave_context->tx_buffer[0][0];;
// | 2 byte length | Payload |
pMboxMsg->length = len; // excluding header
memcpy(pMboxMsg->buffer,&buffer[0],len);
bufinfo->actual_length = round_off_len;
bufinfo->end_point = (UINT8)mbox_id;
bufinfo->buffer_offset = 0;
bufinfo->htc_flags = 0;
bufinfo->app_context = 0;
bufinfo->buffer = (UINT8 *)&slave_context->tx_buffer[0][0];
slave_context->tx_done_len = len;
slave_context->tx_pend_len = 0;
bufinfo->next = NULL;
nbuf = m2mb_slave_sdio_send_buflist_enqueue(Instance, mbox_id, bufinfo);
while (nBuf = m2mb_slave_sdio_send_buflist_dequeue(Instance, mbox_id, &bufinfo));
m2m_slave_sdio_pending_write(Instance, pContext, mbox_id);

◆ m2mb_slave_sdio_send_buflist_enqueue()

INT32 m2mb_slave_sdio_send_buflist_enqueue ( INT32  instance_id,
INT32  mbox,
M2MB_SLAVE_SDIO_BUFFER_T bufinfo 
)

enques tx buffer.

This function enques tx buffer.

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
[in]bufinfo
pointer to the buffer chain
Returns
number of buffers queued
Note
<Notes>

Example

INT32 nbuf=0;
UINT32 Instance = slave_context->instance_id;
bufinfo = &slave_context->tx_buf_info[0];
memset(bufinfo,0x00,sizeof(*bufinfo));
pMboxMsg = (M2MB_SLAVE_MBOX_MSG_T *)&slave_context->tx_buffer[0][0];;
// | 2 byte length | Payload |
pMboxMsg->length = len; // excluding header
memcpy(pMboxMsg->buffer,&buffer[0],len);
bufinfo->actual_length = round_off_len;
bufinfo->end_point = (UINT8)mbox_id;
bufinfo->buffer_offset = 0;
bufinfo->htc_flags = 0;
bufinfo->app_context = 0;
bufinfo->buffer = (UINT8 *)&slave_context->tx_buffer[0][0];
slave_context->tx_done_len = len;
slave_context->tx_pend_len = 0;
bufinfo->next = NULL;
nbuf = m2mb_slave_sdio_send_buflist_enqueue(Instance, mbox_id, bufinfo);

◆ m2mb_slave_sdio_tx_credit_inc()

void m2mb_slave_sdio_tx_credit_inc ( INT32  instance_id,
INT32  mbox 
)

Increments the Host Tx credit counter registers.

This function Increments the Host Tx credit counter registers

Parameters
[in]instance_idinstance ID
[in]mboxmailbox number
Note
<Notes>

Example

INT32 nbufs;
INT32 ret_val = -1;
while (1)
{
nbufs = m2mb_slave_sdio_recv_buflist_dequeue(Instance, mbox_id, &bufinfo);
if (nbufs)
{
if(pSlaveSdio_context->rx_enque_cnt >= nbufs)
pSlaveSdio_context->rx_enque_cnt -= nbufs;
else
pSlaveSdio_context->rx_enque_cnt = 0;//This case shouldnt happen.
// Notify caller that he has received a message.
while(nbufs)
{
ret_val = m2mb_os_sem_put(pSlaveSdio_context->sem_handle);
nbufs--;
}
}
else
{
break;
}
if((pSlaveSdio_context->rx_pause ==0) &&
(pSlaveSdio_context->rx_enque_cnt <= M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD))
{
m2mb_slave_sdio_pause_recv(Instance,mbox_id);
pSlaveSdio_context->rx_pause = 1;
// Flow control state change indication to host
m2mb_slave_sdio_tx_credit_inc(Instance, mbox_id);
}
}
if((pSlaveSdio_context->rx_pause ==0) &&
(pSlaveSdio_context->rx_enque_cnt <= M2MB_SDIO_SLAVE_FLOW_CTRL_LOW_THRESHOLD))
{
m2mb_slave_sdio_pause_recv(Instance,mbox_id);
pSlaveSdio_context->rx_pause = 1;
// Flow control state change indication to host
m2mb_slave_sdio_tx_credit_inc(Instance, mbox_id);
}