1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: hioeth.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
17 #ifndef NN_NETWORK_HIOETH_H
18 #define NN_NETWORK_HIOETH_H
19
20 #include <nnet.h>
21 #include <nnet/nnet_ext.h>
22
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26
27 /*---------------------------------------------------------------------------*
28 * Definitions
29 *---------------------------------------------------------------------------*/
30 #define HIOETH_DEVICE_1 0 /* Only 1 interface can be used with this driver */
31
32 #define HIOETH_VENDOR_NINTENDO 0x0000
33 #define HIOETH_COMMON_CONF_VERSION 0x1100
34 #define HIOETH_INS_CONF_VERSION 0x2100
35
36 /* Please see man pages for details
37
38 */
39 #define HIOETH_ERROR_BASE 0xffff9000
40 #define HIOETH_ERROR_CODE(code) ((s32)(HIOETH_ERROR_BASE | (code)))
41 enum
42 {
43 HIOETH_ERR_PARAM = HIOETH_ERROR_CODE(1), /* Parameter error */
44 HIOETH_ERR_INIT = HIOETH_ERROR_CODE(2), /* Cannot run because it is in initialized state */
45 HIOETH_ERR_FINISH = HIOETH_ERROR_CODE(3), /* Cannot run because it is in terminated state */
46 HIOETH_ERR_CONFVER = HIOETH_ERROR_CODE(4), /* Setting version error */
47 HIOETH_ERR_STATE = HIOETH_ERROR_CODE(5), /* State error */
48 HIOETH_ERR_EXIST = HIOETH_ERROR_CODE(6), /* Already created */
49 HIOETH_ERR_NOMEM = HIOETH_ERROR_CODE(7), /* Insufficient memory */
50 HIOETH_ERR_TIMEOUT = HIOETH_ERROR_CODE(8), /* timeout */
51 HIOETH_ERR_IO = HIOETH_ERROR_CODE(8),
52 HIOETH_ERR_NONE = 0 /* Normal end */
53 };
54
55 /* Please see man pages for details
56
57 */
58 #define HIOETH_MEM_BASE 0x00050000
59 #define HIOETH_MEM_NAME(name) ((s32)(HIOETH_MEM_BASE | (name)))
60 enum
61 {
62 HIOETH_MEM_INSTANCE = HIOETH_MEM_NAME(1)
63 };
64
65 /* Please see man pages for details
66
67 */
68 enum
69 {
70 HIOETH_STATE_INIT = 0, /* Initial state */
71 HIOETH_STATE_ACTIVE, /* Connection completed state */
72 HIOETH_STATE_DESTROY,
73 HIOETH_STATE_ABORT /* Connection completed state */
74 };
75
76 /*---------------------------------------------------------------------------*
77 * Types/Declarations
78 *---------------------------------------------------------------------------*/
79
80 /* Please see man pages for details
81
82 */
83 #define HIOETH_UPPER_NUM 2 /* Number of upper layers */
84 #define HIOETH_MQ_NUM 16 /* Size of queue to pass to upper layers */
85 #define HIOETH_MAX_SEND_LEN 1600
86 #define HIOETH_MAX_RECV_LEN 1600
87 #define HIOETH_STACK_SIZE 4096
88
89 typedef struct HIOETHQueuePair
90 {
91 NOSMessageQueue mq; /* Receive queue for upper layers */
92 NOSMessage msg[HIOETH_MQ_NUM]; /* Receive queue instance for upper layers */
93 } HIOETHQueuePair;
94
95 typedef struct HIOETHInstance
96 {
97 NNETInstance netIns; /* Instance information common to all layers */
98 NNETProtocolList protocolList;
99
100 HIOETHQueuePair upper_mq[HIOETH_UPPER_NUM]; /* Receive queue for upper layers */
101 s32 upper_ins_count;
102
103 s32 state;
104 s32 handleHostToTarget;
105 s32 handleTargetToHost;
106
107 u8 macaddr[NNET_ETH_ALEN]; /* Local MAC address */
108 u16 pad;
109
110 u8 sendBuf[HIOETH_MAX_SEND_LEN]; /* Send buffer */
111 u8 recvBuf[HIOETH_MAX_RECV_LEN];
112 u32 recvBufPos;
113 NOSThread thread;
114 NOSThreadId threadId;
115 u8 stack[HIOETH_STACK_SIZE];
116
117 } HIOETHInstance;
118
119 /*
120 Get NNETInstance from WCM instance
121 */
HIOETH_GetNNETInstance(HIOETHInstance * pHioIns)122 static inline NNETInstance* HIOETH_GetNNETInstance(HIOETHInstance* pHioIns)
123 {
124 return &pHioIns->netIns;
125 }
126
127 /*
128 Get WCM instance from NNETInstance
129 */
HIOETH_GetHIOETHInstance(NNETInstance * pNetIns)130 static inline HIOETHInstance* HIOETH_GetHIOETHInstance(NNETInstance* pNetIns)
131 {
132 return (HIOETHInstance*)pNetIns;
133 }
134
135 /*---------------------------------------------------------------------------*
136 * Function Prototypes
137 *---------------------------------------------------------------------------*/
138 /* HIOETH_main.c */
139 extern s32 HIOETH_Init(const NNETAllocator* allocator);
140 extern s32 HIOETH_Finish(void);
141 extern s32 HIOETH_StartupIns(NNETInstance* ins, s32 timeout);
142 extern s32 HIOETH_CleanupIns(NNETInstance* ins, s32 timeout);
143 extern s32 HIOETH_AbortIns(NNETInstance* ins);
144 extern s32 HIOETH_CreateIns(HIOETHInstance** peth_ins);
145 extern s32 HIOETH_DestroyIns(HIOETHInstance* peth_ins);
146 extern s32 HIOETH_GetStateIns(HIOETHInstance* peth_ins);
147 extern s32 HIOETH_GetUpperAPI(NNETEthernetAPI* wcm_api, HIOETHInstance* peth_ins);
148 extern s32 HIOETH_SetUpper(NNETInstance * ins, NNETInstance * upper_ins, u32* receive_id, u16 entry[]);
149 extern s32 HIOETH_ClearUpper(NNETInstance* ins, NNETInstance* upper_ins);
150 extern s32 HIOETH_GetMacAddr(NNETInstance* ins, u8* macaddr);
151 extern s32 HIOETH_SetMulticastAddr(NNETInstance* ins, u8* macaddr);
152 extern s32 HIOETH_ClearMulticastAddr(NNETInstance* ins, u8* macaddr);
153 extern s32 HIOETH_Send(NNETInstance* ins, u8* dstMAC, NOSMessageBuf* mbuf);
154 extern s32 HIOETH_Receive(NNETInstance* ins, u32 receive_id, NOSMessageBuf** mbuf);
155 extern s32 HIOETH_CancelReceive(NNETInstance* ins, u32 receive_id);
156
157
158 #ifdef __cplusplus
159 }
160 #endif
161
162 /* NN_NETWORK_HIOETH_H */
163 #endif
164