Hi,

I recently wanted to use VLANs on ure(4) but failed.  As it turns out,
hardmtu is set to 1500 which apparently does not leave enough space
for the VLAN tag.  It looks like the Gigabit Version does even support
Jumbo frames.  Thus we can set the maximum framelen on the RX path
to something bigger and enable Jumbo frames.

I tried this on a Winyao USB1000F.  Would be nice if people tested this
change who have those ure(4)s in active use.

Thanks,
Patrick

diff --git a/sys/dev/usb/if_ure.c b/sys/dev/usb/if_ure.c
index b6c6c99ef34..637fd5eca5f 100644
--- a/sys/dev/usb/if_ure.c
+++ b/sys/dev/usb/if_ure.c
@@ -695,6 +695,9 @@ ure_rtl8152_init(struct ure_softc *sc)
 
        ure_init_fifo(sc);
 
+       /* Set allowed frame size. */
+       ure_write_2(sc, URE_PLA_RMS, URE_MCU_TYPE_PLA, URE_MAX_FRAMELEN_8152);
+
        ure_write_1(sc, URE_USB_TX_AGG, URE_MCU_TYPE_USB,
            URE_TX_AGG_MAX_THRESHOLD);
        ure_write_4(sc, URE_USB_RX_BUF_TH, URE_MCU_TYPE_USB, URE_RX_THR_HIGH);
@@ -835,6 +838,10 @@ ure_rtl8153_init(struct ure_softc *sc)
 
        ure_init_fifo(sc);
 
+       /* Set allowed frame size. */
+       ure_write_2(sc, URE_PLA_RMS, URE_MCU_TYPE_PLA, URE_MAX_FRAMELEN_8153);
+       ure_write_2(sc, URE_PLA_MTPS, URE_MCU_TYPE_PLA, URE_MTPS_JUMBO);
+
        /* Enable Rx aggregation. */
        ure_write_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB,
            ure_read_2(sc, URE_USB_USB_CTRL, URE_MCU_TYPE_USB) &
@@ -1147,6 +1154,12 @@ ure_attach(struct device *parent, struct device *self, 
void *aux)
        ifp->if_start = ure_start;
        ifp->if_capabilities = 0;
 
+       if (sc->ure_flags & URE_FLAG_8152)
+               ifp->ifp_hardmtu = URE_MAX_FRAMELEN_8152;
+       else
+               ifp->ifp_hardmtu = URE_MAX_FRAMELEN_8153;
+       ifp->ifp_hardmtu -= (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
+
        mii = &sc->ure_mii;
        mii->mii_ifp = ifp;
        mii->mii_readreg = ure_miibus_readreg;
diff --git a/sys/dev/usb/if_urereg.h b/sys/dev/usb/if_urereg.h
index 2260ec37890..8963d2753ed 100644
--- a/sys/dev/usb/if_urereg.h
+++ b/sys/dev/usb/if_urereg.h
@@ -41,7 +41,8 @@
 #define        URE_BYTE_EN_BYTE        0x11
 #define        URE_BYTE_EN_SIX_BYTES   0x3f
 
-#define        URE_MAX_FRAMELEN        (ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN)
+#define        URE_MAX_FRAMELEN_8152   (ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN)
+#define        URE_MAX_FRAMELEN_8153   (9 * 1024)
 
 #define        URE_PLA_IDR             0xc000
 #define        URE_PLA_RCR             0xc010
@@ -186,6 +187,10 @@
 /* PLA_TCR1 */
 #define        URE_VERSION_MASK        0x7cf0
 
+/* PLA_MTPS */
+#define URE_MTPS_JUMBO         (12 * 1024 / 64)
+#define URE_MTPS_DEFAULT       (6 * 1024 / 64)
+
 /* PLA_CR */
 #define        URE_CR_RST              0x10
 #define        URE_CR_RE               0x08

Reply via email to