Skip to content

Commit 38df496

Browse files
author
Zubin Shah
authored
Merge pull request #2 from pkarashchenko/master
OpenXPS Rel3.1, tracking commit 1983c80f
2 parents 317d5b8 + 8190564 commit 38df496

8 files changed

+322
-174
lines changed

xpnet/Kbuild

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
ccflags-y := -Wall -g -DDEBUG -I$(src)/include
22

33
obj-m = xp80-Pcie-Endpoint.o
4-
xp80-Pcie-Endpoint-y := src/xp_netdev_core.o \
4+
5+
ifeq ($(NETDEV), 0)
6+
ccflags-y += -DNO_NETDEV
7+
xp80-Pcie-Endpoint-y := \
8+
src/xp_pcie_slave.o
9+
else
10+
xp80-Pcie-Endpoint-y := \
11+
src/xp_pcie_slave.o \
12+
src/xp_netdev_core.o \
513
src/xp_netdev_proc.o \
614
src/xp_netdev_intf.o \
7-
src/xp_pcie_slave.o \
15+
16+
endif

xpnet/Makefile

+3-3
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ else
3131
KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build
3232

3333
all:
34-
$(MAKE) -C $(KERNEL_SRC) M=$$PWD modules
34+
$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
3535

3636
modules_install:
37-
$(MAKE) -C $(KERNEL_SRC) M=$$PWD modules_install
37+
$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules_install
3838

3939
clean:
40-
$(MAKE) -C $(KERNEL_SRC) M=$$PWD clean
40+
$(MAKE) -C $(KERNEL_SRC) M=$(PWD) clean
4141
rm -rf *.o *.mod.* *.ko *.o.p
4242
endif

xpnet/include/xp_export.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ typedef enum xp_nl_msg {
5757
} xp_nl_msg_t;
5858

5959
typedef struct xp_nl_msg_intf {
60-
__u32 knet_intf_id;
60+
__u32 xpnet_intf_id;
6161
__u8 intf_name[IFNAMSIZ];
6262
} xp_nl_msg_intf_t;
6363

6464
typedef struct xp_nl_msg_link {
65-
__u32 knet_intf_id;
65+
__u32 xpnet_intf_id;
6666

6767
union {
6868
__u32 vif;
@@ -71,7 +71,7 @@ typedef struct xp_nl_msg_link {
7171
} xp_nl_msg_link_t;
7272

7373
typedef struct xp_nl_msg_tx_hdr {
74-
__u32 knet_intf_id;
74+
__u32 xpnet_intf_id;
7575
__u8 operation;
7676
__u8 tx_header[sizeof(xphTxHdr)];
7777
} xp_nl_msg_tx_hdr_t;

xpnet/include/xp_netdev.h

+1
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ typedef struct xpnet_private {
148148
/* Host RX and host TX complete */
149149
struct workqueue_struct *wqueue;
150150
struct delayed_work dwork;
151+
struct delayed_work dwork_tx_trig;
151152

152153
/* RX descritpr ring for queues */
153154
xpnet_queue_struct_t rx_queue[XPNET_RX_NUM_QUEUES];

xpnet/src/xp_netdev_core.c

+18-81
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@
2424
#include "xp_common.h"
2525
#include "xp_netdev.h"
2626

27-
#define BYTE_MASK 0xFFU
28-
#define WORD_MASK 0xFFFFU
29-
#define DWORD_MASK 0xFFFFFFFFU
30-
3127
#define READ_REG 1U
3228
#define WRITE_REG 0U
3329

@@ -53,89 +49,17 @@ extern int xp_netdev_mode_init(void);
5349
extern int xp_netdev_mode_deinit(void);
5450
extern void xp_rx_skb_process(xpnet_private_t *priv, struct sk_buff *skb);
5551
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);
5656

5757
typedef int32_t (*reg_rw_func)(xpnet_private_t *, u32, u8, u32 *, u32);
5858

5959
xpnet_private_t *g_net_priv;
6060

6161
int jiffies_defer = 5;
6262

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-
13963
static int __xp_dev_reg_read(u32 *rw_value, u32 reg_addr,
14064
u8 reg_size, xp_private_t *priv)
14165
{
@@ -1180,6 +1104,17 @@ static void xpnet_rxtx_handler(struct work_struct *w)
11801104
queue_delayed_work(priv->wqueue, &priv->dwork, jiffies_defer);
11811105
}
11821106

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+
11831118
static void xpnet_tx_complete(xpnet_private_t *net_priv, int qno, int maxiter)
11841119
{
11851120
xpnet_queue_struct_t *q = &net_priv->tx_queue[qno];
@@ -1325,19 +1260,21 @@ int xp_netdev_init(xp_private_t *priv)
13251260
}
13261261

13271262
INIT_DELAYED_WORK(&net_priv->dwork, xpnet_rxtx_handler);
1263+
INIT_DELAYED_WORK(&net_priv->dwork_tx_trig, xpnet_dma_trigger_handler);
13281264

13291265
net_priv->instance = instance;
13301266
rc = xpnet_proc_create(net_priv);
13311267
if (rc) {
13321268
pr_err("Error in xpnet_proc_create.\n");
13331269
}
13341270
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);
13351272
xpnet_rx_all_queues_start(net_priv);
13361273

13371274
/* Enable the DMA engine. */
13381275
xpnet_program_mux_setdma(net_priv, 1);
13391276
spin_lock_irqsave(&net_priv->priv_lock, flags);
1340-
net_priv->dma_trigger = 1;
1277+
net_priv->dma_trigger = 0;
13411278
spin_unlock_irqrestore(&net_priv->priv_lock, flags);
13421279

13431280
return 0;

0 commit comments

Comments
 (0)