157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
							 | 
						||
| 
								 | 
							
								be copied by any method or incorporated into another program without
							 | 
						||
| 
								 | 
							
								the express written consent of Aerospace C.Power. This Information or any portion
							 | 
						||
| 
								 | 
							
								thereof remains the property of Aerospace C.Power. The Information contained herein
							 | 
						||
| 
								 | 
							
								is believed to be accurate and Aerospace C.Power assumes no responsibility or
							 | 
						||
| 
								 | 
							
								liability for its use in any way and conveys no license or title under
							 | 
						||
| 
								 | 
							
								any patent or copyright and makes no representation or warranty that this
							 | 
						||
| 
								 | 
							
								Information is free from patent or copyright infringement.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								****************************************************************************/
							 | 
						||
| 
								 | 
							
								#ifndef RX_PB_REORDER_H
							 | 
						||
| 
								 | 
							
								#define RX_PB_REORDER_H
							 | 
						||
| 
								 | 
							
								#include "rx_mpdu_end.h"
							 | 
						||
| 
								 | 
							
								#include "rx_mpdu_start.h"
							 | 
						||
| 
								 | 
							
								#include "rx_pb_start.h"
							 | 
						||
| 
								 | 
							
								#include "rx_pb_end.h"
							 | 
						||
| 
								 | 
							
								#include "iot_pkt_api.h"
							 | 
						||
| 
								 | 
							
								#include "os_timer_api.h"
							 | 
						||
| 
								 | 
							
								#include "rx_desc_reg_api.h"
							 | 
						||
| 
								 | 
							
								#include "mac_rx_buf_ring.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define INV_PB_TOTAL_CNT 0xFFFF
							 | 
						||
| 
								 | 
							
								#define INV_PB_SSN 0xFFFFFFFF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* max value of mac_rx_info and mac_tx_info. When report plc data to cvg,
							 | 
						||
| 
								 | 
							
								 * mac layer shall reserve this size in iot_pkt as the iot_pkt may be forward.
							 | 
						||
| 
								 | 
							
								 * Then the reserved header space shall be able to contain mac_rx_info.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								#define RX_FWD_RESV_LEN (sizeof(mac_rx_info_t) >                            \
							 | 
						||
| 
								 | 
							
								                         sizeof(mac_tx_info) + sizeof(frame_control_t) ?    \
							 | 
						||
| 
								 | 
							
								                         sizeof(mac_rx_info_t) :                            \
							 | 
						||
| 
								 | 
							
								                         sizeof(mac_tx_info) + sizeof(frame_control_t))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 reorder buf structure
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 msdu : msdu_buf
							 | 
						||
| 
								 | 
							
								 |
							 | 
						||
| 
								 | 
							
								 v
							 | 
						||
| 
								 | 
							
								 pb------> pb_buf
							 | 
						||
| 
								 | 
							
								 |
							 | 
						||
| 
								 | 
							
								 v
							 | 
						||
| 
								 | 
							
								 pb------> pb_buf
							 | 
						||
| 
								 | 
							
								 |
							 | 
						||
| 
								 | 
							
								 v
							 | 
						||
| 
								 | 
							
								 pb------> pb_buf
							 | 
						||
| 
								 | 
							
								 |
							 | 
						||
| 
								 | 
							
								 v
							 | 
						||
| 
								 | 
							
								 .
							 | 
						||
| 
								 | 
							
								 .
							 | 
						||
| 
								 | 
							
								 pb------> pb_buf
							 | 
						||
| 
								 | 
							
								 |
							 | 
						||
| 
								 | 
							
								 v
							 | 
						||
