24
24
#include "xp_common.h"
25
25
#include "xp_netdev.h"
26
26
27
- #define BYTE_MASK 0xFFU
28
- #define WORD_MASK 0xFFFFU
29
- #define DWORD_MASK 0xFFFFFFFFU
30
-
31
27
#define READ_REG 1U
32
28
#define WRITE_REG 0U
33
29
@@ -53,89 +49,17 @@ extern int xp_netdev_mode_init(void);
53
49
extern int xp_netdev_mode_deinit (void );
54
50
extern void xp_rx_skb_process (xpnet_private_t * priv , struct sk_buff * skb );
55
51
extern int xpnet_proc_create (xpnet_private_t * net_priv );
52
+ extern int xp_dev_reg_read (u32 * rw_value , u32 reg_addr ,
53
+ u8 reg_size , xp_private_t * priv );
54
+ extern int xp_dev_reg_write (u32 rw_value , u32 reg_addr ,
55
+ u8 reg_size , xp_private_t * priv );
56
56
57
57
typedef int32_t (* reg_rw_func )(xpnet_private_t * , u32 , u8 , u32 * , u32 );
58
58
59
59
xpnet_private_t * g_net_priv ;
60
60
61
61
int jiffies_defer = 5 ;
62
62
63
- int xp_dev_reg_read (u32 * rw_value , u32 reg_addr ,
64
- u8 reg_size , xp_private_t * priv )
65
- {
66
- int rc = 0 ;
67
- unsigned long flags = 0 ;
68
-
69
- spin_lock_irqsave (& priv -> tx_dma_read_lock , flags );
70
-
71
- switch (reg_size ) {
72
- case BYTE_SIZE :
73
- * rw_value = * ((u8 * )((uint8_t * )(priv -> vma ) + reg_addr ));
74
- /* pr_debug("rw_value = %x\n", *rw_value); */
75
- break ;
76
-
77
- case WORD_SIZE :
78
- * rw_value = * ((u16 * )((uint8_t * )(priv -> vma ) + reg_addr ));
79
- /* pr_debug("rw_value = %x\n", *rw_value); */
80
- break ;
81
-
82
- case DWORD_SIZE :
83
- * rw_value = * (u32 * )((uint8_t * )(priv -> vma ) + reg_addr );
84
- /* pr_debug("rw_value = %x,
85
- regoffset = 0x%x\n", *rw_value, reg_addr); */
86
- /* pr_debug("%s:%d xpPrvPtr->vma = 0x%p reg_addr = %p\n",
87
- __func__, __LINE__, priv->vma ,
88
- ((uint8_t*)(priv->vma) + reg_addr)); */
89
- break ;
90
-
91
- default :
92
- pr_err ("%s: Invalid register reg_size=%x\n" , __func__ , reg_size );
93
- rc = - EINVAL ;
94
- break ;
95
- }
96
-
97
- spin_unlock_irqrestore (& priv -> tx_dma_read_lock , flags );
98
- return rc ;
99
- }
100
-
101
- int xp_dev_reg_write (u32 rw_value , u32 reg_addr ,
102
- u8 reg_size , xp_private_t * priv )
103
- {
104
- int rc = 0 ;
105
- u32 value = 0 ;
106
- unsigned long flags = 0 ;
107
-
108
- spin_lock_irqsave (& priv -> tx_dma_read_lock , flags );
109
-
110
- switch (reg_size ) {
111
- case BYTE_SIZE :
112
- value = * (u32 * )((uint8_t * )(priv -> vma ) + reg_addr );
113
- * (u32 * )((uint8_t * )(priv -> vma ) + reg_addr ) =
114
- (value & ~BYTE_MASK ) | (rw_value & BYTE_MASK );
115
- /* pr_debug("rw_value = 0x%x\n", rw_value & BYTE_MASK); */
116
- break ;
117
-
118
- case WORD_SIZE :
119
- value = * (u32 * )((uint8_t * )(priv -> vma ) + reg_addr );
120
- * (u32 * )((uint8_t * )(priv -> vma ) + reg_addr ) =
121
- (value & ~WORD_MASK ) | (rw_value & WORD_MASK );
122
- /* pr_debug("rw_value = 0x%x\n", rw_value & WORD_MASK); */
123
- break ;
124
-
125
- case DWORD_SIZE :
126
- * (u32 * )((uint8_t * )(priv -> vma ) + reg_addr ) = rw_value ;
127
- break ;
128
-
129
- default :
130
- pr_err ("%s: Invalid register rwSize = %x\n" , __func__ , reg_size );
131
- rc = - EINVAL ;
132
- break ;
133
- }
134
-
135
- spin_unlock_irqrestore (& priv -> tx_dma_read_lock , flags );
136
- return rc ;
137
- }
138
-
139
63
static int __xp_dev_reg_read (u32 * rw_value , u32 reg_addr ,
140
64
u8 reg_size , xp_private_t * priv )
141
65
{
@@ -1180,6 +1104,17 @@ static void xpnet_rxtx_handler(struct work_struct *w)
1180
1104
queue_delayed_work (priv -> wqueue , & priv -> dwork , jiffies_defer );
1181
1105
}
1182
1106
1107
+ static void xpnet_dma_trigger_handler (struct work_struct * w )
1108
+ {
1109
+ xpnet_private_t * priv = container_of (w , xpnet_private_t , dwork_tx_trig .work );
1110
+ unsigned long flags = 0 ;
1111
+
1112
+ spin_lock_irqsave (& priv -> priv_lock , flags );
1113
+ priv -> dma_trigger = 1 ;
1114
+ spin_unlock_irqrestore (& priv -> priv_lock , flags );
1115
+ }
1116
+
1117
+
1183
1118
static void xpnet_tx_complete (xpnet_private_t * net_priv , int qno , int maxiter )
1184
1119
{
1185
1120
xpnet_queue_struct_t * q = & net_priv -> tx_queue [qno ];
@@ -1325,19 +1260,21 @@ int xp_netdev_init(xp_private_t *priv)
1325
1260
}
1326
1261
1327
1262
INIT_DELAYED_WORK (& net_priv -> dwork , xpnet_rxtx_handler );
1263
+ INIT_DELAYED_WORK (& net_priv -> dwork_tx_trig , xpnet_dma_trigger_handler );
1328
1264
1329
1265
net_priv -> instance = instance ;
1330
1266
rc = xpnet_proc_create (net_priv );
1331
1267
if (rc ) {
1332
1268
pr_err ("Error in xpnet_proc_create.\n" );
1333
1269
}
1334
1270
queue_delayed_work (net_priv -> wqueue , & net_priv -> dwork , HZ * 5 );
1271
+ queue_delayed_work (net_priv -> wqueue , & net_priv -> dwork_tx_trig , HZ * 100 );
1335
1272
xpnet_rx_all_queues_start (net_priv );
1336
1273
1337
1274
/* Enable the DMA engine. */
1338
1275
xpnet_program_mux_setdma (net_priv , 1 );
1339
1276
spin_lock_irqsave (& net_priv -> priv_lock , flags );
1340
- net_priv -> dma_trigger = 1 ;
1277
+ net_priv -> dma_trigger = 0 ;
1341
1278
spin_unlock_irqrestore (& net_priv -> priv_lock , flags );
1342
1279
1343
1280
return 0 ;
0 commit comments