diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/chain_mode.c | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/common.h | 20 | ||||
-rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/ring_mode.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 56 |
4 files changed, 34 insertions, 53 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/chain_mode.c b/drivers/net/ethernet/stmicro/stmmac/chain_mode.c index 72d282bf33a5..c553f6b5a913 100644 --- a/drivers/net/ethernet/stmicro/stmmac/chain_mode.c +++ b/drivers/net/ethernet/stmicro/stmmac/chain_mode.c | |||
@@ -151,7 +151,7 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p) | |||
151 | sizeof(struct dma_desc))); | 151 | sizeof(struct dma_desc))); |
152 | } | 152 | } |
153 | 153 | ||
154 | const struct stmmac_chain_mode_ops chain_mode_ops = { | 154 | const struct stmmac_mode_ops chain_mode_ops = { |
155 | .init = stmmac_init_dma_chain, | 155 | .init = stmmac_init_dma_chain, |
156 | .is_jumbo_frm = stmmac_is_jumbo_frm, | 156 | .is_jumbo_frm = stmmac_is_jumbo_frm, |
157 | .jumbo_frm = stmmac_jumbo_frm, | 157 | .jumbo_frm = stmmac_jumbo_frm, |
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h index 7834a3993946..74610f3aca9e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/common.h +++ b/drivers/net/ethernet/stmicro/stmmac/common.h | |||
@@ -419,20 +419,13 @@ struct mii_regs { | |||
419 | unsigned int data; /* MII Data */ | 419 | unsigned int data; /* MII Data */ |
420 | }; | 420 | }; |
421 | 421 | ||
422 | struct stmmac_ring_mode_ops { | 422 | struct stmmac_mode_ops { |
423 | unsigned int (*is_jumbo_frm) (int len, int ehn_desc); | ||
424 | unsigned int (*jumbo_frm) (void *priv, struct sk_buff *skb, int csum); | ||
425 | void (*refill_desc3) (void *priv, struct dma_desc *p); | ||
426 | void (*init_desc3) (struct dma_desc *p); | ||
427 | void (*clean_desc3) (void *priv, struct dma_desc *p); | ||
428 | int (*set_16kib_bfsize) (int mtu); | ||
429 | }; | ||
430 | |||
431 | struct stmmac_chain_mode_ops { | ||
432 | void (*init) (void *des, dma_addr_t phy_addr, unsigned int size, | 423 | void (*init) (void *des, dma_addr_t phy_addr, unsigned int size, |
433 | unsigned int extend_desc); | 424 | unsigned int extend_desc); |
434 | unsigned int (*is_jumbo_frm) (int len, int ehn_desc); | 425 | unsigned int (*is_jumbo_frm) (int len, int ehn_desc); |
435 | unsigned int (*jumbo_frm) (void *priv, struct sk_buff *skb, int csum); | 426 | unsigned int (*jumbo_frm) (void *priv, struct sk_buff *skb, int csum); |
427 | int (*set_16kib_bfsize)(int mtu); | ||
428 | void (*init_desc3)(struct dma_desc *p); | ||
436 | void (*refill_desc3) (void *priv, struct dma_desc *p); | 429 | void (*refill_desc3) (void *priv, struct dma_desc *p); |
437 | void (*clean_desc3) (void *priv, struct dma_desc *p); | 430 | void (*clean_desc3) (void *priv, struct dma_desc *p); |
438 | }; | 431 | }; |
@@ -441,8 +434,7 @@ struct mac_device_info { | |||
441 | const struct stmmac_ops *mac; | 434 | const struct stmmac_ops *mac; |
442 | const struct stmmac_desc_ops *desc; | 435 | const struct stmmac_desc_ops *desc; |
443 | const struct stmmac_dma_ops *dma; | 436 | const struct stmmac_dma_ops *dma; |
444 | const struct stmmac_ring_mode_ops *ring; | 437 | const struct stmmac_mode_ops *mode; |
445 | const struct stmmac_chain_mode_ops *chain; | ||
446 | const struct stmmac_hwtimestamp *ptp; | 438 | const struct stmmac_hwtimestamp *ptp; |
447 | struct mii_regs mii; /* MII register Addresses */ | 439 | struct mii_regs mii; /* MII register Addresses */ |
448 | struct mac_link link; | 440 | struct mac_link link; |
@@ -460,7 +452,7 @@ void stmmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr, | |||
460 | void stmmac_set_mac(void __iomem *ioaddr, bool enable); | 452 | void stmmac_set_mac(void __iomem *ioaddr, bool enable); |
461 | 453 | ||
462 | void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr); | 454 | void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr); |
463 | extern const struct stmmac_ring_mode_ops ring_mode_ops; | 455 | extern const struct stmmac_mode_ops ring_mode_ops; |
464 | extern const struct stmmac_chain_mode_ops chain_mode_ops; | 456 | extern const struct stmmac_mode_ops chain_mode_ops; |
465 | 457 | ||
466 | #endif /* __COMMON_H__ */ | 458 | #endif /* __COMMON_H__ */ |
diff --git a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c index a96c7c2f5f3f..650a4be6bce5 100644 --- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c +++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c | |||
@@ -100,10 +100,9 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p) | |||
100 | { | 100 | { |
101 | struct stmmac_priv *priv = (struct stmmac_priv *)priv_ptr; | 101 | struct stmmac_priv *priv = (struct stmmac_priv *)priv_ptr; |
102 | 102 | ||
103 | if (unlikely(priv->plat->has_gmac)) | 103 | /* Fill DES3 in case of RING mode */ |
104 | /* Fill DES3 in case of RING mode */ | 104 | if (priv->dma_buf_sz >= BUF_SIZE_8KiB) |
105 | if (priv->dma_buf_sz >= BUF_SIZE_8KiB) | 105 | p->des3 = p->des2 + BUF_SIZE_8KiB; |
106 | p->des3 = p->des2 + BUF_SIZE_8KiB; | ||
107 | } | 106 | } |
108 | 107 | ||
109 | /* In ring mode we need to fill the desc3 because it is used as buffer */ | 108 | /* In ring mode we need to fill the desc3 because it is used as buffer */ |
@@ -126,7 +125,7 @@ static int stmmac_set_16kib_bfsize(int mtu) | |||
126 | return ret; | 125 | return ret; |
127 | } | 126 | } |
128 | 127 | ||
129 | const struct stmmac_ring_mode_ops ring_mode_ops = { | 128 | const struct stmmac_mode_ops ring_mode_ops = { |
130 | .is_jumbo_frm = stmmac_is_jumbo_frm, | 129 | .is_jumbo_frm = stmmac_is_jumbo_frm, |
131 | .jumbo_frm = stmmac_jumbo_frm, | 130 | .jumbo_frm = stmmac_jumbo_frm, |
132 | .refill_desc3 = stmmac_refill_desc3, | 131 | .refill_desc3 = stmmac_refill_desc3, |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 536583655643..8543e1cfd55e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -966,9 +966,9 @@ static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p, | |||
966 | 966 | ||
967 | p->des2 = priv->rx_skbuff_dma[i]; | 967 | p->des2 = priv->rx_skbuff_dma[i]; |
968 | 968 | ||
969 | if ((priv->mode == STMMAC_RING_MODE) && | 969 | if ((priv->hw->mode->init_desc3) && |
970 | (priv->dma_buf_sz == BUF_SIZE_16KiB)) | 970 | (priv->dma_buf_sz == BUF_SIZE_16KiB)) |
971 | priv->hw->ring->init_desc3(p); | 971 | priv->hw->mode->init_desc3(p); |
972 | 972 | ||
973 | return 0; | 973 | return 0; |
974 | } | 974 | } |
@@ -999,11 +999,8 @@ static int init_dma_desc_rings(struct net_device *dev) | |||
999 | unsigned int bfsize = 0; | 999 | unsigned int bfsize = 0; |
1000 | int ret = -ENOMEM; | 1000 | int ret = -ENOMEM; |
1001 | 1001 | ||
1002 | /* Set the max buffer size according to the DESC mode | 1002 | if (priv->hw->mode->set_16kib_bfsize) |
1003 | * and the MTU. Note that RING mode allows 16KiB bsize. | 1003 | bfsize = priv->hw->mode->set_16kib_bfsize(dev->mtu); |
1004 | */ | ||
1005 | if (priv->mode == STMMAC_RING_MODE) | ||
1006 | bfsize = priv->hw->ring->set_16kib_bfsize(dev->mtu); | ||
1007 | 1004 | ||
1008 | if (bfsize < BUF_SIZE_16KiB) | 1005 | if (bfsize < BUF_SIZE_16KiB) |
1009 | bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); | 1006 | bfsize = stmmac_set_bfsize(dev->mtu, priv->dma_buf_sz); |
@@ -1044,15 +1041,15 @@ static int init_dma_desc_rings(struct net_device *dev) | |||
1044 | /* Setup the chained descriptor addresses */ | 1041 | /* Setup the chained descriptor addresses */ |
1045 | if (priv->mode == STMMAC_CHAIN_MODE) { | 1042 | if (priv->mode == STMMAC_CHAIN_MODE) { |
1046 | if (priv->extend_desc) { | 1043 | if (priv->extend_desc) { |
1047 | priv->hw->chain->init(priv->dma_erx, priv->dma_rx_phy, | 1044 | priv->hw->mode->init(priv->dma_erx, priv->dma_rx_phy, |
1048 | rxsize, 1); | 1045 | rxsize, 1); |
1049 | priv->hw->chain->init(priv->dma_etx, priv->dma_tx_phy, | 1046 | priv->hw->mode->init(priv->dma_etx, priv->dma_tx_phy, |
1050 | txsize, 1); | 1047 | txsize, 1); |
1051 | } else { | 1048 | } else { |
1052 | priv->hw->chain->init(priv->dma_rx, priv->dma_rx_phy, | 1049 | priv->hw->mode->init(priv->dma_rx, priv->dma_rx_phy, |
1053 | rxsize, 0); | 1050 | rxsize, 0); |
1054 | priv->hw->chain->init(priv->dma_tx, priv->dma_tx_phy, | 1051 | priv->hw->mode->init(priv->dma_tx, priv->dma_tx_phy, |
1055 | txsize, 0); | 1052 | txsize, 0); |
1056 | } | 1053 | } |
1057 | } | 1054 | } |
1058 | 1055 | ||
@@ -1303,7 +1300,7 @@ static void stmmac_tx_clean(struct stmmac_priv *priv) | |||
1303 | DMA_TO_DEVICE); | 1300 | DMA_TO_DEVICE); |
1304 | priv->tx_skbuff_dma[entry] = 0; | 1301 | priv->tx_skbuff_dma[entry] = 0; |
1305 | } | 1302 | } |
1306 | priv->hw->ring->clean_desc3(priv, p); | 1303 | priv->hw->mode->clean_desc3(priv, p); |
1307 | 1304 | ||
1308 | if (likely(skb != NULL)) { | 1305 | if (likely(skb != NULL)) { |
1309 | dev_kfree_skb(skb); | 1306 | dev_kfree_skb(skb); |
@@ -1859,6 +1856,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1859 | int nfrags = skb_shinfo(skb)->nr_frags; | 1856 | int nfrags = skb_shinfo(skb)->nr_frags; |
1860 | struct dma_desc *desc, *first; | 1857 | struct dma_desc *desc, *first; |
1861 | unsigned int nopaged_len = skb_headlen(skb); | 1858 | unsigned int nopaged_len = skb_headlen(skb); |
1859 | unsigned int enh_desc = priv->plat->enh_desc; | ||
1862 | 1860 | ||
1863 | if (unlikely(stmmac_tx_avail(priv) < nfrags + 1)) { | 1861 | if (unlikely(stmmac_tx_avail(priv) < nfrags + 1)) { |
1864 | if (!netif_queue_stopped(dev)) { | 1862 | if (!netif_queue_stopped(dev)) { |
@@ -1886,27 +1884,19 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1886 | first = desc; | 1884 | first = desc; |
1887 | 1885 | ||
1888 | /* To program the descriptors according to the size of the frame */ | 1886 | /* To program the descriptors according to the size of the frame */ |
1889 | if (priv->mode == STMMAC_RING_MODE) { | 1887 | if (enh_desc) |
1890 | is_jumbo = priv->hw->ring->is_jumbo_frm(skb->len, | 1888 | is_jumbo = priv->hw->mode->is_jumbo_frm(skb->len, enh_desc); |
1891 | priv->plat->enh_desc); | 1889 | |
1892 | if (unlikely(is_jumbo)) | ||
1893 | entry = priv->hw->ring->jumbo_frm(priv, skb, | ||
1894 | csum_insertion); | ||
1895 | } else { | ||
1896 | is_jumbo = priv->hw->chain->is_jumbo_frm(skb->len, | ||
1897 | priv->plat->enh_desc); | ||
1898 | if (unlikely(is_jumbo)) | ||
1899 | entry = priv->hw->chain->jumbo_frm(priv, skb, | ||
1900 | csum_insertion); | ||
1901 | } | ||
1902 | if (likely(!is_jumbo)) { | 1890 | if (likely(!is_jumbo)) { |
1903 | desc->des2 = dma_map_single(priv->device, skb->data, | 1891 | desc->des2 = dma_map_single(priv->device, skb->data, |
1904 | nopaged_len, DMA_TO_DEVICE); | 1892 | nopaged_len, DMA_TO_DEVICE); |
1905 | priv->tx_skbuff_dma[entry] = desc->des2; | 1893 | priv->tx_skbuff_dma[entry] = desc->des2; |
1906 | priv->hw->desc->prepare_tx_desc(desc, 1, nopaged_len, | 1894 | priv->hw->desc->prepare_tx_desc(desc, 1, nopaged_len, |
1907 | csum_insertion, priv->mode); | 1895 | csum_insertion, priv->mode); |
1908 | } else | 1896 | } else { |
1909 | desc = first; | 1897 | desc = first; |
1898 | entry = priv->hw->mode->jumbo_frm(priv, skb, csum_insertion); | ||
1899 | } | ||
1910 | 1900 | ||
1911 | for (i = 0; i < nfrags; i++) { | 1901 | for (i = 0; i < nfrags; i++) { |
1912 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 1902 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
@@ -2044,7 +2034,7 @@ static inline void stmmac_rx_refill(struct stmmac_priv *priv) | |||
2044 | 2034 | ||
2045 | p->des2 = priv->rx_skbuff_dma[entry]; | 2035 | p->des2 = priv->rx_skbuff_dma[entry]; |
2046 | 2036 | ||
2047 | priv->hw->ring->refill_desc3(priv, p); | 2037 | priv->hw->mode->refill_desc3(priv, p); |
2048 | 2038 | ||
2049 | if (netif_msg_rx_status(priv)) | 2039 | if (netif_msg_rx_status(priv)) |
2050 | pr_debug("\trefill entry #%d\n", entry); | 2040 | pr_debug("\trefill entry #%d\n", entry); |
@@ -2648,11 +2638,11 @@ static int stmmac_hw_init(struct stmmac_priv *priv) | |||
2648 | 2638 | ||
2649 | /* To use the chained or ring mode */ | 2639 | /* To use the chained or ring mode */ |
2650 | if (chain_mode) { | 2640 | if (chain_mode) { |
2651 | priv->hw->chain = &chain_mode_ops; | 2641 | priv->hw->mode = &chain_mode_ops; |
2652 | pr_info(" Chain mode enabled\n"); | 2642 | pr_info(" Chain mode enabled\n"); |
2653 | priv->mode = STMMAC_CHAIN_MODE; | 2643 | priv->mode = STMMAC_CHAIN_MODE; |
2654 | } else { | 2644 | } else { |
2655 | priv->hw->ring = &ring_mode_ops; | 2645 | priv->hw->mode = &ring_mode_ops; |
2656 | pr_info(" Ring mode enabled\n"); | 2646 | pr_info(" Ring mode enabled\n"); |
2657 | priv->mode = STMMAC_RING_MODE; | 2647 | priv->mode = STMMAC_RING_MODE; |
2658 | } | 2648 | } |