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

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

ソースを追加

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