由于linux内核中usbserial模块是为低速usb设备所设计,无法应对目前的3G无线USB上网卡设备的高速模式,所以虽然在linux下可正常拔号,最高速度仍然只能达到62K/s,为解决此问题可通过修改linux内核代码中的usbserial来完成。
参考链接: http://www.linuxsir.org/bbs/thread350300.html
由于以上链接是基于2.6.28,其中的patch已经不再可用,由于linux内核版本更新较快,所以我也不再做新补丁,而手动修改代码。
以下是我进行的再整理:
1、修改内核usbserial.c代码
先进行备份
# cp /usr/src/linux/drivers/usb/serial/usb-serial.c /usr/src/linux/drivers/usb/serial/usb-serial.c.2.6.31
根据以下内容修改
带“+”的行为要添加的内容
# vim /usr/src/linux/drivers/usb/serial/usb-serial.c
@@ -58,4 +58,5 @@
*/
+static ushort maxRSize, maxWSize, maxISize;
static int debug;
static struct usb_serial *serial_table[SERIAL_TTY_MINORS]; /* initially all NULL */
@@ -817,4 +818,6 @@
}
buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
+ if (buffer_size < maxRSize)
+ buffer_size = maxRSize;
port->bulk_in_size = buffer_size;
port->bulk_in_endpointAddress = endpoint->bEndpointAddress;
@@ -841,4 +844,6 @@
}
buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
+ if (buffer_size < maxWSize)
+ buffer_size = maxWSize;
port->bulk_out_size = buffer_size;
port->bulk_out_endpointAddress = endpoint->bEndpointAddress;
@@ -866,4 +871,6 @@
}
buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
+ if (buffer_size < maxISize)
+ buffer_size = maxISize;
port->interrupt_in_endpointAddress = endpoint->bEndpointAddress;
port->interrupt_in_buffer = kmalloc (buffer_size, GFP_KERNEL);
@@ -1191,2 +1198,8 @@
module_param(debug, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Debug enabled or not");
+module_param(maxRSize, ushort, 0);
+MODULE_PARM_DESC(maxRSize, "User specified USB input buffer size");
+module_param(maxWSize, ushort, 0);
+MODULE_PARM_DESC(maxWSize, "User specified USB output buffer size");
+module_param(maxISize, ushort, 0);
+MODULE_PARM_DESC(maxISize, "User specified USB interrupt buffer size");
2、编译修改后的模块(这里实际上编译了所有的USB串口模块,但至少比编译整个内核快得多)
make -C /lib/modules/$(uname -r)/build M=/usr/src/linux-2.6.31/drivers/usb/serial
3、备份当前使用的usbserial.ko,然后将上步生成的usbserial.ko copy到/lib/modules/kernel/drivers/usb/serial/
# cp /lib/modules/2.6.31-tuxonice/kernel/drivers/usb/serial/usbserial.ko /lib/modules/2.6.31-tuxonice/kernel/drivers/usb/serial/usbserial.ko.2.6.31
# cp /lib/modules/2.6.31-tuxonice/build/drivers/usb/serial/usbserial.ko /lib/modules/2.6.31-tuxonice/kernel/drivers/usb/serial/
4、卸载掉旧的usbserial(rmmod usbserial),然后载入新的usbserial,现在我们可以分别指定usbserial使用的接收与发送缓冲区的大小了,modprobe usbserial vendor=0x19d2 product=0xfff1 maxRSize=4096 maxWSize=1024
5、再次拔号后测试下载速度已可达到200多Kb,在信号好的地方或许还可以更快。。。