1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     peth.h
4 
5   Copyright (C)2009-2012 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 46347 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_NETWORK_PETH_H
17 #define NN_NETWORK_PETH_H
18 
19 #include <nnet.h>
20 
21 #ifdef  __cplusplus
22 extern "C" {
23 #endif
24 
25 /*---------------------------------------------------------------------------*
26  * Definitions
27  *---------------------------------------------------------------------------*/
28 #define PETH_DEVICE_1               0           /* Only 1 interface can be used with this driver */
29 
30 #define PETH_VENDOR_NINTENDO        0x0000
31 #define PETH_COMMON_CONF_VERSION    0x1100
32 #define PETH_INS_CONF_VERSION       0x2100
33 
34 /* Please see man pages for details
35 
36  */
37 #define PETH_ERROR_BASE                          0xffff9000
38 #define PETH_ERROR_CODE(code)                    ((s32)(PETH_ERROR_BASE|(code)))
39 enum {
40     PETH_ERR_PARAM        = PETH_ERROR_CODE(1),     /* Parameter error */
41     PETH_ERR_INIT         = PETH_ERROR_CODE(2),     /* Cannot run because it is in initialized state */
42     PETH_ERR_FINISH       = PETH_ERROR_CODE(3),     /* Cannot run because it is in terminated state */
43     PETH_ERR_CONFVER      = PETH_ERROR_CODE(4),     /* Setting version error */
44     PETH_ERR_STATE        = PETH_ERROR_CODE(5),     /* State error */
45     PETH_ERR_EXIST        = PETH_ERROR_CODE(6),     /* Already created */
46     PETH_ERR_NOMEM        = PETH_ERROR_CODE(7),     /* Insufficient memory */
47     PETH_ERR_TIMEOUT      = PETH_ERROR_CODE(8),     /* timeout */
48     PETH_ERR_NONE         = 0                       /* Normal end */
49 };
50 
51 /* Please see man pages for details
52 
53  */
54 #define PETH_MEM_BASE                            0x00050000
55 #define PETH_MEM_NAME(name)                    ((s32)(PETH_MEM_BASE|(name)))
56 enum {
57     PETH_MEM_INSTANCE = PETH_MEM_NAME(1)
58 };
59 
60 /* Please see man pages for details
61 
62  */
63 enum {
64     PETH_STATE_INIT = 0,        /* Initial state */
65     PETH_STATE_ACTIVE,          /* Connection completed state */
66     PETH_STATE_ABORT            /* Connection completed state */
67 };
68 
69 /*---------------------------------------------------------------------------*
70  * Types/Declarations
71  *---------------------------------------------------------------------------*/
72 #define PETH_MAC_LEN            6
73 
74 /* Please see man pages for details
75 
76  */
77 typedef struct PETHProtocolList {
78     u16 protocol;                   /* IP, ARP, etc. */
79     NNETInstance *upper_ins;            /* Upper instance */
80     NOSMessageQueueId mq_receive;   /* Queue to insert packet when above protocol is received */
81 } PETHProtocolList;
82 
83 /* Please see man pages for details
84 
85  */
86 #define PETH_PROTOCOL_NUM   8   /* ARP, RARP, IP, PPPoE Discovery, PPPoE Session */
87 #define PETH_UPPER_NUM      2   /* Number of upper layers   */
88 #define PETH_MQ_NUM         16  /* Size of queue to pass to upper layers */
89 #define PETH_MAX_SEND_LEN   1600
90 typedef struct PETHMessage {
91     NOSMessageQueue mq; /* Receive queue for upper layers */
92     NOSMessage  mqarray[PETH_MQ_NUM];   /* Receive queue instance for upper layers */
93 } PETHMessage;
94 
95 typedef struct PETHInstance {
96     NNETInstance ins;                   /* Instance information common to all layers */
97 
98     PETHProtocolList upper_protocol[PETH_PROTOCOL_NUM]; /* Upper protocol and message queue for sending */
99     s32 upper_protocol_count;
100 
101     PETHMessage upper_mq[PETH_UPPER_NUM];   /* Receive queue for upper layers */
102 
103     s32 upper_ins_count;
104 
105     s32 state;
106 
107     u8 macaddr[PETH_MAC_LEN];   /* Local MAC address */
108     u16 pad;
109     u8 sendBuf[PETH_MAX_SEND_LEN];  /* Send buffer */
110 
111 } PETHInstance;
112 
113 /*
114     Get NNETInstance from WCM instance
115 */
PETH_GetNNETInstance(PETHInstance * peth_ins)116 static inline NNETInstance *PETH_GetNNETInstance(PETHInstance *peth_ins)
117 {
118     return &peth_ins->ins;
119 }
120 
121 /*
122     Get WCM instance from NNETInstance
123 */
PETH_GetPETHInstance(NNETInstance * ins)124 static inline PETHInstance *PETH_GetPETHInstance(NNETInstance *ins)
125 {
126     return (PETHInstance *)ins;
127 }
128 
129 /*---------------------------------------------------------------------------*
130  * Function Prototypes
131  *---------------------------------------------------------------------------*/
132 /* PETH_main.c */
133 extern s32 PETH_Init(const NNETAllocator *allocator);
134 extern s32 PETH_Finish(void);
135 extern s32 PETH_StartupIns(NNETInstance *ins, s32 timeout);
136 extern s32 PETH_CleanupIns(NNETInstance *ins, s32 timeout);
137 extern s32 PETH_AbortIns(NNETInstance *ins);
138 extern s32 PETH_CreateIns(PETHInstance **peth_ins);
139 extern s32 PETH_DestroyIns(PETHInstance *peth_ins);
140 extern s32 PETH_GetStateIns(PETHInstance *peth_ins);
141 extern s32 PETH_GetUpperAPI(NNETEthernetAPI *wcm_api, PETHInstance *peth_ins);
142 extern s32 PETH_SetUpper(NNETInstance *ins, NNETInstance *upper_ins, u32 *receive_id, u16 entry[]);
143 extern s32 PETH_ClearUpper(NNETInstance *ins, NNETInstance *upper_ins);
144 extern s32 PETH_GetMacAddr(NNETInstance *ins, u8 *macaddr);
145 extern s32 PETH_SetMulticastAddr(NNETInstance *ins, u8 *macaddr);
146 extern s32 PETH_ClearMulticastAddr(NNETInstance *ins, u8 *macaddr);
147 extern s32 PETH_Send(NNETInstance *ins, u8 *dstMAC, NOSMessageBuf *mbuf);
148 extern s32 PETH_Receive(NNETInstance *ins, u32 receive_id, NOSMessageBuf **mbuf);
149 extern s32 PETH_CancelReceive(NNETInstance *ins, u32 receive_id);
150 
151 
152 #ifdef  __cplusplus
153 }
154 #endif
155 
156 /* NN_NETWORK_PETH_H */
157 #endif
158