Skip to content

Commit f6e135c

Browse files
mugunthanvnmdavem330
authored andcommitted
driver: net: ethernet: davinci_cpdma: add support for directed packet and source port detection
* Introduced parameter to add port number for directed packet in cpdma_chan_submit * Source port detection macro with DMA descriptor status Signed-off-by: Mugunthan V N <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 570617e commit f6e135c

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

drivers/net/ethernet/ti/cpsw.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ void cpsw_rx_handler(void *token, int len, int status)
424424
return;
425425

426426
ret = cpdma_chan_submit(priv->rxch, skb, skb->data,
427-
skb_tailroom(skb), GFP_KERNEL);
427+
skb_tailroom(skb), 0, GFP_KERNEL);
428428
}
429429
WARN_ON(ret < 0);
430430
}
@@ -705,7 +705,7 @@ static int cpsw_ndo_open(struct net_device *ndev)
705705
if (!skb)
706706
break;
707707
ret = cpdma_chan_submit(priv->rxch, skb, skb->data,
708-
skb_tailroom(skb), GFP_KERNEL);
708+
skb_tailroom(skb), 0, GFP_KERNEL);
709709
if (WARN_ON(ret < 0))
710710
break;
711711
}
@@ -766,7 +766,7 @@ static netdev_tx_t cpsw_ndo_start_xmit(struct sk_buff *skb,
766766
skb_tx_timestamp(skb);
767767

768768
ret = cpdma_chan_submit(priv->txch, skb, skb->data,
769-
skb->len, GFP_KERNEL);
769+
skb->len, 0, GFP_KERNEL);
770770
if (unlikely(ret != 0)) {
771771
cpsw_err(priv, tx_err, "desc submit failed\n");
772772
goto fail;

drivers/net/ethernet/ti/davinci_cpdma.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@
6060
#define CPDMA_DESC_EOQ BIT(28)
6161
#define CPDMA_DESC_TD_COMPLETE BIT(27)
6262
#define CPDMA_DESC_PASS_CRC BIT(26)
63+
#define CPDMA_DESC_TO_PORT_EN BIT(20)
64+
#define CPDMA_TO_PORT_SHIFT 16
65+
#define CPDMA_DESC_PORT_MASK (BIT(18) | BIT(17) | BIT(16))
6366

6467
#define CPDMA_TEARDOWN_VALUE 0xfffffffc
6568

@@ -132,6 +135,14 @@ struct cpdma_chan {
132135
#define chan_write(chan, fld, v) __raw_writel(v, (chan)->fld)
133136
#define desc_write(desc, fld, v) __raw_writel((u32)(v), &(desc)->fld)
134137

138+
#define cpdma_desc_to_port(chan, mode, directed) \
139+
do { \
140+
if (!is_rx_chan(chan) && ((directed == 1) || \
141+
(directed == 2))) \
142+
mode |= (CPDMA_DESC_TO_PORT_EN | \
143+
(directed << CPDMA_TO_PORT_SHIFT)); \
144+
} while (0)
145+
135146
/*
136147
* Utility constructs for a cpdma descriptor pool. Some devices (e.g. davinci
137148
* emac) have dedicated on-chip memory for these descriptors. Some other
@@ -662,7 +673,7 @@ static void __cpdma_chan_submit(struct cpdma_chan *chan,
662673
}
663674

664675
int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data,
665-
int len, gfp_t gfp_mask)
676+
int len, int directed, gfp_t gfp_mask)
666677
{
667678
struct cpdma_ctlr *ctlr = chan->ctlr;
668679
struct cpdma_desc __iomem *desc;
@@ -692,6 +703,7 @@ int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data,
692703

693704
buffer = dma_map_single(ctlr->dev, data, len, chan->dir);
694705
mode = CPDMA_DESC_OWNER | CPDMA_DESC_SOP | CPDMA_DESC_EOP;
706+
cpdma_desc_to_port(chan, mode, directed);
695707

696708
desc_write(desc, hw_next, 0);
697709
desc_write(desc, hw_buffer, buffer);
@@ -782,7 +794,8 @@ static int __cpdma_chan_process(struct cpdma_chan *chan)
782794
status = -EBUSY;
783795
goto unlock_ret;
784796
}
785-
status = status & (CPDMA_DESC_EOQ | CPDMA_DESC_TD_COMPLETE);
797+
status = status & (CPDMA_DESC_EOQ | CPDMA_DESC_TD_COMPLETE |
798+
CPDMA_DESC_PORT_MASK);
786799

787800
chan->head = desc_from_phys(pool, desc_read(desc, hw_next));
788801
chan_write(chan, cp, desc_dma);

drivers/net/ethernet/ti/davinci_cpdma.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#define __chan_linear(chan_num) ((chan_num) & (CPDMA_MAX_CHANNELS - 1))
2525
#define chan_linear(chan) __chan_linear((chan)->chan_num)
2626

27+
#define CPDMA_RX_SOURCE_PORT(__status__) ((__status__ >> 16) & 0x7)
28+
2729
struct cpdma_params {
2830
struct device *dev;
2931
void __iomem *dmaregs;
@@ -82,7 +84,7 @@ int cpdma_chan_dump(struct cpdma_chan *chan);
8284
int cpdma_chan_get_stats(struct cpdma_chan *chan,
8385
struct cpdma_chan_stats *stats);
8486
int cpdma_chan_submit(struct cpdma_chan *chan, void *token, void *data,
85-
int len, gfp_t gfp_mask);
87+
int len, int directed, gfp_t gfp_mask);
8688
int cpdma_chan_process(struct cpdma_chan *chan, int quota);
8789

8890
int cpdma_ctlr_int_ctrl(struct cpdma_ctlr *ctlr, bool enable);

drivers/net/ethernet/ti/davinci_emac.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ static void emac_rx_handler(void *token, int len, int status)
10371037

10381038
recycle:
10391039
ret = cpdma_chan_submit(priv->rxchan, skb, skb->data,
1040-
skb_tailroom(skb), GFP_KERNEL);
1040+
skb_tailroom(skb), 0, GFP_KERNEL);
10411041

10421042
WARN_ON(ret == -ENOMEM);
10431043
if (unlikely(ret < 0))
@@ -1092,7 +1092,7 @@ static int emac_dev_xmit(struct sk_buff *skb, struct net_device *ndev)
10921092
skb_tx_timestamp(skb);
10931093

10941094
ret_code = cpdma_chan_submit(priv->txchan, skb, skb->data, skb->len,
1095-
GFP_KERNEL);
1095+
0, GFP_KERNEL);
10961096
if (unlikely(ret_code != 0)) {
10971097
if (netif_msg_tx_err(priv) && net_ratelimit())
10981098
dev_err(emac_dev, "DaVinci EMAC: desc submit failed");
@@ -1558,7 +1558,7 @@ static int emac_dev_open(struct net_device *ndev)
15581558
break;
15591559

15601560
ret = cpdma_chan_submit(priv->rxchan, skb, skb->data,
1561-
skb_tailroom(skb), GFP_KERNEL);
1561+
skb_tailroom(skb), 0, GFP_KERNEL);
15621562
if (WARN_ON(ret < 0))
15631563
break;
15641564
}

0 commit comments

Comments
 (0)