diff options
author | Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> | 2012-04-04 14:37:10 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-05 01:48:04 -0400 |
commit | 73a0d907301ece200d32b4e8ba2da2ca296b507f (patch) | |
tree | 82c1db43655f9606d390d05482d8be03c924d857 /drivers/net/ethernet/renesas | |
parent | 8b1467a31343ade557489aff2bf4c2be44ca2725 (diff) |
net: sh_eth: add support R8A7740
The R8A7740 has a Gigabit Ethernet MAC. This patch supports it.
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Tested-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/renesas')
-rw-r--r-- | drivers/net/ethernet/renesas/Kconfig | 7 | ||||
-rw-r--r-- | drivers/net/ethernet/renesas/sh_eth.c | 114 | ||||
-rw-r--r-- | drivers/net/ethernet/renesas/sh_eth.h | 5 |
3 files changed, 120 insertions, 6 deletions
diff --git a/drivers/net/ethernet/renesas/Kconfig b/drivers/net/ethernet/renesas/Kconfig index 3fb2355af37e..46df3a04030c 100644 --- a/drivers/net/ethernet/renesas/Kconfig +++ b/drivers/net/ethernet/renesas/Kconfig | |||
@@ -4,11 +4,11 @@ | |||
4 | 4 | ||
5 | config SH_ETH | 5 | config SH_ETH |
6 | tristate "Renesas SuperH Ethernet support" | 6 | tristate "Renesas SuperH Ethernet support" |
7 | depends on SUPERH && \ | 7 | depends on (SUPERH || ARCH_SHMOBILE) && \ |
8 | (CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712 || \ | 8 | (CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712 || \ |
9 | CPU_SUBTYPE_SH7763 || CPU_SUBTYPE_SH7619 || \ | 9 | CPU_SUBTYPE_SH7763 || CPU_SUBTYPE_SH7619 || \ |
10 | CPU_SUBTYPE_SH7724 || CPU_SUBTYPE_SH7734 || \ | 10 | CPU_SUBTYPE_SH7724 || CPU_SUBTYPE_SH7734 || \ |
11 | CPU_SUBTYPE_SH7757) | 11 | CPU_SUBTYPE_SH7757 || ARCH_R8A7740) |
12 | select CRC32 | 12 | select CRC32 |
13 | select NET_CORE | 13 | select NET_CORE |
14 | select MII | 14 | select MII |
@@ -17,4 +17,5 @@ config SH_ETH | |||
17 | ---help--- | 17 | ---help--- |
18 | Renesas SuperH Ethernet device driver. | 18 | Renesas SuperH Ethernet device driver. |
19 | This driver supporting CPUs are: | 19 | This driver supporting CPUs are: |
20 | - SH7619, SH7710, SH7712, SH7724, SH7734, SH7763 and SH7757. | 20 | - SH7619, SH7710, SH7712, SH7724, SH7734, SH7763, SH7757, |
21 | and R8A7740. | ||
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index 8bdf070ace90..5999e961defa 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c | |||
@@ -386,6 +386,114 @@ static void sh_eth_reset_hw_crc(struct net_device *ndev) | |||
386 | sh_eth_write(ndev, 0x0, CSMR); | 386 | sh_eth_write(ndev, 0x0, CSMR); |
387 | } | 387 | } |
388 | 388 | ||
389 | #elif defined(CONFIG_ARCH_R8A7740) | ||
390 | #define SH_ETH_HAS_TSU 1 | ||
391 | static void sh_eth_chip_reset(struct net_device *ndev) | ||
392 | { | ||
393 | struct sh_eth_private *mdp = netdev_priv(ndev); | ||
394 | unsigned long mii; | ||
395 | |||
396 | /* reset device */ | ||
397 | sh_eth_tsu_write(mdp, ARSTR_ARSTR, ARSTR); | ||
398 | mdelay(1); | ||
399 | |||
400 | switch (mdp->phy_interface) { | ||
401 | case PHY_INTERFACE_MODE_GMII: | ||
402 | mii = 2; | ||
403 | break; | ||
404 | case PHY_INTERFACE_MODE_MII: | ||
405 | mii = 1; | ||
406 | break; | ||
407 | case PHY_INTERFACE_MODE_RMII: | ||
408 | default: | ||
409 | mii = 0; | ||
410 | break; | ||
411 | } | ||
412 | sh_eth_write(ndev, mii, RMII_MII); | ||
413 | } | ||
414 | |||
415 | static void sh_eth_reset(struct net_device *ndev) | ||
416 | { | ||
417 | int cnt = 100; | ||
418 | |||
419 | sh_eth_write(ndev, EDSR_ENALL, EDSR); | ||
420 | sh_eth_write(ndev, sh_eth_read(ndev, EDMR) | EDMR_SRST_GETHER, EDMR); | ||
421 | while (cnt > 0) { | ||
422 | if (!(sh_eth_read(ndev, EDMR) & 0x3)) | ||
423 | break; | ||
424 | mdelay(1); | ||
425 | cnt--; | ||
426 | } | ||
427 | if (cnt == 0) | ||
428 | printk(KERN_ERR "Device reset fail\n"); | ||
429 | |||
430 | /* Table Init */ | ||
431 | sh_eth_write(ndev, 0x0, TDLAR); | ||
432 | sh_eth_write(ndev, 0x0, TDFAR); | ||
433 | sh_eth_write(ndev, 0x0, TDFXR); | ||
434 | sh_eth_write(ndev, 0x0, TDFFR); | ||
435 | sh_eth_write(ndev, 0x0, RDLAR); | ||
436 | sh_eth_write(ndev, 0x0, RDFAR); | ||
437 | sh_eth_write(ndev, 0x0, RDFXR); | ||
438 | sh_eth_write(ndev, 0x0, RDFFR); | ||
439 | } | ||
440 | |||
441 | static void sh_eth_set_duplex(struct net_device *ndev) | ||
442 | { | ||
443 | struct sh_eth_private *mdp = netdev_priv(ndev); | ||
444 | |||
445 | if (mdp->duplex) /* Full */ | ||
446 | sh_eth_write(ndev, sh_eth_read(ndev, ECMR) | ECMR_DM, ECMR); | ||
447 | else /* Half */ | ||
448 | sh_eth_write(ndev, sh_eth_read(ndev, ECMR) & ~ECMR_DM, ECMR); | ||
449 | } | ||
450 | |||
451 | static void sh_eth_set_rate(struct net_device *ndev) | ||
452 | { | ||
453 | struct sh_eth_private *mdp = netdev_priv(ndev); | ||
454 | |||
455 | switch (mdp->speed) { | ||
456 | case 10: /* 10BASE */ | ||
457 | sh_eth_write(ndev, GECMR_10, GECMR); | ||
458 | break; | ||
459 | case 100:/* 100BASE */ | ||
460 | sh_eth_write(ndev, GECMR_100, GECMR); | ||
461 | break; | ||
462 | case 1000: /* 1000BASE */ | ||
463 | sh_eth_write(ndev, GECMR_1000, GECMR); | ||
464 | break; | ||
465 | default: | ||
466 | break; | ||
467 | } | ||
468 | } | ||
469 | |||
470 | /* R8A7740 */ | ||
471 | static struct sh_eth_cpu_data sh_eth_my_cpu_data = { | ||
472 | .chip_reset = sh_eth_chip_reset, | ||
473 | .set_duplex = sh_eth_set_duplex, | ||
474 | .set_rate = sh_eth_set_rate, | ||
475 | |||
476 | .ecsr_value = ECSR_ICD | ECSR_MPD, | ||
477 | .ecsipr_value = ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP, | ||
478 | .eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003fffff, | ||
479 | |||
480 | .tx_check = EESR_TC1 | EESR_FTC, | ||
481 | .eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT | \ | ||
482 | EESR_RDE | EESR_RFRMER | EESR_TFE | EESR_TDE | \ | ||
483 | EESR_ECI, | ||
484 | .tx_error_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_TDE | \ | ||
485 | EESR_TFE, | ||
486 | |||
487 | .apr = 1, | ||
488 | .mpr = 1, | ||
489 | .tpauser = 1, | ||
490 | .bculr = 1, | ||
491 | .hw_swap = 1, | ||
492 | .no_trimd = 1, | ||
493 | .no_ade = 1, | ||
494 | .tsu = 1, | ||
495 | }; | ||
496 | |||
389 | #elif defined(CONFIG_CPU_SUBTYPE_SH7619) | 497 | #elif defined(CONFIG_CPU_SUBTYPE_SH7619) |
390 | #define SH_ETH_RESET_DEFAULT 1 | 498 | #define SH_ETH_RESET_DEFAULT 1 |
391 | static struct sh_eth_cpu_data sh_eth_my_cpu_data = { | 499 | static struct sh_eth_cpu_data sh_eth_my_cpu_data = { |
@@ -443,7 +551,7 @@ static void sh_eth_reset(struct net_device *ndev) | |||
443 | } | 551 | } |
444 | #endif | 552 | #endif |
445 | 553 | ||
446 | #if defined(CONFIG_CPU_SH4) | 554 | #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) |
447 | static void sh_eth_set_receive_align(struct sk_buff *skb) | 555 | static void sh_eth_set_receive_align(struct sk_buff *skb) |
448 | { | 556 | { |
449 | int reserve; | 557 | int reserve; |
@@ -919,6 +1027,10 @@ static int sh_eth_rx(struct net_device *ndev) | |||
919 | desc_status = edmac_to_cpu(mdp, rxdesc->status); | 1027 | desc_status = edmac_to_cpu(mdp, rxdesc->status); |
920 | pkt_len = rxdesc->frame_length; | 1028 | pkt_len = rxdesc->frame_length; |
921 | 1029 | ||
1030 | #if defined(CONFIG_ARCH_R8A7740) | ||
1031 | desc_status >>= 16; | ||
1032 | #endif | ||
1033 | |||
922 | if (--boguscnt < 0) | 1034 | if (--boguscnt < 0) |
923 | break; | 1035 | break; |
924 | 1036 | ||
diff --git a/drivers/net/ethernet/renesas/sh_eth.h b/drivers/net/ethernet/renesas/sh_eth.h index e66de1823532..2d80feadc861 100644 --- a/drivers/net/ethernet/renesas/sh_eth.h +++ b/drivers/net/ethernet/renesas/sh_eth.h | |||
@@ -372,7 +372,7 @@ static const u16 sh_eth_offset_fast_sh3_sh2[SH_ETH_MAX_REGISTER_OFFSET] = { | |||
372 | }; | 372 | }; |
373 | 373 | ||
374 | /* Driver's parameters */ | 374 | /* Driver's parameters */ |
375 | #if defined(CONFIG_CPU_SH4) | 375 | #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) |
376 | #define SH4_SKB_RX_ALIGN 32 | 376 | #define SH4_SKB_RX_ALIGN 32 |
377 | #else | 377 | #else |
378 | #define SH2_SH3_SKB_RX_ALIGN 2 | 378 | #define SH2_SH3_SKB_RX_ALIGN 2 |
@@ -381,7 +381,8 @@ static const u16 sh_eth_offset_fast_sh3_sh2[SH_ETH_MAX_REGISTER_OFFSET] = { | |||
381 | /* | 381 | /* |
382 | * Register's bits | 382 | * Register's bits |
383 | */ | 383 | */ |
384 | #if defined(CONFIG_CPU_SUBTYPE_SH7734) || defined(CONFIG_CPU_SUBTYPE_SH7763) | 384 | #if defined(CONFIG_CPU_SUBTYPE_SH7734) || defined(CONFIG_CPU_SUBTYPE_SH7763) ||\ |
385 | defined(CONFIG_ARCH_R8A7740) | ||
385 | /* EDSR */ | 386 | /* EDSR */ |
386 | enum EDSR_BIT { | 387 | enum EDSR_BIT { |
387 | EDSR_ENT = 0x01, EDSR_ENR = 0x02, | 388 | EDSR_ENT = 0x01, EDSR_ENR = 0x02, |