arcnet.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:27k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Linux ARCnet driver - device-independent routines
  3.  * 
  4.  * Written 1997 by David Woodhouse.
  5.  * Written 1994-1999 by Avery Pennarun.
  6.  * Written 1999-2000 by Martin Mares <mj@ucw.cz>.
  7.  * Derived from skeleton.c by Donald Becker.
  8.  *
  9.  * Special thanks to Contemporary Controls, Inc. (www.ccontrols.com)
  10.  *  for sponsoring the further development of this driver.
  11.  *
  12.  * **********************
  13.  *
  14.  * The original copyright was as follows:
  15.  *
  16.  * skeleton.c Written 1993 by Donald Becker.
  17.  * Copyright 1993 United States Government as represented by the
  18.  * Director, National Security Agency.  This software may only be used
  19.  * and distributed according to the terms of the GNU General Public License as
  20.  * modified by SRC, incorporated herein by reference.
  21.  *
  22.  * **********************
  23.  * 
  24.  * The change log is now in a file called ChangeLog in this directory.
  25.  *
  26.  * Sources:
  27.  *  - Crynwr arcnet.com/arcether.com packet drivers.
  28.  *  - arcnet.c v0.00 dated 1/1/94 and apparently by 
  29.  *     Donald Becker - it didn't work :)
  30.  *  - skeleton.c v0.05 dated 11/16/93 by Donald Becker
  31.  *     (from Linux Kernel 1.1.45)
  32.  *  - RFC's 1201 and 1051 - re: TCP/IP over ARCnet
  33.  *  - The official ARCnet COM9026 data sheets (!) thanks to
  34.  *     Ken Cornetet <kcornete@nyx10.cs.du.edu>
  35.  *  - The official ARCnet COM20020 data sheets.
  36.  *  - Information on some more obscure ARCnet controller chips, thanks
  37.  *     to the nice people at SMSC.
  38.  *  - net/inet/eth.c (from kernel 1.1.50) for header-building info.
  39.  *  - Alternate Linux ARCnet source by V.Shergin <vsher@sao.stavropol.su>
  40.  *  - Textual information and more alternate source from Joachim Koenig
  41.  *     <jojo@repas.de>
  42.  */
  43. #define VERSION "arcnet: v3.93 BETA 2000/04/29 - by Avery Pennarun et al.n"
  44. #include <linux/module.h>
  45. #include <linux/config.h>
  46. #include <linux/types.h>
  47. #include <linux/delay.h>
  48. #include <linux/netdevice.h>
  49. #include <linux/if_arp.h>
  50. #include <net/arp.h>
  51. #include <linux/init.h>
  52. #include <linux/arcdevice.h>
  53. /* "do nothing" functions for protocol drivers */
  54. static void null_rx(struct net_device *dev, int bufnum,
  55.     struct archdr *pkthdr, int length);
  56. static int null_build_header(struct sk_buff *skb, unsigned short type,
  57.      uint8_t daddr);
  58. static int null_prepare_tx(struct net_device *dev, struct archdr *pkt,
  59.    int length, int bufnum);
  60. /*
  61.  * one ArcProto per possible proto ID.  None of the elements of
  62.  * arc_proto_map are allowed to be NULL; they will get set to
  63.  * arc_proto_default instead.  It also must not be NULL; if you would like
  64.  * to set it to NULL, set it to &arc_proto_null instead.
  65.  */
  66. struct ArcProto *arc_proto_map[256], *arc_proto_default, *arc_bcast_proto;
  67. struct ArcProto arc_proto_null =
  68. {
  69. '?',
  70. XMTU,
  71. null_rx,
  72. null_build_header,
  73. null_prepare_tx
  74. };
  75. /* Exported function prototypes */
  76. int arcnet_debug = ARCNET_DEBUG;
  77. EXPORT_SYMBOL(arc_proto_map);
  78. EXPORT_SYMBOL(arc_proto_default);
  79. EXPORT_SYMBOL(arc_bcast_proto);
  80. EXPORT_SYMBOL(arc_proto_null);
  81. EXPORT_SYMBOL(arcnet_unregister_proto);
  82. EXPORT_SYMBOL(arcnet_debug);
  83. EXPORT_SYMBOL(arcdev_setup);
  84. EXPORT_SYMBOL(arcnet_interrupt);
  85. /* Internal function prototypes */
  86. static int arcnet_open(struct net_device *dev);
  87. static int arcnet_close(struct net_device *dev);
  88. static int arcnet_send_packet(struct sk_buff *skb, struct net_device *dev);
  89. static void arcnet_timeout(struct net_device *dev);
  90. static int arcnet_header(struct sk_buff *skb, struct net_device *dev,
  91.  unsigned short type, void *daddr, void *saddr,
  92.  unsigned len);
  93. static int arcnet_rebuild_header(struct sk_buff *skb);
  94. static struct net_device_stats *arcnet_get_stats(struct net_device *dev);
  95. static int go_tx(struct net_device *dev);
  96. void __init arcnet_init(void)
  97. {
  98. static int arcnet_inited;
  99. int count;
  100. if (arcnet_inited++)
  101. return;
  102. printk(VERSION);
  103. #ifdef ALPHA_WARNING
  104. BUGLVL(D_EXTRA) {
  105. printk("arcnet: ***n"
  106. "arcnet: * Read arcnet.txt for important release notes!n"
  107.        "arcnet: *n"
  108.        "arcnet: * This is an ALPHA version! (Last stable release: v3.02)  E-mailn"
  109.        "arcnet: * me if you have any questions, comments, or bug reports.n"
  110.        "arcnet: ***n");
  111. }
  112. #endif
  113. /* initialize the protocol map */
  114. arc_proto_default = arc_bcast_proto = &arc_proto_null;
  115. for (count = 0; count < 256; count++)
  116. arc_proto_map[count] = arc_proto_default;
  117. BUGLVL(D_DURING)
  118.     printk("arcnet: struct sizes: %d %d %d %d %dn",
  119.  sizeof(struct arc_hardware), sizeof(struct arc_rfc1201),
  120. sizeof(struct arc_rfc1051), sizeof(struct arc_eth_encap),
  121.    sizeof(struct archdr));
  122. #ifdef CONFIG_ARCNET /* We're not built as a module */
  123. printk("arcnet: Available protocols:");
  124. #ifdef CONFIG_ARCNET_1201
  125. printk(" RFC1201");
  126. arcnet_rfc1201_init();
  127. #endif
  128. #ifdef CONFIG_ARCNET_1051
  129. printk(" RFC1051");
  130. arcnet_rfc1051_init();
  131. #endif
  132. #ifdef CONFIG_ARCNET_RAW
  133. printk(" RAW");
  134. arcnet_raw_init();
  135. #endif
  136. printk("n");
  137. #ifdef CONFIG_ARCNET_COM90xx
  138. com90xx_probe(NULL);
  139. #endif
  140. #endif
  141. }
  142. #ifdef MODULE
  143. static int debug = ARCNET_DEBUG;
  144. MODULE_PARM(debug, "i");
  145. MODULE_LICENSE("GPL");
  146. int __init init_module(void)
  147. {
  148. arcnet_debug = debug;
  149. arcnet_init();
  150. return 0;
  151. }
  152. void cleanup_module(void)
  153. {
  154. }
  155. #endif
  156. /*
  157.  * Dump the contents of an sk_buff
  158.  */
  159. #if ARCNET_DEBUG_MAX & D_SKB
  160. void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc)
  161. {
  162. int i;
  163. unsigned long flags;
  164. save_flags(flags);
  165. cli();
  166. printk(KERN_DEBUG "%6s: skb dump (%s) follows:", dev->name, desc);
  167. for (i = 0; i < skb->len; i++) {
  168. if (i % 16 == 0)
  169. printk("n" KERN_DEBUG "[%04X] ", i);
  170. printk("%02X ", ((u_char *) skb->data)[i]);
  171. }
  172. printk("n");
  173. restore_flags(flags);
  174. }
  175. EXPORT_SYMBOL(arcnet_dump_skb);
  176. #endif
  177. /*
  178.  * Dump the contents of an ARCnet buffer
  179.  */
  180. #if (ARCNET_DEBUG_MAX & (D_RX | D_TX))
  181. void arcnet_dump_packet(struct net_device *dev, int bufnum, char *desc)
  182. {
  183. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  184. int i, length;
  185. unsigned long flags;
  186. static uint8_t buf[512];
  187. save_flags(flags);
  188. cli();
  189. lp->hw.copy_from_card(dev, bufnum, 0, buf, 512);
  190. /* if the offset[0] byte is nonzero, this is a 256-byte packet */
  191. length = (buf[2] ? 256 : 512);
  192. printk(KERN_DEBUG "%6s: packet dump (%s) follows:", dev->name, desc);
  193. for (i = 0; i < length; i++) {
  194. if (i % 16 == 0)
  195. printk("n" KERN_DEBUG "[%04X] ", i);
  196. printk("%02X ", buf[i]);
  197. }
  198. printk("n");
  199. restore_flags(flags);
  200. }
  201. EXPORT_SYMBOL(arcnet_dump_packet);
  202. #endif
  203. /*
  204.  * Unregister a protocol driver from the arc_proto_map.  Protocol drivers
  205.  * are responsible for registering themselves, but the unregister routine
  206.  * is pretty generic so we'll do it here.
  207.  */
  208. void arcnet_unregister_proto(struct ArcProto *proto)
  209. {
  210. int count;
  211. if (arc_proto_default == proto)
  212. arc_proto_default = &arc_proto_null;
  213. if (arc_bcast_proto == proto)
  214. arc_bcast_proto = arc_proto_default;
  215. for (count = 0; count < 256; count++) {
  216. if (arc_proto_map[count] == proto)
  217. arc_proto_map[count] = arc_proto_default;
  218. }
  219. }
  220. /*
  221.  * Add a buffer to the queue.  Only the interrupt handler is allowed to do
  222.  * this, unless interrupts are disabled.
  223.  * 
  224.  * Note: we don't check for a full queue, since there aren't enough buffers
  225.  * to more than fill it.
  226.  */
  227. static void release_arcbuf(struct net_device *dev, int bufnum)
  228. {
  229. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  230. int i;
  231. lp->buf_queue[lp->first_free_buf++] = bufnum;
  232. lp->first_free_buf %= 5;
  233. BUGLVL(D_DURING) {
  234. BUGMSG(D_DURING, "release_arcbuf: freed #%d; buffer queue is now: ",
  235.        bufnum);
  236. for (i = lp->next_buf; i != lp->first_free_buf; i = ++i % 5)
  237. BUGMSG2(D_DURING, "#%d ", lp->buf_queue[i]);
  238. BUGMSG2(D_DURING, "n");
  239. }
  240. }
  241. /*
  242.  * Get a buffer from the queue.  If this returns -1, there are no buffers
  243.  * available.
  244.  */
  245. static int get_arcbuf(struct net_device *dev)
  246. {
  247. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  248. int buf = -1, i;
  249. if (!atomic_dec_and_test(&lp->buf_lock)) /* already in this function */
  250. BUGMSG(D_NORMAL, "get_arcbuf: overlap (%d)!n", lp->buf_lock.counter);
  251. else { /* we can continue */
  252. if (lp->next_buf >= 5)
  253. lp->next_buf -= 5;
  254. if (lp->next_buf == lp->first_free_buf)
  255. BUGMSG(D_NORMAL, "get_arcbuf: BUG: no buffers are available??n");
  256. else {
  257. buf = lp->buf_queue[lp->next_buf++];
  258. lp->next_buf %= 5;
  259. }
  260. }
  261. BUGLVL(D_DURING) {
  262. BUGMSG(D_DURING, "get_arcbuf: got #%d; buffer queue is now: ", buf);
  263. for (i = lp->next_buf; i != lp->first_free_buf; i = ++i % 5)
  264. BUGMSG2(D_DURING, "#%d ", lp->buf_queue[i]);
  265. BUGMSG2(D_DURING, "n");
  266. }
  267. atomic_inc(&lp->buf_lock);
  268. return buf;
  269. }
  270. static int choose_mtu(void)
  271. {
  272. int count, mtu = 65535;
  273. /* choose the smallest MTU of all available encaps */
  274. for (count = 0; count < 256; count++) {
  275. if (arc_proto_map[count] != &arc_proto_null
  276.     && arc_proto_map[count]->mtu < mtu) {
  277. mtu = arc_proto_map[count]->mtu;
  278. }
  279. }
  280. return mtu == 65535 ? XMTU : mtu;
  281. }
  282. /* Setup a struct device for ARCnet. */
  283. void arcdev_setup(struct net_device *dev)
  284. {
  285. dev->type = ARPHRD_ARCNET;
  286. dev->hard_header_len = sizeof(struct archdr);
  287. dev->mtu = choose_mtu();
  288. dev->addr_len = 1;
  289. dev->tx_queue_len = 30;
  290. dev->broadcast[0] = 0x00; /* for us, broadcasts are address 0 */
  291. dev->watchdog_timeo = TX_TIMEOUT;
  292. /* New-style flags. */
  293. dev->flags = IFF_BROADCAST;
  294. /*
  295.  * Put in this stuff here, so we don't have to export the symbols to
  296.  * the chipset drivers.
  297.  */
  298. dev->open = arcnet_open;
  299. dev->stop = arcnet_close;
  300. dev->hard_start_xmit = arcnet_send_packet;
  301. dev->tx_timeout = arcnet_timeout;
  302. dev->get_stats = arcnet_get_stats;
  303. dev->hard_header = arcnet_header;
  304. dev->rebuild_header = arcnet_rebuild_header;
  305. }
  306. /*
  307.  * Open/initialize the board.  This is called sometime after booting when
  308.  * the 'ifconfig' program is run.
  309.  *
  310.  * This routine should set everything up anew at each open, even registers
  311.  * that "should" only need to be set once at boot, so that there is
  312.  * non-reboot way to recover if something goes wrong.
  313.  */
  314. static int arcnet_open(struct net_device *dev)
  315. {
  316. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  317. int count, newmtu;
  318. BUGLVL(D_PROTO) {
  319. int count;
  320. BUGMSG(D_PROTO, "protocol map (default is '%c'): ",
  321.        arc_proto_default->suffix);
  322. for (count = 0; count < 256; count++)
  323. BUGMSG2(D_PROTO, "%c", arc_proto_map[count]->suffix);
  324. BUGMSG2(D_PROTO, "n");
  325. }
  326. BUGMSG(D_INIT, "arcnet_open: resetting card.n");
  327. /* try to put the card in a defined state - if it fails the first
  328.  * time, actually reset it.
  329.  */
  330. if (ARCRESET(0) && ARCRESET(1))
  331. return -ENODEV;
  332. newmtu = choose_mtu();
  333. if (newmtu < dev->mtu)
  334. dev->mtu = newmtu;
  335. /* autodetect the encapsulation for each host. */
  336. memset(lp->default_proto, 0, sizeof(lp->default_proto));
  337. /* the broadcast address is special - use the 'bcast' protocol */
  338. for (count = 0; count < 256; count++) {
  339. if (arc_proto_map[count] == arc_bcast_proto) {
  340. lp->default_proto[0] = count;
  341. break;
  342. }
  343. }
  344. /* initialize buffers */
  345. atomic_set(&lp->buf_lock, 1);
  346. lp->next_buf = lp->first_free_buf = 0;
  347. release_arcbuf(dev, 0);
  348. release_arcbuf(dev, 1);
  349. release_arcbuf(dev, 2);
  350. release_arcbuf(dev, 3);
  351. lp->cur_tx = lp->next_tx = -1;
  352. lp->cur_rx = -1;
  353. lp->rfc1201.sequence = 1;
  354. /* bring up the hardware driver */
  355. ARCOPEN(1);
  356. if (dev->dev_addr[0] == 0)
  357. BUGMSG(D_NORMAL, "WARNING!  Station address 00 is reserved "
  358.        "for broadcasts!n");
  359. else if (dev->dev_addr[0] == 255)
  360. BUGMSG(D_NORMAL, "WARNING!  Station address FF may confuse "
  361.        "DOS networking programs!n");
  362. if (ASTATUS() & RESETflag)
  363. ACOMMAND(CFLAGScmd | RESETclear);
  364. /* make sure we're ready to receive IRQ's. */
  365. AINTMASK(0);
  366. udelay(1); /* give it time to set the mask before
  367.  * we reset it again. (may not even be
  368.  * necessary)
  369.  */
  370. lp->intmask = NORXflag | RECONflag;
  371. AINTMASK(lp->intmask);
  372. netif_start_queue(dev);
  373. return 0;
  374. }
  375. /* The inverse routine to arcnet_open - shuts down the card. */
  376. static int arcnet_close(struct net_device *dev)
  377. {
  378. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  379. netif_stop_queue(dev);
  380. /* flush TX and disable RX */
  381. AINTMASK(0);
  382. ACOMMAND(NOTXcmd); /* stop transmit */
  383. ACOMMAND(NORXcmd); /* disable receive */
  384. mdelay(1);
  385. /* shut down the card */
  386. ARCOPEN(0);
  387. return 0;
  388. }
  389. static int arcnet_header(struct sk_buff *skb, struct net_device *dev,
  390.  unsigned short type, void *daddr, void *saddr,
  391.  unsigned len)
  392. {
  393. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  394. uint8_t _daddr, proto_num;
  395. struct ArcProto *proto;
  396. BUGMSG(D_DURING,
  397.     "create header from %d to %d; protocol %d (%Xh); size %u.n",
  398.        saddr ? *(uint8_t *) saddr : -1,
  399.        daddr ? *(uint8_t *) daddr : -1,
  400.        type, type, len);
  401. if (len != skb->len)
  402. BUGMSG(D_NORMAL, "arcnet_header: Yikes!  skb->len(%d) != len(%d)!n",
  403.        skb->len, len);
  404. /*
  405.  * if the dest addr isn't provided, we can't choose an encapsulation!
  406.  * Store the packet type (eg. ETH_P_IP) for now, and we'll push on a
  407.  * real header when we do rebuild_header. 
  408.  */
  409. if (!daddr) {
  410. *(uint16_t *) skb_push(skb, 2) = type;
  411. if (skb->nh.raw - skb->mac.raw != 2)
  412. BUGMSG(D_NORMAL, "arcnet_header: Yikes!  diff (%d) is not 2!n",
  413.        skb->nh.raw - skb->mac.raw);
  414. return -2; /* return error -- can't transmit yet! */
  415. }
  416. /* otherwise, we can just add the header as usual. */
  417. _daddr = *(uint8_t *) daddr;
  418. proto_num = lp->default_proto[_daddr];
  419. proto = arc_proto_map[proto_num];
  420. BUGMSG(D_DURING, "building header for %02Xh using protocol '%c'n",
  421.        proto_num, proto->suffix);
  422. if (proto == &arc_proto_null && arc_bcast_proto != proto) {
  423. BUGMSG(D_DURING, "actually, let's use '%c' instead.n",
  424.        arc_bcast_proto->suffix);
  425. proto = arc_bcast_proto;
  426. }
  427. return proto->build_header(skb, type, _daddr);
  428. }
  429. /* 
  430.  * Rebuild the ARCnet hard header. This is called after an ARP (or in the
  431.  * future other address resolution) has completed on this sk_buff. We now
  432.  * let ARP fill in the destination field.
  433.  */
  434. static int arcnet_rebuild_header(struct sk_buff *skb)
  435. {
  436. struct net_device *dev = skb->dev;
  437. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  438. int status = 0; /* default is failure */
  439. unsigned short type;
  440. uint8_t daddr=0;
  441. if (skb->nh.raw - skb->mac.raw != 2) {
  442. BUGMSG(D_NORMAL,
  443.      "rebuild_header: shouldn't be here! (hdrsize=%d)n",
  444.        skb->nh.raw - skb->mac.raw);
  445. return 0;
  446. }
  447. type = *(uint16_t *) skb_pull(skb, 2);
  448. if (type == ETH_P_IP) {
  449. #ifdef CONFIG_INET
  450. BUGMSG(D_DURING, "rebuild header for ethernet protocol %Xhn", type);
  451. status = arp_find(&daddr, skb) ? 1 : 0;
  452. BUGMSG(D_DURING, " rebuilt: dest is %d; protocol %Xhn",
  453.        daddr, type);
  454. #endif
  455. } else {
  456. BUGMSG(D_NORMAL,
  457.        "I don't understand ethernet protocol %Xh addresses!n", type);
  458. lp->stats.tx_errors++;
  459. lp->stats.tx_aborted_errors++;
  460. }
  461. /* if we couldn't resolve the address... give up. */
  462. if (!status)
  463. return 0;
  464. /* add the _real_ header this time! */
  465. arc_proto_map[lp->default_proto[daddr]]->build_header(skb, type, daddr);
  466. return 1; /* success */
  467. }
  468. /* Called by the kernel in order to transmit a packet. */
  469. static int arcnet_send_packet(struct sk_buff *skb, struct net_device *dev)
  470. {
  471. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  472. struct archdr *pkt;
  473. struct arc_rfc1201 *soft;
  474. struct ArcProto *proto;
  475. int txbuf;
  476. BUGMSG(D_DURING,
  477.        "transmit requested (status=%Xh, txbufs=%d/%d, len=%d)n",
  478.        ASTATUS(), lp->cur_tx, lp->next_tx, skb->len);
  479. pkt = (struct archdr *) skb->data;
  480. soft = &pkt->soft.rfc1201;
  481. proto = arc_proto_map[soft->proto];
  482. BUGMSG(D_SKB_SIZE, "skb: transmitting %d bytes to %02Xn",
  483. skb->len, pkt->hard.dest);
  484. BUGLVL(D_SKB) arcnet_dump_skb(dev, skb, "tx");
  485. /* fits in one packet? */
  486. if (skb->len - ARC_HDR_SIZE > XMTU && !proto->continue_tx) {
  487. BUGMSG(D_NORMAL, "fixme: packet too large: compensating badly!n");
  488. dev_kfree_skb(skb);
  489. return 0; /* don't try again */
  490. }
  491. /* We're busy transmitting a packet... */
  492. netif_stop_queue(dev);
  493. AINTMASK(0);
  494. txbuf = get_arcbuf(dev);
  495. if (txbuf != -1) {
  496. if (proto->prepare_tx(dev, pkt, skb->len, txbuf)) {
  497. /* done right away */
  498. lp->stats.tx_bytes += skb->len;
  499. dev_kfree_skb(skb);
  500. } else {
  501. /* do it the 'split' way */
  502. lp->outgoing.proto = proto;
  503. lp->outgoing.skb = skb;
  504. lp->outgoing.pkt = pkt;
  505. if (!proto->continue_tx)
  506. BUGMSG(D_NORMAL, "bug! prep_tx==0, but no continue_tx!n");
  507. else if (proto->continue_tx(dev, txbuf)) {
  508. BUGMSG(D_NORMAL,
  509.        "bug! continue_tx finished the first time! "
  510.        "(proto='%c')n", proto->suffix);
  511. }
  512. }
  513. lp->next_tx = txbuf;
  514. } else
  515. dev_kfree_skb(skb);
  516. /* make sure we didn't ignore a TX IRQ while we were in here */
  517. AINTMASK(0);
  518. lp->intmask |= TXFREEflag;
  519. AINTMASK(lp->intmask);
  520. return 0; /* no need to try again */
  521. }
  522. /*
  523.  * Actually start transmitting a packet that was loaded into a buffer
  524.  * by prepare_tx.  This should _only_ be called by the interrupt handler.
  525.  */
  526. static int go_tx(struct net_device *dev)
  527. {
  528. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  529. BUGMSG(D_DURING, "go_tx: status=%Xh, intmask=%Xh, next_tx=%d, cur_tx=%dn",
  530.        ASTATUS(), lp->intmask, lp->next_tx, lp->cur_tx);
  531. if (lp->cur_tx != -1 || lp->next_tx == -1)
  532. return 0;
  533. BUGLVL(D_TX) arcnet_dump_packet(dev, lp->next_tx, "go_tx");
  534. lp->cur_tx = lp->next_tx;
  535. lp->next_tx = -1;
  536. /* start sending */
  537. ACOMMAND(TXcmd | (lp->cur_tx << 3));
  538. dev->trans_start = jiffies;
  539. lp->stats.tx_packets++;
  540. lp->lasttrans_dest = lp->lastload_dest;
  541. lp->lastload_dest = 0;
  542. lp->intmask |= TXFREEflag;
  543. return 1;
  544. }
  545. /* Called by the kernel when transmit times out */
  546. static void arcnet_timeout(struct net_device *dev)
  547. {
  548. unsigned long flags;
  549. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  550. int status = ASTATUS();
  551. char *msg;
  552. save_flags(flags);
  553. cli();
  554. if (status & TXFREEflag) { /* transmit _DID_ finish */
  555. msg = " - missed IRQ?";
  556. } else {
  557. msg = "";
  558. lp->stats.tx_aborted_errors++;
  559. lp->timed_out = 1;
  560. ACOMMAND(NOTXcmd | (lp->cur_tx << 3));
  561. }
  562. lp->stats.tx_errors++;
  563. /* make sure we didn't miss a TX IRQ */
  564. AINTMASK(0);
  565. lp->intmask |= TXFREEflag;
  566. AINTMASK(lp->intmask);
  567. restore_flags(flags);
  568. if (jiffies - lp->last_timeout > 10*HZ) {
  569. BUGMSG(D_EXTRA, "tx timed out%s (status=%Xh, intmask=%Xh, dest=%02Xh)n",
  570.        msg, status, lp->intmask, lp->lasttrans_dest);
  571. lp->last_timeout = jiffies;
  572. }
  573. if (lp->cur_tx == -1)
  574. netif_wake_queue(dev);
  575. }
  576. /*
  577.  * The typical workload of the driver: Handle the network interface
  578.  * interrupts. Establish which device needs attention, and call the correct
  579.  * chipset interrupt handler.
  580.  */
  581. void arcnet_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  582. {
  583. struct net_device *dev = dev_id;
  584. struct arcnet_local *lp;
  585. int recbuf, status, didsomething, boguscount;
  586. BUGMSG(D_DURING, "n");
  587. if (dev == NULL) {
  588. BUGMSG(D_DURING, "arcnet: irq %d for unknown device.n", irq);
  589. return;
  590. }
  591. BUGMSG(D_DURING, "in arcnet_interruptn");
  592. lp = (struct arcnet_local *) dev->priv;
  593. if (!lp) {
  594. BUGMSG(D_DURING, "arcnet: irq ignored due to missing lp.n");
  595. return;
  596. }
  597. /*
  598.  * RESET flag was enabled - if device is not running, we must clear it right
  599.  * away (but nothing else).
  600.  */
  601. if (!netif_running(dev)) {
  602. if (ASTATUS() & RESETflag)
  603. ACOMMAND(CFLAGScmd | RESETclear);
  604. AINTMASK(0);
  605. return;
  606. }
  607. BUGMSG(D_DURING, "in arcnet_inthandler (status=%Xh, intmask=%Xh)n",
  608.        ASTATUS(), lp->intmask);
  609. boguscount = 5;
  610. do {
  611. status = ASTATUS();
  612. didsomething = 0;
  613. /*
  614.  * RESET flag was enabled - card is resetting and if RX is
  615.  * disabled, it's NOT because we just got a packet.
  616.  * 
  617.  * The card is in an undefined state.  Clear it out and start over.
  618.  */
  619. if (status & RESETflag) {
  620. BUGMSG(D_NORMAL, "spurious reset (status=%Xh)n", status);
  621. arcnet_close(dev);
  622. arcnet_open(dev);
  623. /* get out of the interrupt handler! */
  624. break;
  625. }
  626. /* 
  627.  * RX is inhibited - we must have received something. Prepare to
  628.  * receive into the next buffer.
  629.  * 
  630.  * We don't actually copy the received packet from the card until
  631.  * after the transmit handler runs (and possibly launches the next
  632.  * tx); this should improve latency slightly if we get both types
  633.  * of interrupts at once. 
  634.  */
  635. recbuf = -1;
  636. if (status & lp->intmask & NORXflag) {
  637. recbuf = lp->cur_rx;
  638. BUGMSG(D_DURING, "Buffer #%d: receive irq (status=%Xh)n",
  639.        recbuf, status);
  640. lp->cur_rx = get_arcbuf(dev);
  641. if (lp->cur_rx != -1) {
  642. BUGMSG(D_DURING, "enabling receive to buffer #%dn",
  643.        lp->cur_rx);
  644. ACOMMAND(RXcmd | (lp->cur_rx << 3) | RXbcasts);
  645. }
  646. didsomething++;
  647. }
  648. /* a transmit finished, and we're interested in it. */
  649. if ((status & lp->intmask & TXFREEflag) || lp->timed_out) {
  650. lp->intmask &= ~TXFREEflag;
  651. BUGMSG(D_DURING, "TX IRQ (stat=%Xh)n", status);
  652. if (lp->cur_tx != -1 && !(status & TXACKflag) && !lp->timed_out) {
  653. if (lp->lasttrans_dest != 0) {
  654. BUGMSG(D_EXTRA, "transmit was not acknowledged! "
  655.     "(status=%Xh, dest=%02Xh)n",
  656.      status, lp->lasttrans_dest);
  657. lp->stats.tx_errors++;
  658. lp->stats.tx_carrier_errors++;
  659. } else {
  660. BUGMSG(D_DURING,
  661.        "broadcast was not acknowledged; that's normal "
  662.     "(status=%Xh, dest=%02Xh)n",
  663.      status, lp->lasttrans_dest);
  664. }
  665. }
  666. if (lp->cur_tx != -1)
  667. release_arcbuf(dev, lp->cur_tx);
  668. lp->cur_tx = -1;
  669. lp->timed_out = 0;
  670. didsomething++;
  671. /* send another packet if there is one */
  672. go_tx(dev);
  673. /* continue a split packet, if any */
  674. if (lp->outgoing.proto && lp->outgoing.proto->continue_tx) {
  675. int txbuf = get_arcbuf(dev);
  676. if (txbuf != -1) {
  677. if (lp->outgoing.proto->continue_tx(dev, txbuf)) {
  678. /* that was the last segment */
  679. lp->stats.tx_bytes += lp->outgoing.skb->len;
  680. dev_kfree_skb_irq(lp->outgoing.skb);
  681. lp->outgoing.proto = NULL;
  682. }
  683. lp->next_tx = txbuf;
  684. }
  685. }
  686. /* inform upper layers of idleness, if necessary */
  687. if (lp->cur_tx == -1)
  688. netif_wake_queue(dev);
  689. }
  690. /* now process the received packet, if any */
  691. if (recbuf != -1) {
  692. BUGLVL(D_RX) arcnet_dump_packet(dev, recbuf, "rx irq");
  693. arcnet_rx(dev, recbuf);
  694. release_arcbuf(dev, recbuf);
  695. didsomething++;
  696. }
  697. if (status & lp->intmask & RECONflag) {
  698. ACOMMAND(CFLAGScmd | CONFIGclear);
  699. lp->stats.tx_carrier_errors++;
  700. BUGMSG(D_RECON, "Network reconfiguration detected (status=%Xh)n",
  701.        status);
  702. /* is the RECON info empty or old? */
  703. if (!lp->first_recon || !lp->last_recon ||
  704.     jiffies - lp->last_recon > HZ * 10) {
  705. if (lp->network_down)
  706. BUGMSG(D_NORMAL, "reconfiguration detected: cabling restored?n");
  707. lp->first_recon = lp->last_recon = jiffies;
  708. lp->num_recons = lp->network_down = 0;
  709. BUGMSG(D_DURING, "recon: clearing counters.n");
  710. } else { /* add to current RECON counter */
  711. lp->last_recon = jiffies;
  712. lp->num_recons++;
  713. BUGMSG(D_DURING, "recon: counter=%d, time=%lds, net=%dn",
  714.        lp->num_recons,
  715.  (lp->last_recon - lp->first_recon) / HZ,
  716.        lp->network_down);
  717. /* if network is marked up;
  718.  * and first_recon and last_recon are 60+ apart;
  719.  * and the average no. of recons counted is
  720.  *    > RECON_THRESHOLD/min;
  721.  * then print a warning message.
  722.  */
  723. if (!lp->network_down
  724.     && (lp->last_recon - lp->first_recon) <= HZ * 60
  725.   && lp->num_recons >= RECON_THRESHOLD) {
  726. lp->network_down = 1;
  727. BUGMSG(D_NORMAL, "many reconfigurations detected: cabling problem?n");
  728. } else if (!lp->network_down
  729.    && lp->last_recon - lp->first_recon > HZ * 60) {
  730. /* reset counters if we've gone for over a minute. */
  731. lp->first_recon = lp->last_recon;
  732. lp->num_recons = 1;
  733. }
  734. }
  735. } else if (lp->network_down && jiffies - lp->last_recon > HZ * 10) {
  736. if (lp->network_down)
  737. BUGMSG(D_NORMAL, "cabling restored?n");
  738. lp->first_recon = lp->last_recon = 0;
  739. lp->num_recons = lp->network_down = 0;
  740. BUGMSG(D_DURING, "not recon: clearing counters anyway.n");
  741. }
  742. }
  743. while (--boguscount && didsomething);
  744. BUGMSG(D_DURING, "arcnet_interrupt complete (status=%Xh, count=%d)n",
  745.        ASTATUS(), boguscount);
  746. BUGMSG(D_DURING, "n");
  747. AINTMASK(0);
  748. udelay(1);
  749. AINTMASK(lp->intmask);
  750. }
  751. /*
  752.  * This is a generic packet receiver that calls arcnet??_rx depending on the
  753.  * protocol ID found.
  754.  */
  755. void arcnet_rx(struct net_device *dev, int bufnum)
  756. {
  757. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  758. struct archdr pkt;
  759. struct arc_rfc1201 *soft;
  760. int length, ofs;
  761. soft = &pkt.soft.rfc1201;
  762. lp->hw.copy_from_card(dev, bufnum, 0, &pkt, sizeof(ARC_HDR_SIZE));
  763. if (pkt.hard.offset[0]) {
  764. ofs = pkt.hard.offset[0];
  765. length = 256 - ofs;
  766. } else {
  767. ofs = pkt.hard.offset[1];
  768. length = 512 - ofs;
  769. }
  770. /* get the full header, if possible */
  771. if (sizeof(pkt.soft) < length)
  772. lp->hw.copy_from_card(dev, bufnum, ofs, soft, sizeof(pkt.soft));
  773. else {
  774. memset(&pkt.soft, 0, sizeof(pkt.soft));
  775. lp->hw.copy_from_card(dev, bufnum, ofs, soft, length);
  776. }
  777. BUGMSG(D_DURING, "Buffer #%d: received packet from %02Xh to %02Xh "
  778.        "(%d+4 bytes)n",
  779.        bufnum, pkt.hard.source, pkt.hard.dest, length);
  780. lp->stats.rx_packets++;
  781. lp->stats.rx_bytes += length + ARC_HDR_SIZE;
  782. /* call the right receiver for the protocol */
  783. if (arc_proto_map[soft->proto] != &arc_proto_null) {
  784. BUGLVL(D_PROTO) {
  785. struct ArcProto
  786. *oldp = arc_proto_map[lp->default_proto[pkt.hard.source]],
  787. *newp = arc_proto_map[soft->proto];
  788. if (oldp != newp) {
  789. BUGMSG(D_PROTO,
  790.        "got protocol %02Xh; encap for host %02Xh is now '%c'"
  791.        " (was '%c')n", soft->proto, pkt.hard.source,
  792.        newp->suffix, oldp->suffix);
  793. }
  794. }
  795. /* broadcasts will always be done with the last-used encap. */
  796. lp->default_proto[0] = soft->proto;
  797. /* in striking contrast, the following isn't a hack. */
  798. lp->default_proto[pkt.hard.source] = soft->proto;
  799. }
  800. /* call the protocol-specific receiver. */
  801. arc_proto_map[soft->proto]->rx(dev, bufnum, &pkt, length);
  802. }
  803. /* 
  804.  * Get the current statistics.  This may be called with the card open or
  805.  * closed.
  806.  */
  807. static struct net_device_stats *arcnet_get_stats(struct net_device *dev)
  808. {
  809. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  810. return &lp->stats;
  811. }
  812. static void null_rx(struct net_device *dev, int bufnum,
  813.     struct archdr *pkthdr, int length)
  814. {
  815. BUGMSG(D_PROTO,
  816. "rx: don't know how to deal with proto %02Xh from host %02Xh.n",
  817.        pkthdr->soft.rfc1201.proto, pkthdr->hard.source);
  818. }
  819. static int null_build_header(struct sk_buff *skb, unsigned short type,
  820.      uint8_t daddr)
  821. {
  822. struct net_device *dev = skb->dev;
  823. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  824. BUGMSG(D_PROTO,
  825.        "tx: can't build header for encap %02Xh; load a protocol driver.n",
  826.        lp->default_proto[daddr]);
  827. /* always fails */
  828. return 0;
  829. }
  830. /* the "do nothing" prepare_tx function warns that there's nothing to do. */
  831. static int null_prepare_tx(struct net_device *dev, struct archdr *pkt,
  832.    int length, int bufnum)
  833. {
  834. struct arcnet_local *lp = (struct arcnet_local *) dev->priv;
  835. struct arc_hardware newpkt;
  836. BUGMSG(D_PROTO, "tx: no encap for this host; load a protocol driver.n");
  837. /* send a packet to myself -- will never get received, of course */
  838. newpkt.source = newpkt.dest = dev->dev_addr[0];
  839. /* only one byte of actual data (and it's random) */
  840. newpkt.offset[0] = 0xFF;
  841. lp->hw.copy_to_card(dev, bufnum, 0, &newpkt, ARC_HDR_SIZE);
  842. return 1; /* done */
  843. }