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

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

GR-SAKURA向けASP3を追加

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