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

嵌入式Linux

开发平台:

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