source: asp3_tinet_ecnl_rx/trunk/bnep_bridge/src/if_rx62n.c@ 337

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

ASP3版ECNLを追加

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