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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.enet.c 1.9 09/14/01 18:01:16 trini
  3.  */
  4. /*
  5.  * Ethernet driver for Motorola MPC8260.
  6.  * Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
  7.  * Copyright (c) 2000 MontaVista Software Inc. (source@mvista.com)
  8.  * 2.3.99 Updates
  9.  *
  10.  * I copied this from the 8xx CPM Ethernet driver, so follow the
  11.  * credits back through that.
  12.  *
  13.  * This version of the driver is somewhat selectable for the different
  14.  * processor/board combinations.  It works for the boards I know about
  15.  * now, and should be easily modified to include others.  Some of the
  16.  * configuration information is contained in <asm/commproc.h> and the
  17.  * remainder is here.
  18.  *
  19.  * Buffer descriptors are kept in the CPM dual port RAM, and the frame
  20.  * buffers are in the host memory.
  21.  *
  22.  * Right now, I am very watseful with the buffers.  I allocate memory
  23.  * pages and then divide them into 2K frame buffers.  This way I know I
  24.  * have buffers large enough to hold one frame within one buffer descriptor.
  25.  * Once I get this working, I will use 64 or 128 byte CPM buffers, which
  26.  * will be much more memory efficient and will easily handle lots of
  27.  * small packets.
  28.  *
  29.  */
  30. #include <linux/kernel.h>
  31. #include <linux/sched.h>
  32. #include <linux/string.h>
  33. #include <linux/ptrace.h>
  34. #include <linux/errno.h>
  35. #include <linux/ioport.h>
  36. #include <linux/slab.h>
  37. #include <linux/interrupt.h>
  38. #include <linux/pci.h>
  39. #include <linux/init.h>
  40. #include <linux/delay.h>
  41. #include <linux/netdevice.h>
  42. #include <linux/etherdevice.h>
  43. #include <linux/skbuff.h>
  44. #include <linux/spinlock.h>
  45. #include <asm/immap_8260.h>
  46. #include <asm/pgtable.h>
  47. #include <asm/mpc8260.h>
  48. #include <asm/bitops.h>
  49. #include <asm/uaccess.h>
  50. #include <asm/cpm_8260.h>
  51. #include <asm/irq.h>
  52. /*
  53.  * Theory of Operation
  54.  *
  55.  * The MPC8260 CPM performs the Ethernet processing on an SCC.  It can use
  56.  * an aribtrary number of buffers on byte boundaries, but must have at
  57.  * least two receive buffers to prevent constant overrun conditions.
  58.  *
  59.  * The buffer descriptors are allocated from the CPM dual port memory
  60.  * with the data buffers allocated from host memory, just like all other
  61.  * serial communication protocols.  The host memory buffers are allocated
  62.  * from the free page pool, and then divided into smaller receive and
  63.  * transmit buffers.  The size of the buffers should be a power of two,
  64.  * since that nicely divides the page.  This creates a ring buffer
  65.  * structure similar to the LANCE and other controllers.
  66.  *
  67.  * Like the LANCE driver:
  68.  * The driver runs as two independent, single-threaded flows of control.  One
  69.  * is the send-packet routine, which enforces single-threaded use by the
  70.  * cep->tx_busy flag.  The other thread is the interrupt handler, which is
  71.  * single threaded by the hardware and other software.
  72.  */
  73. /* The transmitter timeout
  74.  */
  75. #define TX_TIMEOUT (2*HZ)
  76. /* The number of Tx and Rx buffers.  These are allocated from the page
  77.  * pool.  The code may assume these are power of two, so it is best
  78.  * to keep them that size.
  79.  * We don't need to allocate pages for the transmitter.  We just use
  80.  * the skbuffer directly.
  81.  */
  82. #define CPM_ENET_RX_PAGES 4
  83. #define CPM_ENET_RX_FRSIZE 2048
  84. #define CPM_ENET_RX_FRPPG (PAGE_SIZE / CPM_ENET_RX_FRSIZE)
  85. #define RX_RING_SIZE (CPM_ENET_RX_FRPPG * CPM_ENET_RX_PAGES)
  86. #define TX_RING_SIZE 8 /* Must be power of two */
  87. #define TX_RING_MOD_MASK 7 /*   for this to work */
  88. /* The CPM stores dest/src/type, data, and checksum for receive packets.
  89.  */
  90. #define PKT_MAXBUF_SIZE 1518
  91. #define PKT_MINBUF_SIZE 64
  92. #define PKT_MAXBLR_SIZE 1520
  93. /* The CPM buffer descriptors track the ring buffers.  The rx_bd_base and
  94.  * tx_bd_base always point to the base of the buffer descriptors.  The
  95.  * cur_rx and cur_tx point to the currently available buffer.
  96.  * The dirty_tx tracks the current buffer that is being sent by the
  97.  * controller.  The cur_tx and dirty_tx are equal under both completely
  98.  * empty and completely full conditions.  The empty/ready indicator in
  99.  * the buffer descriptor determines the actual condition.
  100.  */
  101. struct scc_enet_private {
  102. /* The saved address of a sent-in-place packet/buffer, for skfree(). */
  103. struct sk_buff* tx_skbuff[TX_RING_SIZE];
  104. ushort skb_cur;
  105. ushort skb_dirty;
  106. /* CPM dual port RAM relative addresses.
  107. */
  108. cbd_t *rx_bd_base; /* Address of Rx and Tx buffers. */
  109. cbd_t *tx_bd_base;
  110. cbd_t *cur_rx, *cur_tx; /* The next free ring entry */
  111. cbd_t *dirty_tx; /* The ring entries to be free()ed. */
  112. scc_t *sccp;
  113. struct net_device_stats stats;
  114. uint tx_full;
  115. spinlock_t lock;
  116. };
  117. static int scc_enet_open(struct net_device *dev);
  118. static int scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
  119. static int scc_enet_rx(struct net_device *dev);
  120. static void scc_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs);
  121. static int scc_enet_close(struct net_device *dev);
  122. static struct net_device_stats *scc_enet_get_stats(struct net_device *dev);
  123. static void set_multicast_list(struct net_device *dev);
  124. /* These will be configurable for the SCC choice.
  125. */
  126. #define CPM_ENET_BLOCK CPM_CR_SCC1_SBLOCK
  127. #define CPM_ENET_PAGE CPM_CR_SCC1_PAGE
  128. #define PROFF_ENET PROFF_SCC1
  129. #define SCC_ENET 0
  130. #define SIU_INT_ENET SIU_INT_SCC1
  131. /* These are both board and SCC dependent....
  132. */
  133. #define PD_ENET_RXD ((uint)0x00000001)
  134. #define PD_ENET_TXD ((uint)0x00000002)
  135. #define PD_ENET_TENA ((uint)0x00000004)
  136. #define PC_ENET_RENA ((uint)0x00020000)
  137. #define PC_ENET_CLSN ((uint)0x00000004)
  138. #define PC_ENET_TXCLK ((uint)0x00000800)
  139. #define PC_ENET_RXCLK ((uint)0x00000400)
  140. #define CMX_CLK_ROUTE ((uint)0x25000000)
  141. #define CMX_CLK_MASK ((uint)0xff000000)
  142. /* Specific to a board.
  143. */
  144. #define PC_EST8260_ENET_LOOPBACK ((uint)0x80000000)
  145. #define PC_EST8260_ENET_SQE ((uint)0x40000000)
  146. #define PC_EST8260_ENET_NOTFD ((uint)0x20000000)
  147. static int
  148. scc_enet_open(struct net_device *dev)
  149. {
  150. /* I should reset the ring buffers here, but I don't yet know
  151.  * a simple way to do that.
  152.  */
  153. netif_start_queue(dev);
  154. return 0; /* Always succeed */
  155. }
  156. static int
  157. scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
  158. {
  159. struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
  160. volatile cbd_t *bdp;
  161. /* Fill in a Tx ring entry */
  162. bdp = cep->cur_tx;
  163. #ifndef final_version
  164. if (bdp->cbd_sc & BD_ENET_TX_READY) {
  165. /* Ooops.  All transmit buffers are full.  Bail out.
  166.  * This should not happen, since cep->tx_full should be set.
  167.  */
  168. printk("%s: tx queue full!.n", dev->name);
  169. return 1;
  170. }
  171. #endif
  172. /* Clear all of the status flags.
  173.  */
  174. bdp->cbd_sc &= ~BD_ENET_TX_STATS;
  175. /* If the frame is short, tell CPM to pad it.
  176. */
  177. if (skb->len <= ETH_ZLEN)
  178. bdp->cbd_sc |= BD_ENET_TX_PAD;
  179. else
  180. bdp->cbd_sc &= ~BD_ENET_TX_PAD;
  181. /* Set buffer length and buffer pointer.
  182. */
  183. bdp->cbd_datlen = skb->len;
  184. bdp->cbd_bufaddr = __pa(skb->data);
  185. /* Save skb pointer.
  186. */
  187. cep->tx_skbuff[cep->skb_cur] = skb;
  188. cep->stats.tx_bytes += skb->len;
  189. cep->skb_cur = (cep->skb_cur+1) & TX_RING_MOD_MASK;
  190. spin_lock_irq(&cep->lock);
  191. /* Send it on its way.  Tell CPM its ready, interrupt when done,
  192.  * its the last BD of the frame, and to put the CRC on the end.
  193.  */
  194. bdp->cbd_sc |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | BD_ENET_TX_LAST | BD_ENET_TX_TC);
  195. dev->trans_start = jiffies;
  196. /* If this was the last BD in the ring, start at the beginning again.
  197. */
  198. if (bdp->cbd_sc & BD_ENET_TX_WRAP)
  199. bdp = cep->tx_bd_base;
  200. else
  201. bdp++;
  202. if (bdp->cbd_sc & BD_ENET_TX_READY) {
  203. netif_stop_queue(dev);
  204. cep->tx_full = 1;
  205. }
  206. cep->cur_tx = (cbd_t *)bdp;
  207. spin_unlock_irq(&cep->lock);
  208. return 0;
  209. }
  210. static void
  211. scc_enet_timeout(struct net_device *dev)
  212. {
  213. struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
  214. printk("%s: transmit timed out.n", dev->name);
  215. cep->stats.tx_errors++;
  216. #ifndef final_version
  217. {
  218. int i;
  219. cbd_t *bdp;
  220. printk(" Ring data dump: cur_tx %p%s cur_rx %p.n",
  221.        cep->cur_tx, cep->tx_full ? " (full)" : "",
  222.        cep->cur_rx);
  223. bdp = cep->tx_bd_base;
  224. printk(" Tx @base %p :n", bdp);
  225. for (i = 0 ; i < TX_RING_SIZE; i++, bdp++)
  226. printk("%04x %04x %08xn",
  227.        bdp->cbd_sc,
  228.        bdp->cbd_datlen,
  229.        bdp->cbd_bufaddr);
  230. bdp = cep->rx_bd_base;
  231. printk(" Rx @base %p :n", bdp);
  232. for (i = 0 ; i < RX_RING_SIZE; i++, bdp++)
  233. printk("%04x %04x %08xn",
  234.        bdp->cbd_sc,
  235.        bdp->cbd_datlen,
  236.        bdp->cbd_bufaddr);
  237. }
  238. #endif
  239. if (!cep->tx_full)
  240. netif_wake_queue(dev);
  241. }
  242. /* The interrupt handler.
  243.  * This is called from the CPM handler, not the MPC core interrupt.
  244.  */
  245. static void
  246. scc_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs)
  247. {
  248. struct net_device *dev = dev_id;
  249. volatile struct scc_enet_private *cep;
  250. volatile cbd_t *bdp;
  251. ushort int_events;
  252. int must_restart;
  253. cep = (struct scc_enet_private *)dev->priv;
  254. /* Get the interrupt events that caused us to be here.
  255. */
  256. int_events = cep->sccp->scc_scce;
  257. cep->sccp->scc_scce = int_events;
  258. must_restart = 0;
  259. /* Handle receive event in its own function.
  260. */
  261. if (int_events & SCCE_ENET_RXF)
  262. scc_enet_rx(dev_id);
  263. /* Check for a transmit error.  The manual is a little unclear
  264.  * about this, so the debug code until I get it figured out.  It
  265.  * appears that if TXE is set, then TXB is not set.  However,
  266.  * if carrier sense is lost during frame transmission, the TXE
  267.  * bit is set, "and continues the buffer transmission normally."
  268.  * I don't know if "normally" implies TXB is set when the buffer
  269.  * descriptor is closed.....trial and error :-).
  270.  */
  271. /* Transmit OK, or non-fatal error.  Update the buffer descriptors.
  272. */
  273. if (int_events & (SCCE_ENET_TXE | SCCE_ENET_TXB)) {
  274.     spin_lock(&cep->lock);
  275.     bdp = cep->dirty_tx;
  276.     while ((bdp->cbd_sc&BD_ENET_TX_READY)==0) {
  277. if ((bdp==cep->cur_tx) && (cep->tx_full == 0))
  278.     break;
  279. if (bdp->cbd_sc & BD_ENET_TX_HB) /* No heartbeat */
  280. cep->stats.tx_heartbeat_errors++;
  281. if (bdp->cbd_sc & BD_ENET_TX_LC) /* Late collision */
  282. cep->stats.tx_window_errors++;
  283. if (bdp->cbd_sc & BD_ENET_TX_RL) /* Retrans limit */
  284. cep->stats.tx_aborted_errors++;
  285. if (bdp->cbd_sc & BD_ENET_TX_UN) /* Underrun */
  286. cep->stats.tx_fifo_errors++;
  287. if (bdp->cbd_sc & BD_ENET_TX_CSL) /* Carrier lost */
  288. cep->stats.tx_carrier_errors++;
  289. /* No heartbeat or Lost carrier are not really bad errors.
  290.  * The others require a restart transmit command.
  291.  */
  292. if (bdp->cbd_sc &
  293.     (BD_ENET_TX_LC | BD_ENET_TX_RL | BD_ENET_TX_UN)) {
  294. must_restart = 1;
  295. cep->stats.tx_errors++;
  296. }
  297. cep->stats.tx_packets++;
  298. /* Deferred means some collisions occurred during transmit,
  299.  * but we eventually sent the packet OK.
  300.  */
  301. if (bdp->cbd_sc & BD_ENET_TX_DEF)
  302. cep->stats.collisions++;
  303. /* Free the sk buffer associated with this last transmit.
  304. */
  305. dev_kfree_skb_irq(cep->tx_skbuff[cep->skb_dirty]);
  306. cep->skb_dirty = (cep->skb_dirty + 1) & TX_RING_MOD_MASK;
  307. /* Update pointer to next buffer descriptor to be transmitted.
  308. */
  309. if (bdp->cbd_sc & BD_ENET_TX_WRAP)
  310. bdp = cep->tx_bd_base;
  311. else
  312. bdp++;
  313. /* I don't know if we can be held off from processing these
  314.  * interrupts for more than one frame time.  I really hope
  315.  * not.  In such a case, we would now want to check the
  316.  * currently available BD (cur_tx) and determine if any
  317.  * buffers between the dirty_tx and cur_tx have also been
  318.  * sent.  We would want to process anything in between that
  319.  * does not have BD_ENET_TX_READY set.
  320.  */
  321. /* Since we have freed up a buffer, the ring is no longer
  322.  * full.
  323.  */
  324. if (cep->tx_full) {
  325. cep->tx_full = 0;
  326. if (netif_queue_stopped(dev)) {
  327. netif_wake_queue(dev);
  328. }
  329. }
  330. cep->dirty_tx = (cbd_t *)bdp;
  331.     }
  332.     if (must_restart) {
  333. volatile cpm8260_t *cp;
  334. /* Some transmit errors cause the transmitter to shut
  335.  * down.  We now issue a restart transmit.  Since the
  336.  * errors close the BD and update the pointers, the restart
  337.  * _should_ pick up without having to reset any of our
  338.  * pointers either.
  339.  */
  340. cp = cpmp;
  341. cp->cp_cpcr =
  342.     mk_cr_cmd(CPM_ENET_PAGE, CPM_ENET_BLOCK, 0,
  343.      CPM_CR_RESTART_TX) | CPM_CR_FLG;
  344. while (cp->cp_cpcr & CPM_CR_FLG);
  345.     }
  346.     spin_unlock(&cep->lock);
  347. }
  348. /* Check for receive busy, i.e. packets coming but no place to
  349.  * put them.  This "can't happen" because the receive interrupt
  350.  * is tossing previous frames.
  351.  */
  352. if (int_events & SCCE_ENET_BSY) {
  353. cep->stats.rx_dropped++;
  354. printk("SCC ENET: BSY can't happen.n");
  355. }
  356. return;
  357. }
  358. /* During a receive, the cur_rx points to the current incoming buffer.
  359.  * When we update through the ring, if the next incoming buffer has
  360.  * not been given to the system, we just set the empty indicator,
  361.  * effectively tossing the packet.
  362.  */
  363. static int
  364. scc_enet_rx(struct net_device *dev)
  365. {
  366. struct scc_enet_private *cep;
  367. volatile cbd_t *bdp;
  368. struct sk_buff *skb;
  369. ushort pkt_len;
  370. cep = (struct scc_enet_private *)dev->priv;
  371. /* First, grab all of the stats for the incoming packet.
  372.  * These get messed up if we get called due to a busy condition.
  373.  */
  374. bdp = cep->cur_rx;
  375. for (;;) {
  376. if (bdp->cbd_sc & BD_ENET_RX_EMPTY)
  377. break;
  378. #ifndef final_version
  379. /* Since we have allocated space to hold a complete frame, both
  380.  * the first and last indicators should be set.
  381.  */
  382. if ((bdp->cbd_sc & (BD_ENET_RX_FIRST | BD_ENET_RX_LAST)) !=
  383. (BD_ENET_RX_FIRST | BD_ENET_RX_LAST))
  384. printk("CPM ENET: rcv is not first+lastn");
  385. #endif
  386. /* Frame too long or too short.
  387. */
  388. if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH))
  389. cep->stats.rx_length_errors++;
  390. if (bdp->cbd_sc & BD_ENET_RX_NO) /* Frame alignment */
  391. cep->stats.rx_frame_errors++;
  392. if (bdp->cbd_sc & BD_ENET_RX_CR) /* CRC Error */
  393. cep->stats.rx_crc_errors++;
  394. if (bdp->cbd_sc & BD_ENET_RX_OV) /* FIFO overrun */
  395. cep->stats.rx_crc_errors++;
  396. /* Report late collisions as a frame error.
  397.  * On this error, the BD is closed, but we don't know what we
  398.  * have in the buffer.  So, just drop this frame on the floor.
  399.  */
  400. if (bdp->cbd_sc & BD_ENET_RX_CL) {
  401. cep->stats.rx_frame_errors++;
  402. }
  403. else {
  404. /* Process the incoming frame.
  405. */
  406. cep->stats.rx_packets++;
  407. pkt_len = bdp->cbd_datlen;
  408. cep->stats.rx_bytes += pkt_len;
  409. /* This does 16 byte alignment, much more than we need.
  410.  * The packet length includes FCS, but we don't want to
  411.  * include that when passing upstream as it messes up
  412.  * bridging applications.
  413.  */
  414. skb = dev_alloc_skb(pkt_len-4);
  415. if (skb == NULL) {
  416. printk("%s: Memory squeeze, dropping packet.n", dev->name);
  417. cep->stats.rx_dropped++;
  418. }
  419. else {
  420. skb->dev = dev;
  421. skb_put(skb,pkt_len-4); /* Make room */
  422. eth_copy_and_sum(skb,
  423. (unsigned char *)__va(bdp->cbd_bufaddr),
  424. pkt_len-4, 0);
  425. skb->protocol=eth_type_trans(skb,dev);
  426. netif_rx(skb);
  427. }
  428. }
  429. /* Clear the status flags for this buffer.
  430. */
  431. bdp->cbd_sc &= ~BD_ENET_RX_STATS;
  432. /* Mark the buffer empty.
  433. */
  434. bdp->cbd_sc |= BD_ENET_RX_EMPTY;
  435. /* Update BD pointer to next entry.
  436. */
  437. if (bdp->cbd_sc & BD_ENET_RX_WRAP)
  438. bdp = cep->rx_bd_base;
  439. else
  440. bdp++;
  441.    }
  442. cep->cur_rx = (cbd_t *)bdp;
  443. return 0;
  444. }
  445. static int
  446. scc_enet_close(struct net_device *dev)
  447. {
  448. /* Don't know what to do yet.
  449. */
  450. netif_stop_queue(dev);
  451. return 0;
  452. }
  453. static struct net_device_stats *scc_enet_get_stats(struct net_device *dev)
  454. {
  455. struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
  456. return &cep->stats;
  457. }
  458. /* Set or clear the multicast filter for this adaptor.
  459.  * Skeleton taken from sunlance driver.
  460.  * The CPM Ethernet implementation allows Multicast as well as individual
  461.  * MAC address filtering.  Some of the drivers check to make sure it is
  462.  * a group multicast address, and discard those that are not.  I guess I
  463.  * will do the same for now, but just remove the test if you want
  464.  * individual filtering as well (do the upper net layers want or support
  465.  * this kind of feature?).
  466.  */
  467. static void set_multicast_list(struct net_device *dev)
  468. {
  469. struct scc_enet_private *cep;
  470. struct dev_mc_list *dmi;
  471. u_char *mcptr, *tdptr;
  472. volatile scc_enet_t *ep;
  473. int i, j;
  474. cep = (struct scc_enet_private *)dev->priv;
  475. /* Get pointer to SCC area in parameter RAM.
  476. */
  477. ep = (scc_enet_t *)dev->base_addr;
  478. if (dev->flags&IFF_PROMISC) {
  479.   
  480. /* Log any net taps. */
  481. printk("%s: Promiscuous mode enabled.n", dev->name);
  482. cep->sccp->scc_pmsr |= SCC_PSMR_PRO;
  483. } else {
  484. cep->sccp->scc_pmsr &= ~SCC_PSMR_PRO;
  485. if (dev->flags & IFF_ALLMULTI) {
  486. /* Catch all multicast addresses, so set the
  487.  * filter to all 1's.
  488.  */
  489. ep->sen_gaddr1 = 0xffff;
  490. ep->sen_gaddr2 = 0xffff;
  491. ep->sen_gaddr3 = 0xffff;
  492. ep->sen_gaddr4 = 0xffff;
  493. }
  494. else {
  495. /* Clear filter and add the addresses in the list.
  496. */
  497. ep->sen_gaddr1 = 0;
  498. ep->sen_gaddr2 = 0;
  499. ep->sen_gaddr3 = 0;
  500. ep->sen_gaddr4 = 0;
  501. dmi = dev->mc_list;
  502. for (i=0; i<dev->mc_count; i++) {
  503. /* Only support group multicast for now.
  504. */
  505. if (!(dmi->dmi_addr[0] & 1))
  506. continue;
  507. /* The address in dmi_addr is LSB first,
  508.  * and taddr is MSB first.  We have to
  509.  * copy bytes MSB first from dmi_addr.
  510.  */
  511. mcptr = (u_char *)dmi->dmi_addr + 5;
  512. tdptr = (u_char *)&ep->sen_taddrh;
  513. for (j=0; j<6; j++)
  514. *tdptr++ = *mcptr--;
  515. /* Ask CPM to run CRC and set bit in
  516.  * filter mask.
  517.  */
  518. cpmp->cp_cpcr = mk_cr_cmd(CPM_ENET_PAGE,
  519. CPM_ENET_BLOCK, 0,
  520. CPM_CR_SET_GADDR) | CPM_CR_FLG;
  521. /* this delay is necessary here -- Cort */
  522. udelay(10);
  523. while (cpmp->cp_cpcr & CPM_CR_FLG);
  524. }
  525. }
  526. }
  527. }
  528. /* Initialize the CPM Ethernet on SCC.
  529.  */
  530. int __init scc_enet_init(void)
  531. {
  532. struct net_device *dev;
  533. struct scc_enet_private *cep;
  534. int i, j;
  535. unsigned char *eap;
  536. unsigned long mem_addr;
  537. bd_t *bd;
  538. volatile cbd_t *bdp;
  539. volatile cpm8260_t *cp;
  540. volatile scc_t *sccp;
  541. volatile scc_enet_t *ep;
  542. volatile immap_t *immap;
  543. volatile iop8260_t *io;
  544. cp = cpmp; /* Get pointer to Communication Processor */
  545. immap = (immap_t *)IMAP_ADDR; /* and to internal registers */
  546. io = &immap->im_ioport;
  547. bd = (bd_t *)__res;
  548. /* Allocate some private information.
  549. */
  550. cep = (struct scc_enet_private *)kmalloc(sizeof(*cep), GFP_KERNEL);
  551. if (cep == NULL)
  552. return -ENOMEM;
  553. __clear_user(cep,sizeof(*cep));
  554. spin_lock_init(&cep->lock);
  555. /* Create an Ethernet device instance.
  556. */
  557. dev = init_etherdev(0, 0);
  558. /* Get pointer to SCC area in parameter RAM.
  559. */
  560. ep = (scc_enet_t *)(&immap->im_dprambase[PROFF_ENET]);
  561. /* And another to the SCC register area.
  562. */
  563. sccp = (volatile scc_t *)(&immap->im_scc[SCC_ENET]);
  564. cep->sccp = (scc_t *)sccp; /* Keep the pointer handy */
  565. /* Disable receive and transmit in case someone left it running.
  566. */
  567. sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
  568. /* Configure port C and D pins for SCC Ethernet.  This
  569.  * won't work for all SCC possibilities....it will be
  570.  * board/port specific.
  571.  */
  572. io->iop_pparc |=
  573. (PC_ENET_RENA | PC_ENET_CLSN | PC_ENET_TXCLK | PC_ENET_RXCLK);
  574. io->iop_pdirc &=
  575. ~(PC_ENET_RENA | PC_ENET_CLSN | PC_ENET_TXCLK | PC_ENET_RXCLK);
  576. io->iop_psorc &= 
  577. ~(PC_ENET_RENA | PC_ENET_TXCLK | PC_ENET_RXCLK);
  578. io->iop_psorc |= PC_ENET_CLSN;
  579. io->iop_ppard |= (PD_ENET_RXD | PD_ENET_TXD | PD_ENET_TENA);
  580. io->iop_pdird |= (PD_ENET_TXD | PD_ENET_TENA);
  581. io->iop_pdird &= ~PD_ENET_RXD;
  582. io->iop_psord |= PD_ENET_TXD;
  583. io->iop_psord &= ~(PD_ENET_RXD | PD_ENET_TENA);
  584. /* Configure Serial Interface clock routing.
  585.  * First, clear all SCC bits to zero, then set the ones we want.
  586.  */
  587. immap->im_cpmux.cmx_scr &= ~CMX_CLK_MASK;
  588. immap->im_cpmux.cmx_scr |= CMX_CLK_ROUTE;
  589. /* Allocate space for the buffer descriptors in the DP ram.
  590.  * These are relative offsets in the DP ram address space.
  591.  * Initialize base addresses for the buffer descriptors.
  592.  */
  593. i = m8260_cpm_dpalloc(sizeof(cbd_t) * RX_RING_SIZE, 8);
  594. ep->sen_genscc.scc_rbase = i;
  595. cep->rx_bd_base = (cbd_t *)&immap->im_dprambase[i];
  596. i = m8260_cpm_dpalloc(sizeof(cbd_t) * TX_RING_SIZE, 8);
  597. ep->sen_genscc.scc_tbase = i;
  598. cep->tx_bd_base = (cbd_t *)&immap->im_dprambase[i];
  599. cep->dirty_tx = cep->cur_tx = cep->tx_bd_base;
  600. cep->cur_rx = cep->rx_bd_base;
  601. ep->sen_genscc.scc_rfcr = CPMFCR_GBL | CPMFCR_EB;
  602. ep->sen_genscc.scc_tfcr = CPMFCR_GBL | CPMFCR_EB;
  603. /* Set maximum bytes per receive buffer.
  604.  * This appears to be an Ethernet frame size, not the buffer
  605.  * fragment size.  It must be a multiple of four.
  606.  */
  607. ep->sen_genscc.scc_mrblr = PKT_MAXBLR_SIZE;
  608. /* Set CRC preset and mask.
  609. */
  610. ep->sen_cpres = 0xffffffff;
  611. ep->sen_cmask = 0xdebb20e3;
  612. ep->sen_crcec = 0; /* CRC Error counter */
  613. ep->sen_alec = 0; /* alignment error counter */
  614. ep->sen_disfc = 0; /* discard frame counter */
  615. ep->sen_pads = 0x8888; /* Tx short frame pad character */
  616. ep->sen_retlim = 15; /* Retry limit threshold */
  617. ep->sen_maxflr = PKT_MAXBUF_SIZE;   /* maximum frame length register */
  618. ep->sen_minflr = PKT_MINBUF_SIZE;  /* minimum frame length register */
  619. ep->sen_maxd1 = PKT_MAXBLR_SIZE; /* maximum DMA1 length */
  620. ep->sen_maxd2 = PKT_MAXBLR_SIZE; /* maximum DMA2 length */
  621. /* Clear hash tables.
  622. */
  623. ep->sen_gaddr1 = 0;
  624. ep->sen_gaddr2 = 0;
  625. ep->sen_gaddr3 = 0;
  626. ep->sen_gaddr4 = 0;
  627. ep->sen_iaddr1 = 0;
  628. ep->sen_iaddr2 = 0;
  629. ep->sen_iaddr3 = 0;
  630. ep->sen_iaddr4 = 0;
  631. /* Set Ethernet station address.
  632.  *
  633.  * This is supplied in the board information structure, so we
  634.  * copy that into the controller.
  635.  */
  636. eap = (unsigned char *)&(ep->sen_paddrh);
  637. for (i=5; i>=0; i--)
  638. *eap++ = dev->dev_addr[i] = bd->bi_enetaddr[i];
  639. ep->sen_pper = 0; /* 'cause the book says so */
  640. ep->sen_taddrl = 0; /* temp address (LSB) */
  641. ep->sen_taddrm = 0;
  642. ep->sen_taddrh = 0; /* temp address (MSB) */
  643. /* Now allocate the host memory pages and initialize the
  644.  * buffer descriptors.
  645.  */
  646. bdp = cep->tx_bd_base;
  647. for (i=0; i<TX_RING_SIZE; i++) {
  648. /* Initialize the BD for every fragment in the page.
  649. */
  650. bdp->cbd_sc = 0;
  651. bdp->cbd_bufaddr = 0;
  652. bdp++;
  653. }
  654. /* Set the last buffer to wrap.
  655. */
  656. bdp--;
  657. bdp->cbd_sc |= BD_SC_WRAP;
  658. bdp = cep->rx_bd_base;
  659. for (i=0; i<CPM_ENET_RX_PAGES; i++) {
  660. /* Allocate a page.
  661. */
  662. mem_addr = __get_free_page(GFP_KERNEL);
  663. /* Initialize the BD for every fragment in the page.
  664. */
  665. for (j=0; j<CPM_ENET_RX_FRPPG; j++) {
  666. bdp->cbd_sc = BD_ENET_RX_EMPTY | BD_ENET_RX_INTR;
  667. bdp->cbd_bufaddr = __pa(mem_addr);
  668. mem_addr += CPM_ENET_RX_FRSIZE;
  669. bdp++;
  670. }
  671. }
  672. /* Set the last buffer to wrap.
  673. */
  674. bdp--;
  675. bdp->cbd_sc |= BD_SC_WRAP;
  676. /* Let's re-initialize the channel now.  We have to do it later
  677.  * than the manual describes because we have just now finished
  678.  * the BD initialization.
  679.  */
  680. cpmp->cp_cpcr = mk_cr_cmd(CPM_ENET_PAGE, CPM_ENET_BLOCK, 0,
  681. CPM_CR_INIT_TRX) | CPM_CR_FLG;
  682. while (cp->cp_cpcr & CPM_CR_FLG);
  683. cep->skb_cur = cep->skb_dirty = 0;
  684. sccp->scc_scce = 0xffff; /* Clear any pending events */
  685. /* Enable interrupts for transmit error, complete frame
  686.  * received, and any transmit buffer we have also set the
  687.  * interrupt flag.
  688.  */
  689. sccp->scc_sccm = (SCCE_ENET_TXE | SCCE_ENET_RXF | SCCE_ENET_TXB);
  690. /* Install our interrupt handler.
  691. */
  692. request_8xxirq(SIU_INT_ENET, scc_enet_interrupt, 0, "enet", dev);
  693. /* Set GSMR_H to enable all normal operating modes.
  694.  * Set GSMR_L to enable Ethernet to MC68160.
  695.  */
  696. sccp->scc_gsmrh = 0;
  697. sccp->scc_gsmrl = (SCC_GSMRL_TCI | SCC_GSMRL_TPL_48 | SCC_GSMRL_TPP_10 | SCC_GSMRL_MODE_ENET);
  698. /* Set sync/delimiters.
  699. */
  700. sccp->scc_dsr = 0xd555;
  701. /* Set processing mode.  Use Ethernet CRC, catch broadcast, and
  702.  * start frame search 22 bit times after RENA.
  703.  */
  704. sccp->scc_pmsr = (SCC_PSMR_ENCRC | SCC_PSMR_NIB22);
  705. /* It is now OK to enable the Ethernet transmitter.
  706.  * Unfortunately, there are board implementation differences here.
  707.  */
  708. io->iop_pparc &= ~(PC_EST8260_ENET_LOOPBACK |
  709. PC_EST8260_ENET_SQE | PC_EST8260_ENET_NOTFD);
  710. io->iop_psorc &= ~(PC_EST8260_ENET_LOOPBACK |
  711. PC_EST8260_ENET_SQE | PC_EST8260_ENET_NOTFD);
  712. io->iop_pdirc |= (PC_EST8260_ENET_LOOPBACK |
  713. PC_EST8260_ENET_SQE | PC_EST8260_ENET_NOTFD);
  714. io->iop_pdatc &= ~(PC_EST8260_ENET_LOOPBACK | PC_EST8260_ENET_SQE);
  715. io->iop_pdatc |= PC_EST8260_ENET_NOTFD;
  716. dev->base_addr = (unsigned long)ep;
  717. dev->priv = cep;
  718. /* The CPM Ethernet specific entries in the device structure. */
  719. dev->open = scc_enet_open;
  720. dev->hard_start_xmit = scc_enet_start_xmit;
  721. dev->tx_timeout = scc_enet_timeout;
  722. dev->watchdog_timeo = TX_TIMEOUT;
  723. dev->stop = scc_enet_close;
  724. dev->get_stats = scc_enet_get_stats;
  725. dev->set_multicast_list = set_multicast_list;
  726. /* And last, enable the transmit and receive processing.
  727. */
  728. sccp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
  729. printk("%s: SCC ENET Version 0.1, ", dev->name);
  730. for (i=0; i<5; i++)
  731. printk("%02x:", dev->dev_addr[i]);
  732. printk("%02xn", dev->dev_addr[5]);
  733. return 0;
  734. }