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

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

ビルドが通るよう更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
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 * 上記著作権者は,以下の(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#ifdef TARGET_KERNEL_ASP
70
71#define CAST(type, val) ((type)(val))
72
73#include <kernel.h>
74#include <sil.h>
75#include <t_syslog.h>
76#include "kernel_cfg.h"
77#include "kernel/kernel_impl.h"
78
79#endif /* of #ifdef TARGET_KERNEL_ASP */
80
81#ifdef TARGET_KERNEL_JSP
82
83#include <s_services.h>
84#include <t_services.h>
85#include "kernel_id.h"
86
87#endif /* of #ifdef TARGET_KERNEL_JSP */
88
89#include <tinet_defs.h>
90#include <tinet_config.h>
91
92#include <net/if.h>
93#include <net/ethernet.h>
94#include <net/if_arp.h>
95#include <net/net.h>
96#include <net/net_timer.h>
97#include <net/net_count.h>
98#include <net/net_buf.h>
99
100#include "if_rx62nreg.h"
101#include <string.h>
102#include "ether_phy.h"
103
104#ifdef _MSC_VER
105#include <stdlib.h>
106#endif
107
108#ifndef TMO_IF_RX62N_GET_NET_BUF
109#define TMO_IF_RX62N_GET_NET_BUF ULONG_C(1000000) /* [us] */
110#endif
111
112void mbed_mac_address(char *mac);
113
114/*
115 * ネットワークインタフェースに依存するソフトウェア情報
116 */
117
118typedef struct t_rx62n_softc {
119 PHY_STATE_T state;
120 T_RX62N_TX_DESC *tx_write;
121 T_RX62N_RX_DESC *rx_read;
122 bool_t link_pre;
123 bool_t link_now;
124 bool_t over_flow;
125} T_RX62N_SOFTC;
126
127/*
128 * ネットワークインタフェースのソフトウェア情報
129 */
130
131/* ネットワークインタフェースに依存するソフトウェア情報 */
132
133static T_RX62N_SOFTC rx62n_softc;
134
135typedef struct t_rx62n_buf {
136 uint8_t rx_buff[NUM_IF_RX62N_RXBUF][32 * (((int)&((T_NET_BUF *)0)->buf + IF_RX62N_BUF_PAGE_SIZE + 31) / 32)];
137 uint8_t tx_buff[NUM_IF_RX62N_TXBUF][32 * ((IF_RX62N_BUF_PAGE_SIZE + 31) / 32)];
138 T_RX62N_RX_DESC rx_desc[NUM_IF_RX62N_RXBUF];
139 T_RX62N_TX_DESC tx_desc[NUM_IF_RX62N_TXBUF];
140} T_RX62N_BUF;
141
142#if defined(__RX)
143#pragma section ETH_MEMORY
144#define __attribute__(x)
145#endif
146T_RX62N_BUF __attribute__((section("ETH_MEMORY"),aligned(16))) rx62n_buf;
147#if defined(__RX)
148#pragma section
149#endif
150
151/* ネットワークインタフェースに依存しないソフトウェア情報 */
152
153T_IF_SOFTC if_softc = {
154 {0,}, /* ネットワークインタフェースのアドレス */
155 0, /* 送信タイムアウト */
156 &rx62n_softc, /* ディバイス依存のソフトウェア情報 */
157 SEM_IF_RX62N_SBUF_READY, /* 送信セマフォ */
158 SEM_IF_RX62N_RBUF_READY, /* 受信セマフォ */
159
160#ifdef SUPPORT_INET6
161
162 IF_MADDR_INIT, /* マルチキャストアドレスリスト */
163
164#endif /* of #ifdef SUPPORT_INET6 */
165};
166
167/*
168 * 局所変数
169 */
170
171static void rx62n_stop (T_RX62N_SOFTC *sc);
172static void rx62n_init_sub (T_IF_SOFTC *ic);
173static void rx62n_set_ecmr (T_IF_SOFTC *ic, PHY_MODE_T mode);
174
175#ifdef SUPPORT_INET6
176
177static uint32_t ds_crc (uint8_t *addr);
178static void ds_getmcaf (T_IF_SOFTC *ic, uint32_t *mcaf);
179
180/*
181 * ds_crc -- イーサネットアドレスの CRC を計算する。
182 */
183
184#define POLYNOMIAL 0x04c11db6
185
186static uint32_t
187ds_crc (uint8_t *addr)
188{
189 uint32_t crc = ULONG_C(0xffffffff);
190 int_t carry, len, bit;
191 uint8_t byte;
192
193 for (len = ETHER_ADDR_LEN; len -- > 0; ) {
194 byte = *addr ++;
195 for (bit = 8; bit -- > 0; ) {
196 carry = ((crc & ULONG_C(0x80000000)) ? 1 : 0) ^ (byte & UINT_C(0x01));
197 crc <<= 1;
198 byte >>= 1;
199 if (carry)
200 crc = (crc ^ POLYNOMIAL) | carry;
201 }
202 }
203 return crc;
204}
205
206#undef POLYNOMIAL
207
208/*
209 * ds_getmcaf -- マルチキャストアドレスのリストからマルチキャストアドレス
210 * フィルタを計算する。
211 */
212
213static void
214ds_getmcaf (T_IF_SOFTC *ic, uint32_t *mcaf)
215{
216 uint32_t count, index;
217 uint8_t *af = (uint8_t*)mcaf;
218
219 mcaf[0] = mcaf[1] = 0;
220
221 for (count = MAX_IF_MADDR_CNT; count -- > 0; ) {
222 index = ds_crc(ic->maddrs[count].lladdr) >> 26;
223 af[index >> 3] |= 1 << (index & 7);
224 }
225}
226
227/*
228 * rx62n_setrcr -- 受信構成レジスタ (RCR) を設定する。
229 */
230
231static void
232rx62n_setrcr (T_IF_SOFTC *ic)
233{
234 T_RX62N_SOFTC *sc = ic->sc;
235}
236
237/*
238 * rx62n_addmulti -- マルチキャストアドレスを追加する。
239 */
240
241ER
242rx62n_addmulti (T_IF_SOFTC *ic)
243{
244 rx62n_setrcr(ic);
245 return E_OK;
246}
247
248#endif /* of #ifdef SUPPORT_INET6 */
249
250/*
251 * rx62n_stop -- ネットワークインタフェースを停止する。
252 *
253 * 注意: NIC 割り込み禁止状態で呼び出すこと。
254 */
255
256static void
257rx62n_stop (T_RX62N_SOFTC *sc)
258{
259 /* 動作モードクリア */
260 sil_wrw_mem(ETHERC_ECMR, 0x00000000);
261 /* リンク変化割り込み無効 */
262 sil_wrw_mem(ETHERC_ECSIPR, 0x00000000);
263}
264
265/*
266 * rx62n_init_sub -- ネットワークインタフェースの初期化
267 *
268 * 注意: NIC 割り込み禁止状態で呼び出すこと。
269 */
270
271static void
272rx62n_init_sub (T_IF_SOFTC *ic)
273{
274 T_RX62N_SOFTC *sc = ic->sc;
275 uint8_t *mac_addr = ic->ifaddr.lladdr;
276 PHY_STATE_T state = PHY_STATE_UNINIT;
277
278 /* MAC部ソフトウエア・リセット */
279 sil_wrw_mem(EDMAC_EDMR, sil_rew_mem(EDMAC_EDMR) | EDMAC_EDMR_SWR_BIT);
280
281 dly_tsk(1000);
282
283 sil_wrw_mem(ETHERC_MAHR, ((uint32_t)mac_addr[0] << 24)
284 | ((uint32_t)mac_addr[1] << 16) | ((uint32_t)mac_addr[2] << 8 )
285 | (uint32_t)mac_addr[3]);
286 sil_wrw_mem(ETHERC_MALR, ((uint32_t)mac_addr[4] << 8 )
287 | (uint32_t)mac_addr[5]);
288
289 /* PHYリセット */
290 while ((state = phy_reset(state, 0)) != PHY_STATE_RESET);
291 sc->state = state;
292
293 /* Clear all ETHERC status BFR, PSRTO, LCHNG, MPD, ICD */
294 sil_wrw_mem(ETHERC_ECSR, 0x00000037);
295
296 /* リンク変化割り込み有効 */
297 sil_wrw_mem(ETHERC_ECSIPR, sil_rew_mem(ETHERC_ECSIPR) | ETHERC_ECSIPR_LCHNGIP);
298
299 /* Clear all ETHERC and EDMAC status bits */
300 sil_wrw_mem(EDMAC_EESR, 0x47FF0F9F);
301
302 /* 送受信割り込み有効 */
303 sil_wrw_mem(EDMAC_EESIPR, (EDMAC_EESIPR_TCIP | EDMAC_EESIPR_FRIP | EDMAC_EESIPR_RDEIP | EDMAC_EESIPR_FROFIP));
304
305 /* 受信フレーム長上限(バッファサイズ) */
306 sil_wrw_mem(ETHERC_RFLR, IF_RX62N_BUF_PAGE_SIZE);
307
308 /* 96ビット時間(初期値) */
309 sil_wrw_mem(ETHERC_IPGR, 0x00000014);
310
311 /* Set little endian mode */
312 sil_wrw_mem(EDMAC_EDMR, sil_rew_mem(EDMAC_EDMR) | EDMAC_EDMR_DE_BIT);
313
314 /* Initialize Rx descriptor list address */
315 sil_wrw_mem(EDMAC_RDLAR, (uint32_t)rx62n_buf.rx_desc);
316 /* Initialize Tx descriptor list address */
317 sil_wrw_mem(EDMAC_TDLAR, (uint32_t)rx62n_buf.tx_desc);
318 /* Copy-back status is RFE & TFE only */
319 sil_wrw_mem(EDMAC_TRSCER, 0x00000000);
320 /* Threshold of Tx_FIFO */
321 sil_wrw_mem(EDMAC_TFTR, 0x00000000);
322 /* Transmit fifo & receive fifo is 2048 bytes */
323 sil_wrw_mem(EDMAC_FDR, 0x00000707);
324 /* RR in EDRRR is under driver control */
325 sil_wrw_mem(EDMAC_RMCR, 0x00000001);
326
327 sc->link_pre = false;
328 sc->link_now = false;
329
330#if defined(TARGET_KERNEL_ASP)
331
332 /* ターゲット依存部の割込み初期化 */
333 rx62n_inter_init();
334
335#endif /* of #if defined(TARGET_KERNEL_ASP) */
336
337#if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u /* JSP-1.4.2 以降 */
338
339 /* ターゲット依存部の割込み初期化 */
340 rx62n_inter_init();
341
342#endif /* of #if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u */
343}
344
345
346/*
347 * rx62n_set_ecmr -- ECMRレジスタの設定
348 */
349
350static void
351rx62n_set_ecmr (T_IF_SOFTC *ic, PHY_MODE_T mode)
352{
353 uint32_t ecmr;
354
355 ecmr = ETHERC_ECMR_RE | ETHERC_ECMR_TE/* | ETHERC_ECMR_PRM*/;
356
357 if ((mode & 0x01) != 0)
358 ecmr |= ETHERC_ECMR_DM;
359 if ((mode & 0x02) != 0)
360 ecmr |= ETHERC_ECMR_RTM;
361
362 /* 動作モード設定 */
363 sil_wrw_mem(ETHERC_ECMR, ecmr);
364}
365
366/*
367 * rx62n_reset -- ネットワークインタフェースをリセットする。
368 */
369
370void
371rx62n_reset (T_IF_SOFTC *ic)
372{
373#ifdef TARGET_KERNEL_JSP
374 IPM ipm;
375#endif
376
377 /* NIC からの割り込みを禁止する。*/
378#ifdef TARGET_KERNEL_JSP
379 ipm = rx62n_dis_inter();
380#endif
381#ifdef TARGET_KERNEL_ASP
382 syscall(dis_int(INTNO_IF_RX62N_TRX));
383#endif
384 ether_set_link_down();
385
386 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_RESETS], 1);
387 rx62n_stop(ic->sc);
388 rx62n_init_sub(ic);
389
390 if (sil_rew_mem(EDMAC_EDRRR) == 0) {
391 sil_wrw_mem(EDMAC_EDRRR, EDMAC_EDRRR_RR);
392 }
393
394 /* 送受信を有効 */
395 rx62n_set_ecmr(ic, 1);
396
397 /* NIC からの割り込みを許可する。*/
398#ifdef TARGET_KERNEL_JSP
399 rx62n_ena_inter(ipm);
400#endif
401#ifdef TARGET_KERNEL_ASP
402 syscall(ena_int(INTNO_IF_RX62N_TRX));
403#endif
404}
405
406/*
407 * get_rx62n_softc -- ネットワークインタフェースのソフトウェア情報を返す。
408 */
409
410T_IF_SOFTC *
411rx62n_get_softc (void)
412{
413 return &if_softc;
414}
415
416/*
417 * rx62n_watchdog -- ネットワークインタフェースのワッチドッグタイムアウト
418 */
419
420void
421rx62n_watchdog (T_IF_SOFTC *ic)
422{
423 rx62n_reset(ic);
424}
425
426/*
427 * rx62n_probe -- ネットワークインタフェースの検出
428 */
429
430void
431rx62n_probe (T_IF_SOFTC *ic)
432{
433 int i;
434#if defined(TARGET_KERNEL_ASP)
435
436 /* ターゲット依存部のバスの初期化 */
437 rx62n_bus_init();
438
439#endif /* of #if defined(TARGET_KERNEL_ASP) */
440#if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u /* JSP-1.4.2 以降 */
441
442 /* ターゲット依存部のバスの初期化 */
443 rx62n_bus_init();
444
445#endif /* of #if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u */
446
447 mbed_mac_address(ic->ifaddr.lladdr);
448}
449
450/*
451 * rx62n_init -- ネットワークインタフェースの初期化
452 */
453
454void
455rx62n_init (T_IF_SOFTC *ic)
456{
457#ifdef TARGET_KERNEL_JSP
458 IPM ipm;
459#endif
460 T_RX62N_SOFTC *sc = ic->sc;
461 T_RX62N_TX_DESC *tdsc;
462 T_RX62N_RX_DESC *rdsc;
463 int i;
464
465 /* NIC からの割り込みを禁止する。*/
466#ifdef TARGET_KERNEL_JSP
467 ipm = rx62n_dis_inter();
468#endif
469#ifdef TARGET_KERNEL_ASP
470 syscall(dis_int(INTNO_IF_RX62N_TRX));
471#endif
472
473 tdsc = (T_RX62N_TX_DESC *)rx62n_buf.tx_desc;
474 sc->tx_write = tdsc;
475 for ( i=0 ; i < NUM_IF_RX62N_TXBUF ; i++ ) {
476 memset(tdsc, 0, sizeof(*tdsc));
477 tdsc->tbl = 0;
478 tdsc->tba = (uint32_t)&rx62n_buf.tx_buff[i];
479 tdsc++;
480 }
481 tdsc--;
482 tdsc->tdle = 1;
483
484 rdsc = (T_RX62N_RX_DESC *)rx62n_buf.rx_desc;
485 sc->rx_read = rdsc;
486 for ( i=0 ; i < NUM_IF_RX62N_RXBUF ; i++ ) {
487 memset(rdsc, 0, sizeof(*rdsc));
488 rdsc->rbl = IF_RX62N_BUF_PAGE_SIZE;
489 rdsc->rba = (uint32_t)&rx62n_buf.rx_buff[i] + (uint32_t)&((T_NET_BUF *)0)->buf;
490 rdsc->rfl = 0;
491 rdsc->ract = 1;
492 rdsc++;
493 }
494 rdsc--;
495 rdsc->rdle = 1;
496
497 /* rx62n_init 本体を呼び出す。*/
498 rx62n_init_sub(ic);
499
500 if (sil_rew_mem(EDMAC_EDRRR) == 0) {
501 sil_wrw_mem(EDMAC_EDRRR, EDMAC_EDRRR_RR);
502 }
503
504 /* 送受信を有効 */
505 rx62n_set_ecmr(ic, 1);
506
507 /* NIC からの割り込みを許可する。*/
508#ifdef TARGET_KERNEL_JSP
509 rx62n_ena_inter(ipm);
510#endif
511#ifdef TARGET_KERNEL_ASP
512 syscall(ena_int(INTNO_IF_RX62N_TRX));
513#endif
514
515 syscall(sta_cyc(CYC_IF_RX62N_LINK));
516}
517
518
519/*
520 * rx62n_link -- リンク状態の変化に対する処理
521 */
522bool_t
523rx62n_link(T_IF_SOFTC *ic)
524{
525 T_RX62N_SOFTC *sc = ic->sc;
526 PHY_MODE_T mode;
527 uint8_t phy_addr = 0;
528
529 if(sc->state == PHY_STATE_NEGOTIATED){
530 if(!phy_is_link(phy_addr))
531 sc->state = PHY_STATE_RESET;
532 return true;
533 }
534
535 /* PHYの初期化 */
536 sc->state = phy_initialize(sc->state, phy_addr, &mode);
537 if(sc->state != PHY_STATE_NEGOTIATED){
538 return false;
539 }
540
541 /* ECMRレジスタの設定 */
542 rx62n_set_ecmr(ic, mode);
543 return true;
544}
545
546/*
547 * rx62n_read -- フレームの読み込み
548 */
549
550T_NET_BUF *
551rx62n_read (T_IF_SOFTC *ic)
552{
553 T_RX62N_SOFTC *sc = ic->sc;
554 T_RX62N_RX_DESC *desc;
555 uint16_t len;
556 T_NET_BUF *input = NULL;
557 uint16_t align;
558 uint8_t *dst;
559 ER error;
560 PHY_MODE_T mode;
561
562 sc->link_now = rx62n_link(ic);
563 if (sc->link_pre != sc->link_now) {
564 sc->link_pre = sc->link_now;
565 /* リンク状態に変化あり */
566 if (sc->link_now) {
567 ether_set_link_up();
568 }
569 else {
570 ether_set_link_down();
571 }
572 }
573
574 if (sc->over_flow) {
575 sc->over_flow = false;
576 }
577
578 desc = sc->rx_read;
579
580 if (desc->ract != 0) {
581 return NULL;
582 }
583
584 len = desc->rfl;
585 /*
586 * +-----------+--------+---------+---------+
587 * | Ehter HDR | IP HDR | TCP HDR | TCP SDU |
588 * +-----------+--------+---------+---------+
589 * 14 20 20 n
590 * <----------------- len ---------------->
591 * ^
592 * t_net_buf で 4 オクテット境界にアラインされている。
593 *
594 * tcp_input と udp_input では、擬似ヘッダと SDU でチェックサムを
595 * 計算するが、n が 4 オクテット境界になるように SDU の後ろに 0 を
596 * パッディングする。その分を考慮して net_buf を獲得しなければならない。
597 */
598 align = ((((len - sizeof(T_IF_HDR)) + 3) >> 2) << 2) + sizeof(T_IF_HDR);
599
600 if ((error = tget_net_buf(&input, align, TMO_IF_RX62N_GET_NET_BUF)) == E_OK && input != NULL) {
601 dst = input->buf + IF_ETHER_NIC_HDR_ALIGN;
602 memcpy(dst, (void *)desc->rba, len);
603 }
604 else {
605 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_IN_ERR_PACKETS], 1);
606 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_NO_BUFS], 1);
607 }
608
609 desc->rfp = 0;
610 desc->ract = 1;
611
612 desc++;
613 if (desc == &rx62n_buf.rx_desc[NUM_IF_RX62N_RXBUF]) {
614 desc = rx62n_buf.rx_desc;
615 }
616 sc->rx_read = desc;
617
618 if (sil_rew_mem(EDMAC_EDRRR) == 0) {
619 sil_wrw_mem(EDMAC_EDRRR, EDMAC_EDRRR_RR);
620 }
621
622 return input;
623}
624
625/*
626 * rx62n_start -- 送信フレームをバッファリングする。
627 */
628
629void
630rx62n_start (T_IF_SOFTC *ic, T_NET_BUF *output)
631{
632 T_RX62N_SOFTC *sc = ic->sc;
633 T_RX62N_TX_DESC *desc, *next;
634 uint8_t *buf = NULL;
635 int32_t len, res, pos;
636 uint32_t tfp;
637
638 for ( res = output->len, pos = 0; res > 0; res -= len, pos += len ) {
639 desc = sc->tx_write;
640
641 while (desc->tact != 0) {
642 tslp_tsk(1000);
643 }
644
645 buf = (uint8_t *)desc->tba + IF_ETHER_NIC_HDR_ALIGN;
646
647 next = desc + 1;
648 if (next == &rx62n_buf.tx_desc[NUM_IF_RX62N_TXBUF]) {
649 next = rx62n_buf.tx_desc;
650 }
651 sc->tx_write = next;
652
653 len = res;
654 if ( len > IF_RX62N_BUF_PAGE_SIZE ) {
655 len = IF_RX62N_BUF_PAGE_SIZE;
656 tfp = 0x0;
657 }
658 else
659 tfp = 0x1;
660
661 if (pos == 0)
662 tfp |= 0x2;
663
664 memcpy(buf, (uint8_t *)output->buf + pos, len);
665
666 desc->tbl = len;
667 desc->tfp = tfp;
668 desc->tact = 1;
669 }
670
671 if (sil_rew_mem(EDMAC_EDTRR) == 0) {
672 sil_wrw_mem(EDMAC_EDTRR, EDMAC_EDTRR_TR);
673 }
674}
675
676/*
677 * RX62N Ethernet Controler 送受信割り込みハンドラ
678 */
679
680void
681if_rx62n_trx_handler (void)
682{
683 T_IF_SOFTC *ic;
684 T_RX62N_SOFTC *sc;
685 uint32_t ecsr, eesr;
686
687 ic = &if_softc;
688 sc = ic->sc;
689
690 ecsr = sil_rew_mem(ETHERC_ECSR);
691
692 if (ecsr & ETHERC_ECSR_LCHNG) {
693 /* ETHERC部割り込み要因クリア */
694 sil_wrw_mem(ETHERC_ECSR, ETHERC_ECSR_LCHNG);
695
696 /* 受信割り込み処理 */
697 isig_sem(ic->semid_rxb_ready);
698 }
699
700 eesr = sil_rew_mem(EDMAC_EESR);
701
702 if (eesr & EDMAC_EESR_FR) {
703 /* DMA部割り込み要因クリア */
704 sil_wrw_mem(EDMAC_EESR, EDMAC_EESR_FR);
705
706 /* 受信割り込み処理 */
707 isig_sem(ic->semid_rxb_ready);
708 }
709 if (eesr & EDMAC_EESR_TC) {
710 /* DMA部割り込み要因クリア */
711 sil_wrw_mem(EDMAC_EESR, EDMAC_EESR_TC);
712
713 /* 送信割り込み処理 */
714 isig_sem(ic->semid_txb_ready);
715 }
716 if (eesr & (EDMAC_EESR_FROF | EDMAC_EESR_RDE)) {
717 /* DMA部割り込み要因クリア */
718 sil_wrw_mem(EDMAC_EESR, EDMAC_EESR_FROF | EDMAC_EESR_RDE);
719
720 sc->over_flow = true;
721
722 /* 受信割り込み処理 */
723 isig_sem(ic->semid_rxb_ready);
724 }
725}
726
727void if_rx62n_cyclic_handler(void)
728{
729 T_IF_SOFTC *ic;
730 T_RX62N_SOFTC *sc;
731
732 ic = &if_softc;
733 sc = ic->sc;
734
735 /* 受信割り込み処理 */
736 isig_sem(ic->semid_rxb_ready);
737}
Note: See TracBrowser for help on using the repository browser.