| 
								 | 
							
								 NULL
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _pb_buf_list {
							 | 
						||
| 
								 | 
							
								    uint32_t ssn :16,
							 | 
						||
| 
								 | 
							
								        msdu_start :1,
							 | 
						||
| 
								 | 
							
								        msdu_end :1,
							 | 
						||
| 
								 | 
							
								        resv0 :14;
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *pb_buf;
							 | 
						||
| 
								 | 
							
								    struct _pb_buf_list *next;
							 | 
						||
| 
								 | 
							
								} pb_buf_list_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _reorder_msdu_buf {
							 | 
						||
| 
								 | 
							
								    /* current recevied pb */
							 | 
						||
| 
								 | 
							
								    uint32_t pb_rdy_cnt : 16,
							 | 
						||
| 
								 | 
							
								        /* the total number pb in the msdu */
							 | 
						||
| 
								 | 
							
								        pb_total_cnt : 16;
							 | 
						||
| 
								 | 
							
								    /* pb_buf_list_t allocated count */
							 | 
						||
| 
								 | 
							
								    uint32_t pb_alloc_cnt : 16,
							 | 
						||
| 
								 | 
							
								        /* if the pb is reused for this msdu */
							 | 
						||
| 
								 | 
							
								        is_reused : 1,
							 | 
						||
| 
								 | 
							
								        pbsz : 10,
							 | 
						||
| 
								 | 
							
								        resv : 5;
							 | 
						||
| 
								 | 
							
								    /* at least one pb buf for SOF frame */
							 | 
						||
| 
								 | 
							
								    pb_buf_list_t pb_list;
							 | 
						||
| 
								 | 
							
								} reorder_msdu_buf_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _reorder_msdu_dbg {
							 | 
						||
| 
								 | 
							
								    uint32_t ssn    :16,
							 | 
						||
| 
								 | 
							
								        msdu_start  :1,
							 | 
						||
| 
								 | 
							
								        msdu_end    :1,
							 | 
						||
| 
								 | 
							
								        resv0       :14;
							 | 
						||
| 
								 | 
							
								    uint32_t desc[16];
							 | 
						||
| 
								 | 
							
								} reorder_msdu_dbg_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 *  API
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* init the msdu head node */
							 | 
						||
| 
								 | 
							
								uint32_t reorder_buf_init(
							 | 
						||
| 
								 | 
							
								    reorder_msdu_buf_t *msdu, \
							 | 
						||
| 
								 | 
							
								    void *stream /* refer stream */
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* init the msdu head node when receive the first pb_buf */
							 | 
						||
| 
								 | 
							
								uint32_t reorder_buf_init_first_pb(
							 | 
						||
| 
								 | 
							
								    reorder_msdu_buf_t *msdu, \
							 | 
						||
| 
								 | 
							
								    uint32_t pkt_size, /* msdu buf len */
							 | 
						||
| 
								 | 
							
								    void *stream, /* refer stream */
							 | 
						||
| 
								 | 
							
								    uint32_t msdu_st,
							 | 
						||
| 
								 | 
							
								    uint32_t msdu_ed,
							 | 
						||
| 
								 | 
							
								    uint32_t ssn,
							 | 
						||
| 
								 | 
							
								    /* must be the msdu_start pb if not null,
							 | 
						||
| 
								 | 
							
								    * to optimize the memory usage,
							 | 
						||
| 
								 | 
							
								    * we can use the same pb buf if
							 | 
						||
| 
								 | 
							
								    * the msdu len is smaller than
							 | 
						||
| 
								 | 
							
								    * the pb size
							 | 
						||
| 
								 | 
							
								    */
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *pb_buf
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t pb_buf_list_init(pb_buf_list_t *pb, uint32_t msdu_st,
							 | 
						||
| 
								 | 
							
								    uint32_t msdu_ed,
							 | 
						||
| 
								 | 
							
								    uint32_t ssn,
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *pb_buf
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t reorder_buf_free(reorder_msdu_buf_t *msdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* flush the reorder buf
							 | 
						||
| 
								 | 
							
								* reset the msdu's counter
							 | 
						||
| 
								 | 
							
								* and free all the pb_bufs,
							 | 
						||
| 
								 | 
							
								* but keep the pb_buf_list allocated for fast allocation.
							 | 
						||
| 
								 | 
							
								* usually called when a new msdu's pb received
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								uint32_t reorder_buf_flush(reorder_msdu_buf_t *msdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* release the msdu */
							 | 
						||
| 
								 | 
							
								uint32_t reorder_buf_release(reorder_msdu_buf_t *msdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* insert to exist msdu reorder structure
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								uint32_t reorder_buf_insert(reorder_msdu_buf_t *msdu, \
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *pb_buf, uint32_t ssn, uint32_t msdu_start,
							 | 
						||
| 
								 | 
							
								    uint32_t msdu_end, uint32_t is_retry, uint32_t pbsz);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // !RX_PB_REORDER_H
							 |