Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Yoshihiro Shimoda and committed by
David S. Miller
73a0d907 8b1467a3

+120 -6
+4 -3
drivers/net/ethernet/renesas/Kconfig
··· 4 4 5 5 config SH_ETH 6 6 tristate "Renesas SuperH Ethernet support" 7 - depends on SUPERH && \ 7 + depends on (SUPERH || ARCH_SHMOBILE) && \ 8 8 (CPU_SUBTYPE_SH7710 || CPU_SUBTYPE_SH7712 || \ 9 9 CPU_SUBTYPE_SH7763 || CPU_SUBTYPE_SH7619 || \ 10 10 CPU_SUBTYPE_SH7724 || CPU_SUBTYPE_SH7734 || \ 11 - CPU_SUBTYPE_SH7757) 11 + CPU_SUBTYPE_SH7757 || ARCH_R8A7740) 12 12 select CRC32 13 13 select NET_CORE 14 14 select MII ··· 17 17 ---help--- 18 18 Renesas SuperH Ethernet device driver. 19 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.
+113 -1
drivers/net/ethernet/renesas/sh_eth.c
··· 386 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 497 #elif defined(CONFIG_CPU_SUBTYPE_SH7619) 390 498 #define SH_ETH_RESET_DEFAULT 1 391 499 static struct sh_eth_cpu_data sh_eth_my_cpu_data = { ··· 551 443 } 552 444 #endif 553 445 554 - #if defined(CONFIG_CPU_SH4) 446 + #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) 555 447 static void sh_eth_set_receive_align(struct sk_buff *skb) 556 448 { 557 449 int reserve; ··· 1026 918 while (!(rxdesc->status & cpu_to_edmac(mdp, RD_RACT))) { 1027 919 desc_status = edmac_to_cpu(mdp, rxdesc->status); 1028 920 pkt_len = rxdesc->frame_length; 921 + 922 + #if defined(CONFIG_ARCH_R8A7740) 923 + desc_status >>= 16; 924 + #endif 1029 925 1030 926 if (--boguscnt < 0) 1031 927 break;
+3 -2
drivers/net/ethernet/renesas/sh_eth.h
··· 372 372 }; 373 373 374 374 /* Driver's parameters */ 375 - #if defined(CONFIG_CPU_SH4) 375 + #if defined(CONFIG_CPU_SH4) || defined(CONFIG_ARCH_SHMOBILE) 376 376 #define SH4_SKB_RX_ALIGN 32 377 377 #else 378 378 #define SH2_SH3_SKB_RX_ALIGN 2 ··· 381 381 /* 382 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 386 /* EDSR */ 386 387 enum EDSR_BIT { 387 388 EDSR_ENT = 0x01, EDSR_ENR = 0x02,