source: asp3_gr_sakura/trunk/tinet/netdev/if_rx62n/if_rx62n.c@ 318

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

プロパティの文字コードにUTF-8を追加、キーワードを削除

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