---
 freebsd/sys/dev/xdma/xdma_sg.c                     |  3 ++-
 freebsd/sys/dev/xilinx/axidma.c                    | 14 ++++++++++++--
 freebsd/sys/dev/xilinx/if_xae.c                    |  4 ++--
 freebsd/sys/netinet/tcp_input.c                    |  9 +++++++++
 freebsd/sys/netinet/tcp_subr.c                     | 10 ++++++++++
 freebsd/sys/netinet6/ip6_input.c                   | 10 ++++++++++
 .../include/rtems/bsd/test/network-config.h.in     |  2 ++
 7 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/freebsd/sys/dev/xdma/xdma_sg.c b/freebsd/sys/dev/xdma/xdma_sg.c
index fa69a297..74fad421 100644
--- a/freebsd/sys/dev/xdma/xdma_sg.c
+++ b/freebsd/sys/dev/xdma/xdma_sg.c
@@ -107,6 +107,7 @@ xchan_bufs_alloc_reserved(xdma_channel_t *xchan)
        for (i = 0; i < xchan->xr_num; i++) {
                xr = &xchan->xr_mem[i];
                size = round_page(xchan->maxsegsize);
+#ifndef __rtems__
                if (vmem_alloc(xchan->vmem, size,
                    M_BESTFIT | M_NOWAIT, &addr)) {
                        device_printf(xdma->dev,
@@ -117,10 +118,10 @@ xchan_bufs_alloc_reserved(xdma_channel_t *xchan)
                
                xr->buf.size = size;
                xr->buf.paddr = addr;
-#ifndef __rtems__
                xr->buf.vaddr = kva_alloc(size);
 #else
                xr->buf.vaddr = calloc(1,size);
+               xr->buf.paddr = xr->buf.vaddr;
 #endif
                if (xr->buf.vaddr == 0) {
                        device_printf(xdma->dev,
diff --git a/freebsd/sys/dev/xilinx/axidma.c b/freebsd/sys/dev/xilinx/axidma.c
index 00ae2f1d..4fbb3104 100644
--- a/freebsd/sys/dev/xilinx/axidma.c
+++ b/freebsd/sys/dev/xilinx/axidma.c
@@ -68,6 +68,8 @@ __FBSDID("$FreeBSD$");
 
 #ifdef __rtems__
 #include <sys/endian.h>
+
+#define AXIDMA_DESCRIPTOR_ALIGNMENT 64
 #endif
 
 #ifdef AXIDMA_DEBUG
@@ -182,6 +184,10 @@ axidma_intr(struct axidma_softc *sc,
 
                st.error = errors;
                st.transferred = desc->status & BD_CONTROL_LEN_M;
+               /* Handle Control / Status Streams. */
+               if (!st.transferred) {
+                       st.transferred = desc->app4 & 0xFF;
+               }
                tot_copied += st.transferred;
                xchan_seg_done(xchan, &st);
 
@@ -362,16 +368,20 @@ axidma_desc_alloc(struct axidma_softc *sc, struct 
xdma_channel *xchan,
        chan->descs_phys = malloc(nsegments * sizeof(bus_dma_segment_t),
            M_DEVBUF, M_NOWAIT | M_ZERO);
        chan->mem_size = desc_size * nsegments;
+#ifndef __rtems__
        if (vmem_alloc(xchan->vmem, chan->mem_size, M_FIRSTFIT | M_NOWAIT,
            &chan->mem_paddr)) {
                device_printf(sc->dev, "Failed to allocate memory.\n");
                return (-1);
        }
-#ifndef __rtems__
        chan->mem_vaddr = kva_alloc(chan->mem_size);
        pmap_kenter_device(chan->mem_vaddr, chan->mem_size, chan->mem_paddr);
 #else
-       chan->mem_vaddr = calloc(1, chan->mem_size);
+       /* Align DMA descriptors */
+       chan->mem_vaddr = calloc(1, chan->mem_size + 
AXIDMA_DESCRIPTOR_ALIGNMENT - 1);
+       chan->mem_vaddr = ((uintptr_t)chan->mem_vaddr +
+               AXIDMA_DESCRIPTOR_ALIGNMENT - 1) & ~0x3F;
+       chan->mem_paddr = chan->mem_vaddr;
 #endif
 
        device_printf(sc->dev, "Allocated chunk %lx %d\n",
diff --git a/freebsd/sys/dev/xilinx/if_xae.c b/freebsd/sys/dev/xilinx/if_xae.c
index 0582a588..3b23c5d4 100644
--- a/freebsd/sys/dev/xilinx/if_xae.c
+++ b/freebsd/sys/dev/xilinx/if_xae.c
@@ -729,7 +729,7 @@ xae_miibus_read_reg(device_t dev, int phy, int reg)
 #if defined(__rtems__) && defined(DEBUG_MII)
        dprintf("%s: reg: %d phy %d val 0x%x\n", __func__, reg, phy, rv);
 #endif
-       return (rv);
+       return (rv & 0xFFFF);
 }
 
 static int
@@ -980,7 +980,7 @@ xae_attach(device_t dev)
        sc->mii_softc = device_get_softc(sc->miibus);
 
        /* Apply vcu118 workaround. */
-       // if (OF_getproplen(node, "xlnx,vcu118") >= 0)
+       if (OF_getproplen(node, "xlnx,vcu118") >= 0)
                xae_phy_fixup(sc);
 
        /* All ready to run, attach the ethernet interface. */
diff --git a/freebsd/sys/netinet/tcp_input.c b/freebsd/sys/netinet/tcp_input.c
index fc111d9c..60f9123a 100644
--- a/freebsd/sys/netinet/tcp_input.c
+++ b/freebsd/sys/netinet/tcp_input.c
@@ -721,6 +721,15 @@ tcp_input(struct mbuf **mp, int *offp, int proto)
        }
 #endif /* INET */
 
+#ifdef __rtems__
+#ifdef __MICROBLAZE__
+       /* Ensure that the TCP header is properly aligned in memory. */
+       struct tcphdr aligned_hdr;
+       memcpy(&aligned_hdr, th, sizeof(struct tcphdr));
+       th = &aligned_hdr;
+#endif
+#endif
+
        /*
         * Check that TCP offset makes sense,
         * pull out TCP options and adjust length.              XXX
diff --git a/freebsd/sys/netinet/tcp_subr.c b/freebsd/sys/netinet/tcp_subr.c
index eae696c1..d0025c01 100644
--- a/freebsd/sys/netinet/tcp_subr.c
+++ b/freebsd/sys/netinet/tcp_subr.c
@@ -1520,6 +1520,16 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr 
*th, struct mbuf *m,
                mac_netinet_tcp_reply(m);
        }
 #endif
+
+#ifdef __rtems__
+#ifdef __MICROBLAZE__
+       /* Ensure that the TCP header is properly aligned in memory. */
+       struct tcphdr aligned_hdr;
+       memcpy(&aligned_hdr, nth, sizeof(struct tcphdr));
+       nth = &aligned_hdr;
+#endif
+#endif
+
        nth->th_seq = htonl(seq);
        nth->th_ack = htonl(ack);
        nth->th_x2 = 0;
diff --git a/freebsd/sys/netinet6/ip6_input.c b/freebsd/sys/netinet6/ip6_input.c
index 6800d002..961e4e79 100644
--- a/freebsd/sys/netinet6/ip6_input.c
+++ b/freebsd/sys/netinet6/ip6_input.c
@@ -623,6 +623,16 @@ ip6_input(struct mbuf *m)
        }
 
        ip6 = mtod(m, struct ip6_hdr *);
+
+#ifdef __rtems__
+#ifdef __MICROBLAZE__
+       /* Ensure that the IPv6 header is properly aligned in memory. */
+       struct ip6_hdr aligned_hdr;
+       memcpy(&aligned_hdr, ip6, sizeof(struct ip6_hdr));
+       ip6 = &aligned_hdr;
+#endif
+#endif
+
        if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
                IP6STAT_INC(ip6s_badvers);
                in6_ifstat_inc(rcvif, ifs6_in_hdrerr);
diff --git a/testsuite/include/rtems/bsd/test/network-config.h.in 
b/testsuite/include/rtems/bsd/test/network-config.h.in
index fd63eded..69609854 100755
--- a/testsuite/include/rtems/bsd/test/network-config.h.in
+++ b/testsuite/include/rtems/bsd/test/network-config.h.in
@@ -52,6 +52,8 @@
   #endif
 #elif defined(LIBBSP_ARM_ATSAM_BSP_H)
   #define NET_CFG_INTERFACE_0 "if_atsam0"
+#elif defined(LIBBSP_MICROBLAZE_FPGA_BSP_H)
+  #define NET_CFG_INTERFACE_0 "xae0"
 #else
   #define NET_CFG_INTERFACE_0 "@NET_CFG_INTERFACE_0@"
 #endif
-- 
2.30.2

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to