Итак, главная проблема пониженной скорости - малый размер буферов. На просторах инета нашел патч, но он напрямую не пошел (видать к другой версии был), хотя адаптировать его труда не составило

, после этих изменений скорость скачивания достигала 200кБ/с (одним словом как в винде)...
Проблема касается ubsa.c
Код: Выделить всё
--- ubsa.c.orig 2007-06-22 08:56:05.000000000 +0300
+++ ubsa.c 2008-12-23 20:48:22.000000000 +0200
@@ -89,9 +89,11 @@
#include <dev/usb/ucomvar.h>
+SYSCTL_NODE(_hw_usb, OID_AUTO, ubsa, CTLFLAG_RW, 0, "USB ubsa");
+
#ifdef USB_DEBUG
static int ubsadebug = 0;
-SYSCTL_NODE(_hw_usb, OID_AUTO, ubsa, CTLFLAG_RW, 0, "USB ubsa");
+//SYSCTL_NODE(_hw_usb, OID_AUTO, ubsa, CTLFLAG_RW, 0, "USB ubsa");
SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, debug, CTLFLAG_RW,
&ubsadebug, 0, "ubsa debug level");
@@ -102,6 +104,17 @@
#else
#define DPRINTFN(n, x)
#endif
+
+int ubsaibufsize = 4096;
+int ubsaobufsize = 256;
+TUNABLE_INT("hw.usb.ubsa.ibufsize", &ubsaibufsize);
+TUNABLE_INT("hw.usb.ubsa.obufsize", &ubsaobufsize);
+SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, ibufsize, CTLFLAG_RD,
+ &ubsaibufsize, 0, "ubsa input packet length");
+SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, obufsize, CTLFLAG_RD,
+ &ubsaobufsize, 0, "ubsa output packet length");
+#define UBSAIBUFSIZE (ubsaibufsize)
+#define UBSAOBUFSIZE (ubsaobufsize)
#define DPRINTF(x) DPRINTFN(0, x)
#define UBSA_MODVER 1 /* module version */
@@ -212,6 +225,8 @@
} ubsa_products [] = {
/* AnyData ADU-E100A/H */
{ USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_E100X },
+ /* AnyData ADU-500A */
+ { USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_500A },
/* BELKIN F5U103 */
{ USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U103 },
/* BELKIN F5U120 */
@@ -362,10 +377,19 @@
} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
ucom->sc_bulkin_no = ed->bEndpointAddress;
+
+if (uaa->product == USB_PRODUCT_ANYDATA_ADU_500A)
+ucom->sc_ibufsize = UBSAIBUFSIZE; //UGETW(ed->wMaxPacketSize);
+else
+
ucom->sc_ibufsize = UGETW(ed->wMaxPacketSize);
} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT &&
UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
ucom->sc_bulkout_no = ed->bEndpointAddress;
+
+if (uaa->product == USB_PRODUCT_ANYDATA_ADU_500A)
+ucom->sc_obufsize = UBSAOBUFSIZE; //UGETW(ed->wMaxPacketSize);
+else
ucom->sc_obufsize = UGETW(ed->wMaxPacketSize);
}
}
@@ -730,6 +754,8 @@
struct ubsa_softc *sc;
sc = arg;
+ if(sc->sc_ucom.sc_dying)
+ return;
ucom_status_change(&sc->sc_ucom);
}
Да,
Код: Выделить всё
Acheron# uname -v
FreeBSD 7.0-RELEASE #11: Mon Dec 22 22:19:14 EET 2008 oleg@Acheron.local:/usr/obj/usr/src/sys/ACHERON
P.S. Вот еще бы решить проблему с "паникой"
