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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: sunqe.c,v 1.52.2.1 2001/12/21 00:52:47 davem Exp $
  2.  * sunqe.c: Sparc QuadEthernet 10baseT SBUS card driver.
  3.  *          Once again I am out to prove that every ethernet
  4.  *          controller out there can be most efficiently programmed
  5.  *          if you make it look like a LANCE.
  6.  *
  7.  * Copyright (C) 1996, 1999 David S. Miller (davem@redhat.com)
  8.  */
  9. static char version[] =
  10.         "sunqe.c:v2.9 9/11/99 David S. Miller (davem@redhat.com)n";
  11. #include <linux/module.h>
  12. #include <linux/kernel.h>
  13. #include <linux/sched.h>
  14. #include <linux/types.h>
  15. #include <linux/fcntl.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/ptrace.h>
  18. #include <linux/ioport.h>
  19. #include <linux/in.h>
  20. #include <linux/slab.h>
  21. #include <linux/string.h>
  22. #include <linux/delay.h>
  23. #include <linux/init.h>
  24. #include <linux/crc32.h>
  25. #include <asm/system.h>
  26. #include <asm/bitops.h>
  27. #include <asm/io.h>
  28. #include <asm/dma.h>
  29. #include <linux/errno.h>
  30. #include <asm/byteorder.h>
  31. #include <asm/idprom.h>
  32. #include <asm/sbus.h>
  33. #include <asm/openprom.h>
  34. #include <asm/oplib.h>
  35. #include <asm/auxio.h>
  36. #include <asm/pgtable.h>
  37. #include <asm/irq.h>
  38. #include <linux/netdevice.h>
  39. #include <linux/etherdevice.h>
  40. #include <linux/skbuff.h>
  41. #include "sunqe.h"
  42. static struct sunqec *root_qec_dev;
  43. static void qe_set_multicast(struct net_device *dev);
  44. #define QEC_RESET_TRIES 200
  45. static inline int qec_global_reset(unsigned long gregs)
  46. {
  47. int tries = QEC_RESET_TRIES;
  48. sbus_writel(GLOB_CTRL_RESET, gregs + GLOB_CTRL);
  49. while (--tries) {
  50. u32 tmp = sbus_readl(gregs + GLOB_CTRL);
  51. if (tmp & GLOB_CTRL_RESET) {
  52. udelay(20);
  53. continue;
  54. }
  55. break;
  56. }
  57. if (tries)
  58. return 0;
  59. printk(KERN_ERR "QuadEther: AIEEE cannot reset the QEC!n");
  60. return -1;
  61. }
  62. #define MACE_RESET_RETRIES 200
  63. #define QE_RESET_RETRIES   200
  64. static inline int qe_stop(struct sunqe *qep)
  65. {
  66. unsigned long cregs = qep->qcregs;
  67. unsigned long mregs = qep->mregs;
  68. int tries;
  69. /* Reset the MACE, then the QEC channel. */
  70. sbus_writeb(MREGS_BCONFIG_RESET, mregs + MREGS_BCONFIG);
  71. tries = MACE_RESET_RETRIES;
  72. while (--tries) {
  73. u8 tmp = sbus_readb(mregs + MREGS_BCONFIG);
  74. if (tmp & MREGS_BCONFIG_RESET) {
  75. udelay(20);
  76. continue;
  77. }
  78. break;
  79. }
  80. if (!tries) {
  81. printk(KERN_ERR "QuadEther: AIEEE cannot reset the MACE!n");
  82. return -1;
  83. }
  84. sbus_writel(CREG_CTRL_RESET, cregs + CREG_CTRL);
  85. tries = QE_RESET_RETRIES;
  86. while (--tries) {
  87. u32 tmp = sbus_readl(cregs + CREG_CTRL);
  88. if (tmp & CREG_CTRL_RESET) {
  89. udelay(20);
  90. continue;
  91. }
  92. break;
  93. }
  94. if (!tries) {
  95. printk(KERN_ERR "QuadEther: Cannot reset QE channel!n");
  96. return -1;
  97. }
  98. return 0;
  99. }
  100. static void qe_init_rings(struct sunqe *qep)
  101. {
  102. struct qe_init_block *qb = qep->qe_block;
  103. struct sunqe_buffers *qbufs = qep->buffers;
  104. __u32 qbufs_dvma = qep->buffers_dvma;
  105. int i;
  106. qep->rx_new = qep->rx_old = qep->tx_new = qep->tx_old = 0;
  107. memset(qb, 0, sizeof(struct qe_init_block));
  108. memset(qbufs, 0, sizeof(struct sunqe_buffers));
  109. for (i = 0; i < RX_RING_SIZE; i++) {
  110. qb->qe_rxd[i].rx_addr = qbufs_dvma + qebuf_offset(rx_buf, i);
  111. qb->qe_rxd[i].rx_flags =
  112. (RXD_OWN | ((RXD_PKT_SZ) & RXD_LENGTH));
  113. }
  114. }
  115. static int qe_init(struct sunqe *qep, int from_irq)
  116. {
  117. struct sunqec *qecp = qep->parent;
  118. unsigned long cregs = qep->qcregs;
  119. unsigned long mregs = qep->mregs;
  120. unsigned long gregs = qecp->gregs;
  121. unsigned char *e = &qep->dev->dev_addr[0];
  122. u32 tmp;
  123. int i;
  124. /* Shut it up. */
  125. if (qe_stop(qep))
  126. return -EAGAIN;
  127. /* Setup initial rx/tx init block pointers. */
  128. sbus_writel(qep->qblock_dvma + qib_offset(qe_rxd, 0), cregs + CREG_RXDS);
  129. sbus_writel(qep->qblock_dvma + qib_offset(qe_txd, 0), cregs + CREG_TXDS);
  130. /* Enable/mask the various irq's. */
  131. sbus_writel(0, cregs + CREG_RIMASK);
  132. sbus_writel(1, cregs + CREG_TIMASK);
  133. sbus_writel(0, cregs + CREG_QMASK);
  134. sbus_writel(CREG_MMASK_RXCOLL, cregs + CREG_MMASK);
  135. /* Setup the FIFO pointers into QEC local memory. */
  136. tmp = qep->channel * sbus_readl(gregs + GLOB_MSIZE);
  137. sbus_writel(tmp, cregs + CREG_RXRBUFPTR);
  138. sbus_writel(tmp, cregs + CREG_RXWBUFPTR);
  139. tmp = sbus_readl(cregs + CREG_RXRBUFPTR) +
  140. sbus_readl(gregs + GLOB_RSIZE);
  141. sbus_writel(tmp, cregs + CREG_TXRBUFPTR);
  142. sbus_writel(tmp, cregs + CREG_TXWBUFPTR);
  143. /* Clear the channel collision counter. */
  144. sbus_writel(0, cregs + CREG_CCNT);
  145. /* For 10baseT, inter frame space nor throttle seems to be necessary. */
  146. sbus_writel(0, cregs + CREG_PIPG);
  147. /* Now dork with the AMD MACE. */
  148. sbus_writeb(MREGS_PHYCONFIG_AUTO, mregs + MREGS_PHYCONFIG);
  149. sbus_writeb(MREGS_TXFCNTL_AUTOPAD, mregs + MREGS_TXFCNTL);
  150. sbus_writeb(0, mregs + MREGS_RXFCNTL);
  151. /* The QEC dma's the rx'd packets from local memory out to main memory,
  152.  * and therefore it interrupts when the packet reception is "complete".
  153.  * So don't listen for the MACE talking about it.
  154.  */
  155. sbus_writeb(MREGS_IMASK_COLL | MREGS_IMASK_RXIRQ, mregs + MREGS_IMASK);
  156. sbus_writeb(MREGS_BCONFIG_BSWAP | MREGS_BCONFIG_64TS, mregs + MREGS_BCONFIG);
  157. sbus_writeb((MREGS_FCONFIG_TXF16 | MREGS_FCONFIG_RXF32 |
  158.      MREGS_FCONFIG_RFWU | MREGS_FCONFIG_TFWU),
  159.     mregs + MREGS_FCONFIG);
  160. /* Only usable interface on QuadEther is twisted pair. */
  161. sbus_writeb(MREGS_PLSCONFIG_TP, mregs + MREGS_PLSCONFIG);
  162. /* Tell MACE we are changing the ether address. */
  163. sbus_writeb(MREGS_IACONFIG_ACHNGE | MREGS_IACONFIG_PARESET,
  164.     mregs + MREGS_IACONFIG);
  165. while ((sbus_readb(mregs + MREGS_IACONFIG) & MREGS_IACONFIG_ACHNGE) != 0)
  166. barrier();
  167. sbus_writeb(e[0], mregs + MREGS_ETHADDR);
  168. sbus_writeb(e[1], mregs + MREGS_ETHADDR);
  169. sbus_writeb(e[2], mregs + MREGS_ETHADDR);
  170. sbus_writeb(e[3], mregs + MREGS_ETHADDR);
  171. sbus_writeb(e[4], mregs + MREGS_ETHADDR);
  172. sbus_writeb(e[5], mregs + MREGS_ETHADDR);
  173. /* Clear out the address filter. */
  174. sbus_writeb(MREGS_IACONFIG_ACHNGE | MREGS_IACONFIG_LARESET,
  175.     mregs + MREGS_IACONFIG);
  176. while ((sbus_readb(mregs + MREGS_IACONFIG) & MREGS_IACONFIG_ACHNGE) != 0)
  177. barrier();
  178. for (i = 0; i < 8; i++)
  179. sbus_writeb(0, mregs + MREGS_FILTER);
  180. /* Address changes are now complete. */
  181. sbus_writeb(0, mregs + MREGS_IACONFIG);
  182. qe_init_rings(qep);
  183. /* Wait a little bit for the link to come up... */
  184. mdelay(5);
  185. if (!(sbus_readb(mregs + MREGS_PHYCONFIG) & MREGS_PHYCONFIG_LTESTDIS)) {
  186. int tries = 50;
  187. while (tries--) {
  188. u8 tmp;
  189. mdelay(5);
  190. barrier();
  191. tmp = sbus_readb(mregs + MREGS_PHYCONFIG);
  192. if ((tmp & MREGS_PHYCONFIG_LSTAT) != 0)
  193. break;
  194. }
  195. if (tries == 0)
  196. printk(KERN_NOTICE "%s: Warning, link state is down.n", qep->dev->name);
  197. }
  198. /* Missed packet counter is cleared on a read. */
  199. sbus_readb(mregs + MREGS_MPCNT);
  200. /* Reload multicast information, this will enable the receiver
  201.  * and transmitter.
  202.  */
  203. qe_set_multicast(qep->dev);
  204. /* QEC should now start to show interrupts. */
  205. return 0;
  206. }
  207. /* Grrr, certain error conditions completely lock up the AMD MACE,
  208.  * so when we get these we _must_ reset the chip.
  209.  */
  210. static int qe_is_bolixed(struct sunqe *qep, u32 qe_status)
  211. {
  212. struct net_device *dev = qep->dev;
  213. int mace_hwbug_workaround = 0;
  214. if (qe_status & CREG_STAT_EDEFER) {
  215. printk(KERN_ERR "%s: Excessive transmit defers.n", dev->name);
  216. qep->net_stats.tx_errors++;
  217. }
  218. if (qe_status & CREG_STAT_CLOSS) {
  219. printk(KERN_ERR "%s: Carrier lost, link down?n", dev->name);
  220. qep->net_stats.tx_errors++;
  221. qep->net_stats.tx_carrier_errors++;
  222. }
  223. if (qe_status & CREG_STAT_ERETRIES) {
  224. printk(KERN_ERR "%s: Excessive transmit retries (more than 16).n", dev->name);
  225. qep->net_stats.tx_errors++;
  226. mace_hwbug_workaround = 1;
  227. }
  228. if (qe_status & CREG_STAT_LCOLL) {
  229. printk(KERN_ERR "%s: Late transmit collision.n", dev->name);
  230. qep->net_stats.tx_errors++;
  231. qep->net_stats.collisions++;
  232. mace_hwbug_workaround = 1;
  233. }
  234. if (qe_status & CREG_STAT_FUFLOW) {
  235. printk(KERN_ERR "%s: Transmit fifo underflow, driver bug.n", dev->name);
  236. qep->net_stats.tx_errors++;
  237. mace_hwbug_workaround = 1;
  238. }
  239. if (qe_status & CREG_STAT_JERROR) {
  240. printk(KERN_ERR "%s: Jabber error.n", dev->name);
  241. }
  242. if (qe_status & CREG_STAT_BERROR) {
  243. printk(KERN_ERR "%s: Babble error.n", dev->name);
  244. }
  245. if (qe_status & CREG_STAT_CCOFLOW) {
  246. qep->net_stats.tx_errors += 256;
  247. qep->net_stats.collisions += 256;
  248. }
  249. if (qe_status & CREG_STAT_TXDERROR) {
  250. printk(KERN_ERR "%s: Transmit descriptor is bogus, driver bug.n", dev->name);
  251. qep->net_stats.tx_errors++;
  252. qep->net_stats.tx_aborted_errors++;
  253. mace_hwbug_workaround = 1;
  254. }
  255. if (qe_status & CREG_STAT_TXLERR) {
  256. printk(KERN_ERR "%s: Transmit late error.n", dev->name);
  257. qep->net_stats.tx_errors++;
  258. mace_hwbug_workaround = 1;
  259. }
  260. if (qe_status & CREG_STAT_TXPERR) {
  261. printk(KERN_ERR "%s: Transmit DMA parity error.n", dev->name);
  262. qep->net_stats.tx_errors++;
  263. qep->net_stats.tx_aborted_errors++;
  264. mace_hwbug_workaround = 1;
  265. }
  266. if (qe_status & CREG_STAT_TXSERR) {
  267. printk(KERN_ERR "%s: Transmit DMA sbus error ack.n", dev->name);
  268. qep->net_stats.tx_errors++;
  269. qep->net_stats.tx_aborted_errors++;
  270. mace_hwbug_workaround = 1;
  271. }
  272. if (qe_status & CREG_STAT_RCCOFLOW) {
  273. qep->net_stats.rx_errors += 256;
  274. qep->net_stats.collisions += 256;
  275. }
  276. if (qe_status & CREG_STAT_RUOFLOW) {
  277. qep->net_stats.rx_errors += 256;
  278. qep->net_stats.rx_over_errors += 256;
  279. }
  280. if (qe_status & CREG_STAT_MCOFLOW) {
  281. qep->net_stats.rx_errors += 256;
  282. qep->net_stats.rx_missed_errors += 256;
  283. }
  284. if (qe_status & CREG_STAT_RXFOFLOW) {
  285. printk(KERN_ERR "%s: Receive fifo overflow.n", dev->name);
  286. qep->net_stats.rx_errors++;
  287. qep->net_stats.rx_over_errors++;
  288. }
  289. if (qe_status & CREG_STAT_RLCOLL) {
  290. printk(KERN_ERR "%s: Late receive collision.n", dev->name);
  291. qep->net_stats.rx_errors++;
  292. qep->net_stats.collisions++;
  293. }
  294. if (qe_status & CREG_STAT_FCOFLOW) {
  295. qep->net_stats.rx_errors += 256;
  296. qep->net_stats.rx_frame_errors += 256;
  297. }
  298. if (qe_status & CREG_STAT_CECOFLOW) {
  299. qep->net_stats.rx_errors += 256;
  300. qep->net_stats.rx_crc_errors += 256;
  301. }
  302. if (qe_status & CREG_STAT_RXDROP) {
  303. printk(KERN_ERR "%s: Receive packet dropped.n", dev->name);
  304. qep->net_stats.rx_errors++;
  305. qep->net_stats.rx_dropped++;
  306. qep->net_stats.rx_missed_errors++;
  307. }
  308. if (qe_status & CREG_STAT_RXSMALL) {
  309. printk(KERN_ERR "%s: Receive buffer too small, driver bug.n", dev->name);
  310. qep->net_stats.rx_errors++;
  311. qep->net_stats.rx_length_errors++;
  312. }
  313. if (qe_status & CREG_STAT_RXLERR) {
  314. printk(KERN_ERR "%s: Receive late error.n", dev->name);
  315. qep->net_stats.rx_errors++;
  316. mace_hwbug_workaround = 1;
  317. }
  318. if (qe_status & CREG_STAT_RXPERR) {
  319. printk(KERN_ERR "%s: Receive DMA parity error.n", dev->name);
  320. qep->net_stats.rx_errors++;
  321. qep->net_stats.rx_missed_errors++;
  322. mace_hwbug_workaround = 1;
  323. }
  324. if (qe_status & CREG_STAT_RXSERR) {
  325. printk(KERN_ERR "%s: Receive DMA sbus error ack.n", dev->name);
  326. qep->net_stats.rx_errors++;
  327. qep->net_stats.rx_missed_errors++;
  328. mace_hwbug_workaround = 1;
  329. }
  330. if (mace_hwbug_workaround)
  331. qe_init(qep, 1);
  332. return mace_hwbug_workaround;
  333. }
  334. /* Per-QE receive interrupt service routine.  Just like on the happy meal
  335.  * we receive directly into skb's with a small packet copy water mark.
  336.  */
  337. static void qe_rx(struct sunqe *qep)
  338. {
  339. struct qe_rxd *rxbase = &qep->qe_block->qe_rxd[0];
  340. struct qe_rxd *this;
  341. struct sunqe_buffers *qbufs = qep->buffers;
  342. __u32 qbufs_dvma = qep->buffers_dvma;
  343. int elem = qep->rx_new, drops = 0;
  344. u32 flags;
  345. this = &rxbase[elem];
  346. while (!((flags = this->rx_flags) & RXD_OWN)) {
  347. struct sk_buff *skb;
  348. unsigned char *this_qbuf =
  349. &qbufs->rx_buf[elem & (RX_RING_SIZE - 1)][0];
  350. __u32 this_qbuf_dvma = qbufs_dvma +
  351. qebuf_offset(rx_buf, (elem & (RX_RING_SIZE - 1)));
  352. struct qe_rxd *end_rxd =
  353. &rxbase[(elem+RX_RING_SIZE)&(RX_RING_MAXSIZE-1)];
  354. int len = (flags & RXD_LENGTH) - 4;  /* QE adds ether FCS size to len */
  355. /* Check for errors. */
  356. if (len < ETH_ZLEN) {
  357. qep->net_stats.rx_errors++;
  358. qep->net_stats.rx_length_errors++;
  359. qep->net_stats.rx_dropped++;
  360. } else {
  361. skb = dev_alloc_skb(len + 2);
  362. if (skb == NULL) {
  363. drops++;
  364. qep->net_stats.rx_dropped++;
  365. } else {
  366. skb->dev = qep->dev;
  367. skb_reserve(skb, 2);
  368. skb_put(skb, len);
  369. eth_copy_and_sum(skb, (unsigned char *) this_qbuf,
  370.  len, 0);
  371. skb->protocol = eth_type_trans(skb, qep->dev);
  372. netif_rx(skb);
  373. qep->dev->last_rx = jiffies;
  374. qep->net_stats.rx_packets++;
  375. qep->net_stats.rx_bytes += len;
  376. }
  377. }
  378. end_rxd->rx_addr = this_qbuf_dvma;
  379. end_rxd->rx_flags = (RXD_OWN | ((RXD_PKT_SZ) & RXD_LENGTH));
  380. elem = NEXT_RX(elem);
  381. this = &rxbase[elem];
  382. }
  383. qep->rx_new = elem;
  384. if (drops)
  385. printk(KERN_NOTICE "%s: Memory squeeze, deferring packet.n", qep->dev->name);
  386. }
  387. static void qe_tx_reclaim(struct sunqe *qep);
  388. /* Interrupts for all QE's get filtered out via the QEC master controller,
  389.  * so we just run through each qe and check to see who is signaling
  390.  * and thus needs to be serviced.
  391.  */
  392. static void qec_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  393. {
  394. struct sunqec *qecp = (struct sunqec *) dev_id;
  395. u32 qec_status;
  396. int channel = 0;
  397. /* Latch the status now. */
  398. qec_status = sbus_readl(qecp->gregs + GLOB_STAT);
  399. while (channel < 4) {
  400. if (qec_status & 0xf) {
  401. struct sunqe *qep = qecp->qes[channel];
  402. u32 qe_status;
  403. qe_status = sbus_readl(qep->qcregs + CREG_STAT);
  404. if (qe_status & CREG_STAT_ERRORS) {
  405. if (qe_is_bolixed(qep, qe_status))
  406. goto next;
  407. }
  408. if (qe_status & CREG_STAT_RXIRQ)
  409. qe_rx(qep);
  410. if (netif_queue_stopped(qep->dev) &&
  411.     (qe_status & CREG_STAT_TXIRQ)) {
  412. spin_lock(&qep->lock);
  413. qe_tx_reclaim(qep);
  414. if (TX_BUFFS_AVAIL(qep) > 0) {
  415. /* Wake net queue and return to
  416.  * lazy tx reclaim.
  417.  */
  418. netif_wake_queue(qep->dev);
  419. sbus_writel(1, qep->qcregs + CREG_TIMASK);
  420. }
  421. spin_unlock(&qep->lock);
  422. }
  423. next:
  424. ;
  425. }
  426. qec_status >>= 4;
  427. channel++;
  428. }
  429. }
  430. static int qe_open(struct net_device *dev)
  431. {
  432. struct sunqe *qep = (struct sunqe *) dev->priv;
  433. qep->mconfig = (MREGS_MCONFIG_TXENAB |
  434. MREGS_MCONFIG_RXENAB |
  435. MREGS_MCONFIG_MBAENAB);
  436. return qe_init(qep, 0);
  437. }
  438. static int qe_close(struct net_device *dev)
  439. {
  440. struct sunqe *qep = (struct sunqe *) dev->priv;
  441. qe_stop(qep);
  442. return 0;
  443. }
  444. /* Reclaim TX'd frames from the ring.  This must always run under
  445.  * the IRQ protected qep->lock.
  446.  */
  447. static void qe_tx_reclaim(struct sunqe *qep)
  448. {
  449. struct qe_txd *txbase = &qep->qe_block->qe_txd[0];
  450. int elem = qep->tx_old;
  451. while (elem != qep->tx_new) {
  452. u32 flags = txbase[elem].tx_flags;
  453. if (flags & TXD_OWN)
  454. break;
  455. elem = NEXT_TX(elem);
  456. }
  457. qep->tx_old = elem;
  458. }
  459. static void qe_tx_timeout(struct net_device *dev)
  460. {
  461. struct sunqe *qep = (struct sunqe *) dev->priv;
  462. int tx_full;
  463. spin_lock_irq(&qep->lock);
  464. /* Try to reclaim, if that frees up some tx
  465.  * entries, we're fine.
  466.  */
  467. qe_tx_reclaim(qep);
  468. tx_full = TX_BUFFS_AVAIL(qep) <= 0;
  469. spin_unlock_irq(&qep->lock);
  470. if (! tx_full)
  471. goto out;
  472. printk(KERN_ERR "%s: transmit timed out, resettingn", dev->name);
  473. qe_init(qep, 1);
  474. out:
  475. netif_wake_queue(dev);
  476. }
  477. /* Get a packet queued to go onto the wire. */
  478. static int qe_start_xmit(struct sk_buff *skb, struct net_device *dev)
  479. {
  480. struct sunqe *qep = (struct sunqe *) dev->priv;
  481. struct sunqe_buffers *qbufs = qep->buffers;
  482. __u32 txbuf_dvma, qbufs_dvma = qep->buffers_dvma;
  483. unsigned char *txbuf;
  484. int len, entry;
  485. spin_lock_irq(&qep->lock);
  486. qe_tx_reclaim(qep);
  487. len = skb->len;
  488. entry = qep->tx_new;
  489. txbuf = &qbufs->tx_buf[entry & (TX_RING_SIZE - 1)][0];
  490. txbuf_dvma = qbufs_dvma +
  491. qebuf_offset(tx_buf, (entry & (TX_RING_SIZE - 1)));
  492. /* Avoid a race... */
  493. qep->qe_block->qe_txd[entry].tx_flags = TXD_UPDATE;
  494. memcpy(txbuf, skb->data, len);
  495. qep->qe_block->qe_txd[entry].tx_addr = txbuf_dvma;
  496. qep->qe_block->qe_txd[entry].tx_flags =
  497. (TXD_OWN | TXD_SOP | TXD_EOP | (len & TXD_LENGTH));
  498. qep->tx_new = NEXT_TX(entry);
  499. /* Get it going. */
  500. dev->trans_start = jiffies;
  501. sbus_writel(CREG_CTRL_TWAKEUP, qep->qcregs + CREG_CTRL);
  502. qep->net_stats.tx_packets++;
  503. qep->net_stats.tx_bytes += len;
  504. if (TX_BUFFS_AVAIL(qep) <= 0) {
  505. /* Halt the net queue and enable tx interrupts.
  506.  * When the tx queue empties the tx irq handler
  507.  * will wake up the queue and return us back to
  508.  * the lazy tx reclaim scheme.
  509.  */
  510. netif_stop_queue(dev);
  511. sbus_writel(0, qep->qcregs + CREG_TIMASK);
  512. }
  513. spin_unlock_irq(&qep->lock);
  514. dev_kfree_skb(skb);
  515. return 0;
  516. }
  517. static struct net_device_stats *qe_get_stats(struct net_device *dev)
  518. {
  519. struct sunqe *qep = (struct sunqe *) dev->priv;
  520. return &qep->net_stats;
  521. }
  522. static void qe_set_multicast(struct net_device *dev)
  523. {
  524. struct sunqe *qep = (struct sunqe *) dev->priv;
  525. struct dev_mc_list *dmi = dev->mc_list;
  526. u8 new_mconfig = qep->mconfig;
  527. char *addrs;
  528. int i;
  529. u32 crc;
  530. /* Lock out others. */
  531. netif_stop_queue(dev);
  532. if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 64)) {
  533. sbus_writeb(MREGS_IACONFIG_ACHNGE | MREGS_IACONFIG_LARESET,
  534.     qep->mregs + MREGS_IACONFIG);
  535. while ((sbus_readb(qep->mregs + MREGS_IACONFIG) & MREGS_IACONFIG_ACHNGE) != 0)
  536. barrier();
  537. for (i = 0; i < 8; i++)
  538. sbus_writeb(0xff, qep->mregs + MREGS_FILTER);
  539. sbus_writeb(0, qep->mregs + MREGS_IACONFIG);
  540. } else if (dev->flags & IFF_PROMISC) {
  541. new_mconfig |= MREGS_MCONFIG_PROMISC;
  542. } else {
  543. u16 hash_table[4];
  544. u8 *hbytes = (unsigned char *) &hash_table[0];
  545. for (i = 0; i < 4; i++)
  546. hash_table[i] = 0;
  547. for (i = 0; i < dev->mc_count; i++) {
  548. addrs = dmi->dmi_addr;
  549. dmi = dmi->next;
  550. if (!(*addrs & 1))
  551. continue;
  552. crc = ether_crc_le(6, addrs);
  553. crc >>= 26;
  554. hash_table[crc >> 4] |= 1 << (crc & 0xf);
  555. }
  556. /* Program the qe with the new filter value. */
  557. sbus_writeb(MREGS_IACONFIG_ACHNGE | MREGS_IACONFIG_LARESET,
  558.     qep->mregs + MREGS_IACONFIG);
  559. while ((sbus_readb(qep->mregs + MREGS_IACONFIG) & MREGS_IACONFIG_ACHNGE) != 0)
  560. barrier();
  561. for (i = 0; i < 8; i++) {
  562. u8 tmp = *hbytes++;
  563. sbus_writeb(tmp, qep->mregs + MREGS_FILTER);
  564. }
  565. sbus_writeb(0, qep->mregs + MREGS_IACONFIG);
  566. }
  567. /* Any change of the logical address filter, the physical address,
  568.  * or enabling/disabling promiscuous mode causes the MACE to disable
  569.  * the receiver.  So we must re-enable them here or else the MACE
  570.  * refuses to listen to anything on the network.  Sheesh, took
  571.  * me a day or two to find this bug.
  572.  */
  573. qep->mconfig = new_mconfig;
  574. sbus_writeb(qep->mconfig, qep->mregs + MREGS_MCONFIG);
  575. /* Let us get going again. */
  576. netif_wake_queue(dev);
  577. }
  578. /* This is only called once at boot time for each card probed. */
  579. static inline void qec_init_once(struct sunqec *qecp, struct sbus_dev *qsdev)
  580. {
  581. u8 bsizes = qecp->qec_bursts;
  582. if (sbus_can_burst64(qsdev) && (bsizes & DMA_BURST64)) {
  583. sbus_writel(GLOB_CTRL_B64, qecp->gregs + GLOB_CTRL);
  584. } else if (bsizes & DMA_BURST32) {
  585. sbus_writel(GLOB_CTRL_B32, qecp->gregs + GLOB_CTRL);
  586. } else {
  587. sbus_writel(GLOB_CTRL_B16, qecp->gregs + GLOB_CTRL);
  588. }
  589. /* Packetsize only used in 100baseT BigMAC configurations,
  590.  * set it to zero just to be on the safe side.
  591.  */
  592. sbus_writel(GLOB_PSIZE_2048, qecp->gregs + GLOB_PSIZE);
  593. /* Set the local memsize register, divided up to one piece per QE channel. */
  594. sbus_writel((qsdev->reg_addrs[1].reg_size >> 2),
  595.     qecp->gregs + GLOB_MSIZE);
  596. /* Divide up the local QEC memory amongst the 4 QE receiver and
  597.  * transmitter FIFOs.  Basically it is (total / 2 / num_channels).
  598.  */
  599. sbus_writel((qsdev->reg_addrs[1].reg_size >> 2) >> 1,
  600.     qecp->gregs + GLOB_TSIZE);
  601. sbus_writel((qsdev->reg_addrs[1].reg_size >> 2) >> 1,
  602.     qecp->gregs + GLOB_RSIZE);
  603. }
  604. /* Four QE's per QEC card. */
  605. static int __init qec_ether_init(struct net_device *dev, struct sbus_dev *sdev)
  606. {
  607. static unsigned version_printed;
  608. struct net_device *qe_devs[4];
  609. struct sunqe *qeps[4];
  610. struct sbus_dev *qesdevs[4];
  611. struct sunqec *qecp = NULL;
  612. u8 bsizes, bsizes_more;
  613. int i, j, res = ENOMEM;
  614. dev = init_etherdev(0, sizeof(struct sunqe));
  615. qe_devs[0] = dev;
  616. qeps[0] = (struct sunqe *) dev->priv;
  617. qeps[0]->channel = 0;
  618. spin_lock_init(&qeps[0]->lock);
  619. for (j = 0; j < 6; j++)
  620. qe_devs[0]->dev_addr[j] = idprom->id_ethaddr[j];
  621. if (version_printed++ == 0)
  622. printk(KERN_INFO "%s", version);
  623. qe_devs[1] = qe_devs[2] = qe_devs[3] = NULL;
  624. for (i = 1; i < 4; i++) {
  625. qe_devs[i] = init_etherdev(0, sizeof(struct sunqe));
  626. if (qe_devs[i] == NULL || qe_devs[i]->priv == NULL)
  627. goto qec_free_devs;
  628. qeps[i] = (struct sunqe *) qe_devs[i]->priv;
  629. for (j = 0; j < 6; j++)
  630. qe_devs[i]->dev_addr[j] = idprom->id_ethaddr[j];
  631. qeps[i]->channel = i;
  632. }
  633. qecp = kmalloc(sizeof(struct sunqec), GFP_KERNEL);
  634. if (qecp == NULL)
  635. goto qec_free_devs;
  636. qecp->qec_sdev = sdev;
  637. for (i = 0; i < 4; i++) {
  638. qecp->qes[i] = qeps[i];
  639. qeps[i]->dev = qe_devs[i];
  640. qeps[i]->parent = qecp;
  641. }
  642. /* Link in channel 0. */
  643. i = prom_getintdefault(sdev->child->prom_node, "channel#", -1);
  644. if (i == -1) { res=ENODEV; goto qec_free_devs; }
  645. qesdevs[i] = sdev->child;
  646. /* Link in channel 1. */
  647. i = prom_getintdefault(sdev->child->next->prom_node, "channel#", -1);
  648. if (i == -1) { res=ENODEV; goto qec_free_devs; }
  649. qesdevs[i] = sdev->child->next;
  650. /* Link in channel 2. */
  651. i = prom_getintdefault(sdev->child->next->next->prom_node, "channel#", -1);
  652. if (i == -1) { res=ENODEV; goto qec_free_devs; }
  653. qesdevs[i] = sdev->child->next->next;
  654. /* Link in channel 3. */
  655. i = prom_getintdefault(sdev->child->next->next->next->prom_node, "channel#", -1);
  656. if (i == -1) { res=ENODEV; goto qec_free_devs; }
  657. qesdevs[i] = sdev->child->next->next->next;
  658. for (i = 0; i < 4; i++)
  659. qeps[i]->qe_sdev = qesdevs[i];
  660. /* Now map in the registers, QEC globals first. */
  661. qecp->gregs = sbus_ioremap(&sdev->resource[0], 0,
  662.    GLOB_REG_SIZE, "QEC Global Registers");
  663. if (!qecp->gregs) {
  664. printk(KERN_ERR "QuadEther: Cannot map QEC global registers.n");
  665. res = ENODEV;
  666. goto qec_free_devs;
  667. }
  668. /* Make sure the QEC is in MACE mode. */
  669. if ((sbus_readl(qecp->gregs + GLOB_CTRL) & 0xf0000000) != GLOB_CTRL_MMODE) {
  670. printk(KERN_ERR "QuadEther: AIEEE, QEC is not in MACE mode!n");
  671. res = ENODEV;
  672. goto qec_free_devs;
  673. }
  674. /* Reset the QEC. */
  675. if (qec_global_reset(qecp->gregs)) {
  676. res = ENODEV;
  677. goto qec_free_devs;
  678. }
  679. /* Find and set the burst sizes for the QEC, since it does
  680.  * the actual dma for all 4 channels.
  681.  */
  682. bsizes = prom_getintdefault(sdev->prom_node, "burst-sizes", 0xff);
  683. bsizes &= 0xff;
  684. bsizes_more = prom_getintdefault(sdev->bus->prom_node, "burst-sizes", 0xff);
  685. if (bsizes_more != 0xff)
  686. bsizes &= bsizes_more;
  687. if (bsizes == 0xff || (bsizes & DMA_BURST16) == 0 ||
  688.    (bsizes & DMA_BURST32)==0)
  689. bsizes = (DMA_BURST32 - 1);
  690. qecp->qec_bursts = bsizes;
  691. /* Perform one time QEC initialization, we never touch the QEC
  692.  * globals again after this.
  693.  */
  694. qec_init_once(qecp, sdev);
  695. for (i = 0; i < 4; i++) {
  696. /* Map in QEC per-channel control registers. */
  697. qeps[i]->qcregs = sbus_ioremap(&qesdevs[i]->resource[0], 0,
  698.        CREG_REG_SIZE, "QEC Channel Registers");
  699. if (!qeps[i]->qcregs) {
  700. printk(KERN_ERR "QuadEther: Cannot map QE %d's channel registers.n", i);
  701. res = ENODEV;
  702. goto qec_free_devs;
  703. }
  704. /* Map in per-channel AMD MACE registers. */
  705. qeps[i]->mregs = sbus_ioremap(&qesdevs[i]->resource[1], 0,
  706.       MREGS_REG_SIZE, "QE MACE Registers");
  707. if (!qeps[i]->mregs) {
  708. printk(KERN_ERR "QuadEther: Cannot map QE %d's MACE registers.n", i);
  709. res = ENODEV;
  710. goto qec_free_devs;
  711. }
  712. qeps[i]->qe_block = sbus_alloc_consistent(qesdevs[i],
  713.   PAGE_SIZE,
  714.   &qeps[i]->qblock_dvma);
  715. qeps[i]->buffers = sbus_alloc_consistent(qesdevs[i],
  716.  sizeof(struct sunqe_buffers),
  717.  &qeps[i]->buffers_dvma);
  718. if (qeps[i]->qe_block == NULL ||
  719.     qeps[i]->qblock_dvma == 0 ||
  720.     qeps[i]->buffers == NULL ||
  721.     qeps[i]->buffers_dvma == 0) {
  722. res = ENODEV;
  723. goto qec_free_devs;
  724. }
  725. /* Stop this QE. */
  726. qe_stop(qeps[i]);
  727. }
  728. for (i = 0; i < 4; i++) {
  729. SET_MODULE_OWNER(qe_devs[i]);
  730. qe_devs[i]->open = qe_open;
  731. qe_devs[i]->stop = qe_close;
  732. qe_devs[i]->hard_start_xmit = qe_start_xmit;
  733. qe_devs[i]->get_stats = qe_get_stats;
  734. qe_devs[i]->set_multicast_list = qe_set_multicast;
  735. qe_devs[i]->tx_timeout = qe_tx_timeout;
  736. qe_devs[i]->watchdog_timeo = 5*HZ;
  737. qe_devs[i]->irq = sdev->irqs[0];
  738. qe_devs[i]->dma = 0;
  739. ether_setup(qe_devs[i]);
  740. }
  741. /* QEC receives interrupts from each QE, then it sends the actual
  742.  * IRQ to the cpu itself.  Since QEC is the single point of
  743.  * interrupt for all QE channels we register the IRQ handler
  744.  * for it now.
  745.  */
  746. if (request_irq(sdev->irqs[0], &qec_interrupt,
  747. SA_SHIRQ, "QuadEther", (void *) qecp)) {
  748. printk(KERN_ERR "QuadEther: Can't register QEC master irq handler.n");
  749. res = EAGAIN;
  750. goto qec_free_devs;
  751. }
  752. /* Report the QE channels. */
  753. for (i = 0; i < 4; i++) {
  754. printk(KERN_INFO "%s: QuadEthernet channel[%d] ", qe_devs[i]->name, i);
  755. for (j = 0; j < 6; j++)
  756. printk ("%2.2x%c",
  757. qe_devs[i]->dev_addr[j],
  758. j == 5 ? ' ': ':');
  759. printk("n");
  760. }
  761. /* We are home free at this point, link the qe's into
  762.  * the master list for later driver exit.
  763.  */
  764. for (i = 0; i < 4; i++)
  765. qe_devs[i]->ifindex = dev_new_index();
  766. qecp->next_module = root_qec_dev;
  767. root_qec_dev = qecp;
  768. return 0;
  769. qec_free_devs:
  770. for (i = 0; i < 4; i++) {
  771. if (qe_devs[i] != NULL) {
  772. if (qe_devs[i]->priv) {
  773. struct sunqe *qe = (struct sunqe *)qe_devs[i]->priv;
  774. if (qe->qcregs)
  775. sbus_iounmap(qe->qcregs, CREG_REG_SIZE);
  776. if (qe->mregs)
  777. sbus_iounmap(qe->mregs, MREGS_REG_SIZE);
  778. if (qe->qe_block != NULL)
  779. sbus_free_consistent(qe->qe_sdev,
  780.      PAGE_SIZE,
  781.      qe->qe_block,
  782.      qe->qblock_dvma);
  783. if (qe->buffers != NULL)
  784. sbus_free_consistent(qe->qe_sdev,
  785.      sizeof(struct sunqe_buffers),
  786.      qe->buffers,
  787.      qe->buffers_dvma);
  788. kfree(qe_devs[i]->priv);
  789. }
  790. kfree(qe_devs[i]);
  791. }
  792. }
  793. if (qecp != NULL) {
  794. if (qecp->gregs)
  795. sbus_iounmap(qecp->gregs, GLOB_REG_SIZE);
  796. kfree(qecp);
  797. }
  798. return res;
  799. }
  800. static int __init qec_match(struct sbus_dev *sdev)
  801. {
  802. struct sbus_dev *sibling;
  803. int i;
  804. if (strcmp(sdev->prom_name, "qec") != 0)
  805. return 0;
  806. /* QEC can be parent of either QuadEthernet or BigMAC
  807.  * children.  Do not confuse this with qfe/SUNW,qfe
  808.  * which is a quad-happymeal card and handled by
  809.  * a different driver.
  810.  */
  811. sibling = sdev->child;
  812. for (i = 0; i < 4; i++) {
  813. if (sibling == NULL)
  814. return 0;
  815. if (strcmp(sibling->prom_name, "qe") != 0)
  816. return 0;
  817. sibling = sibling->next;
  818. }
  819. return 1;
  820. }
  821. static int __init qec_probe(void)
  822. {
  823. struct net_device *dev = NULL;
  824. struct sbus_bus *bus;
  825. struct sbus_dev *sdev = 0;
  826. static int called;
  827. int cards = 0, v;
  828. root_qec_dev = NULL;
  829. if (called)
  830. return -ENODEV;
  831. called++;
  832. for_each_sbus(bus) {
  833. for_each_sbusdev(sdev, bus) {
  834. if (cards)
  835. dev = NULL;
  836. if (qec_match(sdev)) {
  837. cards++;
  838. if ((v = qec_ether_init(dev, sdev)))
  839. return v;
  840. }
  841. }
  842. }
  843. if (!cards)
  844. return -ENODEV;
  845. return 0;
  846. }
  847. static void __exit qec_cleanup(void)
  848. {
  849. struct sunqec *next_qec;
  850. int i;
  851. while (root_qec_dev) {
  852. next_qec = root_qec_dev->next_module;
  853. /* Release all four QE channels, then the QEC itself. */
  854. for (i = 0; i < 4; i++) {
  855. unregister_netdev(root_qec_dev->qes[i]->dev);
  856. sbus_iounmap(root_qec_dev->qes[i]->qcregs, CREG_REG_SIZE);
  857. sbus_iounmap(root_qec_dev->qes[i]->mregs, MREGS_REG_SIZE);
  858. sbus_free_consistent(root_qec_dev->qes[i]->qe_sdev,
  859.      PAGE_SIZE,
  860.      root_qec_dev->qes[i]->qe_block,
  861.      root_qec_dev->qes[i]->qblock_dvma);
  862. sbus_free_consistent(root_qec_dev->qes[i]->qe_sdev,
  863.      sizeof(struct sunqe_buffers),
  864.      root_qec_dev->qes[i]->buffers,
  865.      root_qec_dev->qes[i]->buffers_dvma);
  866. kfree(root_qec_dev->qes[i]->dev);
  867. }
  868. free_irq(root_qec_dev->qec_sdev->irqs[0], (void *)root_qec_dev);
  869. sbus_iounmap(root_qec_dev->gregs, GLOB_REG_SIZE);
  870. kfree(root_qec_dev);
  871. root_qec_dev = next_qec;
  872. }
  873. }
  874. module_init(qec_probe);
  875. module_exit(qec_cleanup);
  876. MODULE_LICENSE("GPL");