source: asp3_tinet_ecnl_arm/trunk/bnep_bridge/src/if_mbed.c@ 352

Last change on this file since 352 was 352, checked in by coas-nagasima, 6 years ago

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 12.1 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2009 by Dep. of Computer Science and Engineering
5 * Tomakomai National College of Technology, JAPAN
6 * Copyright (C) 2014 Cores Co., Ltd. Japan
7 *
8 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * の無保証規定を掲載すること.
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * と.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * 報告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29 * 免責すること.
30 *
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35 * の責任を負わない.
36 *
37 * @(#) $Id$
38 */
39
40/*
41 * Copyright (c) 1995, David Greenman
42 * All rights reserved.
43 *
44 * Redistribution and use in source and binary forms, with or without
45 * modification, are permitted provided that the following conditions
46 * are met:
47 * 1. Redistributions of source code must retain the above copyright
48 * notice unmodified, this list of conditions, and the following
49 * disclaimer.
50 * 2. Redistributions in binary form must reproduce the above copyright
51 * notice, this list of conditions and the following disclaimer in the
52 * documentation and/or other materials provided with the distribution.
53 *
54 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
56 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
57 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
58 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
59 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
60 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
62 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
63 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64 * SUCH DAMAGE.
65 *
66 * $FreeBSD: src/sys/i386/isa/if_ed.c,v 1.148.2.4 1999/09/25 13:08:18 nyan Exp $
67 */
68
69#define CAST(type, val) ((type)(val))
70
71#include <kernel.h>
72#include <sil.h>
73#include <t_syslog.h>
74#include "kernel_cfg.h"
75#include "kernel/kernel_impl.h"
76
77#include "mbed_interface.h"
78#include "ethernet_api.h"
79#include "ethernetext_api.h"
80#include <string.h>
81#include "if_mbed.h"
82#include "iodefine.h"
83#include "main.h"
84#include "if_btusb.h"
85
86#ifdef _MSC_VER
87#include <stdlib.h>
88#endif
89
90#ifndef TMO_IF_MBED_GET_NET_BUF
91#define TMO_IF_MBED_GET_NET_BUF ULONG_C(1000000) /* [us] */
92#endif
93
94extern uint8_t mac_addr[ETHER_ADDR_LEN];
95
96/*
97 * ネットワークインタフェースに依存するソフトウェア情報
98 */
99
100typedef struct t_mbed_softc {
101 bool_t link_pre;
102 bool_t link_now;
103 bool_t over_flow;
104} T_MBED_SOFTC;
105
106/*
107 * ネットワークインタフェースのソフトウェア情報
108 */
109
110/* ネットワークインタフェースに依存するソフトウェア情報 */
111
112static T_MBED_SOFTC mbed_softc;
113
114/*
115 * 局所変数
116 */
117
118static void if_mbed_stop(T_MBED_SOFTC *mbed);
119static void if_mbed_init_sub(T_IF_SOFTC *ic);
120
121#ifdef SUPPORT_INET6
122
123static uint32_t ds_crc(uint8_t *addr);
124static void ds_getmcaf(T_IF_SOFTC *ic, uint32_t *mcaf);
125
126/*
127 * ds_crc -- イーサネットアドレスの CRC を計算する。
128 */
129
130#define POLYNOMIAL 0x04c11db6
131
132static uint32_t
133ds_crc(uint8_t *addr)
134{
135 uint32_t crc = ULONG_C(0xffffffff);
136 int_t carry, len, bit;
137 uint8_t byte;
138
139 for (len = ETHER_ADDR_LEN; len-- > 0; ) {
140 byte = *addr++;
141 for (bit = 8; bit-- > 0; ) {
142 carry = ((crc & ULONG_C(0x80000000)) ? 1 : 0) ^ (byte & UINT_C(0x01));
143 crc <<= 1;
144 byte >>= 1;
145 if (carry)
146 crc = (crc ^ POLYNOMIAL) | carry;
147 }
148 }
149 return crc;
150}
151
152#undef POLYNOMIAL
153
154/*
155 * ds_getmcaf -- マルチキャストアドレスのリストからマルチキャストアドレス
156 * フィルタを計算する。
157 */
158
159static void
160ds_getmcaf(T_IF_SOFTC *ic, uint32_t *mcaf)
161{
162 uint32_t count, index;
163 uint8_t *af = (uint8_t*)mcaf;
164
165 mcaf[0] = mcaf[1] = 0;
166
167 for (count = MAX_IF_MADDR_CNT; count-- > 0; ) {
168 index = ds_crc(ic->maddrs[count].lladdr) >> 26;
169 af[index >> 3] |= 1 << (index & 7);
170 }
171}
172
173/*
174 * mbed_setrcr -- 受信構成レジスタ (RCR) を設定する。
175 */
176
177static void
178if_mbed_setrcr(T_IF_SOFTC *ic)
179{
180 T_MBED_SOFTC *mbed = ic->mbed;
181}
182
183/*
184 * mbed_addmulti -- マルチキャストアドレスを追加する。
185 */
186
187ER
188if_mbed_addmulti(T_IF_SOFTC *ic)
189{
190 if_mbed_setrcr(ic);
191 return E_OK;
192}
193
194#endif /* of #ifdef SUPPORT_INET6 */
195
196/*
197 * mbed_stop -- ネットワークインタフェースを停止する。
198 *
199 * 注意: NIC 割り込み禁止状態で呼び出すこと。
200 */
201
202static void
203if_mbed_stop(T_MBED_SOFTC *mbed)
204{
205 ethernetext_start_stop(0);
206}
207
208static void rza1_recv_callback(void)
209{
210 sig_sem(if_softc.semid_rxb_ready);
211}
212
213#define EDMAC_EESIPR_INI_TRANS (0xF4380000)
214#define EDMAC_EESIPR_INI_RECV (0x0205001F) /* 0x02000000 : Detect reception suspended */
215 /* 0x00040000 : Detect frame reception */
216 /* 0x00010000 : Receive FIFO overflow */
217 /* 0x00000010 : Residual bit frame reception */
218 /* 0x00000008 : Long frame reception */
219 /* 0x00000004 : Short frame reception */
220 /* 0x00000002 : PHY-LSI reception error */
221 /* 0x00000001 : Receive frame CRC error */
222#define EDMAC_EESIPR_INI_EtherC (0x00400000) /* 0x00400000 : E-MAC status register */
223
224static void
225if_mbed_init_sub(T_IF_SOFTC *ic)
226{
227 ethernet_cfg_t ethcfg;
228
229 /* Initialize the hardware */
230 ethcfg.int_priority = 6;
231 ethcfg.recv_cb = &rza1_recv_callback;
232 ethcfg.ether_mac = (char *)ic->ifaddr.lladdr;
233 ethernetext_init(&ethcfg);
234}
235
236/*
237 * mbed_reset -- ネットワークインタフェースをリセットする。
238 */
239
240void
241if_mbed_reset(T_IF_SOFTC *ic)
242{
243 ethernetext_start_stop(0);
244
245 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_RESETS], 1);
246 if_mbed_stop(ic->mbed);
247 if_mbed_init_sub(ic);
248
249 ethernetext_start_stop(1);
250}
251
252/*
253 * get_mbed_softc -- ネットワークインタフェースのソフトウェア情報を返す。
254 */
255
256T_IF_SOFTC *
257if_mbed_get_softc(void)
258{
259 return &if_softc;
260}
261
262/*
263 * mbed_watchdog -- ネットワークインタフェースのワッチドッグタイムアウト
264 */
265
266void
267if_mbed_watchdog(T_IF_SOFTC *ic)
268{
269 if_mbed_reset(ic);
270}
271
272/*
273 * mbed_probe -- ネットワークインタフェースの検出
274 */
275
276void
277if_mbed_probe(T_IF_SOFTC *ic)
278{
279#if (MBED_MAC_ADDRESS_SUM != MBED_MAC_ADDR_INTERFACE)
280 netif->hwaddr[0] = MBED_MAC_ADDR_0;
281 netif->hwaddr[1] = MBED_MAC_ADDR_1;
282 netif->hwaddr[2] = MBED_MAC_ADDR_2;
283 netif->hwaddr[3] = MBED_MAC_ADDR_3;
284 netif->hwaddr[4] = MBED_MAC_ADDR_4;
285 netif->hwaddr[5] = MBED_MAC_ADDR_5;
286#else
287 mbed_mac_address((char *)ic->ifaddr.lladdr);
288#endif
289}
290
291/*
292 * mbed_init -- ネットワークインタフェースの初期化
293 */
294
295void
296if_mbed_init(T_IF_SOFTC *ic)
297{
298 T_MBED_SOFTC *mbed = ic->mbed;
299
300 /* mbed_init 本体を呼び出す。*/
301 if_mbed_init_sub(ic);
302
303 act_tsk(IF_MBED_PHY_TASK);
304
305 ethernet_set_link(-1, 0);
306
307 ETHER.EESIPR0 |= EDMAC_EESIPR_INI_TRANS;
308}
309
310void if_mbed_phy_task(intptr_t arg)
311{
312 T_IFNET *ether = ether_get_ifnet();
313 int32_t connect_sts = 0; /* 0: disconnect, 1:connect */
314 int32_t link_sts;
315 int32_t link_mode_new = NEGO_FAIL;
316 int32_t link_mode_old = NEGO_FAIL;
317
318 while (1) {
319 link_sts = ethernet_link();
320 if (link_sts == 1) {
321 link_mode_new = ethernetext_chk_link_mode();
322 if (link_mode_new != link_mode_old) {
323 if (connect_sts == 1) {
324 ether_set_link_down(ether);
325 }
326 if (link_mode_new != NEGO_FAIL) {
327 ethernetext_set_link_mode(link_mode_new | PROMISCUOUS_MODE);
328 ETHER.EESIPR0 |= EDMAC_EESIPR_INI_TRANS;
329 ether_set_link_up(ether);
330 connect_sts = 1;
331 }
332 }
333 }
334 else {
335 if (connect_sts != 0) {
336 ether_set_link_down(ether);
337 link_mode_new = NEGO_FAIL;
338 connect_sts = 0;
339 }
340 }
341 link_mode_old = link_mode_new;
342 dly_tsk(PHY_TASK_WAIT);
343 }
344}
345
346/*
347 * mbed_read -- フレームの読み込み
348 */
349
350T_NET_BUF *
351if_mbed_read(T_IF_SOFTC *ic)
352{
353 T_MBED_SOFTC *mbed = ic->mbed;
354 T_NET_BUF *input = NULL;
355 uint_t align;
356 int len;
357 uint8_t *dst;
358 ER error;
359
360 len = ethernet_receive();
361 if (len <= 0)
362 return NULL;
363
364 align = ((((len - sizeof(T_IF_HDR)) + 3) >> 2) << 2) + sizeof(T_IF_HDR);
365 if ((error = tget_net_buf(&input, align, TMO_IF_MBED_GET_NET_BUF)) == E_OK && input != NULL) {
366 dst = input->buf + IF_ETHER_NIC_HDR_ALIGN;
367 input->len = ethernet_read((char *)dst, len);
368 }
369 else {
370 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_IN_ERR_PACKETS], 1);
371 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_NO_BUFS], 1);
372 }
373
374 sig_sem(ic->semid_rxb_ready);
375
376 return input;
377}
378
379/*
380 * mbed_start -- 送信フレームをバッファリングする。
381 */
382
383void
384if_mbed_start(T_IF_SOFTC *ic, T_NET_BUF *output)
385{
386 T_MBED_SOFTC *mbed = ic->mbed;
387 int32_t len, res, pos;
388
389 for (res = output->len, pos = 0; res > 0; res -= len, pos += len) {
390 len = ethernet_write((char *)output->buf + IF_ETHER_NIC_HDR_ALIGN + pos, res);
391 if (len == 0) {
392 syslog(LOG_WARNING, "ethernet_write => 0");
393 break;
394 }
395 }
396
397 if (ethernet_send() == 0) {
398 syslog(LOG_WARNING, "ethernet_send => 0");
399 }
400}
401
402/*
403 * MBED Ethernet Controler 送受信割り込みハンドラ
404 */
405
406void
407if_mbed_eth_handler(void)
408{
409 uint32_t stat_edmac;
410 uint32_t stat_etherc;
411 ER ret;
412
413 /* Clear the interrupt request flag */
414 stat_edmac = (ETHER.EESR0 & ETHER.EESIPR0); /* Targets are restricted to allowed interrupts */
415 ETHER.EESR0 = stat_edmac;
416 /* Reception-related */
417 if (stat_edmac & EDMAC_EESIPR_INI_RECV) {
418 ret = isig_sem(if_softc.semid_rxb_ready);
419 if (ret != E_OK)
420 syslog(LOG_INFO, "semid_rxb_ready %d %x", ret, stat_edmac & EDMAC_EESIPR_INI_RECV);
421 }
422 if (stat_edmac & EDMAC_EESIPR_INI_TRANS) {
423 ret = isig_sem(if_softc.semid_txb_ready);
424 if (ret != E_OK)
425 syslog(LOG_INFO, "semid_txb_ready %d %x", ret, stat_edmac & EDMAC_EESIPR_INI_TRANS);
426 }
427 /* E-MAC-related */
428 if (stat_edmac & EDMAC_EESIPR_INI_EtherC) {
429 /* Clear the interrupt request flag */
430 stat_etherc = (ETHER.ECSR0 & ETHER.ECSIPR0); /* Targets are restricted to allowed interrupts */
431 ETHER.ECSR0 = stat_etherc;
432 }
433}
Note: See TracBrowser for help on using the repository browser.