kernel: add Intel/Lantiq VRX518 TC driver
[openwrt/staging/dedeckeh.git] / package / kernel / lantiq / vrx518_tc / patches / 203-dbg.patch
1 --- a/dcdp/platform/sw_plat.c
2 +++ b/dcdp/platform/sw_plat.c
3 @@ -85,6 +85,7 @@ struct aca_ring {
4 u32 dnum;
5 u32 dsize;
6 int idx; /* SoC RX/TX index */
7 + u64 cnt;
8 int ep_dev_idx;
9 };
10
11 @@ -210,6 +211,8 @@ struct plat_priv {
12 struct net_device *netdev;
13 struct napi_struct *napi_tx;
14 struct napi_struct *napi_rx;
15 + u64 napi_tx_stats[NAPI_POLL_WEIGHT+1];
16 + u64 napi_rx_stats[NAPI_POLL_WEIGHT+1];
17 DECLARE_HASHTABLE(mem_map, 8);
18 };
19
20 @@ -362,6 +365,7 @@ static void txlist_free(struct tx_list *
21 static inline void ring_idx_inc(struct aca_ring *ring)
22 {
23 ring->idx = (ring->idx + 1) % ring->dnum;
24 + ring->cnt += 1;
25 }
26
27 static struct sk_buff *txin_skb_prepare(struct sk_buff *skb)
28 @@ -619,6 +623,8 @@ static int plat_txout_napi(struct napi_s
29
30 cnt = txout_action(tcpriv, txout, budget);
31
32 + priv->napi_tx_stats[cnt] += 1;
33 +
34 if (cnt < budget) {
35 if (napi_complete_done(napi, cnt))
36 ep_dev->hw_ops->icu_en(ep_dev, ACA_HOSTIF_TX);
37 @@ -653,6 +659,8 @@ static int plat_rxout_napi(struct napi_s
38 if (cnt)
39 rxin_action(tcpriv, rxin, DMA_PACKET_SZ, cnt);
40
41 + priv->napi_rx_stats[cnt] += 1;
42 +
43 if (cnt < budget) {
44 if (napi_complete_done(napi, cnt))
45 ep_dev->hw_ops->icu_en(ep_dev, ACA_HOSTIF_RX);
46 @@ -1092,6 +1100,56 @@ static int plat_soc_cfg_get(struct soc_c
47 return 0;
48 }
49
50 +static struct proc_dir_entry *g_proc_entry;
51 +
52 +static int proc_show(struct seq_file *m, void *p)
53 +{
54 + struct aca_ring *txin = &g_plat_priv->soc_rings.txin;
55 + struct aca_ring *txout = &g_plat_priv->soc_rings.txout;
56 + struct aca_ring *rxin = &g_plat_priv->soc_rings.rxin;
57 + struct aca_ring *rxout = &g_plat_priv->soc_rings.rxout;
58 + int i;
59 +
60 + seq_printf(m, "napi_tx_stats: ");
61 + for (i = 0; i < sizeof(g_plat_priv->napi_tx_stats) / sizeof(g_plat_priv->napi_tx_stats[0]); i++) {
62 + if (i == 0) {
63 + seq_printf(m, "%llu", g_plat_priv->napi_tx_stats[i]);
64 + } else {
65 + seq_printf(m, ", %llu", g_plat_priv->napi_tx_stats[i]);
66 + }
67 + }
68 + seq_printf(m, "\n");
69 +
70 + seq_printf(m, "napi_rx_stats: ");
71 + for (i = 0; i < sizeof(g_plat_priv->napi_rx_stats) / sizeof(g_plat_priv->napi_rx_stats[0]); i++) {
72 + if (i == 0) {
73 + seq_printf(m, "%llu", g_plat_priv->napi_rx_stats[i]);
74 + } else {
75 + seq_printf(m, ", %llu", g_plat_priv->napi_rx_stats[i]);
76 + }
77 + }
78 + seq_printf(m, "\n");
79 +
80 + seq_printf(m, "txin: %d/%u, %llu\n", txin->idx, txin->dnum, txin->cnt);
81 + seq_printf(m, "txout: %d/%u, %llu\n", txout->idx, txout->dnum, txout->cnt);
82 + seq_printf(m, "rxin: %d/%u, %llu\n", rxin->idx, rxin->dnum, rxin->cnt);
83 + seq_printf(m, "rxout: %d/%u, %llu\n", rxout->idx, rxout->dnum, rxout->cnt);
84 +
85 + return 0;
86 +}
87 +
88 +static int proc_open(struct inode *inode, struct file *file)
89 +{
90 + return single_open(file, proc_show, NULL);
91 +}
92 +
93 +static struct proc_ops proc_operations = {
94 + .proc_open = proc_open,
95 + .proc_read = seq_read,
96 + .proc_lseek = seq_lseek,
97 + .proc_release = single_release
98 +};
99 +
100 static int plat_open(struct net_device *pdev, const char *dev_name,
101 struct napi_struct *napi_tx, struct napi_struct *napi_rx,
102 int id, int flag)
103 @@ -1099,6 +1157,8 @@ static int plat_open(struct net_device *
104 struct tc_priv *priv = g_plat_priv->tc_priv;
105 int i;
106
107 + g_proc_entry = proc_create("swplat", 0600, priv->proc_dir, &proc_operations);
108 +
109 for (i = 0; i < EP_MAX_NUM && i < priv->ep_num; i++) {
110 disable_irq(priv->ep_dev[i].aca_rx_irq);
111 disable_irq(priv->ep_dev[i].aca_tx_irq);
112 @@ -1137,6 +1197,8 @@ static void plat_close(struct net_device
113 enable_irq(priv->ep_dev[i].aca_tx_irq);
114 }
115
116 + proc_remove(g_proc_entry);
117 +
118 return;
119 }
120