网上有QF9700/RD9700的开源驱动,点此下载。但是最高只支持Linux 2.6.32,在Linux 3.0.8编译下会出现错误,如下:

Building QF9700 USB2NET chip driver...
make[1]: 正在进入目录 `/home/snail/文档/Project/FriendlyArm/linux-3.0.8'
  CC [M]  /home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.o
/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.c: In function 'qf9700_set_multicast':
/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.c:356:45: error: 'struct net_device' has no member named 'mc_count'
/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.c:358:16: error: 'struct net_device' has no member named 'mc_count'
/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.c:359:36: error: 'struct net_device' has no member named 'mc_list'
/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.c:362:22: error: 'struct net_device' has no member named 'mc_count'
/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.c:362:56: error: dereferencing pointer to incomplete type
/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.c:363:14: error: dereferencing pointer to incomplete type
make[2]: *** [/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700/qf9700.o] 错误 1
make[1]: *** [_module_/home/snail/文档/Project/FriendlyArm/qf9700-2.6.32/qf9700] 错误 2
make[1]:正在离开目录 `/home/snail/文档/Project/FriendlyArm/linux-3.0.8'
make: *** [all] 错误 2

为此,写了一个补丁。

diff -ur b/qf9700.c a/qf9700.c
--- b/qf9700.c  2011-01-21 17:59:58.000000000 +0800
+++ a/qf9700.c  2014-04-15 18:37:50.000000000 +0800
@@ -353,14 +353,13 @@

    if (net->flags & IFF_PROMISC) {
        rx_ctl |= 0x02;
-   } else if (net->flags & IFF_ALLMULTI || net->mc_count > QF_MCAST_MAX) {
+   } else if (net->flags & IFF_ALLMULTI || netdev_mc_count(net) > QF_MCAST_MAX) {
        rx_ctl |= 0x04;
-   } else if (net->mc_count) {
-       struct dev_mc_list *mc_list = net->mc_list;
-       int i;
+   } else if (netdev_mc_count(net)) {
+       struct netdev_hw_addr *hw_addr;

-       for (i = 0; i < net->mc_count; i++, mc_list = mc_list->next) {
-           u32 crc = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26;
+       netdev_for_each_mc_addr(hw_addr, net) {
+           u32 crc = ether_crc(ETH_ALEN, hw_addr->addr) >> 26;
            hashes[crc >> 3] |= 1 << (crc & 0x7);
        }
    }
@@ -413,9 +412,9 @@

    /* power up and reset phy */
    qf_write_reg(dev, PRR, 1);
-   udelay(20 * 1000);  // at least 10ms, here 20ms for safe
+   mdelay(20); // at least 10ms, here 20ms for safe
    qf_write_reg(dev, PRR, 0);
-   udelay(2 * 1000);   // at least 1ms, here 2ms for reading right register
+   mdelay(2);  // at least 1ms, here 2ms for reading right register

    /* receive broadcast packets */
    qf9700_set_multicast(dev->net);
diff -ur b/qf9700.h a/qf9700.h
--- b/qf9700.h  2010-10-09 16:51:00.000000000 +0800
+++ a/qf9700.h  2014-04-15 17:20:23.000000000 +0800
@@ -150,4 +150,21 @@
 #define    QF_TX_OVERHEAD      2   // 2bytes header
 #define    QF_RX_OVERHEAD      7   // 3bytes header + 4crc tail

+#ifdef DEBUG
+#define devdbg(usbnet, fmt, arg...) \
+        printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
+#else
+#define devdbg(usbnet, fmt, arg...) \
+        ({ if (0) printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , \
+                ## arg); 0; })
+#endif
+
+#define deverr(usbnet, fmt, arg...) \
+        printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
+#define devwarn(usbnet, fmt, arg...) \
+        printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
+
+#define devinfo(usbnet, fmt, arg...) \
+        printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net->name , ## arg); \
+
 /*----------------------------------------------------------------------------------------------*/

点此下载源文件及补丁文件。