aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/freescale
diff options
context:
space:
mode:
authorFugang Duan <B38611@freescale.com>2014-09-12 17:00:54 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-13 17:32:17 -0400
commit41ef84ce4c7231ecdf6f116f03635d2a184bc5ba (patch)
tree1e4c620e527cbf79a49848bb76f39477627f76e1 /drivers/net/ethernet/freescale
parentba593e00e645a8522a97a14a90a176d53629976e (diff)
net: fec: change FEC alignment according to i.mx6 sx requirement
i.MX6 SX change FEC alignment requirement. i.MX6 SX change internal bus from AHB to AXI. It require RX buffer must be 64 bytes alignment. And remove TX buffer alignment requirement. Signed-off-by: Fugang Duan <B38611@freescale.com> Signed-off-by: Frank Li <Frank.Li@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/freescale')
-rw-r--r--drivers/net/ethernet/freescale/fec.h3
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c35
2 files changed, 27 insertions, 11 deletions
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index 5ec382887d4a..b7c77229f1e9 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -443,6 +443,9 @@ struct fec_enet_private {
443 int hwts_tx_en; 443 int hwts_tx_en;
444 struct delayed_work time_keep; 444 struct delayed_work time_keep;
445 struct regulator *reg_phy; 445 struct regulator *reg_phy;
446
447 unsigned int tx_align;
448 unsigned int rx_align;
446}; 449};
447 450
448void fec_ptp_init(struct platform_device *pdev); 451void fec_ptp_init(struct platform_device *pdev);
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 0cc7313944f5..9840a10d07c6 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -64,12 +64,6 @@
64 64
65static void set_multicast_list(struct net_device *ndev); 65static void set_multicast_list(struct net_device *ndev);
66 66
67#if defined(CONFIG_ARM)
68#define FEC_ALIGNMENT 0xf
69#else
70#define FEC_ALIGNMENT 0x3
71#endif
72
73#define DRIVER_NAME "fec" 67#define DRIVER_NAME "fec"
74 68
75#define FEC_ENET_GET_QUQUE(_x) ((_x == 0) ? 1 : ((_x == 1) ? 2 : 0)) 69#define FEC_ENET_GET_QUQUE(_x) ((_x == 0) ? 1 : ((_x == 1) ? 2 : 0))
@@ -434,7 +428,7 @@ fec_enet_txq_submit_frag_skb(struct fec_enet_priv_tx_q *txq,
434 bufaddr = page_address(this_frag->page.p) + this_frag->page_offset; 428 bufaddr = page_address(this_frag->page.p) + this_frag->page_offset;
435 429
436 index = fec_enet_get_bd_index(txq->tx_bd_base, bdp, fep); 430 index = fec_enet_get_bd_index(txq->tx_bd_base, bdp, fep);
437 if (((unsigned long) bufaddr) & FEC_ALIGNMENT || 431 if (((unsigned long) bufaddr) & fep->tx_align ||
438 id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) { 432 id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) {
439 memcpy(txq->tx_bounce[index], bufaddr, frag_len); 433 memcpy(txq->tx_bounce[index], bufaddr, frag_len);
440 bufaddr = txq->tx_bounce[index]; 434 bufaddr = txq->tx_bounce[index];
@@ -514,7 +508,7 @@ static int fec_enet_txq_submit_skb(struct fec_enet_priv_tx_q *txq,
514 508
515 queue = skb_get_queue_mapping(skb); 509 queue = skb_get_queue_mapping(skb);
516 index = fec_enet_get_bd_index(txq->tx_bd_base, bdp, fep); 510 index = fec_enet_get_bd_index(txq->tx_bd_base, bdp, fep);
517 if (((unsigned long) bufaddr) & FEC_ALIGNMENT || 511 if (((unsigned long) bufaddr) & fep->tx_align ||
518 id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) { 512 id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) {
519 memcpy(txq->tx_bounce[index], skb->data, buflen); 513 memcpy(txq->tx_bounce[index], skb->data, buflen);
520 bufaddr = txq->tx_bounce[index]; 514 bufaddr = txq->tx_bounce[index];
@@ -607,7 +601,7 @@ fec_enet_txq_put_data_tso(struct fec_enet_priv_tx_q *txq, struct sk_buff *skb,
607 601
608 status |= (BD_ENET_TX_TC | BD_ENET_TX_READY); 602 status |= (BD_ENET_TX_TC | BD_ENET_TX_READY);
609 603
610 if (((unsigned long) data) & FEC_ALIGNMENT || 604 if (((unsigned long) data) & fep->tx_align ||
611 id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) { 605 id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) {
612 memcpy(txq->tx_bounce[index], data, size); 606 memcpy(txq->tx_bounce[index], data, size);
613 data = txq->tx_bounce[index]; 607 data = txq->tx_bounce[index];
@@ -669,7 +663,7 @@ fec_enet_txq_put_hdr_tso(struct fec_enet_priv_tx_q *txq,
669 663
670 bufaddr = txq->tso_hdrs + index * TSO_HEADER_SIZE; 664 bufaddr = txq->tso_hdrs + index * TSO_HEADER_SIZE;
671 dmabuf = txq->tso_hdrs_dma + index * TSO_HEADER_SIZE; 665 dmabuf = txq->tso_hdrs_dma + index * TSO_HEADER_SIZE;
672 if (((unsigned long) bufaddr) & FEC_ALIGNMENT || 666 if (((unsigned long)bufaddr) & fep->tx_align ||
673 id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) { 667 id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) {
674 memcpy(txq->tx_bounce[index], skb->data, hdr_len); 668 memcpy(txq->tx_bounce[index], skb->data, hdr_len);
675 bufaddr = txq->tx_bounce[index]; 669 bufaddr = txq->tx_bounce[index];
@@ -2399,6 +2393,7 @@ fec_enet_alloc_rxq_buffers(struct net_device *ndev, unsigned int queue)
2399 struct sk_buff *skb; 2393 struct sk_buff *skb;
2400 struct bufdesc *bdp; 2394 struct bufdesc *bdp;
2401 struct fec_enet_priv_rx_q *rxq; 2395 struct fec_enet_priv_rx_q *rxq;
2396 unsigned int off;
2402 2397
2403 rxq = fep->rx_queue[queue]; 2398 rxq = fep->rx_queue[queue];
2404 bdp = rxq->rx_bd_base; 2399 bdp = rxq->rx_bd_base;
@@ -2409,8 +2404,13 @@ fec_enet_alloc_rxq_buffers(struct net_device *ndev, unsigned int queue)
2409 if (!skb) 2404 if (!skb)
2410 goto err_alloc; 2405 goto err_alloc;
2411 2406
2407 off = ((unsigned long)skb->data) & fep->rx_align;
2408 if (off)
2409 skb_reserve(skb, fep->rx_align + 1 - off);
2410
2412 addr = dma_map_single(&fep->pdev->dev, skb->data, 2411 addr = dma_map_single(&fep->pdev->dev, skb->data,
2413 FEC_ENET_RX_FRSIZE, DMA_FROM_DEVICE); 2412 FEC_ENET_RX_FRSIZE - fep->rx_align, DMA_FROM_DEVICE);
2413
2414 if (dma_mapping_error(&fep->pdev->dev, addr)) { 2414 if (dma_mapping_error(&fep->pdev->dev, addr)) {
2415 dev_kfree_skb(skb); 2415 dev_kfree_skb(skb);
2416 if (net_ratelimit()) 2416 if (net_ratelimit())
@@ -2743,6 +2743,14 @@ static int fec_enet_init(struct net_device *ndev)
2743 int bd_size; 2743 int bd_size;
2744 unsigned int i; 2744 unsigned int i;
2745 2745
2746#if defined(CONFIG_ARM)
2747 fep->rx_align = 0xf;
2748 fep->tx_align = 0xf;
2749#else
2750 fep->rx_align = 0x3;
2751 fep->tx_align = 0x3;
2752#endif
2753
2746 fec_enet_alloc_queue(ndev); 2754 fec_enet_alloc_queue(ndev);
2747 2755
2748 if (fep->bufdesc_ex) 2756 if (fep->bufdesc_ex)
@@ -2819,6 +2827,11 @@ static int fec_enet_init(struct net_device *ndev)
2819 fep->csum_flags |= FLAG_RX_CSUM_ENABLED; 2827 fep->csum_flags |= FLAG_RX_CSUM_ENABLED;
2820 } 2828 }
2821 2829
2830 if (id_entry->driver_data & FEC_QUIRK_HAS_AVB) {
2831 fep->tx_align = 0;
2832 fep->rx_align = 0x3f;
2833 }
2834
2822 ndev->hw_features = ndev->features; 2835 ndev->hw_features = ndev->features;
2823 2836
2824 fec_restart(ndev); 2837 fec_restart(ndev);