Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci Update the Rx descriptor based on the vendor dri...



details:   https://anonhg.NetBSD.org/src/rev/dd212835edb6
branches:  trunk
changeset: 372698:dd212835edb6
user:      nonaka <nonaka%NetBSD.org@localhost>
date:      Wed Dec 21 05:19:15 2022 +0000

description:
Update the Rx descriptor based on the vendor driver for Linux.

This fixes a panic on RTL8125.
Patch from OpenBSD if_rge.c r1.20, if_rgereg.h r1.8.

Tested by msaitoh@n.o.

diffstat:

 sys/dev/pci/if_rge.c    |  42 +++++++++++---------------
 sys/dev/pci/if_rgereg.h |  76 ++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 77 insertions(+), 41 deletions(-)

diffs (207 lines):

diff -r dd8f8b956306 -r dd212835edb6 sys/dev/pci/if_rge.c
--- a/sys/dev/pci/if_rge.c      Wed Dec 21 02:28:06 2022 +0000
+++ b/sys/dev/pci/if_rge.c      Wed Dec 21 05:19:15 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_rge.c,v 1.24 2022/09/24 18:12:42 thorpej Exp $      */
+/*     $NetBSD: if_rge.c,v 1.25 2022/12/21 05:19:15 nonaka Exp $       */
 /*     $OpenBSD: if_rge.c,v 1.9 2020/12/12 11:48:53 jan Exp $  */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_rge.c,v 1.24 2022/09/24 18:12:42 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_rge.c,v 1.25 2022/12/21 05:19:15 nonaka Exp $");
 
 #include <sys/types.h>
 
@@ -1132,22 +1132,16 @@
        /* Map the segments into RX descriptors. */
        r = &sc->rge_ldata.rge_rx_list[idx];
 
-       if (RGE_OWN(r)) {
-               device_printf(sc->sc_dev, "tried to map busy RX descriptor\n");
-               goto out;
-       }
-
        rxq->rxq_mbuf = m;
 
-       r->rge_extsts = 0;
-       r->rge_addrlo = htole32(RGE_ADDR_LO(rxmap->dm_segs[0].ds_addr));
-       r->rge_addrhi = htole32(RGE_ADDR_HI(rxmap->dm_segs[0].ds_addr));
+       r->hi_qword1.rx_qword4.rge_extsts = 0;
+       r->hi_qword0.rge_addr = htole64(rxmap->dm_segs[0].ds_addr);
 
-       r->rge_cmdsts = htole32(rxmap->dm_segs[0].ds_len);
+       r->hi_qword1.rx_qword4.rge_cmdsts = htole32(rxmap->dm_segs[0].ds_len);
        if (idx == RGE_RX_LIST_CNT - 1)
-               r->rge_cmdsts |= htole32(RGE_RDCMDSTS_EOR);
+               r->hi_qword1.rx_qword4.rge_cmdsts |= htole32(RGE_RDCMDSTS_EOR);
 
