blob: b0b5abe3c504b45ef89994593def030e69c5f1cd [file] [log] [blame]
yu.dongc33b3072024-08-21 23:14:49 -07001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2012
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 * Filename:
38 * ---------
39 * hif_common.h
40 *
41 * Project:
42 * --------
43 * TATAKA
44 *
45 * Description:
46 * ------------
47 * This is the HIF data path driver API head file for both USB2.0/USB3.0/SDIO.
48 *
49 * Author:
50 * -------
51 * -------
52 * -------
53 *
54 * ==========================================================================
55 * $Log$
56 *
57 * 11 16 2020 zhiqiang.yu
58 * [MOLY00595466] [Colgin]USBDRV Patchback From T700 Branch
59 *
60 * .
61 *
62 * 10 08 2018 gang.lei
63 * [MOLY00351431] DPMAIF DL Patch USB driver changes
64 * .
65 *
66 * 11 16 2017 gang.lei
67 * [MOLY00277303] [Eiger][SSUSB] UDLQ and Generator driver/test cases checkin
68 * Eiger SSUSB UDLQ driver checkin.
69 *
70 * 10 11 2017 gang.lei
71 * [MOLY00282646] [93/95 re-arch]usb driver checkin
72 * [93/95 re-arch]usb driver checkin
73 *
74 * 10 11 2017 gang.lei
75 * [MOLY00282642] [Gen93/95 Co-CodeBase]USB driver check in
76 * Gen93/95 Co-CodeBase USB driver checkin
77 *
78 * 03 28 2017 shenghui.shi
79 * [MOLY00236724] update USB DLQ driver
80 * update usb driver for merge UMOLY to UMOLYA
81 *
82 * 03 22 2017 gang.lei
83 * [MOLY00223010] UMOLYA USB Driver Checkin
84 * for ULQ type MACRO remove
85 *
86 * 03 06 2017 shenghui.shi
87 * [MOLY00233213] [SE2 Internal Test][93][BRINGUP.DEV][Sanity][20170302][1][core0,vpe0,tc0(vpe0)] Fatal Error (0x1d, 0x95c00170, 0x90221344) - USB_HIS
88 * fix DLQ flush API bug
89 *
90 * 02 21 2017 shenghui.shi
91 * [MOLY00226854] UMOLYA USB driver update
92 * drb cache align
93 *
94 * 02 21 2017 shenghui.shi
95 * [MOLY00226854] UMOLYA USB driver update
96 * udpate usb DRB flush API and add debug log
97 *
98 * 02 08 2017 gang.lei
99 * [MOLY00223010] UMOLYA USB Driver Checkin
100 * 1.fix dlq cs err issue
101 * 2.fix ulq cache flush issue
102 *
103 * 02 06 2017 gang.lei
104 * [MOLY00223010] UMOLYA USB Driver Checkin
105 * fix UDLQ Driver issue
106 *
107 * 02 15 2017 gang.lei
108 * [MOLY00223010] UMOLYA USB Driver Checkin
109 * Merge from Bringup DEV to Trunk
110 *
111 * 02 07 2017 shenghui.shi
112 * [MOLY00226854] UMOLYA USB driver update
113 * update MUSB DRB driver for cache flush issue.
114 *
115 * 01 05 2017 gang.lei
116 * [MOLY00223010] UMOLYA USB Driver Checkin
117 * <saved by Perforce>
118 ****************************************************************************/
119
120
121
122#ifndef __HIF_COMMON_H__
123#define __HIF_COMMON_H__
124
125#include "qmu_bm.h"
126//#include "kal_internal_api.h"
127
128typedef enum _hif_flush_type{
129 /*
130 * @brief set entire queue hwo=0 and return the head/tail/number
131 */
132 HIFQ_FLUSH_DEQ = 0,
133 /*
134 * @brief directly destroy whole queue and return the head/tail/number
135 */
136 HIFQ_FLUSH_FREE,
137}hif_flush_type_e;
138
139typedef enum _hif_queue_type{
140 HIFQ_TYPE_MIN = 0,
141 HIFQ_TYPE_TX, //default use the BPS
142 HIFQ_TYPE_RX, //default don't use BPS
143 HIFQ_TYPE_TX_WO_BPS, // for test only
144 HIFQ_TYPE_RX_W_BPS, // for test only
145 HIFQ_TYPE_TX_NO_FLUSH, //conjunction with HIF_QCFG_BM_TX_EMPTY_ENQ, it transmits GPD's without checksum calcuation and cache flush operations
146 HIFQ_TYPE_MAX,
147}hif_queue_type_e;
148
149typedef enum _hif_deq_type{
150 HIFQ_DEQ = 0,
151 HIFQ_FREEQ,
152 HIFQ_DEQ_TYPE2,
153#ifdef SDIO_TST
154 HIFQ_SDIO_TEST_FREEQ,
155#endif
156}hif_deq_type_e;
157
158typedef struct _hif_deq_info{
159 hif_queue_type_e q_type;
160 kal_uint8 que_no;
161 hif_deq_type_e deq_type;
162 kal_uint8 reserve[1];
163}hif_deq_info_t;
164
165/****************************************************************************
166 93 ULDL XIT/DRB Format
167 ****************************************************************************/
168
169/****************************************************************************
170 * Structure of UL XIT
171 ****************************************************************************/
172typedef struct _usbq_ul_xit usbq_ul_xit;
173
174struct _usbq_ul_xit
175{
176 kal_uint16 ul_xfer_length;
177 kal_uint16 reserved;
178 void *p_ul_xfer_start_addr;
179};
180
181
182#define HIFUSB_QMU_GET_CURRENT_XIT_ADDR(_q) hifusbq_get_xit_start_address(_q)
183#define USBQ_GET_XIT_PTR(_q,_idx) ((usbq_ul_xit *)(HIFUSB_QMU_GET_CURRENT_XIT_ADDR(_q) ) + _idx)
184
185#define USBQ_XIT_GET_XFER_LEN(_q,_idx) USBQ_GET_XIT_PTR(_q,_idx) -> ul_xfer_length
186#define USBQ_XIT_GET_XFER_START_ADDR(_q,_idx) USBQ_GET_XIT_PTR(_q,_idx) -> p_ul_xfer_start_addr
187
188#define USB_UL_XIT_ENTRY_SIZE 512
189#define USB_UL_XIT_SIZE (USB_UL_XIT_ENTRY_SIZE*8)
190/****************************************************************************
191 * Structure of DL DRB
192 ****************************************************************************/
193typedef struct _usbq_dl_ph_drb usbq_dl_ph_drb;
194
195struct _usbq_dl_ph_drb
196{
197 kal_uint8 drb_flag;
198 kal_uint8 padding_length;
199 kal_uint16 dl_data_length;
200 kal_uint32 rh_data;
201};
202
203typedef struct _usbq_dl_pd_drb usbq_dl_pd_drb;
204
205struct _usbq_dl_pd_drb
206{
207 kal_uint8 drb_flag;
208 kal_uint8 padding_length;
209 kal_uint16 dl_data_length;
210 void *p_dl_data_addr;
211};
212
213typedef struct _usbq_dl_td_drb usbq_dl_td_drb;
214
215struct _usbq_dl_td_drb
216{
217 kal_uint8 drb_flag;
218 kal_uint8 reserved1;
219 kal_uint16 dl_xfer_length;
220 kal_uint32 reserved2;
221};
222
223typedef struct _usbq_dl_fh_drb usbq_dl_fh_drb;
224
225struct _usbq_dl_fh_drb
226{
227 kal_uint16 fh_index;
228 kal_uint16 dl_fh_length;
229 void *p_dl_fh_addr;
230};
231
232#define HIFUSBQ_QBM_BPS_BUF_SZ QBM_QUEUE_GET_MEM_SIZE(QBM_SIZE_TGPD_BPS, HIFUSBQ_QBM_BPS_NUM)
233
234#define USB_DL_DRB_REV_SIZE 1024
235#define USB_DL_DRB_SIZE 4096
236#define USB_DL_DRB_TOTAL_SIZE (USB_DL_DRB_SIZE + USB_DL_DRB_REV_SIZE)*8
237
238#define USB_DL_DRB_ENTRY_SIZE 4096
239#define USB_DL_DRB_MAX_COUNT 4096
240#define USB_DL_DLQ_FH_MAX_SIZE 256
241extern kal_uint8 hifusb_dlq_drb[USB_DL_DRB_TOTAL_SIZE];
242extern kal_uint8 hifusb_dlq_sw_drb[USB_DL_DRB_TOTAL_SIZE];
243
244#define HIFUSB_QMU_GET_START_PH_ADDR(_q) hifusbq_get_drb_start_address(_q)
245#define USBQ_GET_DRB_PH_PTR(_q,_idx) ((usbq_dl_ph_drb*)(HIFUSB_QMU_GET_START_PH_ADDR(_q))+(_idx))
246
247#define HIFUSB_QMU_GET_START_PD_ADDR(_q) hifusbq_get_drb_start_address(_q)
248#define USBQ_GET_DRB_PD_PTR(_q,_idx) ((usbq_dl_pd_drb*)(HIFUSB_QMU_GET_START_PD_ADDR(_q))+(_idx))
249
250#define HIFUSB_QMU_GET_START_TD_ADDR(_q) hifusbq_get_drb_start_address(_q)
251#define USBQ_GET_DRB_TD_PTR(_q,_idx) ((usbq_dl_td_drb*)(HIFUSB_QMU_GET_START_TD_ADDR(_q))+(_idx))
252
253#define HIFUSB_QMU_GET_RELEASE_TYPE_ADDR(_q) hifusbq_get_sw_drb_start_address(_q)
254#define USBQ_GET_DRB_REL_TYPE(_q,_idx) ((usbq_dl_pd_drb*)(HIFUSB_QMU_GET_RELEASE_TYPE_ADDR(_q))+(_idx))
255
256#define HIFUSB_QMU_GET_RELEASE_OFFSET_ADDR(_q) hifusbq_get_sw_drb_start_address(_q)
257#define USBQ_GET_DRB_REL_OFFSET(_q,_idx) ((usbq_dl_pd_drb*)(HIFUSB_QMU_GET_RELEASE_OFFSET_ADDR(_q))+(_idx))
258
259//DRB Flag
260#define DRB_FLAG_BIT_DTYP_MSK 0x03
261#define DRB_FLAG_DTYP_TH 0x00
262#define DRB_FLAG_DTYP_PL 0x01
263#define DRB_FLAG_DTYP_PH 0x02
264#define DRB_FLAG_BIT_AH 0x08
265
266#define DRB_FLAG_BIT_TYPE_MSK 0xFF
267
268#define DRB_FLAG_BIT_FHTYP_MSK 0x70
269#define DRB_FLAG_FHTYP_NONE 0x00
270#define DRB_FLAG_FHTYP_TYPE1 0x10
271#define DRB_FLAG_FHTYP_TYPE2 0x20
272#define DRB_FLAG_FHTYP_TYPE3 0x30
273#define DRB_FLAG_FHTYP_TYPE4 0x40
274#define DRB_FLAG_FHTYP_TYPE5 0x50
275#define DRB_FLAG_FHTYP_TYPE6 0x60
276#define DRB_FLAG_FHTYP_TYPE7 0x70
277
278#define DRB_FLAG_BIT_EOT 0x80
279
280#define DRB_FLAG_BIT_XTYP_MSK 0x70
281#define DRB_FLAG_XTYP_NONE 0x00
282#define DRB_FLAG_XTYP_RNDIS 0x10
283#define DRB_FLAG_XTYP_ECM 0x20
284#define DRB_FLAG_XTYP_MBIM 0x30
285#define DRB_FLAG_XTYP_NCM 0x40
286
287#define DRB_FLAG_BTYP_PRB 0x01
288#define DRB_FLAG_BTYP_VRB 0x02
289#define DRB_FLAG_BTYP_DPMAIF 0x03
290#define DRB_FLAG_BTYP_DPMAIF_FRAG 0x04
291
292//Packet header Descriptor part
293#define USBQ_DRB_PH_RESET(_q,_idx) \
294 kal_mem_set(USBQ_GET_DRB_PH_PTR(_q,_idx), 0, sizeof(usbq_dl_ph_drb))
295
296
297//Packet header Descriptor part
298#define USBQ_DRB_PH_SET_DTYP(_q,_idx,_v) \
299 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_DTYP_MSK); \
300 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag |= (_v))
301
302#define USBQ_DRB_PH_CLR_DTYP(_q,_idx) \
303 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_DTYP_MSK)
304
305#define USBQ_DRB_PH_GET_DTYP(_q,_idx) \
306 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_DTYP_MSK)
307
308#define USBQ_DRB_PH_SET_AH(_q,_idx) \
309 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag |= DRB_FLAG_BIT_AH)
310
311#define USBQ_DRB_PH_CLR_AH(_q,_idx) \
312 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_AH)
313
314#define USBQ_DRB_PH_GET_AH(_q,_idx) \
315 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_AH)
316
317#define USBQ_DRB_PH_SET_FHTYP(_q,_idx,_v) \
318 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_FHTYP_MSK); \
319 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag |= ((_v)<<4))
320
321#define USBQ_DRB_PH_CLR_FHTYP(_q,_idx) \
322 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_FHTYP_MSK)
323
324#define USBQ_DRB_PH_GET_FHTYP(_q,_idx) \
325 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_FHTYP_MSK)
326
327#define USBQ_DRB_PH_SET_EOT(_q,_idx) \
328 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag |= DRB_FLAG_BIT_EOT)
329
330#define USBQ_DRB_PH_CLR_EOT(_q,_idx) \
331 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_EOT)
332
333#define USBQ_DRB_PH_GET_EOT(_q,_idx) \
334 (USBQ_GET_DRB_PH_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_EOT)
335
336#define USBQ_DRB_PH_GET_PAD_LEN(_q,_idx) \
337 (USBQ_GET_DRB_PH_PTR(_q,_idx)->padding_length)
338
339#define USBQ_DRB_PH_SET_PAD_LEN(_q,_idx,_len) \
340 (USBQ_GET_DRB_PH_PTR(_q,_idx)->padding_length = (kal_uint8)(_len))
341
342#define USBQ_DRB_PH_GET_DATA_LEN(_q,_idx) \
343 (USBQ_GET_DRB_PH_PTR(_q,_idx)->dl_data_length)
344
345#define USBQ_DRB_PH_SET_DATA_LEN(_q,_idx,_len) \
346 (USBQ_GET_DRB_PH_PTR(_q,_idx)->dl_data_length = (kal_uint16)(_len))
347
348#define USBQ_DRB_PH_GET_RH_DATA(_q,_idx) \
349 (USBQ_GET_DRB_PH_PTR(_q,_idx)->rh_data)
350
351#define USBQ_DRB_PH_SET_RH_DATA(_q,_idx,_rh_data) \
352 (USBQ_GET_DRB_PH_PTR(_q,_idx)->rh_data = (kal_uint32)(_rh_data))
353
354
355//Payload Descriptor part
356#define USBQ_DRB_PD_RESET(_q,_idx) \
357 kal_mem_set(USBQ_GET_DRB_PD_PTR(_q,_idx), 0, sizeof(usbq_dl_pd_drb))
358
359
360//Payload Descriptor part
361#define USBQ_DRB_PD_SET_BTYP(_q,_idx,_v) \
362 (USBQ_GET_DRB_REL_TYPE(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_TYPE_MSK); \
363 (USBQ_GET_DRB_REL_TYPE(_q,_idx)->drb_flag |= (_v))
364
365#define USBQ_DRB_PD_CLR_BTYP(_q,_idx) \
366 (USBQ_GET_DRB_REL_TYPE(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_TYPE_MSK)
367
368#define USBQ_DRB_PD_GET_BTYP(_q,_idx) \
369 (USBQ_GET_DRB_REL_TYPE(_q,_idx)->drb_flag & DRB_FLAG_BIT_TYPE_MSK)
370
371#define USBQ_DRB_PD_SET_OFFSET(_q,_idx,_offset) \
372 (USBQ_GET_DRB_REL_OFFSET(_q,_idx)->padding_length = (_offset))
373
374#define USBQ_DRB_PD_GET_OFFSET(_q,_idx) \
375 (USBQ_GET_DRB_REL_OFFSET(_q,_idx)->padding_length)
376
377#define USBQ_DRB_PD_SET_DTYP(_q,_idx,_v) \
378 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_DTYP_MSK); \
379 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag |= (_v))
380
381#define USBQ_DRB_PD_CLR_DTYP(_q,_idx) \
382 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_DTYP_MSK)
383
384#define USBQ_DRB_PD_GET_DTYP(_q,_idx) \
385 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_DTYP_MSK)
386
387#define USBQ_DRB_PD_SET_AH(_q,_idx) \
388 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag |= DRB_FLAG_BIT_AH)
389
390#define USBQ_DRB_PD_CLR_AH(_q,_idx) \
391 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_AH)
392
393#define USBQ_DRB_PD_GET_AH(_q,_idx) \
394 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_AH)
395
396#define USBQ_DRB_PD_SET_FHTYP(_q,_idx,_v) \
397 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_FHTYP_MSK); \
398 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag |= ((_v)<<4))
399
400#define USBQ_DRB_PD_CLR_FHTYP(_q,_idx) \
401 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_FHTYP_MSK)
402
403#define USBQ_DRB_PD_GET_FHTYP(_q,_idx) \
404 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_FHTYP_MSK)
405
406#define USBQ_DRB_PD_SET_EOT(_q,_idx) \
407 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag |= DRB_FLAG_BIT_EOT)
408
409#define USBQ_DRB_PD_CLR_EOT(_q,_idx) \
410 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_EOT)
411
412#define USBQ_DRB_PD_GET_EOT(_q,_idx) \
413 (USBQ_GET_DRB_PD_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_EOT)
414
415#define USBQ_DRB_PD_GET_PAD_LEN(_q,_idx) \
416 (USBQ_GET_DRB_PD_PTR(_q,_idx)->padding_length)
417
418#define USBQ_DRB_PD_SET_PAD_LEN(_q,_idx,_len) \
419 (USBQ_GET_DRB_PD_PTR(_q,_idx)->padding_length = (kal_uint8)(_len))
420
421#define USBQ_DRB_PD_GET_DATA_LEN(_q,_idx) \
422 (USBQ_GET_DRB_PD_PTR(_q,_idx)->dl_data_length)
423
424#define USBQ_DRB_PD_SET_DATA_LEN(_q,_idx,_len) \
425 (USBQ_GET_DRB_PD_PTR(_q,_idx)->dl_data_length = (kal_uint16)(_len))
426
427#define USBQ_DRB_PD_GET_DATA_ADDR(_q,_idx) \
428 (USBQ_GET_DRB_PD_PTR(_q,_idx)->p_dl_data_addr)
429
430#define USBQ_DRB_PD_SET_DATA_ADDR(_q,_idx,_dp) \
431 (USBQ_GET_DRB_PD_PTR(_q,_idx)->p_dl_data_addr = (kal_uint32*)(_dp))
432
433//Transfer Header Descriptor part
434#define USBQ_DRB_TD_SET_DTYP(_q,_idx,_v) \
435 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_DTYP_MSK); \
436 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag |= (_v))
437
438#define USBQ_DRB_TD_CLR_DTYP(_q,_idx) \
439 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_DTYP_MSK)
440
441#define USBQ_DRB_TD_GET_DTYP(_q,_idx) \
442 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_DTYP_MSK)
443
444#define USBQ_DRB_TD_SET_AH(_q,_idx) \
445 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag |= DRB_FLAG_BIT_AH)
446
447#define USBQ_DRB_TD_CLR_AH(_q,_idx) \
448 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_AH)
449
450#define USBQ_DRB_TD_GET_AH(_q,_idx) \
451 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_AH)
452
453#define USBQ_DRB_TD_SET_XTYP(_q,_idx,_v) \
454 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_XTYP_MSK); \
455 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag |= ((_v)<<4))
456
457#define USBQ_DRB_TD_CLR_XTYP(_q,_idx) \
458 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag &=~ DRB_FLAG_BIT_XTYP_MSK)
459
460#define USBQ_DRB_TD_GET_XTYP(_q,_idx) \
461 (USBQ_GET_DRB_TD_PTR(_q,_idx)->drb_flag & DRB_FLAG_BIT_XTYP_MSK)
462
463#define USBQ_DRB_TD_GET_XFER_LEN(_q,_idx) \
464 (USBQ_GET_DRB_TD_PTR(_q,_idx)->dl_xfer_length)
465
466#define USBQ_DRB_TD_SET_XFER_LEN(_q,_idx,_len) \
467 (USBQ_GET_DRB_TD_PTR(_q,_idx)->dl_xfer_length = (kal_uint16)(_len))
468
469//Transfer Header Descriptor part
470#define USBQ_DRB_TD_RESET(_q,_idx) \
471 kal_mem_set(USBQ_GET_DRB_TD_PTR(_q,_idx), 0, sizeof(usbq_dl_td_drb))
472
473
474/*!
475 * @brief the queue configuration bit-map
476 * @param HIF_QCFG_BM_TX_EMPTY_ENQ , set one and the set_gpd flow would follow non-bps enq flow
477 */
478#define HIF_QCFG_BM_TX_EMPTY_ENQ (0x1 << 0)
479
480typedef enum
481{
482 USB_HEADER_RULE_RNDIS = 0,
483 USB_HEADER_RULE_MBIM,
484} usb_header_rule_enum;
485
486typedef struct
487{
488 void *ph_start_ptr;
489 void *xh_start_ptr;
490 kal_uint16 ph_size;
491 kal_uint16 xh_size;
492} usb_header_rule_data_t;
493
494
495
496/*!
497 * @brief ask hif driver to set GPD buffer into QMU
498 * @param q_type the queue type
499 * @param queue_no QMU queue no
500 * @param first_gpd first GPD of a single GPD or GPD list
501 * @param last_gpd last GPD of a single GPD or GPD list
502 * @return KAL_TRUE : set gpd success,
503 KAL_FALSE : set gpd fail and upper module should re-submit or free the queue list
504 */
505kal_bool hif_set_gpd(hif_queue_type_e q_type, kal_uint8 queue_no, qbm_gpd* first_gpd, qbm_gpd* last_gpd);
506
507
508/*!
509 * @brief ask hif driver to flush all GPD buffer from QMU
510 * @param q_type the queue type
511 * @param queue_no QMU queue no
512 * @param flush type the flush type wished
513 * @param pp_head the head pointer of flush list
514 * @param pp_tail the tail pointer of flush list
515 * @return return total flushed gpd number
516 */
517kal_uint32 hif_flush_gpd(hif_queue_type_e q_type, kal_uint8 queue_no, hif_flush_type_e flush_type , void **pp_head, void **pp_tail);
518
519
520/*!
521 * @brief poll specified QMU queue to see if any GPD complete
522 * deq_type == HIFQ_FREEQ, (use qbmt_free_q_hwo())
523 * would free the used queue after this function and return the deq number
524 * deq_type == HIF_DEQ,
525 * would just deq and return the deq list and the deq number
526 * use use qbmt_de_q() if generic buffer type
527 * use deqmt_deq_hif_ul_type1() if QBM_TYPE_HIF_UL_TYPE1
528 * use deqmt_deq_hif_ul_type2() if QBM_TYPE_HIF_UL_TYPE2
529 * @param deq_info the que number , que type and deq type
530 * @param first_gpd first GPD of a single GPD or GPD list
531 * @param last_gpd last GPD of a single GPD or GPD list
532 * @return return the deq number
533 */
534kal_uint32 hif_poll_queue(hif_deq_info_t deq_info, void **first_gpd, void **last_gpd);
535
536/*!
537 * @brief initial hif_common.c private structure and variable
538 * @return return KAL_TRUE if success , KAL_FALSE if failure
539 */
540kal_bool hif_common_qmu_init(void);
541
542/*!
543 * @brief get currently que list
544 * @param is_tx, KAL_TRUE for txq , KAL_FALSE for rxq
545 * @param q_no , the queue number form 0~n
546 * @param pp_head , return the currently queue head
547 * @param pp_tail , return the currently queue tail
548 */
549void hif_get_que_list(kal_bool is_tx , kal_uint8 q_no, void **pp_head, void **pp_tail);
550
551/*!
552 * @brief configure specific queue operation option with bit-map config
553 * @param is_tx, KAL_TRUE for txq , KAL_FALSE for rxq
554 * @param q_no , the queue number form 0~n
555 * @param que_cfg , the bit-map configuration , ex. HIF_QCFG_BM_TX_EMPTY_ENQ
556 * @return KAL_TRUE if success, KAL_FALSE if configure not valid
557 */
558kal_bool hif_set_que_cfg(kal_bool is_tx , kal_uint8 q_no, kal_uint16 que_cfg);
559
560#endif