initial release
[apps/tidep0074.git] / ipu1 / icss_emacDrv.h
1 /**
2  *   @file  icss_emacDrv.h
3  *   @brief
4  *      Include file for ICSS_EMAC RX/TX functions and queue structures
5  */
7 /* Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/ 
8 *
9 *   Redistribution and use in source and binary forms, with or without 
10 *   modification, are permitted provided that the following conditions 
11 *   are met:
12 *
13 *     Redistributions of source code must retain the above copyright 
14 *     notice, this list of conditions and the following disclaimer.
15 *
16 *     Redistributions in binary form must reproduce the above copyright
17 *     notice, this list of conditions and the following disclaimer in the 
18 *     documentation and/or other materials provided with the   
19 *     distribution.
20 *
21 *     Neither the name of Texas Instruments Incorporated nor the names of
22 *     its contributors may be used to endorse or promote products derived
23 *     from this software without specific prior written permission.
24 *
25 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
26 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
27 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
29 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
30 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
31 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
34 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
35 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 */
41 #ifndef ICSS_EMACDRV__H
42 #define ICSS_EMACDRV__H
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
48 #include <stdint.h>
49 #include <ti/csl/hw_types.h>
52 #include <ti/drv/pruss/pruicss.h>
53 #include <ti/drv/icss_emac/icss_emacDrv_Def.h>
55 #include <ti/drv/icss_emac/icss_emacCommon.h>
56 #include <ti/drv/icss_emac/icss_emacLearning.h>
57 #include <ti/drv/icss_emac/icss_emacFwInit.h>
58 #include <ti/drv/icss_emac/icss_emacStatistics.h>
59 #include <ti/drv/icss_emac/icss_emacStormControl.h>
60 #include <ti/drv/icss_emac/icss_emac_osal.h>
62 #include <ti/drv/icss_emac/src/phy.h>
64 /* ========================================================================== */
65 /*                           Macros & Typedefs                                */
66 /* ========================================================================== */
68 #define PKT_PROC_NONE           0
69 #define PKT_PROC_GOOSE          1
71 #define PKT_PROC_PTP            3
72 #define PKT_PROC_SV             4
73 #define PKT_PROC_MPU            5
75 /**
76  *  \defgroup   ErrCodes    STANDARD ERROR CODES
77  *  @{
78  */
79 /** Internal functions return error codes */
80 #define ICSS_EMAC_SWITCH_INSTANCE_CODE                        (0u)
81 /**< Switch Instance Code                                              */
82 #define ICSS_EMAC_SWITCH_ERROR_BASE                           (0x200001Fu)
83 /**< Switch Error Base                                              */
84 #define ICSS_EMAC_SWITCH_ERROR_CODE                           ((ICSS_EMAC_SWITCH_ERROR_BASE | ((ICSS_EMAC_SWITCH_INSTANCE_CODE) << 16)))
85 /**< Switch Error Code                                              */
86 #define ICSS_EMAC_SWITCH_ERROR_INFO                           (ICSS_EMAC_SWITCH_ERROR_CODE)
87 /**< Switch Error/Informational                                              */
88 #define ICSS_EMAC_SWITCH_ERROR_WARNING                        (ICSS_EMAC_SWITCH_ERROR_CODE | 0x10000000u)
89 /**< Switch Error/Warning                                              */
90 #define ICSS_EMAC_SWITCH_ERROR_MINOR                          (ICSS_EMAC_SWITCH_ERROR_CODE | 0x20000000u)
91 /**< Switch Error Minor                                              */
92 #define ICSS_EMAC_SWITCH_ERROR_MAJOR                          (ICSS_EMAC_SWITCH_ERROR_CODE | 0x30000000u)
93 /**< Switch Error Major                                              */
94 #define ICSS_EMAC_SWITCH_ERROR_CRITICAL                       (ICSS_EMAC_SWITCH_ERROR_CODE | 0x40000000u)
95 /**< Switch Error Critical                                              */
97 /**  Success code */
98 #define ICSS_EMAC_SWITCH_SUCCESS                              0u
100 /**  Error codes */
101 #define ICSS_EMAC_ERR_DEV_ALREADY_INSTANTIATED(instID)  (0x30000000u + ICSS_EMAC_SWITCH_ERROR_BASE + ((instId) << 16) )
102 /**< Device with same instance ID already created. */
103 #define ICSS_EMAC_ERR_DEV_NOT_INSTANTIATED              (ICSS_EMAC_SWITCH_ERROR_MAJOR + 1u)
104 /**< Device is not instantiated yet.                                        */
105 #define ICSS_EMAC_ERR_SWITCH_INVALID_PARAM                            (ICSS_EMAC_SWITCH_ERROR_MAJOR + 2u)
106 /**< Function or calling parameter is invalid                               */
107 #define ICSS_EMAC_ERR_CH_INVALID                        (ICSS_EMAC_SWITCH_ERROR_CRITICAL + 3u)
108 /**< Channel number invalid                                                 */
109 #define ICSS_EMAC_ERR_CH_ALREADY_INIT                   (ICSS_EMAC_SWITCH_ERROR_MAJOR + 4u)
110 /**< Channel already initialized and setup                                  */
111 #define ICSS_EMAC_ERR_TX_CH_ALREADY_CLOSED              (ICSS_EMAC_SWITCH_ERROR_MAJOR + 5u)
112 /**< Tx Channel already  closed. Channel close failed                       */
113 #define ICSS_EMAC_ERR_TX_CH_NOT_OPEN                   (ICSS_EMAC_SWITCH_ERROR_MAJOR + 6u)
114 /**< Tx Channel not open.                                                   */
115 #define ICSS_EMAC_ERR_TX_NO_LINK                       (ICSS_EMAC_SWITCH_ERROR_MAJOR + 7u)
116 /**< Tx Link not up.                                                        */
117 #define ICSS_EMAC_ERR_TX_OUT_OF_BD                     (ICSS_EMAC_SWITCH_ERROR_MAJOR + 8u)
118 /**< Tx ran out of Buffer descriptors to use.                               */
119 #define ICSS_EMAC_ERR_RX_CH_INVALID                    (ICSS_EMAC_SWITCH_ERROR_CRITICAL + 9u)
120 /**< Rx Channel invalid number.                                             */
121 #define ICSS_EMAC_ERR_RX_CH_ALREADY_INIT               (ICSS_EMAC_SWITCH_ERROR_MAJOR + 10u)
122 /**< Rx Channel already setup.                                              */
123 #define ICSS_EMAC_ERR_RX_CH_ALREADY_CLOSED             (ICSS_EMAC_SWITCH_ERROR_MAJOR + 11u)
124 /**< Rx Channel already closed. Channel close failed.                       */
125 #define ICSS_EMAC_ERR_RX_CH_NOT_OPEN                   (ICSS_EMAC_SWITCH_ERROR_MAJOR + 12u)
126 /**< Rx Channel not open yet.                                               */
127 #define ICSS_EMAC_ERR_DEV_ALREADY_CREATED              (ICSS_EMAC_SWITCH_ERROR_MAJOR + 13u)
128 /**< EMAC device already created.                                           */
129 #define ICSS_EMAC_ERR_DEV_NOT_OPEN                     (ICSS_EMAC_SWITCH_ERROR_MAJOR + 14u)
130 /**< Device is not open or not ready                                        */
131 #define ICSS_EMAC_ERR_DEV_ALREADY_CLOSED               (ICSS_EMAC_SWITCH_ERROR_MAJOR + 15u)
132 /**< Device close failed. Device already closed.                            */
133 #define ICSS_EMAC_ERR_DEV_ALREADY_OPEN                 (ICSS_EMAC_SWITCH_ERROR_MAJOR + 16u)
134 /**< Device open failed. Device already open.                               */
135 #define ICSS_EMAC_ERR_RX_BUFFER_ALLOC_FAIL             (ICSS_EMAC_SWITCH_ERROR_CRITICAL +17u)
136 /**< Rx Buffer Descriptor allocation failed.                                */
137 #define ICSS_EMAC_SWITCH_INTERNAL_FAILURE                     (ICSS_EMAC_SWITCH_ERROR_MAJOR + 18u)
138 /**< EMAC Internal failure.                                                 */
139 #define ICSS_EMAC_SWITCH_VLAN_UNAWARE_MODE          (ICSS_EMAC_SWITCH_ERROR_MAJOR + 19u)
140 /**< VLAN support not enabled in EMAC                                       */
141 #define ICSS_EMAC_SWITCH_ALE_TABLE_FULL             (ICSS_EMAC_SWITCH_ERROR_MAJOR + 20u)
142 /**< ALE Table full.                                               */
143 #define ICSS_EMAC_SWITCH_ADDR_NOTFOUND              (ICSS_EMAC_SWITCH_ERROR_MAJOR + 21u)
144 /**< Multicast/Unicast/OUI Address not found in ALE.                        */
145 #define ICSS_EMAC_SWITCH_INVALID_VLANID             (ICSS_EMAC_SWITCH_ERROR_MAJOR + 22u)
146 /**< Invalid VLAN Id.                                                       */
147 #define ICSS_EMAC_SWITCH_INVALID_PORT               (ICSS_EMAC_SWITCH_ERROR_MAJOR + 23u)
148 /**< Invalid Port Specified.                                                */
149 #define ICSS_EMAC_SWITCH_BD_ALLOC_FAIL              (ICSS_EMAC_SWITCH_ERROR_MAJOR + 24u)
150 /**< Buffer Descriptor Allocation failure. OOM                              */
151 #define ICSS_EMAC_ERR_BADPACKET                        (ICSS_EMAC_SWITCH_ERROR_MAJOR + 25u)
152 /**< Supplied packet was invalid  */
153 #define ICSS_EMAC_ERR_COLLISION_FAIL                   (ICSS_EMAC_SWITCH_ERROR_MAJOR + 26u)
154 /**< Collision queue was full                             */
155 #define ICSS_EMAC_ERR_MACFATAL                         (ICSS_EMAC_SWITCH_ERROR_CRITICAL + 26u)
156 /**< Fatal Error - EMACClose() required                                    */
157 /* @} */
159 /**Dual MAC Mode. Both Ports Enabled  */
160 #define ICSS_EMAC_MODE_DUALMAC   (4U)
161 /**witch Mode  */
162 #define ICSS_EMAC_MODE_SWITCH    (3U)
163 /**Single EMAC Mode. Port 1 Enabled  */
164 #define ICSS_EMAC_MODE_MAC1      (1U)
165 /**Single EMAC Mode. Port 2 Enabled  */
166 #define ICSS_EMAC_MODE_MAC2      (2U)
168 /** Number of Ports in a single ICSS  */
169 #define MAX_PORT_NUMBER     2
171 /**Total Queues available*/
172 #define ICSS_EMAC_NUMQUEUES (5)
173 /**Priority Queue 1*/
174 #define ICSS_EMAC_QUEUE1 (0)
175 /**Priority Queue 2*/
176 #define ICSS_EMAC_QUEUE2 (1)
177 /**Priority Queue 3*/
178 #define ICSS_EMAC_QUEUE3 (2)
179 /**Priority Queue 4*/
180 #define ICSS_EMAC_QUEUE4 (3)
181 /**Collision Queue*/
182 #define ICSS_EMAC_COLQUEUE (4)
185 /*
186 *  @brief     ICSS EMAC Init Configuration Structure
187 */
188 typedef struct {
189     /** Phy address of the ports.For mac each handle will have single port only
190     *   And Two for Switch handle
191     */
192     uint32_t phyAddr[MAX_PORT_NUMBER];
193     /** Flag to enable Half duplex capability. Firmware support also is required to
194     *   enable the functionality
195     */
196     uint8_t halfDuplexEnable;
197     /** Flag to enable Interrupt pacing */
198     uint8_t enableIntrPacing;
199     /** Number of packets threshold for Pacing Mode1 */
200     uint16_t pacingThreshold;
201     /** Queue Priority separation for RT and NRT packets
202     *   If packets are in Queue <=ethPrioQueue, they will be forwarded to NRT callback
203     *   and others to RT callback
204     */
205     uint8_t ethPrioQueue;
206     /** Flag to enable learning. Not applicable for Mac mode */
207     uint8_t learningEn;
208     /**Port Mask. Indication to LLD which ports to be used
209     * Valid values:ICSS_EMAC_MODE_SWITCH,ICSS_EMAC_MODE_MAC1,ICSS_EMAC_MODE_MAC1
210     */
211     uint8_t portMask;
212     /**Rx interrupt number*/
213     uint8_t rxIntNum;
214     /**Link interrupt number*/
215     uint8_t linkIntNum;
216     /**Tx completion interrupt number*/
217     uint8_t txIntNum;
218     /**Macid to be used for the interface*/
219     uint8_t* macId;
220     /**Pacing mode to be used(MODE1/MODE2)*/
221     uint8_t ICSS_EmacIntrPacingMode;
222 } ICSS_EmacInitConfig;
224 #define ICSSEMAC_InitConfig ICSS_EmacInitConfig
227 /**
228  * @brief Queue Statistics
229  */
230 typedef struct {
231     /**queue raw count*/
232     uint32_t rawCount;
233     /**queue error count*/
234     uint32_t errCount;
235 } ICSS_EmacQueueStats;
238 /**
239  * @brief Queue Parameters
240  */
241 typedef struct queParams {
242     /**Queue statistics*/
243     ICSS_EmacQueueStats  qStat;
244     /**buffer  offset*/
245     uint16_t    buffer_offset;
246     /**buffer descriptor offset*/
247     uint16_t    buffer_desc_offset;
248     /**queue descriptor offset*/
249     uint16_t    queue_desc_offset;
250     /**queue size*/
251     uint16_t    queue_size;
252 } ICSS_EmacQueueParams;
254 /**
255  * @brief Port parameters
256  */
257 typedef struct {
258     /**pointer to PTCP packet mem*/
259     uint8_t*            ptcpPktBuff;
260     /**statistics   - raw*/
261     uint32_t            rawCount;
262     /**Error count*/
263     uint32_t            errCount;
264     /**Queues per port*/
265     ICSS_EmacQueueParams        queue[ICSS_EMAC_NUMQUEUES];
266 } ICSS_EmacPortParams;
268 /*
269 *  @brief     ICSSEMAC_Object
270 *             Handle containing pointers to all modules as well as Initialization Config
271 */
272 typedef struct ICSS_EmacObject_s {
273     /*! PRUICSS Handle details where the EMAC driver will be based on       */
274     PRUICSS_Handle            pruIcssHandle;
275     /*! Pointer to initial configuration structure                          */
276     ICSS_EmacInitConfig       *emacInitcfg;
277     /*! Mac Table Pointer for Learning module. Not applicable for Emac mode */
278     HashTable_t               *macTablePtr;
279     /*! Pointer All Driver specific Callback  structure                     */
280     ICSS_EmacCallBackObject   *callBackHandle;
281     /*! Pointer to  Emac driver Firmware statistics structure               */
282     void                      *pruStat;
283     /*! Pointer to Emac Driver host statistics structure                    */
284     void                      *hostStat;
285     /*! Pointer to Storm Prevention structure */
286     void                      *stormPrevPtr;
287     /*! Rx Task Handle for the emac instance.Required for receiving packets */
288     void                      *rxTaskHandle;
289     /*! Tx Task Handle for the emac instance.Required for notification of Trasnmit Complete indication from  PRUICSS firmware */
290     void                      *txTaskHandle;
291     /*! Rx Semaphore Handle for the emac instance.Required for receiving packets */
292     void                      *rxSemaphoreHandle;
293     /*! Tx Complete Semaphore Handle for the emac instance.Required for notification of Trasnmit Complete indication from  PRUICSS firmware */
294     void                      *txSemaphoreHandle;
295     /*! Rx interrupt handler */
296     void                      *rxintHandle;
297     /*! Link interrupt handler */
298     void                      *linkintHandle;
300     /*! Tx Complete interrupt handler */
301     void                      *txintHandle;
302     
303     /*! Pointer to store any data from High Level Driver  */
304     void                      *pvtInfo;
305     /*! Link status for the ports */
306     uint8_t                   linkStatus[MAX_PORT_NUMBER];
308     ICSS_EmacCallBack port0ISRCall;
309     ICSS_EmacCallBack port1ISRCall;
311     ICSS_EmacCallBack icssEmacHwIntRx;
312     ICSS_EmacCallBack icssEmacHwIntTx;
313     void *port0ISRUser;
314     void *port1ISRUser;
315     ICSS_EmacPortParams switchPort[3];
316 } ICSS_EmacObject;
318 /* For backward compatibility */
319 #define ICSSEMAC_Object ICSS_EmacObject
320 /**
321  * @brief Handle containing base addresses for all memories and modules
322  */
323 typedef struct ICSS_EmacHwAttrs_s {
324     ICSS_EmacBaseAddressHandle_T emacBaseAddrCfg;
325 }ICSS_EmacHwAttrs;
326 /* For backward compatibility */
327 #define ICSSEMAC_HwAttrs ICSS_EmacHwAttrs
329 /**
330  * @brief Base EMAC handle containing pointers to all modules required for driver to work
331  */
332 typedef struct ICSS_EmacConfig_s {
333     /*! Pointer to a driver specific data object */
334     void                   *object;
336     /*! Pointer to a driver specific hardware attributes structure */
337     void          const    *hwAttrs;
339 } ICSS_EmacConfig;
341 /**
342  * @brief Rx packet processing information block that needs to passed into  call to ICSS_EmacRxPktGet
343  */
344 typedef struct
346     ICSS_EmacHandle icssEmacHandle; /*! handle to ICSS_EMAC Instance*/
347     uint32_t destAddress; /*! Base address of data buffer where received frame has to be stored */
348     uint8_t queueNumber;    /*!Receive queue from which frame has to be copied */
349     uint8_t port;   /*!Returns port number on which frame was received */
350     uint32_t more;  /*!Returns more which is set to 1 if there are more frames in the queue */
351 } ICSS_EmacRxArgument;
353 /**
354  * @brief Tx packet processing information block that needs to passed into  call to ICSS_EmacTxPacket
355  */
356 typedef struct
358     ICSS_EmacHandle icssEmacHandle; /*! handle to ICSS_EMAC Instance*/
359     const uint8_t *srcAddress;  /*! Base address of the buffer where the frame to be transmitted resides */
360     uint8_t portNumber; /*!  Port on which frame has to be transmitted */
361     uint8_t queuePriority;  /*! Queue number in which frame will be  queued for transmission */
362     uint16_t lengthOfPacket;    /*! length of the frame in bytes */
363 } ICSS_EmacTxArgument;
365 /* For backward compatibility */
366 #define ICSSEMAC_Config ICSS_EmacConfig
368 /**
369 * @brief Enum for enableIntrPacing
370 */
371 typedef enum {
372         ICSS_EMAC_ENABLE_PACING = 0,            /**< Interrupt pacing enabled*/
373         ICSS_EMAC_DISABLE_PACING                        /**< Interrupt pacing disabled*/
374 } intrPacing;
376 /**
377 * @brief Enum for ICSS_EmacIntrPacingMode
378 */
379 typedef enum {
380         ICSS_EMAC_INTR_PACING_MODE1 = 0,    /**< Frame Count based Interrupt pacing*/
381         ICSS_EMAC_INTR_PACING_MODE2         /**< Timer based Interrupt pacing*/
382 } ICSS_EmacIntrPacingMode_e;
387 /**Maximum Valid size (incl header + VLAN TAG..., no CRC)*/
388 #define ICSS_EMAC_MAXMTU  (1518U)
389 /**Minimum Valid size ( DA + SA + Ethertype)*/
390 #define ICSS_EMAC_MINMTU  (14)
392 /**
393  *  @def  ICSS_EMAC_PORT_0
394  *        Used to specify host side port
395  */
396 #define ICSS_EMAC_PORT_0 (0)
398 /**
399  *  @def  ICSS_EMAC_PORT_1
400  *        Used to specify physical port 1 MII 0 (tx)
401  */
402 #define ICSS_EMAC_PORT_1 (1)
404 /**
405  *  @def  ICSS_EMAC_PORT_2
406  *        Used to specify physical port 2 MII 1 (tx)
407  */
408 #define ICSS_EMAC_PORT_2 (2)
411 /**
412 * @def MAX_NUM_PROTOCOL_IMPLEMENTED
413 *       Max Number of protocols
414 */
415 #define MAX_NUM_PROTOCOL_IMPLEMENTED   (50U)
416 /**
417 * @def NUM_PROTOCOLS_IMPLEMENTED
418 *      Number of protocols supported
419 */
420 #define NUM_PROTOCOLS_IMPLEMENTED  (2U)
421 /**
422 * @def IP4_PROT_TYPE
423 *      IP4 Protcol type
424 */
425 #define IP4_PROT_TYPE   (0x800)
426 /**
427 * @def ARP_PROT_TYPE
428 *      ARP protocol type
429 */
430 #define ARP_PROT_TYPE   (0x806)
433 /**
434  *  @b Description
435  *  @n
436  *      Receive frame interrupt service routine
437  *
438  *  @param[in]  args parameter list to interrupt service routine
439  *  @retval     none
440  */
441 void ICSS_EmacRxInterruptHandler(void *args);
445 /**
446  *  @b Description
447  *  @n
448  *      Transmit complete frame interrupt service routine
449  *
450  *  @param[in]  args parameter list to interrupt service routine
451  *  @retval     none
452  */
453 void ICSS_EmacTxInterruptHandler(void *args);
457 /**
458 * @brief Link change status interrupt for Port 0 and Port 1
459 *          calls a user callback if defined to provide link info to stack
461 * @param arg
463 * @retval none
464 */
465 void ICSS_EmacLinkISR(void* arg);
467 /**
468  *  @b Description
469  *  @n
470  *      Retrieves a frame from a host queue and copies it
471  *           in the allocated stack buffer
472  *
473  *  @param[in]  rxArg defined at @ref ICSS_EmacRxArgument
474  *  @param[in]  userArg custom Rx packet callback packet options only required for custom RxPacket implementations,
475                 default to NULL when calling ICSS_EmacRxPktGet which is default Tx Packet API
476  *  @retval     Length of the frame received in number of bytes or -1 on Failure
477  */
478 int32_t ICSS_EmacRxPktGet(ICSS_EmacRxArgument *rxArg, void* userArg);
481 /**
482  *  @b Description
483  *  @n
484  *      Finds the maximum fill level of the queue in terms of 32 byte blocks.
485         For example, if there was only one 64 byte packet received when this
486         API is called then it would return value of 2.
487         It also returns number of times queue has overflown.
488  *
489  *  @param[in]  icssEmacHandle handle to ICSS_EMAC Instance.
490  *  @param[in]  portNumber    Port on which queue resides. Valid values are:
491                               0 == PORT0, 1 == PORT1, 2 == PORT2
492  *  @param[in]  queuePriority   Priority of the queue or queue number whose fill level has to be found
493  *  @param[in]  queueType   Rx/Tx Queue
494  *  @param[out]  queueOverflowCount    Number of times queue has overflown
496  *  @retval     The maximum fill level of the queue in terms of 32 byte blocks or
497  *              <0 if there was an error in the input parameters
498  */
499 int32_t ICSS_EmacGetMaxQueueFillLevel(ICSS_EmacHandle icssEmacHandle,int32_t portNumber, int32_t queuePriority,uint8_t queueType, int32_t* queueOverflowCount);
501 /**
502  *  @b Description
503  *  @n
504  *      API to register the hardware interrupt receive packet callback function
505  *
506  *  @param[in]  hwIntRx    hardware interrupt receive packet callback function
507  *  @retval     none
508  */
509 void ICSS_EmacRegisterHwIntRx (ICSS_EmacHandle icssEmacHandle, ICSS_EmacCallBack hwIntRx);
511 /**
512  *  @b Description
513  *  @n
514  *       API to retrieve the information about the received frame which
515  *       is then used to dequeue the frame from the host queues
516  *
517  *  @param[in]  icssEmacHandle handle to ICSS_EMAC Instance.
518  *  @param[out]  portNumber    Return pointer of port number where frame was received
519  *  @param[out]  queueNumber   Return pointer of host queue where the received frame is queued
520  *  @param[ou]   pktProc       Return pointer of packet type
521  *  @retval     none
522  */
523 int32_t ICSS_EmacRxPktInfo(ICSS_EmacHandle icssEmacHandle,
524                            int32_t* portNumber,
525                            int32_t* queueNumber,
526                            int32_t* pktProc);
527 /**
528  *  @b Description
529  *  @n
530  *      API to queue a frame which has to be transmitted on the
531  *      specified port queue
532  *
533  *  @param[in]  txArg defined at @ref ICSS_EmacTxArgument
534  *  @param[in]  userArg custom Tx packet callback packet options only required for custom TxPacket implementations,
535                 default to NULL when calling ICSS_EmacTxPacket which is default Tx Packet API
536  *  @retval     0 on scuess,  <0 on failure
537  */
538 int32_t ICSS_EmacTxPacket(ICSS_EmacTxArgument *txArg, void* userArg);
543 /* Local Functions */
544 /** @brief  API to copy a packet from DDR to Tx Queue memory on L3 and synchronize with
545  *  firmware
546  *  @internal
547  *  @param[in]  icssEmacHandle handle to ICSS_EMAC Instance.
548  *  @param[in]  srcAddress    Base address of the buffer where the frame to be transmitted resides
549  *  @param[in]  portNumber   Port on which frame has to be transmitted.
550  *                            Valid values are:
551                               1 == PORT1, 2 == PORT2
552  *  @param[in]  queuePriority    Queue number in which frame will be
553  *                               queued for transmission
554  *  @param[in] lengthOfPacket   length of the frame in bytes
555  *  @retval     0 on scuess,  <0 on failure
556  */
557 int32_t ICSS_EmacTxPacketEnqueue (ICSS_EmacHandle icssEmacHandle,
558                                   const uint8_t* srcAddress,
559                                   uint8_t portNumber,
560                                   uint8_t queuePriority,
561                                   uint16_t lengthOfPacket);
562 /**
563  *  @brief  Task to enable copying of Rx data from queues to DDR. This is a function that calls
564  *  another function to empty the queues
565  *  @internal
566  *  @param[in]  a0 Generic argument
567  *  @param[in]  a1    Generic argument
568  *  @retval     none
569  */
570 void ICSS_EMacOsRxTaskFnc(uint32_t a0, uint32_t a1);
573 /**
574  *  @brief  Task to enable receiving Indication of transmit packet complete by PRU-ICSS firmware. 
575  *  @internal
576  *  @param[in]  a0 Generic argument
577  *  @param[in]  a1    Generic argument
578  *  @retval     none
579  */
580 void ICSS_EMacOsTxTaskFnc(uint32_t a0, uint32_t a1);
583 /**
584  *  @brief Function to initialize all Port Queue params
585  *  @internal
586  *  @retval 0 on success
587  */
588 int32_t ICSS_EmacPortInit(ICSS_EmacHandle icssEmacHandle);
590 /**
591  *  @brief Function to initialize Host Port Queue params
592  *  @internal
593  *  @param icssEmacHandle pointer to ICSS EMAC handle
594  *  @retval 0 on success
595  */
596 void ICSS_EmacHostInit(ICSS_EmacHandle icssEmacHandle);
598 /**
599  *  @brief Function to initialize MAC Port Queue params
600  *  @internal
601  *  @param portNum Port number
602  *  @retval 0 on success
603  */
604 void ICSS_EmacMACInit(ICSS_EmacHandle icssEmacHandle, uint8_t portNum);
605 /**
606  *  @brief Function to add Ether Type to approved list of protocols
607  *  @internal
608  *  @param icssEmacHandle pointer to ICSS EMAC handle
609  *  @param protocolType 16 bit value indicating protocol type. IEEE format
610  *  @retval 0 on success
611  */
612 void addProtocolToList(uint16_t protocolType);
613 /**
614  *  @brief Function to delete Rx semaphore and Task
615  *  @internal
616  *  @param icssEmacHandle pointer to ICSS EMAC handle
617  *  @retval 0 on success
618  */
619 int8_t ICSS_EmacOSDeInit(ICSS_EmacHandle icssEmacHandle);
620 /**
622  *  @brief Function to initialize Rx semaphore and Task
623  *  @internal
624  *  @param icssEmacHandle pointer to ICSS EMAC handle
625  *  @retval 0 on success
626  */
627 int8_t ICSS_EmacOSInit(ICSS_EmacHandle icssEmacHandle);
629 /**
630 * @brief Callback function to process protocol specific handler for link status ISR
631 * @param icssEmacHandle pointer to ICSS EMAC handle
632 * @param callBack       Callback function pointer
633 * @param userArg        user specific parameter
635 * @retval none
636 */
637 void ICSS_EmacRegisterPort0ISRCallback(ICSS_EmacHandle icssEmacHandle, ICSS_EmacCallBack callBack, void *userArg);
638 /**
639 * @brief Callback function to process protocol specific handler for link status ISR
641 * @param icssEmacHandle pointer to ICSS EMAC handle
642 * @param callBack       Callback function pointer
643 * @param userArg        user specific parameter
645 * @retval none
646 */
647 void ICSS_EmacRegisterPort1ISRCallback(ICSS_EmacHandle icssEmacHandle, ICSS_EmacCallBack callBack, void *userArg);
650 /**
651 * @brief Function to status of Phy Link
653 * @param mdioBaseAddr       mdio subsystem base address
654 * @param phyAddr            physical address
655 * @param retries            retry count
657 * @retval 1 if phy link up, 0 phy link down
658 */
659 uint32_t ICSS_EmacPhyLinkStatusGet(uint32_t mdioBaseAddr,
660                                      uint32_t phyAddr,
661                                      volatile uint32_t retries);
664 /**
665  *  @b Description
666  *  @n
667  *      API to register the hardware interrupt for Transmit packet complete by PRU-ICSS firmware
668  *
669  *  @param[in]  hwIntRx    hardware interrupt transmit packet complete callback function
670  *  @retval     none
671  */
672 void ICSS_EmacRegisterHwIntTx( ICSS_EmacHandle icssEmacHandle, ICSS_EmacCallBack hwIntTx);
675 /**
676  *  @b Description
677  *  @n
678  *      API Function to re-initialize all Port Queue params
679  * 
680  *  @param[in]  icssEmacHandle handle to ICSS_EMAC Instance
681  *  @param[in]  portNumber number of the port to flush
682  *  @retval None
683  */
684 void ICSS_EmacPortFlush(ICSS_EmacHandle icssEmacHandle, int32_t portNumber);
685 #ifdef __cplusplus
687 #endif
689 #endif /* _ICSS_EMACDRV_H_ */