通过修改内核提高3G上网卡设备速率(usbserial.c)

由于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,在信号好的地方或许还可以更快。。。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部