Commit 097657c9 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'stmmac-regression-fix'



Merge branch 'stmmac-regression-fix'

Herve Codina says:

====================
net: stmmac: fix regression on SPEAr3xx SOC

The ethernet driver used on old SPEAr3xx soc was previously supported on old
kernel. Some regressions were introduced during the different updates leading
to a broken driver for this soc.

This series fixes these regressions and brings back ethernet on SPEAr3xx.
Tested on a SPEAr320 board.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 612f71d7 6636fec2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ select:
      contains:
        enum:
          - snps,dwmac
          - snps,dwmac-3.40a
          - snps,dwmac-3.50a
          - snps,dwmac-3.610
          - snps,dwmac-3.70a
@@ -76,6 +77,7 @@ properties:
        - rockchip,rk3399-gmac
        - rockchip,rv1108-gmac
        - snps,dwmac
        - snps,dwmac-3.40a
        - snps,dwmac-3.50a
        - snps,dwmac-3.610
        - snps,dwmac-3.70a
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@
		};

		gmac: eth@e0800000 {
			compatible = "st,spear600-gmac";
			compatible = "snps,dwmac-3.40a";
			reg = <0xe0800000 0x8000>;
			interrupts = <23 22>;
			interrupt-names = "macirq", "eth_wake_irq";
+1 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ static int dwmac_generic_probe(struct platform_device *pdev)

static const struct of_device_id dwmac_generic_match[] = {
	{ .compatible = "st,spear600-gmac"},
	{ .compatible = "snps,dwmac-3.40a"},
	{ .compatible = "snps,dwmac-3.50a"},
	{ .compatible = "snps,dwmac-3.610"},
	{ .compatible = "snps,dwmac-3.70a"},
+11 −2
Original line number Diff line number Diff line
@@ -218,11 +218,18 @@ static void dwmac1000_dump_dma_regs(void __iomem *ioaddr, u32 *reg_space)
				readl(ioaddr + DMA_BUS_MODE + i * 4);
}

static void dwmac1000_get_hw_feature(void __iomem *ioaddr,
static int dwmac1000_get_hw_feature(void __iomem *ioaddr,
				    struct dma_features *dma_cap)
{
	u32 hw_cap = readl(ioaddr + DMA_HW_FEATURE);

	if (!hw_cap) {
		/* 0x00000000 is the value read on old hardware that does not
		 * implement this register
		 */
		return -EOPNOTSUPP;
	}

	dma_cap->mbps_10_100 = (hw_cap & DMA_HW_FEAT_MIISEL);
	dma_cap->mbps_1000 = (hw_cap & DMA_HW_FEAT_GMIISEL) >> 1;
	dma_cap->half_duplex = (hw_cap & DMA_HW_FEAT_HDSEL) >> 2;
@@ -252,6 +259,8 @@ static void dwmac1000_get_hw_feature(void __iomem *ioaddr,
	dma_cap->number_tx_channel = (hw_cap & DMA_HW_FEAT_TXCHCNT) >> 22;
	/* Alternate (enhanced) DESC mode */
	dma_cap->enh_desc = (hw_cap & DMA_HW_FEAT_ENHDESSEL) >> 24;

	return 0;
}

static void dwmac1000_rx_watchdog(void __iomem *ioaddr, u32 riwt,
+4 −2
Original line number Diff line number Diff line
@@ -347,7 +347,7 @@ static void dwmac4_dma_tx_chan_op_mode(void __iomem *ioaddr, int mode,
	writel(mtl_tx_op, ioaddr +  MTL_CHAN_TX_OP_MODE(channel));
}

static void dwmac4_get_hw_feature(void __iomem *ioaddr,
static int dwmac4_get_hw_feature(void __iomem *ioaddr,
				 struct dma_features *dma_cap)
{
	u32 hw_cap = readl(ioaddr + GMAC_HW_FEATURE0);
@@ -437,6 +437,8 @@ static void dwmac4_get_hw_feature(void __iomem *ioaddr,
	dma_cap->frpbs = (hw_cap & GMAC_HW_FEAT_FRPBS) >> 11;
	dma_cap->frpsel = (hw_cap & GMAC_HW_FEAT_FRPSEL) >> 10;
	dma_cap->dvlan = (hw_cap & GMAC_HW_FEAT_DVLAN) >> 5;

	return 0;
}

/* Enable/disable TSO feature and set MSS */
Loading