diff options
author | David S. Miller <davem@davemloft.net> | 2015-08-01 02:52:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-08-01 02:52:20 -0400 |
commit | 5510b3c2a173921374ec847848fb20b98e1c698a (patch) | |
tree | c9e185281ef17280ce0dc30be7923124874736b0 /drivers/net/ethernet/cadence/macb.c | |
parent | 17f901e8915cb922c2ca710835ef34f166f53ee9 (diff) | |
parent | 7c764cec3703583247c4ab837c652975a3d41f4b (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
arch/s390/net/bpf_jit_comp.c
drivers/net/ethernet/ti/netcp_ethss.c
net/bridge/br_multicast.c
net/ipv4/ip_fragment.c
All four conflicts were cases of simple overlapping
changes.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/cadence/macb.c')
-rw-r--r-- | drivers/net/ethernet/cadence/macb.c | 125 |
1 files changed, 83 insertions, 42 deletions
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index a4e3f8655cb8..88c1e1a834f8 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c | |||
@@ -104,6 +104,57 @@ static void *macb_rx_buffer(struct macb *bp, unsigned int index) | |||
104 | return bp->rx_buffers + bp->rx_buffer_size * macb_rx_ring_wrap(index); | 104 | return bp->rx_buffers + bp->rx_buffer_size * macb_rx_ring_wrap(index); |
105 | } | 105 | } |
106 | 106 | ||
107 | /* I/O accessors */ | ||
108 | static u32 hw_readl_native(struct macb *bp, int offset) | ||
109 | { | ||
110 | return __raw_readl(bp->regs + offset); | ||
111 | } | ||
112 | |||
113 | static void hw_writel_native(struct macb *bp, int offset, u32 value) | ||
114 | { | ||
115 | __raw_writel(value, bp->regs + offset); | ||
116 | } | ||
117 | |||
118 | static u32 hw_readl(struct macb *bp, int offset) | ||
119 | { | ||
120 | return readl_relaxed(bp->regs + offset); | ||
121 | } | ||
122 | |||
123 | static void hw_writel(struct macb *bp, int offset, u32 value) | ||
124 | { | ||
125 | writel_relaxed(value, bp->regs + offset); | ||
126 | } | ||
127 | |||
128 | /* | ||
129 | * Find the CPU endianness by using the loopback bit of NCR register. When the | ||
130 | * CPU is in big endian we need to program swaped mode for management | ||
131 | * descriptor access. | ||
132 | */ | ||
133 | static bool hw_is_native_io(void __iomem *addr) | ||
134 | { | ||
135 | u32 value = MACB_BIT(LLB); | ||
136 | |||
137 | __raw_writel(value, addr + MACB_NCR); | ||
138 | value = __raw_readl(addr + MACB_NCR); | ||
139 | |||
140 | /* Write 0 back to disable everything */ | ||
141 | __raw_writel(0, addr + MACB_NCR); | ||
142 | |||
143 | return value == MACB_BIT(LLB); | ||
144 | } | ||
145 | |||
146 | static bool hw_is_gem(void __iomem *addr, bool native_io) | ||
147 | { | ||
148 | u32 id; | ||
149 | |||
150 | if (native_io) | ||
151 | id = __raw_readl(addr + MACB_MID); | ||
152 | else | ||
153 | id = readl_relaxed(addr + MACB_MID); | ||
154 | |||
155 | return MACB_BFEXT(IDNUM, id) >= 0x2; | ||
156 | } | ||
157 | |||
107 | static void macb_set_hwaddr(struct macb *bp) | 158 | static void macb_set_hwaddr(struct macb *bp) |
108 | { | 159 | { |
109 | u32 bottom; | 160 | u32 bottom; |
@@ -160,7 +211,7 @@ static void macb_get_hwaddr(struct macb *bp) | |||
160 | } | 211 | } |
161 | } | 212 | } |
162 | 213 | ||
163 | netdev_info(bp->dev, "invalid hw address, using random\n"); | 214 | dev_info(&bp->pdev->dev, "invalid hw address, using random\n"); |
164 | eth_hw_addr_random(bp->dev); | 215 | eth_hw_addr_random(bp->dev); |
165 | } | 216 | } |
166 | 217 | ||
@@ -252,7 +303,6 @@ static void macb_handle_link_change(struct net_device *dev) | |||
252 | struct macb *bp = netdev_priv(dev); | 303 | struct macb *bp = netdev_priv(dev); |
253 | struct phy_device *phydev = bp->phy_dev; | 304 | struct phy_device *phydev = bp->phy_dev; |
254 | unsigned long flags; | 305 | unsigned long flags; |
255 | |||
256 | int status_change = 0; | 306 | int status_change = 0; |
257 | 307 | ||
258 | spin_lock_irqsave(&bp->lock, flags); | 308 | spin_lock_irqsave(&bp->lock, flags); |
@@ -449,14 +499,14 @@ err_out: | |||
449 | 499 | ||
450 | static void macb_update_stats(struct macb *bp) | 500 | static void macb_update_stats(struct macb *bp) |
451 | { | 501 | { |
452 | u32 __iomem *reg = bp->regs + MACB_PFR; | ||
453 | u32 *p = &bp->hw_stats.macb.rx_pause_frames; | 502 | u32 *p = &bp->hw_stats.macb.rx_pause_frames; |
454 | u32 *end = &bp->hw_stats.macb.tx_pause_frames + 1; | 503 | u32 *end = &bp->hw_stats.macb.tx_pause_frames + 1; |
504 | int offset = MACB_PFR; | ||
455 | 505 | ||
456 | WARN_ON((unsigned long)(end - p - 1) != (MACB_TPF - MACB_PFR) / 4); | 506 | WARN_ON((unsigned long)(end - p - 1) != (MACB_TPF - MACB_PFR) / 4); |
457 | 507 | ||
458 | for(; p < end; p++, reg++) | 508 | for(; p < end; p++, offset += 4) |
459 | *p += readl_relaxed(reg); | 509 | *p += bp->macb_reg_readl(bp, offset); |
460 | } | 510 | } |
461 | 511 | ||
462 | static int macb_halt_tx(struct macb *bp) | 512 | static int macb_halt_tx(struct macb *bp) |
@@ -1107,12 +1157,6 @@ static void macb_poll_controller(struct net_device *dev) | |||
1107 | } | 1157 | } |
1108 | #endif | 1158 | #endif |
1109 | 1159 | ||
1110 | static inline unsigned int macb_count_tx_descriptors(struct macb *bp, | ||
1111 | unsigned int len) | ||
1112 | { | ||
1113 | return (len + bp->max_tx_length - 1) / bp->max_tx_length; | ||
1114 | } | ||
1115 | |||
1116 | static unsigned int macb_tx_map(struct macb *bp, | 1160 | static unsigned int macb_tx_map(struct macb *bp, |
1117 | struct macb_queue *queue, | 1161 | struct macb_queue *queue, |
1118 | struct sk_buff *skb) | 1162 | struct sk_buff *skb) |
@@ -1263,11 +1307,11 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1263 | * socket buffer: skb fragments of jumbo frames may need to be | 1307 | * socket buffer: skb fragments of jumbo frames may need to be |
1264 | * splitted into many buffer descriptors. | 1308 | * splitted into many buffer descriptors. |
1265 | */ | 1309 | */ |
1266 | count = macb_count_tx_descriptors(bp, skb_headlen(skb)); | 1310 | count = DIV_ROUND_UP(skb_headlen(skb), bp->max_tx_length); |
1267 | nr_frags = skb_shinfo(skb)->nr_frags; | 1311 | nr_frags = skb_shinfo(skb)->nr_frags; |
1268 | for (f = 0; f < nr_frags; f++) { | 1312 | for (f = 0; f < nr_frags; f++) { |
1269 | frag_size = skb_frag_size(&skb_shinfo(skb)->frags[f]); | 1313 | frag_size = skb_frag_size(&skb_shinfo(skb)->frags[f]); |
1270 | count += macb_count_tx_descriptors(bp, frag_size); | 1314 | count += DIV_ROUND_UP(frag_size, bp->max_tx_length); |
1271 | } | 1315 | } |
1272 | 1316 | ||
1273 | spin_lock_irqsave(&bp->lock, flags); | 1317 | spin_lock_irqsave(&bp->lock, flags); |
@@ -1603,7 +1647,6 @@ static u32 macb_dbw(struct macb *bp) | |||
1603 | static void macb_configure_dma(struct macb *bp) | 1647 | static void macb_configure_dma(struct macb *bp) |
1604 | { | 1648 | { |
1605 | u32 dmacfg; | 1649 | u32 dmacfg; |
1606 | u32 tmp, ncr; | ||
1607 | 1650 | ||
1608 | if (macb_is_gem(bp)) { | 1651 | if (macb_is_gem(bp)) { |
1609 | dmacfg = gem_readl(bp, DMACFG) & ~GEM_BF(RXBS, -1L); | 1652 | dmacfg = gem_readl(bp, DMACFG) & ~GEM_BF(RXBS, -1L); |
@@ -1613,22 +1656,11 @@ static void macb_configure_dma(struct macb *bp) | |||
1613 | dmacfg |= GEM_BIT(TXPBMS) | GEM_BF(RXBMS, -1L); | 1656 | dmacfg |= GEM_BIT(TXPBMS) | GEM_BF(RXBMS, -1L); |
1614 | dmacfg &= ~GEM_BIT(ENDIA_PKT); | 1657 | dmacfg &= ~GEM_BIT(ENDIA_PKT); |
1615 | 1658 | ||
1616 | /* Find the CPU endianness by using the loopback bit of net_ctrl | 1659 | if (bp->native_io) |
1617 | * register. save it first. When the CPU is in big endian we | ||
1618 | * need to program swaped mode for management descriptor access. | ||
1619 | */ | ||
1620 | ncr = macb_readl(bp, NCR); | ||
1621 | __raw_writel(MACB_BIT(LLB), bp->regs + MACB_NCR); | ||
1622 | tmp = __raw_readl(bp->regs + MACB_NCR); | ||
1623 | |||
1624 | if (tmp == MACB_BIT(LLB)) | ||
1625 | dmacfg &= ~GEM_BIT(ENDIA_DESC); | 1660 | dmacfg &= ~GEM_BIT(ENDIA_DESC); |
1626 | else | 1661 | else |
1627 | dmacfg |= GEM_BIT(ENDIA_DESC); /* CPU in big endian */ | 1662 | dmacfg |= GEM_BIT(ENDIA_DESC); /* CPU in big endian */ |
1628 | 1663 | ||
1629 | /* Restore net_ctrl */ | ||
1630 | macb_writel(bp, NCR, ncr); | ||
1631 | |||
1632 | if (bp->dev->features & NETIF_F_HW_CSUM) | 1664 | if (bp->dev->features & NETIF_F_HW_CSUM) |
1633 | dmacfg |= GEM_BIT(TXCOEN); | 1665 | dmacfg |= GEM_BIT(TXCOEN); |
1634 | else | 1666 | else |
@@ -1897,19 +1929,19 @@ static int macb_change_mtu(struct net_device *dev, int new_mtu) | |||
1897 | 1929 | ||
1898 | static void gem_update_stats(struct macb *bp) | 1930 | static void gem_update_stats(struct macb *bp) |
1899 | { | 1931 | { |
1900 | int i; | 1932 | unsigned int i; |
1901 | u32 *p = &bp->hw_stats.gem.tx_octets_31_0; | 1933 | u32 *p = &bp->hw_stats.gem.tx_octets_31_0; |
1902 | 1934 | ||
1903 | for (i = 0; i < GEM_STATS_LEN; ++i, ++p) { | 1935 | for (i = 0; i < GEM_STATS_LEN; ++i, ++p) { |
1904 | u32 offset = gem_statistics[i].offset; | 1936 | u32 offset = gem_statistics[i].offset; |
1905 | u64 val = readl_relaxed(bp->regs + offset); | 1937 | u64 val = bp->macb_reg_readl(bp, offset); |
1906 | 1938 | ||
1907 | bp->ethtool_stats[i] += val; | 1939 | bp->ethtool_stats[i] += val; |
1908 | *p += val; | 1940 | *p += val; |
1909 | 1941 | ||
1910 | if (offset == GEM_OCTTXL || offset == GEM_OCTRXL) { | 1942 | if (offset == GEM_OCTTXL || offset == GEM_OCTRXL) { |
1911 | /* Add GEM_OCTTXH, GEM_OCTRXH */ | 1943 | /* Add GEM_OCTTXH, GEM_OCTRXH */ |
1912 | val = readl_relaxed(bp->regs + offset + 4); | 1944 | val = bp->macb_reg_readl(bp, offset + 4); |
1913 | bp->ethtool_stats[i] += ((u64)val) << 32; | 1945 | bp->ethtool_stats[i] += ((u64)val) << 32; |
1914 | *(++p) += val; | 1946 | *(++p) += val; |
1915 | } | 1947 | } |
@@ -1976,7 +2008,7 @@ static int gem_get_sset_count(struct net_device *dev, int sset) | |||
1976 | 2008 | ||
1977 | static void gem_get_ethtool_strings(struct net_device *dev, u32 sset, u8 *p) | 2009 | static void gem_get_ethtool_strings(struct net_device *dev, u32 sset, u8 *p) |
1978 | { | 2010 | { |
1979 | int i; | 2011 | unsigned int i; |
1980 | 2012 | ||
1981 | switch (sset) { | 2013 | switch (sset) { |
1982 | case ETH_SS_STATS: | 2014 | case ETH_SS_STATS: |
@@ -2190,7 +2222,7 @@ static void macb_configure_caps(struct macb *bp, const struct macb_config *dt_co | |||
2190 | if (dt_conf) | 2222 | if (dt_conf) |
2191 | bp->caps = dt_conf->caps; | 2223 | bp->caps = dt_conf->caps; |
2192 | 2224 | ||
2193 | if (macb_is_gem_hw(bp->regs)) { | 2225 | if (hw_is_gem(bp->regs, bp->native_io)) { |
2194 | bp->caps |= MACB_CAPS_MACB_IS_GEM; | 2226 | bp->caps |= MACB_CAPS_MACB_IS_GEM; |
2195 | 2227 | ||
2196 | dcfg = gem_readl(bp, DCFG1); | 2228 | dcfg = gem_readl(bp, DCFG1); |
@@ -2201,10 +2233,11 @@ static void macb_configure_caps(struct macb *bp, const struct macb_config *dt_co | |||
2201 | bp->caps |= MACB_CAPS_FIFO_MODE; | 2233 | bp->caps |= MACB_CAPS_FIFO_MODE; |
2202 | } | 2234 | } |
2203 | 2235 | ||
2204 | netdev_dbg(bp->dev, "Cadence caps 0x%08x\n", bp->caps); | 2236 | dev_dbg(&bp->pdev->dev, "Cadence caps 0x%08x\n", bp->caps); |
2205 | } | 2237 | } |
2206 | 2238 | ||
2207 | static void macb_probe_queues(void __iomem *mem, | 2239 | static void macb_probe_queues(void __iomem *mem, |
2240 | bool native_io, | ||
2208 | unsigned int *queue_mask, | 2241 | unsigned int *queue_mask, |
2209 | unsigned int *num_queues) | 2242 | unsigned int *num_queues) |
2210 | { | 2243 | { |
@@ -2219,7 +2252,7 @@ static void macb_probe_queues(void __iomem *mem, | |||
2219 | * we are early in the probe process and don't have the | 2252 | * we are early in the probe process and don't have the |
2220 | * MACB_CAPS_MACB_IS_GEM flag positioned | 2253 | * MACB_CAPS_MACB_IS_GEM flag positioned |
2221 | */ | 2254 | */ |
2222 | if (!macb_is_gem_hw(mem)) | 2255 | if (!hw_is_gem(mem, native_io)) |
2223 | return; | 2256 | return; |
2224 | 2257 | ||
2225 | /* bit 0 is never set but queue 0 always exists */ | 2258 | /* bit 0 is never set but queue 0 always exists */ |
@@ -2784,6 +2817,7 @@ static int macb_probe(struct platform_device *pdev) | |||
2784 | struct clk *pclk, *hclk, *tx_clk; | 2817 | struct clk *pclk, *hclk, *tx_clk; |
2785 | unsigned int queue_mask, num_queues; | 2818 | unsigned int queue_mask, num_queues; |
2786 | struct macb_platform_data *pdata; | 2819 | struct macb_platform_data *pdata; |
2820 | bool native_io; | ||
2787 | struct phy_device *phydev; | 2821 | struct phy_device *phydev; |
2788 | struct net_device *dev; | 2822 | struct net_device *dev; |
2789 | struct resource *regs; | 2823 | struct resource *regs; |
@@ -2792,6 +2826,11 @@ static int macb_probe(struct platform_device *pdev) | |||
2792 | struct macb *bp; | 2826 | struct macb *bp; |
2793 | int err; | 2827 | int err; |
2794 | 2828 | ||
2829 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
2830 | mem = devm_ioremap_resource(&pdev->dev, regs); | ||
2831 | if (IS_ERR(mem)) | ||
2832 | return PTR_ERR(mem); | ||
2833 | |||
2795 | if (np) { | 2834 | if (np) { |
2796 | const struct of_device_id *match; | 2835 | const struct of_device_id *match; |
2797 | 2836 | ||
@@ -2807,14 +2846,9 @@ static int macb_probe(struct platform_device *pdev) | |||
2807 | if (err) | 2846 | if (err) |
2808 | return err; | 2847 | return err; |
2809 | 2848 | ||
2810 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2849 | native_io = hw_is_native_io(mem); |
2811 | mem = devm_ioremap_resource(&pdev->dev, regs); | ||
2812 | if (IS_ERR(mem)) { | ||
2813 | err = PTR_ERR(mem); | ||
2814 | goto err_disable_clocks; | ||
2815 | } | ||
2816 | 2850 | ||
2817 | macb_probe_queues(mem, &queue_mask, &num_queues); | 2851 | macb_probe_queues(mem, native_io, &queue_mask, &num_queues); |
2818 | dev = alloc_etherdev_mq(sizeof(*bp), num_queues); | 2852 | dev = alloc_etherdev_mq(sizeof(*bp), num_queues); |
2819 | if (!dev) { | 2853 | if (!dev) { |
2820 | err = -ENOMEM; | 2854 | err = -ENOMEM; |
@@ -2829,6 +2863,14 @@ static int macb_probe(struct platform_device *pdev) | |||
2829 | bp->pdev = pdev; | 2863 | bp->pdev = pdev; |
2830 | bp->dev = dev; | 2864 | bp->dev = dev; |
2831 | bp->regs = mem; | 2865 | bp->regs = mem; |
2866 | bp->native_io = native_io; | ||
2867 | if (native_io) { | ||
2868 | bp->macb_reg_readl = hw_readl_native; | ||
2869 | bp->macb_reg_writel = hw_writel_native; | ||
2870 | } else { | ||
2871 | bp->macb_reg_readl = hw_readl; | ||
2872 | bp->macb_reg_writel = hw_writel; | ||
2873 | } | ||
2832 | bp->num_queues = num_queues; | 2874 | bp->num_queues = num_queues; |
2833 | bp->queue_mask = queue_mask; | 2875 | bp->queue_mask = queue_mask; |
2834 | if (macb_config) | 2876 | if (macb_config) |
@@ -2836,9 +2878,8 @@ static int macb_probe(struct platform_device *pdev) | |||
2836 | bp->pclk = pclk; | 2878 | bp->pclk = pclk; |
2837 | bp->hclk = hclk; | 2879 | bp->hclk = hclk; |
2838 | bp->tx_clk = tx_clk; | 2880 | bp->tx_clk = tx_clk; |
2839 | if (macb_config->jumbo_max_len) { | 2881 | if (macb_config) |
2840 | bp->jumbo_max_len = macb_config->jumbo_max_len; | 2882 | bp->jumbo_max_len = macb_config->jumbo_max_len; |
2841 | } | ||
2842 | 2883 | ||
2843 | spin_lock_init(&bp->lock); | 2884 | spin_lock_init(&bp->lock); |
2844 | 2885 | ||