usb-eth.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:11k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Ethernet driver for the PXA USB client function
  3.  * Copyright (c) 2001 by Nicolas Pitre
  4.  *
  5.  * This code was loosely inspired by the original initial ethernet test driver
  6.  * Copyright (c) Compaq Computer Corporation, 1999
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License version 2 as
  10.  * published by the Free Software Foundation.
  11.  *
  12.  * This is still work in progress...
  13.  *
  14.  * 19/02/2001 - Now we are compatible with generic usbnet driver. green@iXcelerator.com
  15.  * 09/03/2001 - Dropped 'framing' scheme, as it seems to cause a lot of problems with little benefit.
  16.  * Now, since we do not know what size of packet we are receiving
  17.  * last usb packet in sequence will always be less than max packet
  18.  * receive endpoint can accept.
  19.  * Now the only way to check correct start of frame is to compare
  20.  * MAC address. Also now we are stalling on each receive error.
  21.  *
  22.  * 15/03/2001 - Using buffer to get data from UDC. DMA needs to have 8 byte
  23.  * aligned buffer, but this breaks IP code (unaligned access).
  24.  *
  25.  * 01/04/2001 - stall endpoint operations appeared to be very unstable, so
  26.  *              they are disabled now.
  27.  *
  28.  * 03/06/2001 - Readded "zerocopy" receive path (tunable).
  29.  *
  30.  */
  31. // Define DMA_NO_COPY if you want data to arrive directly into the
  32. // receive network buffers, instead of arriving into bounce buffer
  33. // and then get copied to network buffer.
  34. // This does not work correctly right now.
  35. #undef DMA_NO_COPY
  36. #include <linux/module.h>
  37. #include <linux/init.h>
  38. #include <linux/sched.h>
  39. #include <linux/kernel.h>
  40. #include <linux/errno.h>
  41. #include <linux/timer.h>
  42. #include <linux/netdevice.h>
  43. #include <linux/etherdevice.h>
  44. #include <linux/skbuff.h>
  45. #include <linux/random.h>
  46. #include "pxa_usb.h"
  47. #define ETHERNET_VENDOR_ID 0x49f
  48. #define ETHERNET_PRODUCT_ID 0x505A
  49. #define MAX_PACKET 32768
  50. #define MIN(a, b) (((a) < (b)) ? (a) : (b))
  51. // Should be global, so that insmod can change these
  52. int usb_rsize=64;
  53. int usb_wsize=64;
  54. static struct usbe_info_t {
  55.   struct net_device *dev;
  56.   u16 packet_id;
  57.   struct net_device_stats stats;
  58. } usbe_info;
  59. static char usb_eth_name[16] = "usbf";
  60. static struct net_device usb_eth_device;
  61. static struct sk_buff *cur_tx_skb, *next_tx_skb;
  62. static struct sk_buff *cur_rx_skb, *next_rx_skb;
  63. static volatile int terminating;
  64. #ifndef DMA_NO_COPY
  65. static char *dmabuf; // we need that, as dma expect it's buffers to be aligned on 8 bytes boundary
  66. #endif
  67. static int usb_change_mtu (struct net_device *net, int new_mtu)
  68. {
  69. if (new_mtu <= sizeof (struct ethhdr) || new_mtu > MAX_PACKET)
  70. return -EINVAL;
  71. // no second zero-length packet read wanted after mtu-sized packets
  72. if (((new_mtu + sizeof (struct ethhdr)) % usb_rsize) == 0)
  73. return -EDOM;
  74. net->mtu = new_mtu;
  75. return 0;
  76. }
  77. static struct sk_buff *
  78. usb_new_recv_skb(void)
  79. {
  80. struct sk_buff *skb = alloc_skb( 2 + sizeof (struct ethhdr) + usb_eth_device.mtu,GFP_ATOMIC);
  81. if (skb) {
  82. skb_reserve(skb, 2);
  83. }
  84. return skb;
  85. }
  86. static u8 bcast_hwaddr[ETH_ALEN]={0xff,0xff,0xff,0xff,0xff,0xff};
  87. static void
  88. usb_recv_callback(int flag, int size)
  89. {
  90. struct sk_buff *skb;
  91. if (terminating)
  92. return;
  93. skb = cur_rx_skb;
  94. /* flag validation */
  95. if (flag == 0) {
  96. if ( skb_tailroom (skb) < size ) { // hey! we are overloaded!!!
  97. usbe_info.stats.rx_over_errors++;
  98. goto error;
  99. }
  100. #ifndef DMA_NO_COPY
  101. memcpy(skb->tail,dmabuf,size);
  102. #endif
  103. skb_put(skb, size);
  104. } else {
  105. if (flag == -EIO) {
  106. usbe_info.stats.rx_errors++;
  107. }
  108. goto error;
  109. }
  110. /*
  111.  * If the real size of the packet is divisible by usb_rsize
  112.  * an extra byte will be added. Thus size == usb_rsize
  113.  * should only happen if more data is to come.
  114.  */
  115. /* validate packet length */
  116. if (size == usb_rsize ) {
  117. /* packet not complete yet */
  118. skb = NULL;
  119. }
  120. /*
  121.  * At this point skb is non null if we have a complete packet.
  122.  * If so take a fresh skb right away and restart USB receive without
  123.  * further delays, then process the packet.  Otherwise resume USB
  124.  * receive on the current skb and exit.
  125.  */
  126. if (skb)
  127. cur_rx_skb = next_rx_skb;
  128. #ifndef DMA_NO_COPY
  129. pxa_usb_recv(dmabuf, usb_rsize,
  130. usb_recv_callback);
  131. #else
  132. pxa_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)),
  133. usb_recv_callback);
  134. #endif
  135. if (!skb)
  136. return;
  137. next_rx_skb = usb_new_recv_skb();
  138. if (!next_rx_skb) {
  139. /*
  140.  * We can't aford loosing buffer space...
  141.  * So we drop the current packet and recycle its skb.
  142.  */
  143. printk("%s: can't allocate new skbn", __FUNCTION__);
  144. usbe_info.stats.rx_dropped++;
  145. skb_trim(skb, 0);
  146. next_rx_skb = skb;
  147. return;
  148. }
  149. if ( skb->len >= sizeof(struct ethhdr)) {
  150. if (memcmp(skb->data,usb_eth_device.dev_addr,ETH_ALEN) && memcmp(skb->data,bcast_hwaddr,ETH_ALEN) ) {
  151. // This frame is not for us. nor it is broadcast
  152. usbe_info.stats.rx_frame_errors++;
  153. kfree_skb(skb);
  154. goto error;
  155. }
  156. #if 0
  157. {
  158.         int i;
  159.         for (i = 0; i < skb->len; i++)
  160. {
  161.                 printk("%02X ", skb->data[i]);
  162. if( (i%8)==7) printk("n");
  163. }
  164.         printk("...n");
  165. }
  166. #endif
  167. }
  168. if (skb->len) {
  169. int     status;
  170. // FIXME: eth_copy_and_csum "small" packets to new SKB (small < ~200 bytes) ?
  171. skb->dev = &usb_eth_device;
  172. skb->protocol = eth_type_trans (skb, &usb_eth_device);
  173. usbe_info.stats.rx_packets++;
  174. usbe_info.stats.rx_bytes += skb->len;
  175. skb->ip_summed = CHECKSUM_NONE;
  176. status = netif_rx (skb);
  177. if (status != NET_RX_SUCCESS)
  178. printk("netif_rx failed with code %dn",status);
  179. } else {
  180. error:
  181. //printk("ERROR... tailroom=%d size=%d len=%d flag=%dn", skb_tailroom(skb), size, skb->len, flag);
  182. /*
  183.  * Error due to HW addr mismatch, or IO error.
  184.  * Recycle the current skb and reset USB reception.
  185.  */
  186. skb_trim(cur_rx_skb, 0);
  187. // if ( flag == -EINTR || flag == -EAGAIN ) // only if we are coming out of stall
  188. #ifndef DMA_NO_COPY
  189. pxa_usb_recv(dmabuf, usb_rsize, usb_recv_callback);
  190. #else
  191. pxa_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)), usb_recv_callback);
  192. #endif
  193. }
  194. }
  195. static void
  196. usb_send_callback(int flag, int size)
  197. {
  198. struct net_device *dev = usbe_info.dev;
  199. struct net_device_stats *stats;
  200. struct sk_buff *skb=cur_tx_skb;
  201. int ret;
  202. if (terminating)
  203. return;
  204. stats = &usbe_info.stats;
  205. switch (flag) {
  206.     case 0:
  207. stats->tx_packets++;
  208. stats->tx_bytes += size;
  209. break;
  210.     case -EIO:
  211. stats->tx_errors++;
  212. break;
  213.     default:
  214. stats->tx_dropped++;
  215. break;
  216. }
  217. cur_tx_skb = next_tx_skb;
  218. next_tx_skb = NULL;
  219. dev_kfree_skb_irq(skb);
  220. if (!cur_tx_skb)
  221. return;
  222. dev->trans_start = jiffies;
  223. ret = pxa_usb_send(cur_tx_skb->data, cur_tx_skb->len, usb_send_callback);
  224. if (ret) {
  225. /* If the USB core can't accept the packet, we drop it. */
  226. dev_kfree_skb_irq(cur_tx_skb);
  227. cur_tx_skb = NULL;
  228. usbe_info.stats.tx_carrier_errors++;
  229. }
  230. netif_wake_queue(dev);
  231. }
  232. static int
  233. usb_eth_xmit(struct sk_buff *skb, struct net_device *dev)
  234. {
  235. int ret;
  236. long flags;
  237. if (next_tx_skb) {
  238. printk("%s: called with next_tx_skb != NULLn", __FUNCTION__);
  239. return 1;
  240. }
  241. if (skb_shared (skb)) {
  242. struct sk_buff  *skb2 = skb_unshare(skb, GFP_ATOMIC);
  243. if (!skb2) {
  244. usbe_info.stats.tx_dropped++;
  245. dev_kfree_skb(skb);
  246. return 1;
  247. }
  248. skb = skb2;
  249. }
  250. if ((skb->len % usb_wsize) == 0) {
  251. skb->len++; // other side will ignore this one, anyway.
  252. }
  253. save_flags_cli(flags);
  254. if (cur_tx_skb) {
  255. next_tx_skb = skb;
  256. netif_stop_queue(dev);
  257. } else {
  258. cur_tx_skb = skb;
  259. dev->trans_start = jiffies;
  260. ret = pxa_usb_send(skb->data, skb->len, usb_send_callback);
  261. if (ret) {
  262. /* If the USB core can't accept the packet, we drop it. */
  263. dev_kfree_skb(skb);
  264. cur_tx_skb = NULL;
  265. usbe_info.stats.tx_carrier_errors++;
  266. }
  267. }
  268. restore_flags(flags);
  269. return 0;
  270. }
  271. static void
  272. usb_xmit_timeout(struct net_device *dev )
  273. {
  274. pxa_usb_send_reset();
  275. dev->trans_start = jiffies;
  276. netif_wake_queue(dev);
  277. }
  278. static int
  279. usb_eth_open(struct net_device *dev)
  280. {
  281. int rc;
  282. rc = pxa_usb_open( "usb-eth" );
  283. if ( rc == 0 ) {
  284.  string_desc_t * pstr;
  285.  desc_t * pd = pxa_usb_get_descriptor_ptr();
  286.  pd->b.ep1.wMaxPacketSize = make_word( usb_rsize );
  287.  pd->b.ep2.wMaxPacketSize = make_word( usb_wsize );
  288.  pd->dev.idVendor   = ETHERNET_VENDOR_ID;
  289.  pd->dev.idProduct     = ETHERNET_PRODUCT_ID;
  290.  pstr = pxa_usb_kmalloc_string_descriptor( "PXA USB NIC" );
  291.  if ( pstr ) {
  292.   pxa_usb_set_string_descriptor( 1, pstr );
  293.   pd->dev.iProduct = 1;
  294.  }
  295.  rc = pxa_usb_start();
  296. }
  297. if( rc == 0)
  298. {
  299. terminating = 0;
  300. cur_tx_skb = next_tx_skb = NULL;
  301. cur_rx_skb = usb_new_recv_skb();
  302. next_rx_skb = usb_new_recv_skb();
  303. if (!cur_rx_skb || !next_rx_skb) {
  304. printk("%s: can't allocate new skbn", __FUNCTION__);
  305. if (cur_rx_skb)
  306. kfree_skb(cur_rx_skb);
  307. if (next_rx_skb)
  308. kfree_skb(next_rx_skb);
  309. pxa_usb_stop();
  310. pxa_usb_close();
  311. return -ENOMEM;;
  312. }
  313. MOD_INC_USE_COUNT;
  314. #ifndef DMA_NO_COPY
  315. pxa_usb_recv(dmabuf, usb_rsize, usb_recv_callback);
  316. #else
  317. pxa_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)),
  318. usb_recv_callback);
  319. #endif
  320. }
  321. return rc;
  322. }
  323. static int
  324. usb_eth_release(struct net_device *dev)
  325. {
  326. string_desc_t * pstr;
  327. terminating = 1;
  328. pxa_usb_send_reset();
  329. pxa_usb_recv_reset();
  330. if (cur_tx_skb)
  331. kfree_skb(cur_tx_skb);
  332. if (next_tx_skb)
  333. kfree_skb(next_tx_skb);
  334. if (cur_rx_skb)
  335. kfree_skb(cur_rx_skb);
  336. if (next_rx_skb)
  337. kfree_skb(next_rx_skb);
  338. pxa_usb_stop();
  339. pxa_usb_close();
  340. if ( (pstr = pxa_usb_get_string_descriptor(1)) != NULL )
  341. kfree( pstr );
  342. MOD_DEC_USE_COUNT;
  343. return 0;
  344. }
  345. static struct net_device_stats *
  346. usb_eth_stats(struct net_device *dev)
  347. {
  348. struct usbe_info_t *priv =  (struct usbe_info_t*) dev->priv;
  349. struct net_device_stats *stats=NULL;
  350. if (priv)
  351. stats = &priv->stats;
  352. return stats;
  353. }
  354. static int
  355. usb_eth_probe(struct net_device *dev)
  356. {
  357. u8 node_id [ETH_ALEN];
  358. get_random_bytes (node_id, sizeof node_id);
  359. node_id [0] &= 0xfe;    // clear multicast bit
  360. /*
  361.  * Assign the hardware address of the board:
  362.  * generate it randomly, as there can be many such
  363.  * devices on the bus.
  364.  */
  365. memcpy (dev->dev_addr, node_id, sizeof node_id);
  366. dev->open = usb_eth_open;
  367. dev->change_mtu = usb_change_mtu;
  368. dev->stop = usb_eth_release;
  369. dev->hard_start_xmit = usb_eth_xmit;
  370. dev->get_stats = usb_eth_stats;
  371. dev->watchdog_timeo = 1*HZ;
  372. dev->tx_timeout = usb_xmit_timeout;
  373. dev->priv = &usbe_info;
  374. usbe_info.dev = dev;
  375. /* clear the statistics */
  376. memset(&usbe_info.stats, 0, sizeof(struct net_device_stats));
  377. ether_setup(dev);
  378. dev->flags &= ~IFF_MULTICAST;
  379. dev->flags &= ~IFF_BROADCAST;
  380. //dev->flags |= IFF_NOARP;
  381. return 0;
  382. }
  383. #ifdef MODULE
  384. MODULE_PARM(usb_rsize, "1i");
  385. MODULE_PARM_DESC(usb_rsize, "number of bytes in packets from host to pxa");
  386. MODULE_PARM(usb_wsize, "1i");
  387. MODULE_PARM_DESC(usb_wsize, "number of bytes in packets from pxa to host");
  388. #endif
  389. static int __init
  390. usb_eth_init(void)
  391. {
  392. #ifndef DMA_NO_COPY
  393. dmabuf = kmalloc( usb_rsize, GFP_KERNEL | GFP_DMA );
  394. if (!dmabuf)
  395. return -ENOMEM;
  396. #endif
  397. strncpy(usb_eth_device.name, usb_eth_name, IFNAMSIZ);
  398. usb_eth_device.init = usb_eth_probe;
  399. if (register_netdev(&usb_eth_device) != 0)
  400. return -EIO;
  401. printk( KERN_INFO "USB Function Ethernet Driver Interfacen");
  402. return 0;
  403. }
  404. static void __exit
  405. usb_eth_cleanup(void)
  406. {
  407. #ifndef DMA_NO_COPY
  408. kfree(dmabuf);
  409. #endif
  410. unregister_netdev(&usb_eth_device);
  411. }
  412. module_init(usb_eth_init);
  413. module_exit(usb_eth_cleanup);