Hello, Here is Genesys Logic's GL620USB-A driver, new version. I fixed crashing bug when peer is not connected, rewrite "sc_dying" to usbd_is_dying() (advices from mpi@), and deleted useless codes.
This is still work in progress, man is not yet. And please tell me which I have to write copyright notice --- NetBSD or OpenBSD. if_ugl.c is based on if_upl.c, and if_upl.c has NetBSD's one. Regards, -- SASANO Takayoshi <[email protected]> Index: arch/alpha/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/alpha/conf/GENERIC,v retrieving revision 1.234 diff -u -p -r1.234 GENERIC --- arch/alpha/conf/GENERIC 29 Oct 2013 22:33:10 -0000 1.234 +++ arch/alpha/conf/GENERIC 14 Nov 2013 19:47:57 -0000 @@ -109,6 +109,7 @@ cdce* at uhub? # CDC Ethernet urndis* at uhub? # Remote NDIS Ethernet udav* at uhub? # Davicom DM9601 based Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS urio* at uhub? # Diamond Multimedia Rio 500 Index: arch/alpha/conf/RAMDISKBIG =================================================================== RCS file: /cvs/src/sys/arch/alpha/conf/RAMDISKBIG,v retrieving revision 1.89 diff -u -p -r1.89 RAMDISKBIG --- arch/alpha/conf/RAMDISKBIG 29 Oct 2013 22:33:10 -0000 1.89 +++ arch/alpha/conf/RAMDISKBIG 14 Nov 2013 19:47:57 -0000 @@ -95,6 +95,7 @@ kue* at uhub? # Kawasaki KL5KUSB101B b smsc* at uhub? # SMSC LAN95xx Ethernet udav* at uhub? # Davicom DM9601 based Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/amd64/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/amd64/conf/GENERIC,v retrieving revision 1.351 diff -u -p -r1.351 GENERIC --- arch/amd64/conf/GENERIC 29 Oct 2013 22:37:25 -0000 1.351 +++ arch/amd64/conf/GENERIC 14 Nov 2013 19:47:59 -0000 @@ -223,6 +223,7 @@ smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet urndis* at uhub? # Remote NDIS Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet mos* at uhub? # MOSCHIP MCS7730/7830 10/100 Ethernet url* at uhub? # Realtek RTL8150L based adapters Index: arch/amd64/conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/amd64/conf/RAMDISK,v retrieving revision 1.59 diff -u -p -r1.59 RAMDISK --- arch/amd64/conf/RAMDISK 29 Oct 2013 22:37:25 -0000 1.59 +++ arch/amd64/conf/RAMDISK 14 Nov 2013 19:48:00 -0000 @@ -105,6 +105,7 @@ wskbd* at ukbd? mux 1 #cue* at uhub? # CATC USB-EL1201A based Ethernet #kue* at uhub? # Kawasaki KL5KUSB101B based Ethernet #upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +#ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' #urio* at uhub? # Diamond Multimedia Rio 500 #uyap* at uhub? # Y@P firmware loader #ugen* at uhub? # USB Generic driver Index: arch/amd64/conf/RAMDISK_CD =================================================================== RCS file: /cvs/src/sys/arch/amd64/conf/RAMDISK_CD,v retrieving revision 1.130 diff -u -p -r1.130 RAMDISK_CD --- arch/amd64/conf/RAMDISK_CD 29 Oct 2013 22:37:25 -0000 1.130 +++ arch/amd64/conf/RAMDISK_CD 14 Nov 2013 19:48:00 -0000 @@ -116,6 +116,7 @@ mos* at uhub? # MOSCHIP MCS7730/7830 10 url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' #urio* at uhub? # Diamond Multimedia Rio 500 #uyap* at uhub? # Y@P firmware loader #ugen* at uhub? # USB Generic driver Index: arch/armish/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/armish/conf/GENERIC,v retrieving revision 1.49 diff -u -p -r1.49 GENERIC --- arch/armish/conf/GENERIC 5 Sep 2013 19:42:06 -0000 1.49 +++ arch/armish/conf/GENERIC 14 Nov 2013 19:48:02 -0000 @@ -139,6 +139,7 @@ smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet urndis* at uhub? # Remote NDIS Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/armish/conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/armish/conf/RAMDISK,v retrieving revision 1.26 diff -u -p -r1.26 RAMDISK --- arch/armish/conf/RAMDISK 20 Aug 2013 14:27:26 -0000 1.26 +++ arch/armish/conf/RAMDISK 14 Nov 2013 19:48:02 -0000 @@ -132,6 +132,7 @@ kue* at uhub? # Kawasaki KL5KUSB101B ba smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/armv7/conf/GENERIC-IMX =================================================================== RCS file: /cvs/src/sys/arch/armv7/conf/GENERIC-IMX,v retrieving revision 1.3 diff -u -p -r1.3 GENERIC-IMX --- arch/armv7/conf/GENERIC-IMX 5 Oct 2013 23:05:11 -0000 1.3 +++ arch/armv7/conf/GENERIC-IMX 14 Nov 2013 19:48:03 -0000 @@ -118,6 +118,7 @@ kue* at uhub? # Kawasaki KL5KUSB101B b smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/armv7/conf/GENERIC-OMAP =================================================================== RCS file: /cvs/src/sys/arch/armv7/conf/GENERIC-OMAP,v retrieving revision 1.3 diff -u -p -r1.3 GENERIC-OMAP --- arch/armv7/conf/GENERIC-OMAP 18 Oct 2013 15:25:03 -0000 1.3 +++ arch/armv7/conf/GENERIC-OMAP 14 Nov 2013 19:48:03 -0000 @@ -127,6 +127,7 @@ kue* at uhub? # Kawasaki KL5KUSB101B b smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/armv7/conf/GENERIC-SUNXI =================================================================== RCS file: /cvs/src/sys/arch/armv7/conf/GENERIC-SUNXI,v retrieving revision 1.2 diff -u -p -r1.2 GENERIC-SUNXI --- arch/armv7/conf/GENERIC-SUNXI 27 Oct 2013 03:06:25 -0000 1.2 +++ arch/armv7/conf/GENERIC-SUNXI 14 Nov 2013 19:48:03 -0000 @@ -121,6 +121,7 @@ kue* at uhub? # Kawasaki KL5KUSB101B b smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/armv7/conf/RAMDISK-IMX =================================================================== RCS file: /cvs/src/sys/arch/armv7/conf/RAMDISK-IMX,v retrieving revision 1.5 diff -u -p -r1.5 RAMDISK-IMX --- arch/armv7/conf/RAMDISK-IMX 1 Nov 2013 20:26:51 -0000 1.5 +++ arch/armv7/conf/RAMDISK-IMX 14 Nov 2013 19:48:04 -0000 @@ -128,6 +128,7 @@ kue* at uhub? # Kawasaki KL5KUSB101B b smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/armv7/conf/RAMDISK-OMAP =================================================================== RCS file: /cvs/src/sys/arch/armv7/conf/RAMDISK-OMAP,v retrieving revision 1.3 diff -u -p -r1.3 RAMDISK-OMAP --- arch/armv7/conf/RAMDISK-OMAP 1 Nov 2013 20:26:51 -0000 1.3 +++ arch/armv7/conf/RAMDISK-OMAP 14 Nov 2013 19:48:04 -0000 @@ -140,6 +140,7 @@ uhid* at uhidev? # USB generic HID sup smsc* at uhub? # SMSC LAN95xx Ethernet # cdce* at uhub? # CDC Ethernet # upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +# ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' # udav* at uhub? # Davicom DM9601 based Ethernet # url* at uhub? # Realtek RTL8150L based adapters # wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/armv7/conf/RAMDISK-SUNXI =================================================================== RCS file: /cvs/src/sys/arch/armv7/conf/RAMDISK-SUNXI,v retrieving revision 1.3 diff -u -p -r1.3 RAMDISK-SUNXI --- arch/armv7/conf/RAMDISK-SUNXI 1 Nov 2013 20:26:51 -0000 1.3 +++ arch/armv7/conf/RAMDISK-SUNXI 14 Nov 2013 19:48:04 -0000 @@ -124,6 +124,7 @@ uhid* at uhidev? # USB generic HID sup # smsc* at uhub? # SMSC LAN95xx Ethernet # cdce* at uhub? # CDC Ethernet # upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +# ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' # udav* at uhub? # Davicom DM9601 based Ethernet # url* at uhub? # Realtek RTL8150L based adapters # wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/hppa/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/hppa/conf/GENERIC,v retrieving revision 1.153 diff -u -p -r1.153 GENERIC --- arch/hppa/conf/GENERIC 29 Oct 2013 22:37:25 -0000 1.153 +++ arch/hppa/conf/GENERIC 14 Nov 2013 19:48:05 -0000 @@ -152,6 +152,7 @@ cdce* at uhub? # CDC Ethernet urndis* at uhub? # Remote NDIS Ethernet udav* at uhub? # Davicom DM9601 based Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' wi* at uhub? # WaveLAN IEEE 802.11DS urio* at uhub? # Diamond Multimedia Rio 500 uyap* at uhub? # Y@P firmware loader Index: arch/hppa/conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/hppa/conf/RAMDISK,v retrieving revision 1.98 diff -u -p -r1.98 RAMDISK --- arch/hppa/conf/RAMDISK 29 Oct 2013 22:37:25 -0000 1.98 +++ arch/hppa/conf/RAMDISK 14 Nov 2013 19:48:05 -0000 @@ -150,6 +150,7 @@ smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet udav* at uhub? # Davicom DM9601 based Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' wi* at uhub? # WaveLAN IEEE 802.11DS #urio* at uhub? # Diamond Multimedia Rio 500 #uyap* at uhub? # Y@P firmware loader Index: arch/hppa64/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/hppa64/conf/GENERIC,v retrieving revision 1.30 diff -u -p -r1.30 GENERIC --- arch/hppa64/conf/GENERIC 29 Oct 2013 22:37:25 -0000 1.30 +++ arch/hppa64/conf/GENERIC 14 Nov 2013 19:48:06 -0000 @@ -102,6 +102,7 @@ com1 at ssio? irq 3 #urndis* at uhub? # Remote NDIS Ethernet #udav* at uhub? # Davicom DM9601 based Ethernet #upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +#ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' #url* at uhub? # Realtek RTL8150L based adapters #wi* at uhub? # WaveLAN IEEE 802.11DS #urio* at uhub? # Diamond Multimedia Rio 500 Index: arch/hppa64/conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/hppa64/conf/RAMDISK,v retrieving revision 1.17 diff -u -p -r1.17 RAMDISK --- arch/hppa64/conf/RAMDISK 29 Oct 2013 22:37:25 -0000 1.17 +++ arch/hppa64/conf/RAMDISK 14 Nov 2013 19:48:06 -0000 @@ -102,6 +102,7 @@ pcmcia* at cardslot? #cdce* at uhub? # CDC Ethernet #udav* at uhub? # Davicom DM9601 based Ethernet #upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +#ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' #url* at uhub? # Realtek RTL8150L based adapters #wi* at uhub? # WaveLAN IEEE 802.11DS #urio* at uhub? # Diamond Multimedia Rio 500 Index: arch/i386/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/i386/conf/GENERIC,v retrieving revision 1.759 diff -u -p -r1.759 GENERIC --- arch/i386/conf/GENERIC 31 Oct 2013 09:57:02 -0000 1.759 +++ arch/i386/conf/GENERIC 14 Nov 2013 19:48:07 -0000 @@ -276,6 +276,7 @@ smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet urndis* at uhub? # Remote NDIS Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet mos* at uhub? # MOSCHIP MCS7730/7830 10/100 Ethernet url* at uhub? # Realtek RTL8150L based adapters Index: arch/i386/conf/RAMDISKC =================================================================== RCS file: /cvs/src/sys/arch/i386/conf/RAMDISKC,v retrieving revision 1.107 diff -u -p -r1.107 RAMDISKC --- arch/i386/conf/RAMDISKC 28 Oct 2013 12:33:32 -0000 1.107 +++ arch/i386/conf/RAMDISKC 14 Nov 2013 19:48:07 -0000 @@ -116,6 +116,7 @@ wskbd* at ukbd? mux 1 #kue* at uhub? # Kawasaki KL5KUSB101B based Ethernet #cdce* at uhub? # CDC Ethernet #upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +#ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' #udav* at uhub? # Davicom DM9601 based Ethernet #url* at uhub? # Realtek RTL8150L based adapters #wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/i386/conf/RAMDISK_CD =================================================================== RCS file: /cvs/src/sys/arch/i386/conf/RAMDISK_CD,v retrieving revision 1.204 diff -u -p -r1.204 RAMDISK_CD --- arch/i386/conf/RAMDISK_CD 28 Oct 2013 12:33:32 -0000 1.204 +++ arch/i386/conf/RAMDISK_CD 14 Nov 2013 19:48:08 -0000 @@ -131,6 +131,7 @@ cue* at uhub? # CATC USB-EL1201A based kue* at uhub? # Kawasaki KL5KUSB101B based Ethernet smsc* at uhub? # SMSC LAN95xx Ethernet #upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +#ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' #urio* at uhub? # Diamond Multimedia Rio 500 cdce* at uhub? # CDC Ethernet udav* at uhub? # Davicom DM9601 based Ethernet Index: arch/landisk/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/landisk/conf/GENERIC,v retrieving revision 1.40 diff -u -p -r1.40 GENERIC --- arch/landisk/conf/GENERIC 5 Sep 2013 19:42:07 -0000 1.40 +++ arch/landisk/conf/GENERIC 14 Nov 2013 19:48:08 -0000 @@ -135,6 +135,7 @@ smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet urndis* at uhub? # Remote NDIS Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/landisk/conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/landisk/conf/RAMDISK,v retrieving revision 1.18 diff -u -p -r1.18 RAMDISK --- arch/landisk/conf/RAMDISK 20 Aug 2013 09:14:15 -0000 1.18 +++ arch/landisk/conf/RAMDISK 14 Nov 2013 19:48:08 -0000 @@ -99,6 +99,7 @@ kue* at uhub? # Kawasaki KL5KUSB101B ba smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS Index: arch/loongson/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/loongson/conf/GENERIC,v retrieving revision 1.40 diff -u -p -r1.40 GENERIC --- arch/loongson/conf/GENERIC 5 Sep 2013 19:42:07 -0000 1.40 +++ arch/loongson/conf/GENERIC 14 Nov 2013 19:48:13 -0000 @@ -147,6 +147,7 @@ uath* at uhub? # Atheros AR5005UG/AR500 udav* at uhub? # Davicom DM9601 based Ethernet upgt* at uhub? # Conexant/Intersil PrismGT SoftMAC USB upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB url* at uhub? # Realtek RTL8150L based adapters urtw* at uhub? # RealTek 8187 Index: arch/loongson/conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/loongson/conf/RAMDISK,v retrieving revision 1.20 diff -u -p -r1.20 RAMDISK --- arch/loongson/conf/RAMDISK 27 Sep 2012 14:01:35 -0000 1.20 +++ arch/loongson/conf/RAMDISK 14 Nov 2013 19:48:13 -0000 @@ -121,6 +121,7 @@ uath* at uhub? # Atheros AR5005UG/AR500 udav* at uhub? # Davicom DM9601 based Ethernet upgt* at uhub? # Conexant/Intersil PrismGT SoftMAC USB upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB url* at uhub? # Realtek RTL8150L based adapters urtw* at uhub? # RealTek 8187 Index: arch/macppc/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/macppc/conf/GENERIC,v retrieving revision 1.226 diff -u -p -r1.226 GENERIC --- arch/macppc/conf/GENERIC 5 Sep 2013 19:42:07 -0000 1.226 +++ arch/macppc/conf/GENERIC 14 Nov 2013 19:48:13 -0000 @@ -264,6 +264,7 @@ smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet urndis* at uhub? # Remote NDIS Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620A-USB host-to-host `network' udav* at uhub? # Davicom DM9601 based Ethernet mos* at uhub? # MOSCHIP MCS7730/7830 10/100 Ethernet url* at uhub? # Realtek RTL8150L based adapters Index: arch/macppc/conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/macppc/conf/RAMDISK,v retrieving revision 1.96 diff -u -p -r1.96 RAMDISK --- arch/macppc/conf/RAMDISK 20 Aug 2013 14:27:29 -0000 1.96 +++ arch/macppc/conf/RAMDISK 14 Nov 2013 19:48:13 -0000 @@ -175,6 +175,7 @@ kue* at uhub? # Kawasaki KL5KUSB101B b smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host +ugl* at uhub? # Genesys Logic GL620A-USB host-to-host udav* at uhub? # Davicom DM9601 based Ethernet mos* at uhub? # MOSCHIP MCS7730/7830 10/100 Ethernet ural* at uhub? # Ralink RT2500 Index: arch/sgi/conf/GENERIC-IP27 =================================================================== RCS file: /cvs/src/sys/arch/sgi/conf/GENERIC-IP27,v retrieving revision 1.47 diff -u -p -r1.47 GENERIC-IP27 --- arch/sgi/conf/GENERIC-IP27 5 Sep 2013 19:42:08 -0000 1.47 +++ arch/sgi/conf/GENERIC-IP27 14 Nov 2013 19:48:20 -0000 @@ -136,6 +136,7 @@ uath* at uhub? # Atheros AR5005UG/AR500 udav* at uhub? # Davicom DM9601 based Ethernet upgt* at uhub? # Conexant/Intersil PrismGT SoftMAC USB upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB url* at uhub? # Realtek RTL8150L based adapters urtw* at uhub? # RealTek 8187 Index: arch/sgi/conf/GENERIC-IP30 =================================================================== RCS file: /cvs/src/sys/arch/sgi/conf/GENERIC-IP30,v retrieving revision 1.41 diff -u -p -r1.41 GENERIC-IP30 --- arch/sgi/conf/GENERIC-IP30 5 Sep 2013 19:42:08 -0000 1.41 +++ arch/sgi/conf/GENERIC-IP30 14 Nov 2013 19:48:20 -0000 @@ -128,6 +128,7 @@ uath* at uhub? # Atheros AR5005UG/AR500 udav* at uhub? # Davicom DM9601 based Ethernet upgt* at uhub? # Conexant/Intersil PrismGT SoftMAC USB upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB url* at uhub? # Realtek RTL8150L based adapters urtw* at uhub? # RealTek 8187 Index: arch/sgi/conf/GENERIC-IP32 =================================================================== RCS file: /cvs/src/sys/arch/sgi/conf/GENERIC-IP32,v retrieving revision 1.32 diff -u -p -r1.32 GENERIC-IP32 --- arch/sgi/conf/GENERIC-IP32 5 Sep 2013 19:42:08 -0000 1.32 +++ arch/sgi/conf/GENERIC-IP32 14 Nov 2013 19:48:20 -0000 @@ -120,6 +120,7 @@ uath* at uhub? # Atheros AR5005UG/AR500 udav* at uhub? # Davicom DM9601 based Ethernet upgt* at uhub? # Conexant/Intersil PrismGT SoftMAC USB upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB url* at uhub? # Realtek RTL8150L based adapters urtw* at uhub? # RealTek 8187 Index: arch/sgi/conf/RAMDISK-IP27 =================================================================== RCS file: /cvs/src/sys/arch/sgi/conf/RAMDISK-IP27,v retrieving revision 1.27 diff -u -p -r1.27 RAMDISK-IP27 --- arch/sgi/conf/RAMDISK-IP27 27 Sep 2012 14:01:35 -0000 1.27 +++ arch/sgi/conf/RAMDISK-IP27 14 Nov 2013 19:48:20 -0000 @@ -130,6 +130,7 @@ uath* at uhub? # Atheros AR5005UG/AR500 udav* at uhub? # Davicom DM9601 based Ethernet upgt* at uhub? # Conexant/Intersil PrismGT SoftMAC USB upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB url* at uhub? # Realtek RTL8150L based adapters urtw* at uhub? # RealTek 8187 Index: arch/sgi/conf/RAMDISK-IP30 =================================================================== RCS file: /cvs/src/sys/arch/sgi/conf/RAMDISK-IP30,v retrieving revision 1.23 diff -u -p -r1.23 RAMDISK-IP30 --- arch/sgi/conf/RAMDISK-IP30 27 Sep 2012 14:01:35 -0000 1.23 +++ arch/sgi/conf/RAMDISK-IP30 14 Nov 2013 19:48:20 -0000 @@ -123,6 +123,7 @@ uath* at uhub? # Atheros AR5005UG/AR500 udav* at uhub? # Davicom DM9601 based Ethernet upgt* at uhub? # Conexant/Intersil PrismGT SoftMAC USB upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB url* at uhub? # Realtek RTL8150L based adapters urtw* at uhub? # RealTek 8187 Index: arch/sgi/conf/RAMDISK-IP32 =================================================================== RCS file: /cvs/src/sys/arch/sgi/conf/RAMDISK-IP32,v retrieving revision 1.19 diff -u -p -r1.19 RAMDISK-IP32 --- arch/sgi/conf/RAMDISK-IP32 27 Sep 2012 14:01:35 -0000 1.19 +++ arch/sgi/conf/RAMDISK-IP32 14 Nov 2013 19:48:26 -0000 @@ -113,6 +113,7 @@ uath* at uhub? # Atheros AR5005UG/AR500 udav* at uhub? # Davicom DM9601 based Ethernet upgt* at uhub? # Conexant/Intersil PrismGT SoftMAC USB upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB url* at uhub? # Realtek RTL8150L based adapters urtw* at uhub? # RealTek 8187 Index: arch/sparc64/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/sparc64/conf/GENERIC,v retrieving revision 1.273 diff -u -p -r1.273 GENERIC --- arch/sparc64/conf/GENERIC 5 Sep 2013 19:42:08 -0000 1.273 +++ arch/sparc64/conf/GENERIC 14 Nov 2013 19:48:29 -0000 @@ -218,6 +218,7 @@ urndis* at uhub? # Remote NDIS devices udav* at uhub? # Davicom DM9601 based Ethernet mos* at uhub? # MOSCHIP MCS7730/7830 10/100 Ethernet upl* at uhub? # Prolific PL2301/PL2302 host-to-host `network' +ugl* at uhub? # Genesys Logic GL620USB-A host-to-host `network' ural* at uhub? # Ralink RT2500USB uath* at uhub? # Atheros AR5005UG/AR5005UX rsu* at uhub? # Realtek RTL8188SU/RTL8191SU/RTL8192SU Index: arch/zaurus/conf/GENERIC =================================================================== RCS file: /cvs/src/sys/arch/zaurus/conf/GENERIC,v retrieving revision 1.89 diff -u -p -r1.89 GENERIC --- arch/zaurus/conf/GENERIC 20 Aug 2013 14:27:31 -0000 1.89 +++ arch/zaurus/conf/GENERIC 14 Nov 2013 19:48:33 -0000 @@ -115,6 +115,7 @@ smsc* at uhub? # SMSC LAN95xx Ethernet cdce* at uhub? # CDC Ethernet urndis* at uhub? # Remote NDIS devices upl* at uhub? # Prolific PL2301/PL2302 host-to-host +ugl* at uhub? # Genesys Logic GL620A-USB host-to-host udav* at uhub? # Davicom DM9601 based Ethernet ural* at uhub? # Ralink RT2500USB rum* at uhub? # Ralink RT2501USB/RT2601USB Index: arch/zaurus/conf/RAMDISK =================================================================== RCS file: /cvs/src/sys/arch/zaurus/conf/RAMDISK,v retrieving revision 1.45 diff -u -p -r1.45 RAMDISK --- arch/zaurus/conf/RAMDISK 20 Aug 2013 14:27:31 -0000 1.45 +++ arch/zaurus/conf/RAMDISK 14 Nov 2013 19:48:33 -0000 @@ -88,6 +88,7 @@ ural* at uhub? # Ralink RT2500 url* at uhub? # Realtek RTL8150L based adapters wi* at uhub? # WaveLAN IEEE 802.11DS upl* at uhub? # Prolific PL2301/PL2302 host-to-host +ugl* at uhub? # Genesys Logic GL620A-USB host-to-host #uyap* at uhub? # Y@P firmware loader #ugen* at uhub? # USB Generic driver umass* at uhub? # USB Mass Storage devices Index: dev/usb/files.usb =================================================================== RCS file: /cvs/src/sys/dev/usb/files.usb,v retrieving revision 1.110 diff -u -p -r1.110 files.usb --- dev/usb/files.usb 7 Oct 2013 05:37:41 -0000 1.110 +++ dev/usb/files.usb 14 Nov 2013 19:48:38 -0000 @@ -257,6 +257,11 @@ device upl: ifnet attach upl at uhub file dev/usb/if_upl.c upl +# Genesys Logic GL620USB-A host-host +device ugl: ether, ifnet, ifmedia +attach ugl at uhub +file dev/usb/if_ugl.c ugl + # Realtek RTL8150L(M) device url: ether, ifnet, mii attach url at uhub Index: dev/usb/if_ugl.c =================================================================== RCS file: dev/usb/if_ugl.c diff -N dev/usb/if_ugl.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ dev/usb/if_ugl.c 14 Nov 2013 19:48:39 -0000 @@ -0,0 +1,938 @@ +/* $OpenBSD$ */ +/* + * Copyright (c) 2000 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Lennart Augustsson ([email protected]) at + * Carlstedt Research & Technology. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Genesys Logic GL620USB-A driver + */ + +#include <bpfilter.h> + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/timeout.h> +#include <sys/sockio.h> +#include <sys/mbuf.h> +#include <sys/kernel.h> +#include <sys/socket.h> + +#include <sys/device.h> + +#include <net/if.h> +#include <net/if_types.h> +#include <net/if_dl.h> +#include <net/netisr.h> + +#if NBPFILTER > 0 +#include <net/bpf.h> +#endif + +#ifdef INET +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/if_ether.h> +#else +#error ugl without INET? +#endif + +#include <dev/usb/usb.h> +#include <dev/usb/usbdi.h> +#include <dev/usb/usbdi_util.h> +#include <dev/usb/usbdevs.h> + +#define UGL_INTR_PKTLEN 8 +#define UGL_BULK_PKTLEN 64 + +#define UGL_CONFIG_NO 1 +#define UGL_IFACE_IDX 0 + +/***/ + +#define UGL_INTR_INTERVAL 20 + +#define UGL_MAX_MTU 1514 +#define UGL_BUFSZ roundup(sizeof(struct ugl_packet), UGL_BULK_PKTLEN) + +#define UGL_RX_FRAMES 1 /* must be one */ +#define UGL_TX_FRAMES 1 /* must be one */ + +#define UGL_RX_LIST_CNT 1 +#define UGL_TX_LIST_CNT 1 + +#define UGL_ENDPT_RX 0x0 +#define UGL_ENDPT_TX 0x1 +#define UGL_ENDPT_INTR 0x2 +#define UGL_ENDPT_MAX 0x3 + +struct ugl_softc; + +struct ugl_packet { + uDWord pkt_count; + uDWord pkt_length; + char pkt_data[UGL_MAX_MTU]; +} __packed; + +struct ugl_chain { + struct ugl_softc *ugl_sc; + struct usbd_xfer *ugl_xfer; + struct ugl_packet *ugl_buf; + struct mbuf *ugl_mbuf; + int ugl_idx; +}; + +struct ugl_cdata { + struct ugl_chain ugl_tx_chain[UGL_TX_LIST_CNT]; + struct ugl_chain ugl_rx_chain[UGL_RX_LIST_CNT]; + int ugl_tx_prod; + int ugl_tx_cons; + int ugl_tx_cnt; + int ugl_rx_prod; +}; + +struct ugl_softc { + struct device sc_dev; + + struct arpcom sc_arpcom; +#define GET_IFP(sc) (&(sc)->sc_arpcom.ac_if) + struct timeout sc_stat_ch; + + struct usbd_device *sc_udev; + struct usbd_interface *sc_iface; + u_int16_t sc_vendor; + u_int16_t sc_product; + int sc_ed[UGL_ENDPT_MAX]; + struct usbd_pipe *sc_ep[UGL_ENDPT_MAX]; + struct ugl_cdata sc_cdata; + + uByte sc_ibuf[UGL_INTR_PKTLEN]; + + int sc_unit; + u_int sc_rx_errs; + struct timeval sc_rx_notice; + u_int sc_intr_errs; +}; + +#ifdef UGL_DEBUG +#define DPRINTF(x) do { if (ugldebug) printf x; } while (0) +#define DPRINTFN(n,x) do { if (ugldebug >= (n)) printf x; } while (0) +int ugldebug = 0; +#else +#define DPRINTF(x) +#define DPRINTFN(n,x) +#endif + +extern int ticks; + +/* + * Various supported device vendors/products. + */ +struct usb_devno ugl_devs[] = { + { USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL620USB_A }, +}; + +int ugl_match(struct device *, void *, void *); +void ugl_attach(struct device *, struct device *, void *); +int ugl_detach(struct device *, int); +int ugl_activate(struct device *, int); + +struct cfdriver ugl_cd = { + NULL, "ugl", DV_IFNET +}; + +const struct cfattach ugl_ca = { + sizeof(struct ugl_softc), + ugl_match, + ugl_attach, + ugl_detach, + ugl_activate, +}; + +int ugl_openpipes(struct ugl_softc *); +int ugl_tx_list_init(struct ugl_softc *); +int ugl_rx_list_init(struct ugl_softc *); +int ugl_newbuf(struct ugl_softc *, struct ugl_chain *, struct mbuf *); +int ugl_send(struct ugl_softc *, struct mbuf *, int); +void ugl_intr(struct usbd_xfer *, void *, usbd_status); +void ugl_rxeof(struct usbd_xfer *, void *, usbd_status); +void ugl_txeof(struct usbd_xfer *, void *, usbd_status); +void ugl_start(struct ifnet *); +int ugl_ioctl(struct ifnet *, u_long, caddr_t); +void ugl_init(void *); +void ugl_stop(struct ugl_softc *); +void ugl_watchdog(struct ifnet *); + +/* + * Probe for a Genesys Logic chip. + */ +int +ugl_match(struct device *parent, void *match, void *aux) +{ + struct usb_attach_arg *uaa = aux; + + if (uaa->iface != NULL) + return (UMATCH_NONE); + + return (usb_lookup(ugl_devs, uaa->vendor, uaa->product) != NULL ? + UMATCH_VENDOR_PRODUCT : UMATCH_NONE); +} + +void +ugl_attach(struct device *parent, struct device *self, void *aux) +{ + struct ugl_softc *sc = (struct ugl_softc *)self; + struct usb_attach_arg *uaa = aux; + int s; + struct usbd_device *dev = uaa->device; + struct usbd_interface *iface; + usbd_status err; + struct ifnet *ifp; + usb_interface_descriptor_t *id; + usb_endpoint_descriptor_t *ed; + int i; + u_int16_t macaddr_hi; + + DPRINTFN(5,(" : ugl_attach: sc=%p, dev=%p", sc, dev)); + + err = usbd_set_config_no(dev, UGL_CONFIG_NO, 1); + if (err) { + printf("%s: setting config no failed\n", + sc->sc_dev.dv_xname); + return; + } + + sc->sc_unit = self->dv_unit; + sc->sc_udev = dev; + sc->sc_product = uaa->product; + sc->sc_vendor = uaa->vendor; + + err = usbd_device2interface_handle(dev, UGL_IFACE_IDX, &iface); + if (err) { + printf("%s: getting interface handle failed\n", + sc->sc_dev.dv_xname); + return; + } + + sc->sc_iface = iface; + id = usbd_get_interface_descriptor(iface); + + /* Find endpoints. */ + for (i = 0; i < id->bNumEndpoints; i++) { + ed = usbd_interface2endpoint_descriptor(iface, i); + if (ed == NULL) { + printf("%s: couldn't get ep %d\n", + sc->sc_dev.dv_xname, i); + return; + } + if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && + UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { + sc->sc_ed[UGL_ENDPT_RX] = ed->bEndpointAddress; + } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && + UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { + sc->sc_ed[UGL_ENDPT_TX] = ed->bEndpointAddress; + } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && + UE_GET_XFERTYPE(ed->bmAttributes) == UE_INTERRUPT) { + sc->sc_ed[UGL_ENDPT_INTR] = ed->bEndpointAddress; + } + } + + if (sc->sc_ed[UGL_ENDPT_RX] == 0 || sc->sc_ed[UGL_ENDPT_TX] == 0 || + sc->sc_ed[UGL_ENDPT_INTR] == 0) { + printf("%s: missing endpoint\n", sc->sc_dev.dv_xname); + return; + } + + s = splnet(); + + macaddr_hi = htons(0x2acb); + bcopy(&macaddr_hi, &sc->sc_arpcom.ac_enaddr[0], sizeof(u_int16_t)); + bcopy(&ticks, &sc->sc_arpcom.ac_enaddr[2], sizeof(u_int32_t)); + sc->sc_arpcom.ac_enaddr[5] = (u_int8_t)(sc->sc_unit); + + printf("%s: address %s\n", + sc->sc_dev.dv_xname, ether_sprintf(sc->sc_arpcom.ac_enaddr)); + + /* Initialize interface info.*/ + ifp = GET_IFP(sc); + ifp->if_softc = sc; + ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_ioctl = ugl_ioctl; + ifp->if_start = ugl_start; + ifp->if_watchdog = ugl_watchdog; + strlcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ); + + IFQ_SET_READY(&ifp->if_snd); + + /* Attach the interface. */ + if_attach(ifp); + ether_ifattach(ifp); + + splx(s); +} + +int +ugl_detach(struct device *self, int flags) +{ + struct ugl_softc *sc = (struct ugl_softc *)self; + struct ifnet *ifp = GET_IFP(sc); + int s; + + DPRINTFN(2,("%s: %s: enter\n", sc->sc_dev.dv_xname, __func__)); + + s = splusb(); + + if (ifp->if_flags & IFF_RUNNING) + ugl_stop(sc); + + if (ifp->if_softc != NULL) + if_detach(ifp); + +#ifdef DIAGNOSTIC + if (sc->sc_ep[UGL_ENDPT_TX] != NULL || + sc->sc_ep[UGL_ENDPT_RX] != NULL || + sc->sc_ep[UGL_ENDPT_INTR] != NULL) + printf("%s: detach has active endpoints\n", + sc->sc_dev.dv_xname); +#endif + + splx(s); + + return (0); +} + +int +ugl_activate(struct device *self, int act) +{ + struct ugl_softc *sc = (struct ugl_softc *)self; + + switch (act) { + case DVACT_DEACTIVATE: + usbd_deactivate(sc->sc_udev); + break; + } + return (0); +} + +/* + * Initialize an RX descriptor and attach an MBUF cluster. + */ +int +ugl_newbuf(struct ugl_softc *sc, struct ugl_chain *c, struct mbuf *m) +{ + struct mbuf *m_new = NULL; + + DPRINTFN(8,("%s: %s: enter\n", sc->sc_dev.dv_xname, __func__)); + + if (m == NULL) { + MGETHDR(m_new, M_DONTWAIT, MT_DATA); + if (m_new == NULL) { + printf("%s: no memory for rx list " + "-- packet dropped!\n", sc->sc_dev.dv_xname); + return (ENOBUFS); + } + + MCLGET(m_new, M_DONTWAIT); + if (!(m_new->m_flags & M_EXT)) { + printf("%s: no memory for rx list " + "-- packet dropped!\n", sc->sc_dev.dv_xname); + m_freem(m_new); + return (ENOBUFS); + } + m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; + } else { + m_new = m; + m_new->m_len = m_new->m_pkthdr.len = MCLBYTES; + m_new->m_data = m_new->m_ext.ext_buf; + } + + c->ugl_mbuf = m_new; + + return (0); +} + +int +ugl_rx_list_init(struct ugl_softc *sc) +{ + struct ugl_cdata *cd; + struct ugl_chain *c; + int i; + + DPRINTFN(5,("%s: %s: enter\n", sc->sc_dev.dv_xname, __func__)); + + cd = &sc->sc_cdata; + for (i = 0; i < UGL_RX_LIST_CNT; i++) { + c = &cd->ugl_rx_chain[i]; + c->ugl_sc = sc; + c->ugl_idx = i; + if (ugl_newbuf(sc, c, NULL) == ENOBUFS) + return (ENOBUFS); + if (c->ugl_xfer == NULL) { + c->ugl_xfer = usbd_alloc_xfer(sc->sc_udev); + if (c->ugl_xfer == NULL) + return (ENOBUFS); + c->ugl_buf = usbd_alloc_buffer(c->ugl_xfer, UGL_BUFSZ); + if (c->ugl_buf == NULL) { + usbd_free_xfer(c->ugl_xfer); + return (ENOBUFS); + } + } + } + + return (0); +} + +int +ugl_tx_list_init(struct ugl_softc *sc) +{ + struct ugl_cdata *cd; + struct ugl_chain *c; + int i; + + DPRINTFN(5,("%s: %s: enter\n", sc->sc_dev.dv_xname, __func__)); + + cd = &sc->sc_cdata; + for (i = 0; i < UGL_TX_LIST_CNT; i++) { + c = &cd->ugl_tx_chain[i]; + c->ugl_sc = sc; + c->ugl_idx = i; + c->ugl_mbuf = NULL; + if (c->ugl_xfer == NULL) { + c->ugl_xfer = usbd_alloc_xfer(sc->sc_udev); + if (c->ugl_xfer == NULL) + return (ENOBUFS); + c->ugl_buf = usbd_alloc_buffer(c->ugl_xfer, UGL_BUFSZ); + if (c->ugl_buf == NULL) { + usbd_free_xfer(c->ugl_xfer); + return (ENOBUFS); + } + } + } + + return (0); +} + +/* + * A frame has been uploaded: pass the resulting mbuf chain up to + * the higher level protocols. + */ +void +ugl_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status) +{ + struct ugl_chain *c = priv; + struct ugl_softc *sc = c->ugl_sc; + struct ifnet *ifp = GET_IFP(sc); + struct mbuf *m; + int total_len = 0; + unsigned int packet_len, packet_count; + int s; + + if (usbd_is_dying(sc->sc_udev)) + return; + + if (!(ifp->if_flags & IFF_RUNNING)) + return; + + if (status != USBD_NORMAL_COMPLETION) { + if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) + return; + sc->sc_rx_errs++; + if (usbd_ratecheck(&sc->sc_rx_notice)) { + printf("%s: %u usb errors on rx: %s\n", + sc->sc_dev.dv_xname, sc->sc_rx_errs, + usbd_errstr(status)); + sc->sc_rx_errs = 0; + } + if (status == USBD_STALLED) + usbd_clear_endpoint_stall_async(sc->sc_ep[UGL_ENDPT_RX]); + goto done; + } + + usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL); + + DPRINTFN(9,("%s: %s: enter status=%d length=%d\n", + sc->sc_dev.dv_xname, __func__, status, total_len)); + + if (total_len < offsetof(struct ugl_packet, pkt_data)) { + printf("%s: bad header (length=%d)\n", + sc->sc_dev.dv_xname, total_len); + + goto done; + } + + packet_count = UGETDW(c->ugl_buf->pkt_count); + if (packet_count != UGL_RX_FRAMES) { + printf("%s: bad packet count (%d)\n", + sc->sc_dev.dv_xname, packet_count); + + if (packet_count == 0) + goto done; + } + + packet_len = UGETDW(c->ugl_buf->pkt_length); + if (total_len < packet_len) { + printf("%s: bad packet size(%d), length=%d\n", + sc->sc_dev.dv_xname, packet_len, total_len); + + if (packet_len == 0) + goto done; + } + + m = c->ugl_mbuf; + memcpy(mtod(c->ugl_mbuf, char *), c->ugl_buf->pkt_data, packet_len); + + ifp->if_ipackets++; + m->m_pkthdr.len = m->m_len = packet_len; + + m->m_pkthdr.rcvif = ifp; + + s = splnet(); + + /* XXX ugly */ + if (ugl_newbuf(sc, c, NULL) == ENOBUFS) { + ifp->if_ierrors++; + goto done1; + } + +#if NBPFILTER > 0 + /* + * Handle BPF listeners. Let the BPF user see the packet, but + * don't pass it up to the ether_input() layer unless it's + * a broadcast packet, multicast packet, matches our ethernet + * address or the interface is in promiscuous mode. + */ + if (ifp->if_bpf) { + bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_IN); + } +#endif + + DPRINTFN(10,("%s: %s: deliver %d\n", sc->sc_dev.dv_xname, + __func__, m->m_len)); + + ether_input_mbuf(ifp, m); + + done1: + splx(s); + + done: + /* Setup new transfer. */ + usbd_setup_xfer(c->ugl_xfer, sc->sc_ep[UGL_ENDPT_RX], + c, c->ugl_buf, UGL_BUFSZ, USBD_SHORT_XFER_OK | USBD_NO_COPY, + USBD_NO_TIMEOUT, ugl_rxeof); + usbd_transfer(c->ugl_xfer); + + DPRINTFN(10,("%s: %s: start rx\n", sc->sc_dev.dv_xname, + __func__)); +} + +/* + * A frame was downloaded to the chip. It's safe for us to clean up + * the list buffers. + */ +void +ugl_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status) +{ + struct ugl_chain *c = priv; + struct ugl_softc *sc = c->ugl_sc; + struct ifnet *ifp = GET_IFP(sc); + int s; + + if (usbd_is_dying(sc->sc_udev)) + return; + + s = splnet(); + + DPRINTFN(10,("%s: %s: enter status=%d\n", sc->sc_dev.dv_xname, + __func__, status)); + + ifp->if_timer = 0; + ifp->if_flags &= ~IFF_OACTIVE; + + if (status != USBD_NORMAL_COMPLETION) { + if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) { + splx(s); + return; + } + ifp->if_oerrors++; + printf("%s: usb error on tx: %s\n", sc->sc_dev.dv_xname, + usbd_errstr(status)); + if (status == USBD_STALLED) + usbd_clear_endpoint_stall_async(sc->sc_ep[UGL_ENDPT_TX]); + splx(s); + return; + } + + ifp->if_opackets++; + + m_freem(c->ugl_mbuf); + c->ugl_mbuf = NULL; + + if (IFQ_IS_EMPTY(&ifp->if_snd) == 0) + ugl_start(ifp); + + splx(s); +} + +int +ugl_send(struct ugl_softc *sc, struct mbuf *m, int idx) +{ + int total_len; + struct ugl_chain *c; + usbd_status err; + + c = &sc->sc_cdata.ugl_tx_chain[idx]; + + /* + * Copy the mbuf data into a contiguous buffer, leaving two + * bytes at the beginning to hold the frame length. + */ + USETDW(c->ugl_buf->pkt_count, UGL_TX_FRAMES); + USETDW(c->ugl_buf->pkt_length, m->m_pkthdr.len); + m_copydata(m, 0, m->m_pkthdr.len, c->ugl_buf->pkt_data); + c->ugl_mbuf = m; + + total_len = offsetof(struct ugl_packet, pkt_data[m->m_pkthdr.len]); + + DPRINTFN(10,("%s: %s: total_len=%d\n", + sc->sc_dev.dv_xname, __func__, total_len)); + + usbd_setup_xfer(c->ugl_xfer, sc->sc_ep[UGL_ENDPT_TX], + c, c->ugl_buf, total_len, USBD_FORCE_SHORT_XFER | USBD_NO_COPY, + USBD_DEFAULT_TIMEOUT, ugl_txeof); + + /* Transmit */ + err = usbd_transfer(c->ugl_xfer); + if (err != USBD_IN_PROGRESS) { + printf("%s: ugl_send error=%s\n", sc->sc_dev.dv_xname, + usbd_errstr(err)); + ugl_stop(sc); + return (EIO); + } + + sc->sc_cdata.ugl_tx_cnt++; + + return (0); +} + +void +ugl_start(struct ifnet *ifp) +{ + struct ugl_softc *sc = ifp->if_softc; + struct mbuf *m_head = NULL; + + if (usbd_is_dying(sc->sc_udev)) + return; + + DPRINTFN(10,("%s: %s: enter\n", sc->sc_dev.dv_xname,__func__)); + + if (ifp->if_flags & IFF_OACTIVE) + return; + + IFQ_POLL(&ifp->if_snd, m_head); + if (m_head == NULL) + return; + + if (ugl_send(sc, m_head, 0)) { + ifp->if_flags |= IFF_OACTIVE; + return; + } + + IFQ_DEQUEUE(&ifp->if_snd, m_head); + +#if NBPFILTER > 0 + /* + * If there's a BPF listener, bounce a copy of this frame + * to him. + */ + if (ifp->if_bpf) + bpf_mtap(ifp->if_bpf, m_head, BPF_DIRECTION_OUT); +#endif + + ifp->if_flags |= IFF_OACTIVE; + + /* + * Set a timeout in case the chip goes out to lunch. + */ + ifp->if_timer = 5; +} + +void +ugl_init(void *xsc) +{ + struct ugl_softc *sc = xsc; + struct ifnet *ifp = GET_IFP(sc); + int s; + + if (usbd_is_dying(sc->sc_udev)) + return; + + DPRINTFN(10,("%s: %s: enter\n", sc->sc_dev.dv_xname,__func__)); + + if (ifp->if_flags & IFF_RUNNING) + return; + + s = splnet(); + + /* Init TX ring. */ + if (ugl_tx_list_init(sc) == ENOBUFS) { + printf("%s: tx list init failed\n", sc->sc_dev.dv_xname); + splx(s); + return; + } + + /* Init RX ring. */ + if (ugl_rx_list_init(sc) == ENOBUFS) { + printf("%s: rx list init failed\n", sc->sc_dev.dv_xname); + splx(s); + return; + } + + if (sc->sc_ep[UGL_ENDPT_RX] == NULL) { + if (ugl_openpipes(sc)) { + splx(s); + return; + } + } + + ifp->if_flags |= IFF_RUNNING; + ifp->if_flags &= ~IFF_OACTIVE; + + splx(s); +} + +int +ugl_openpipes(struct ugl_softc *sc) +{ + struct ugl_chain *c; + usbd_status err; + int i; + + /* Open RX and TX pipes. */ + err = usbd_open_pipe(sc->sc_iface, sc->sc_ed[UGL_ENDPT_RX], + USBD_EXCLUSIVE_USE, &sc->sc_ep[UGL_ENDPT_RX]); + if (err) { + printf("%s: open rx pipe failed: %s\n", + sc->sc_dev.dv_xname, usbd_errstr(err)); + return (EIO); + } + err = usbd_open_pipe(sc->sc_iface, sc->sc_ed[UGL_ENDPT_TX], + USBD_EXCLUSIVE_USE, &sc->sc_ep[UGL_ENDPT_TX]); + if (err) { + printf("%s: open tx pipe failed: %s\n", + sc->sc_dev.dv_xname, usbd_errstr(err)); + return (EIO); + } + err = usbd_open_pipe_intr(sc->sc_iface, sc->sc_ed[UGL_ENDPT_INTR], + USBD_EXCLUSIVE_USE, &sc->sc_ep[UGL_ENDPT_INTR], sc, + sc->sc_ibuf, UGL_INTR_PKTLEN, ugl_intr, + UGL_INTR_INTERVAL); + if (err) { + printf("%s: open intr pipe failed: %s\n", + sc->sc_dev.dv_xname, usbd_errstr(err)); + return (EIO); + } + + /* Start up the receive pipe. */ + for (i = 0; i < UGL_RX_LIST_CNT; i++) { + c = &sc->sc_cdata.ugl_rx_chain[i]; + usbd_setup_xfer(c->ugl_xfer, sc->sc_ep[UGL_ENDPT_RX], + c, c->ugl_buf, UGL_BUFSZ, + USBD_SHORT_XFER_OK | USBD_NO_COPY, USBD_NO_TIMEOUT, + ugl_rxeof); + usbd_transfer(c->ugl_xfer); + } + + return (0); +} + +void +ugl_intr(struct usbd_xfer *xfer, void *priv, usbd_status status) +{ + struct ugl_softc *sc = priv; + struct ifnet *ifp = GET_IFP(sc); + int i; + + DPRINTFN(15,("%s: %s: enter\n", sc->sc_dev.dv_xname,__func__)); + + if (usbd_is_dying(sc->sc_udev)) + return; + + if (!(ifp->if_flags & IFF_RUNNING)) + return; + + if (status != USBD_NORMAL_COMPLETION) { + if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) { + return; + } + sc->sc_intr_errs++; + if (usbd_ratecheck(&sc->sc_rx_notice)) { + printf("%s: %u usb errors on intr: %s\n", + sc->sc_dev.dv_xname, sc->sc_rx_errs, + usbd_errstr(status)); + sc->sc_intr_errs = 0; + } + if (status == USBD_STALLED) + usbd_clear_endpoint_stall_async(sc->sc_ep[UGL_ENDPT_RX]); + return; + } + + DPRINTFN(10,("%s: %s:", sc->sc_dev.dv_xname, __func__)); + for (i = 0; i < UGL_INTR_PKTLEN; i++) + DPRINTFN(10,(" 0x%02x", sc->sc_ibuf[i])); + DPRINTFN(10,("\n")); + +} + +int +ugl_ioctl(struct ifnet *ifp, u_long command, caddr_t data) +{ + struct ugl_softc *sc = ifp->if_softc; + struct ifaddr *ifa = (struct ifaddr *)data; + struct ifreq *ifr = (struct ifreq *)data; + int s, error = 0; + + if (usbd_is_dying(sc->sc_udev)) + return (EIO); + + DPRINTFN(5,("%s: %s: cmd=0x%08lx\n", + sc->sc_dev.dv_xname, __func__, command)); + + s = splnet(); + + switch(command) { + case SIOCSIFADDR: + ifp->if_flags |= IFF_UP; + ugl_init(sc); + + switch (ifa->ifa_addr->sa_family) { +#ifdef INET + case AF_INET: + arp_ifinit(&sc->sc_arpcom, ifa); + break; +#endif /* INET */ + } + break; + + case SIOCSIFMTU: + if (ifr->ifr_mtu > UGL_MAX_MTU) + error = EINVAL; + else + ifp->if_mtu = ifr->ifr_mtu; + break; + + case SIOCSIFFLAGS: + if (ifp->if_flags & IFF_UP) { + if (!(ifp->if_flags & IFF_RUNNING)) + ugl_init(sc); + } else { + if (ifp->if_flags & IFF_RUNNING) + ugl_stop(sc); + } + error = 0; + break; + default: + error = ENOTTY; + break; + } + + splx(s); + return (error); +} + +void +ugl_watchdog(struct ifnet *ifp) +{ + struct ugl_softc *sc = ifp->if_softc; + + if (usbd_is_dying(sc->sc_udev)) + return; + + ifp->if_oerrors++; + printf("%s: watchdog timeout\n", sc->sc_dev.dv_xname); +} + +/* + * Stop the adapter and free any mbufs allocated to the + * RX and TX lists. + */ +void +ugl_stop(struct ugl_softc *sc) +{ + struct ifnet *ifp; + int i; + + DPRINTFN(10,("%s: %s: enter\n", sc->sc_dev.dv_xname,__func__)); + + ifp = GET_IFP(sc); + ifp->if_timer = 0; + ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); + + /* Stop transfers. */ + if (sc->sc_ep[UGL_ENDPT_RX] != NULL) { + usbd_abort_pipe(sc->sc_ep[UGL_ENDPT_RX]); + usbd_close_pipe(sc->sc_ep[UGL_ENDPT_RX]); + sc->sc_ep[UGL_ENDPT_RX] = NULL; + } + + if (sc->sc_ep[UGL_ENDPT_TX] != NULL) { + usbd_abort_pipe(sc->sc_ep[UGL_ENDPT_TX]); + usbd_close_pipe(sc->sc_ep[UGL_ENDPT_TX]); + sc->sc_ep[UGL_ENDPT_TX] = NULL; + } + + if (sc->sc_ep[UGL_ENDPT_INTR] != NULL) { + usbd_abort_pipe(sc->sc_ep[UGL_ENDPT_INTR]); + usbd_close_pipe(sc->sc_ep[UGL_ENDPT_INTR]); + sc->sc_ep[UGL_ENDPT_INTR] = NULL; + } + + /* Free RX resources. */ + for (i = 0; i < UGL_RX_LIST_CNT; i++) { + if (sc->sc_cdata.ugl_rx_chain[i].ugl_mbuf != NULL) { + m_freem(sc->sc_cdata.ugl_rx_chain[i].ugl_mbuf); + sc->sc_cdata.ugl_rx_chain[i].ugl_mbuf = NULL; + } + if (sc->sc_cdata.ugl_rx_chain[i].ugl_xfer != NULL) { + usbd_free_xfer(sc->sc_cdata.ugl_rx_chain[i].ugl_xfer); + sc->sc_cdata.ugl_rx_chain[i].ugl_xfer = NULL; + } + } + + /* Free TX resources. */ + for (i = 0; i < UGL_TX_LIST_CNT; i++) { + if (sc->sc_cdata.ugl_tx_chain[i].ugl_mbuf != NULL) { + m_freem(sc->sc_cdata.ugl_tx_chain[i].ugl_mbuf); + sc->sc_cdata.ugl_tx_chain[i].ugl_mbuf = NULL; + } + if (sc->sc_cdata.ugl_tx_chain[i].ugl_xfer != NULL) { + usbd_free_xfer(sc->sc_cdata.ugl_tx_chain[i].ugl_xfer); + sc->sc_cdata.ugl_tx_chain[i].ugl_xfer = NULL; + } + } +} Index: dev/usb/usbdevs =================================================================== RCS file: /cvs/src/sys/dev/usb/usbdevs,v retrieving revision 1.610 diff -u -p -r1.610 usbdevs --- dev/usb/usbdevs 30 Oct 2013 12:28:19 -0000 1.610 +++ dev/usb/usbdevs 14 Nov 2013 19:48:47 -0000 @@ -1921,6 +1921,7 @@ product GCTSEMICON INSTALL 0x7f40 GDM720 product GEMPLUS PROXPU 0x5501 Prox-PU/CU /* Genesys Logic products */ +product GENESYS GL620USB_A 0x0502 GL620USB-A GeneLink USB-USB Bridge product GENESYS GENELINK 0x05e3 GeneLink Host-Host Bridge product GENESYS GL650 0x0604 GL650 Hub product GENESYS GL641USB 0x0700 GL641USB CompactFlash Index: dev/usb/usbdevs.h =================================================================== RCS file: /cvs/src/sys/dev/usb/usbdevs.h,v retrieving revision 1.621 diff -u -p -r1.621 usbdevs.h --- dev/usb/usbdevs.h 30 Oct 2013 12:35:31 -0000 1.621 +++ dev/usb/usbdevs.h 14 Nov 2013 19:48:59 -0000 @@ -1928,6 +1928,7 @@ #define USB_PRODUCT_GEMPLUS_PROXPU 0x5501 /* Prox-PU/CU */ /* Genesys Logic products */ +#define USB_PRODUCT_GENESYS_GL620USB_A 0x0502 /* GL620USB-A GeneLink USB-USB Bridge */ #define USB_PRODUCT_GENESYS_GENELINK 0x05e3 /* GeneLink Host-Host Bridge */ #define USB_PRODUCT_GENESYS_GL650 0x0604 /* GL650 Hub */ #define USB_PRODUCT_GENESYS_GL641USB 0x0700 /* GL641USB CompactFlash */ Index: dev/usb/usbdevs_data.h =================================================================== RCS file: /cvs/src/sys/dev/usb/usbdevs_data.h,v retrieving revision 1.615 diff -u -p -r1.615 usbdevs_data.h --- dev/usb/usbdevs_data.h 30 Oct 2013 12:35:31 -0000 1.615 +++ dev/usb/usbdevs_data.h 14 Nov 2013 19:49:07 -0000 @@ -3850,6 +3850,10 @@ const struct usb_known_product usb_known "Prox-PU/CU", }, { + USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GL620USB_A, + "GL620USB-A GeneLink USB-USB Bridge", + }, + { USB_VENDOR_GENESYS, USB_PRODUCT_GENESYS_GENELINK, "GeneLink Host-Host Bridge", },