-       r->rge_cmdsts |= htole32(RGE_RDCMDSTS_OWN);
+       r->hi_qword1.rx_qword4.rge_cmdsts |= htole32(RGE_RDCMDSTS_OWN);
 
        bus_dmamap_sync(sc->sc_dmat, sc->rge_ldata.rge_rx_list_map,
            idx * sizeof(struct rge_rx_desc), sizeof(struct rge_rx_desc),
@@ -1167,11 +1161,11 @@
 
        r = &sc->rge_ldata.rge_rx_list[idx];
 
-       r->rge_cmdsts = htole32(RGE_JUMBO_FRAMELEN);
-       r->rge_extsts = 0;
+       r->hi_qword1.rx_qword4.rge_cmdsts = htole32(RGE_JUMBO_FRAMELEN);
+       r->hi_qword1.rx_qword4.rge_extsts = 0;
        if (idx == RGE_RX_LIST_CNT - 1)
-               r->rge_cmdsts |= htole32(RGE_RDCMDSTS_EOR);
-       r->rge_cmdsts |= htole32(RGE_RDCMDSTS_OWN);
+               r->hi_qword1.rx_qword4.rge_cmdsts |= htole32(RGE_RDCMDSTS_EOR);
+       r->hi_qword1.rx_qword4.rge_cmdsts |= htole32(RGE_RDCMDSTS_OWN);
 
        bus_dmamap_sync(sc->sc_dmat, sc->rge_ldata.rge_rx_list_map,
            idx * sizeof(struct rge_rx_desc), sizeof(struct rge_rx_desc),
@@ -1235,8 +1229,8 @@
                if (RGE_OWN(cur_rx))
                        break;
 
-               rxstat = letoh32(cur_rx->rge_cmdsts);
-               extsts = letoh32(cur_rx->rge_extsts);
+               rxstat = letoh32(cur_rx->hi_qword1.rx_qword4.rge_cmdsts);
+               extsts = letoh32(cur_rx->hi_qword1.rx_qword4.rge_extsts);
 
                total_len = RGE_RXBYTES(cur_rx);
                rxq = &sc->rge_ldata.rge_rxq[i];
@@ -1317,16 +1311,16 @@
 
 #if notyet
                /* Check IP header checksum. */
-               if (!(rxstat & RGE_RDCMDSTS_IPCSUMERR) &&
+               if (!(extsts & RGE_RDEXTSTS_IPCSUMERR) &&
                    (extsts & RGE_RDEXTSTS_IPV4))
                        m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
 
                /* Check TCP/UDP checksum. */
                if ((extsts & (RGE_RDEXTSTS_IPV4 | RGE_RDEXTSTS_IPV6)) &&
-                   (((rxstat & RGE_RDCMDSTS_TCPPKT) &&
-                   !(rxstat & RGE_RDCMDSTS_TCPCSUMERR)) ||
-                   ((rxstat & RGE_RDCMDSTS_UDPPKT) &&
-                   !(rxstat & RGE_RDCMDSTS_UDPCSUMERR))))
+                   (((extsts & RGE_RDEXTSTS_TCPPKT) &&
+                   !(extsts & RGE_RDEXTSTS_TCPCSUMERR)) ||
+                   ((extsts & RGE_RDEXTSTS_UDPPKT) &&
+                   !(extsts & RGE_RDEXTSTS_UDPCSUMERR))))
                        m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK |
                            M_UDP_CSUM_IN_OK;
 #endif
diff -r dd8f8b956306 -r dd212835edb6 sys/dev/pci/if_rgereg.h
--- a/sys/dev/pci/if_rgereg.h   Wed Dec 21 02:28:06 2022 +0000
+++ b/sys/dev/pci/if_rgereg.h   Wed Dec 21 05:19:15 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_rgereg.h,v 1.6 2022/08/28 07:44:23 skrll Exp $      */
+/*     $NetBSD: if_rgereg.h,v 1.7 2022/12/21 05:19:15 nonaka Exp $     */
 /*     $OpenBSD: if_rgereg.h,v 1.6 2020/12/24 01:00:00 kevlo Exp $     */
 
 /*
@@ -188,9 +188,10 @@
 #define RGE_NEXT_RX_DESC(x)    (((x) + 1) % RGE_RX_LIST_CNT)
 #define RGE_ADDR_LO(y)         ((uint64_t) (y) & 0xffffffff)
 #define RGE_ADDR_HI(y)         ((uint64_t) (y) >> 32)
-#define RGE_OWN(x)             (letoh32((x)->rge_cmdsts) & RGE_RDCMDSTS_OWN)
-#define RGE_RXBYTES(x)          (letoh32((x)->rge_cmdsts) & \
-                               RGE_RDCMDSTS_FRAGLEN)
+#define RGE_OWN(x)                                                     \
+        (letoh32((x)->hi_qword1.rx_qword4.rge_cmdsts) & RGE_RDCMDSTS_OWN)
+#define RGE_RXBYTES(x)                                                 \
+        (letoh32((x)->hi_qword1.rx_qword4.rge_cmdsts) & RGE_RDCMDSTS_FRAGLEN)
 
 #define RGE_ADV_2500TFDX       0x0080
 
@@ -218,26 +219,67 @@
 
 /* Rx descriptor */
 struct rge_rx_desc {
-       uint32_t                rge_cmdsts;
-       uint32_t                rge_extsts;
-       uint32_t                rge_addrlo;
-       uint32_t                rge_addrhi;
+       union {
+               struct {
+                       uint32_t        rsvd0;
+                       uint32_t        rsvd1;
+               } rx_qword0;
+       } lo_qword0;
+
+       union {
+               struct {
+                       uint32_t        rss;
+                       uint16_t        length;
+                       uint16_t        hdr_info;
+               } rx_qword1;
+
+               struct {
+                       uint32_t        rsvd2;
+                       uint32_t        rsvd3;
+               } rx_qword2;
+       } lo_qword1;
+
+       union {
+               uint64_t                rge_addr;
+
+               struct {
+                       uint64_t        timestamp;
+               } rx_timestamp;
+
+               struct {
+                       uint32_t        rsvd4;
+                       uint32_t        rsvd5;
+               } rx_qword3;
+       } hi_qword0;
+
+       union {
+               struct {
+                       uint32_t        rge_extsts;
+                       uint32_t        rge_cmdsts;
+               } rx_qword4;
+
+               struct {
+                       uint16_t        rsvd6;
+                       uint16_t        rsvd7;
+                       uint32_t        rsvd8;
+               } rx_ptp;
+       } hi_qword1;
 };
 
-#define RGE_RDCMDSTS_TCPCSUMERR        0x00004000
-#define RGE_RDCMDSTS_UDPCSUMERR        0x00008000
-#define RGE_RDCMDSTS_IPCSUMERR 0x00010000
-#define RGE_RDCMDSTS_TCPPKT    0x00020000
-#define RGE_RDCMDSTS_UDPPKT    0x00040000
-#define RGE_RDCMDSTS_RXERRSUM  0x00200000
-#define RGE_RDCMDSTS_EOF       0x10000000
-#define RGE_RDCMDSTS_SOF       0x20000000
+#define RGE_RDCMDSTS_RXERRSUM  0x00100000
+#define RGE_RDCMDSTS_EOF       0x01000000
+#define RGE_RDCMDSTS_SOF       0x02000000
 #define RGE_RDCMDSTS_EOR       0x40000000
 #define RGE_RDCMDSTS_OWN       0x80000000
 #define RGE_RDCMDSTS_FRAGLEN   0x00003fff
 
 #define RGE_RDEXTSTS_VTAG      0x00010000
 #define RGE_RDEXTSTS_VLAN_MASK 0x0000ffff
+#define RGE_RDEXTSTS_TCPCSUMERR 0x01000000
+#define RGE_RDEXTSTS_UDPCSUMERR 0x02000000
+#define RGE_RDEXTSTS_IPCSUMERR  0x04000000
+#define RGE_RDEXTSTS_TCPPKT     0x10000000
+#define RGE_RDEXTSTS_UDPPKT     0x20000000
 #define RGE_RDEXTSTS_IPV4      0x40000000
 #define RGE_RDEXTSTS_IPV6      0x80000000
 
@@ -296,7 +338,7 @@
        ETHER_VLAN_ENCAP_LEN)
 
 #define RGE_TXCFG_CONFIG       0x03000700
-#define RGE_RXCFG_CONFIG       0x40c00700
+#define RGE_RXCFG_CONFIG       0x41c00700
 
 struct rge_softc {
        device_t                sc_dev;



Home | Main Index | Thread Index | Old Index