157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| 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
 |