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

嵌入式Linux

开发平台:

Unix_Linux

  1.  /*
  2.  * Ethernet driver for the SA1100 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 "sa1100_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. /* validate packet length */
  111. if (size == usb_rsize ) {
  112. /* packet not complete yet */
  113. skb = NULL;
  114. }
  115. /*
  116.  * At this point skb is non null if we have a complete packet.
  117.  * If so take a fresh skb right away and restart USB receive without
  118.  * further delays, then process the packet.  Otherwise resume USB
  119.  * receive on the current skb and exit.
  120.  */
  121. if (skb)
  122. cur_rx_skb = next_rx_skb;
  123. #ifndef DMA_NO_COPY
  124. sa1100_usb_recv(dmabuf, usb_rsize,
  125. usb_recv_callback);
  126. #else
  127. sa1100_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)),
  128. usb_recv_callback);
  129. #endif
  130. if (!skb)
  131. return;
  132. next_rx_skb = usb_new_recv_skb();
  133. if (!next_rx_skb) {
  134. /*
  135.  * We can't aford loosing buffer space...
  136.  * So we drop the current packet and recycle its skb.
  137.  */
  138. printk("%s: can't allocate new skbn", __FUNCTION__);
  139. usbe_info.stats.rx_dropped++;
  140. skb_trim(skb, 0);
  141. next_rx_skb = skb;
  142. return;
  143. }
  144. if ( skb->len >= sizeof(struct ethhdr)) {
  145. if (memcmp(skb->data,usb_eth_device.dev_addr,ETH_ALEN) && memcmp(skb->data,bcast_hwaddr,ETH_ALEN) ) {
  146. // This frame is not for us. nor it is broadcast
  147. usbe_info.stats.rx_frame_errors++;
  148. kfree_skb(skb);
  149. goto error;
  150. }
  151. }
  152. if (skb->len) {
  153. int     status;
  154. // FIXME: eth_copy_and_csum "small" packets to new SKB (small < ~200 bytes) ?
  155. skb->dev = &usb_eth_device;
  156. skb->protocol = eth_type_trans (skb, &usb_eth_device);
  157. usbe_info.stats.rx_packets++;
  158. usbe_info.stats.rx_bytes += skb->len;
  159. skb->ip_summed = CHECKSUM_NONE;
  160. status = netif_rx (skb);
  161. if (status != NET_RX_SUCCESS)
  162. printk("netif_rx failed with code %dn",status);
  163. } else {
  164. error:
  165. /*
  166.  * Error due to HW addr mismatch, or IO error.
  167.  * Recycle the current skb and reset USB reception.
  168.  */
  169. skb_trim(cur_rx_skb, 0);
  170. // if ( flag == -EINTR || flag == -EAGAIN ) // only if we are coming out of stall
  171. #ifndef DMA_NO_COPY
  172. sa1100_usb_recv(dmabuf, usb_rsize, usb_recv_callback);
  173. #else
  174. sa1100_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)), usb_recv_callback);
  175. #endif
  176. }
  177. }
  178. static void
  179. usb_send_callback(int flag, int size)
  180. {
  181. struct net_device *dev = usbe_info.dev;
  182. struct net_device_stats *stats;
  183. struct sk_buff *skb=cur_tx_skb;
  184. int ret;
  185. if (terminating)
  186. return;
  187. stats = &usbe_info.stats;
  188. switch (flag) {
  189.     case 0:
  190. stats->tx_packets++;
  191. stats->tx_bytes += size;
  192. break;
  193.     case -EIO:
  194. stats->tx_errors++;
  195. break;
  196.     default:
  197. stats->tx_dropped++;
  198. break;
  199. }
  200. cur_tx_skb = next_tx_skb;
  201. next_tx_skb = NULL;
  202. dev_kfree_skb_irq(skb);
  203. if (!cur_tx_skb)
  204. return;
  205. dev->trans_start = jiffies;
  206. ret = sa1100_usb_send(cur_tx_skb->data, cur_tx_skb->len, usb_send_callback);
  207. if (ret) {
  208. /* If the USB core can't accept the packet, we drop it. */
  209. dev_kfree_skb_irq(cur_tx_skb);
  210. cur_tx_skb = NULL;
  211. usbe_info.stats.tx_carrier_errors++;
  212. }
  213. netif_wake_queue(dev);
  214. }
  215. static int
  216. usb_eth_xmit(struct sk_buff *skb, struct net_device *dev)
  217. {
  218. int ret;
  219. long flags;
  220. if (next_tx_skb) {
  221. printk("%s: called with next_tx_skb != NULLn", __FUNCTION__);
  222. return 1;
  223. }
  224. if (skb_shared (skb)) {
  225. struct sk_buff  *skb2 = skb_unshare(skb, GFP_ATOMIC);
  226. if (!skb2) {
  227. usbe_info.stats.tx_dropped++;
  228. dev_kfree_skb(skb);
  229. return 1;
  230. }
  231. skb = skb2;
  232. }
  233. if ((skb->len % usb_wsize) == 0) {
  234. skb->len++; // other side will ignore this one, anyway.
  235. }
  236. save_flags_cli(flags);
  237. if (cur_tx_skb) {
  238. next_tx_skb = skb;
  239. netif_stop_queue(dev);
  240. } else {
  241. cur_tx_skb = skb;
  242. dev->trans_start = jiffies;
  243. ret = sa1100_usb_send(skb->data, skb->len, usb_send_callback);
  244. if (ret) {
  245. /* If the USB core can't accept the packet, we drop it. */
  246. dev_kfree_skb(skb);
  247. cur_tx_skb = NULL;
  248. usbe_info.stats.tx_carrier_errors++;
  249. }
  250. }
  251. restore_flags(flags);
  252. return 0;
  253. }
  254. static void
  255. usb_xmit_timeout(struct net_device *dev )
  256. {
  257. sa1100_usb_send_reset();
  258. dev->trans_start = jiffies;
  259. netif_wake_queue(dev);
  260. }
  261. static int
  262. usb_eth_open(struct net_device *dev)
  263. {
  264. terminating = 0;
  265. cur_tx_skb = next_tx_skb = NULL;
  266. cur_rx_skb = usb_new_recv_skb();
  267. next_rx_skb = usb_new_recv_skb();
  268. if (!cur_rx_skb || !next_rx_skb) {
  269. printk("%s: can't allocate new skbn", __FUNCTION__);
  270. if (cur_rx_skb)
  271. kfree_skb(cur_rx_skb);
  272. if (next_rx_skb)
  273. kfree_skb(next_rx_skb);
  274. return -ENOMEM;;
  275. }
  276. MOD_INC_USE_COUNT;
  277. #ifndef DMA_NO_COPY
  278. sa1100_usb_recv(dmabuf, usb_rsize, usb_recv_callback);
  279. #else
  280. sa1100_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)),
  281. usb_recv_callback);
  282. #endif
  283. return 0;
  284. }
  285. static int
  286. usb_eth_release(struct net_device *dev)
  287. {
  288. terminating = 1;
  289. sa1100_usb_send_reset();
  290. sa1100_usb_recv_reset();
  291. if (cur_tx_skb)
  292. kfree_skb(cur_tx_skb);
  293. if (next_tx_skb)
  294. kfree_skb(next_tx_skb);
  295. if (cur_rx_skb)
  296. kfree_skb(cur_rx_skb);
  297. if (next_rx_skb)
  298. kfree_skb(next_rx_skb);
  299. MOD_DEC_USE_COUNT;
  300. return 0;
  301. }
  302. static struct net_device_stats *
  303. usb_eth_stats(struct net_device *dev)
  304. {
  305. struct usbe_info_t *priv =  (struct usbe_info_t*) dev->priv;
  306. struct net_device_stats *stats=NULL;
  307. if (priv)
  308. stats = &priv->stats;
  309. return stats;
  310. }
  311. static int
  312. usb_eth_probe(struct net_device *dev)
  313. {
  314. u8 node_id [ETH_ALEN];
  315. get_random_bytes (node_id, sizeof node_id);
  316. node_id [0] &= 0xfe;    // clear multicast bit
  317. /*
  318.  * Assign the hardware address of the board:
  319.  * generate it randomly, as there can be many such
  320.  * devices on the bus.
  321.  */
  322. memcpy (dev->dev_addr, node_id, sizeof node_id);
  323. dev->open = usb_eth_open;
  324. dev->change_mtu = usb_change_mtu;
  325. dev->stop = usb_eth_release;
  326. dev->hard_start_xmit = usb_eth_xmit;
  327. dev->get_stats = usb_eth_stats;
  328. dev->watchdog_timeo = 1*HZ;
  329. dev->tx_timeout = usb_xmit_timeout;
  330. dev->priv = &usbe_info;
  331. usbe_info.dev = dev;
  332. /* clear the statistics */
  333. memset(&usbe_info.stats, 0, sizeof(struct net_device_stats));
  334. ether_setup(dev);
  335. dev->flags &= ~IFF_MULTICAST;
  336. dev->flags &= ~IFF_BROADCAST;
  337. //dev->flags |= IFF_NOARP;
  338. return 0;
  339. }
  340. #ifdef MODULE
  341. MODULE_PARM(usb_rsize, "1i");
  342. MODULE_PARM_DESC(usb_rsize, "number of bytes in packets from host to sa1100");
  343. MODULE_PARM(usb_wsize, "1i");
  344. MODULE_PARM_DESC(usb_wsize, "number of bytes in packets from sa1100 to host");
  345. #endif
  346. static int __init
  347. usb_eth_init(void)
  348. {
  349. int rc;
  350. #ifndef DMA_NO_COPY
  351. dmabuf = kmalloc( usb_rsize, GFP_KERNEL | GFP_DMA );
  352. if (!dmabuf)
  353. return -ENOMEM;
  354. #endif
  355. strncpy(usb_eth_device.name, usb_eth_name, IFNAMSIZ);
  356. usb_eth_device.init = usb_eth_probe;
  357. if (register_netdev(&usb_eth_device) != 0)
  358. return -EIO;
  359. rc = sa1100_usb_open( "usb-eth" );
  360. if ( rc == 0 ) {
  361.  string_desc_t * pstr;
  362.  desc_t * pd = sa1100_usb_get_descriptor_ptr();
  363.  pd->b.ep1.wMaxPacketSize = make_word( usb_rsize );
  364.  pd->b.ep2.wMaxPacketSize = make_word( usb_wsize );
  365.  pd->dev.idVendor   = ETHERNET_VENDOR_ID;
  366.  pd->dev.idProduct     = ETHERNET_PRODUCT_ID;
  367.  pstr = sa1100_usb_kmalloc_string_descriptor( "SA1100 USB NIC" );
  368.  if ( pstr ) {
  369.   sa1100_usb_set_string_descriptor( 1, pstr );
  370.   pd->dev.iProduct = 1;
  371.  }
  372.  rc = sa1100_usb_start();
  373. }
  374. return rc;
  375. }
  376. module_init(usb_eth_init);
  377. static void __exit
  378. usb_eth_cleanup(void)
  379. {
  380. string_desc_t * pstr;
  381. sa1100_usb_stop();
  382. sa1100_usb_close();
  383. if ( (pstr = sa1100_usb_get_string_descriptor(1)) != NULL )
  384. kfree( pstr );
  385. #ifndef DMA_NO_COPY
  386. kfree(dmabuf);
  387. #endif
  388. unregister_netdev(&usb_eth_device);
  389. }
  390. module_exit(usb_eth_cleanup);