source: azure_iot_hub/trunk/asp3_dcre/tinet/netdev/if_rx62n/if_rx62n.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 18.6 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-2017 by Cores Co., Ltd. Japan
7 *
8 * 上記著作権者
9は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20 * 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * の無保証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26 * と.
27 * (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
31 * (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34 * 報告すること.
35 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36 * 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42 * å…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50 * の責任を負わない.
51 *
52 * @(#) $Id: if_rx62n.c 388 2019-05-22 11:25:18Z coas-nagasima $
53 */
54
55/*
56 * Copyright (c) 1995, David Greenman
57 * All rights reserved.
58 *
59 * Redistribution and use in source and binary forms, with or without
60 * modification, are permitted provided that the following conditions
61 * are met:
62 * 1. Redistributions of source code must retain the above copyright
63 * notice unmodified, this list of conditions, and the following
64 * disclaimer.
65 * 2. Redistributions in binary form must reproduce the above copyright
66 * notice, this list of conditions and the following disclaimer in the
67 * documentation and/or other materials provided with the distribution.
68 *
69 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
70 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
71 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
72 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
73 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
74 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
75 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
76 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
77 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
78 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
79 * SUCH DAMAGE.
80 *
81 * $FreeBSD: src/sys/i386/isa/if_ed.c,v 1.148.2.4 1999/09/25 13:08:18 nyan Exp $
82 */
83
84#ifdef TARGET_KERNEL_ASP
85
86#define CAST(type, val) ((type)(val))
87
88#include <kernel.h>
89#include <sil.h>
90#include <t_syslog.h>
91#include "kernel_cfg.h"
92#include "kernel/kernel_impl.h"
93
94#endif /* of #ifdef TARGET_KERNEL_ASP */
95
96#ifdef TARGET_KERNEL_JSP
97
98#include <s_services.h>
99#include <t_services.h>
100#include "kernel_id.h"
101
102#endif /* of #ifdef TARGET_KERNEL_JSP */
103
104#include <tinet_defs.h>
105#include <tinet_config.h>
106
107#include <net/if.h>
108#include <net/ethernet.h>
109#include <net/if_arp.h>
110#include <net/net.h>
111#include <net/net_timer.h>
112#include <net/net_count.h>
113#include <net/net_buf.h>
114
115#include "if_rx62nreg.h"
116#include <string.h>
117#include "ether_phy.h"
118
119#ifdef _MSC_VER
120#include <stdlib.h>
121#endif
122
123#ifndef TMO_IF_RX62N_GET_NET_BUF
124#define TMO_IF_RX62N_GET_NET_BUF ULONG_C(1000000) /* [us] */
125#endif
126
127void mbed_mac_address(char *mac);
128
129/*
130 * ネットワークインタフェースに依存するソフトウェア情
131å ±
132 */
133
134typedef struct t_rx62n_softc {
135 PHY_STATE_T state;
136 T_RX62N_TX_DESC *tx_write;
137 T_RX62N_RX_DESC *rx_read;
138 bool_t link_pre;
139 bool_t link_now;
140 bool_t over_flow;
141} T_RX62N_SOFTC;
142
143/*
144 * ネットワークインタフェースのソフトウェア情
145å ±
146 */
147
148/* ネットワークインタフェースに依存するソフトウェア情
149å ± */
150
151static T_RX62N_SOFTC rx62n_softc;
152
153typedef struct t_rx62n_buf {
154 uint8_t rx_buff[NUM_IF_RX62N_RXBUF][32 * (((int)&((T_NET_BUF *)0)->buf + IF_RX62N_BUF_PAGE_SIZE + 31) / 32)];
155 uint8_t tx_buff[NUM_IF_RX62N_TXBUF][32 * ((IF_RX62N_BUF_PAGE_SIZE + 31) / 32)];
156 T_RX62N_RX_DESC rx_desc[NUM_IF_RX62N_RXBUF];
157 T_RX62N_TX_DESC tx_desc[NUM_IF_RX62N_TXBUF];
158} T_RX62N_BUF;
159
160#if defined(__RX)
161#pragma section ETH_MEMORY
162#define __attribute__(x)
163#endif
164T_RX62N_BUF __attribute__((section("ETH_MEMORY"),aligned(16))) rx62n_buf;
165#if defined(__RX)
166#pragma section
167#endif
168
169/* ネットワークインタフェースに依存しないソフトウェア情
170å ± */
171
172T_IF_SOFTC if_softc = {
173 {0,}, /* ネットワークインタフェースのアドレス */
174 0, /* 送信タイムアウト */
175 &rx62n_softc, /* ディバイス依存のソフトウェア情
176å ± */
177 SEM_IF_RX62N_SBUF_READY, /* 送信セマフォ */
178 SEM_IF_RX62N_RBUF_READY, /* 受信セマフォ */
179
180#ifdef SUPPORT_INET6
181
182 IF_MADDR_INIT, /* マルチキャストアドレスリスト */
183
184#endif /* of #ifdef SUPPORT_INET6 */
185};
186
187/*
188 * 局所変数
189 */
190
191static void rx62n_stop (T_RX62N_SOFTC *sc);
192static void rx62n_init_sub (T_IF_SOFTC *ic);
193static void rx62n_set_ecmr (T_IF_SOFTC *ic, PHY_MODE_T mode);
194
195#ifdef SUPPORT_INET6
196
197static uint32_t ds_crc (uint8_t *addr);
198static void ds_getmcaf (T_IF_SOFTC *ic, uint32_t *mcaf);
199
200/*
201 * ds_crc -- イーサネットアドレスの CRC を計算する。
202 */
203
204#define POLYNOMIAL 0x04c11db6
205
206static uint32_t
207ds_crc (uint8_t *addr)
208{
209 uint32_t crc = ULONG_C(0xffffffff);
210 int_t carry, len, bit;
211 uint8_t byte;
212
213 for (len = ETHER_ADDR_LEN; len -- > 0; ) {
214 byte = *addr ++;
215 for (bit = 8; bit -- > 0; ) {
216 carry = ((crc & ULONG_C(0x80000000)) ? 1 : 0) ^ (byte & UINT_C(0x01));
217 crc <<= 1;
218 byte >>= 1;
219 if (carry)
220 crc = (crc ^ POLYNOMIAL) | carry;
221 }
222 }
223 return crc;
224}
225
226#undef POLYNOMIAL
227
228/*
229 * ds_getmcaf -- マルチキャストアドレスのリストからマルチキャストアドレス
230 * フィルタを計算する。
231 */
232
233static void
234ds_getmcaf (T_IF_SOFTC *ic, uint32_t *mcaf)
235{
236 uint32_t count, index;
237 uint8_t *af = (uint8_t*)mcaf;
238
239 mcaf[0] = mcaf[1] = 0;
240
241 for (count = MAX_IF_MADDR_CNT; count -- > 0; ) {
242 index = ds_crc(ic->maddrs[count].lladdr) >> 26;
243 af[index >> 3] |= 1 << (index & 7);
244 }
245}
246
247/*
248 * rx62n_setrcr -- 受信構成レジスタ (RCR) を設定する。
249 */
250
251static void
252rx62n_setrcr (T_IF_SOFTC *ic)
253{
254 T_RX62N_SOFTC *sc = ic->sc;
255}
256
257/*
258 * rx62n_addmulti -- マルチキャストアドレスを追加する。
259 */
260
261ER
262rx62n_addmulti (T_IF_SOFTC *ic)
263{
264 rx62n_setrcr(ic);
265 return E_OK;
266}
267
268#endif /* of #ifdef SUPPORT_INET6 */
269
270/*
271 * rx62n_stop -- ネットワークインタフェースを停止する。
272 *
273 * 注意: NIC 割り込み禁止状æ…
274‹ã§å‘¼ã³å‡ºã™ã“と。
275 */
276
277static void
278rx62n_stop (T_RX62N_SOFTC *sc)
279{
280 /* 動作モードクリア */
281 sil_wrw_mem(ETHERC_ECMR, 0x00000000);
282 /* リンク変化割り込み無効 */
283 sil_wrw_mem(ETHERC_ECSIPR, 0x00000000);
284}
285
286/*
287 * rx62n_init_sub -- ネットワークインタフェースの初期化
288 *
289 * 注意: NIC 割り込み禁止状æ…
290‹ã§å‘¼ã³å‡ºã™ã“と。
291 */
292
293static void
294rx62n_init_sub (T_IF_SOFTC *ic)
295{
296 T_RX62N_SOFTC *sc = ic->sc;
297 uint8_t *mac_addr = ic->ifaddr.lladdr;
298 PHY_STATE_T state = PHY_STATE_UNINIT;
299
300 /* MAC部ソフトウエア・リセット */
301 sil_wrw_mem(EDMAC_EDMR, sil_rew_mem(EDMAC_EDMR) | EDMAC_EDMR_SWR_BIT);
302
303 dly_tsk(1000);
304
305 sil_wrw_mem(ETHERC_MAHR, ((uint32_t)mac_addr[0] << 24)
306 | ((uint32_t)mac_addr[1] << 16) | ((uint32_t)mac_addr[2] << 8 )
307 | (uint32_t)mac_addr[3]);
308 sil_wrw_mem(ETHERC_MALR, ((uint32_t)mac_addr[4] << 8 )
309 | (uint32_t)mac_addr[5]);
310
311 /* PHYリセット */
312 while ((state = phy_reset(state, 0)) != PHY_STATE_RESET);
313 sc->state = state;
314
315 /* Clear all ETHERC status BFR, PSRTO, LCHNG, MPD, ICD */
316 sil_wrw_mem(ETHERC_ECSR, 0x00000037);
317
318 /* リンク変化割り込み有効 */
319 sil_wrw_mem(ETHERC_ECSIPR, sil_rew_mem(ETHERC_ECSIPR) | ETHERC_ECSIPR_LCHNGIP);
320
321 /* Clear all ETHERC and EDMAC status bits */
322 sil_wrw_mem(EDMAC_EESR, 0x47FF0F9F);
323
324 /* 送受信割り込み有効 */
325 sil_wrw_mem(EDMAC_EESIPR, (EDMAC_EESIPR_TCIP | EDMAC_EESIPR_FRIP | EDMAC_EESIPR_RDEIP | EDMAC_EESIPR_FROFIP));
326
327 /* 受信フレーム長上限(バッファサイズ) */
328 sil_wrw_mem(ETHERC_RFLR, IF_RX62N_BUF_PAGE_SIZE);
329
330 /* 96ビット時間(初期値) */
331 sil_wrw_mem(ETHERC_IPGR, 0x00000014);
332
333 /* Set little endian mode */
334 sil_wrw_mem(EDMAC_EDMR, sil_rew_mem(EDMAC_EDMR) | EDMAC_EDMR_DE_BIT);
335
336 /* Initialize Rx descriptor list address */
337 sil_wrw_mem(EDMAC_RDLAR, (uint32_t)rx62n_buf.rx_desc);
338 /* Initialize Tx descriptor list address */
339 sil_wrw_mem(EDMAC_TDLAR, (uint32_t)rx62n_buf.tx_desc);
340 /* Copy-back status is RFE & TFE only */
341 sil_wrw_mem(EDMAC_TRSCER, 0x00000000);
342 /* Threshold of Tx_FIFO */
343 sil_wrw_mem(EDMAC_TFTR, 0x00000000);
344 /* Transmit fifo & receive fifo is 2048 bytes */
345 sil_wrw_mem(EDMAC_FDR, 0x00000707);
346 /* RR in EDRRR is under driver control */
347 sil_wrw_mem(EDMAC_RMCR, 0x00000001);
348
349 sc->link_pre = false;
350 sc->link_now = false;
351
352#if defined(TARGET_KERNEL_ASP)
353
354 /* ターゲット依存部の割込み初期化 */
355 rx62n_inter_init();
356
357#endif /* of #if defined(TARGET_KERNEL_ASP) */
358
359#if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u /* JSP-1.4.2 以降 */
360
361 /* ターゲット依存部の割込み初期化 */
362 rx62n_inter_init();
363
364#endif /* of #if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u */
365}
366
367
368/*
369 * rx62n_set_ecmr -- ECMRレジスタの設定
370 */
371
372static void
373rx62n_set_ecmr (T_IF_SOFTC *ic, PHY_MODE_T mode)
374{
375 uint32_t ecmr;
376
377 ecmr = ETHERC_ECMR_RE | ETHERC_ECMR_TE/* | ETHERC_ECMR_PRM*/;
378
379 if ((mode & 0x01) != 0)
380 ecmr |= ETHERC_ECMR_DM;
381 if ((mode & 0x02) != 0)
382 ecmr |= ETHERC_ECMR_RTM;
383
384 /* 動作モード設定 */
385 sil_wrw_mem(ETHERC_ECMR, ecmr);
386}
387
388/*
389 * rx62n_reset -- ネットワークインタフェースをリセットする。
390 */
391
392void
393rx62n_reset (T_IF_SOFTC *ic)
394{
395#ifdef TARGET_KERNEL_JSP
396 IPM ipm;
397#endif
398
399 /* NIC からの割り込みを禁止する。*/
400#ifdef TARGET_KERNEL_JSP
401 ipm = rx62n_dis_inter();
402#endif
403#ifdef TARGET_KERNEL_ASP
404 syscall(dis_int(INTNO_IF_RX62N_TRX));
405#endif
406 ether_set_link_down();
407
408 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_RESETS], 1);
409 rx62n_stop(ic->sc);
410 rx62n_init_sub(ic);
411
412 if (sil_rew_mem(EDMAC_EDRRR) == 0) {
413 sil_wrw_mem(EDMAC_EDRRR, EDMAC_EDRRR_RR);
414 }
415
416 /* 送受信を有効 */
417 rx62n_set_ecmr(ic, 1);
418
419 /* NIC からの割り込みを許可する。*/
420#ifdef TARGET_KERNEL_JSP
421 rx62n_ena_inter(ipm);
422#endif
423#ifdef TARGET_KERNEL_ASP
424 syscall(ena_int(INTNO_IF_RX62N_TRX));
425#endif
426}
427
428/*
429 * get_rx62n_softc -- ネットワークインタフェースのソフトウェア情
430報を返す。
431 */
432
433T_IF_SOFTC *
434rx62n_get_softc (void)
435{
436 return &if_softc;
437}
438
439/*
440 * rx62n_watchdog -- ネットワークインタフェースのワッチドッグタイムアウト
441 */
442
443void
444rx62n_watchdog (T_IF_SOFTC *ic)
445{
446 rx62n_reset(ic);
447}
448
449/*
450 * rx62n_probe -- ネットワークインタフェースの検出
451 */
452
453void
454rx62n_probe (T_IF_SOFTC *ic)
455{
456 int i;
457#if defined(TARGET_KERNEL_ASP)
458
459 /* ターゲット依存部のバスの初期化 */
460 rx62n_bus_init();
461
462#endif /* of #if defined(TARGET_KERNEL_ASP) */
463#if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u /* JSP-1.4.2 以降 */
464
465 /* ターゲット依存部のバスの初期化 */
466 rx62n_bus_init();
467
468#endif /* of #if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u */
469
470 mbed_mac_address(ic->ifaddr.lladdr);
471}
472
473/*
474 * rx62n_init -- ネットワークインタフェースの初期化
475 */
476
477void
478rx62n_init (T_IF_SOFTC *ic)
479{
480#ifdef TARGET_KERNEL_JSP
481 IPM ipm;
482#endif
483 T_RX62N_SOFTC *sc = ic->sc;
484 T_RX62N_TX_DESC *tdsc;
485 T_RX62N_RX_DESC *rdsc;
486 int i;
487
488 /* NIC からの割り込みを禁止する。*/
489#ifdef TARGET_KERNEL_JSP
490 ipm = rx62n_dis_inter();
491#endif
492#ifdef TARGET_KERNEL_ASP
493 syscall(dis_int(INTNO_IF_RX62N_TRX));
494#endif
495
496 tdsc = (T_RX62N_TX_DESC *)rx62n_buf.tx_desc;
497 sc->tx_write = tdsc;
498 for ( i=0 ; i < NUM_IF_RX62N_TXBUF ; i++ ) {
499 memset(tdsc, 0, sizeof(*tdsc));
500 tdsc->tbl = 0;
501 tdsc->tba = (uint32_t)&rx62n_buf.tx_buff[i];
502 tdsc++;
503 }
504 tdsc--;
505 tdsc->tdle = 1;
506
507 rdsc = (T_RX62N_RX_DESC *)rx62n_buf.rx_desc;
508 sc->rx_read = rdsc;
509 for ( i=0 ; i < NUM_IF_RX62N_RXBUF ; i++ ) {
510 memset(rdsc, 0, sizeof(*rdsc));
511 rdsc->rbl = IF_RX62N_BUF_PAGE_SIZE;
512 rdsc->rba = (uint32_t)&rx62n_buf.rx_buff[i] + (uint32_t)&((T_NET_BUF *)0)->buf;
513 rdsc->rfl = 0;
514 rdsc->ract = 1;
515 rdsc++;
516 }
517 rdsc--;
518 rdsc->rdle = 1;
519
520 /* rx62n_init 本体を呼び出す。*/
521 rx62n_init_sub(ic);
522
523 if (sil_rew_mem(EDMAC_EDRRR) == 0) {
524 sil_wrw_mem(EDMAC_EDRRR, EDMAC_EDRRR_RR);
525 }
526
527 /* 送受信を有効 */
528 rx62n_set_ecmr(ic, 1);
529
530 /* NIC からの割り込みを許可する。*/
531#ifdef TARGET_KERNEL_JSP
532 rx62n_ena_inter(ipm);
533#endif
534#ifdef TARGET_KERNEL_ASP
535 syscall(ena_int(INTNO_IF_RX62N_TRX));
536#endif
537
538 syscall(sta_cyc(CYC_IF_RX62N_LINK));
539}
540
541
542/*
543 * rx62n_link -- リンク状æ…
544‹ã®å¤‰åŒ–に対する処理
545 */
546bool_t
547rx62n_link(T_IF_SOFTC *ic)
548{
549 T_RX62N_SOFTC *sc = ic->sc;
550 PHY_MODE_T mode;
551 uint8_t phy_addr = 0;
552
553 if(sc->state == PHY_STATE_NEGOTIATED){
554 if(!phy_is_link(phy_addr))
555 sc->state = PHY_STATE_RESET;
556 return true;
557 }
558
559 /* PHYの初期化 */
560 sc->state = phy_initialize(sc->state, phy_addr, &mode);
561 if(sc->state != PHY_STATE_NEGOTIATED){
562 return false;
563 }
564
565 /* ECMRレジスタの設定 */
566 rx62n_set_ecmr(ic, mode);
567 return true;
568}
569
570/*
571 * rx62n_read -- フレームの読み込み
572 */
573
574T_NET_BUF *
575rx62n_read (T_IF_SOFTC *ic)
576{
577 T_RX62N_SOFTC *sc = ic->sc;
578 T_RX62N_RX_DESC *desc;
579 uint16_t len;
580 T_NET_BUF *input = NULL;
581 uint16_t align;
582 uint8_t *dst;
583 ER error;
584 PHY_MODE_T mode;
585
586 sc->link_now = rx62n_link(ic);
587 if (sc->link_pre != sc->link_now) {
588 sc->link_pre = sc->link_now;
589 /* リンク状æ…
590‹ã«å¤‰åŒ–あり */
591 if (sc->link_now) {
592 ether_set_link_up();
593 }
594 else {
595 ether_set_link_down();
596 }
597 }
598
599 if (sc->over_flow) {
600 sc->over_flow = false;
601 }
602
603 desc = sc->rx_read;
604
605 if (desc->ract != 0) {
606 return NULL;
607 }
608
609 len = desc->rfl;
610 /*
611 * +-----------+--------+---------+---------+
612 * | Ehter HDR | IP HDR | TCP HDR | TCP SDU |
613 * +-----------+--------+---------+---------+
614 * 14 20 20 n
615 * <----------------- len ---------------->
616 * ^
617 * t_net_buf で 4 オクテット境界にアラインされている。
618 *
619 * tcp_input と udp_input では、擬似ヘッダと SDU でチェックサムを
620 * 計算するが、n が 4 オクテット境界になるように SDU の後ろに 0 を
621 * パッディングする。その分を考æ…
622®ã—て net_buf を獲得しなければならない。
623 */
624 align = ((((len - sizeof(T_IF_HDR)) + 3) >> 2) << 2) + sizeof(T_IF_HDR);
625
626 if ((error = tget_net_buf(&input, align, TMO_IF_RX62N_GET_NET_BUF)) == E_OK && input != NULL) {
627 dst = input->buf + IF_ETHER_NIC_HDR_ALIGN;
628 memcpy(dst, (void *)desc->rba, len);
629 }
630 else {
631 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_IN_ERR_PACKETS], 1);
632 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_NO_BUFS], 1);
633 }
634
635 desc->rfp = 0;
636 desc->ract = 1;
637
638 desc++;
639 if (desc == &rx62n_buf.rx_desc[NUM_IF_RX62N_RXBUF]) {
640 desc = rx62n_buf.rx_desc;
641 }
642 sc->rx_read = desc;
643
644 if (sil_rew_mem(EDMAC_EDRRR) == 0) {
645 sil_wrw_mem(EDMAC_EDRRR, EDMAC_EDRRR_RR);
646 }
647
648 return input;
649}
650
651/*
652 * rx62n_start -- 送信フレームをバッファリングする。
653 */
654
655void
656rx62n_start (T_IF_SOFTC *ic, T_NET_BUF *output)
657{
658 T_RX62N_SOFTC *sc = ic->sc;
659 T_RX62N_TX_DESC *desc, *next;
660 uint8_t *buf = NULL;
661 int32_t len, res, pos;
662 uint32_t tfp;
663
664 for ( res = output->len, pos = 0; res > 0; res -= len, pos += len ) {
665 desc = sc->tx_write;
666
667 while (desc->tact != 0) {
668 tslp_tsk(1000);
669 }
670
671 buf = (uint8_t *)desc->tba + IF_ETHER_NIC_HDR_ALIGN;
672
673 next = desc + 1;
674 if (next == &rx62n_buf.tx_desc[NUM_IF_RX62N_TXBUF]) {
675 next = rx62n_buf.tx_desc;
676 }
677 sc->tx_write = next;
678
679 len = res;
680 if ( len > IF_RX62N_BUF_PAGE_SIZE ) {
681 len = IF_RX62N_BUF_PAGE_SIZE;
682 tfp = 0x0;
683 }
684 else
685 tfp = 0x1;
686
687 if (pos == 0)
688 tfp |= 0x2;
689
690 memcpy(buf, (uint8_t *)output->buf + pos, len);
691
692 desc->tbl = len;
693 desc->tfp = tfp;
694 desc->tact = 1;
695 }
696
697 if (sil_rew_mem(EDMAC_EDTRR) == 0) {
698 sil_wrw_mem(EDMAC_EDTRR, EDMAC_EDTRR_TR);
699 }
700}
701
702/*
703 * RX62N Ethernet Controler 送受信割り込みハンドラ
704 */
705
706void
707if_rx62n_trx_handler (void)
708{
709 T_IF_SOFTC *ic;
710 T_RX62N_SOFTC *sc;
711 uint32_t ecsr, eesr;
712
713 ic = &if_softc;
714 sc = ic->sc;
715
716 ecsr = sil_rew_mem(ETHERC_ECSR);
717
718 if (ecsr & ETHERC_ECSR_LCHNG) {
719 /* ETHERC部割り込み要因クリア */
720 sil_wrw_mem(ETHERC_ECSR, ETHERC_ECSR_LCHNG);
721
722 /* 受信割り込み処理 */
723 isig_sem(ic->semid_rxb_ready);
724 }
725
726 eesr = sil_rew_mem(EDMAC_EESR);
727
728 if (eesr & EDMAC_EESR_FR) {
729 /* DMA部割り込み要因クリア */
730 sil_wrw_mem(EDMAC_EESR, EDMAC_EESR_FR);
731
732 /* 受信割り込み処理 */
733 isig_sem(ic->semid_rxb_ready);
734 }
735 if (eesr & EDMAC_EESR_TC) {
736 /* DMA部割り込み要因クリア */
737 sil_wrw_mem(EDMAC_EESR, EDMAC_EESR_TC);
738
739 /* 送信割り込み処理 */
740 isig_sem(ic->semid_txb_ready);
741 }
742 if (eesr & (EDMAC_EESR_FROF | EDMAC_EESR_RDE)) {
743 /* DMA部割り込み要因クリア */
744 sil_wrw_mem(EDMAC_EESR, EDMAC_EESR_FROF | EDMAC_EESR_RDE);
745
746 sc->over_flow = true;
747
748 /* 受信割り込み処理 */
749 isig_sem(ic->semid_rxb_ready);
750 }
751}
752
753void if_rx62n_cyclic_handler(void)
754{
755 T_IF_SOFTC *ic;
756 T_RX62N_SOFTC *sc;
757
758 ic = &if_softc;
759 sc = ic->sc;
760
761 /* 受信割り込み処理 */
762 isig_sem(ic->semid_rxb_ready);
763}
Note: See TracBrowser for help on using the repository browser.