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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: sgiseeq.c,v 1.17 2000/03/27 23:02:57 ralf Exp $
  2.  *
  3.  * sgiseeq.c: Seeq8003 ethernet driver for SGI machines.
  4.  *
  5.  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
  6.  */
  7. #include <linux/kernel.h>
  8. #include <linux/sched.h>
  9. #include <linux/types.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/ptrace.h>
  12. #include <linux/ioport.h>
  13. #include <linux/in.h>
  14. #include <linux/slab.h>
  15. #include <linux/string.h>
  16. #include <linux/delay.h>
  17. #include <asm/io.h>
  18. #include <asm/segment.h>
  19. #include <asm/system.h>
  20. #include <asm/bitops.h>
  21. #include <asm/page.h>
  22. #include <asm/pgtable.h>
  23. #include <linux/errno.h>
  24. #include <asm/byteorder.h>
  25. #include <linux/socket.h>
  26. #include <linux/route.h>
  27. #include <linux/netdevice.h>
  28. #include <linux/etherdevice.h>
  29. #include <linux/skbuff.h>
  30. #include <asm/sgi/sgihpc.h>
  31. #include <asm/sgi/sgint23.h>
  32. #include <asm/sgialib.h>
  33. #include "sgiseeq.h"
  34. static char *version =
  35. "sgiseeq.c: David S. Miller (dm@engr.sgi.com)n";
  36. static char *sgiseeqstr = "SGI Seeq8003";
  37. /* If you want speed, you do something silly, it always has worked
  38.  * for me.  So, with that in mind, I've decided to make this driver
  39.  * look completely like a stupid Lance from a driver architecture
  40.  * perspective.  Only difference is that here our "ring buffer" looks
  41.  * and acts like a real Lance one does but is layed out like how the
  42.  * HPC DMA and the Seeq want it to.  You'd be surprised how a stupid
  43.  * idea like this can pay off in performance, not to mention making
  44.  * this driver 2,000 times easier to write. ;-)
  45.  */
  46. /* Tune these if we tend to run out often etc. */
  47. #define SEEQ_RX_BUFFERS  16
  48. #define SEEQ_TX_BUFFERS  16
  49. #define PKT_BUF_SZ       1584
  50. #define NEXT_RX(i)  (((i) + 1) & (SEEQ_RX_BUFFERS - 1))
  51. #define NEXT_TX(i)  (((i) + 1) & (SEEQ_TX_BUFFERS - 1))
  52. #define PREV_RX(i)  (((i) - 1) & (SEEQ_RX_BUFFERS - 1))
  53. #define PREV_TX(i)  (((i) - 1) & (SEEQ_TX_BUFFERS - 1))
  54. #define TX_BUFFS_AVAIL(sp) ((sp->tx_old <= sp->tx_new) ? 
  55.     sp->tx_old + (SEEQ_TX_BUFFERS - 1) - sp->tx_new : 
  56.     sp->tx_old - sp->tx_new - 1)
  57. #define DEBUG
  58. struct sgiseeq_rx_desc {
  59. struct hpc_dma_desc rdma;
  60. signed int buf_vaddr;
  61. };
  62. struct sgiseeq_tx_desc {
  63. struct hpc_dma_desc tdma;
  64. signed int buf_vaddr;
  65. };
  66. /* Warning: This structure is layed out in a certain way because
  67.  *          HPC dma descriptors must be 8-byte aligned.  So don't
  68.  *          touch this without some care.
  69.  */
  70. struct sgiseeq_init_block { /* Note the name ;-) */
  71. /* Ptrs to the descriptors in KSEG1 uncached space. */
  72. struct sgiseeq_rx_desc *rx_desc;
  73. struct sgiseeq_tx_desc *tx_desc;
  74. unsigned int _padding[30]; /* Pad out to largest cache line size. */
  75. struct sgiseeq_rx_desc rxvector[SEEQ_RX_BUFFERS];
  76. struct sgiseeq_tx_desc txvector[SEEQ_TX_BUFFERS];
  77. };
  78. struct sgiseeq_private {
  79. volatile struct sgiseeq_init_block srings;
  80. char *name;
  81. volatile struct hpc3_ethregs *hregs;
  82. volatile struct sgiseeq_regs *sregs;
  83. /* Ring entry counters. */
  84. unsigned int rx_new, tx_new;
  85. unsigned int rx_old, tx_old;
  86. int is_edlc;
  87. unsigned char control;
  88. unsigned char mode;
  89. struct net_device_stats stats;
  90. };
  91. static inline void hpc3_eth_reset(volatile struct hpc3_ethregs *hregs)
  92. {
  93. hregs->rx_reset = (HPC3_ERXRST_CRESET | HPC3_ERXRST_CLRIRQ);
  94. udelay(20);
  95. hregs->rx_reset = 0;
  96. }
  97. static inline void reset_hpc3_and_seeq(volatile struct hpc3_ethregs *hregs,
  98.        volatile struct sgiseeq_regs *sregs)
  99. {
  100. hregs->rx_ctrl = hregs->tx_ctrl = 0;
  101. hpc3_eth_reset(hregs);
  102. }
  103. #define RSTAT_GO_BITS (SEEQ_RCMD_IGOOD | SEEQ_RCMD_IEOF | SEEQ_RCMD_ISHORT | 
  104.        SEEQ_RCMD_IDRIB | SEEQ_RCMD_ICRC)
  105. static inline void seeq_go(struct sgiseeq_private *sp,
  106.    volatile struct hpc3_ethregs *hregs,
  107.    volatile struct sgiseeq_regs *sregs)
  108. {
  109. sregs->rstat = sp->mode | RSTAT_GO_BITS;
  110. hregs->rx_ctrl = HPC3_ERXCTRL_ACTIVE;
  111. }
  112. static inline void seeq_load_eaddr(struct net_device *dev,
  113.    volatile struct sgiseeq_regs *sregs)
  114. {
  115. int i;
  116. sregs->tstat = SEEQ_TCMD_RB0;
  117. for (i = 0; i < 6; i++)
  118. sregs->rw.eth_addr[i] = dev->dev_addr[i];
  119. }
  120. #define TCNTINFO_INIT (HPCDMA_EOX | HPCDMA_ETXD)
  121. #define RCNTCFG_INIT  (HPCDMA_OWN | HPCDMA_EORP | HPCDMA_XIE)
  122. #define RCNTINFO_INIT (RCNTCFG_INIT | (PKT_BUF_SZ & HPCDMA_BCNT))
  123. static int seeq_init_ring(struct net_device *dev)
  124. {
  125. struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv;
  126. volatile struct sgiseeq_init_block *ib = &sp->srings;
  127. int i;
  128. netif_stop_queue(dev);
  129. sp->rx_new = sp->tx_new = 0;
  130. sp->rx_old = sp->tx_old = 0;
  131. seeq_load_eaddr(dev, sp->sregs);
  132. /* XXX for now just accept packets directly to us
  133.  * XXX and ether-broadcast.  Will do multicast and
  134.  * XXX promiscuous mode later. -davem
  135.  */
  136. sp->mode = SEEQ_RCMD_RBCAST;
  137. /* Setup tx ring. */
  138. for(i = 0; i < SEEQ_TX_BUFFERS; i++) {
  139. if(!ib->tx_desc[i].tdma.pbuf) {
  140. unsigned long buffer;
  141. buffer = (unsigned long) kmalloc(PKT_BUF_SZ, GFP_KERNEL);
  142. if (!buffer)
  143. return -ENOMEM;
  144. ib->tx_desc[i].buf_vaddr = KSEG1ADDR(buffer);
  145. ib->tx_desc[i].tdma.pbuf = PHYSADDR(buffer);
  146. // flush_cache_all();
  147. }
  148. ib->tx_desc[i].tdma.cntinfo = (TCNTINFO_INIT);
  149. }
  150. /* And now the rx ring. */
  151. for (i = 0; i < SEEQ_RX_BUFFERS; i++) {
  152. if (!ib->rx_desc[i].rdma.pbuf) {
  153. unsigned long buffer;
  154. buffer = (unsigned long) kmalloc(PKT_BUF_SZ, GFP_KERNEL);
  155. if (!buffer)
  156. return -ENOMEM;
  157. ib->rx_desc[i].buf_vaddr = KSEG1ADDR(buffer);
  158. ib->rx_desc[i].rdma.pbuf = PHYSADDR(buffer);
  159. // flush_cache_all();
  160. }
  161. ib->rx_desc[i].rdma.cntinfo = (RCNTINFO_INIT);
  162. }
  163. ib->rx_desc[i - 1].rdma.cntinfo |= (HPCDMA_EOR);
  164. return 0;
  165. }
  166. #ifdef DEBUG
  167. static struct sgiseeq_private *gpriv;
  168. static struct net_device *gdev;
  169. void sgiseeq_dump_rings(void)
  170. {
  171. static int once;
  172. struct sgiseeq_rx_desc *r = gpriv->srings.rx_desc;
  173. struct sgiseeq_tx_desc *t = gpriv->srings.tx_desc;
  174. volatile struct hpc3_ethregs *hregs = gpriv->hregs;
  175. int i;
  176. if(once)
  177. return;
  178. once++;
  179. printk("RING DUMP:n");
  180. for (i = 0; i < SEEQ_RX_BUFFERS; i++) {
  181. printk("RX [%d]: @(%p) [%08x,%08x,%08x] ",
  182.        i, (&r[i]), r[i].rdma.pbuf, r[i].rdma.cntinfo,
  183.        r[i].rdma.pnext);
  184. i += 1;
  185. printk("-- [%d]: @(%p) [%08x,%08x,%08x]n",
  186.        i, (&r[i]), r[i].rdma.pbuf, r[i].rdma.cntinfo,
  187.        r[i].rdma.pnext);
  188. }
  189. for (i = 0; i < SEEQ_TX_BUFFERS; i++) {
  190. printk("TX [%d]: @(%p) [%08x,%08x,%08x] ",
  191.        i, (&t[i]), t[i].tdma.pbuf, t[i].tdma.cntinfo,
  192.        t[i].tdma.pnext);
  193. i += 1;
  194. printk("-- [%d]: @(%p) [%08x,%08x,%08x]n",
  195.        i, (&t[i]), t[i].tdma.pbuf, t[i].tdma.cntinfo,
  196.        t[i].tdma.pnext);
  197. }
  198. printk("INFO: [rx_new = %d rx_old=%d] [tx_new = %d tx_old = %d]n",
  199.        gpriv->rx_new, gpriv->rx_old, gpriv->tx_new, gpriv->tx_old);
  200. printk("RREGS: rx_cbptr[%08x] rx_ndptr[%08x] rx_ctrl[%08x]n",
  201.        hregs->rx_cbptr, hregs->rx_ndptr, hregs->rx_ctrl);
  202. printk("TREGS: tx_cbptr[%08x] tx_ndptr[%08x] tx_ctrl[%08x]n",
  203.        hregs->tx_cbptr, hregs->tx_ndptr, hregs->tx_ctrl);
  204. }
  205. #endif
  206. #define TSTAT_INIT_SEEQ (SEEQ_TCMD_IPT|SEEQ_TCMD_I16|SEEQ_TCMD_IC|SEEQ_TCMD_IUF)
  207. #define TSTAT_INIT_EDLC ((TSTAT_INIT_SEEQ) | SEEQ_TCMD_RB2)
  208. #define RDMACFG_INIT    (HPC3_ERXDCFG_FRXDC | HPC3_ERXDCFG_FEOP | HPC3_ERXDCFG_FIRQ)
  209. static int init_seeq(struct net_device *dev, struct sgiseeq_private *sp,
  210.       volatile struct sgiseeq_regs *sregs)
  211. {
  212. volatile struct hpc3_ethregs *hregs = sp->hregs;
  213. int err;
  214. reset_hpc3_and_seeq(hregs, sregs);
  215. err = seeq_init_ring(dev);
  216. if (err)
  217. return err;
  218. /* Setup to field the proper interrupt types. */
  219. if (sp->is_edlc) {
  220. sregs->tstat = (TSTAT_INIT_EDLC);
  221. sregs->rw.wregs.control = sp->control;
  222. sregs->rw.wregs.frame_gap = 0;
  223. } else {
  224. sregs->tstat = (TSTAT_INIT_SEEQ);
  225. }
  226. hregs->rx_dconfig |= RDMACFG_INIT;
  227. hregs->rx_ndptr = PHYSADDR(&sp->srings.rx_desc[0]);
  228. hregs->tx_ndptr = PHYSADDR(&sp->srings.tx_desc[0]);
  229. seeq_go(sp, hregs, sregs);
  230. return 0;
  231. }
  232. static inline void record_rx_errors(struct sgiseeq_private *sp,
  233.     unsigned char status)
  234. {
  235. if (status & SEEQ_RSTAT_OVERF ||
  236.     status & SEEQ_RSTAT_SFRAME)
  237. sp->stats.rx_over_errors++;
  238. if (status & SEEQ_RSTAT_CERROR)
  239. sp->stats.rx_crc_errors++;
  240. if (status & SEEQ_RSTAT_DERROR)
  241. sp->stats.rx_frame_errors++;
  242. if (status & SEEQ_RSTAT_REOF)
  243. sp->stats.rx_errors++;
  244. }
  245. static inline void rx_maybe_restart(struct sgiseeq_private *sp,
  246.     volatile struct hpc3_ethregs *hregs,
  247.     volatile struct sgiseeq_regs *sregs)
  248. {
  249. if (!(hregs->rx_ctrl & HPC3_ERXCTRL_ACTIVE)) {
  250. hregs->rx_ndptr = PHYSADDR(&sp->srings.rx_desc[sp->rx_new]);
  251. seeq_go(sp, hregs, sregs);
  252. }
  253. }
  254. #define for_each_rx(rd, sp) for((rd) = &(sp)->srings.rx_desc[(sp)->rx_new]; 
  255. !((rd)->rdma.cntinfo & HPCDMA_OWN); 
  256. (rd) = &(sp)->srings.rx_desc[(sp)->rx_new])
  257. static inline void sgiseeq_rx(struct net_device *dev, struct sgiseeq_private *sp,
  258.       volatile struct hpc3_ethregs *hregs,
  259.       volatile struct sgiseeq_regs *sregs)
  260. {
  261. struct sgiseeq_rx_desc *rd;
  262. struct sk_buff *skb = 0;
  263. unsigned char pkt_status;
  264. unsigned char *pkt_pointer = 0;
  265. int len = 0;
  266. unsigned int orig_end = PREV_RX(sp->rx_new);
  267. /* Service every received packet. */
  268. for_each_rx(rd, sp) {
  269. len = (PKT_BUF_SZ - (rd->rdma.cntinfo & HPCDMA_BCNT) - 3);
  270. pkt_pointer = (unsigned char *)(long)rd->buf_vaddr;
  271. pkt_status = pkt_pointer[len + 2];
  272. if (pkt_status & SEEQ_RSTAT_FIG) {
  273. /* Packet is OK. */
  274. skb = dev_alloc_skb(len + 2);
  275. if (skb) {
  276. skb->dev = dev;
  277. skb_reserve(skb, 2);
  278. skb_put(skb, len);
  279. /* Copy out of kseg1 to avoid silly cache flush. */
  280. eth_copy_and_sum(skb, pkt_pointer + 2, len, 0);
  281. skb->protocol = eth_type_trans(skb, dev);
  282. netif_rx(skb);
  283. dev->last_rx = jiffies;
  284. sp->stats.rx_packets++;
  285. sp->stats.rx_bytes += len;
  286. } else {
  287. printk ("%s: Memory squeeze, deferring packet.n",
  288. dev->name);
  289. sp->stats.rx_dropped++;
  290. }
  291. } else {
  292. record_rx_errors(sp, pkt_status);
  293. }
  294. /* Return the entry to the ring pool. */
  295. rd->rdma.cntinfo = (RCNTINFO_INIT);
  296. sp->rx_new = NEXT_RX(sp->rx_new);
  297. }
  298. sp->srings.rx_desc[orig_end].rdma.cntinfo &= ~(HPCDMA_EOR);
  299. sp->srings.rx_desc[PREV_RX(sp->rx_new)].rdma.cntinfo |= HPCDMA_EOR;
  300. rx_maybe_restart(sp, hregs, sregs);
  301. }
  302. static inline void tx_maybe_reset_collisions(struct sgiseeq_private *sp,
  303.      volatile struct sgiseeq_regs *sregs)
  304. {
  305. if (sp->is_edlc) {
  306. sregs->rw.wregs.control = sp->control & ~(SEEQ_CTRL_XCNT);
  307. sregs->rw.wregs.control = sp->control;
  308. }
  309. }
  310. static inline void kick_tx(struct sgiseeq_tx_desc *td,
  311.    volatile struct hpc3_ethregs *hregs)
  312. {
  313. /* If the HPC aint doin nothin, and there are more packets
  314.  * with ETXD cleared and XIU set we must make very certain
  315.  * that we restart the HPC else we risk locking up the
  316.  * adapter.  The following code is only safe iff the HPCDMA
  317.  * is not active!
  318.  */
  319. while ((td->tdma.cntinfo & (HPCDMA_XIU | HPCDMA_ETXD)) ==
  320.       (HPCDMA_XIU | HPCDMA_ETXD))
  321. td = (struct sgiseeq_tx_desc *)(long) KSEG1ADDR(td->tdma.pnext);
  322. if (td->tdma.cntinfo & HPCDMA_XIU) {
  323. hregs->tx_ndptr = PHYSADDR(td);
  324. hregs->tx_ctrl = HPC3_ETXCTRL_ACTIVE;
  325. }
  326. }
  327. static inline void sgiseeq_tx(struct net_device *dev, struct sgiseeq_private *sp,
  328.       volatile struct hpc3_ethregs *hregs,
  329.       volatile struct sgiseeq_regs *sregs)
  330. {
  331. struct sgiseeq_tx_desc *td;
  332. unsigned long status = hregs->tx_ctrl;
  333. int j;
  334. tx_maybe_reset_collisions(sp, sregs);
  335. if (!(status & (HPC3_ETXCTRL_ACTIVE | SEEQ_TSTAT_PTRANS))) {
  336. /* Oops, HPC detected some sort of error. */
  337. if (status & SEEQ_TSTAT_R16)
  338. sp->stats.tx_aborted_errors++;
  339. if (status & SEEQ_TSTAT_UFLOW)
  340. sp->stats.tx_fifo_errors++;
  341. if (status & SEEQ_TSTAT_LCLS)
  342. sp->stats.collisions++;
  343. }
  344. /* Ack 'em... */
  345. for (j = sp->tx_old; j != sp->tx_new; j = NEXT_TX(j)) {
  346. td = &sp->srings.tx_desc[j];
  347. if (!(td->tdma.cntinfo & (HPCDMA_XIU)))
  348. break;
  349. if (!(td->tdma.cntinfo & (HPCDMA_ETXD))) {
  350. if(!(status & HPC3_ETXCTRL_ACTIVE)) {
  351. hregs->tx_ndptr = PHYSADDR(td);
  352. hregs->tx_ctrl = HPC3_ETXCTRL_ACTIVE;
  353. }
  354. break;
  355. }
  356. sp->stats.tx_packets++;
  357. sp->tx_old = NEXT_TX(sp->tx_old);
  358. td->tdma.cntinfo &= ~(HPCDMA_XIU | HPCDMA_XIE);
  359. td->tdma.cntinfo |= HPCDMA_EOX;
  360. }
  361. }
  362. static void sgiseeq_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  363. {
  364. struct net_device *dev = (struct net_device *) dev_id;
  365. struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv;
  366. volatile struct hpc3_ethregs *hregs = sp->hregs;
  367. volatile struct sgiseeq_regs *sregs = sp->sregs;
  368. /* Ack the IRQ and set software state. */
  369. hregs->rx_reset = HPC3_ERXRST_CLRIRQ;
  370. /* Always check for received packets. */
  371. sgiseeq_rx(dev, sp, hregs, sregs);
  372. /* Only check for tx acks iff we have something queued. */
  373. if (sp->tx_old != sp->tx_new)
  374. sgiseeq_tx(dev, sp, hregs, sregs);
  375. if ((TX_BUFFS_AVAIL(sp) > 0) && netif_queue_stopped(dev)) {
  376. netif_wake_queue(dev);
  377. }
  378. }
  379. static int sgiseeq_open(struct net_device *dev)
  380. {
  381. struct sgiseeq_private *sp = (struct sgiseeq_private *)dev->priv;
  382. volatile struct sgiseeq_regs *sregs = sp->sregs;
  383. unsigned long flags;
  384. int err;
  385. save_flags(flags); cli();
  386. if (request_irq(dev->irq, sgiseeq_interrupt, 0, sgiseeqstr, (void *) dev)) {
  387. printk("Seeq8003: Can't get irq %dn", dev->irq);
  388. restore_flags(flags);
  389. return -EAGAIN;
  390. }
  391. err = init_seeq(dev, sp, sregs);
  392. if (err)
  393. return err;
  394. netif_start_queue(dev);
  395. restore_flags(flags);
  396. return 0;
  397. }
  398. static int sgiseeq_close(struct net_device *dev)
  399. {
  400. struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv;
  401. volatile struct sgiseeq_regs *sregs = sp->sregs;
  402. netif_stop_queue(dev);
  403. /* Shutdown the Seeq. */
  404. reset_hpc3_and_seeq(sp->hregs, sregs);
  405. free_irq(dev->irq, dev);
  406. return 0;
  407. }
  408. static inline int sgiseeq_reset(struct net_device *dev)
  409. {
  410. struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv;
  411. volatile struct sgiseeq_regs *sregs = sp->sregs;
  412. int err;
  413. err = init_seeq(dev, sp, sregs);
  414. if (err)
  415. return err;
  416. dev->trans_start = jiffies;
  417. netif_wake_queue(dev);
  418. return 0;
  419. }
  420. void sgiseeq_my_reset(void)
  421. {
  422. printk("RESET!n");
  423. sgiseeq_reset(gdev);
  424. }
  425. static int sgiseeq_start_xmit(struct sk_buff *skb, struct net_device *dev)
  426. {
  427. struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv;
  428. volatile struct hpc3_ethregs *hregs = sp->hregs;
  429. unsigned long flags;
  430. struct sgiseeq_tx_desc *td;
  431. int skblen, len, entry;
  432. save_and_cli(flags);
  433. /* Setup... */
  434. skblen = skb->len;
  435. len = (skblen <= ETH_ZLEN) ? ETH_ZLEN : skblen;
  436. sp->stats.tx_bytes += len;
  437. entry = sp->tx_new;
  438. td = &sp->srings.tx_desc[entry];
  439. /* Create entry.  There are so many races with adding a new
  440.  * descriptor to the chain:
  441.  * 1) Assume that the HPC is off processing a DMA chain while
  442.  *    we are changing all of the following.
  443.  * 2) Do no allow the HPC to look at a new descriptor until
  444.  *    we have completely set up it's state.  This means, do
  445.  *    not clear HPCDMA_EOX in the current last descritptor
  446.  *    until the one we are adding looks consistant and could
  447.  *    be processes right now.
  448.  * 3) The tx interrupt code must notice when we've added a new
  449.  *    entry and the HPC got to the end of the chain before we
  450.  *    added this new entry and restarted it.
  451.  */
  452. memcpy((char *)(long)td->buf_vaddr, skb->data, skblen);
  453. td->tdma.cntinfo = (len & HPCDMA_BCNT) |
  454.                    (HPCDMA_XIU | HPCDMA_EOXP | HPCDMA_XIE | HPCDMA_EOX);
  455. if (sp->tx_old != sp->tx_new) {
  456. struct sgiseeq_tx_desc *backend;
  457. backend = &sp->srings.tx_desc[PREV_TX(sp->tx_new)];
  458. backend->tdma.cntinfo &= ~(HPCDMA_EOX);
  459. }
  460. sp->tx_new = NEXT_TX(sp->tx_new); /* Advance. */
  461. /* Maybe kick the HPC back into motion. */
  462. if (!(hregs->tx_ctrl & HPC3_ETXCTRL_ACTIVE))
  463. kick_tx(&sp->srings.tx_desc[sp->tx_old], hregs);
  464. dev->trans_start = jiffies;
  465. dev_kfree_skb(skb);
  466. if (!TX_BUFFS_AVAIL(sp))
  467. netif_stop_queue(dev);
  468. restore_flags(flags);
  469. return 0;
  470. }
  471. static void timeout(struct net_device *dev)
  472. {
  473. printk("%s: transmit timed out, resettingn", dev->name);
  474. sgiseeq_reset(dev);
  475. dev->trans_start = jiffies;
  476. netif_wake_queue(dev);
  477. }
  478. static struct net_device_stats *sgiseeq_get_stats(struct net_device *dev)
  479. {
  480. struct sgiseeq_private *sp = (struct sgiseeq_private *) dev->priv;
  481. return &sp->stats;
  482. }
  483. static void sgiseeq_set_multicast(struct net_device *dev)
  484. {
  485. }
  486. static inline void setup_tx_ring(struct sgiseeq_tx_desc *buf, int nbufs)
  487. {
  488. int i = 0;
  489. while (i < (nbufs - 1)) {
  490. buf[i].tdma.pnext = PHYSADDR(&buf[i + 1]);
  491. buf[i].tdma.pbuf = 0;
  492. i++;
  493. }
  494. buf[i].tdma.pnext = PHYSADDR(&buf[0]);
  495. }
  496. static inline void setup_rx_ring(struct sgiseeq_rx_desc *buf, int nbufs)
  497. {
  498. int i = 0;
  499. while (i < (nbufs - 1)) {
  500. buf[i].rdma.pnext = PHYSADDR(&buf[i + 1]);
  501. buf[i].rdma.pbuf = 0;
  502. i++;
  503. }
  504. buf[i].rdma.pbuf = 0;
  505. buf[i].rdma.pnext = PHYSADDR(&buf[0]);
  506. }
  507. static char onboard_eth_addr[6];
  508. #define ALIGNED(x)  ((((unsigned long)(x)) + 0xf) & ~(0xf))
  509. int sgiseeq_init(struct net_device *dev, struct sgiseeq_regs *sregs,
  510.  struct hpc3_ethregs *hregs, int irq)
  511. {
  512. static unsigned version_printed;
  513. int i;
  514. struct sgiseeq_private *sp;
  515. dev->priv = (struct sgiseeq_private *) get_free_page(GFP_KERNEL);
  516. if (dev->priv == NULL)
  517. return -ENOMEM;
  518. if (!version_printed++)
  519. printk(version);
  520. printk("%s: SGI Seeq8003 ", dev->name);
  521. for (i = 0; i < 6; i++)
  522. printk("%2.2x%c",
  523.        dev->dev_addr[i] = onboard_eth_addr[i],
  524.        i == 5 ? ' ': ':');
  525. printk("n");
  526. sp = (struct sgiseeq_private *) dev->priv;
  527. #ifdef DEBUG
  528. gpriv = sp;
  529. gdev = dev;
  530. #endif
  531. memset((char *)dev->priv, 0, sizeof(struct sgiseeq_private));
  532. sp->sregs = sregs;
  533. sp->hregs = hregs;
  534. sp->name = sgiseeqstr;
  535. sp->srings.rx_desc = (struct sgiseeq_rx_desc *)
  536.                      (KSEG1ADDR(ALIGNED(&sp->srings.rxvector[0])));
  537. dma_cache_wback_inv((unsigned long)&sp->srings.rxvector,
  538.                     sizeof(sp->srings.rxvector));
  539. sp->srings.tx_desc = (struct sgiseeq_tx_desc *)
  540.                      (KSEG1ADDR(ALIGNED(&sp->srings.txvector[0])));
  541. dma_cache_wback_inv((unsigned long)&sp->srings.txvector,
  542.                     sizeof(sp->srings.txvector));
  543. /* A couple calculations now, saves many cycles later. */
  544. setup_rx_ring(sp->srings.rx_desc, SEEQ_RX_BUFFERS);
  545. setup_tx_ring(sp->srings.tx_desc, SEEQ_TX_BUFFERS);
  546. /* Reset the chip. */
  547. hpc3_eth_reset((volatile struct hpc3_ethregs *) hregs);
  548. sp->is_edlc = !(sregs->rw.rregs.collision_tx[0] & 0xff);
  549. if (sp->is_edlc) {
  550. sp->control = (SEEQ_CTRL_XCNT | SEEQ_CTRL_ACCNT |
  551.        SEEQ_CTRL_SFLAG | SEEQ_CTRL_ESHORT |
  552.        SEEQ_CTRL_ENCARR);
  553. }
  554. dev->open                 = sgiseeq_open;
  555. dev->stop                 = sgiseeq_close;
  556. dev->hard_start_xmit      = sgiseeq_start_xmit;
  557. dev->tx_timeout           = timeout;
  558. dev->watchdog_timeo       = (200 * HZ) / 1000;
  559. dev->get_stats            = sgiseeq_get_stats;
  560. dev->set_multicast_list   = sgiseeq_set_multicast;
  561. dev->irq                  = irq;
  562. dev->dma                  = 0;
  563. ether_setup(dev);
  564. return 0;
  565. }
  566. static inline unsigned char str2hexnum(unsigned char c)
  567. {
  568. if (c >= '0' && c <= '9')
  569. return c - '0';
  570. if (c >= 'a' && c <= 'f')
  571. return c - 'a' + 10;
  572. return 0; /* foo */
  573. }
  574. static inline void str2eaddr(unsigned char *ea, unsigned char *str)
  575. {
  576. int i;
  577. for (i = 0; i < 6; i++) {
  578. unsigned char num;
  579. if(*str == ':')
  580. str++;
  581. num = str2hexnum(*str++) << 4;
  582. num |= (str2hexnum(*str++));
  583. ea[i] = num;
  584. }
  585. }
  586. int sgiseeq_probe(struct net_device *dev)
  587. {
  588. static int initialized;
  589. char *ep;
  590. if (initialized) /* Already initialized? */
  591. return 1;
  592. initialized++;
  593. /* First get the ethernet address of the onboard interface from ARCS.
  594.  * This is fragile; PROM doesn't like running from cache.
  595.  * On MIPS64 it crashes for some other, yet unknown reason ...
  596.  */
  597. ep = ArcGetEnvironmentVariable("eaddr");
  598. str2eaddr(onboard_eth_addr, ep);
  599. return sgiseeq_init(dev,
  600.     (struct sgiseeq_regs *) (KSEG1ADDR(0x1fbd4000)),
  601.     &hpc3c0->ethregs, SGI_ENET_IRQ);
  602. }