16
#include <drivers/common/memory.h>
19
#include <kernel/irq.h>
21
#include <net/inetdevice.h>
22
#include <net/l0/net_entry.h>
23
#include <net/l2/ethernet.h>
24
#include <net/netdevice.h>
25
#include <net/skbuff.h>
26
#include <net/util/show_packet.h>
31
#include <embox/unit.h>
33
#include <framework/mod/options.h>
35
#define FEC_MMFR_ST (1 << 30)
36
#define FEC_MMFR_OP_READ (2 << 28)
37
#define FEC_MMFR_OP_WRITE (1 << 28)
38
#define FEC_MMFR_PA(v) ((v & 0x1f) << 23)
39
#define FEC_MMFR_RA(v) ((v & 0x1f) << 18)
40
#define FEC_MMFR_TA (2 << 16)
41
#define FEC_MMFR_DATA(v) (v & 0xffff)
43
static struct fec_priv fec_priv;
45
static void fec_reg_dump(const char * title) {
46
log_debug("%s", title);
48
log_debug("ENET_EIR %10x %10x", ENET_EIR, REG32_LOAD(ENET_EIR ));
49
log_debug("ENET_EIMR %10x %10x", ENET_EIMR, REG32_LOAD(ENET_EIMR));
50
log_debug("ENET_RDAR %10x %10x", ENET_RDAR, REG32_LOAD(ENET_RDAR));
51
log_debug("ENET_TDAR %10x %10x", ENET_TDAR, REG32_LOAD(ENET_TDAR));
52
log_debug("ENET_ECR %10x %10x", ENET_ECR, REG32_LOAD(ENET_ECR ));
53
log_debug("ENET_MMFR %10x %10x", ENET_MMFR, REG32_LOAD(ENET_MMFR));
54
log_debug("ENET_MSCR %10x %10x", ENET_MSCR, REG32_LOAD(ENET_MSCR));
55
log_debug("ENET_MIBC %10x %10x", ENET_MIBC, REG32_LOAD(ENET_MIBC));
56
log_debug("ENET_RCR %10x %10x", ENET_RCR, REG32_LOAD(ENET_RCR ));
57
log_debug("ENET_TCR %10x %10x", ENET_TCR, REG32_LOAD(ENET_TCR ));
58
log_debug("ENET_MAC_LOW %10x %10x", ENET_MAC_LOW, REG32_LOAD(ENET_MAC_LOW ));
59
log_debug("ENET_MAC_HI %10x %10x", ENET_MAC_HI, REG32_LOAD(ENET_MAC_HI ));
60
log_debug("ENET_OPD %10x %10x", ENET_OPD, REG32_LOAD(ENET_OPD));
61
log_debug("ENET_IAUR %10x %10x", ENET_IAUR, REG32_LOAD(ENET_IAUR));
62
log_debug("ENET_IALR %10x %10x", ENET_IALR, REG32_LOAD(ENET_IALR));
63
log_debug("ENET_GAUR %10x %10x", ENET_GAUR, REG32_LOAD(ENET_GAUR));
64
log_debug("ENET_GALR %10x %10x", ENET_GALR, REG32_LOAD(ENET_GALR));
65
log_debug("ENET_TFWR %10x %10x", ENET_TFWR, REG32_LOAD(ENET_TFWR));
66
log_debug("ENET_WTF1 %10x %10x", ENET_WTF1, REG32_LOAD(ENET_WTF1));
67
log_debug("ENET_WTF2 %10x %10x", ENET_WTF2, REG32_LOAD(ENET_WTF2));
68
log_debug("ENET_RDSR %10x %10x", ENET_RDSR, REG32_LOAD(ENET_RDSR));
69
log_debug("ENET_TDSR %10x %10x", ENET_TDSR, REG32_LOAD(ENET_TDSR));
70
log_debug("ENET_MRBR %10x %10x", ENET_MRBR, REG32_LOAD(ENET_MRBR));
73
static void emac_set_macaddr(unsigned char _macaddr[6]) {
74
uint32_t mac_hi, mac_lo;
75
const uint8_t *tmp = _macaddr;
77
REG32_STORE(ENET_IAUR, 0);
78
REG32_STORE(ENET_IALR, 0);
79
REG32_STORE(ENET_GAUR, 0);
80
REG32_STORE(ENET_GALR, 0);
82
log_debug("addr = %x:%x:%x:%x:%x:%x", tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],tmp[5]);
84
mac_hi = (_macaddr[5] << 16) |
86
mac_lo = (_macaddr[3] << 0) |
91
REG32_STORE(ENET_MAC_LOW, mac_lo);
92
REG32_STORE(ENET_MAC_HI, mac_hi | 0x8808);
95
static struct fec_buf_desc _tx_desc_ring[TX_BUF_FRAMES] __attribute__ ((aligned(0x10)));
96
static struct fec_buf_desc _rx_desc_ring[RX_BUF_FRAMES] __attribute__ ((aligned(0x10)));
98
static uint8_t _tx_buf[TX_BUF_FRAMES][2048] __attribute__ ((aligned(0x10)));
99
static uint8_t _rx_buf[RX_BUF_FRAMES][2048] __attribute__ ((aligned(0x10)));
101
static void fec_tbd_init(struct fec_priv *fec)
103
unsigned size = TX_BUF_FRAMES * sizeof(struct fec_buf_desc);
105
memset(fec->tbd_base, 0, size);
107
fec->tbd_base[TX_BUF_FRAMES - 1].flags = FLAG_W;
109
dcache_flush(fec->tbd_base, size);
112
REG32_STORE(ENET_TDSR, ((uint32_t) fec->tbd_base));
115
static void fec_rbd_init(struct fec_priv *fec, int count, int dsize) {
123
size = count * sizeof(struct fec_buf_desc);
124
for (i = 0; i < count; i++) {
125
fec->rbd_base[i].data_pointer = (uint32_t)&_rx_buf[i][0];
126
fec->rbd_base[i].len = 0;
127
fec->rbd_base[i].flags = FLAG_R;
131
fec->rbd_base[count - 1].flags = FLAG_W | FLAG_R;
135
dcache_flush((void *)fec->rbd_base, size);
137
REG32_STORE(ENET_RDSR, (uint32_t)fec->rbd_base);
140
static int fec_xmit(struct net_device *dev, struct sk_buff *skb) {
142
struct fec_buf_desc *desc;
145
struct fec_priv *priv;
153
data = (uint8_t*) skb_data_cast_in(skb->data);
156
log_error("No skb data!\n");
161
show_packet(data, skb->len, "tx");
164
dcache_inval(priv, sizeof(struct fec_priv));
165
assert((uint32_t)priv->tbd_base == REG32_LOAD(ENET_TDSR));
169
cur_tx_desc = priv->tbd_index;
170
log_debug("Transmitting packet %2d", cur_tx_desc);
172
memcpy(&_tx_buf[cur_tx_desc][0], data, skb->len);
173
dcache_flush(&_tx_buf[cur_tx_desc][0], skb->len);
176
desc = &priv->tbd_base[cur_tx_desc];
177
dcache_inval(desc, sizeof(struct fec_buf_desc));
178
if (desc->flags & FLAG_R) {
179
log_error("tx desc still busy");
183
desc->data_pointer = (uint32_t)&_tx_buf[cur_tx_desc][0];
185
desc->len = skb->len;
186
desc->flags |= FLAG_L | FLAG_TC | FLAG_R;
187
dcache_flush(desc, sizeof(struct fec_buf_desc));
189
REG32_LOAD(desc + sizeof(*desc) - 4);
191
REG32_STORE(ENET_TDAR, 1 << 24);
196
dcache_inval((void*) ENET_TDAR, 4);
197
if (!(REG32_LOAD(ENET_TDAR))) {
203
log_error("TX timeout ENET_TDAR is not zero...");
208
dcache_inval(desc, sizeof(struct fec_buf_desc));
209
if (!(desc->flags & FLAG_R)) {
214
log_error("TX timeout bit READY still set...");
217
priv->tbd_index = (priv->tbd_index + 1) % TX_BUF_FRAMES;
218
dcache_flush(priv, sizeof(struct fec_priv));
228
static void fec_mdio_init(struct net_device *dev) {
230
phy_autoneg(dev, FEC_SPEED);
233
static void _reset(struct net_device *dev) {
236
fec_reg_dump("ENET dump uboot...");
238
REG32_STORE(ENET_ECR, ENET_RESET);
239
while(REG32_LOAD(ENET_ECR) & ENET_RESET){
240
if (cnt ++ > 100000) {
241
log_error("enet can't be reset");
247
REG32_STORE(ENET_MSCR, 0x1a);
259
REG32_STORE(ENET_EIMR, ENET_EIR_RXB | ENET_EIR_RXF);
261
REG32_STORE(ENET_EIR, 0xffc00000);
264
REG32_STORE(ENET_TCR, (1 << 2));
275
REG32_STORE(ENET_MRBR, 0x5f0);
277
fec_rbd_init(dev->priv, RX_BUF_FRAMES, 0x600);
279
fec_tbd_init(dev->priv);
282
REG32_STORE(ENET_TFWR, 0x100);
285
REG32_STORE(ENET_ECR, REG32_LOAD(ENET_ECR) | ENET_ETHEREN);
287
REG32_STORE(ENET_RDAR, (1 << 24));
288
fec_reg_dump("ENET dump embox...\n");
291
static int fec_open(struct net_device *dev) {
299
static int fec_set_macaddr(struct net_device *dev, const void *addr) {
303
emac_set_macaddr((unsigned char *)addr);
308
static int imx6_receive(struct net_device *dev_id, struct fec_priv *priv) {
309
struct fec_buf_desc *desc;
313
desc = &_rx_desc_ring[priv->rbd_index];
314
dcache_inval(desc, sizeof(struct fec_buf_desc));
315
if (desc->flags & FLAG_E) {
318
for (int i = 0; i < RX_BUF_FRAMES; i++) {
319
desc = &_rx_desc_ring[i];
320
dcache_inval(desc, sizeof(struct fec_buf_desc));
321
if (!(desc->flags & FLAG_E)) {
322
log_debug("found frame %d, should be %d", i, priv->rbd_index);
330
while(!(desc->flags & FLAG_E)) {
331
log_debug("Receiving packet %d", priv->rbd_index);
333
priv->rbd_index = (priv->rbd_index + 1) % RX_BUF_FRAMES;
334
dcache_flush(priv, sizeof(struct fec_priv));
336
skb = skb_alloc(desc->len);
338
log_error("can't allocate skb");
341
dcache_inval((void *)desc->data_pointer, desc->len);
342
memcpy(skb_data_cast_in(skb->data),
343
(void*)desc->data_pointer, desc->len);
344
skb->len = desc->len;
347
show_packet(skb_data_cast_in(skb->data), skb->len, "rx");
351
desc->flags |= FLAG_R;
352
dcache_flush(desc, sizeof(struct fec_buf_desc));
354
REG32_STORE(ENET_RDAR, (1 << 24));
356
desc = &_rx_desc_ring[priv->rbd_index];
357
dcache_inval(desc, sizeof(struct fec_buf_desc));
363
static irq_return_t imx6_irq_handler(unsigned int irq_num, void *dev_id) {
365
struct fec_priv *priv;
369
priv = ((struct net_device *)dev_id)->priv;
370
dcache_inval(priv, sizeof(struct fec_priv));
371
state = REG32_LOAD(ENET_EIR);
373
log_debug("Interrupt mask %#010x", state);
375
if (state & ENET_EIR_EBERR) {
376
log_error("Ethernet bus error, resetting ENET!");
383
if (state & (ENET_EIR_RXB | ENET_EIR_RXF)) {
384
imx6_receive(dev_id, priv);
387
REG32_STORE(ENET_EIR, state);
393
#define FEC_IEVENT_MII 0x00800000
394
#define FEC_MII_DATA_ST 0x40000000
395
#define FEC_MII_DATA_OP_RD 0x20000000
396
#define FEC_MII_DATA_OP_WR 0x10000000
397
#define FEC_MII_DATA_PA_MSK 0x0f800000
398
#define FEC_MII_DATA_RA_MSK 0x007c0000
399
#define FEC_MII_DATA_TA 0x00020000
400
#define FEC_MII_DATA_DATAMSK 0x0000ffff
402
#define FEC_MII_DATA_RA_SHIFT 18
403
#define FEC_MII_DATA_PA_SHIFT 23
405
#define FEC_MII_DATA_RA_SHIFT 18
406
#define FEC_MII_DATA_PA_SHIFT 23
407
static int fec_mdio_read(struct net_device *dev, uint8_t regAddr) {
408
struct fec_priv *fec = dev->priv;
416
REG32_STORE(ENET_EIR, FEC_IEVENT_MII);
417
reg = regAddr << FEC_MII_DATA_RA_SHIFT;
418
phy = fec->phy_id << FEC_MII_DATA_PA_SHIFT;
420
REG32_STORE(ENET_MMFR, FEC_MII_DATA_ST | FEC_MII_DATA_OP_RD |
421
FEC_MII_DATA_TA | phy | reg);
424
while (!(REG32_LOAD(ENET_EIR) & FEC_IEVENT_MII)) {
425
if (retry++ > 0xffff) {
426
log_error("MDIO write failed");
432
REG32_STORE(ENET_EIR, FEC_IEVENT_MII);
435
val = REG32_LOAD(ENET_MMFR) & 0xFFFF;
436
log_debug("reg:%02x val:%#x", regAddr, val);
440
static int fec_mdio_write(struct net_device *dev, uint8_t regAddr, uint16_t data) {
441
struct fec_priv *fec = dev->priv;
446
reg = regAddr << FEC_MII_DATA_RA_SHIFT;
447
phy = fec->phy_id << FEC_MII_DATA_PA_SHIFT;
449
REG32_STORE(ENET_MMFR, FEC_MII_DATA_ST | FEC_MII_DATA_OP_WR |
450
FEC_MII_DATA_TA | phy | reg | data);
453
while (!(REG32_LOAD(ENET_EIR) & FEC_IEVENT_MII)) {
454
if (retry++ > 0xffff) {
455
log_error("MDIO write failed");
461
REG32_STORE(ENET_EIR, FEC_IEVENT_MII);
462
log_debug("reg:%02x val:%#x", regAddr, data);
467
static void fec_set_phyid(struct net_device *dev, uint8_t phyid) {
468
struct fec_priv *fec = dev->priv;
472
static int fec_set_speed(struct net_device *dev, int speed) {
473
speed = net_to_mbps(speed);
475
if (speed != FEC_SPEED && FEC_SPEED != 0) {
476
log_error("Can't set %dmbps as driver is configured "
477
"to force %dmbps", speed, FEC_SPEED);
483
REG32_STORE(ENET_RCR, 0x5ee0000 | ENET_RCR_RGMII_EN);
484
REG32_STORE(ENET_ECR, 0xF0000100 | ENET_SPEED);
487
REG32_STORE(ENET_RCR, 0x5ee0000 | ENET_RCR_RGMII_EN);
488
REG32_STORE(ENET_ECR, 0xF0000100);
491
REG32_STORE(ENET_RCR, 0x5ee0000 | ENET_RCR_RMII_10T |
493
REG32_STORE(ENET_ECR, 0xF0000100);
500
static const struct net_driver fec_drv_ops = {
503
.set_macaddr = fec_set_macaddr,
504
.mdio_read = fec_mdio_read,
505
.mdio_write = fec_mdio_write,
506
.set_phyid = fec_set_phyid,
507
.set_speed = fec_set_speed
510
EMBOX_UNIT_INIT(fec_init);
511
static int fec_init(void) {
512
struct net_device *nic;
515
if (NULL == (nic = etherdev_alloc(0))) {
519
nic->drv_ops = &fec_drv_ops;
521
fec_priv.base_addr = NIC_BASE;
522
fec_priv.rbd_base = _rx_desc_ring;
523
fec_priv.tbd_base = _tx_desc_ring;
524
nic->priv = &fec_priv;
526
tmp = irq_attach(ENET_IRQ, imx6_irq_handler, 0, nic, "FEC");
530
return inetdev_register_dev(nic);
533
PERIPH_MEMORY_DEFINE(fec, NIC_BASE, 0x200);