diff options
Diffstat (limited to 'drivers/net/ethernet/renesas/sh_eth.c')
-rw-r--r-- | drivers/net/ethernet/renesas/sh_eth.c | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index 6a9509ccd33b..7622213beef1 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c | |||
@@ -307,6 +307,27 @@ static const u16 sh_eth_offset_fast_sh4[SH_ETH_MAX_REGISTER_OFFSET] = { | |||
307 | }; | 307 | }; |
308 | 308 | ||
309 | static const u16 sh_eth_offset_fast_sh3_sh2[SH_ETH_MAX_REGISTER_OFFSET] = { | 309 | static const u16 sh_eth_offset_fast_sh3_sh2[SH_ETH_MAX_REGISTER_OFFSET] = { |
310 | [EDMR] = 0x0000, | ||
311 | [EDTRR] = 0x0004, | ||
312 | [EDRRR] = 0x0008, | ||
313 | [TDLAR] = 0x000c, | ||
314 | [RDLAR] = 0x0010, | ||
315 | [EESR] = 0x0014, | ||
316 | [EESIPR] = 0x0018, | ||
317 | [TRSCER] = 0x001c, | ||
318 | [RMFCR] = 0x0020, | ||
319 | [TFTR] = 0x0024, | ||
320 | [FDR] = 0x0028, | ||
321 | [RMCR] = 0x002c, | ||
322 | [EDOCR] = 0x0030, | ||
323 | [FCFTR] = 0x0034, | ||
324 | [RPADIR] = 0x0038, | ||
325 | [TRIMD] = 0x003c, | ||
326 | [RBWAR] = 0x0040, | ||
327 | [RDFAR] = 0x0044, | ||
328 | [TBRAR] = 0x004c, | ||
329 | [TDFAR] = 0x0050, | ||
330 | |||
310 | [ECMR] = 0x0160, | 331 | [ECMR] = 0x0160, |
311 | [ECSR] = 0x0164, | 332 | [ECSR] = 0x0164, |
312 | [ECSIPR] = 0x0168, | 333 | [ECSIPR] = 0x0168, |
@@ -546,7 +567,6 @@ static struct sh_eth_cpu_data sh7757_data = { | |||
546 | .register_type = SH_ETH_REG_FAST_SH4, | 567 | .register_type = SH_ETH_REG_FAST_SH4, |
547 | 568 | ||
548 | .eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003fffff, | 569 | .eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003fffff, |
549 | .rmcr_value = RMCR_RNC, | ||
550 | 570 | ||
551 | .tx_check = EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO, | 571 | .tx_check = EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO, |
552 | .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | | 572 | .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE | |
@@ -624,7 +644,6 @@ static struct sh_eth_cpu_data sh7757_data_giga = { | |||
624 | EESR_RFE | EESR_RDE | EESR_RFRMER | EESR_TFE | | 644 | EESR_RFE | EESR_RDE | EESR_RFRMER | EESR_TFE | |
625 | EESR_TDE | EESR_ECI, | 645 | EESR_TDE | EESR_ECI, |
626 | .fdr_value = 0x0000072f, | 646 | .fdr_value = 0x0000072f, |
627 | .rmcr_value = RMCR_RNC, | ||
628 | 647 | ||
629 | .irq_flags = IRQF_SHARED, | 648 | .irq_flags = IRQF_SHARED, |
630 | .apr = 1, | 649 | .apr = 1, |
@@ -752,7 +771,6 @@ static struct sh_eth_cpu_data r8a7740_data = { | |||
752 | EESR_RFE | EESR_RDE | EESR_RFRMER | EESR_TFE | | 771 | EESR_RFE | EESR_RDE | EESR_RFRMER | EESR_TFE | |
753 | EESR_TDE | EESR_ECI, | 772 | EESR_TDE | EESR_ECI, |
754 | .fdr_value = 0x0000070f, | 773 | .fdr_value = 0x0000070f, |
755 | .rmcr_value = RMCR_RNC, | ||
756 | 774 | ||
757 | .apr = 1, | 775 | .apr = 1, |
758 | .mpr = 1, | 776 | .mpr = 1, |
@@ -784,7 +802,6 @@ static struct sh_eth_cpu_data r7s72100_data = { | |||
784 | EESR_RFE | EESR_RDE | EESR_RFRMER | EESR_TFE | | 802 | EESR_RFE | EESR_RDE | EESR_RFRMER | EESR_TFE | |
785 | EESR_TDE | EESR_ECI, | 803 | EESR_TDE | EESR_ECI, |
786 | .fdr_value = 0x0000070f, | 804 | .fdr_value = 0x0000070f, |
787 | .rmcr_value = RMCR_RNC, | ||
788 | 805 | ||
789 | .no_psr = 1, | 806 | .no_psr = 1, |
790 | .apr = 1, | 807 | .apr = 1, |
@@ -833,9 +850,6 @@ static void sh_eth_set_default_cpu_data(struct sh_eth_cpu_data *cd) | |||
833 | if (!cd->fdr_value) | 850 | if (!cd->fdr_value) |
834 | cd->fdr_value = DEFAULT_FDR_INIT; | 851 | cd->fdr_value = DEFAULT_FDR_INIT; |
835 | 852 | ||
836 | if (!cd->rmcr_value) | ||
837 | cd->rmcr_value = DEFAULT_RMCR_VALUE; | ||
838 | |||
839 | if (!cd->tx_check) | 853 | if (!cd->tx_check) |
840 | cd->tx_check = DEFAULT_TX_CHECK; | 854 | cd->tx_check = DEFAULT_TX_CHECK; |
841 | 855 | ||
@@ -1287,8 +1301,8 @@ static int sh_eth_dev_init(struct net_device *ndev, bool start) | |||
1287 | sh_eth_write(ndev, mdp->cd->fdr_value, FDR); | 1301 | sh_eth_write(ndev, mdp->cd->fdr_value, FDR); |
1288 | sh_eth_write(ndev, 0, TFTR); | 1302 | sh_eth_write(ndev, 0, TFTR); |
1289 | 1303 | ||
1290 | /* Frame recv control */ | 1304 | /* Frame recv control (enable multiple-packets per rx irq) */ |
1291 | sh_eth_write(ndev, mdp->cd->rmcr_value, RMCR); | 1305 | sh_eth_write(ndev, RMCR_RNC, RMCR); |
1292 | 1306 | ||
1293 | sh_eth_write(ndev, DESC_I_RINT8 | DESC_I_RINT5 | DESC_I_TINT2, TRSCER); | 1307 | sh_eth_write(ndev, DESC_I_RINT8 | DESC_I_RINT5 | DESC_I_TINT2, TRSCER); |
1294 | 1308 | ||
@@ -1385,7 +1399,6 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1385 | int entry = mdp->cur_rx % mdp->num_rx_ring; | 1399 | int entry = mdp->cur_rx % mdp->num_rx_ring; |
1386 | int boguscnt = (mdp->dirty_rx + mdp->num_rx_ring) - mdp->cur_rx; | 1400 | int boguscnt = (mdp->dirty_rx + mdp->num_rx_ring) - mdp->cur_rx; |
1387 | struct sk_buff *skb; | 1401 | struct sk_buff *skb; |
1388 | int exceeded = 0; | ||
1389 | u16 pkt_len = 0; | 1402 | u16 pkt_len = 0; |
1390 | u32 desc_status; | 1403 | u32 desc_status; |
1391 | 1404 | ||
@@ -1397,10 +1410,9 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1397 | if (--boguscnt < 0) | 1410 | if (--boguscnt < 0) |
1398 | break; | 1411 | break; |
1399 | 1412 | ||
1400 | if (*quota <= 0) { | 1413 | if (*quota <= 0) |
1401 | exceeded = 1; | ||
1402 | break; | 1414 | break; |
1403 | } | 1415 | |
1404 | (*quota)--; | 1416 | (*quota)--; |
1405 | 1417 | ||
1406 | if (!(desc_status & RDFEND)) | 1418 | if (!(desc_status & RDFEND)) |
@@ -1448,7 +1460,6 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1448 | ndev->stats.rx_packets++; | 1460 | ndev->stats.rx_packets++; |
1449 | ndev->stats.rx_bytes += pkt_len; | 1461 | ndev->stats.rx_bytes += pkt_len; |
1450 | } | 1462 | } |
1451 | rxdesc->status |= cpu_to_edmac(mdp, RD_RACT); | ||
1452 | entry = (++mdp->cur_rx) % mdp->num_rx_ring; | 1463 | entry = (++mdp->cur_rx) % mdp->num_rx_ring; |
1453 | rxdesc = &mdp->rx_ring[entry]; | 1464 | rxdesc = &mdp->rx_ring[entry]; |
1454 | } | 1465 | } |
@@ -1494,7 +1505,7 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status, int *quota) | |||
1494 | sh_eth_write(ndev, EDRRR_R, EDRRR); | 1505 | sh_eth_write(ndev, EDRRR_R, EDRRR); |
1495 | } | 1506 | } |
1496 | 1507 | ||
1497 | return exceeded; | 1508 | return *quota <= 0; |
1498 | } | 1509 | } |
1499 | 1510 | ||
1500 | static void sh_eth_rcv_snd_disable(struct net_device *ndev) | 1511 | static void sh_eth_rcv_snd_disable(struct net_device *ndev) |
@@ -2627,8 +2638,8 @@ static int sh_mdio_init(struct sh_eth_private *mdp, | |||
2627 | pdev->name, pdev->id); | 2638 | pdev->name, pdev->id); |
2628 | 2639 | ||
2629 | /* PHY IRQ */ | 2640 | /* PHY IRQ */ |
2630 | mdp->mii_bus->irq = devm_kzalloc(dev, sizeof(int) * PHY_MAX_ADDR, | 2641 | mdp->mii_bus->irq = devm_kmalloc_array(dev, PHY_MAX_ADDR, sizeof(int), |
2631 | GFP_KERNEL); | 2642 | GFP_KERNEL); |
2632 | if (!mdp->mii_bus->irq) { | 2643 | if (!mdp->mii_bus->irq) { |
2633 | ret = -ENOMEM; | 2644 | ret = -ENOMEM; |
2634 | goto out_free_bus; | 2645 | goto out_free_bus; |
@@ -2843,7 +2854,7 @@ static int sh_eth_drv_probe(struct platform_device *pdev) | |||
2843 | ndev->netdev_ops = &sh_eth_netdev_ops_tsu; | 2854 | ndev->netdev_ops = &sh_eth_netdev_ops_tsu; |
2844 | else | 2855 | else |
2845 | ndev->netdev_ops = &sh_eth_netdev_ops; | 2856 | ndev->netdev_ops = &sh_eth_netdev_ops; |
2846 | SET_ETHTOOL_OPS(ndev, &sh_eth_ethtool_ops); | 2857 | ndev->ethtool_ops = &sh_eth_ethtool_ops; |
2847 | ndev->watchdog_timeo = TX_TIMEOUT; | 2858 | ndev->watchdog_timeo = TX_TIMEOUT; |
2848 | 2859 | ||
2849 | /* debug message level */ | 2860 | /* debug message level */ |