source: rubycfg_asp/trunk/asp_dcre/tinet/netdev/if_rx62n/if_rx62n.c@ 315

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

SVNプロパティを設定

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